Validation 적용
코틀린에서 적용했을때랑 코드가 좀 달라서 기록,,,
#비밀번호 유효성검사
1. ValidPassword
@ReportAsSingleViolation
@Constraint(validatedBy = ValidPasswordValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
public @interface ValidPassword {
String message() default "password는 최소 8자 이상, 16자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자로 구성되어야 합니다.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
message, groups, payload 는 반드시 들어가야한다고 해서 일단 넣음,,
@ReportAsSingleViolation : 제약이 여러개일때 위반 메세지 여러개 안나오게.. 단일 위반(하나의 위반)으로 처리
@Constraint () : 사용자 정의 유효성 검사다
@Retention(RetentionPolicy.RUNTIME) : runtime 동안 어노테이션 유지
@Target : Field, method, parameter 에 적용
2. ValidPasswordValidator
public class ValidPasswordValidator implements ConstraintValidator<ValidPassword, String> {
@Override
public boolean isValid(String password, ConstraintValidatorContext context) {
if (password == null) {
return false;
}
return password.length() >= 8 && password.length() <= 16
&& password.matches(".*[a-zA-Z].*") // 영어 포함
&& password.matches(".*[0-9].*") // 숫자 포함
&& password.matches(".*[!@#$%^&*(),.?\":{}|<>].*"); // 특수기호 포함
}
}
8~16자, 영어, 숫자, 특수기호 포함으로 지정
3. Controller 에 @Valid 붙이고, request에도 @ValidPassword 를 붙인다
아..! dependency 에
implementation 'org.springframework.boot:spring-boot-starter-validation'
코드 추가도 해야한다
이런식으로 email 이나 사업자번호, 전화번호도 만들어주면 되는데
email은 좀더 간단한 방법을 사용했다
@Column(name="email", unique = true)
@Email(message = "유효한 이메일 주소를 입력하세요.")
private String email;
entity 에 @Email 어노테이션 하나만 추가해주면 validation이 적용된다
비밀번호처럼 직접 사용자가 정의하는게 더 구체적으로 검사가 되겠지만,,
프로젝트 중 추가..
@Operation (summary = "회원수정")
@PreAuthorize("hasRole('USER')")
@PutMapping("/myprofile")
public ResponseEntity<UserResponse> updateUser(
@AuthenticationPrincipal UserPrincipal userPrincipal,
@Valid
@RequestBody UpdateUserRequest request){
UUID id = userPrincipal.getId();
return ResponseEntity.status(HttpStatus.OK).body(userService.updateUser(id, request));
}
@Valid 가 @RequestBody 보다 먼저 와야된다는건 알았는데
바로 앞에 와야하는지 까지는 몰랐다.. 그동안은 어떻게 우연의 일치로 바로 앞에 잘 써줬엇나보다..!
처음엔 이렇게
@Valid
@AuthenticationPrincipal UserPrincipal userPrincipal,
@RequestBody UpdateUserRequest request)
사이에 다른 어노테이션 낀채로 써줬더니 비밀번호 validation 이 안 걸리길래 당황함..
그래도 @Valid 위치가 중요한건 알고있었어서 바로 고침..