스프링 프레임워크에서는 Controller를 지정해주기 위한 Annotation으로 @Controller와 @RestController가 있다.
두 어노테이션의 가장 큰 차이점은 HTTP Response Body가 생성되는 방식이다.
MVC의 Controller에 사용하는 @Controller 어노테이션을 주로 View를 반환하기 위해 사용한다.
Controller로 View를 반환하는 과정

- 클라이언트는 URI 형식으로 웹 서비스로 요청을 보냄
- DispatcherServlet이 요청을 처리할 대상을 찾음
- HandlerAdapter를 통해 요청을 Controller에 위임
- Controller는 요청을 처리한 후 View Name을 반환
- DispatcherServlet은 VIewResolver를 통해 View Name에 해당하는 View를 찾아 사용자에게 반환
Controller가 반환한 View 이름으로 View를 렌더링하기 위해서는 ViewResolver가 사용되고 ViewResolver 설정에 맞게 View를 찾아 렌더링한다.
Controller로 Data를 반환하는 과정
View가 아닌 데이터를 반환해야 하는 경우가 있는데 Controller에서는 데이터를 반환하기 위해서는 @ResponseBody 어노테이션을 사용해야 한다. @ResponseBody 어노테이션을 사용하게 되면 Controller도 JSON 형태로 데이터를 반환할 수 있다.

- 클라이언트는 URI 형식으로 웹 서비스로 요청을 보냄
- DispatcherServlet이 요청을 처리할 대상을 찾음
- HandlerAdapter를 통해 요청을 Controller에 위임
- Controller는 요청을 처리한 후 객체를 반환
- 반환되는 객체는 JSON으로 Serialize되어 사용자에게 반환
Controller를 통해 객체를 반환하게 되면 ResponseEntity로 감싸서 반환을 하게 된다. 또한 객체를 반환하기 위해서는 View Resolver 대신 HttpMessageConverter가 동작하게 된다. HttpMessageConverter에는 여러 Converter가 있지만 반환하는 데이터에 따라 적합한 Converter가 사용되게 된다. 예를 들어 단순 문자열이라면 StringHttpMessageConverter, 객체라면 MappingJackson2HttpMessageConverter가 사용된다.
스프링 프레임워크는 클라이언트의 HTTP Accept Header와 서버의 Controller 반환 타입 정보를 조합하여 적합한 HttpMessageConverter를 선택하여 처리한다. MessageConverter는 HandlerAdapter와 Controller가 요청을 주고 받는 시점에 동작하게 된다.
@Controller를 사용한 예제 코드
@Controller
@RequiredArgsContructor
public class UserController {
private final UserService userService;
@GetMapping(value = "/users")
public @ResponseBody ResponseEntity<User> findUser(@RequestParam("userName") String userName) {
return ResponseEntity.ok(userService.findUser(user));
}
@GetMapping(value = "/users/detailView")
public String detailView(Model model, @RequestParam("userName") String userName) {
User user = userService.findUser(userName);
model.addAttribute("user", user);
return "/users/detailView";
}
}
위에서 findUser 메서드는 User 객체를 ResponseEntity로 감싸서 반환하고 있고 User를 JSON으로 반환하기 위해 @ResponseBody 어노테이션을 붙여 사용하고 있다.
스프링 프레임워크 4버전 이상부터 사용이 가능한 Annotation으로 기존의 @Controller Annotation에 @ResponseBody가 결합된 Annotation으로 @RestController라는 어노테이션이 있다.
@RestController 어노테이션을 사용하게 되면 클래스의 하위 메서드들에 @ResponseBody 어노테이션을 사용하지 않아도 문자열과 JSON를 전송할 수 있게 된다.
@RestController

- 클라이언트는 URI 형식으로 웹 서비스에 요청을 보냄
- DispatcherServlet이 요청을 처리할 대상을 찾음
- HandlerAdapter를 통해 요청을 Controller에 위임
- Controller는 요청을 처리한 후 객체를 반환
- 반환되는 객체는 JSON으로 Serialize되어 사용자에게 반환
@RestController를 사용한 예제 코드
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping(value = "/users")
public User findUser(@RequestParam("userName") String userName) {
return userService.findUser(user);
}
@GetMapping(value = "/users")
public ResponseEntity<User> findUserWithResponseEntity(@RequestParam("userName") String userName) {
return ResponseEntity.ok(userService.findUser(user));
}
}
findUser 메서드는 User 객체를 그대로 반환하고 있다. 이러한 경우에 클라이언트가 예쌍하는 HttpStatus를 설정해 줄 수 없기 때문에 객체를 상황에 맞는 ResponseEntity로 감싸서 반환해 주어야 한다.
참고 글
https://mangkyu.tistory.com/49
'Spring' 카테고리의 다른 글
| Scheduler 처리 (1) | 2023.10.26 |
|---|---|
| VO에서 Map 변환 메서드 (Apache Util) (2) | 2023.08.31 |
| @ModelAttribute 그리고 @RequestParam (0) | 2023.08.24 |
| @RequestMapping 이란? (0) | 2023.08.24 |
| @Resource Annotation 이란? (0) | 2023.08.24 |