REST (REpresentational State Transfer)
웹에 존재하는 모든 자원(문서, 이미지, 동영상 등)에 고유한 URI를 부여해 활용하는 것으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법론
웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일
HTTP 메소드(POST, GET, PUT, DELETE)를 통해 CRUD(Create, Read, Update, Delete) 연산 수행
서버와 클라이언트가 데이터를 주고받는 형식은 json, xml, text, rss 등이 있으며 Key와 Value를 활용하는 json 주로 사용
다양한 클라이언트(모바일 디바이스 등)의 등장으로 멀티 플랫폼을 지원하는 서비스 자원에 대한 아키텍처의 대안으로 REST가 관심받고 있음
세 가지 구성요소
- 자원(Resource, URI)
- 행위(Verb, HTTP Method)
- 표현(Representatiohn of Resource)
클라이언트와 서버 사이의 통신 방식
- 클라이언트 - 자원을 요구하는 쪽, 브라우저
- 서버 - 자원을 가지고 있는 쪽
REST 규칙
- Uniform Interface
일관성있는 인터페이스로 HTTP 표준 프로토콜에만 따른다면 특정 OS나 특정 언어에 종속되지 않고 모든 플랫폼에서 사용 가능한 아키텍쳐 스타일이다.
- Client-Server
자원이 있는 쪽인 서버는 API를 통해 자원 제공하고
자원을 요청하는 쪽인 클라이언트는 사용자 인증 관련을 담당하여 둘의 역할이 구분되고 개발 내용이 명확해진다.
- Stateless
상태 정보를 유지하지 않는 무상태성을 가져 이전 요청이 다음 요청에 연관되선 안된다.
서버는 각각의 요청을 완전히 다른것으로 인식하고 처리해야한다.
클라이언트의 세션과 쿠키같은 컨텍스트를 서버에 저장하지 않으므로 서버 구현이 단순해진다.
- Cacheable
HTTP의 기존 웹 표준을 그대로 사용하기 때문에 HTTP가 가진 캐싱 기능 적용 가능하다.
이는 HTTP에서 사용하는 Last-Modified나 E-Tag를 사용해 구현한다.
따라서 응답시간이 빨라지고 트랜잭션이 발생하지 않아 대용량 요청을 효율적으로 처리할 수 있다.
* 웹 캐시란 서버 지연을 줄이기 위해 자주 사용하는 웹 페이지, 이미지, 기타 유형의 웹 멀티미디어 등의 웹 문서들을 임시 저장하기 위한 정보기술
- Layered System (계층화)
클라이언트는 API만 호출하므로 직접 통신하는 것인지 중간 서버와 통신하는지 알 수 없다.
REST 서버는 중간에 프록시 서버, 로드 밸런싱, 암호화 계층 등의 중간매체를 사용해 구조상의 유연성을 둘 수 있다.
- Self-Descriptiveness (자체 표현 구조)
Rest API 메시지 만으로 그 요청이 어떤 행위인지 쉽게 이해 가능하다.
RESTXX API
REST API란 REST의 특징을 기반으로 API를 제공하는 것이다.
그 중 RESTful API는 REST의 비공식적 구현 가이드로써 REST의 6가지 규칙을 잘 지켜서 설계된 API를 말한다.
설계 시 주의사항 (경로 네이밍 규칙)
- 소문자를 사용한다.
- 밑줄(_) 대신 하이픈(-)을 사용한다. (가급적 하이픈 사용도 최소화)
- 슬래시(/)는 계층 관계를 나타낼 때 사용한다.
URI의 마지막에 슬래시(/)를 포함하지 않는다.
- URI는 정보의 자원을 표현해야 한다.(리소스명은 동사가 아닌 명사를 사용한다)
- 자원의 행위는 url 대신 HTTP 메소드(GET, POST, PUT, DELETE)에 포함시켜 표현한다.
URI는 자원을 표현하는데 중점을 두어야 하기 때문에 정보의 자원을 표현해야 하며 동사보다는 명사를 사용해야 한다.
컨트롤 자원을 의미하는 경우 예외적으로 동사를 허용한다.
- 확장자(.txt, .png 등)를 사용하지 않는다.
스프링 프레임워크 Rest API 관련 어노테이션
- @RequestBody
HTTP 요청 Body를 자바 객체로 전달받는다.
json이나 XML과 같은 형태의 데이터를 Jackson등 MessageConverter 활용하여 자바 객체로 변환
* 반드시 POST 요청과 함께 사용
- @ResponseBody
자바 객체를 HTTP 응답 Body로 전송한다.
- @XXMapping
해당 요청 XX(GET, POST, PUT, DELETE ..) 매핑
- @RequestMapping
클래스와 메서드 수준에서 모두 사용한다.
클래스 전체에 정의 후 각 메서드마다 세부 url을 나눠 각각 다른 매핑 조건을 줄 수 있다.
- @RequestParam
url에 담긴 쿼리 파라미터 처리(필수 여부 기본값 true)
ex) localhost:8080/board/detail?key=2 → @RequestParam(value="key") Long boardNo
- @PathVariable
url에 각 구분자에 들어오는 값 처리(필수 여부 기본값 true)
ex) localhost:8080/board/detail/{boardNo} → @PathVariable(name="boardNo) Long boardNo
댓글 영역