Spring Boot에서는 @Valid를 사용하여 입력 데이터를 검증할 수 있다. DTO 클래스에 유효성 검증 조건을 선언하면, 컨트롤러에서 요청 데이터를 자동으로 검증한다.
DTO
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserRequestDto {
@Email(message = "이메일 형식이 올바르지 않습니다.")
@NotBlank(message = "이메일은 필수 입력값입니다.")
private String email;
@Size(min = 8, message = "비밀번호는 최소 8자 이상이어야 합니다.")
@NotBlank(message = "비밀번호는 필수 입력값입니다.")
private String password;
@NotBlank(message = "사용자 이름은 필수 입력값입니다.")
private String username;
}
@Valid로 유효성 검사를 수행하면, 검증 실패 시 Spring이 MethodArgumentNotValidException을 발생시킨다. 하지만 별도의 처리를 해주지 않으면 IDE 콘솔에는 예외 메시지가 출력되지만, Postman을 이용해 테스트 할 때는 예외 메시지가 출력되지 않아 창을 이동해가며 어떤 예외가 발생했는지 확인해야하는 번거로움이 있다.
이 부분을 커스텀 예외처리로 해결해보았다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class ValidationExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {
String errorMessage = exception.getBindingResult()
.getFieldErrors()
.stream()
.findFirst()
.map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
.orElse("Invalid input");
CustomErrorResponseDto errorResponse = new CustomErrorResponseDto(HttpStatus.BAD_REQUEST, errorMessage);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}
검증 실패 시 반환할 JSON 응답을 커스텀 객체로 정의한다. 이를 통해 응답 형식을 표준화하고, 클라이언트가 처리하기 쉽게 구성할 수 있다.
package com.example.gametalk.exception;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
@Getter
@RequiredArgsConstructor
public class CustomErrorResponseDto {
private final HttpStatus httpStatus;
private final String message;
}
"Validation failed for object='userRequestDto'. Errir count: 1" 이 출력되면서 하나의 예외가 발생했다고 알려주지만 이름, 이메일, 비밀번호 중 어디가 문제가 발생했는지 바로 알 수 없다.
이렇듯 IntelliJ 콘솔에서 확인해야 한다.
httpStatus와 어느 부분에서 예외가 발생했는지 직관적으로 전달할 수 있다.