API
- Application Programming Interface
- 애플리케이션과 운영체제(혹은 프로그래밍 언어가 제공하는 기능) 사이의 상호작용 지원
Rest
- Rest: Representational State Transfer
- 웹 사용 시의 제약조건들을 정의하는 소프트웨어 아키텍쳐 스타일
- 이름으로 구분된 자원의 상태를 주고 받는 모든 것
구성요소
GET /students/hong
Response
{
"name": "홍길동",
"age": 30,
"gender": "male"
}
- 자원: HTTP URL을 통해 자원을 구별/명시
- 행위: 클라이언트는 HTTP method(post, get, put, delete)를 통해 자원에 crud 적용
- 표현: 클라이언트의 요청을 받았을 때 자원의 상태를 나타냄
특징
- HTTP 표준만 따르면 특정 언어나 기술에 종속되지 않고 모든 플랫폼에서 사용가능
Stateless
- 작업을 위한 상태정보(세션이나 쿠키정보)를 따로 저장/관리하지 않음
Cacheable
- HTTP 표준을 그대로 사용하므로 캐시 적용 가능
- 캐시: 서버 지연을 줄이기 위해 페이지, 이미지 등의 웹 문서들을 임시 저장하는 기술
- 많은 요청을 효율적으로 처리 가능
Self-descriptiveness
- 요청 메세지만 보고도 이해 가능한 자체표현 구조로 되어있음
Client-Server
- 자원을 갖고 있는 서버, 자원을 요청하는 클라이언트로 구성됨
- 서버와 클라이언트의 역할이 확실히 분리시켜 상호 의존성을 줄임
계층형 구조
- 서버에서 여러 계층을 추가하여 유연한 구조로 개발가능
REST API
RESTful API
REST API설계규칙
명사와 소문자 사용
http://example/getSample(X)
http://example/Sample(X)
http://example/sample(O)
슬래시(/)로 계층관계 표현
http://example/students/hong
URI 마지막에 슬래시(/)를 포함하지 않음
언더바(_) 대신 하이픈(-) 사용
응답상태코드 사용
확장자를 URI에 포함하지 않음
http://example/students/hong.html(X)
http://example/students/hong(O)
참고
Spring REST api 구현
라이브러리(jackson) 추가
- jackson mapper 라이브러리를 의존성 추가(pom.xml)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
RestController 작성
- 두가지 어노테이션이 있으며 적절한 것을 선택하여 사용
@Controller 사용하기
@Controller
@ResponseBody
public class Sample1{
로직
}
@RequestBody
- 클라이언트가 요청한 XML/JSON을 자바 객체로 전달받음
@ResponseBody
- 자바 객체를 XML/JSON으로 변환해서 Body에 전송
@RestController 사용하기
@RestController
public class Sample2{
로직
}
- @Controller+@ResponseBody
- 모든 메서드가 뷰 대신 객체로 작성됨