스프링부트 Validation

dragonappear·2022년 1월 31일
0

Spring & SpringBoot

목록 보기
6/11


Validation을 사용해야 하는 이유

클라이언트로 부터 들어온 데이터를 DB에 저장해야 할 때, 개인정보나 중요한 정보들은 항상 DB에 넣기 전에 올바른 포맷으로 들어왔는지 검증을 해야한다.

이메일 데이터에서 @가 없으면 그 데이터는 더미 데이터나 마찬가지이기 때문에 올바른 데이터를 검증하기 위해 각종 데이터마다 정규식을 작성해서 검증을 해야한다.

근데 정규식을 작성해서 검증하는 것은 누가해야할까? 그건 바로 나

일일이 검증을 해야하는 귀찮음을 덜어주는 validation을 사용하지 않을 이유가 없다.

의존성 추가

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation
implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.3'

관련 어노테이션

어노테이션특징특이사항
@Size문자 길이 측정Int Type 불가
@NotNullNull 불가
@NotEmptyNull 불가, "" 불가
@NotBlankNull 불가, "" 불가," " 불가
@Past과거날짜만
@PastOnPresent오늘이거나 과거 날짜
@Future미래 날짜
@FutureOnPresent오늘이거나 미래날짜
@Pattern정규식 적용
@Max최대값
@Min최솟값
@Email이메일 형식으로
@AssertTrue/False별도 Logic 적용
@Valid해당 Object Validation 실행


적용

    @PostMapping("/users")
    public ResponseEntity<User> createUser(@Valid @RequestBody UserDto userDto) {
    ...
    }
  • JSON 형식으로 들어온 값이 UserDto에 값이 매핑될때 validation을 적용하기위해 @Valid를 선언해준다.
  • UserDto에 있는 필드마다 조건은 위에 있는 어노테이션을 사용하면 된다.
@Size(min=2, message = "Name은 2글자 이상 입력해 주세요.")
private String name;

@Email //or
@NotEmpty(message = "이메일은 필수 입력값입니다.")
        @Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "이메일 형식에 맞지 않습니다.")
        private String email;

@Pattern(regexp = "^\d{2,3}-\d{3,4}-\d{4}$")
private String phone;

@NotEmpty(message = "비밀번호는 필수 입력값입니다.")
        @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[~!@#$%^&*()+|=])[A-Za-z\\d~!@#$%^&*()+|=]{8,16}$", message = "비밀번호는 8~16자 영문 대 소문자, 숫자, 특수문자를 사용하세요.")
        private String password;

@Valid, @Validated 차이

  • @Valid는 Java에서 지원해주는 어노테이션이고, @Validated는 스프링에서 지원해준는 어노테이션이다.
  • @Validated는 @Valid의 기능을 포함하기 때문에 @Valid를 적용한 곳이면 @Validated로 변경할 수 있다.
  • @Validated는 유효성을 검토할 그룹을 지정할 수 있는 기능을 추가로 가지고 있다.
// 회원가입
    @PostMapping("/signup")
    public ResponseEntity<?> signUp(@Validated UserRequestDto.Signup userSignup, Errors errors) {
        // validation check
        if(errors.hasErrors()) {
            return response.invalidFields(common.refineErrors(errors));
        }
        return userService.signUp(userSignup);
    }
  • 컨트롤러에서는 Request 객체 앞에 @Validated 어노테이션을 사용하고, Errors를 통해 유효성 검사 적합 여부를 확인한다.

  • 이 때, Errors는 반드시 Request 객체 바로 뒤에 위치해야한다.

    • 두 개의 객체에 validation 검사를 한다면, 각각의 객체 뒤에 errors를 받는다.
  • hasErrors() 메서드를 통해 Request 객체에 설정한 유효성 검사에 문제가 있는지 확인, 있다면 errors를 원하는 데이터 형식으로 가공해서 사용하면 된다.


참고:

0개의 댓글