정규표현식과 @Valid 어노테이션
정규표현식은 패턴을 표현하기 위한 규칙을 정의하는 방법입니다.
전화번호, 주민등록번호 등 정해진 형식이 있고, 제대로 입력했는지 검증을 해야할 때 활용할 수 있습니다.
Aug 26, 2024
Contents
자바 정규식 테스트 사이트정규표현식은 패턴을 표현하기 위한 규칙을 정의하는 방법입니다.
전화번호, 주민등록번호 등 정해진 형식이 있고, 제대로 입력했는지 검증을 해야할 때 활용할 수 있습니다.
자주 사용되는 정규식
| 정규 표현식 | 설명 | 
| ^[0-9]*$ | 숫자 | 
| ^[a-zA-Z]*$ | 영문자 | 
| ^[가-힣]*$ | 한글 | 
| \\w+@\\w+\\.\\w+(\\.\\w+)? | E-Mail | 
| ^\d{2,3}-\d{3,4}-\d{4}$ | 전화번호 | 
| ^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ | 휴대전화번호 | 
| \d{6} \- [1-4]\d{6} | 주민등록번호 | 
| ^\d{3}-\d{2}$ | 우편번호 | 
    @PostMapping("/login")
    public String login(UserRequest.LoginDTO loginDTO, Errors errors) {
        User sessionUser = userService.로그인(loginDTO);
        session.setAttribute("sessionUser", sessionUser);
        return "redirect:/";
    }import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
public class UserRequest {
    @Data
    public static class JoinDTO {
        @NotEmpty
        private String username;
        @NotEmpty
        private String password;
        @Pattern(regexp = "^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,6}$", message = "이메일 형식으로 작성해주세요")
        @NotEmpty
        private String email;
        //DTO 를 UserObject(=Entity) 로 변환
        public User toEntity() {
            return User.builder().username(username).password(password).email(email).build();
        }
    }
    @Data
    public static class LoginDTO {
        @Size(min = 2, max = 4)
        @NotEmpty
        private String username;
        @NotEmpty
        private String password;
    }
}DTO 내부에서 
jakarta.validation 어노테이션(@NotEmpty, @Pattern, @Size)을 사용하여 
각 필드에 대한 유효성 검사를 정의할 수 있습니다.
   @Before("@annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.PutMapping)")
    public void validCheck(JoinPoint jp) {
    //joinPoint 의 getArgs() 메서드는 메서드의 모든 인자를 가져오는 역할을 한다
        Object[] args = jp.getArgs();
        for (Object arg : args) {
            if (arg instanceof Errors) {
                Errors errors = (Errors) arg;
                if (errors.hasErrors()) { 
                // Errors 타입의 인자가 있는지 검사 후 만약 있다면 hasErrors 메서드로 유효성 검사 에러가 있는지 확인
                    for (FieldError error : errors.getFieldErrors()) {
                        throw new Exception403(error.getDefaultMessage() + " : " + error.getField());
                    }
                }
            }
        }
    }AOC 등록을 통해 
PostMapping PutMapping 은 모두 validCheck 메서드가 작동하도록 하였습니다.GlobalValidationHandler 클래스에서 AOP의 @Before 어노테이션을 사용하여 PostMapping과 PutMapping이 적용된 모든 컨트롤러 메서드가 호출되기 전에 validCheck 메서드를 실행하도록 설정했습니다.
또한 테스트 코드를 통해 작성된 정규표현식 테스트가 가능합니다.public class RegexTest {
    @Test
    public void 한글만된다_test() throws Exception {
        String value = "한글";
        boolean result = Pattern.matches("^[가-힣]+$", value);
        System.out.println("테스트 : " + result);
    }
    @Test
    public void 한글은안된다_test() throws Exception {
        String value = "abc";
        boolean result = Pattern.matches("^[^ㄱ-ㅎ가-힣]*$", value);
        System.out.println("테스트 : " + result);
    }
    @Test
    public void 영어만된다_test() throws Exception {
        String value = "ssar";
        boolean result = Pattern.matches("^[a-zA-Z]+$", value);
        System.out.println("테스트 : " + result);
    }
    @Test
    public void 영어는안된다_test() throws Exception {
        String value = "가22";
        boolean result = Pattern.matches("^[^a-zA-Z]*$", value);
        System.out.println("테스트 : " + result);
    }
}자바 정규식 테스트 사이트
Share article