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

정규표현식은 패턴을 표현하기 위한 규칙을 정의하는 방법입니다. 전화번호, 주민등록번호 등 정해진 형식이 있고, 제대로 입력했는지 검증을 해야할 때 활용할 수 있습니다.
HootJem's avatar
Aug 26, 2024
정규표현식과 @Valid 어노테이션
💡
정규표현식은 패턴을 표현하기 위한 규칙을 정의하는 방법입니다. 전화번호, 주민등록번호 등 정해진 형식이 있고, 제대로 입력했는지 검증을 해야할 때 활용할 수 있습니다.
 

자주 사용되는 정규식

정규 표현식
설명
^[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 어노테이션을 사용하여 PostMappingPutMapping이 적용된 모든 컨트롤러 메서드가 호출되기 전에 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

[HootJem] 개발 기록 블로그