-
Controller와 RestController ( + ResponseEntity)Spring 2021. 10. 26. 14:52
controller와 달리 restcontroller에서는 페이지를 반환하는 것이 아니기 때문에,
예외적인 상황에서 문제가 발생할 수 있다.
따라서 ResponseEntity를 이용하여 상태코드를 조절하도록 한다.
Controller
전통적인 @Controller는 주로 view를 반환하기 위해 사용한다.
클라이언트가 URI 형식의 request를 보내면, mapping되는 handler와 타입을 찾는 dispatcher servlet이 요청을 처리하고, Controller에서 일을 처리한 후에 dispatcher servlet에게 보내면 view를 클라이언트에게 response로 보내는 형식이다.
view를 반환하기 위해서는 ViewResolver가 사용되며 설정에 맞게 view를 찾아 렌더링 해준다.
@Controller에서도 Data를 반환하는 경우도 있다. @ResponseBody 어노테이션을 사용하여 Json 형식으로 데이터를 반환할 수 있도록 설정할 수 있다.
클라이언트가 URI 형식의 request를 보내면, mapping되는 handler와 타입을 찾는 dispatcher servlet이 요청을 처리하고, Controller에서 일을 처리한 후에 클라이언트에게 Json형태로 데이터를 보내는 형식이다.
여기서 데이터를 반환하기 위해서 ViewResolver가 아닌 HttpMessageConverter가 동작하게 된다. HttpMessageConverter안에는 여러종류의 Converter가 존재하는데, 필요에 따라서 사용되는 Converter가 달라지게 된다. (ex. 단순문자열 -> StringHttpMessageConverter, 객체 -> MappingJacson2HttpMessageConverter)
스프링에서는 클라이언트의 Http Accept 헤더와 서버의 컨트롤러 반환타입 정보를 조합하여 적절한 Converter를 선택하여 처리한다.
RestController
@RestController는 결국 Spring MVC Controller에 @ResponseBody가 추가되어 Json 형식의 객체 데이터를 반환하는 방식이다.
클라이언트가 URI 형식의 request를 보내면, mapping되는 handler와 타입을 찾는 dispatcher servlet이 요청을 처리하고, RestController에서 일을 처리한 후에 클라이언트에게 Json형태로 데이터를 보내는 형식이다.
view를 반환하는 Controller와 Json형식의 데이터를 반환하는 @Controller + @ResponseBody는 구분하여 작성해주는 것이 좋기 때문에, @Controller와 @RestContorller를 분류하여 작성하도록 하자.
ResponseEntity
@RestController에서는 Json형식의 데이터를 반환하기 때문에 때로 예외적인 문제가 발생할 수 있다. 이를 위하여 @ResponseEntity를 사용하여 개발자가 직접 결과데이터와 HTTP상태코드를 제어하여 사용할 수 있다. HttpHeader, HttpBody, HttpStatus를 포함하고 있으므로 HTTP상태코드를 함께 전송하고 싶은 데이터가 있을 때 사용할 수 있다.
상태코드, 헤더, 응답데이터를 함께 보내준다면 받은 데이터의 상태코드에 따라 화면에 다르게 나타내고자 할 때 유용하게 사용될 수 있다.
(참고한 사이트)
https://2ham-s.tistory.com/279
https://mangkyu.tistory.com/49
https://devlog-wjdrbs96.tistory.com/182
'Spring' 카테고리의 다른 글
TDD (Test Driven Development) : 단위 테스트 작성하기 (0) 2021.10.26 JPA delete 쿼리가 실행되지 않을 때 (0) 2021.10.26 DTO를 통해 mapping된 엔티티 데이터 묶어서 보내기 ( + 순환참조 방지 DTO) (2) 2021.10.26 controller에서 파라미터를 받는 방법 : @RequestParam, @RequestBody, @PathVariable (+ DTO를 포함하는 DTO) (0) 2021.10.26 hibernate lazy initialization exception could not initialize proxy - no session 에러 발생시 (0) 2021.09.05