사용자가 입력한 데이터의 검증을 위해, 스프링 프레임워크가 제공하는 Validation 기능을 이용해 봅니다.
큰 흐름은 다음과 같습니다.
아래 1, 2, 3번에 대한 설명이 있는 유효성 검사, Validation (1) 에 이어 4번째 항목을 소개합니다.
1. 기본설정 : 유저 입력 데이터를 커맨드객체로 받는다.
2. Validation 적용하기 : 커맨드객체에 Validation 어노테이션을 사용해 각 필드에 대해 유효성 검사를 실시한다.
3. 예외 처리하기 : 검사를 통과하지못해 예외발생시 해당 예외를 처리할 로직을 구현한다.
4. 추가기능 : 사용자편의를 위해 몇가지 로직을 추가 구현한다(예: 검증 그룹 등)
4. 추가기능
@Data
public class CommandVO {
@NotBlank(message = "아이디를 입력해주세요.")
private String username;
@NotBlank(message = "비밀번호를 입력해주세요.")
private String password;
@NotBlank(message = "이메일을 입력해주세요.")
private String email;
public List<String> getFieldOrder() {
return List.of(
"username",
"password",
"email"
);
}
}
현재까지 작성된 CommandVO의 내용은 위처럼 되어있습니다. @NotNull에 대한 유효성 검사만 이루어지고 있습니다.
여기에 정규표현식이나 길이제한을 넣도록 하겠습니다.
| @NotNull | 필드값이 null이 아니어야 함. |
| @Null | 필드값이 null 이어야 함. |
| @NotEmpty | 문자열, 컬렉션, 맵, 배열 등이 null이 아니고 빈 상태가 아니어야 함. |
| @NotBlank | 문자열이 null이 아니고, 공백이 아닌 문자 하나 이상을 포함해야 함. (””, “ “) 불가능 |
| @Size(min=, max=) | 문자열, 컬렉션, 맵, 배열 등이 주어진 범위 내에 있어야 함. |
| @Min(value) | 숫자가 지정한 최소값 이상 이어야함. |
| @Max(value) | 숫자가 지정한 최대값 이하 이어야 함. |
| @Positive | 숫자가 양수여야 함. |
| @PositiveOrZero | 숫자가 양수거나 0이어야 함. |
| @Negative | 숫자가 음수여야 함. |
| @NegativeOrZero | 숫자가 음수거나 0이어야 함. |
| 문자열이 이메일 형식이어야 함. | |
| @Digits(Integer=, fraction=) | 숫자가 지정된 자릿수를 넘지 않아야 함. (Integer = 정수부분 최대 자릿수, fraction = 소수부분 최대 자릿수) |
| @Pattern(regexp=) | 문자열이 정규식에 매치되어야 함. |
이 중, NotBlank와 Pattern을 함께 사용하겠습니다.
@Data
public class CommandVO {
@NotBlank(message = "아이디는 필수정보입니다.", groups= NotBlankGroup.class)
@Pattern(regexp = "^[a-z]+[a-z0-9]{5,20}", message = "아이디는 5~20자의 영문/숫자로만 구성해주세요.", groups=PatternGroup.class)
private String username;
@NotBlank(message = "비밀번호는 필수정보입니다.", groups=NotBlankGroup.class)
@Pattern(regexp = "^(?=.*\\S+$)(?=.*[\\W_]).{8,16}$", message = "비밀번호는 8~16자, 특수문자를 반드시 포함해야 합니다.", groups=PatternGroup.class)
private String password;
@NotBlank(message = "이메일은 필수정보입니다.", groups=NotBlankGroup.class)
@Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "올바른 이메일 형식이 아닙니다.", groups=PatternGroup.class)
private String email;
public List<String> getFieldOrder() {
return List.of(
"username",
"password",
"email"
);
}
}
현재의 코드는 각 필드마다
1. 사용자가 아무것도 입력을 하지 않았을 때
2. 정규표현식에 어긋날 때
두 가지 유효성 검사를 실시하고, 해당 검사와 예외에 따른 메시지를 포함하고 있습니다.
어노테이션 속성에 groups이 포함되었는데 이 group이 이전 1편에서 언급한 '검증 그룹'입니다.
검증그룹은 별도의 클래스안에 인터페이스로서 명시할 수 있습니다.
public class ValidationGroups {
public interface NotBlankGroup{}
public interface SizeGroup{}
public interface PatternGroup{}
public interface AssertTrueGroup{}
}
ValidationGroups.class 파일 안에 내가 그룹명을 사용할 이름을 인터페이스로 명시합니다.
그리고 CommandVO의 Valid 어노테이션에 groups 속성으로 설정해 두면, 해당 어노테이션이 내가 설정한 groups에 속하게 됩니다.
이렇게 그룹설정을 하는 이유는 1편에서 설명한 바와 같이 컨트롤러 메서드에따라 검증그룹을 선택할 수 있을 뿐만 아니라, 검증 순서도 정할 수 있기 때문입니다.
지금상태에서는 사용자 데이터 유효성검사를 실행하면 아이디 → 닉네임 → 이메일 검증 순서는 작동되지만,
아이디 순서일때 빈칸에 대한 유효성 검사가 진행되거나 정규표현식 유효성 검사가 진행되거나 랜덤이므로 이 순서도 정해주어야 합니다.
@GroupSequence({
ValidationGroups.NotBlankGroup.class,
ValidationGroups.SizeGroup.class,
ValidationGroups.PatternGroup.class,
})
public interface ValidationOrder {
}
ValidationOrder 인터페이스를 만들고, @GroupSequence 어노테이션에 검증을 실시할 그룹을 순서대로 넣어주고, 컨트롤러의 @Validated 어노테이션에 이 순서를 사용함을 명시해주면 됩니다.
@PostMapping("")
public ResponseEntity<Map<String, Object>> signUpController(@Validated(ValidationOrder.class) @ModelAttribute CommandVO commandVO)
이렇게 적용하면 CommandVO의 유효성검사는 username(1. NotBlank, 2. Pattern) → password(1. Notblank, 2. Pattern) → email(1. NotBlank, 2. Pattern) 순서대로 이루어져 사용자에게 예외 발생시 안내메시지를 응답합니다.
'Java > Spring Framework' 카테고리의 다른 글
| 설정파일을 이용한 환경 변수 설정 (3) | 2025.01.13 |
|---|---|
| 유효성 검사, Validation (1) (4) | 2025.01.02 |