클라이언트로 부터 들어온 데이터를 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 불가 |
@NotNull | Null 불가 | |
@NotEmpty | Null 불가, "" 불가 | |
@NotBlank | Null 불가, "" 불가," " 불가 | |
@Past | 과거날짜만 | |
@PastOnPresent | 오늘이거나 과거 날짜 | |
@Future | 미래 날짜 | |
@FutureOnPresent | 오늘이거나 미래날짜 | |
@Pattern | 정규식 적용 | |
@Max | 최대값 | |
@Min | 최솟값 | |
이메일 형식으로 | ||
@AssertTrue/False | 별도 Logic 적용 | |
@Valid | 해당 Object Validation 실행 |
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody UserDto userDto) {
...
}
@Valid
를 선언해준다.@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;
// 회원가입
@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 객체 바로 뒤에 위치해야한다.
hasErrors() 메서드를 통해 Request 객체에 설정한 유효성 검사에 문제가 있는지 확인, 있다면 errors를 원하는 데이터 형식으로 가공해서 사용하면 된다.