일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Eclipse Althrithm
- 오라클
- 펭수 달력
- 백준 10950번 c
- 백준 10951번
- 이클립스 알고리즘 환경
- 백준 1000번 java
- 배열 복사
- 지진
- 백준 10951번 c
- 백준 알고리즘
- 백준 1000번 c++
- 백준 10950번 java
- 백준 1000번
- 이클립스 알고리즘 세팅
- 백준10950번 c++
- nodejs
- 자바스크립트
- 백준 10950번
- 백준 1000번 c
- 백준 10951번 java
- 2020 펭수 달력
- JavaScript
- RETURN ROW IF NO DATA FOUND
- 펭수 2020 달력
- 티스토리 초대장 이벤트
- oracle
- 백준 10951번 c++
- 포항 지진
- 티스토리 초대장
- Today
- Total
스노우보드 참 좋아하는데 맨날 키보드 앞에만 있네
REST API (Representational State Transfer API) 본문
<!-- 본 포스팅은 개인공부를 위한 용도로 잘못된 정보가 있을 수 있습니다. 오류 발견시 댓글 환영합니다. -->
REST API (Representational State Transfer API)
1. REST API
REST API는 Representational State Transfer API의 약자로 2000년 Roy Fielding의 박사 학위 논문에서 처음 등장하였다.
REST는 대규모 네트워크 시스템을 위한 아키텍처 형식으로 구성은 HTTP URI와 HTTP Method로 이루어져있다.
URI는 정보의 자원을 표현해야 하며, 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)으로 표현한다.
최근 Open API등의 서비스 제공에서 많이 사용되어지며, 스프링MVC의 3버전부터 @ResponseBody를 이용하여 지원한다.
간단 용어정리
1) @RestController
컨트롤러의 설계 목적 자체가 REST방식으로 데이터를 서비스하기 위한 용도에 사용한다. 따라서 JSP를 뷰로 이용하지 않고, 만들어지는 데이터를 그대로 사용하기 위한 용도이다.
@RestController는 @Controller와 @ResponseBody를 합친역할을 수행하며, Spring 4.0부터 사용할 수 있다.
컨트롤러 클래스에 @RestController 어노테이션을 사용함으로써 @ResponseBody 어노테이션을 요청 매핑 메소드에 추가할 필요가 없다.
2) @ResponseBody
객체 → JSON. 자바 객체를 HTTP 응답 몸체로 매핑하는 역할을 한다.
3) @RequestBody
JSON → 객체. HTTP 요청의 몸체를 자바 객체로 매핑하는 역할을 한다.
4) @ResponseEntity
전체 HTTP 응답을 나타낸다.
@ResponseBody + HTTP상태코드. 데이터에 응답코드까지 전달한 것이다.
5) JSON (JavaScript Object Notation)
경량의 DATA-교환 방식으로 JavaScript에서 파생되어 객체를 표현하는 표기법으로 쓰이지만, 언어 독립형 데이터 포맷으로 수많은 프로그래밍 언어에서 이용가능하다.
예제1. @RestController이 적용된 컨트롤러의 모든 메소드는 @ResponseBody가 생략된다.
@RestController @RequestMapping("/sample") public class SampleController { @RequestMapping("/sendVO") public SampleVO sendVO() { SampleVO vo = new SampleVO(); vo.setFirstName("홍만"); vo.setLastName("최"); return vo;
} |
예제2. @RequestBody 위치와 @RestController사용으로 인해 생략된 @ResponseBody(ResponseEntity 앞)
@RestController @RequestMapping("/replies") public class ReplyController { @RequestMapping(value = "", method = RequestMethod.POST) public ResponseEntity<String> register(@RequestBody ReplyVO vo) { entity = new ResponseEntity<String>("SUCCESS", HttpStatus.OK); return entity;
} |
2. REST API 특징
1) Client-Server
REST 서버는 API를 제공하며, 클라이언트는 사용자 인증이나 컨텍스트 등을 직접 관리하는 구조이다.
각각의 역할이 확실히 구분되어 클라이언트와 서버에서 개발해야할 내용이 명확해지고 서로간 의존성이 줄어든다.
2) 무상태성 (Stateless Server)
작업을 위한 상태정보를 따로 저장하고 관리하지 않는다. 세션 정보나 쿠키정보를 별도로 저장하고, 관리하지 않아서 API서버는 들어오는 요청만을 단순히 처리한다. 따라서 서비스의 자유도가 높아지며, 불필요한 정보를 관리하지 않아 구현이 단순해진다.
3) 캐시(Cache)
HTTP라는 기존 웹표준을 그대로 사용하여, 웹에서 사용하는 기존 인프라를 그대로 활용할 수 있다. 따라서 HTTP가 가진 캐싱기능을 적용할 수 있다.
4) 유니폼 인터페이스 (Uniform Interface)
URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행할 수 있는 구조이다.
5) 계층형 구조 (Layered System)
REST 서버는 다중 계층으로 구성될 수 있으며, 보안, 로드밸런싱, 암호화 계층을 추가해 구조상 유연성을 둘 수 있다.
6) 자체표현구조(Self-descriptiveness)
REST API 메시지만 보고 쉽게 이해할 수 있는 자체 표현 구조이다. 인터페이스의 유연성에 제약을 가하여 전체적인 아키텍쳐가 간결하다.
3. REST API 디자인 규칙
1) URI는 정보의 자원을 표현한다.
2) 자원에 대한 행위는 HTTP Method (POST, GET, PUT, DELETE)로 표현한다.
ex) REST를 이용하여 돼지를 표현하려면?
Resource |
POST (Create) |
GET (Read) |
PUT/PATCH (Update) |
DELETE (Delete) |
/pigs |
돼지 추가 |
돼지들의 목록보기 |
새로운 돼지 리스트로 교체 |
돼지 전체 삭제 |
/pigs/1234 |
에러방생 |
FOO 보기 |
FOO정보 업데이트 없을 시 에러발생 |
FOO 삭제 |
3) Naming
URL에 동사를 사용하지 않는다. HTTP Method를 동사 대용으로 사용한다.
대신 명사를 사용하도록 한다. 단수보다는 복수형 명사를 사용한다.
ex) /savePigs → /pigs - POST
4. HTTP 응답 상태 코드
클라이언트(웹 브라우저)에서 서버에 Request를 하면, 서버에서는 Response를 보내준다. 아래는 응답코드를 정리해보았다.
Response Code
1xx : 정보(Informational). 리퀘스트를 받고, 처리중인 상태
2xx : 성공(Success). 리퀘스트를 정상적으로 처리함
3xx : 리디렉션(Redirection). 리쉐스트 완료를 위해 추가 동작이 필요한 상태
4xx : 클라이언트 오류(Client Error). 클라이언트 요청을 처리할 수 없어 오류 발생
5xx : 서버 오류(Server Error). 서버에서 처리를 하지 못하여 오류 발생
200번대 응답(Response) : 성공(Success)
200 |
OK |
요청 정상 처리. |
204 |
No Content |
요청을 정상 처리하였으나, 돌려줄 리소스가 없는 상태. 응답에 어떠한 EntityBody도 포함하지 않으며, 서버에서 처리 후, 클라이언트에 정보를 보낼 필요가 없는 경우에 사용한다. |
206 |
Partial Content |
Range가 지정된 요청인 경우, 지정된 범위만큼의 요청을 받았다는 것을 알려준다. |
300번대 응답(Response) : 리디렉션(Redirection)
301 | Moved Permanently | 요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후 새 URI를 사용해야 한다는 것을 나타낸다. (영구적인 URI 변경) |
302 | Found | 요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후 새 URI를 사용해야 한다는 것을 나타낸다. (일시적인 URI 이동) |
303 | See Other | 요청에 대한 리소스는 다른 URI에 있기 때문에 GET 메서드를 사용해서 얻어야 한다는 것을 나타낸다. 리디렉션 위치를 GET 메서드를 통해 얻어야 한다. |
304 | Not Modified | 요청한 리소스가 마지막 요청 이후 변경된 적이 없기 때문에 기존 클라이언트의 로컬 캐시 리소스를 사용하도록 알려준다. 300번대로 분류되어 있지만, 리디렉션과는 관계없는 처리를 함. |
307 | Temporary Redirect | 임시로 페이지를 리다이렉트 한다. |
400번대 응답(Response) : 리디렉션(Redirection)
400 | Bad Request | 클라이언트의 요청 구문이 잘못된 상태 |
401 | Unauthorized | 권한없는 컨텐츠를 요청했을때 인증을 거치라는 의미로 사용하며, 요청한 인증이 실패했을 경우에도 응답으로 전송한다. |
403 | Forbidden | 접근 금지 응답. Directory Listing 요청 및 관리자 페이지 접근 등을 차단하는 경우 서버는 EntityBody에 접근 거부에 대한 이유를 명시하여 보낼 수 있다. |
404 | Not Found | 클라이언트가 요청한 리소스가 서버에 없는 상태 |
405 | Method Not Allowed | 허용되지 않는 HTTP 메서드를 사용 |
500번대 응답(Response) : 리디렉션(Redirection)
500 | Internal Server Error | 서버에서 클라이언트 요청을 처리 중에 에러 발생 |
503 | Service Unavailable | 서버가 일시적으로 요청을 처리할 수 없음. 과부하 상태 혹은 점검으로 인해 요청을 처리할 수 없다. |
504 | Gateway Timeout | 서버를 통하는 게이트웨이에 문제가 발생하여 시간초과 발생 |
505 | HTTP Version Not Supported | 서버를 통하는 게이트웨이에 문제가 발생하여 시간초과 |
'개발 > Java, SpringFramework' 카테고리의 다른 글
BeanCreationException: Error creating bean (0) | 2017.11.27 |
---|---|
[Spring/STS] 프로젝트 시작 (0) | 2017.10.27 |
[spring/STS] 게시물의 파일첨부 (0) | 2017.10.27 |
URL과 URI 그리고 URN (0) | 2017.10.25 |
[Spring/STS] 개발 전 준비사항 및 프로젝트 생성 (0) | 2017.10.23 |