qordpsem 2024. 10. 2. 12:29

코틀린에서 적용했을때랑 코드가 좀 달라서 기록,,,

 

#비밀번호 유효성검사

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 위치가 중요한건 알고있었어서 바로 고침..