Bean Validation
검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 표준화한 것이다.
우선 Bean Validation 을 사용하려면 다음 의존관계를 추가해야 한다.
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
해당 라이브러리를 넣으면, 자동으로 Bean Validator 를 인지하고, 스프링에 통합한다.
그리고 LocalValidatorFactoryBean 을 자동으로 글로벌 Validator 로 등록한다.
`@Valid`, `@Validated` 만 적용하면 되고,
검증 오류가 발생하면 FieldError, ObjectError 를 생성하여 BindingReslut 에 담아준다.
(이때 직접 글로벌 Validator 를 등록하면 Bean Validator 를 글로벌 Validator 로 등록하지 않으니
직접 등록한 Validator를 제거해야 한다.)
> 참고 <
- @Validated vs @Valid
둘 다 사용 가능하지만, @Valid 는 bulid.gradle 에 의존관계를 추가해야 한다.
@Validated 는 스프링 전용 검증 애노테이션이고, @Valid 는 자바 표준 검증 애노테이션이다.
@Validated 는 내부에 groups 기능을 포함하고 있다.
@Data
public class Item {
private Long id;
@NotBlank
private String itemName;
@NotNull
@Range(min = 1000, max = 1000000)
private Integer price;
@NotNull
@Max(9999)
private Integer quantity;
...
}
애노테이션을 활용하여 필드 오류를 처리할 수 있다.
글로벌 오류는 따로 처리해아 한다.
`@NotBlank` : 빈값 + 공백만 있는 경우 허용 X
`@NotNull` : null 허용 X
`@Range(min = 1000, max = 1000000)` : 범위 안의 값만 허용
`@Man(9999)` : 최대 9999 까지만 허용
검증 순서
1. @ModelAttribute 각각의 필드에 타입 변화를 시도한다.
2. 실패하면 typeMismatch 로 FieldError 를 추가한다.
3. 성공한 필드만 Bean Validation 을 적용한다.
에러 코드
오류 코드가 애노테이션 이름으로 BindingResult 에 등록된다.
`@NotBlank` 인 경우
1. `NotBlank.item.itemName`
2. `NotBlank.itemName`
3. `NotBlank.java.lang.String`
4. `NotBlank`
우선순위를 만들어 생성한다.
메시지 우선순위
1. 생성된 에러 코드 순서대로 `messageSource` 에서 메시지 찾기
2. 애노테이션의 `message` 속성 사용 (@NotBlank(message = "공백 X")
3. 라이브러리가 제공하는 기본 값 사용
문제점
- 동일한 모델 객체를 등록할 때와 수정할 때 적용하는 검증을 다르게 처리할 수가 없음
(Bean Validation 의 groups 기능을 사용하면 됨 @Validated 만 가능, @Valid 불가능)
(하지만 실무에서 잘 사용하지 않음)
==> 객체를 직접 사용하지 않고, 등록/수정 하는 별도의 모델 객체를 만들어 사용하면 된다.
> 참고 <
검증 애노테이션 모음
출처 | 스프링 MVC 2(김영한) - 인프런
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[Spring] 필터란 ? + 요청 로그 필터, 인증 체크 필터 예시 (0) | 2025.04.04 |
---|---|
[Spring] 쿠키/세션으로 로그인 처리하기 (세션 저장소 만들기, HttpSession) (0) | 2025.04.03 |
[Spring] 필드/글로벌 검증하기 (BindingResult, MessageResolver, @Validated) (1) | 2025.04.02 |
[Spring] 메시지 / 국제화 하기 (0) | 2025.03.31 |
[Thymeleaf] 타임리프 사용 방법 완전 정복! (0) | 2025.03.20 |