Spring

[Spring Boot] @Controller와 @RestController 차이 제대로 알기!

안루피 2023. 12. 5. 20:32
728x90

 

Spring에서 클래스에 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다.

이 2가지 어노테이션의 차이점에 대해 정리해봅시다.

 

먼저 알아야 할..

@RequestBody, @ResponseBody 어노테이션

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

 

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

 

이해가 되시는지...

 

그러면 

@Controller와 @RestController를 알아보자.

 

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

 

출처 : https://velog.io/@dyunge_100/Spring-Controller%EC%99%80-RestController%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

 

그림으로 보니 더 미치게 복잡하구만...

왜 이렇게 복잡하게 전달되는지 하하

 

@Controller?

전통적인 Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View(화면)를 반환하기 위해 사용한다.

 

[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 형태의 데이터도 반환할 수 있다.

 

@RestController

 

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

 

 

728x90