## 전통적 MVC 방식과 RestAPI 방식의 차이
@RestController vs @Controller
@RestController == @Controller + @ResponseBody
RestController 애노테이션에 들어가보면 ResponseBody 애노테이션이 붙어있다.
컨트롤러에 붙이지 않고 이렇게 메서드에 달아서 사용할 수도 있음 (물론 용도에 따라 rest/일반 컨트롤러를 분리하는 것을 권장)
```
@Controller
@RequiredArgsConstructor
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";
}
}
```
### Controller
### RestController
컨트롤러를 통해 객체를 반환할 때에는 일반적으로 ResponseEntity로 감싸서 반환한다. 그리고 객체를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작한다. HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라진다. 단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 된다. Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리한다. MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고 받는 시점이다. 그림의 4번에서는 메세지를 객체로, 6번에서는 객체를 메세지로 변환하는데 메세지 컨버터가 사용된다.
### 추가로 궁금한 점
회사 코드에서 ResponseEntity.ok(객체)와 같이 ResponseEntity로 변환해주는 과정 없이, 아래와 같은 response를 반환하는 것으로 보인다.
@Getter
@Setter
@NoArgsConstructor
public class SomeResponse implements Serializable {
....
}
어딘가에서 ResponseEntity로 따로 매핑해주고 있는 것인지 궁금..