[Spring] @Responsebody란?

artp·2025년 5월 21일

spring

목록 보기
8/11
post-thumbnail

@ResponseBody컨트롤러 메서드의 반환값을 HTTP 응답 본문(Body)에 그대로 출력하도록 만들어주는 Spring MVC 애노테이션입니다.

HTML 뷰가 아닌 JSON, 문자열, 객체 등을 직접 반환하고 싶을 때 사용합니다.
주로 REST API 응답 처리에 사용되며, @RestController에도 포함되어 있습니다.

사용 목적

  • 컨트롤러의 반환값을 뷰 이름이 아닌 데이터로 직접 반환하고 싶을 때
  • 주로 JSON, XML, String 등의 데이터를 응답 바디로 출력할 때 사용
  • REST API 응답을 만들 때 필수

예시

@GetMapping("/api/news")
@ResponseBody
public NewsDTO getNews() {
	return new NewsDTO("뉴스 제목", "뉴스 내용");
}
{
	"title": "뉴스 제목",
  	"content": "내용입니다"
}

흐름

1. 컨트롤러가 반환한 객체를 DispatcherServlet이 수신

  • 스프링 부트가 실행되고 HTTP 요청이 들어오면, 가장 먼저 DispatcherServlet이 요청을 가로챕니다.
  • @ResponseBody가 붙은 메서드의 반환값은 뷰 이름으로 처리하지 않고 그대로 반환됩니다.

2. RequestMappingHandlerAdapter가 실행 대상 메서드 호출

  • 내부적으로 메서드를 실행하고, 리턴 결과를 가공할 준비를 합니다.
  • 가공이란 단순한 Java 리턴값을 → HTTP 응답에 맞는 형태로 바꿔주는 일련의 과정을 의미합니다.

3. HttpMessageConverter가 동작

  • @ResponseBody가 선언되면, 스프링은 반환 객체를 JSON이나 텍스트 등으로 변환할 필요가 있음을 인지합니다.
  • 이 작업은 HttpMessageConverter라는 전략 객체가 처리합니다.
  • JSON 응답의 경우 MappingJackson2HttpMessageConverter가 사용됩니다.

4. Jackson(ObjectMapper)이 JSON으로 직렬화

  • Java 객체를 JSON 문자열로 변환
// 예시
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(newsDTO);

5. HTTP 응답 본문(Body)에 JSON 작성

  • 최종적으로 변환된 JSON 문자열이 HTTP 응답 바디에 작성됩니다.
  • 응답 헤더는 자동으로 Content-Type: application/json으로 설정됩니다.

@ResponseBody vs @RestController

항목@ResponseBody@RestController
위치메서드에 붙임클래스에 붙임
역할해당 메서드 반환값을 응답 본문으로 전송해당 클래스의 모든 메서드에 @ResponseBody가 자동 적용
주로 사용 위치개별 메서드전체 REST API 컨트롤러

@ResponseBody 예시

// 개별 메서드에 적용
@GetMapping("/hello")
@ResponseBody
public String hello() {
    return "Hello"; // 이 문자열이 뷰 이름이 아닌, 응답 본문으로 그대로 전송됨
}
  • @ResponseBody가 붙으면 Spring은 "Hello"를 뷰 이름으로 해석하지 않고, HTTP 응답 바디로 문자열 "Hello"를 그대로 전송합니다.

@RestController 예시

// 전체 컨트롤러에 적용
@RestController
@RequestMapping("/api")
public class NewsController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello"; // 클래스에 @RestController가 선언되어 있으므로 자동으로 @ResponseBody 적용됨
    }
}
  • @RestController는 클래스 전체에 @ResponseBody를 포함하는 역할을 합니다.
  • 즉, 이 컨트롤러에 있는 모든 메서드의 반환값은 JSON 또는 텍스트로 응답됩니다.

예제

1. 문자열 직접 반환

@GetMapping("/ping")
@ResponseBody
public String ping() {
    return "pong"; // "pong"이라는 텍스트가 그대로 HTTP 응답 바디에 작성됨
}
  • 클라이언트가 /ping 요청을 보내면, 응답은 텍스트 “pong” 한 줄로 구성됩니다.
  • 주로 서버 상태 확인(ping-pong) 같은 간단한 API에서 사용됩니다.

응답

pong

2. 객체(JSON) 반환

@GetMapping("/user")
@ResponseBody
public UserDTO getUser() {
    return new UserDTO("홍길동", 30); // 이 객체가 JSON으로 자동 직렬화되어 응답됨
}
  • 반환된 UserDTO 객체는 Jackson(ObjectMapper)에 의해 JSON 형식 문자열로 자동 변환됩니다.
  • 이때 클래스에는 getter, 기본 생성자가 있어야 합니다.

응답

{
  "name": "홍길동",
  "age": 30
}

3. @RestController로 전체 적용

@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/me")
    public UserDTO getMe() {
        return new UserDTO("이순신", 25); // JSON 자동 직렬화
    }
}
  • 이 클래스는 @RestController가 선언되어 있으므로 @ResponseBody를 생략해도 메서드 반환값이 JSON으로 응답됩니다.
  • Spring Boot는 JSON 직렬화를 위해 MappingJackson2HttpMessageConverter를 자동 등록합니다.

응답

{
  "name": "이순신",
  "age": 25
}

주의사항

1. View를 반환하는 방식(return "userForm";)과 함께 쓰면 안 됨

  • @ResponseBody가 붙으면 문자열은 그대로 바디로 출력
  • 뷰 이름이 아니라 텍스트로 인식됨

2. 객체를 리턴할 때는 jackson-databind가 자동으로 직렬화해줌

  • DTO 클래스는 반드시 기본 생성자 + getter가 있어야 함

3. Spring Boot에서는 별도 설정 없이도 사용 가능

  • spring-boot-starter-web만 있으면 Jackson과 메시지 컨버터가 자동 설정
profile
donggyun_ee

0개의 댓글