REST
- REST(Representational State Transfer)
- 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는것이다.
- HTTP URI을 통해 자원을 명시하고,
- HTTP Method(POST, GET, PUT, DELETE, PATCH 등)을 통해
- 해당 자원에 대한 CRUD Operation를 적용한다.
- CRUD Operation
- Rest에서의 CRUD Operation 동작 예시
- Create: 데이터 생성(POST)
- Read: 데이터 조회(GET)
- Update: 데이터 수정(PUT, PATCH)
- Delete: 데이터 삭제(DELETE)
- Rest에서의 CRUD Operation 동작 예시
REST 구성 요소
- 3가지로 구성된다.
- 자원(Resource): HTTP URL
- 자원에 대한 행위(Verb) : HTTP Method
- 자원에 대한 행위의 내용 (Representations) : HTTP Message Pay Load
REST의 특징
- Server-Client(서버-클라이언트 구조)
- 서버는 리소스를 관리하고, 클라이언트는 리소스에 대한 요청을 보내고 응답을 받는 구조로 동작한다.
- Stateless(무상태)
- REST는 각 요청을 독립적으로 처리, 따라서 클라이언트의 각 요청은 서버의 이전 상태와 관계없이 완전한 요청 정보를 포함해야한다.
- Cacheable(캐시 처리 가능)
- REST는 응답을 캐시 할 수있다. 따라서 클라이언트가 동일한 요청을 나중에 다시 보내면, 캐시된 응답을 재사용하여 네트워크 대역폭 절약, 애플레키의션의 성능을 향상시킨다.
- Layered System(계층화)
- 서버와 클라이언트 간의 역활과 책임을 분리를 통해 시스템의 복잡성을 줄이고 유지보수를 용이하게한다.
- Uniform Interface(인터페이스 일관성)
- 리소스에 대한 조작은 통일된 방식으로 이루어져야 한다.
REST의 장단점
- 장점
- 기존 HTTP 프로토콜 인프라를 사용하기 때문에 REST API사용을 위한 별도의 인프라 구축 필요없다.
- HTTP 프로토콜의 표준을 활용하여 여러 추갖적인 장점을 함께 가져 갈 수 있다.
- GET, POST, PUT, DELETE활용하여 다양한 리소스를 생성, 조회, 수정, 삭제가능하다.
- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
- ex. 웹브라우저, 모바일 애플리케이션, 서버 사이드 언어(java, python, node.js), 데스크톱 애플리케이션, 클라우드 서비스, IoT 장치등이 그 예시이다.
- Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
※Hypermedia: 클라이언트와 서버간의 상호작용을 동적으로 만드는 기술이다. - REST API 메시지는 프로토콜에 의도하는 바를 나타내므로 쉽게 파악 할 수 있다.
- 서버와 클라이언트의 역활을 명확하게 분리한다.
- 단점
- HTTP Method 형태가 제한적이다.
- GET, POST, PUT, DELETE등으로만 조작의 의미를 다 담기에는 표현하기 어렵다.
- 브라우저를 통해 테스트할 일이 많은 서비스라면 전문성이 요구된다.
- HTTP Header에 정보를 담아서 요청해야 하는 경우가 있는데 그럴경우 테스트하기 어려워진다.
- 구형 브라우저에서는 호환되지 않아 지원못하는 동작이 많다.
- ex. 익스플로어
REST API란
REST의 원리를 따르는 API
- API: 개발자들이 다른 시스템의 기능을 사용하고 데이터를 가져오고 조작할 수 있도록 인터페이스를 제공한다.
REST API 설계 예시
- URL는 동사보다는 명사를, 대문자보다는 소문자를 사용하여야한다.
- URL는 마지막에 슬래시를 포함하지 않는다.
- 언더바 대신 하이폰을 사용한다.
- ex. http://cocktails/test-recipes
- 파일확장자는 URL에 포함하지 않는다.
- bad ex. http://cocktails/image.jpg
- 행위를 포함하지 않는다.
- bad ex. http://cocktails/createdNewRecipes
컨트롤러에서 실제로 URL을 통해 정보를 받는 방법(+다중매핑)
- 기존의 정보받는 방식
예시로 만일 칵테일 레시피를 주간순으로 준다고 생각을 해보자
아래는 http에서 아래와 같이 경로에 쿼리 파라미터를 포함시켜서 GET요청을 보낸다고 생각하겠다.
GET /community/period-cocktails?period=weekly //앞이 경로, ?뒤에 period가 쿼리파라미터
그러면 RESTAPI를 활용해 데이터를 받는다. url 마지막 부분에서 이뤄지는 정보제공을 통해 우리는 컨트롤러에서 읽을수있다. 바로 GetMapping 메소드를 통해서 말이다.
@GetMapping("/community/period-cocktails")
public List<CocktailRecipe> getCocktailRecipesByPeriod(@RequestParam("period") String period) {
// period 값에 따라 처리하는 로직
reuturn result;
}
- 두개의 url에서 하나의 서비스를 이용하는 경우(다중 매핑)
우리는 컨트롤러안에 있는 getCocktailRecipesByPeriod를 2개의 URL과 매핑시켜주면된다. 여러방법이 있는데 그중 value 속성에 배열로 여러 URL을 저장하는 방법을 예시로 들겠다.
// 다중 매핑
@RequestMapping(value = {"/community/period-cocktails", "/period-recipes/search"}, method = RequestMethod.GET)
public List<CocktailRecipe> getCocktailRecipesByPeriod(@RequestParam("period") String period) {
// period 값에 따라 처리하는 로직
return result;
}
}
'CS' 카테고리의 다른 글
[네트워크] 네트워크 계층 (1) | 2024.09.22 |
---|---|
[운영체제] OS(조르디 CS강의) (0) | 2023.10.29 |