[Spring Rest API #1] REST API란?
- Spring/Spring Rest API
- 2019. 5. 25. 20:04
| REST API란
REST API란 REST 아키텍처 스타일을 지키는 API를 말합니다. REST 아키텍처는 클라이언트와 서버간의 독립적인 개발을 진행할 수 있는 아키텍처 스타일입니다. 서버와 클라이언트의 데이터는 HTTP 프로토콜 위에서 데이터를 주고받으며 REST 아키텍처 스타일에서 명시하는 조건을 준수하여 해야 합니다.
REST API라는 것은 간단히 생각하면 쉽습니다. 클라이언트와 서버는 따로 분리되며 데이터는 HTTP 프로토콜 위에서 주고받는 아키텍처라 생각하면 됩니다. 여기에 몇 가지 특징을 더한 아키텍처 스타일이 REST API이죠. 서버에서 HTML을 그려서 데이터를 보내는 MVC 아키텍처와는 큰 차이가 있습니다.
| RESTful 특징
클라이언트-서버(client-server)
클라이언트와 서버의 관심사가 명확히 분리되어 있어야합니다. 서버는 클라이언트가 원하는 데이터를 보내주는 데이터 제공자의 역할을 하며 클라이언트는 이 데이터를 이용하여 사용자가 원하는 화면을 보여주는 역할을 담당하게 됩니다.
무상태성(stateless)
서버에 클라이언트의 상태 정보를 저장하지 않는 것을 말합니다. 단순히 들어오는 요청만을 처리하여 구현을 단순화 합니다. 단, 클라이언트의 모든 요청은 서버가 요청을 알아듣는 데 필요한 모든 정보를 담고 있어야 합니다.
캐시 가능(cacheable)
클라이언트의 응답을 캐시할 수 있어야 합니다. HTTP 프로토콜을 사용하는 만큼 캐시 기능을 적용할 수 있습니다.
코드 온 디맨드(code on demand)
클라이언트는 서버에서 자바 애플릿 혹은 자바스크립트 실행 코드를 받아 기능을 일시적으로 확장할 수 있습니다.
인터페이스 일관성(uniform interface)
URI로 지정된 리소스에 균일하고 통일된 인터페이스를 제공합니다. 아키텍처를 단순하게 분리하여 독립적으로 만들 수 있습니다.
| 인터페이스 일관성
REST 아키텍처에서 인터페이스 일관성은 세부 원칙을 가지고 있습니다.
자원식별
URI를 통한 자원식별을 말하는 것입니다. REST API에서 이것은 자원(resource)로 명칭됩니다. 자원을 나타내기 위해서는 명사(noun)를 사용해야 한다는 원칙이 있습니다. 또한 표현하고자 하는 자원이 복수형일 경우에는 이것을 명시해야합니다.
(ex http://localhost/api/read/books)
메세지를 통한 리소스 조작
HTTP 메서드를 GET/POST/PUT/DELETE 를 통하여 서버측에 데이터를 컨트롤합니다. 여기서 보통 GET은 select(조회), POST는 create(생성), PUT은 update(갱신), DELETE는 delete(삭제) 를 나타내며 이러한 기준을 적용하여 API를 설계해야 합니다.
(ex GET http://localhost/api/books )
자기 서술적 메세지(self-descriptive)
REST API에서는 데이터에 대한 내용을 유추하는 것이 아닌 이 데이터를 설명하는 명세서가 존재해야 된다는 것을 의미합니다. 보통 이 자기 서술적 메세지를 지키지 않고 REST API라 칭하는 서비스들이 많습니다. 하지만 온전한 REST API라고 하려면 이 self-descriptive의 내용을 준수하여 각 데이터들이 어떤 것을 의미하는 지 어떻게 데이터를 조작할 수 있을 지에 대한 내용을 서술해야 합니다.
애플리케이션 상태에 대한 엔진으로서의 하이퍼미디어(HATEOAS, Hypermedia As The Engine Of Application State)
어플리케이션은 사용자가 어떤 행위를 하느냐에 따라 상태가 바뀌게 됩니다. 쉽게 설명하자면 웹 상에서 사용자가 계좌를 조회했을 시 (송금) 혹은 (입금) 이라는 버튼이 화면에 나타나게 될 것입니다. 이 때 송금에 대한 자원을 아래와 같이 href 형태로서 링크정보를 서버에서 보내와서 다음 어플리케이션 상태를 전이하기 위한 정보를 제공하게 됩니다. 이것이 바로 HATEOAS입니다.
이 원칙이 중요한 것은 이렇게 함으로서 클라이언트와 서버간의 완전한 분리가 이루어지게 됩니다. 만약 서버의 자원을 나타내는 URI 가 변경되었을 경우 클라이언트는 서버의 변화에 종속적으로 그 정보를 클라이언트 정보에 추가하게 됩니다. (SPA 상에서 href 데이터를 바꾸어 줘야함) 하지만 HATEOAS를 제대로 적용했을 시 아래와 같이 _links.profile 에 대한 href정보만 조회해주면 되므로 서버에서 URI정보가 바뀌어도 클라이언트 측에서 소스 변경없이 그대로 사용할 수 있게 됩니다.
(ex)
"_links" : {
"self" : {
"href" : "http://localhost:8080/api/events/46"
},
"profile" : {
"href" : "/docs/index.html#resources-events-get"
}
}
참조: https://www.inflearn.com/course/spring_rest-api/#
'Spring > Spring Rest API' 카테고리의 다른 글
[Spring REST API #6] Spring REST API Bad Request 처리 (0) | 2019.05.26 |
---|---|
[Spring REST API #5] Spring REST API 입력값 제한하기 및 에러 발생 처리 (0) | 2019.05.26 |
[Spring REST API #4] Spring REST API 테스트 클래스 생성 및 201 응답 받기 (0) | 2019.05.25 |
[Spring REST API #3] Spring REST API 이벤트 도메인 구현 (0) | 2019.05.25 |
[Spring Rest API #2] 인텔리제이(IntelliJ)에서 스프링 REST API 프로젝트 시작하기 (0) | 2019.05.25 |
이 글을 공유하기