1. validation 의존성 추가
build.gradle의 dependencies에 아래 코드를 추가해주자.
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 유효성 검사 코드 예시
@Getter
@Setter
@AllArgsConstructor
public class Member {
@NotBlank(message = "아이디는 필수 입력 값입니다.")
private String userId;
@NotBlank(message = "비밀번호는 필수 입력 값입니다.")
private String pw;
@Pattern(regexp = "^[ㄱ-ㅎ가-힣a-z0-9-_]{2,10}$", message = "닉네임은 특수문자를 제외한 2~10자리여야 합니다.")
@NotBlank
private String name;
@Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "이메일 형식이 올바르지 않습니다.")
@NotBlank(message = "이메일은 필수 입력 값입니다.")
private String email;
@NotBlank(message = "연락처는 필수 입력 값입니다.")
private String contact;
public ApiResult<String> joinByApiResult(@Valid @RequestBody MemberDto memberDto) {
}
이런 식으로 Controller에서 유효성 검사가 필요한 Request 객체 앞에 @Valid 어노테이션을 추가하면 된다!
덧.
여기서 email 필드의 유효성 검사 어노테이션을 @Email이 아닌 정규표현식과 @NotBlank로 한 이유는,
@Email 어노테이션은 "" 빈 문자열을 허용하기 때문이다. 주로 이런 식으로 많이 쓰인다고 한다.
3. 유효성 검사 어노테이션 종류
Annotation | 설명 |
@Null | null만 허용 |
@NotNull | 빈 문자열("")과 공백(" ") 허용 / null 허용 X |
@NotEmpty | 공백(" ") 허용 / null과 빈 문자열("") 허용 X |
@NotBlank | null, 빈 문자열(""), 공백(" ") 모두 허용 X |
이메일 형식 검사. 단, 빈 문자열("") 통과시킴. (@Pattern을 통한 정규식 검사를 더 많이 사용함) |
|
@Pattern(regexp = ) | 정규식 검사 |
@Size(min = , max = ) | 길이 제한 |
@Max(value = ) | value 이하의 값만 허용 |
@Min(value = ) | value 이상의 값만 허용 |
이 외에도 더 존재한다.
4. Error 처리
유효성 검사를 실패하면 어떻게 대응해야 할까?
Errors를 통해 유효성 검사 적합 여부를 확인할 수 있다.
@PostMapping("/join/api/result")
public ResponseEntity joinByApiResult(@Valid @RequestBody MemberDTO memberDTO, Errors errors){
if(errors.hasErrors()){
Map<String, String> errorMap = new HashMap<>();
errors.getAllErrors().forEach(objectError -> {
FieldError fieldError = (FieldError) objectError;
String errorMessage = objectError.getDefaultMessage();
errorMap.put(fieldError.getField(), errorMessage);
});
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(ApiUtils.error(errorMap.toString(), HttpStatus.BAD_REQUEST));
}
}
hasErrors() 메서드로 Request 객체에 설정한 유효성 검사 문제가 있는지 확인하고,
문제가 있다면 원하는 데이터 형식으로 바꿔서 사용하면 된다.
1. validation 의존성 추가
build.gradle의 dependencies에 아래 코드를 추가해주자.
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 유효성 검사 코드 예시
@Getter
@Setter
@AllArgsConstructor
public class Member {
@NotBlank(message = "아이디는 필수 입력 값입니다.")
private String userId;
@NotBlank(message = "비밀번호는 필수 입력 값입니다.")
private String pw;
@Pattern(regexp = "^[ㄱ-ㅎ가-힣a-z0-9-_]{2,10}$", message = "닉네임은 특수문자를 제외한 2~10자리여야 합니다.")
@NotBlank
private String name;
@Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "이메일 형식이 올바르지 않습니다.")
@NotBlank(message = "이메일은 필수 입력 값입니다.")
private String email;
@NotBlank(message = "연락처는 필수 입력 값입니다.")
private String contact;
public ApiResult<String> joinByApiResult(@Valid @RequestBody MemberDto memberDto) {
}
이런 식으로 Controller에서 유효성 검사가 필요한 Request 객체 앞에 @Valid 어노테이션을 추가하면 된다!
덧.
여기서 email 필드의 유효성 검사 어노테이션을 @Email이 아닌 정규표현식과 @NotBlank로 한 이유는,
@Email 어노테이션은 "" 빈 문자열을 허용하기 때문이다. 주로 이런 식으로 많이 쓰인다고 한다.
3. 유효성 검사 어노테이션 종류
Annotation | 설명 |
@Null | null만 허용 |
@NotNull | 빈 문자열("")과 공백(" ") 허용 / null 허용 X |
@NotEmpty | 공백(" ") 허용 / null과 빈 문자열("") 허용 X |
@NotBlank | null, 빈 문자열(""), 공백(" ") 모두 허용 X |
이메일 형식 검사. 단, 빈 문자열("") 통과시킴. (@Pattern을 통한 정규식 검사를 더 많이 사용함) |
|
@Pattern(regexp = ) | 정규식 검사 |
@Size(min = , max = ) | 길이 제한 |
@Max(value = ) | value 이하의 값만 허용 |
@Min(value = ) | value 이상의 값만 허용 |
이 외에도 더 존재한다.
4. Error 처리
유효성 검사를 실패하면 어떻게 대응해야 할까?
Errors를 통해 유효성 검사 적합 여부를 확인할 수 있다.
@PostMapping("/join/api/result")
public ResponseEntity joinByApiResult(@Valid @RequestBody MemberDTO memberDTO, Errors errors){
if(errors.hasErrors()){
Map<String, String> errorMap = new HashMap<>();
errors.getAllErrors().forEach(objectError -> {
FieldError fieldError = (FieldError) objectError;
String errorMessage = objectError.getDefaultMessage();
errorMap.put(fieldError.getField(), errorMessage);
});
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(ApiUtils.error(errorMap.toString(), HttpStatus.BAD_REQUEST));
}
}
hasErrors() 메서드로 Request 객체에 설정한 유효성 검사 문제가 있는지 확인하고,
문제가 있다면 원하는 데이터 형식으로 바꿔서 사용하면 된다.