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(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
'Back-end' 카테고리의 다른 글
자바 직렬화(Serializable) (0) | 2022.10.04 |
---|---|
HTTP Method & Patch 등장에 따른 Dispatcher Servlet의 변화 (0) | 2022.08.02 |
[Kotlin] 코틀린 타입 시스템(Type System) - ( ?/!!/.?/as?/let함수/lateinit) (0) | 2022.03.24 |
카카오 소셜 로그인 With Front (React) (2) | 2022.01.26 |
[Spring boot] multipart, form-data, requestPart 테스트 코드 작성하기 (0) | 2022.01.01 |