스프링에서 api 통신 구현을 위해 @ResponseBody이라는 Annotation을 사용하는데, 정확하게 어떤 역할을 하는 것일까?
Annotation의 정의
해석하면 '주석'이지만, spring에서의 annotation은 우리가 아는 '주석'에 더해 더 많은걸 지원해준다.
'@'가 prefix로 붙어서 정의되어 있으며, 객체나 메소드에 더 많은 의미와 기능을 추가해주는 기술이다.
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공
참고: [Spring] 어노테이션(Annotation)
@ResponseBody
@ResponseBody를 명시하면 api 통신을 위해 MessageConverter에 데이터가 전송된다. 정확하게 알아보기 위해 명시하지 않았을 때와 비교해보자.
viewResolver
명시하지 않았을 때는 아래처럼 Controller가 리턴 값을 반환했을 때 viewResolver가 받아 처리한다.

viewResolver는 클라이언트에게 반환해줄 View를 결정하는 역할을 한다.
- Controller가 뷰 이름(예: "home")을 반환
- ViewResolver는 설정에 따라 해당 뷰 이름을 물리적 뷰 경로(예: /WEB-INF/views/home.jsp)로 매핑
- 매핑된 물리적 경로를 기반으로 View 객체를 생성
- 생성된 View 객체는 클라이언트에게 적절한 HTML이나 템플릿을 렌더링
viewResolver는 View를 반환하기 때문에 MVC를 사용하는 템플릿 기반 웹 어플리케이션을 구현할 때 사용된다.
HttpMessageConverter
명시할 때는 아래처럼 HttpMessageConverter가 리턴 값을 받는다.

HttpMessageConverter는 이름에서 알 수 있듯이 Http 통신 간의 메시지를 변환해주는 역할을 한다.
- 컨트롤러가 반환하는 객체(예: List)를 HTTP 응답 메시지(예: JSON, String)로 변환
- 클라이언트로부터 들어온 HTTP 요청 데이터를 Java 객체로 변환
- 변환 작업은 Content-Type과 Accept 헤더를 기반으로 수행
역할에서 알 수 있듯이 데이터 교환이 주 목적으로, api 기반 서비스 구현에 사용된다.
Reference
스프링 입문 - 김영한