정규표현식과 @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