오늘은 Spring에서 @RestController와 @Controller의 차이에 대해서 알아보고자 한다. @RestController는 많이 사용하지만 @Controller를 거의 사용하지 않게 된 이유는 백엔드와 프론트엔드를 나눠서 개발하게 되었기 때문이다. 전통적인 Spring MVC에서는 @Controller를 사용해서 화면을 전달했었다. 하지만 Restful Api 서버에서는 화면을 전달할 필요가 없기 때문에 @RestController만 사용하게 되었다. 두 어노테이션을 대체 어떤 차이가 있는 것일까?
@Controller - View
Spring MVC에서는 @Controller는 View를 반환하는 역할을 주로 한다. Spring MVC는 서버 사이드 랜더링이기 때문에 서버가 완성된 html 파일을 Response로 전달한다. 아래 그림은 @Controller가 작동하는 과정이다.
1. 유저가 요청을 보낸다.
2. 서블릿이 요청을 받아서 Handler Mapping에 전달한다.
3. Handler Mapping이 URL이 일치하는 Controller를 찾는다.
4. 비지니스 로직에서 결과를 처리하고 Controller가 ViewName을 반환한다.
5. 서블릿이 View Resolver를 사용해서 매칭된 View를 리턴한다.
@Controller - ResponseBody
위와 같은 경우는 View를 반환하는 과정인데 Spring MVC에서도 View가 아닌 데이터를 반환해줘야하는 경우가 있다. 그럴때 @Controller에서는 @ResponseBody라는 어노테이션을 api에 각각 추가해서 데이터를 반환할 수 있게한다.
@Controller
public class UserController {
private final UserService userService;
@GetMapping(value = "/users")
public @ResponseBody ResponseEntity<User> getData(){
return data;
}
@GetMapping(value = "/users/detailView")
public String detailView(Model model, @RequestParam("userName") String userName){
return "view";
}
}
1. 유저가 요청을 보낸다.
2. 서블릿이 요청을 받아서 Handler Mapping에 전달한다.
3. Handler Mapping이 URL이 일치하는 Controller를 찾는다.
4. 비지니스 로직에서 결과를 처리하고 Controller가 데이터를 반환한다
5. 서블릿이 데이터를 JSON 형태의 객체로 Serialize해서 사용자에게 반환한다.
이 과정에서 데이터는 ResponseEntity의 body 부분에 들어가게 된다. View는 View Resolver가 처리했지만 데이터는 HttpMessageConverter가 처리한다. 이 Converter에는 여러 종류가 있는데 요청 헤더에 application/json, text/html 등등 다양한 데이터 형식이 있는데 이에 알맞은 Converter가 데이터를 처리하게 된다.
@RestController
@RestController는 생각보다 별 차이가 없다. 위의 예제에서 데이터를 반환하고 싶으면 @Controller에 @ResponseBody를 붙여줬는지 단순하게 모든 api에 @ResponseBody가 붙어있는게 바로 @RestController이다. 주석에도 @ResponseBody를 쓸 때 편의를 위한 어노테이션이라고 소개되어 있다. 사용하는 어노테이션을 보면 @Controller와 @ResponseBody가 함께 있는 것을 볼 수 있다.
'Java' 카테고리의 다른 글
Java - Functional Interface의 예시 (모던 자바 인 액션 참고) (0) | 2022.08.20 |
---|---|
Java - Functional Interface란? (모던 자바 인 액션 참고) (0) | 2022.08.19 |
Java - Stream에 대해서 (0) | 2022.08.09 |
Java - Wrapper Class란 (0) | 2022.08.08 |
Java - Abstract Class와 Interface의 차이 (0) | 2022.08.04 |