본문 바로가기

Java

[Spring] @Controller VS @RestController

@Controller VS @RestController

 

  • Spring에서 Controller를 지정해주는 어노테이션이다.
  • Response Body가 생성되는 방식에서 차이점을 가진다.

@Controller

 

① Controller에서 View를 반환하는 경우

 

  1. 클라이언트에서 요청을 보내면 DispatcherServlet을 거쳐 HandlerMapping으로 Controller를 찾는다.
  2. 요청 처리 후 View Name을 반환한다.
  3. 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 규격에 맞게 변환된다.
  1. 클라이언트에서 요청을 보내면 DispatcherServlet을 거쳐 HandlerMapping으로 Controller를 찾는다.
  2. 요청 처리 후 객체를 반환한다.
  3. 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/

https://dncjf64.tistory.com/288

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