REST API 만들기-6

스프링 기반 REST API 개발 -백기선님 인프런 강좌를 보고 작성하였습니다.

입력값이 이상한 경우 Bad Request 처리-1

EventControllerTests

1
2
3
4
5
6
7
8
public void createEvent_Bad_request_Empty_Input() throws Exception { //필요 이상 입력값 입력시 400오류
EventDto eventDto = EventDto.builder().build();

this.mockMvc.perform(post("/api/events")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(this.objectMapper.writeValueAsString(eventDto)))
.andExpect(status().isBadRequest());
}

빈 값을 보내는 테스트 케이스를 하나 만듭니다.
이 테스트는 빈 값을 보내기 때문에 BadRequest가 나오길 바라지만 테스트가 깨지게 됩니다.

하지만 입력값이 이상하지만 보내는 필드가 같기 때문에 요청이 처리가 되어버린다.

이러한 경우 @Valid와 BindingResult를 이용한다.

EventController

1
2
3
public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto,Errors errors){
...
}

컨트롤러에 EventDto에 Valid어노테이션을 추가하면 EventDto에 바인딩 할때 검증을 할 수 있습니다.
검증한 결과는 Errors에 담기게 됩니다.

EventDto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class EventDto {
@NotEmpty
private String name;
@NotEmpty
private String description;
@NotNull
private LocalDateTime beginEnrollmentDateTime;
@NotNull
private LocalDateTime closeEnrollmentDateTime;
@NotNull
private LocalDateTime beginEventDateTime;
@NotNull
private LocalDateTime endEventDateTime;
private String location; // (optional) 이게 없으면 온라인 모임
@Min(0)
private int basePrice; // (optional)
@Min(0)
private int maxPrice; // (optional)
@Min(0)
private int limitOfEnrollment;
}

@NotEmpty 와 NotNull을 이용하여 검증하여 줍니다.

EventController

다시 컨트롤러로 이동하여 아래 문장을 추가하여줍니다.

1
2
3
if(errors.hasErrors()){
return ResponseEntity.badRequest().build() ;
}

검증에 에러가 존재한다면 BadRequest를 응답으로 주게 됩니다.
이렇게 테스트 케이스는 성공을 하게 됩니다.