Formoat's Open Blog
REST (Representational State Transfer) 본문
# REST (Representational State Transfer)
웹에 존재하는 모든 자원(텍스트, 이미지, 동영상) 등에 고유한 URI(이름)를 부여하고 자원에 대한 행위를
정의하여 상태 정보를 주고받는 방법론은 의미한다. 즉 HTTP URI로 자원을 표현하고, HTTP Method로
자원에 대한 행위를 정의하여 상태 정보를 주고받게 된다.
REST의 구성 요소
- 자원(Resource) : URI
- 행위(Verb) : HTTP Method
- 표현(Representation) : MIME Type // Responce HTTP Header Content-Type
# REST 제약조건
REST는 분산 시스템 설계를 위한 아키텍쳐로 아래와 같은 제약조건들을 가지고 있으며, 이러한
제약조건을 만족하는 API를 제공하는 것을 RESTful API라고 부른다.
1) Client-Server
- REST 서버는 API를 제공하고, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보) 등을 직접 관리하고
책임지는 구조로 각자의 역할이 확실하게 구분되기 때문에 클라이언트와 서버에서 개발할 내용이 명확해지며,
서로간의 의존성이 줄어든다.
2) Cacheable
- HTTP라는 기존의 웹 표준을 그대로 사용하기 때문에 웹에서 사용하는 기존의 인프라를 그대로 활용이 가능하다.
때문에 HTTP가 가지고 있는 캐싱 기능을 적용할 수 있는데, HTTP 프로토콜 표준에서 사용하는 Last-Modified 태그
또는 E-태그를 이용해 캐싱 구현이 가능하다.
3) Stateless
- 서버는 상태성의 성격을 갖는데, 클라이언트의 컨텍스트 정보를 따로 저장하거나 관리하지 않는다.
API 서버는 클라이언트의 요청만을 단순하게 처리만하면 되기 때문에 구현이 단순해진다.
4) Layered System
- REST 서버는 다중 계층으로 구성될 수 있다. 클라이언트는 대상 서버와 직접 통신하는지 중간에 조재하는 서버와
통신하는지 알 수 없으며, 중간에 존재하는 서버를 이용하여 보안, 로드 밸런싱, 암호화 등을 추가해 구조의 유연성과
확장성을 가질 수 있다. 또한 프록시, 게이트웨이와 같은 네트워크 기반의 중간매체도 사용할 수 있다.
5) Code on Demand(optional)
- REST 서버에서 스크립트 수행 코드를 클라이언트에 보내 실행할 수 있다. (예: Javascript)
6) Uniform Interface
- HTTP 표준에만 따른다면, 어떠한 기술이던 사용이 가능한 인터페이스 스타일로 특정 플랫폼이나 언어, 기술에
종속 받지 않고 HTTP 표준을 사용할 수 있는 모든 플랫폼에 사용이 가능한 느슨한 결함 형태의 구조이다.
추가적으로 Uniform Interface는 4가지 제약조건을 가지고 있다.
identification of resources (리소스 식별)
manipulation of resources through representations (표현을 통한 리소스 처리)
self-descriptive messages (자기 서술형 메시지)
hypermedia as the engine of applcation state (하이퍼 미디어 제약 : HATEOAS)
# REST 설계시 가이드
REST API 설계 시 중요한 항목
- URI는 정보의 자원을 표현해야 한다. (리소스명은 동사보다 명사로 작성)
- 자원에 대한 행위는 HTTP Method(GET, POST, PUT or PATCH, DELETE)로 표현한다.
Method | URI | Description |
POST | /boards/ or /boards/new | 신규 리소스 등록 |
GET | /boards/123 | 해당 리소스를 조회 |
PUT or PATCH | /boards/123/td> | 해당 리소스를 수정 |
DELETE/td> | /boards/123 | 해당 리소스를 삭제 |
※ 일반적으로 '/작업대상/PK' 형식으로 작성
자원 표현 방법 (Collection, Document)
- 도큐먼트는 이름 그대로 문서 또는 하나의 객체로서 생각할 수 있고, 컬렉션은 문서들의 집합이라고 생각할 수 있다.
컬렉션과 도큐먼트는 모두 리소스라고 표현이 가능하며, URI에 표현이 된다. 예를 들면 다음과 같은 URI을 볼 수 있다.
https://snd-snd.tistory.com/sports/soccer/player/7
sports, player는 컬렉션, soccer는 도큐먼트로 표현되어 있는데, 컬렉션의 경우 복수형의 형태를 띄고있고,
도큐먼트의 경우 단수형의 형태를 띄고있다. 이처럼 직관적인 REST API를 위해 URI을 설계할 수 있다.
HTTP 응답 상태 코드
- 잘 설계된 REST API는 URI 뿐 아니라 요청 리소스에 대한 응답을 적절하게 내어주는 것까지 포함된다.
정확한 응답 상태 코드만으로도 많은 정보를 전달할 수 있기 때문에 응답 상태 코드를 적절히 활용해야 한다.
Code | Status | Description |
200 | OK | HTTP 요청을 정상적으로 수행 // 성공에 대한 기준 코드 |
201 | CREATE | POST를 통한 리소스 생성 작업시 사용되며 새로운 리소스를 성공적으로 생성했을 때 사용 |
400 | Bad Request | 잘못된 구문 요청으로 서버가 구문 해석을 하지 못할 경우 |
401 | Unauthorized | 요청에 대한 인증이 필요할 때 즉, 로그인 등 인증하지 않고 리소스 요청시에 사용 |
403 | Fobidden | 요청에 대한 권한이 없을 때, 401은 인증 실패, 403은 인가 실패라고 볼 수 있다. |
404 | Not Found | 요청한 자원을 찾을 수 없음을 뜻한다. |
409 | Conflict | 요청에 대해 충돌이 발생했음을 뜻한다. |
500 | Interal Server Error | 서버에서 문제가 발생하여 요청을 수행할 수 없음 |
# Spring REST 사용 방법
Annotation | Description |
@RestController | 컨트롤러가 REST방식을 처리하기 위한 것임을 명시 |
@ResponseBody | 일반적인 컨트롤러에서 특정 메서드만 REST방식으로 처리해야 할 때 사용 |
@PathVariable | URL 경로에 있는 값을 파라미터로 추출할 때 사용 |
@CrossOrigin | Ajax의 크로스 도메인 문제를 해결해주는 어노테이션 |
@RequestBody | 전송된 데이터를 원하는 타입으로 바인딩 처리 |
※ 스프링에서 제공하는 REST 관련 어노테이션
... 확인을 위한 간단한 예제
- 컨트롤러가 REST 컨트롤러임을 명시한 상태에서 리소스 요청시 기존처럼 *.jsp 페이지를 찾는 것이 아닌 반환타입 형식으로
데이터를 반환하는 것을 볼 수 있다. 또한 문자열의 경우 text/html 형식으로 반환을 하고, 객체의 경우 json, xml 등으로
반환하였는데 이 경우 객체를 문서 형식으로 변환시켜주는 라이브러리가 필요하다.
<!-- 객체 반환 시 JSON 형식으로 변환시켜 주는 라이브러리 -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<!-- 객체 반환 시 XML 형식으로 변환시켜 주는 라이브러리 -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.10.0</version>
</dependency>
테스트를 위해 구글 웹스토에서 제공하는 REST 클라이언트 프로그램을 사용
- 일반적인 웹 페이지와 달리 보이는 화면(View)를 제작하지 않는 형태로 처리되기 때문에 결과 체크를 위해 유용함.
리소스 요청시 URL + 데이터를 특정 방식(Method)으로 보내고 응답 결과를 받을 수 있다.
데이터 처리시 사용되는 어노테이션
1) @RequestBody - 전송된 데이터를 객체로 변환시켜 주는 어노테이션
2) @PathVariable - URI 경로에서 원하는 데이터를 추출하는 용도로 사용
POST localhost:8090/rest/samples/new
- URI 요청과 더불어 JSON 문서로 이루어진 데이터를 같이 보내면 컨트롤러의 @RequestBody 어노테이션은 해당
JSON 문서를 객체화 시켜 매개변수로 받을 수 있다. 이러한 데이터를 이용해 가입/생성/등록 등 서버측에서
데이터를 처리하고 결과를 바탕으로 클라이언트에 응답한다.
GET localhost:9080/rest/samples/100
- @PathVariable 어노테이션은 URL 경로에서 원하는 데이터를 추출해 매개변수로 받는다. 주로 ID 등 PK값을
넘겨받아 데이터베이스에 접근해 데이터를 가져온 뒤 JSON 형식으로 데이터를 변환시켜 클라이언트에게 응답한다.
'Java > Spring' 카테고리의 다른 글
File Upload/Download - 파일 업로드/다운로드 (0) | 2019.10.29 |
---|---|
Interceptor - 인터셉터 (0) | 2019.10.16 |
Spring MVC (Model View Controller) - 스프링 MVC 패턴 (2) | 2019.10.10 |
Logback SLF4J - 로그 남기기 (0) | 2019.10.08 |
Transaction - 트랜잭션 (0) | 2019.10.08 |