스프링에서 컨트롤러로 지정해주기 위한 어노테이션에는 @Controller와 @RestController가 있다. 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restful 웹 서비스의 컨트롤러인 @RestController의 주요 차이점은 HTTP ResponseBody가 생성되는 방식이다.
Spring MVC Controller - @Controller
Controller - View
주로 View를 반환하기 위해 사용, Client의 요청으로부터 View를 반환한다.

1. Client는 URI로 웹 서비스에 요청을 한다.
2. Dispatcher Servlet이 요청을 가로채어 Handler Mapping을 통해 컨트롤러에게 처리 요청을 보내고
3. Controller가 요청을 처리한 후에 DispatcherServlet으로 응답을 반환하고 DispatcherServlet은 View를 사용자에게 반환한다.
-> @Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링합니다.
ViewResolver란?
ViewResolver는 사용자가 요청한 것에 대한 응답 view를 렌더링하는 역할을 한다.
Controller - Data (Spring 3.x MVC Restful Web Service Work Flow)
Spring MVC 컨트롤러도 Data를 반환해야 하는 경우도 있다. 이럴 땐 @ResponseBody 어노테이션을 활용하여 Controller도 JSON 형태로 데이터를 반환할 수 있다.

1. Client는 URI로 웹 서비스에 요청
2. Mapping되는 Handler와 그 Type을 DispatcherServlet이 요청 인터셉트
3. @ResponseBody 어노테이션을 사용하여 Client에게 JSON 형태로 데이터 반환
@RestController (Spring 4.x MVC Restful Web Service Work Flow)
Json 형태로 객체 데이터를 반환, RestController = Spring MVC Controller + @ResponseBody

1. Client는 URI로 웹 서비스에 요청
2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청 인터셉트
3. RestController는 해당 요청을 처리하여 데이터 반환
@Controller와 @RestController 차이점
-> HTTP Response Body가 생성되는 방식의 차이, 기존의 MVC Controller는 View 기술 사용하여 @ResponseBody 어노테이션을 붙여준다면 View를 리턴하지 않고 JSON 형태의 데이터를 반환 가능하다.
이 과정이 Spring 4.0부터 @RestController를 통해 단순화 되었다.
@RestController를 사용하면 JSON/XML 타입의 HTTP 응답을 직접 리턴하게 된다.
즉, RestController = Spring MVC Controller + @ResponseBody가 되는 것이다.
@RestController를 사용한다면 @ResponseBody 어노테이션을 붙여주는 번거로움을 덜 수 있다.
예전에 프로그래밍을 할 때에는 jsp나 html과 같은 뷰를 전달해 주었기 때문에 @Controller를 사용해왔었지만, 최근에는 프론트엔드와 백엔드를 따로 두고, 백엔드에서는 REST API를 통해 json으로 데이터만 전달하기 때문에 편리성을 위해 @RestController를 사용하는 경우가 많다고 한다.

전체적 동작 구조는 위 사진을 보면 좀 더 쉽게 이해할 수 있을 것이다!
reference : https://mangkyu.tistory.com/49
'Back-end' 카테고리의 다른 글
| [Java] Java Matcher 클래스(자바 정규 표현식) - 사용법 (0) | 2021.11.20 |
|---|---|
| [Spring] Spring Framework MVC (0) | 2021.11.18 |
| [Spring] 스프링 계층 구조의 이해 (0) | 2021.11.18 |
| [Spring boot] REST API에 대해 (0) | 2021.11.17 |
| [Spring] Lombok이란? (0) | 2021.11.15 |