@RequestBody와 @ResponseBody 이해하기: Spring MVC에서의 JSON 처리 핵심

Spring Boot 기반의 REST API 개발에서 가장 자주 마주치는 어노테이션 중 하나가 @RequestBody@ResponseBody입니다. 이 두 어노테이션은 클라이언트와 서버 간의 JSON 기반 데이터 통신을 단순하고 직관적으로 처리할 수 있게 해주며, Spring의 HttpMessageConverter와 밀접한 연관이 있습니다.

 

1. @RequestBody: 요청 본문(Body)을 객체로 변환

@RequestBody는 HTTP 요청의 본문(body)에 담긴 JSON 데이터를 자바 객체로 매핑할 때 사용합니다. 일반적으로 POST, PUT, PATCH 요청에서 사용되며, JSON -> 객체 변환은 내부적으로 Jackson 라이브러리를 통해 수행됩니다.

예시

@PostMapping("/users")
public String createUser(@RequestBody UserDto userDto) {
    System.out.println("이름: " + userDto.getName());
    System.out.println("이메일: " + userDto.getEmail());
    return "ok";
}

요청 예시:

POST /users
Content-Type: application/json

{
  "name": "홍길동",
  "email": "hong@example.com"
}

주의사항:

  • Content-Type이 application/json이 아니면 매핑 실패
  • 기본 생성자와 getter/setter가 필요
  • 입력값 검증 시 @Valid 또는 @Validated와 함께 사용

 

2. @ResponseBody: 객체를 응답 본문으로 직렬화

@ResponseBody는 컨트롤러 메서드에서 리턴한 자바 객체를 JSON 형식의 응답 본문으로 변환해 클라이언트에 전달할 때 사용됩니다. 뷰를 렌더링하지 않고 데이터를 직접 응답할 때 활용되며, REST API의 핵심 구성요소입니다.

예시

@GetMapping("/users/{id}")
@ResponseBody
public UserDto getUser(@PathVariable Long id) {
    return new UserDto(id, "홍길동", "hong@example.com");
}

응답 결과:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 1,
  "name": "홍길동",
  "email": "hong@example.com"
}

주의사항:

  • Spring Boot에서는 @RestController 사용 시 @ResponseBody 생략 가능
  • Jackson 라이브러리를 통해 객체 → JSON으로 직렬화됨

 

3. @RestController = @Controller + @ResponseBody

Spring Boot에서는 REST API 컨트롤러를 만들 때 @RestController를 사용하는 것이 일반적입니다. 이는 @Controller@ResponseBody가 자동으로 포함된 축약형입니다.

@RestController
public class UserController {

    @PostMapping("/users")
    public UserDto createUser(@RequestBody UserDto userDto) {
        // 처리 로직...
        return userDto;
    }
}

4. 실무 팁

  • 프론트엔드와 JSON 통신 시에는 거의 항상 @RequestBody, @ResponseBody 조합을 사용합니다.
  • application/x-www-form-urlencoded 전송 시엔 @ModelAttribute가 자동 사용됨
  • JSON 매핑 실패 시에는 400 Bad Request 발생 → 예외 처리 필요

 

5. 결론

@RequestBody@ResponseBody는 Spring Boot 기반 REST API 개발의 핵심입니다. 이 두 어노테이션의 역할과 차이를 정확히 이해하고 활용하면, 클라이언트와 서버 간의 JSON 기반 데이터 통신을 훨씬 간결하게 처리할 수 있습니다. 실무에서는 @RestController로 구성해 생산성과 가독성을 함께 확보하는 것이 일반적인 패턴입니다.