회원가입 시 사용자 정보가 전혀 없는 상황에서 회원가입 버튼을 누를 경우 회원가입이 되는 문제가 발생했다.
@Slf4j
// Spring 프레임워크 Validator 인터페이스 구현
public abstract class AbstractValidator<T> implements Validator {
@Override
public void validate(Object target, Errors errors) {
try {
doValidate((T) target, errors);
} catch (RuntimeException e) {
log.error("중복", e);
throw e;
}
}
@SuppressWarnings("unchecked")
@Override
public boolean supports(Class<?> clazz) {
return true;
}
protected abstract void doValidate(final T dto, final Errors errors);
}
이메일 중복 검증
@RequiredArgsConstructor
@Component
public class CheckEmailValidator extends AbstractValidator<SignUpRequestDTO> {
private final MemberRepository memberRepository;
@Override
protected void doValidate(SignUpRequestDTO dto, Errors errors) {
if (memberRepository.existsByEmail(dto.getEmail())) {
errors.rejectValue("email", "duplicate.email", "이미 사용중인 이메일입니다.");
}
}
}
사용자 이름 중복 검증
@RequiredArgsConstructor
@Component
public class CheckUsernameValidator extends AbstractValidator<SignUpRequestDTO> {
private final MemberRepository memberRepository;
@Override
protected void doValidate(SignUpRequestDTO dto, Errors errors) {
if (memberRepository.existsByUsername(dto.getUsername())) {
errors.rejectValue("username", "duplicate.username", "이미 가입한 사용자입니다.");
}
}
}
패스워드 검증(DTO에 검증 어노테이션을 추가하면 되겠지만 실패 시마다 매번 다른 메시지를 보여주어 이 부분을 해결해보고자 별도로 작성)
@Component
public class CheckPasswordValidator extends AbstractValidator<SignUpRequestDTO>{
@Override
protected void doValidate(SignUpRequestDTO dto, Errors errors) {
// DTO 패스워드가 null이거나 비어있는 경우
if (dto.getPassword() == null || dto.getPassword().trim().isEmpty()) {
errors.rejectValue("password", "password.empty", "패스워드는 필수 입력 값입니다.");
// DTO 패스워드 길이가 8자 미만이거나 20자를 넘어서는 경우
} else if (dto.getPassword().length() < 8 || dto.getPassword().length() > 20) {
errors.rejectValue("password", "password.size", "패스워드는 8자 이상, 20자 이하여야 합니다.");
}
}
}