@Controller VS @RestController
- Spring에서 Controller를 지정해주는 어노테이션이다.
- Response Body가 생성되는 방식에서 차이점을 가진다.
@Controller
① Controller에서 View를 반환하는 경우
- 클라이언트에서 요청을 보내면 DispatcherServlet을 거쳐 HandlerMapping으로 Controller를 찾는다.
- 요청 처리 후 View Name을 반환한다.
- DispatcherServlet이 ViewResolver를 통해 View Name에 해당하는 View를 찾아 반환한다.
@Controller
@RequestMapping("/menu")
public class MenuController {
private final MenuService menuService;
@RequestMapping(value = "/showMenuDetail", method = RequestMethod.GET)
public String showMenuList(Model model, @RequestParam String menuId) {
Map<String, Object> menuDetail = menuService.selectMenuDetail(menuId);
model.put("MENU_DETAIL", menuDetail);
return "menu/menuDetailView"
}
}
② Controller에서 Data를 반환하는 경우
- @ResponseBody 어노테이션
- 반환타입 또는 메소드 앞에 해당 어노테이션을 사용한다.
- 어떠한 객체를 반환하더라도 HTTP 규격에 맞는 값으로 반환할 수 있다.
- @RestController 어노테이션 사용 시 생략 가능하다. - ResponseEntity<반환 타입> 객체
- HttpEntity를 상속하여 구현된다.
- 제네릭 타입으로 전달된 객체 타입에 따라 HTTP 규격에 맞게 변환된다.
- 클라이언트에서 요청을 보내면 DispatcherServlet을 거쳐 HandlerMapping으로 Controller를 찾는다.
- 요청 처리 후 객체를 반환한다.
- DispatcherServlet이 HttpMessageConverter를 통해 JSON 형태의 데이터로 반환한다.
@Controller
@RequestMapping("/menu")
public class MenuController {
private final MenuService menuService;
@RequestMapping(value = "/selectMenuList", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<List> selectMenuList() {
List<Menu> menuList = menuService.selectMenuList(menuId);
return ResponseEntity.ok().body(menuList);
}
@RequestMapping(value = "/selectMenuDetail", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> selectMenuDetail(@RequestParam String menuId) {
Map<String, Object> menuDetail = menuService.selectMenuDetail(menuId);
return menuDetail;
}
}
@RestController
- @Controller와 @ResponseBody를 합친 어노테이션이다.
- JSON 형태의 데이터만을 반환한다.
- REST API 개발 시 주로 사용함에 따라 RESTful 웹 서비스의 Controller라고 할 수 있다.
@RestController
@RequestMapping("/menu")
public class MenuController {
private final MenuService menuService;
@RequestMapping(value = "/selectMenuList", method = RequestMethod.POST)
public ResponseEntity<List> selectMenuList() {
List<Menu> menuList = menuService.selectMenuList(menuId);
return ResponseEntity.ok().body(menuList);
}
@RequestMapping(value = "/selectMenuDetail", method = RequestMethod.POST)
public ResponseEntity<Map> selectMenuDetail(@RequestParam String menuId) {
Map<String, Object> menuDetail = menuService.selectMenuDetail(menuId);
return ResponseEntity.ok().body(menuDetail);
}
}
▷ 출처
https://velog.io/@dyunge_100/Spring-Controller%EC%99%80-RestController%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://tecoble.techcourse.co.kr/post/2021-05-10-response-entity/
728x90
'Java' 카테고리의 다른 글
Stream(1) (0) | 2024.07.18 |
---|---|
[Spring] @RequestBody vs @RequestParam (0) | 2024.07.10 |
재귀 알고리즘 (0) | 2024.07.04 |
Interface (0) | 2024.07.02 |
추상 클래스 (Abstract Class) (0) | 2024.07.01 |