DTO에서 이메일에 대한 유효성 검증을 할 때, 매번 별 생각없이 @Email 을 사용했었다.
근데 교육에서 테스트 코드를 작성하다가 @Email 의 허점을 발견했다.
그래서 이에 대한 허점과 대안을 정리해보겠다.
@Email 에 대해서
spring-boot-starter-validation dependency를 추가했다는 가정하에,
UserDTO 의 email 필드에 이메일을 검증하는 @Email 을 넣는다.
..
public class UserDTO {
    @Email(message = "올바른 이메일 형식이 아닙니다.")
	private String email;
    ..
}
보통 이메일은 유저ID@도메인과 같고 예시로는 test12@test.com 으로 넣을 수 있다.
그렇다면 도메인에서 '.' 이 빠진 test12@testcom 에 대한 유효성 검증이 통과할까 ?
이에 대한 결과값을 확인하기위해, 아래와 같은 테스트 코드를 작성했다.
( violations 의 size 가 0 이면 유효성 검증에 위반하는 데이터가 없다는 뜻이다. )
	@Test
    void when_CreateUser_then성공() {
        UserDTO userDto = UserDTO.builder()
                .email("test1234@testcom") // 잘못된 도메인
                .build();
        
        Set<ConstraintViolation<UserDTO>> violations // 실패했던 항목의 개수 반환
                = validator.validate(userDto);
        
        assertThat(violations).hasSize(0);
    }
위의 코드를 실행하면, 빈 화면과 같이 아래의 성공 결과를 확인할 수 있을 것이다.

이메일 정규식 표현으로 데이터 검증하기 ( @Pattern )
위의 허점을 보완하기위해 우리는 이메일 정규식 표현을 사용하여 Pattern 검증을 하면된다.
이를 도와주는 게 @Pattern 애노테이션이고, 예는 아래와 같다.
..
public class UserDTO {
	@Pattern(regexp = "^[A-Za-z0-9_\\.\\-]+@[A-Za-z0-9\\-]+\\.[A-Za-z0-9\\-]+$",
    		 message = "올바른 이메일 형식이 아닙니다.")
    private String email;
    ..
}
이를 통해 같은 테스트 코드를 돌려보면,

에러 메시지와 함께 테스트가 실패한 것을 확인할 수 있고 이게 맞는 결과이다.
정상적으로 test@test.com 으로 값을 변경하고 실행하면 테스트는 성공이다.
정리
너무 의심없이 당연스레 사용을 하다가 허점이 보이니까 좀 많이 반성했다.
객체에 대한 테스트 코드는 생각해보지도 못했던 것 같은데, 기능에 대해 알고 쓰려는 노력이 필요하다.
'Web' 카테고리의 다른 글
| [Spring] Exception Handling 에 대해서 (3) | 2023.07.03 | 
|---|---|
| [Spring] @Builder 와 Builder 패턴 (0) | 2023.06.25 | 
| [Spring] Gradle 과 Maven 에 대해서 (0) | 2023.06.22 | 
| [Spring] HikariCP 와 Pool Size에 대해서 (0) | 2023.06.18 | 
| [Spring] Spring Security 로 CSRF 처리하기 (0) | 2023.06.15 |