[Kotlin] Kotlin + Springboot 에서의 validation
반응형

gradle 설정

예전과 달리 Springboot 2.3 버전 부터는 spring-boot-starter-validation 의존성을 명시해야 Valid를 사용 가능하다.
build.gradle.kts 파일에 아래의 의존성 코드를 추가

implementation("org.springframework.boot:spring-boot-starter-validation")

 

관련 어노테이션 정리

어노테이션 예시 설명
 @DecimalMax @DecimalMax(value = "5.5") 소수 최댓값 지정
같은 값까지 허용(예시에선 5.5까지 허용)
null 허용
@DecimalMin @DecimalMin(value = "5.5") 소수 최솟값 지정
같은 값까지 허용(예시에선 5.5까지 허용)
null 허용
@Max @Max(value = 10) 정수 최댓값 지정
값은 값 허용
null 허용
@Min @Min(value = 1-) 정수 최솟값 지정
값은 값 허용
null 허용
@Digits @Digits(integer = 2, fraction = 2) interger : 정수 허용 자릿수(예제에서 10자리까지 허용
fraction : 소수점 허용 자릿수
null 허용
@Size @Size(min = 2, max = 4) 길이 검증
max 제외(길이 3까지 허용)
null 허용
@NotNull @NotNull  
@Pattern @Pattern(regexp= "") 정규식 표현 검증
@NotEmpty @NotEmpty  
@Positive @Positive 양수 허용
0 비허용
null 비허용
@PositiveOrZero @PositiveOrZero 양수 허용
0 허용
null 비허용
@Negative @Negative 음수 허용
0 비허용
null 비허용
@NegativeOrZero @NegativeOrZero 음수 허용
0 허용
null 비허용
@Email @Email(regexp="") 정규식 없이 사용 가능하지만
abc@def같은 케이스도 통과하기 때문에
정규식 사용 권장
@Future @Future 미래날짜만 허용
LocalDate
@FutureOrPresent @FutureOrPresent 미래, 현재 날짜 허용
@Past @Past 과거날짜만 허용
LocalDate
@PastOrPresent @PastOrPresent 과거, 현재 날짜 허용
LocalDate

 

Valid 사용 예시 - Dto & Controller

data class ValidExampleDto(
    @field:Positive()
    val num1: Int? = null,
    @field:Negative(message = "음수만 가능합니다.")
    val num2: Int? = null
)

Dto에 검사하고자 하는 어노테이션을 붙이면 된다. message를 지정하여 원하는 에러 메세지를 발생시킬 수도 있다.

 

Controller

@RestController
class TestController() {
    @GetMapping("")
    fun getEvents(@Valid valideTest: ValideExampleDto): String = "요청 성공"
}

컨트롤러에서 받을 때 인자를 검사하고 싶다면, @Valid 어노테이션을 붙이면 ValideExampleDto 클래스 안에 지정되어 있는 어노테이션을 검사해준다.

 

@field: 를 앞에 붙이는 이유

코틀린에서 자바 코드로 변환 시, 어노테이션이 생성자에 옮겨 붙기 때문에 코틀린에서는 어노테이션에 @field: 라는 prefix를 붙여야 제대로 동작한다. 그냥 어노테이션을 쓰게 되면 변환하는 과정에서 생성자에 Valid 어노테이션이 붙는 것을 볼 수 있다.

 

Valid 사용 예시 - PathValiable

@RestController
@Validate
class TestController() {
    @GetMapping("/{number}")
    fun getEvents(@Min(10) @PathVariable number: Int): String = "요청 성공"
}

클래스 위에 @Validate 어노테이션을 붙인 후, 검사하고자 하는 파라메터 앞에 조건에 해당하는 어노테이션을 붙이면 적용할 수 있다. RequestParam도 이 형식과 동일하게 처리 가능

 

@Valid, @Validate 어노테이션 차이

@Valid는 JSR-303 표준 스펙으로써 제약 조건이 부여된 객체에 대해 빈 검증기(Bean Validator)를 이용해서 검증하도록 지시하는 어노테이션이라고 한다. @Validated는 @Valid의 기능을 포함한다.@Validated 같은 경우는 JSR 표준 기술이 아닌 Spring 프레임워크에서 제공하는 어노테이션이다. 또한 검토할 옵션의 그룹을 지정할 수 있다.

 

ExeceptionHandler

@ResponseBody
@ExceptionHandler(ConstraintViolationException::class, org.springframework.validation.BindException::class)
fun controllerInValidExceptionHandler(req: HttpServletRequest?, e: Exception): ResponseEntity<ErrorDto> {
    val errorDto = ErrorDto()
    errorDto.code = 400
    errorDto.message = e.message ?: "Invalid Request"
    return ResponseEntity(errorDto, HttpStatus.BAD_REQUEST)
}

이런식으로 Valid로 인해 발생하는 익셉션에 대해 핸들러로 처리도 가능하다.

 

 

 

 

Reference : https://cchoimin.tistory.com/entry/Valid-%EC%84%B8%ED%8C%85-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95

반응형