Bean Validation 4

사나이장대산·2024년 11월 14일

Spring

목록 보기
26/26

@ModelAttribute, @RequestBody

@Valid, @Validated는 @ModelAttribute뿐만 아니라 @RequestBody에도 적용할 수 있다. @ModelAttribute는 요청 파라미터 혹은 Form Data(x-www-urlencoded)를 다룰 때 사용하고 @RequestBody 는 HTTP Body Data를 Object로 변환할 때 사용한다.

  • @RequestBody 적용
@Data
public class ExampleRequestDto {

	@NotBlank
	private String field1;

	@NotNull
	@Range(min = 1, max = 150)
	private Integer field2;

}

@Slf4j
@RestController
public class RequestBodyController {
	
    @PostMapping("/example")
    public Object save(
            @Validated @RequestBody ExampleRequestDto dto,
            BindingResult bindingResult
    ) {
        log.info("RequestBody Controller 호출");

        if(bindingResult.hasErrors()) {
            log.info("validation errors={}", bindingResult);
            // Field, Object Error 모두 JSON으로 반환
            return bindingResult.getAllErrors();
        }

        // 성공 시 RequestDto 반환(의미 없음)
        return dto;
    }

}
  • Rest API 요청의 세가지 경우의 수
    1. 성공 요청: 성공

  • Controller 정상 호출

  • 응답 반환

  1. 실패 요청: JSON을 객체로 변환하는 것 자체가 실패
  • field2에 String 입력
    • JSON → Object 변환 실패
  • 중요! Controller가 호출되지 않는다.
  • 반드시 JSON → Object로 변환이 되어야 Validation이 진행된다.
  1. 검증 오류 요청: JSON을 객체로 변환하는 것은 성공, 검증에서 실패
  • field2의 값에 범위를 넘어서는 값 입력 @Range(max = 150)
    • bindingResult.getAllErrors() 가 MessageConverter에 의해 JSON으로 변환되어 반환된다.
    • Controller를 실제로 호출한다.
    • log로 작성한 bindingResult error들이 콘솔에 출력된다.

정리

  • @ModelAttribute와 @RequestBody 차이점

    1. @ModelAttribute
      • 각각의 필드 단위로 바인딩한다.
      • 특정 필드 바인딩이 실패하여도 나머지 필드는 정상적으로 검증 처리할 수 있다.
      • 특정필드 변환 실패
        • 컨트롤러 호출, 나머지 필드 Validation 적용
    2. @RequestBody
      • 필드별로 적용되는것이 아니라 객체 단위로 적용된다.
      • MessageConverter가 정상적으로 동작하여 Object로 변환하여야 Validation이 동작한다.
      • 특정필드 변환 실패
        • 컨트롤러 미호출, Validation 미적용
  • 추가내용

    • bindingResult.getAllErrors()FieldErrorObjectError 모두 반환한다.
    • Spring은 MessageConverter를 이용해 Error 객체들을 변환하여 응답한다.
    • RequestDTO 의 경우, 생성, 수정, 삭제, 모두 비슷하게 생겼어도 따로 분리해서 사용하자.
    • 작성한 코드는 예시일 뿐 실제로는 API Spec에 맞는 응답을 만들어 클라이언트에 전달 해야한다.
      • @ControllerAdvice

  1. Spring Container
    • Bean 관리, 의존성 주입
  2. Spring Bean
    • Spring Container가 관리하는 Java 객체
  3. IOC/DI
    • 제어의 역전(IOC)
      • 객체 생성과 의존성 관리를 개발자가 아닌 Spring이 담당
    • 의존성 주입(DI)
      • 객체 간의 의존성을 Spring Container가 주입
  4. 싱글톤 패턴
    • Spring Bean은 기본적으로 싱글톤 패턴으로 관리되어 하나의 인스턴스만 생성
      • 상태를 가져서는 안된다.
  5. Spring Bean 등록
    • 자동 등록(권장)
      • @ComponentScan(Spring Boot) + @Component(@Controller, @Service, @Repository)
    • 수동 등록
      • @Configuration + @Bean
  6. 의존관계 주입
    • 생성자 주입
      • 생성자 + @Autowired를 통해 의존성을 주입받는다. 불변, 실수 방지
    • @RequiredArgsConstructor
      • final 필드에 자동으로 생성자를 생성해 주입한다.
  7. Validation
    • BindingResult
      • Validation 오류 정보를 담는 객체
    • Bean Validation
      • Annotation 기반으로 Validation이 가능하도록 만들어진 표준 기술
profile
사나이 張大山 포기란 없다.

0개의 댓글