[Spring] @Controller와 @RestController의 차이

DyungE_100·2022년 4월 22일
4

Spring

목록 보기
6/7

0. @RequestBody, @ResponseBody 어노테이션

보통 웹에서 화면 전환이 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다. 비동기 통신을 하기 위해선 클라이언트가 서버로 요청 메시지의 본문(Body)에 데이터를 담아서 보내야 하고, 서버도 클라이언트에 응답하기 위해 응답 메시지의 본문(Body)에 데이터를 담아서 보내야 한다. 이 때의 본문(body)를 각각 Request Body와 Response Body로 부르는데, 이러한 Body에 담기는 데이터 형식은 JSON(JavaScript Object Notation)이다.

@RequestBody 어노테이션은 이러한 비동기 통신에서 쓰이는 Body 안의 데이터(JSON객체)를 자바 객체(VO)로 변환해주는 어노테이션이다. 마찬가지로 @ResponseBody 어노테이션은 보내려는 자바 객체(VO)를 데이터(JSON객체)로 바꿔 Body 안에 넣어주는 어노테이션이라고 보면 무방하다.

1. @Controller와 @RestController 어노테이션

@Controller@RestController 둘 다 Spring에서 Controller를 지정해주기 위한 어노테이션이다. 전통적인 Spring MVC의 Controller인 @Controller와 RESTful 웹 서비스의 Controller인 @RestController의 주요한 차이점은 Response Body가 생성되는 방식이다.

1.1 @Controller

[Controller로 View를 반환할 경우]

Spring MVC의 Controller인 @Controller는 주로 View를 반환하기 위해 사용한다.

1) Client에서 보낸 요청은 DispatcherServlet을 거쳐 HandlerMapping을 통해 Controller를 찾고 요청을 수행하게 된다.

2) Controller는 받은 요청을 처리하고 난 뒤 ViewName을 반환한다.

3) DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

[Controller로 Data를 반환할 경우]

하지만 View뿐만 아니라 Data(또는 객체)를 반환해야 하는 경우도 있다. 그럴 때는 데이터를 반환하기 위해 ResponseEntity(HttpStatus + HttpHeaders + HttpBody 형태의 데이터, 한 마디로 Http 응답 메시지)의 Body(Response Body)를 사용해야 하는데, 이 때 @ResponseBody 어노테이션을 사용하면 된다. 이를 통해 Controller도 View 뿐만이 아닌 JSON 형태의 데이터도 반환할 수 있다.

참고)

@Controller를 통해 객체를 반환할 때, 일반적인 경우엔 ResponseEntity로 감싸서 반환한다.
그리고 객체를 반환할 때는 View를 반환할 때와 마찬가지로 ViewResolver 대신 HttpMessageConverter가 동작한다. HttpMessageConverter에는 여러 Converter가 등록되어 있으며, 반환해야 하는 데이터의 종류에 따라 Converter도 그에 맞게 달라진다.

예를 들어, 단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, JSON 객체의 경우에는 MappingJackson2HttpMessageConverter가 사용된다. Spring은 클라이언트의 HTTP Accept Header와 서버의 Controller 반환 타입 정보를 조합해 적합한 HttpMessageConverter를 선택하여 처리한다.

[@Controller와 @ResponseBody 예제 코드]

@Controller는 보통 View를 반환하기는 하지만 위와 같이 @ResponseBody 어노테이션을 활용하면 객체를 반환할 수 있다. @RequestParam의 경우는 Request Header 안의 파라미터를 Mapping해주는 어노테이션이다.

1.2 @RestController

@RestController 어노테이션은 말 그대로 @Controller@ResponseBody가 합쳐진 어노테이션이라고 생각하면 된다. @Controller와 다르게 반환하려는 주류는 JSON 형태의 객체 데이터다. REST API를 개발할 때 주로 사용하며 마찬가지로 ResponseEntity로 감싸서 주로 반환한다.

[@RestController 예제 코드]

위의 예제 코드 중 첫 번째 메서드는 User 객체를 그대로 반환하고 있다. 이 때의 문제는 클라이언트가 예상하는 HttpStatus를 설정해줄 수가 없다는 것이다. 한마디로 에러가 났을 때 상태 코드를 보여주거나 할 수 없다는 말이다. 따라서 REST API를 개발한다면 객체를 상황에 맞게 ResponseEntity로 감싸서 반환해주는 것이 옳다.

위와 같이 지네릭스를 이용하여 알맞은 객체로 설정해주고 그 객체가 아닐 경우 에러가 나도록 할 수 있다. 따라서 REST API를 사용한다면 @RestController를 사용하는 것이 바람직해 보인다.





https://dev-coco.tistory.com/84,
https://joomn11.tistory.com/53,
https://mangkyu.tistory.com/49,

0개의 댓글