Controller와 RestController는 @ResponseBody 어노테이션의 유무로 구분됩니다.
@ResponseBody 어노테이션은 스프링에서 HTTP 요청에 대한 응답 결과를 HTTP 응답 본문에 직접 쓰는 것을 가능하게 합니다. 즉, 컨트롤러 메소드가 반환하는 객체를 HTTP 응답 본문으로 변환해주는 역할을 합니다.
@Controller 어노테이션은 스프링에서 컨트롤러 역할을 하는 클래스를 정의할 때 사용됩니다. @Controller 어노테이션이 붙은 클래스는 HTTP 요청에 대한 처리를 담당하는 메소드들을 포함하고 있습니다. @Controller 어노테이션을 사용할 때는, 컨트롤러 메소드들이 View 렌더링을 위한 모델을 반환하기 위해 @ResponseBody 어노테이션을 사용할 수 있습니다.
반면에 @RestController 어노테이션은 스프링 4.0부터 추가된 어노테이션으로, @Controller 어노테이션과 @ResponseBody 어노테이션을 함께 사용하는 것과 동일한 역할을 합니다. 즉, @RestController 어노테이션을 사용하면 컨트롤러 메소드의 반환값이 HTTP 응답 본문에 직접 쓰이게 됩니다. 따라서, @RestController 어노테이션을 사용하는 경우 별도의 @ResponseBody 어노테이션을 사용할 필요가 없습니다.
따라서, @Controller와 @RestController의 가장 큰 차이점은 반환값에 대한 처리 방식입니다. @Controller는 View 렌더링을 위해 모델 객체를 반환하고, @RestController는 HTTP 응답 본문에 직접 쓰이는 데이터 객체를 반환합니다. 또한, @RestController는 기본적으로 모든 메소드에 @ResponseBody 어노테이션을 적용한 것과 같은 효과를 가지고 있습니다.