Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

REST (Representational State Transfer) 본문

Java/Spring

REST (Representational State Transfer)

snd-snd 2019. 10. 22. 16:51

# 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 형식으로 데이터를 변환시켜 클라이언트에게 응답한다.

 

 

 

Comments