이전 글에서는 Dto 클래스를 사용해서 입력 값을 제한하는 방법을 알아봤다.
이번 글에서는 Bad Request 로 응답해서 입력 값을 제한하는 방법을 알아본다.
컨트롤러부터 차례대로 코드를 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
@PostMapping
public ResponseEntity createEvent(@RequestBody EventDto eventDto){ // 모델매퍼를 활용해서 EventDTO 를 Event 로 바꾼다.
// Event event = Event.builder() 1. ModelMapper 를 사용하지 않는 방법
// .name(eventDto.getName())
// .description(eventDto.getDescription())
//ModelMapper 를 사용하는 방법
Event event = modelMapper.map(eventDto , Event.class); // 위에 사용하지 않는 방법은 많은 값을 입력한다. //ModelMapper 를 사용하면 이 1줄로 들어온 모든 값을 1세팅 할 수 있다.
Event newEvent = this.eventRepository.save(event);
URI createUri = linkTo(EventController.class).slash(newEvent.getId()).toUri();
event.setId(10);
return ResponseEntity.created(createUri).body(event);
} |
cs |
이전 글처럼 Dto 클래스로 입력 값을 받고 있다.
json 데이터를 객체를 변환하고 있다.
Dto 클래스를 보겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
@Builder @NoArgsConstructor @AllArgsConstructor
@Getter @Setter
public class EventDto {
private String name;
private String description;
private LocalDateTime beginEnrollmentDateTime;
private LocalDateTime closeEnrollmentDateTime;
private LocalDateTime beginEventDateTime;
private LocalDateTime endEventDateTime;
private String location; // location 값이 없다면 온라인 모임
private int basePrice; // optional
private int maxPrice; // optional
private int limitOfEnrollment;
}
|
cs |
일단 이 클래스에는 id 필드가 없다.
이제 id 필드를 포함해서 요청을 보내 본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
@Test
public void createEvent_Bad_Request() throws Exception {
Event event = Event.builder()
.id(100)
.name("Spring")
.description("REST API Development with Spring")
.beginEnrollmentDateTime(LocalDateTime.of(2018,11,1,10,0))
.closeEnrollmentDateTime(LocalDateTime.of(2018,11,5,10,0))
.beginEventDateTime(LocalDateTime.of(2018,11,25,10,0))
.endEventDateTime(LocalDateTime.of(2018,11,26,10,0))
.basePrice(100)
.maxPrice(200)
.limitOfEnrollment(100)
.location("로케이션")
.free(true)
.offline(false)
.eventStatus(EventStatus.PUBLISHED)
.build();
mockMvc.perform(post("/api/events/") //perform 안에는 요청 uri 를 적는다.
.contentType(MediaType.APPLICATION_JSON_UTF8) //요청 content type
.accept(MediaTypes.HAL_JSON) //응답 Media 타입
.content(objectMapper.writeValueAsString(event))) // HAL = Hypertext Application Language , 응답 내용을 ObjectMapper 로 작성한다.(JSON)
.andDo(print()) // 요청 정보를 모두 출력한다.
.andExpect(status().isBadRequest()); // 응답이 어떤지 확인한다. - andExpect()
} |
cs |
id 를 포함시켜서 요청을 보낸다.
이렇게 작성하면 원래는 테스트 케이스가 실패한다.
이제 application.properties 에 코드를 한줄 작성한다.
spring.jackson.deserialization.fail-on-unknown-properties=true
이렇게 작성하면 Dto 클래스에 없는 필드가 입력으로 들어오면 400 응답코드를 발생시킨다.
이렇게 하면 앱에서 API 로 잘못된 입력 값을 보냈을 때 400 코드를 함께 리턴해줄 수 있다.
앱에서 회원 가입을 할 때 입력 값도 이렇게 검증 할 수 있을 것 같다.
'Spring Framework' 카테고리의 다른 글
@Notnull , @Min 으로 검증 할 수 없는 입력 값 검증하기 - Validator 클래스 만들기 (0) | 2019.01.18 |
---|---|
@Valid 애너테이션 사용해서 값 검증하기 (2) | 2019.01.17 |
Spring boot REST API 개발 - Dto 클래스로 입력 값 제한하기 (0) | 2019.01.11 |
java.lang.reflect.InvocationTargetException: null (0) | 2019.01.10 |
maven , gradle 빌드 명령어 (0) | 2019.01.10 |
댓글