이메일과 비밀번호를 입력해서 회원가입을 한다고 생각해봅시다.
이메일은 아이디@도메인.최상위 도메인 으로 구성되어야 올바른 이메일인데 그냥 아이디만 입력했는데도 가입처리가 되면 관리하기가 힘들어질거에요.
이를 위해 클라이언트에서 보낸 리퀘스트가 문제가 없는지 확인할 필요가 있습니다.
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();
}
}
두 방법 모두 장단점이 있으며, 프로젝트의 요구사항과 복잡성에 따라 적절한 방법을 선택하거나 두 방법을 조합하여 사용할 수 있습니다.
유효성 검사는 보안과 데이터 무결성을 위해 매우 중요하므로, 클라이언트 측 뿐만 아니라 서버 측에서도 반드시 수행해야 합니다.