Study/spring

[Java] Spring Boot 3 Validation @Pattern 정규식 예제

 

@Pattern 어노테이션은 요청 값이 정규표현식에 맞는 문자열인지 검증하는 어노테이션입니다.

 

예제 코드

숫자, 알파벳, 한글, 이메일, 전화번호, 비밀번호, 시작 문자, 끝 문자, 포함 문자, 제외 문자 정규표현식 예제입니다.

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@RestController
public class ValidAnnotationController {

    @PostMapping("/valid/pattern")
    public PatternValidObject checkPattern(@Valid @RequestBody PatternValidObject object) {
        return object;
    }

    @Getter
    @AllArgsConstructor
    public static class PatternValidObject {

        @Pattern(regexp = "^[0-9]$", message = "숫자만 입력할 수 있습니다.")
        private String onlyNumber;
        @Pattern(regexp = "^[a-zA-Z]*$", message = "영어 알파벳만 입력할 수 있습니다.")
        private String onlyEnglish;
        @Pattern(regexp = "^[a-zA-Z0-9]*$", message = "영어 알파벳과 숫자만 입력할 수 있습니다.")
        private String engAndNum;
        @Pattern(regexp = "^[가-힣]*$", message = "한글만 입력할 수 있습니다.")
        private String onlyKorean;
        @Pattern(regexp = "^[\\w!#$%&'*+/=?`{|}~^.-]+@[\\w.-]+\\.[a-zA-Z]{2,6}$", message = "이메일 형식이 올바르지 않습니다.")
        private String email;
        @Pattern(regexp = "^\\d{2,3}-\\d{3,4}-\\d{4}$", message = "전화번호 형식이 올바르지 않습니다.")
        private String phoneNumber;
        @Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&#])[A-Za-z\\d@$!%*?&#]{8,}$", message = "비밀번호 형식이 올바르지 않습니다. 8자 이상, 대소문자 포함, 숫자 및 특수문자(@$!%*?&#) 포함")
        private String password;
        @Pattern(regexp = "^A.*", message = "'A'로 시작해야 합니다.")
        private String startsWithA;
        @Pattern(regexp = ".*A$", message = "'A'로 끝나야 합니다.")
        private String endsWithA;
        @Pattern(regexp = ".*ABC.*", message = "'ABC' 문자열을 포함해야 합니다.")
        private String containsABC;
        @Pattern(regexp = "^(?!.*ABC).*$", message = "'ABC' 문자열을 포함하면 안됩니다.")
        private String exceptABC;
        @Pattern(regexp = "^A.*A$", message = "'A'로 시작하고 'A'로 끝나야 합니다.")
        private String startAEndA;
        @Pattern(regexp = "^(?=.*ABC)(?!.*DEF).*$", message = "'ABC' 문자열을 포함하고 'DEF' 문자열을 포함하면 안됩니다.")
        private String containsABCExceptDEF;
    }

}

 

Spring Boot 3이라서 javax.validation.constraints 패키지가 아니라 jakarta.validation.constraints 패키지가 사용되었습니다.

 

참고로 @Pattern 어노테이션은 문자열에만 사용 가능합니다.

문자열이 아닌 타입에 사용하면 다음과 같은 에러 메시지가 나옵니다.

HV000030: No validator could be found for constraint 'jakarta.validation.constraints.Pattern' validating type 'java.lang.Integer'. Check configuration for '<변수명>'

 

 

 

 

 

 

@Pattern 검증

우선 @Pattern 어노테이션은 NULL 여부를 따로 체크하지 않습니다.

@Pattern 어노테이션이 사용된 변수 값이 null일 때
@Pattern 어노테이션이 사용된 변수 값이 null일 때

만약에 null이나 빈 문자열을 받고싶지 않다면 @NotNull, @NotBlank, @NotEmpty 같은 어노테이션을 같이 사용하면 됩니다.

사용법은 아래 문서를 참고 바랍니다.

[Java] Spring boot 3 @NotNull @NotEmpty @NotBlank

 

 

요청 값에 정규식에 맞지 않은 문자열이 들어오면 에러를 반환합니다.

@Pattern 정규식을 통과하지 못했을 때
@Pattern 정규식을 통과하지 못했을 때

 

정규식에 맞는 문자열이 들어오면 검증을 통과할 수 있습니다.

@Pattern 정규식 검증을 모두 통과했을 때
@Pattern 정규식 검증을 모두 통과했을 때