기술과 산업/언어 및 프레임워크
Spring Boot 시리즈 4편 – @Valid 입력값 검증과 글로벌 예외 처리 전략
B컷개발자
2025. 4. 17. 19:28
728x90
Spring Boot에서 @Valid를 활용한 입력값 검증과 글로벌 예외 처리 방법을 정리했습니다. 실무에서 자주 쓰이는 검증 패턴과 ControllerAdvice 전략까지 안내합니다.
Spring Boot 시리즈 4편 – @Valid 입력값 검증과 글로벌 예외 처리 전략
API 개발에서 입력값 검증은 보안성과 안정성의 시작점입니다.
이번 편에서는 Spring Boot 환경에서 @Valid, @Validated, @ControllerAdvice 등을 활용해 입력값 검증과 예외 처리 구조를 체계적으로 구성하는 방법을 설명하겠습니다.
🧪 1. 입력값 검증을 왜 해야 할까?
- 클라이언트가 비정상적인 데이터를 보낼 수 있음
- 비즈니스 로직 이전에 잘못된 데이터는 차단해야 함
- 일관된 에러 응답 포맷 제공은 API 신뢰도 향상에 필수
🧱 2. DTO 클래스에 유효성 검증 애노테이션 적용
public class UserDto {
@NotBlank(message = "이름은 필수입니다.")
private String name;
@Email(message = "이메일 형식이 올바르지 않습니다.")
@NotBlank
private String email;
}
주요 검증 애노테이션
애노테이션 설명
@NotBlank | null, 빈 문자열 모두 허용하지 않음 |
이메일 형식 유효성 체크 | |
@Size | 문자열 또는 리스트의 길이 제한 |
@Min, @Max | 숫자 범위 제한 |
📬 3. Controller에서 @Valid 적용
@PostMapping
public ResponseEntity<UserDto> createUser(@Valid @RequestBody UserDto userDto) {
userService.createUser(userDto);
return ResponseEntity.ok(userDto);
}
- @Valid는 JSR-303 기반의 유효성 검증을 수행합니다.
- 검증 실패 시 MethodArgumentNotValidException이 자동 발생합니다.
📦 4. 글로벌 예외 처리 – @ControllerAdvice 사용
실무에서는 예외마다 다르게 try-catch를 두는 것보다, 전역 예외 처리 클래스를 설계하는 것이 좋습니다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error -> {
errors.put(error.getField(), error.getDefaultMessage());
});
return ResponseEntity.badRequest().body(errors);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleAll(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("서버 오류가 발생했습니다.");
}
}
🧠 실무 적용 전략
- 모든 DTO에 반드시 @Valid 애노테이션 적용
- 검증 메시지는 비즈니스 친화적인 한글 메시지로 커스터마이징
- 공통 응답 포맷을 맞추기 위해 ApiErrorResponse 클래스를 만들어 관리
- 필요 시 사용자 정의 예외(BusinessException)를 만들어 도메인 단위로 분리
✅ 마무리 요약
항목 설명
검증 대상 | @RequestBody, @ModelAttribute 기반 DTO |
검증 도구 | @Valid, @Validated, BindingResult |
응답 처리 | @RestControllerAdvice로 전역 처리 |
공통 전략 | 예외 코드, 메시지 표준화 및 공통 응답 구조 적용 |
추가 도구 | Hibernate Validator, 커스텀 애노테이션 정의 가능 |
📌 다음 편 예고
Spring Boot 시리즈 5편: API 응답 구조 표준화 – 성공/실패 응답 통일 설계 패턴
728x90