|
| 1 | +## RESTful API |
| 2 | + |
| 3 | +### REST(REpresentational State Transfer) |
| 4 | + |
| 5 | +HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method로 표현하여 특정한 형태로 전달하는 방식 |
| 6 | + |
| 7 | +> [!REST(REpresentational State Transfer)] |
| 8 | +> **HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method** |
| 9 | +
|
| 10 | +즉 REST란 어떤 자원에 대해 CRUD(CREATE, READ, UPDATE, DELETE) 연산을 수행하기 위해 URI(Resource)로 요청을 보내는 것으로, Get, Post 등의 Method를 사용하여 요청을 보내며 요청을 위한 자원은 특정한 형태로 표현 됨. |
| 11 | + |
| 12 | + ex) |
| 13 | + 게시글을 작성하기 위해 특정 URI(http://localhost:8080/board)에 |
| 14 | + POST 방식을 통해 JSON 형태의 데이터를 전달 가능 |
| 15 | + |
| 16 | +위와 같이 CRUD 연산에 대한 요청을 할 때 요청을 위한 Resource(자원, URI)와 이에 대한 Method(행위, POST) 그리고 Representation of Resource(자원의 형태, JSON)을 사용하면 표현이 명확해지므로 이를 REST라고 하며, 이러한 규칙을 지켜서 설계된 API를 REST API 또는 RESTful API라고 함 |
| 17 | + |
| 18 | +> [!RESTful API 구성요소] |
| 19 | +> - **Resource** |
| 20 | + > 서버는 Unique한 ID를 가지는 Resource를 가지고 있으며, 클라이언트는 이러한 Resource에 요청을 보냄 |
| 21 | + > 이러한 Resource는 URI에 해당합니다. |
| 22 | +>- **Method** |
| 23 | + > 서버에 요청을 보내기 위한 방식으로 GET, POST, PUT, PATCH, DELETE 존재 |
| 24 | + > CRUD 연산 중에서 처리를 위한 연산에 맞는 Method를 사용하여 서버에 요청을 보내야 함 |
| 25 | +>- **Representation of Resource** |
| 26 | + > 클라이언트와 서버가 데이터를 주고받는 형태로 json, xml, text, rss 등이 존재 |
| 27 | + > 최근에는 Key, Value를 활용하는 json을 주로 사용 |
| 28 | +
|
| 29 | +#### GET VS POST |
| 30 | +>**GET**은 어떤 정보를 조회하기 위해 사용하는 방식 |
| 31 | +>- URL에 변수를 포함시켜 요청 |
| 32 | +>- 데이터를 HEADER에 포함하여 전송 |
| 33 | +>- URL에 데이터가 노출되어 보안에 취약 |
| 34 | +>- 캐싱 가능 |
| 35 | +>GET 방식은 간단한데이터를 URL에 넣도록 설계된 방식으로 데이터를 보내는 양에 한계 존재 |
| 36 | +>HTTP 자체는 GET 방식의 URL 길이에 제약을 두진 않지만 브라우저에서 최대 길이 제한 |
| 37 | +>URL 형식에 맞지 않는 파라미터 이름이나 값은 인코딩되어 전달되어야 함 |
| 38 | +
|
| 39 | +>**POST**방식은 데이터를 서버로 제출하여 추가 또는 수정하기 위해서 사용되는 방식 |
| 40 | +>- URL에 변수(데이터)를 노출하지 않고 요청 |
| 41 | +>- 데이터를 BODY에 포함 |
| 42 | +>- URL에 데이터가 노출되지 않아서 기본 보안은 존재 |
| 43 | +>- 캐싱 불가능 |
| 44 | +>POST 방식은 BODY에 데이터를 넣어서 전송하기에 헤더필드 중 BODY 의 데이터를 설명하는 Content-Type이라는 헤더 필드가 들어가고 어떠한 데이터 타입인지를 명시해주어야 함 |
| 45 | +>BODY에 데이터를 적재하기 때문에 메시지 길이 제한은 없지만 최대 요청을 받는 시간인 Time Out이 존재하므로 클라이언트에서 페이지를 요청하고 기다리는 시간이 존재 |
| 46 | +>실제로 POST 방식은 URL에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링 데이터 뿐만 아니라 라디오 버튼, 텍스트 박스와 같은 객체들 값도 전송 가능 |
| 47 | +
|
| 48 | + |
| 49 | +#### URI VS URL |
| 50 | +>**URL(Uniform Resource Locator)** |
| 51 | +>인터넷 상 자원의 위치를 의미 즉 파일의 위치를 의미하는 것과 같음 |
| 52 | +
|
| 53 | +>**URI(Uniform Resource Identifier)** |
| 54 | +>인터넷 상의 자원을 식별하기 위한 문자열의 구성으로, URI는 URL을 포함하는 개념임 |
| 55 | +
|
| 56 | +#### REST의 조건 |
| 57 | +1. **Uniformed Interface** |
| 58 | + 1. Resource(URI)에 대한 요청을 통일되고 한정적으로 수행하는 아키텍처 스타일 |
| 59 | + 2. 요청 주체인 Client가 플랫폼에 무관하며 특정 언어나 기술에 종속 받지 않는 특징을 의미 |
| 60 | + 3. HTTP를 사용하는 모든 플랫폼에서 요청 가능하며, 느슨한 결합 형태를 갖춤 |
| 61 | +2. **Stateless** |
| 62 | + 1. 서버는 각각의 요청을 별개로 인식 및 처리해야 함 |
| 63 | + 2. Rest API는 세션정보나 쿠키 정보를 활용하여 작업을 위한 상태정보를 저장하지 않음 |
| 64 | + 3. 무상태성은 서버 처리방식에 일관성을 부여하고 서버의 부담을 줄임 |
| 65 | +3. **Cacheable** |
| 66 | + 1. REST API는 결국 HTTP라는 기존의 웹표준을 사용하기 때문에 캐싱 기능을 적용 가능 |
| 67 | +4. **Client-Server Architecture** |
| 68 | + 1. REST API에서 자원을 가지고 있는 서버, 자원을 요청하는 클라이언트로 구조화 되어있으며 서버는 API를 제공하고 클라이언트는 사용자 인증, CONTEXT(세션, 로그인 정보) 등을 직접 관리하는 등 역할을 구분하여 의존성을 줄임 |
| 69 | + 2. ![[Pasted image 20240810033429.png]] |
| 70 | + 1. 객체지향은 오로지 협력과 메시지로 구성 |
| 71 | + 2. 협력은 클라이언트가 서버의 서비스를 요청하는 단방향 상호작용 |
| 72 | + 3. 객체는 협력에 참여하는 동안 클라이언트와 서버의 역할을 동시에 수행하는 것이 일반적 |
| 73 | + 4. Message |
| 74 | + 1. 객체지향에서 협력을 구성하기 위한 유일한 수단 |
| 75 | + 2. 협력 →송신자, 수신자 생김 |
| 76 | + 1. 메세지 전송자 |
| 77 | + 2. 메세지 전송 |
| 78 | + 3. 메세지 수신자 |
| 79 | + ![[Pasted image 20240810033718.png]] |
| 80 | + 5. Method |
| 81 | + 1. discount validator는 discountcondition에 할인을 만족하는지를 확인 위해 메시지를 통해 협력을 요구 |
| 82 | + 2. 컴파일 시점에서는 인식 x |
| 83 | + 3. 런타임 시점에서 discount condition의 isSatisfedBy 오퍼레이션이 실행되는지 알 수 있다 |
| 84 | + →메시지 수신했을 때 실제로 실행되는 함수를 메서드 |
| 85 | + ![[Pasted image 20240810033838.png]] |
| 86 | + |
| 87 | + |
| 88 | + |
| 89 | +5. **Self-Descriptiveness** |
| 90 | + 1. REST API는 요청 메세지만 보고도 쉽게 이해할수 있는 자체 표현 구조로 구성되어 있음 |
| 91 | +6. **Layered System** |
| 92 | + 1. REST API의 서버는 다중 계층으로 구성 가능함 |
| 93 | + 2. 보안, 로드 밸런싱, 암호화 등을 위한 계층을 추가해 구조 변경이 가능 |
| 94 | + 3. Proxy, Gateway와 같은 네트워크 기반의 중간매체를 사용할 수 있게 해줌 |
| 95 | + |
| 96 | +#### MVC 패턴이란 |
| 97 | + |
| 98 | +디자인 패턴 중 하나로 소프트웨어를 Model, View, Controller 세가지 주요 컴포넌트로 나누어 구조화하는 방법 |
| 99 | + |
| 100 | +MVC는 주로 UI를 개발하는데 사용되며 각 컴포넌트가 각자의 영갛ㄹ을 수행하며 시스템을 보다 모듈화하고 확장 가능하게 만듦 |
| 101 | + |
| 102 | +![[Pasted image 20240810034830.png]] |
| 103 | + |
| 104 | +**MODEL** |
| 105 | +- 어플리케이션의 데이터와 비즈니스 로직을 담당 |
| 106 | +- 데이터를 저장하고 조작하는 역할을 수행 |
| 107 | +- 데이터 변경을 감지하고 변경 시 VIEW 및 CONTROLLER에 알림 보냄 |
| 108 | + |
| 109 | +**VIEW** |
| 110 | +- 사용자에게 정보를 표시하고 입력을 받는 역할 수행 |
| 111 | +- 모델의 데이터를 시각적으로 표현하거나 사용자 인터페이스 요소를 생성 |
| 112 | +- 모델의 변경을 감지하여 자동으로 업데이트 되도록 구현 |
| 113 | +- SPRING MVC에는 HTML 페이지 출력, PDF/EXCEL 문서 출력, XML/JSON 포맷 변환 등 다양한 VIEW 기술이 포함되어 있음 |
| 114 | + |
| 115 | +**CONTROLLER** |
| 116 | +- 사용자의 입력을 받아 모델에 명령을 전달하거나, 모델의 상태를 변경 |
| 117 | +- 사용자의 액션에 따라 모델을 업데이트하고, 그에 따라 뷰를 갱신 |
| 118 | +- 모델과 뷰 사이의 중간 역할을 수행하여 둘간의 직접적인 상호 작용을 방지 |
| 119 | + |
| 120 | +#### SPRING MVC 구조 |
| 121 | + |
| 122 | +![[Pasted image 20240810035126.png]] |
| 123 | + |
| 124 | +**DispatchServlet** |
| 125 | +- Front Controller의 역할을 수행하며 Request를 각각의 Controller에게 위임 |
| 126 | +- 가장 앞 단에서 클라이언트의 요청을 처리하는 Controller로써 **요청부터 응답까지 전반적인 처리 과정을 통제** |
| 127 | + |
| 128 | +**HandlerMapping** |
| 129 | +- 요청을 직접 처리할 컨트롤러를 탐색 |
| 130 | +- 구체적인 Mapping은 xml파일이나 java config 관련 어노테이션 등을 통해 처리할 수 있음 |
| 131 | + |
| 132 | + |
| 133 | + **HandlerAdapter** |
| 134 | +- 매핑된 컨트롤러의 실행을 요청 |
| 135 | + |
| 136 | +**Controller(Handler)** |
| 137 | +- DispatcherServlet이 전달해준 HTTP 요청을 처리하고 결과를 Model에 저장 |
| 138 | + - 직접 요청을 처리하며, 처리 결과를 반환 |
| 139 | + - 결과가 반환되면 HandlerAdapter가 ModelAndView 객체로 변환되며, 여기에는 View Name과 같이 응답을 통해 보여줄 View에 대한 정보와 관련된 데이터가 포함 |
| 140 | + |
| 141 | +**ModelAndView** |
| 142 | +- ModelAndView는 Controller에 의해 반환된 Model과 View가 Wrapping된 객체 |
| 143 | + |
| 144 | +**View Resolver** |
| 145 | +- View Name을 확인한 후, 실제 컨트롤러로부터 받은 로직 처리 결과를 반영할 View 파일(jsp)을 탐색 |
| 146 | + |
| 147 | +**View** |
| 148 | +- 로직 처리 결과를 반영한 최종 화면을 생성한다. |
| 149 | + |
| 150 | +#### Spring MVC VS RESTful API |
| 151 | + |
| 152 | +우리가 주로 개발하는 방식 프론트 / 백 협업 방식은 MVC 패턴에 부합하는가? |
| 153 | + |
| 154 | +**Spring MVC** |
| 155 | +![[Pasted image 20240810040419.png]] |
| 156 | +클라이언트의 요청이 들어오면 ViewResolver를 통해 클라이언트에게 text/html , jsp 타입 혹은 파일의 경로 타입의 view 응답을 보냄 |
| 157 | + |
| 158 | +**RESTful API** |
| 159 | +![[Pasted image 20240810040512.png]] |
| 160 | +클라이언트의 요청이 들어오면 MessageConverter를 통해 application/json이나 text/plain등 알맞은 형태로 리턴( HTTP Response ) |
| 161 | +REST API는 HTTP 프로토콜 상에서 클라이언트가 서버를 호출하여 데이터를 받는 방식을 쉽게 정리한 표준화된 방식으로 @RestController 어노테이션을 통해 쉽게 구현 가능 |
| 162 | + |
| 163 | +MVC는 DispatcherServlet을 걸쳐 view를 응답하지만, RESTful Api는 DispatcherServlet을 거치지 않고 json 형식의 데이터를 응답 |
| 164 | + |
| 165 | +유승한피셜 : |
| 166 | +우리가 주로 이용하는 협업 방식에서 서버와 프론트는 하나의 애플리케이션이 아니며 서버만 분리해서 봤을 때 MODEL과 VIEW를 사용하지 않고 CONTROLLER가 클라이언트 요청에 따라 데이터를 반환해주기만 하면 됨. 즉 MVC프레임워크를 이용하지만 MVC 구조라고 부르기에 부족함이 있음. |
| 167 | + |
| 168 | +관련된 논의 : |
| 169 | +https://okky.kr/questions/1408882 |
| 170 | +https://www.inflearn.com/community/questions/1263068/mvc%EC%99%80-api%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90 |
| 171 | + |
| 172 | + |
| 173 | +## API GATEWAY |
| 174 | + |
| 175 | +#### 특징 |
| 176 | +- 규모에 상관없이 API 생성, 유지 관리, 모니터링과 보호를 할 수 있게 해주는 서비스 |
| 177 | +- Client에서 Server로 통신할 때 API 들의 대문 역할을 한다고 볼 수 있음 |
| 178 | +- API Gateway를 사용하면 실시간 양방향 통신 애플리케이션이 가능하도록 하는 RESTful API 및 WebSocket API를 작성할 수 있음 |
| 179 | +- API Gateway는 트래픽 관리, CORS 지원, 권한 부여 및 액세스 제어, 제한, 모니터링 및 API 버전 관리 등 최대 수십만 개의 동시 API 호출을 수신 및 처리하는 데 관계된 모든 작업을 처리 |
| 180 | + |
| 181 | +#### 가격 |
| 182 | +![[Pasted image 20240810043044.png]] |
| 183 | + |
| 184 | + |
| 185 | +#### API 유형 |
| 186 | +![[Pasted image 20240810043109.png]] |
| 187 | + |
| 188 | + |
| 189 | +![[Pasted image 20240810043144.png]] |
| 190 | + |
| 191 | +#### 실습 |
| 192 | + |
| 193 | +GET 메서드 API(책보다 간단!) |
| 194 | +https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-API-Gateway-%EA%B0%9C%EB%85%90-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC |
| 195 | + |
| 196 | + |
| 197 | + |
| 198 | + |
| 199 | +#### API GATEWAY PATTERN이란? |
| 200 | + |
| 201 | +![[Pasted image 20240810044503.png]] |
| 202 | +- API Gateway Pattern 이란 마이크로 서비스로 나눠진 백엔드 서버들 앞에 하나의 API Gateway를 둠으로써 클라이언트는 API Gateway에 노출된 경로만 호출하고 요청된 라우트에 따라 적절한 서비스로 라우팅 시키고 response를 내려주는 것 |
| 203 | +- 소프트웨어 아키텍처에서 클라이언트와 여러 백엔드 서비스 간의 상호 작용을 관리하기 위한 디자인 패턴 |
| 204 | +- 클라이언트가 다양한 서비스에 접근할 때 일관된 인터페이스를 제공함으로써 시스템의 복잡성을 줄이고 관리 용이성을 높이는 것이 목표 |
| 205 | +- 실제 아키텍처에는 Private한 VPC구조로 인해 내부에 있는 서비스과 외부에 있는 게이트웨이가 소통하기 위해서는 Private Link, VPC Endpoint가 필요 |
| 206 | +- AWS PrivateLink 를 사용하면 AWS 네트워크 내에서 네트워크 트래픽을 유지하면서 AWS 서비스 및 다른 AWS고객이 호스팅하는 서비스에 접근 가능 |
| 207 | + |
| 208 | +> [!PrivateLink?] |
| 209 | +> VPC와 서비스 간에 프라이빗 연결을 제공하는 기술 |
| 210 | +> https://seongduck.tistory.com/247 |
| 211 | +
|
| 212 | +#### VPC links for REST APIs |
| 213 | + |
| 214 | +![[Pasted image 20240810045602.png]] |
| 215 | + |
| 216 | + |
| 217 | +#### MSA(MicroService Architecture)? |
| 218 | + |
| 219 | +토스에서 Gateway를 쓰는 방식 |
| 220 | +https://toss.tech/article/slash23-server |
0 commit comments