Spring Boot DTO 검증과 에러 응답 표준화
Spring Boot 기반 프로젝트에서 DTO 검증 흐름과 controller advice 기반 에러 응답 표준화를 단계별 코드 예제와 설계 원칙 중심으로 설명하는 기술 글
목차
개요
애플리케이션에서 DTO 검증은 입력 신뢰성을 확보하는 첫 관문이다. 검증 로직을 컨트롤러 내부에 흩어지게 두면 유지보수가 어려워지고 에러 응답 형식이 제각각이 된다. 따라서 spring boot dto validation 예제와 함께 검증 흐름을 정리하고, controller advice error response spring boot 패턴을 이용해 validation error spring boot 처리 방법을 표준화하는 방법을 소개한다.
검증 원리와 흐름
스프링에서는 javax validation 어노테이션을 DTO에 선언하고 컨트롤러에서 @Valid 또는 @Validated로 검증을 트리거한다. 검증 실패 시 MethodArgumentNotValidException이 발생하며 이를 전역 예외 처리기로 받아 표준화된 응답을 반환할 수 있다.
핵심 흐름
- DTO에 제약 조건 어노테이션 선언
- 컨트롤러에서 @Valid로 검증 수행
- 검증 실패 시 예외 발생
- @ControllerAdvice에서 예외를 잡아 올바른 응답 구조로 매핑
DTO 예제
간단한 사용자 등록 DTO 예제. 어노테이션으로 검증 규칙을 선언한다.
public class UserDto {
@NotBlank
private String name;
@Email
private String email;
@Min(18)
private Integer age;
// getters, setters, constructors
}
컨트롤러에서의 사용
컨트롤러는 검증 트리거만 담당한다. 검증 오류 처리 책임은 전역 예외 처리기로 위임한다.
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public ResponseEntity createUser(@Valid @RequestBody UserDto dto) {
// 서비스 호출 등 처리
return ResponseEntity.status(HttpStatus.CREATED).body(dto);
}
}
표준화된 에러 응답 구조 설계
에러 응답은 다음을 포함하면 유용하다.
- 요약 메시지
- 필드별 상세 오류 목록
- 필요하면 에러 코드와 타임스탬프
public class ErrorResponse {
private String message;
private List errors;
// constructors, getters
}
public class FieldError {
private String field;
private String rejectedValue;
private String reason;
// constructors, getters
}
ControllerAdvice로 예외 처리
@ControllerAdvice를 사용하면 예외 처리 로직을 중앙에서 관리한다. MethodArgumentNotValidException을 잡아 앞서 설계한 응답으로 변환한다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleValidation(MethodArgumentNotValidException ex) {
List errors = ex.getBindingResult().getFieldErrors().stream()
.map(fe -> new FieldError(fe.getField(), String.valueOf(fe.getRejectedValue()), fe.getDefaultMessage()))
.collect(Collectors.toList());
ErrorResponse body = new ErrorResponse("Validation failed", errors);
return ResponseEntity.badRequest().body(body);
}
}
추가 고려 사항
- 다국어 메시지: 메시지 소스와 프로퍼티를 연동해 사용자 언어로 메시지 제공
- 에러 코드: 클라이언트가 처리하기 쉬운 코드 체계 병행
- 로깅: 민감 정보는 응답에서 제외하고 서버 로그에만 기록
- 유효성 검사 범위: 서비스 레이어에서 추가 도메인 검증 수행
결론
DTO에 검증 규칙을 모아두고 controller advice error response spring boot 패턴으로 validation error spring boot 처리 흐름을 표준화하면 코드 일관성과 사용자 경험이 개선된다. 위 예제를 기반으로 응답 형식, 코드 체계, 국제화 요구사항을 더해 실무에 맞게 확장하면 안정적인 입력 검증 시스템을 갖출 수 있다.