Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

290570

Validation 적용 본문

java_spring (2024.05 ~ 2024.10)

Validation 적용

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

'java_spring (2024.05 ~ 2024.10)' 카테고리의 다른 글

jwt,, login,,,,  (0) 2024.10.04
validation (trouble shooting)  (0) 2024.10.02
prepersist (trouble shooting)  (0) 2024.10.02
코드 리팩토링(builder pattern)  (0) 2024.09.30
spring security 코드 작성  (0) 2024.09.29