Lombok @Email 어노테이션의 약점 (부제 - 테스트코드 짱짱맨)

김태훈·2023년 8월 8일
0
package Funssion.Inforum.domain.member.dto.request;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.Set;

class NonSocialMemberLoginDtoTest {

    private static ValidatorFactory factory;
    private static Validator validator;

    @BeforeAll
    public static void init() {
        factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }
    @AfterAll
    public static void close() {
        factory.close();
    }
    @Test
    @DisplayName("로그인 양식 유효성 검사")
    public void loginValidMember() {
        Set<ConstraintViolation<NonSocialMemberLoginDto>> violations = validator.validate(new NonSocialMemberLoginDto("test@gmail", "a4567!")); // 유효하지 않은 경우 violations 값을 가지고 있다.
        System.out.println("violations = " + violations);
    }

}

테스트코드로 로그인 양식에 대한 검증을 하던 중에, "test@gmail" 이라는 이메일을 넣어보았다.
근데, 어떠한 violation도 없었다. 분명 유효하지 않은 이메일인데..하던 중,
@Email 어노테이션이 생각보다 문제가 많다는 사실을 찾아보면서 알게되었다.

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class NonSocialMemberLoginDto {
    @NotBlank
    @Email(message="이메일 주소 양식을 확인해주세요")
    @JsonProperty("user_email")
    private String userEmail; // 소셜 로그인 이메일, 개인 인증 이메일 둘다 user_email에 속함
    @NotBlank
    @JsonProperty("user_pw")
    private String userPw;

}

다음 @Email어노테이션은 구멍이 많다고 한다.
그래서 정규표현식으로 바꾸기로 결정했다.

테스트코드는 여러모로 좋은 것 같다.
물론 예외의 경우를 테스트케이스에 잘 넣는다면!

package Funssion.Inforum.domain.member.dto.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class NonSocialMemberLoginDto {
    @NotBlank
    @Pattern(regexp="^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])+[.][a-zA-Z]{2,3}$", message="이메일 주소 양식을 확인해주세요")
    @JsonProperty("user_email")
    private String userEmail; // 소셜 로그인 이메일, 개인 인증 이메일 둘다 user_email에 속함
    @NotBlank
    @JsonProperty("user_pw")
    private String userPw;

}

정규표현식으로 +[.][[a-zA_Z]{2,3} 을 넣어서 '.'도 추가시켰다.

profile
기록하고, 공유합시다

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

정보에 감사드립니다.

답글 달기