@Controller vs @RestController, @RequestMapping vs @GetMapping

Jay·2023년 8월 30일

work

목록 보기
11/16
post-thumbnail

인텔리제이 커뮤니티에디션에서 thymeleaf를 쓰는 강의를 듣고 있었는데, Spring initializr를 사용해서 프로젝트 만들 때 dependency에 thymeleaf를 넣었는데도 controller단에서 viewname을 return했음에도 제대로 읽지 못하는 문제가 있었다.

물론 html파일은 resources/templates파일 안에 잘 들어있었고, html파일 내용을 전부 주석처리할 경우 templates파일 내부에 적절한 view파일이 없다는 에러가 뜨는 걸로 봐서 thymeleaf자체를 인식은 하는 것 같았는데..

커뮤니티에디션에서도 다들 thymeleaf 잘 쓰던데 나만 왜 이러나.. 왜 검색하는 포스팅마다 maven대신 gradle쓰고 있나.. 고민하다가 황당하게도 알아낸 요인은 내가 annotation을 @RestController로 써서였다.
gradle쓰는 포스팅1 포스팅2
제대로 뷰를 만들어주지 않았을 경우 whitelabel 뭐시기 오류가 뜨는데 이때 강의에서 @RestController@GetMapping쓰던 것을 안 바꿔서 그런 거였음..
@Controller로 바꿔주면 제대로 동작한다. 궁금해서 html파일 내부에 plain html만 넣어봐도 잘 뜸.

그래서 이 기회(?)에 두 어노테이션의 차이를 알아보기로 했다.

@Controller vs @RestController

출처: 망나니개발자

@Controller 이해하기

보통 많이 사용하는 방식

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다.

  1. Client가 URL형식으로 웹서비스에 요청을 보내면
  2. DispatcherServlet이 요청 처리 대상을 찾고
  3. HandlerAdapter를 통해 요청을 Controller로 위임
    (HandlerAdapter이전에 HandlerMapping을 통해 핸들러를 찾는 과정이 있다. 내 생각에 URL형식으로 요청이 보내지면, 이 URL에 맞는 Controller/method를 찾는 과정인 것 같다)
  4. 요청을 처리한 Controller는 ViewName을 반환
  5. DispatcherServlet이 ViewResolver를 통해서 4번의 ViewName에 해당하는 View를 찾아서 사용자에게 반환

Controller가 반환한 뷰의 이름으로부터 View를 렌더링하기 위해 ViewResolver가 사용되며 이 설정에 맞게 View를 찾아 렌더링하게 된다.

Controller에서 DATA를 반환해야 한다면?

컨트롤러를 통해 객체 DATA를 반환해야 한다면 일반적으로 ResponseEntity로 감싸 반환을 하고, 이때 ViewResolver대신 HttpMessageConverter가 동작한다.
ResponseEntity로 감싸인 객체를 Json으로 반환하기 위해서 @ResponseBody 어노테이션을 사용한다.

@RestController 이해하기

상기에 적은 @ResponseBody@Controller를 합친 것이 @RestController이다. 따라서 이것의 주요 용도는 Json형태로 객체 데이터를 반환하는 것. 그러니 내가 viewName을 넘겼을 때 @RestController가 이걸 제대로 반환하지 못한 건 이상한 일이 아닌 것이다.

더 자세히 보려면 꼭 여기 참고

spring Bean

에러로그들을 확인하다보니 bean이라는 글자를 많이 봐서 익숙해지긴 했는데 bean이 정확히 뭔지 궁금해졌다.

spring에서는 사용자의 제어권을 다른 주체에게 넘기는 IOC(제어의 역전)이 일어나는데 Bean생성도 그러하다. Spring에 의해서 생성되고 관리되는 자바 객체를 Bean이라고 함.
참고
IoC에 대해서
@Controller라든지 이런 것들도 Bean을 등록하는 방법인 것이다.
저 참고url에는 왜인지 xml로 Bean등록하는 방법은 없는데, xml로도 등록가능.

profile
ㄱ이 아닌 개발자가 되고 싶은 사람

0개의 댓글