[Spring JPA] @RestController / @ResponseBody / @RequestBody
Controller
Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다.
전통적인 Spring MVC 컨트롤러인 @Controller와 Restful 웹 서비스의 컨트롤러 @RestController의 큰 차이점은 HTTP Response Body가 생성되는 방식이다.
1. @Controller (Spring MVC Controller)
[Controller - View]
전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다. 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환한다.
1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. Mapping 되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
3. Controller가 요청을 처리한 후에 응답을 DispatcherServlet으로 반환하고, DispatcherServlet은 View를 사용자에게 반환한다.
[Controller - Data]
Spring MVC Controller 에서 Data를 반환해야 하는 경우가 있다. Spring MVC의 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해야 한다. 이를 통해 Controller도 JSON 형태로 데이터를 반환할 수 있다.
1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. Mapping 되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
3. @ResponseBody를 사용하여 Client에게 Json 형태로 데이터를 반환한다.
2. @RestController (Spring RESTful Controller)
Spring MVC 프레임워크에서 REST API를 구현할 때, 컨트롤러에 @RestController 어노테이션을 붙인다.
RestController의 액션 메소드가 리턴하는 Java 객체는 자동으로 JSON 포맷으로 변환되어 클라이언트에 전송된다.
RestController의 액션 메소드는 데이터를 클라이언트에 전송하기 때문에 뷰(view)가 필요 없다.
Spring MVC Controller에 @ResponseBody가 추가된 것이다. RestController의 주용도는 Json/xml 형태로 객체 데이터를 반환하는 것이다.
1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. Mapping 되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
3. RestController는 해당 요청을 처리하고 데이터를 반환한다.
컨트롤러의 엑션 메소드 앞에 @ReponseBody 어노테이션을 붙이면, 이 액션 메서드가 리턴하는 Java 객체는 자동으로 JSON 포맷으로 변환되어 클라이언트에 전송된다.
@Controller
public class StudentController {
public @ResponseBody List<Student> students() {
List<Student> list = ...;
return list;
}
}
컨트롤러 앞에 @RestController 어노테이션을 붙였다면, 그 컨트롤러의 액션 메소드 앞에 @ResponseBody 어노테이션을 붙이지 않고 생략해도 된다.
@RestController
public class StudentController {
public List<Student> students() {
List<Student> list = ...;
return list;
}
}
RestController의 액션 메서드가 액션 메서드를 호출할 때 전송하는 request parameter 데이터도 JSON 포맷으로 전송하는 것이 일관적이라 좋다.
이렇게 JSon 포맷으로 전송된 request parameter 데이터를 받을 액션 메서드의 파라미터 변수에는 @RequestBody 어노테이션을 붙여주어야 한다.
public String update(@RequestBody Student student) { ... }
'web > Spring' 카테고리의 다른 글
[Spring Web MVC] 컨트롤러 클래스, 뷰 구현 (2) | 2021.11.24 |
---|---|
[Spring] 의존성 주입 애노테이션 @Autowired @Resource @Inject (0) | 2021.11.22 |
[Spring JPA] QueryDsl와 Gradle 그리고 AnnotationProcessor (4) | 2021.02.19 |
[Spring JPA/Rest API/AWS] 1. Spring Boot 프로젝트 생성 및 설정 (2) | 2020.05.09 |
[Spring JPA] Repository 기본 메소드 (0) | 2020.05.02 |
댓글 개