Validated로 오류 검증하기!

박경현·2023년 4월 13일
0

// bindingResult, Validated, SaveItemForm

우리가 사이트를 만들다 보면 회원가입이나 로그인 수정 등
유저가 직접 무언가를 폼 등에 작성해야하는 상황이 자연스럽게 나온다!

이때 유저가 폼 형식에 맞지 않거나 조건등에 부합하지 않게 적었을 경우!! => 오류를 검증해줄 필요가 있다!!

@Validated로 필드 검사 쉽게 하기!

각각의 엔티티 내의 필드들을 검사할때 어노테이션만으로도 검사가 가능하다!
그렇게 하기 위해서는 설정과 사용방법을 알아야한다!

build.gradle에 validate관련 라이브러리 수동 추가하기!

implementation 'org.springframework.boot:spring-boot-starter-validation'

직접 DB관련 객체에 설정하는게 아닌 각각의 Form에 맞게 클래스 만들기!

만약에 객체가 아이디, 비밀번호, 생년월일, 이메일 등을 적어야한다면

로그인 할때는 아이디와 비밀번호에 대한 검증만 하면 되기 때문에 이걸 위한 클래스를 따로 만들다!!

@Data
public class ItemSaveForm {
	@NotBlank
    private String itemName;
    
    @NotNull
    @Range(min=1000, max=10000)
    private Integer price;
    
    @NotNull
    @Max(9999)
    private Integer quantity;
}

errors.properties에 오류 공용 메세지 작성하기!

오류가 났을때 공통적인 이유로 나는 경우에 대해 각각 오류에 대한 메시지를 작성해준다.

totalPriceMin.item=상품의 가격*수량의 합은 {0}원이상이어야 함 / 현재 값 = {1}

NotBlank={0} 공백X
Range={0} {2}~{1} 허용
Max={0} 최대{1}

NotBlank부터 각각의 메시지의 {0}은 필드 이름이다 각각 itemName, price, quantity 가 된다!!

BindingResult -> 이게 오류를 검증하는데 알아야할 핵심 부분!

BindingResult는 검증 오류가 발생할 경우 오류 내용을 보관하는 스프링 프레임워크에서 제공하는 객체!

BindingResult는 무조건 @ModelAttribute가 붙은 객체 다음에 위치해야함!!

@PostMapping("/add")
public String addItem3(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult,RedirectAttributes redirectAttributes ) {

	// Object 오류 -> 즉 두개 이상의 필드와 관련된 오류일때는 Validated로 놔두기 보다는 이렇게 처리하기!
	if(form.getPrice != null &&form.getQuantity != null) {
    	int result = form.getPrice() * form.getQuantity();
        if (result < 10000) {
        	bindingResult.reject("totalPriceMin", new Object[] {10000, result}, null);
        }
    }
    
    if(bindingResult.hasErrors()) {
    	log.info("errors={}", bindingResult);
        return "validation/v4/addForm";
    }
    
    Item item = new Item();
    item.setItemName(form.getItemName());
    item.setPrice(form.getPrice());
    item.setQuantity(form.getQuantity());
    
    Item savedItem = itemRepository.(item);
    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);
    return "redirect:/validation/v4/items/{itemId}";

}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글