SPRING

14. @Valid를 사용해서 DTO 검증

ggomjiu 2025. 6. 6. 10:37

검증이 필요한 이유

- 컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것

- 클라이언트 검증은 조작할 수 있어 보안에 취약함

- So, 서버에서도 잘못된 요청을 검증하는 로직이 필요

 

Bean Validation

: 검증 에노테이션과 여러 인터페이스의 모음

- 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준임

- Bean Validation을 구현한 기술 중에 일반적으로 사용하는 구현체는 하이버네이트 Validator임

- Bean Validation을 잘 활용하면, 에노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있음

 

cf) DTO(Data Transfer Object)

: 데이터를 전달하기 위해서 사용하는 객체

 

DTO Validation

: DTO값이 원하는 형태로 들어왔는지 확인하는 것

 

1. 의존성 추가하기

implementation 'org.springframework.boot:spring-boot-starter-validation'

 

2. Annotation 종류

  • @AssertFalse : false 값 통과
  • @AssertTrue : true 값 통과
  • @DecimalMax(value= , inclusion= ) : 지정된 값 이하의 실수 통과
  • @DecimalMin(value= , inclusion= ) : 지정된 값 이상의 실수 통과
  • @Past : 대상 날짜가 현재보다 과거일 경우만 통과
  • @NotNull : null 값이 아닐 경우만 통과
  • @NotBlank : null, "", " " 이 아닌 경우 통과 -> 문자열의 공백까지 체크해주기 때문에 문자열은 이것을 사용

3. DTO에 적용

- DTO에 적용한 어노테이션이 동작하기 위해서는 컨트롤러 메서드 매개변수에 @Valid 어노테이션을 붙여야 함

- 스프링 부트는 이 어노테이션이 있으면 JSR 380 구현체인 Hibernate Validator를 자동으로 실행하고 Argument를 검증함

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class CreateRecordRequest {
 
    @NotNull(message = "지출 비용을 입력해주세요.")
    @Min(value = 0, message = "지출 비용 최소 값은 0입니다.")
    @Max(value = 999999, message = "지출 비용 최대 값은 999999입니다.")
    private Integer price;
 
    @NotBlank(message = "지출 명을 입력해주세요.")
    @Size(min = 1, max = 16, message = "지출 명은 16자 이하입니다.")
    private String title;
 
    @NotBlank(message = "내용을 입력해주세요.")
    @Size(min = 1, max = 80, message = "내용은 80자 이하입니다.")
    private String content;
 
    private String imgUrl;
 
    @NotNull(message = "지출 평가를 입력해주세요.")
    @Min(value = 1, message = "점수는 1부터 시작합니다.")
    @Max(value = 4, message = "점수는 4이하 입니다.")
    private Integer evaluation;
}

 

4. @Valid 동작 시점

- @Valid는 핸들러 어댑터가 핸들러를 호출하는 과정에서 동작

- 핸들러(컨트롤러)에서만 동작

- RequestMapping 핸들러 어댑터가 Argument Resolver를 통해 JSON 타입의 데이터를 객체로 변환하는 과정에서 동작

- 이 과정에서 예외가 발생하면 MethodArgumentNotValidException이 발생

'SPRING' 카테고리의 다른 글

15. SpringSecurity 개념, 인증 처리 과정, currentUser 정보  (0) 2025.06.06
13. ViewResolver  (0) 2025.06.06
12. @Controller vs @RestController  (0) 2025.05.26
11. Web MVC 요청 처리 과정  (0) 2025.05.26
10. Spring vs SpringBoot  (0) 2025.05.26