클라이언트에서 예약을 진행할 때 예약 내역을 저장하기 위해 {server}/api/reserve에 요청을 보낼 때 Request Body의 DTO에 시작 시간(startTime) 종료 시간(endTime)에 대한 필드가 존재한다. 기본적으로 종료 시간은 시작 시간보다 빠를 수 없다.
잘못된 요청 방식
테스트 결과 요청을 보낼 경우 종료 시간이 시작 시간보다 빨라도 저장이 되는 문제가 발생하였다. 해당 문제를 해결하기 위해서는 DTO에 시작 시간(startTime) 종료 시간(endTime)에 대한 필드가 존재할 경우 검증 로직을 거쳐 검증에 통과할 경우에만 해당 기능이 수행될 수 있도록 수정해야 한다.
모든 Controller에 DTO에 대한 검증 코드를 추가하는 것은 이후 수정이나 새로운 Controller가 발생할 경우 추가적인 작업이 많아질 수 있기 때문에 Spring에서 제공하는 AOP 기능을 활용하여 문제를 해결한다.
@Target 어노테이션은 이 어노테이션이 적용될 수 있는 대상을 지정합니다. 이 경우, ElementType.TYPE은 클래스, 인터페이스, 열거형 등의 유형에 적용될 수 있음을 의미하며, ElementType.FIELD와 ElementType.PARAMETER는 필드와 메서드 매개변수에 적용될 수 있음을 나타낸다.
@Retention(RetentionPolicy.RUNTIME):
@Retention 어노테이션은 이 어노테이션이 유지될 수 있는 시점을 지정합니다. RetentionPolicy.RUNTIME은 런타임 시에 어노테이션 정보를 읽을 수 있음을 의미한다. 이것은 사용자 정의 유효성 검사 어노테이션을 런타임에 검사하는 데 필요하다.
@Constraint(validatedBy = CustomValidator.class):
@Constraint 어노테이션은 사용자 지정 유효성 검사 어노테이션을 정의할 때 필요한 메타 어노테이션이다. validatedBy 속성은 이 사용자 지정 유효성 검사 어노테이션을 처리할 CustomValidator 클래스를 지정한다. CustomValidator는 실제 유효성 검사 로직을 구현한 클래스이다.
✏️ Description
클라이언트에서 예약을 진행할 때 예약 내역을 저장하기 위해
{server}/api/reserve
에 요청을 보낼 때 Request Body의 DTO에 시작 시간(startTime
) 종료 시간(endTime
)에 대한 필드가 존재한다. 기본적으로 종료 시간은 시작 시간보다 빠를 수 없다.잘못된 요청 방식
테스트 결과 요청을 보낼 경우 종료 시간이 시작 시간보다 빨라도 저장이 되는 문제가 발생하였다. 해당 문제를 해결하기 위해서는 DTO에 시작 시간(
startTime
) 종료 시간(endTime
)에 대한 필드가 존재할 경우 검증 로직을 거쳐 검증에 통과할 경우에만 해당 기능이 수행될 수 있도록 수정해야 한다.모든 Controller에 DTO에 대한 검증 코드를 추가하는 것은 이후 수정이나 새로운 Controller가 발생할 경우 추가적인 작업이 많아질 수 있기 때문에 Spring에서 제공하는 AOP 기능을 활용하여 문제를 해결한다.
🔥 Solution
ConstraintValidator
를 이용하여 예외처리 작업을 처리하였다.CustomValidator
ConstraintValidator
를 implement.initailize
메소드와isValid
메소드를 구현한다.isValid
메소드에서 해당 객체에 필요한 검증 로직을 작성한 후 통과하면true
를 통과하지 못하면false
를 반환한다.CustomConstraint
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}):
@Retention(RetentionPolicy.RUNTIME):
@Constraint(validatedBy = CustomValidator.class):