흰 스타렉스에서 내가 내리지

검증 - @Validation 본문

Spring

검증 - @Validation

주씨. 2023. 11. 16. 19:52
728x90

어떤 변수가 1부터 99 까지 범위의 값만 가져야 한다면?

이메일을 외부 설정에 입력했는데, 이메일 형식에 맞지 않는다면?

 

Java에서는 java bean validation 이라는 표준 검증기가 제공된다. 

 

 

build.gradle 에 다음 의존성을 추가한다. 

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

 

 

@ConfigurationProperties 에 관한 내용은 이전 글에서.

@Getter
@ConfigurationProperties("my.datasource")
@Validated
public class MyDataSourcePropertiesV3 {
    
    @NotEmpty
    private String url;
    
    @NotEmpty
    private String username;

    @NotEmpty
    private String password;
    
    private Etc etc;

    public MyDataSourcePropertiesV3(String url, String username, String password, Etc etc) {
        this.url = url;
        this.username = username;
        this.password = password;
        this.etc = etc;
    }

    @Getter
    public static class Etc{
        @Min(1) @Max(999)
        private int maxConnection;
        
        @DurationMin(seconds = 1) @DurationMax(seconds = 60)
        private Duration timeout;
        private List<String> options;

        public Etc(int maxConnection, Duration timeout, List<String> options) {
            this.maxConnection = maxConnection;
            this.timeout = timeout;
            this.options = options;
        }
    }
}

 

@Validated :

       - @Valid 와 유사하지만, 일부 추가적인 기능을 제공한다. 

 

@NotEmpty : 항상 값이 있어야 한다. 필수 값이 된다. 

@Min(1) @Max(999) : 최소 1, 최대 999의 값을 허용한다. 

@DurationMin(seconds = 1) @DurationMax(seconds = 60) :  최소 1, 최대 60초를 허용한다.

 

 

값이 설정한 값을 벗어날 경우, 앱 로딩 시점에 오류가 발생한다. 

 

가장 좋은 예외는 컴파일 예외, 그리고 애플리케이션 로딩 시점에 발생하는 예외이다. 

 

 

 


# 예시

@ToString
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserDto {

    @NotNull
    private String name;
    
    @Email
    private String email;
}

 

@RestController
@Slf4j
public class TestController {

    @PostMapping("/user")
    public ResponseEntity<String> savePost(final @Valid @RequestBody UserDto userDto) {
        log.info(userDto.toString());
        return ResponseEntity.ok().body("postDto 객체 검증 성공");
    }
}