@RequestBody

코딩냥이·2024년 9월 10일

Annotation

목록 보기
23/34

@RequestBody

@RequestBody 어노테이션은 스프링 MVC에서 HTTP 요청 본문을 자바 객체로 변환할 때 사용하는 어노테이션입니다.

기능

  • HTTP 요청 본문을 자바 객체로 자동 변환합니다.
  • 주로 JSON이나 XML 형식의 데이터를 객체로 매핑할 때 사용됩니다.
  • RESTful API에서 데이터를 주고받을 때 매우 유용합니다.

사용 방법

기본적인 사용 방법은 다음과 같습니다:

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // user 객체를 이용한 사용자 생성 로직
        return userService.createUser(user);
    }
}

주요 특징

  1. 자동 변환: HTTP 요청 본문을 자바 객체로 자동 변환합니다.
  2. 미디어 타입: 주로 application/json 미디어 타입과 함께 사용됩니다.
  3. 유연성: 복잡한 객체 구조도 쉽게 매핑할 수 있습니다.
  4. 검증: @Valid 어노테이션과 함께 사용하여 입력 데이터를 검증할 수 있습니다.

고급 사용법

1. 중첩된 객체 구조 처리

복잡한 객체 구조도 처리할 수 있습니다:

public class Order {
    private List<OrderItem> items;
    private Address shippingAddress;
    // getters and setters
}

@PostMapping("/orders")
public Order createOrder(@RequestBody Order order) {
    return orderService.createOrder(order);
}

2. 유효성 검증

@Valid 어노테이션과 함께 사용하여 입력 데이터를 검증할 수 있습니다:

@PostMapping("/users")
public User createUser(@Valid @RequestBody User user) {
    return userService.createUser(user);
}

3. 커스텀 HttpMessageConverter 사용

특별한 형식의 데이터를 처리해야 할 경우, 커스텀 HttpMessageConverter를 구현하고 등록할 수 있습니다:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MyCustomMessageConverter());
    }
}

예외 처리

요청 본문을 객체로 변환하는 과정에서 문제가 발생하면 HttpMessageNotReadableException이 발생할 수 있습니다. 이를 전역적으로 처리하려면:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<String> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {
        return new ResponseEntity<>("Malformed JSON request", HttpStatus.BAD_REQUEST);
    }
}

테스트

@RequestBody가 적용된 컨트롤러 메서드를 테스트할 때:

@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    void testCreateUser() throws Exception {
        User user = new User("John", "john@example.com");
        mockMvc.perform(post("/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(user)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name").value("John"));
    }
}

주의사항

  1. 미디어 타입: 요청의 Content-Type 헤더가 올바르게 설정되어 있어야 합니다.
  2. 대용량 데이터: 매우 큰 요청 본문을 처리할 때는 메모리 사용에 주의해야 합니다.
  3. 보안: 사용자 입력을 직접 객체로 매핑할 때는 보안 취약점에 주의해야 합니다.

베스트 프랙티스

  1. DTO 사용: API 계층과 도메인 모델을 분리하기 위해 DTO(Data Transfer Object)를 사용하세요.
  2. 유효성 검증: @Valid를 사용하여 입력 데이터를 검증하세요.
  3. 명확한 API 문서화: 요청 본문의 구조와 각 필드의 의미를 명확히 문서화하세요.
  4. 적절한 예외 처리: 잘못된 입력에 대해 명확한 에러 메시지를 제공하세요.

결론

@RequestBody는 RESTful API 개발에서 매우 유용한 어노테이션입니다. HTTP 요청 본문을 자바 객체로 쉽게 변환할 수 있게 해주며, 이를 통해 클라이언트와 서버 간의 복잡한 데이터 교환을 간단하게 처리할 수 있습니다. 올바르게 사용하면 코드의 가독성을 높이고 개발 생산성을 향상시킬 수 있습니다. 다만, 데이터 검증과 보안 측면에서 주의가 필요하며, 적절한 예외 처리와 문서화가 동반되어야 합니다.

연관 포스팅

@RestController
@PostMapping
@Valid
@ControllerAdvice
@RequestParam

profile
HelloMeow~!

0개의 댓글