검증이 필요한 이유
- 컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것
- 클라이언트 검증은 조작할 수 있어 보안에 취약함
- So, 서버에서도 잘못된 요청을 검증하는 로직이 필요
Bean Validation
: 검증 에노테이션과 여러 인터페이스의 모음
- 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준임
- Bean Validation을 구현한 기술 중에 일반적으로 사용하는 구현체는 하이버네이트 Validator임
- Bean Validation을 잘 활용하면, 에노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있음
cf) DTO(Data Transfer Object)
: 데이터를 전달하기 위해서 사용하는 객체
DTO Validation
: DTO값이 원하는 형태로 들어왔는지 확인하는 것
1. 의존성 추가하기
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. Annotation 종류
- @AssertFalse : false 값 통과
- @AssertTrue : true 값 통과
- @DecimalMax(value= , inclusion= ) : 지정된 값 이하의 실수 통과
- @DecimalMin(value= , inclusion= ) : 지정된 값 이상의 실수 통과
- @Past : 대상 날짜가 현재보다 과거일 경우만 통과
- @NotNull : null 값이 아닐 경우만 통과
- @NotBlank : null, "", " " 이 아닌 경우 통과 -> 문자열의 공백까지 체크해주기 때문에 문자열은 이것을 사용
3. DTO에 적용
- DTO에 적용한 어노테이션이 동작하기 위해서는 컨트롤러 메서드 매개변수에 @Valid 어노테이션을 붙여야 함
- 스프링 부트는 이 어노테이션이 있으면 JSR 380 구현체인 Hibernate Validator를 자동으로 실행하고 Argument를 검증함
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class CreateRecordRequest {
@NotNull(message = "지출 비용을 입력해주세요.")
@Min(value = 0, message = "지출 비용 최소 값은 0입니다.")
@Max(value = 999999, message = "지출 비용 최대 값은 999999입니다.")
private Integer price;
@NotBlank(message = "지출 명을 입력해주세요.")
@Size(min = 1, max = 16, message = "지출 명은 16자 이하입니다.")
private String title;
@NotBlank(message = "내용을 입력해주세요.")
@Size(min = 1, max = 80, message = "내용은 80자 이하입니다.")
private String content;
private String imgUrl;
@NotNull(message = "지출 평가를 입력해주세요.")
@Min(value = 1, message = "점수는 1부터 시작합니다.")
@Max(value = 4, message = "점수는 4이하 입니다.")
private Integer evaluation;
}
4. @Valid 동작 시점
- @Valid는 핸들러 어댑터가 핸들러를 호출하는 과정에서 동작
- 핸들러(컨트롤러)에서만 동작
- RequestMapping 핸들러 어댑터가 Argument Resolver를 통해 JSON 타입의 데이터를 객체로 변환하는 과정에서 동작
- 이 과정에서 예외가 발생하면 MethodArgumentNotValidException이 발생
'SPRING' 카테고리의 다른 글
15. SpringSecurity 개념, 인증 처리 과정, currentUser 정보 (0) | 2025.06.06 |
---|---|
13. ViewResolver (0) | 2025.06.06 |
12. @Controller vs @RestController (0) | 2025.05.26 |
11. Web MVC 요청 처리 과정 (0) | 2025.05.26 |
10. Spring vs SpringBoot (0) | 2025.05.26 |