Spring 3.0의 @ResponseBody, 그리고 4.0부터 지원되는 @RestController를 통해 Rest API 메소드를 지원할 수 있게 되었다.
@ResponseBody : html을 JSON 형태로 보여주는 역할
@RestController = @ResponseBody + @Controller
Spring에서는 class나 method 앞에 간단한 annotation(@~)을 통해 각 class나 method가 어떤 역할을 해주는지 자동으로 정해준다.
마찬가지로 REST Controller에 대해서도 Annotation을 활용할 수 있는데 그 방법은 크게 두 가지가 있다.
I. 필요한 Controller Class 앞에 @RestController를 붙여주거나,
II. 필요한 Controller Class 앞에 @Controller를 붙여주고, 해당 Class 내의 필요한 Method 앞에는 @RequestBody를 붙여줄 수 있다.
CRUD
= Create + Read + Update + Delete
Read
Create
Update
@PutMapping("/api/~")
: 자원의 전체 교체
@PatchMapping("/api/~")
: 자원의 부분 교체
- Spring 3.2부터 지원
Delete
1~4의 다른 방식
위의 annotation 예시에서 공통적인 ("/api/~") 부분은 서버 상 해당 주소에 REST EndPoint를 만들어 준다.
- (server baseURL)/api/~
만약 Endpoint 설정에 있어 그 주소를 다음과 같이 주게 되면 URI 경로의 일부를 parameter로 사용하는 PathVariable을 설정할 수 있다.
@RequestMapping("/api/{id}")
public String ex(@PathVariable String id) {
...
}
Query parameter를 주고 싶다면 다음과 같이 method를 작성할 수 있다.
@RequestMapping("/api/~")
public String ex(@RequestParam(required=false) String id) {
...
}
JSON 데이터를 원하는 타입의 객체(여기서는 HashMap으로 변환해야 하는 경우 사용할 수 있다.
즉, @RequestBody는 HTTP 요청의 body를 Java 객체로 받을 수 있게 해준다.
@RequestMapping("/api/~")
public String ex(@RequestBody(required=false) HashMap<String, Object> data) {
...
}
required에 대한 default 설정 값은 true이다.
간혹 구글링을 하다보면 @RequestBody는 @GetMapping과 함께 사용하지 못한다고 나와 있는 경우가 많은데, 이와 상관없이 Get, Post 등 모든 REST API와 사용 가능하다.
다만 client 측에서 request body를 전달할 수 없는 경우가 있기 때문에 RequestParameter로 대체하는 것으로 결정하는 경우가 많다.
https://rebeccacho.gitbooks.io/spring-study-group/content/chapter16.html