728x90
반응형
Bean Validation
- @Valid 애노테이션은 Bean Validation 스펙에 정의되어 있음
- @NotNull, @Digits, @Size 등의 애노테이션 정의
해당 애노테이션을 사용하면 Validator 작성 없이 애노테이션만으로 커맨드 객체의 값 검증을 처리가능
- Bean Validation 2.0 버전을 JSR 380 이라고 부른다.
- JSR : Java Specification Request, 자바 스펙 기술 문서
- 각 스펙마다 고유한 JSR 번호를 가지는데, Bean Validation 1.0 : JSR 303, 1.1 : JSR 349
Bean Validation 제공 애노테이션을 이용하여 커맨드 객체 값 검증
- Bean Validation과 관련된 의존 설정 추가
- 커맨드 객체에 @NotNull, @Digits등의 애노테이션을 이용해 검증 규칙 설정
Bean Validation 관련 의존 추가
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.2.Final</version>
</dependency>
커맨드 객체, 애노테이션 적용
public class RegisterRequest {
@NotBlank
@Email
private String email;
@Size(min = 6)
private String password;
@NotEmpty
private String confirmPassword;
@NotEmpty
private String name;
public String getEmail() {
return email;
}
...
}
Bean Validation 애노테이션 적용한 커맨드 객체 검증 OptionalValidatorFactoryBean 클래스 빈 등록
- @EnableWebMvc 애노테이션을 사용하면, OptionalValidatorFactoryBean을 글로벌 범위 Validator로 등록
- @EnalbeWebMvc 애노테이션을 설정했다면 추가로 설정 필요 없음
@Configuration
@EnableWebMvc // OptionalValidatorFactoryBean을 글로벌 범위 Validator로 등록
public class MvcConfig implements WebMvcConfigurer{
...
}
@Valid 애노테이션을 붙여 글로벌 범위 Validator로 검증
@PostMapping("/register/step3")
public String handleStep3(@Valid RegisterRequest regReq, Errors errors) {
if (errors.hasErrors()) {
return "register/step2";
}
try {
memberRegisterService.reigst(regReq);
return "register/step3";
} catch (DuplicateMemberException ex) {
//이메일 중복 익셉션 발생 시, "email" 프로퍼티 에러코드 "duplicate" 추가
errors.rejectValue("email", "duplicate");
return "register/step2";
}
- 글로벌 범위 Validator를 따로 설정했다면 해당 설정을 삭제하는 것이 좋음
- OptionalValidatorFactoryBean을 글로벌 범위 Validator로 사용하지 않음
- 스프링 MVC는 별도로 설정한 글로벌 범위 Validator가 없을 때에 OptionalValidatorFactoryBean를 글로벌 범위 Validator로 사용함
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
//글로벌 범위 Validator를 설정하면
//OptionalValidatorFactoryBean을 사용하지 않는다
@Override
public Validator getValidator() {
return new RegisterRequestValidator();
}
...
}
Bean Validation 애노테이션을 이용한 검증 결과
Bean Validation 프로바이더(hibernate-validator)가 제공하는 기본 에러 메시지
스프링 MVC는 에러 코드에 해당하는 메시지가 존재하지 않을 때 Bean Validation 프로바이더가 제공하는 기본 에러 메시지를 출력
커스텀 에러 메시지 설정하기 위한 프로퍼티 파일 작성 규칙
- 애노테이션이름.커맨드객체모델명.프로퍼티명
- 애노테이션이름.프로퍼티명
- 애노테이션 이름
public class RegisterRequest{
@NotBlank
@Email
private String email;
}
- NotBlank.registerRequest.name
- NotBlank.name
- NotBlank
NotBlank=필수 항목입니다. 공백 문자는 허용하지 않습니다.
NotEmpty=필수 항목입니다.
Size.password=암호길이는 6자이상이어야 합니다.
Email=올바른 이메일 주소를 입력해야 합니다.
Bean Validation 주요 애노테이션
- Bean Validation 1.1에서 제공하는 주요 애노테이션
- javax.validation.constraints 패키지에 정의
@AssertTure, @AssertFalse
- 값이 true , false 인지 검사하고 null은 유효하다고 판단
- 지원타입 : boolean, Boolean
@DecimalMax, @DecimalMin
- 속성
- String value : 최대값, 최소값
- boolean inclusive : 지정값 포함 여부, 기본 값 true
- 지정한 값보다 작거나 같은지, 크거나 같은지 검사
- inclusive false면 value로 지정한 값 미포함
- null은 유효하다고 판단
- 지원타입 : BigDecimal, BigInteger, 정수타입
@Max, @Min
- 속성 : long value
- 지정한 값보다 작거나 같은지, 크거나 같은지 검사
- null은 유효하다고 판단
@Digits
- 속성
- int integer : 최대 정수 자릿수
- int max : 최대 크기, 기본 값 정수 최대값
- 자릿수가 지정한 크기를 넘지 않는지 검사
- null은 유효하다고 판단
- 지원타입 : BigDecimal, BigInteger, CharSequence, 정수타입
@Size
- 속성
- int main : 최소 크기, 기본 값 0
- int max : 최대 크기, 기본 값 정수 최대 값
- 길이나 크기가 지정한 값 범위에 있는 지 검사
- null은 유효하다고 판단
- 지원타입 : CharSequence, Collection, Map, 배열
@Null @NotNull
- 값이 null인지 아닌지 검사
@Pattern
속성
- String regexp : 정규표현식
값이 정규표현식에 일치하는지 검사
null은 유효하다고 판단
지원타입 : CharSequence
정수타입 : byte, short, int, long 및 관련 래퍼타입
CharSequence 인터페이스의 주요 구현 클래스로 String이 있다.
필수 입력값을 검사할 때에는 다음과 같이 @NotNull과 @Size를 함께 사용
@NotNull
@Size(min=1)
private String title;
@NotNull만 사용하면 title의 값이 빈 문자열("")일 경우 값 검사를 통과한다.
Bean Validation 2.0 추가 애노테이션
@NotEmpty
- 문자열이나 배열의 경우 null이 아니고 길이가 0 이 아닌지 검사
- 컬렉션의 경우 null이 아니고 크기가 0 이 아닌지 검사
- 지원타입 : CharSequence, Collection, Map, 배열
@NotBlank
- null이 아니고 최소한 한 개 이상의 공백아닌 문자를 포함하는지 검사
- 지원타입 : CharSequence
@Positive @PositiveOrZero
- 양수인지 검사한다.
- OrZero가 붙은 것은 0 또는 양수인지 검사
- null은 유효하다고 판단
- 지원타입 : CharSequence
@Negative @NegativeOrZero
- 음수인지 검사한다.
- OrZero가 붙은 것은 0 또는 음수인지 검사
- null은 유효하다고 판단
- 지원타입 : BigDeicmal, BigInteger, 정수타입
- 이메일 주소가 유효한지 검사
- null은 유효하다고 판단
- 지원타입 : CharSequence
@Future @FutureOrPresent
- 해당 시간이 미래 시간인지 검사
- OrPresent가 붙은 것은 현재 또는 미래 시간인지 검사
- null은 유효하다고 판단
- 지원타입 : 시간관련 타입
@Past @PastOrPresent
해당 시간이 과거 시간인지 검사
OrPresent가 붙은 것은 현재 또는 과거 시간인지 검사
null은 유효하다고 판단
지원타입 : 시간 관련 타입
시간관련 타입 : Date, Calendar, Instant, LocalDate, LocalDateTime, MonthDay, OffsetDateTime, OffsetTime, Year, YearMonth, ZonedDateTime ... 등
Bean Validation 2.0 의존 등록
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
728x90
반응형
'Spring' 카테고리의 다른 글
[Spring] 인터셉터 사용해보기 (0) | 2024.05.22 |
---|---|
[Spring] HttpSession 사용해보기 (0) | 2024.05.20 |
[Spring] 컨트롤러 범위 Validator @InitBinder (0) | 2024.05.18 |
[Spring] 글로벌 Validator (0) | 2024.05.14 |
[Spring] 커맨드 객체의 에러 메시지 출력하기 (0) | 2024.05.14 |