입력 객체의 유효성 검사하는 방법을 알아보겠습니다.
예를 들어 회원가입 시 여러가지 조건들이 존재합니다.
1. 이메일: 이메일 양식에 맞게(example@example.com)
2. 비밀번호: 비밀번호는 최소 8자 이상이며, 대문자, 소문자, 숫자, 특수문자를 포함 등
클라이언트 측에서 직접 입력값을 검증할 경우 쉽게 조작이 가능하기 때문에 서버에서 필수적으로 검증을 해야합니다.
if (request.getEmail() == null) { return ResponseEntity.badRequest().body("이메일을 입력해주세요"); } else if (!Pattern.matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$", request.getEmail())) { return ResponseEntity.badRequest().body("이메일 형식에 맞게 입력해주세요"); }
조건문으로만 입력값을 검증하는 방법
조건이 많아질 수록 복잡해집니다.
자바 표준 스펙으로 컨트롤러에서만 동작하며
객체의 필드에 설정된 검증 어노테이션에 맞게 검증(@Email, @NotBlank, @NotNull 등등..)
다른 계층에서 사용하려면 @Validated와 같이 사용해야 합니다.
스프링 어노테이션으로 컨트롤러가 아닌 다른 계층에서 동작 가능하며
빈으로 등록된 클래스에 @Validated를 붙여 사용합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
@PostMapping("/signup")
public ResponseEntity<Void> signup(@RequestBody @Valid SignupRequest Request){
...
}
public class signupRequest{
@Email(message = "이메일 형식에 맞게 입력해주세요")
@NotNull(message = "이메일을 입력해주세요")
private String email;
@Pattern(regexp = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$",
message = "비밀번호는 최소 8자 이상이며, 대문자, 소문자, 숫자, 특수문자를 포함해야 합니다.")
private String password;
@NotBlank
private String name;
}
@Service
@Validated
public class UserService {
public void signup(@Valid SignupRequest request){
}
}
서비스 계층에서 입력 파라미터 검증 가능합니다.