SPRING
Bean Validation
도원좀비
2025. 3. 25. 19:48
Bean Validation과 고급 적용 전략
1️⃣ Bean Validation 이란?
- 검증 Annotation(@NotBlank, @Range 등) 사용
- 표준 스펙: jakarta.validation
- 구현체: Hibernate Validator
@Getter
public class SignUpDto {
@NotBlank(message = "이름은 필수입니다")
private String name;
@Range(min = 1, max = 120, message = "나이는 1~120 사이여야 합니다")
private Integer age;
}
@PostMapping("/signup")
public String save(@Validated @ModelAttribute SignUpDto dto, BindingResult bindingResult) { ... }
✅ @Validated vs @Valid
| 구분 | 설명 |
| @Valid | Java 표준, 그룹 지정 불가 |
| @Validated | Spring 제공, groups 기능 지원 |
✅ 객체 단위 오류 (ObjectError)
if (dto.getPrice() * dto.getCount() < 10000) {
bindingResult.reject("totalMin", new Object[]{10000}, "총액은 10000원 이상이어야 합니다");
}
2️⃣ 등록/수정 API 검증 조건 충돌 해결
방법 1. DTO 분리 (권장)
- ProductSaveRequest, ProductUpdateRequest 따로 만들기
방법 2. groups 기능 사용
public interface SaveCheck {}
public interface UpdateCheck {}
@NotBlank(groups = {SaveCheck.class, UpdateCheck.class})
@Range(min = 10, max = 10000, groups = SaveCheck.class)
@Validated(SaveCheck.class)
3️⃣ @ModelAttribute vs @RequestBody
| 항목 | @ModelAttribute | @RequestBody |
| 대상 | Form, 쿼리 파라미터 | JSON |
| 검증 범위 | 필드 단위 바인딩 | 객체 단위 바인딩 |
| 변환 실패 | 컨트롤러 호출 O | 컨트롤러 호출 X |
| BindingResult 사용 | O | O (단, 바인딩 성공 후만) |
4️⃣ 에러 메시지 처리
- 기본 메시지: @NotBlank(message = "이름을 입력하세요")
- 커스텀 메시지 처리: MessageSource 활용
- 공통 에러 포맷 필요 시: @ControllerAdvice로 전역 처리
요약
| 개념 | 키포인트 |
| Validation | 사용자 입력 검증은 UX + 보안 모두를 위한 필수 |
| BindingResult | 오류 수집 및 컨트롤러 진입 유지 가능 |
| Bean Validation | 간결한 Annotation 기반 검증 |
| ObjectError | 필드 외 조건 검증에 사용 |
| DTO 분리 / groups | API별 검증 요구사항 충돌 해결 |
| @ModelAttribute vs @RequestBody | 바인딩 방식과 실패 시점이 다름 |