Spring @Controller vs @RestController

후니팍·2023년 4월 17일
0
post-thumbnail
post-custom-banner

스프링 프로젝트에서 컨트롤러를 지정할 때 사용되는 두 가지 어노테이션이 있습니다.
@Controller@RestController인데요, 이 두 어노테이션의 차이는 무엇인지 알아보고자 합니다.


결론부터...

결론부터 말하자면 @RestController@Controller@ResponseBody를 합친 어노테이션입니다.

@Controller
@ResponseBody
public class Controller {}

@RestController
public class RestfulController {}

그렇다면 @RestController는 컨트롤러에서 ResponseBody로 반환을 해줄 때 사용하면 되는 것일까요?
@ControllerResPonseBody가 아닌 형식(json, xml...이 아닌 형식)을 반환할 때 쓰이는 것일까요?

공부해보니 두 어노테이션의 차이는 단순히 반환 값 차이뿐 아니라 철학적인 차이도 있다는 것을 알았습니다. 이번에는 그 철학적인 차이를 알아보기 위해 글을 작성하게 되었습니다.


@Controller

스프링에서 @Controller는 주로 뷰를 반환하기 위해 사용됩니다.
컨트롤러의 메소드를 호출하게 되면 컨트롤러에서 반환되는 String에 해당하는 뷰 이름을 ViewResolver에 전달합니다.

자세한 동작 방식은 유저 페이지를 조회하는 것으로 예로 들겠습니다.

1️⃣ 클라이언트가 서버에 "/user" uri에 대한 요청을 합니다.
2️⃣ HandlerMapping에서 "/user"와 매칭되는 handler를 찾습니다.
3️⃣ 매칭되는 컨트롤러가 UserController라는 것을 알려줍니다.
4️⃣ HandlerAdapter에게 UserController의 처리를 요청합니다.
5️⃣ 어댑터는 UserController를 실행시킵니다.
6️⃣,7️⃣ 실행 결과를 반환합니다.
8️⃣ 실행 결과와 일치하는 뷰 검색을 ViewResolver에 요청합니다.
9️⃣,🔟 찾은 뷰를 반환한다.


@RestController

백엔드 어플리케이션에서 주로 json 형식으로 데이터를 응답합니다. json 형식의 데이터를 반환 받기 위해 스프링에서 @ResponseBody 어노테이션을 이용합니다.

다음은 view가 아닌 json을 반환할 때 실행되는 과정입니다.

1️⃣ 클라이언트가 서버에 "/user" uri에 대한 요청을 합니다.
2️⃣ HandlerMapping에서 "/user"와 매칭되는 handler를 찾습니다.
3️⃣ 매칭되는 컨트롤러가 UserRestController라는 것을 알려줍니다.
4️⃣ HandlerAdapter에게 UserRestController의 처리를 요청합니다.
5️⃣ 어댑터는 UserController를 실행시킵니다.
6️⃣ 실행 결과로 ResponseEntity를 반환합니다. 이 때 @ResponseBody 어노테이션을 사용하였기 때문에 응답 결과를 웹 응답의 body로 감쌉니다.
7️⃣,8️⃣ 반환 결과를 전달합니다.


마무리

스프링 프로젝트 자체에서 view를 반환하고 싶은 경우에는 @Controller를, json이나 xml 형식으로 클라이언트에 전달하고 싶은 경우에는 @RestController를 사용합시다.

profile
영차영차
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 4월 17일

우왕 두 차이가 완벽히 이해되었어요

답글 달기