본문 바로가기
Spring Framework

BadRequest 로 응답해서 입력 값 제한하기

by 자유코딩 2019. 1. 16.

이전 글에서는 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 코드를 함께 리턴해줄 수 있다.

 

앱에서 회원 가입을 할 때 입력 값도 이렇게 검증 할 수 있을 것 같다.

댓글