스프링 프로젝트에서 컨트롤러를 지정할 때 사용되는 두 가지 어노테이션이 있습니다.
@Controller
와 @RestController
인데요, 이 두 어노테이션의 차이는 무엇인지 알아보고자 합니다.
결론부터 말하자면 @RestController
는 @Controller
와 @ResponseBody
를 합친 어노테이션입니다.
@Controller
@ResponseBody
public class Controller {}
@RestController
public class RestfulController {}
그렇다면 @RestController
는 컨트롤러에서 ResponseBody
로 반환을 해줄 때 사용하면 되는 것일까요?
@Controller
는 ResPonseBody
가 아닌 형식(json, xml...이 아닌 형식)을 반환할 때 쓰이는 것일까요?
공부해보니 두 어노테이션의 차이는 단순히 반환 값 차이뿐 아니라 철학적인 차이도 있다는 것을 알았습니다. 이번에는 그 철학적인 차이를 알아보기 위해 글을 작성하게 되었습니다.
스프링에서 @Controller
는 주로 뷰를 반환하기 위해 사용됩니다.
컨트롤러의 메소드를 호출하게 되면 컨트롤러에서 반환되는 String
에 해당하는 뷰 이름을 ViewResolver
에 전달합니다.
자세한 동작 방식은 유저 페이지를 조회하는 것으로 예로 들겠습니다.
1️⃣ 클라이언트가 서버에 "/user" uri에 대한 요청을 합니다.
2️⃣ HandlerMapping
에서 "/user"와 매칭되는 handler를 찾습니다.
3️⃣ 매칭되는 컨트롤러가 UserController
라는 것을 알려줍니다.
4️⃣ HandlerAdapter
에게 UserController
의 처리를 요청합니다.
5️⃣ 어댑터는 UserController
를 실행시킵니다.
6️⃣,7️⃣ 실행 결과를 반환합니다.
8️⃣ 실행 결과와 일치하는 뷰 검색을 ViewResolver
에 요청합니다.
9️⃣,🔟 찾은 뷰를 반환한다.
백엔드 어플리케이션에서 주로 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
를 사용합시다.
우왕 두 차이가 완벽히 이해되었어요