@RestController와 @Controller

과녁스·2022년 2월 23일
0

Spring

목록 보기
10/11
post-thumbnail

개요


@RestController와 @Controller의 주요한 차이점은 @RestController에는 HTTP Response Body가 생성되는 방식입니다.

@RestController와 @Controller의 차이를 비교해보면서 정리하였습니다.

@Controller


@Controller는 주로 View를 반환하기 위하여 사용 합니다.

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
  3. Controller가 요청을 처리한 후에 응답을 DispatcherSevlet으로 반환하고, DispatcherServlet은 View를 사용자에게 반환한다.

Controller -> Data

컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다. 컨트롤러에서 데이터를 반환하기 위하여 @ResponseBody 어노테이션을 사용해야합니다.

@Controller
@RequestMapping("/book")
@RequiredArgsConstructor
public class UserController { 
	private final BookService bookService;
	
    @PostMapping(value = "/info")
    public @ResponseBody Book info(@RequestBody Book book){ 
    	return bookService.retrieveBookInfo(book);
    } 
    
    @GetMapping(value = "/infoView")
    public String infoView(Model model, @RequestParam(value = "bookName", required = true) String bookName){ 
    	Book book = bookService.retrieveBookInfo(bookName);
        model.addAttribute("book", book);
        return "/user/userInfoView"; 
    } 
}

@RestController


Spring MVC Controller에 @ResponseBody가 추가된 것입니다. @RestController의 주 용도는 JSON 형태로 객체 데이터를 반환하는 것입니다.

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냅니다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트합니다.
  3. RestController는 해당 요청을 처리하고 데이터를 반환합니다.

@RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다.

HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다.

단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.

Spring은 클라이언트의 HTTP 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter 를 선택하여 이를 처리합니다.

출처🙏


profile
ㅎㅅㅎ

0개의 댓글