프로그래밍공부(Programming Study)/스프링(Spring Framework)

@Valid Annotation을 이용해 입력값 검증

Chann._.y 2022. 7. 30.
728x90

특정 컬럼 값에 대해서 Null 또는 특정 패턴을 검증해야할 경우가 있다.

@Null Annotation은 Null이어야 하고, @NonNull 또는 @NotNull은 Null 값이 아니어야 한다는 뜻이다. 

!? 그렇다면 Null 또는 특정 패턴일 경우에는????

 

정답은 정규식 패턴에서 or 연산을 뜻하는 |를 활용하는 것이었다.

 

Build.gradle 파일에 validation 의존성을 추가하여 사용해야 한다.(버전은 본인 버전에 맞게! 본인은 springboot 2.4.5 version 사용중)

<build.gradle>


dependencies {
    **	
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation
    implementation('org.springframework.boot:spring-boot-starter-validation:2.4.5')
    
    // https://mvnrepository.com/artifact/javax.validation/validation-api
    implementation("javax.validation:validation-api:2.0.1.Final")
    **
}

 

@Pattern 만 잘 활용한다면 Custom으로 값 검증을 원활하게 할 수 있는 것으로 보인다.

<~Dto.class>

import javax.validation.constraints.Pattern;

**

@Getter
@Setter
public static class RegisterRequest {

    **

    @Pattern(regexp = "^((19[0-9][0-9]|20\\d{2})-(0[0-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])|)$")
    @ApiModelProperty(name="유저 생일", example="1995-11-15")
    private String userBirthday;

    **
}

 

해당 어노테이션이 바로 생년월일(YYYY-MM-DD 또는 빈 값)을 검증하는 패턴이다. 마지막에 |를 붙여서 빈 값을 허용했다.

@Pattern(regexp = "^((19[0-9][0-9]|20\\d{2})-(0[0-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])|)$")

 

Dto에서 @Patten 적용 후 Controller에서 해당하는 메소드의 파라미터 앞에 @Valid 또는 @Validated를 적용하면 작동한다.

두 어노테이션의 차이는 https://stackoverflow.com/questions/36173332/difference-between-valid-and-validated-in-spring

 

Difference between @Valid and @Validated in Spring

Spring supports two different validation methods: Spring validation and JSR-303 bean validation. Both can be used by defining a Spring validator that delegates to other delegators including the bean

stackoverflow.com

참고!

 

<~Controller.class>

import javax.validation.Valid;

**

public ResponseEntity<UserDto.Info> register(
      @RequestBody @ApiParam(value="회원가입 정보", required = true) @Valid UserDto.RegisterRequest registerInfo) {
   
   //임의로 리턴된 User 인스턴스. 현재 코드는 회원 가입 성공 여부만 판단하기 때문에 굳이 Insert 된 유저 정보를 응답하지 않음.
   return new ResponseEntity<UserDto.Info>(new UserDto.Info(userService.createUser(registerInfo)), HttpStatus.OK);
}

**
728x90

댓글