
@PostMapping("/posts")
public String post(@RequestBody PostCreate params) throws Exception{
var title = params.getTitle();
// ✅ title에 대한 데이터 검증 필요
if(title == null || title.equals("")){
throw new Exception("title값이 없서용!");
}
var content = params.getContent();
// ✅ content에 대한 데이터 검증 필요
if(content == null || content.equals("")){
throw new Exception("content값이 없서용!");
}
log.info("params={}", params.toString());
return "Hello World";
}
PostCreate에 필드가 title, content 밖에 없지만,if문 떡칠!){"title" : ""}{"title" : " "}{"title" : "..수십억글자..."}spring-boot-starter-validation@NotBlank와 같은 검증 어노테이션을 사용해 DTO 필드 검증을 수행1. 검증이 필요한 DTO에 검증 어노테이션 추가(@NotBlank)
📂 PostCreate.java
@Setter
@Getter
@ToString
public class PostCreate {
@NotBlank
private String title;
@NotBlank
private String content;
}
2. 컨트롤러에서 DTO에 대한 유효성을 검증하는 어노테이션 추가(@Vaild)
@RequestBody로 JSON 데이터를 받을 때,@Valid를 붙이면 해당 DTO 클래스에 설정된 유효성 검증이 자동으로 수행📂 PostController.java
@PostMapping("/posts")
public String post(@RequestBody @Valid PostCreate params) throws Exception{
...
}
@Valid는 요청 데이터가 컨트롤러에 도달하기 전에 Spring의 검증 과정을 먼저 수행MethodArgumnetNotValidException 발생 → Spring의 Exception Handler가 이를 처리※ 더 세밀한 예외처리가 필요한 경우 @ExceptionHandler를 사용
@Vaild는 컨트롤러 실행 전에(컨트롤러 도달 전에) 검증을 수행BindingResult를 이용해서 해결BindingResult는 Spring에서 유효성 검증 결과를 담는 객체@Valid만 사용할 경우, 검증 실패시 예외(MethodArgumnetNotValidException)발생BindingResult를 함께 사용하면, 예외가 발생하지 않고 코드 흐름을 계속 진행@Valid 어노테이션이 DTO 유효성 검사를 수행BindingResult 객체에 저장📂 PostController.java
@PostMapping("/posts")
public Map<String, String> post(@RequestBody @Valid PostCreate params, BindingResult result){
// ✅데이터 검증 실패 결과를 클라이언트에게 알리고 싶다면? -> BindingResult
if(result.hasErrors()){
List<FieldError> fieldError = result.getFieldErrors();
FieldError firstFieldError = fieldError.get(0);
String fieldName = firstFieldError.getField();
String errorMessage = firstFieldError.getDefaultMessage();
Map<String, String> error = new HashMap<>();
error.put(fieldName, errorMessage);
return error;
}
log.info("params={}", params.toString());
return Map.of();
}
1. @Valid를 사용한 유효성 검증
BindingResult를 사용한 검증 결과 저장@Vaild를 사용한 유효성 검증에 대한 결과를 저장