스프링 MVC 2편 - 인프런 김영한/섹션 4 ,5- 검증1,2 - Validation
[Spring Boot] Bean Validation
샐님
2023. 7. 13. 19:00
728x90
반응형
1. Bean Validation
검증 기능을 java 파일로 매번 코드로 작성하는 것은 번거롭기때문에 스프링에서 간편하게 사용하도록 표준화 한 것이 Bean Validation 이다.
Bean Validation은 특정한 구현체가 아니라 검증 애노테이션과 여러 인터페이스의 모음이다.
일반적으로 사용하는 구현체는 하이버네이트 Validator 이다.
1. build.gradle 에 implementation 'org.springframework.boot:spring-boot-starter-validation' 라이브 러리 의존관계 추가
2. Item.java 에 검증 애노테이션 추가
package hello.itemservice.domain.item;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class Item {
private Long id;
@NotBlank
private String itemName;
@NotNull
@Range(min=1000,max=100000)
private Integer price;
@Max(9999)
private Integer quantity;
public Item() {
}
public Item(String itemName, Integer price, Integer quantity) {
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
}
controller.java
@Validated 추가하면 Item.java에 추가한 검증 애노테이션이 실행된다.
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item , BindingResult bindingResult, RedirectAttributes redirectAttributes) {
//검증에 실패하면 다시 입력 폼으로
if (bindingResult.hasErrors()) {
log.info("errors={}",bindingResult);
return "validation/v3/addForm";
}
// 성공 로직
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v3/items/{itemId}";
}
화면
스프링 부트는 자동으로 글로벌 Validator 로 등록함
- LocalValidatorFactoryBean 을 글로벌 Validator로등록한다. 이 Validator는 @Notnull 같은 애노테이션을 보고 검증을 수행. -> @Validated 적용필요.
검증 오류 발생시 FieldError, ObjectError 생성해 BindingResult 에 담아준다.
2. Bean Validation - 에러 코드
NotBlank 라는 오류 코드는
MessageCodesResolver 를 통해 다양한 메시지 코드가 순서대로 생성.
@NotBlank
NotBlank.item.itemName
NotBlank.itemName
NotBlank.java.lang.String
NotBlank
errors.properties 에 메세지 등록
#Bean Validation 추가
NotBlank={0} 공백X
Range={0}, {2} ~ {1} 허용
Max={0}, 최대 {1}
화면 실행
728x90
반응형