컨트롤러를 지정해주기 위한 어노테이션은 두가지가 있다.
두 컨트롤러의 차이점은 Http Response Body가 생성되는 방식에 있다.
Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다.

1. 클라이언트는 URI 형식으로 웹 서비스에 요청을 보낸다
2. DispatchServlet이 요청을 처리할 대상을 찾는다
3. HandlerAdpater을 통해 요청을 Controller로 위임
4. Controller는 요청을 처리한 후에 ViewName 반환
5. DispatchServlet은 ViewResolver를 통해 ViewName에 해당하는 뷰를 찾아 사용자에게 반환

Controller로 Data를 반환해야 하는 경우도 있다. 데이터를 반환하기 위해선 @ResponseBody 어노테이션을 활용한다. 이를 통해 Controller도 JSON 형태로 데이터 반환이 가능하다.

1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 객체를 반환한다.
5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.
객체를 반환하기 위해서 viewResolver 대신에 HttpMessageConverter가 동작한다. HttpMessageConverter에는 여러 Converter가 등록돼있는데, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라진다.
ex) 단순 문자열이면 StringHttpMessageConverter, 객체면 MappingJackson2HttpMessageConverter
스프링은 클라이너트 Http accept 헤더와 서버의 컨트롤러 반환 타입 정보들을 조합해 적합한 converter를 선택한다.
RestController는 @Controller + @ResponseBody와 똑같은 기능을 수행한다. Json 형태로 객체 데이터를 반환하는것이 주용도다. REST API를 개발할때 주로 사용한다.

참고
https://mangkyu.tistory.com/49
https://velog.io/@baekgom/Controller-RestController