RESTAPI
RESTAPI - Event 생성 API 구현 - 입력값 제한
엔꾸꾸
2019. 8. 7. 22:48
REST API - Event 생성 API 구현 - 입력값 제한
입력값 제한
-
ID 혹은 입력받은 데이터로 부터 계산해야하는 값들은 입력을 받지 않아야한다.
-
애노테이션 을 활용한다.
-
DTO를 생성하여 활용한다.
-
DTO를 생성하여 활용하는 방법을 선택
- 이유 ?
- 도메인 클래스에 애노테이션이 많아 진다.
- 클래스가 지저분해지고 뭐가 뭔지 알아보기 힘들어진다.
- 단점 ?
- 중복이 발생한다.
- 이유 ?
-
EventDTO
Event 생성 API
- EventDto를 활용하여 입력값을 제한하여 데이터를 받아온다.
- ObjectMapper로 EventDto를 EventEntity로 변환
- 변환된 EventEntity로 save ..
기존의 테스트코드가 깨진다 ?!
- 테스트코드가 에러가발생
- NullPointerException 발생
- ControllerLinkBuilder linkBuilder = linkTo(EventController.class).slash(savedEvent.getId());
- 왜 에러가 났을까 ?
- Mocking이 적용되지 않는다.
- 파라메터로 Event객체를 그대로 사용하지 않고, HandlerMethod 내부에서 새롭게 생성한 객체이기 때문에 Mocking이 제대로 되지 않는다.
- 테스트코드가 에러가발생
- Mocking이 적용되지않음
- event객체를 전달한 객체를 그대로 리턴하지않고 핸들러 메서드에서 새로 생성한 객체이기 때문에 Mocking이 제대로 되지 않음
- save() 메서드로 전달된 객체는 Handler Method 내부에서 새로 만들어진 객체이다 !!
- Mocking이 되지않았기때문에 null이 return 되고, null에 대한 id를 받아왔기때문에 nullpointerexception 발생
해결방법
-
- save() 메서드로 전달되는 Event객체가 어떤 객체던간에 TEST Code에서 만든 Event객체를 생성하도록 변경
- Mockito.any()
- method parameter에 대한 Mocking
- Mockito.any()
- save() 메서드로 전달되는 Event객체가 어떤 객체던간에 TEST Code에서 만든 Event객체를 생성하도록 변경
- 문제점
- 입력값을 제한하였지만 입력값이 제한되어 전달됬는지에 대한 테스트가 되지않는다.
- 다른 해결방법이 필요하다.
-
- eventRepository 를 Mocking하지않는다.
- @SpringBootTest 로 변경
- @WebMvcTest 는 Web과 관련된 빈들만 등록되기 때문에 EventRepository는 Bean으로 등록되지않는다.
- EventRepository 를 주입받을수 없다.
- WebEnvironment 속성의 기본값이 MOCK 이기 때문에 mocking된 Dispatcher Servlet을 만들도록 되어있다.
- MockMvc 를 사용하여 테스트가 가능하다.
- @AutoConfigureMockMvc
- @WebMvcTest는 MockMvc설정을 자동으로 해주지만 @SpringBootTest는 그렇지않다.
- MockMvc 를 자동으로 등록해주는 @AutoConfigureMockMvc 를 사용한다.
- Web과 관련된 테스트시 @SpringBootTest를 사용하자
- @WebMvcTest 를 사용하면 Mocking해야할 객체가 너무 많다.
- @SpringBootTest 로 변경
- eventRepository 를 Mocking하지않는다.
-
@SpringBootTest
- @AutoConfigureMockMvc
- 테스트 코드
- 입력값을 제한하여 받기때문에 free, offline, eventStatus 이 입력된 값이 등록이 되지 않아야한다.
정리
- 생성 API에 등록 요청시 원치않은 입력값이 들어올 경우 선택방안 ?
-
- 입력값을 제한한다.
-
- 원치않은 값들은 무시한다.
-
- 입력값을 제한하는데 사용하는 방법 ?
-
- DTO를 생성한다.
-
- 애노테이션 기반의 매핑을 사용한다.
-
- 모두 각각의 장단점이 존재한다.
- 필자는 좀더 확실하고 버그가 발생하지않는 방법을 선호
- DTO를 활용하여 입력값을 제한하는 방법을 선택
- DTO 클래스만 보아도 등록시 어떤 값들을 허용하는지 확실하게 판단가능
- 도메인 클래스는 최대한 더럽히지 말것.