inblog logo
|
[HootJem] 개발 기록 블로그
    springboot

    정규표현식과 @Valid 어노테이션

    정규표현식은 패턴을 표현하기 위한 규칙을 정의하는 방법입니다. 전화번호, 주민등록번호 등 정해진 형식이 있고, 제대로 입력했는지 검증을 해야할 때 활용할 수 있습니다.
    HootJem's avatar
    HootJem
    Aug 26, 2024
    정규표현식과 @Valid 어노테이션
    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)을 사용하여 각 필드에 대한 유효성 검사를 정의할 수 있습니다.
    notion image
    @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); } }
     

    자바 정규식 테스트 사이트

    https://www.regexplanet.com/advanced/java/index.html
     
     
     

    참고 : https://inpa.tistory.com/entry/JAVA-☕-정규식Regular-Expression-사용법-정리
    Share article
    Contents
    자바 정규식 테스트 사이트

    [HootJem] 개발 기록 블로그

    RSS·Powered by Inblog