REST API (4) Event 생성 API - Bad Request 처리하기
오늘의 목표 : 입력값이 이상한 경우 Bad Request 보내는 방법
입력값이 이상한 경우란 : 유효성 검사(Java Bean Validation) 를 실패하거나, DTO에 정의된 값 이외의 것을 보내는 것 이라고 정의 하겠다.
오늘의 목차 :
1. DTO에 정의된 값 이외의 것을 보내는 것 에 대한 Bad Request 처리
2. 유효성 검사(Java Bean Validation) 를 통한 Bad Request 처리
1. DTO에 정의된 값 이외의 것을 보내는 것 에 대한 Bad Request 처리
createEvent 수정

EventDto로 변경하면서 id, free, offline, eventStatus와 같은 불필요한 데이터는 더 이상 요청에 포함될 필요가 없어져 제거
createEvent_BadRequest 테스트 작성

createEvent_BadRequest 테스트는 우리가 설정을 추가하지 않았기 때문에 실패한다.

우리는 400 을 원했지만, 201 status 가 반환
application.properties 에 추가

spring.jackson.deserialization.fail-on-unknown-properties=true 설정은 Spring Boot 애플리케이션에서 Jackson JSON 라이브러리의 기본 동작을 제어하는 데 사용된다. 이 설정은 Jackson이 JSON 데이터를 역직렬화할 때 알려지지 않은 속성(unknown properties)이 포함되어 있으면 실패하도록 설정한다.
테스트가 다음과 같이 status 400 으로 성공 하는 것을 볼 수 있다.

2. 유효성 검사(Java Bean Validation) 를 통한 Bad Request 처리
2-1. 입력값이 없을 때 Bad Request 처리


입력값이 완전 없는 값을 전달했지만 Bad Request 가 아닌 create 코드가 나오는 것을 볼 수 있다.
유효성 검사(Java Bean Validation) 를 통해 해결하자.
EventDto에 검증 어노테이션 추가

유효성 검사 (@Valid와 BindingResult 또는 Errors)

@Valid 사용 시 EventDto 바인딩 할 때 EventDto에 설정되어 있는 어노테이션 정보를 참고하여검증을 수행한다. 만약 검증에 실패하면 Errors 에 에러 정보를 담게된다.
Errors 에러가 있다면 BadRequest 반환

2-2. 비즈니스 로직으로 Bad Request 처리

endEventDateTime 가 beginEventDateTime 보다 작고, maxPrice 가 0보다 크면 서 basePrice 가 maxPrice 보다 크게 된다면 입력값이 잘못된 것이다.
다음 테스트를 돌렸을 때 우리는 BadRequest 면 좋겠지만 다음 테스트는 실패할 것이다.

EventValidator 작성( 비즈니스 로직 유효성 처리)

EventController 수정

@InitBinder 어노테이션 사용하여 "eventDto" 가 모든 메서드에서 바인딩 될 때 유효성 검사를 진행한다. 만약 유효성 검사에 실패한다면 Errors 에 에러가 담기게 된다.
에러가 있을경우 badRequest 반환한다.
