Spring Bean Validation

Sin·2024년 8월 20일

Bean Validation 의존 관계 추가

build.gradle 에 의존관계 추가

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

spring-boot-starter-validation 의존관계를 추가하면 아래와 같이 라이브러리가 추가 됨.

jakarta.validation-api : Bean Validation 인터페이스
hibernate-validator 구현체




Bean Validation 등록/수정에 따른 대응에 한계가 있어 Groups 사용

  • 한계 : 대표적으로 등록시 Key(Unique Value)가 필요 없지만 수정시 Key(Unique Value)가 필요 하다. 이럴 경우 같은 Validation을 처리 할 경우 대응이 되지 않음.

Group 적용 코드 (사실 실무에서 잘 사용하지 않음)

#Model 코드

@Data
public class Item {
    @NotNull(groups = UpdateCheck.class) //수정시에만 적용
    private Long id;
    
    @NotBlank(groups = {SaveCheck.class, UpdateCheck.class})
    private String itemName;
    
    @NotNull(groups = {SaveCheck.class, UpdateCheck.class})
    @Range(min = 1000, max = 1000000, groups = {SaveCheck.class, UpdateCheck.class})
    private Integer price;
    
    @NotNull(groups = {SaveCheck.class, UpdateCheck.class})
    @Max(value = 9999, groups = SaveCheck.class) //등록시에만 적용
    private Integer quantity;

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

#등록 코드
@PostMapping("/add")
public String addItemV2(@Validated(SaveCheck.class) @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
 	//등록 구현
}

#수정 코드
@PostMapping("/{itemId}/edit")
public String editV2(@PathVariable Long itemId, @Validated(UpdateCheck.class) @ModelAttribute Item item, BindingResult bindingResult) {
 //수정 구현
}

@Validated 에 클래스 적용 로직이 다르다.


Form 전송 객체 분리

해당 개념이 DTO(Data Transfer Object)
그냥 기존 구현처리대로 DTO 만들어서 상속 잘 받아서 해당 객체가 DataBase 까지 
처리하는 방식을 설명 함.

기존 코드를 최대한 변경하지 않고 등록/수정이 같은 처리가 되도록 고민하는게 핵심.

위의 모든 처리는 @RestController 의 @RequestBody에도 적용 됨.


출처 김영한의 스프링 로드맵 - 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술

0개의 댓글