본문 바로가기
SpringBoot Server/API

리퀘스트 유효성 검사 - Util과 Validation

by ssury94 2025. 1. 12.

 

이메일과 비밀번호를 입력해서 회원가입을 한다고 생각해봅시다.

이메일은 아이디@도메인.최상위 도메인 으로 구성되어야 올바른 이메일인데 그냥 아이디만 입력했는데도 가입처리가 되면 관리하기가 힘들어질거에요.

 

이를 위해 클라이언트에서 보낸 리퀘스트가 문제가 없는지 확인할 필요가 있습니다.

 

Util Class 를 이용한 유효성 검사

이메일 뿐만아니라 비밀번호 유효자리수, 특문조합 요구 등 정규표현식을 사용하여 디테일한 패턴 매칭이 가능합니다.

필요에 따라 유용한 도구 util들을 추가할 수 있으며, Service 클래스에서 이러한 Validator들을 사용하여 입력값을 검증합니다.

 

이메일 유효성검사 코드 예시

public class EmailValidator {
    private static final String EMAIL_PATTERN =
            "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
    private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN);

    public static boolean isValidEmail(String email) {
        if (email == null) {
            return false;
        }
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }
}

 

비밀번호 유효성검사 코드 예시

public class PasswordValidator {

    //- password: 최소 8자 이상, 영문/숫자/특수문자 조합

    public static boolean isValidPassword(String password) {
        String regex = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[$`~!@$!%*#^?&\\(\\)\\-_=+]).{8,}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(password);
        return matcher.matches();
    }

 

 

Service 클래스에서의 사용 예시

//todo 회원가입
//- 이메일 중복 확인을 수행합니다. DB가 해줄거임
//- 비밀번호는 암호화하여 저장됩니다. JWT 토큰
//- 기본 사용자 권한(USER)으로 생성됩니다.
public int signUp(UserRequest userRequest) {
    if (!EmailValidator.isValidEmail(userRequest.email)) {
        System.out.println("이메일 형식이 아닙니다.");
        return 1;
        // 이메일 형식 체크
    }
    if (!PasswordValidator.isValidPassword(userRequest.password)) {
        System.out.println("비밀번호 형식이 아닙니다.");
        return 2;
        // 비밀번호는 최소 8자 이상, 영문/숫자/특수문자 조합
    }
    if (!InputValidator.isValidInput(userRequest.nickname)) {
        System.out.println("닉네임 형식이 아닙니다.");
        return 3;
        // 닉네임은 최소 2자 이상, 20자 이내, 한글,영문,숫자허용
    }
    // 비밀번호 저장 전 암호화 한다 passwordEncoder.encode (스프링 시큐리티)
    String password = passwordEncoder.encode(userRequest.password);
    userRequest.password = password;
    try {
        userDAO.signUp(userRequest);
    } catch (Exception e) {
        System.out.println("동일한 이메일로 회원가입을 시도할 경우");
        return 4;
    }
    return 0;
}

 

 

Validation 라이브러리를 이용한 유효성 검사

Spring Boot의 Validation 라이브러리를 사용하면 간단하고 선언적인 방식으로 유효성 검사를 할 수 있습니다.

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

DTO 클래스에 @Email, @NotBlank, @Size 등의 어노테이션을 사용하여 유효성 검사 규칙을 정의합니다.

컨트롤러에서 @Valid 어노테이션을 사용하여 자동으로 유효성 검사를 수행합니다.

public class UserLoginRequest {

    @Email
    @NotBlank
    public String email;
    @Size(min = 8, max = 20)
    public String password;
}

 

 

/// 회원가입
@PostMapping("/api/v1/auth/signup")
public ResponseEntity<Void> singUp(@Valid @RequestBody UserRequest userRequest) {
    try {
        userService.signUp(userRequest);
        return ResponseEntity.status(201).build();
    }catch (Exception e) {
        return ResponseEntity.status(400).build();
    }

}

 

두 방법 모두 장단점이 있으며, 프로젝트의 요구사항과 복잡성에 따라 적절한 방법을 선택하거나 두 방법을 조합하여 사용할 수 있습니다. 

유효성 검사는 보안과 데이터 무결성을 위해 매우 중요하므로, 클라이언트 측 뿐만 아니라 서버 측에서도 반드시 수행해야 합니다.