인텔리제이 커뮤니티에디션에서 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만 넣어봐도 잘 뜸.
그래서 이 기회(?)에 두 어노테이션의 차이를 알아보기로 했다.
출처: 망나니개발자
전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다.

Controller가 반환한 뷰의 이름으로부터 View를 렌더링하기 위해 ViewResolver가 사용되며 이 설정에 맞게 View를 찾아 렌더링하게 된다.
컨트롤러를 통해 객체 DATA를 반환해야 한다면 일반적으로 ResponseEntity로 감싸 반환을 하고, 이때 ViewResolver대신 HttpMessageConverter가 동작한다.
ResponseEntity로 감싸인 객체를 Json으로 반환하기 위해서 @ResponseBody 어노테이션을 사용한다.
상기에 적은 @ResponseBody와 @Controller를 합친 것이 @RestController이다. 따라서 이것의 주요 용도는 Json형태로 객체 데이터를 반환하는 것. 그러니 내가 viewName을 넘겼을 때 @RestController가 이걸 제대로 반환하지 못한 건 이상한 일이 아닌 것이다.
더 자세히 보려면 꼭 여기 참고
에러로그들을 확인하다보니 bean이라는 글자를 많이 봐서 익숙해지긴 했는데 bean이 정확히 뭔지 궁금해졌다.
spring에서는 사용자의 제어권을 다른 주체에게 넘기는 IOC(제어의 역전)이 일어나는데 Bean생성도 그러하다. Spring에 의해서 생성되고 관리되는 자바 객체를 Bean이라고 함.
참고
IoC에 대해서
@Controller라든지 이런 것들도 Bean을 등록하는 방법인 것이다.
저 참고url에는 왜인지 xml로 Bean등록하는 방법은 없는데, xml로도 등록가능.