[SpringBoot API] Springboot REST API : 이벤트 생성 API 개발

Cover image

이벤트 생성 API 개발


이벤트 생성 API 구현 : 이벤트 API 테스트 클래스 생성

스프링 부트 슬라이스 테스트

  • @WebMvcTest

    • MockMvc 빈을 자동 설정 해준다. 따라서 그냥 가져와서 쓰면 됨.
    • 웹 관련 빈만 등록해 준다. (슬라이스)

MockMvc스프링

  • MVC 테스트 핵심 클래스
  • 웹 서버를 띄우지 않고도 스프링 MVC (DispatcherServlet)가 요청을 처리하는 과정을 확인할 수 있기 때문에 컨트롤러 테스트용으로 자주 쓰임.

테스트 할 것입력

  • 값들을 전달하면 JSON 응답으로 201이 나오는지 확인.

    • Location 헤더에 생성된 이벤트를 조회할 수 있는 URI 담겨 있는지 확인.
    • id는 DB에 들어갈 때 자동생성된 값으로 나오는지 확인
  • 입력값으로 누가 id나 eventStatus, offline, free 이런 데이터까지 같이 주면?

    • Bad_Request로 응답 vs 받기로 한 값 이외는 무시
  • 입력 데이터가 이상한 경우 Bad_Request로 응답

    • 입력값이 이상한 경우 에러
    • 비즈니스 로직으로 검사할 수 있는 에러
    • 에러 응답 메시지에 에러에 대한 정보가 있어야 한다.
  • 비즈니스 로직 적용 됐는지 응답 메시지 확인

    • offline과 free 값 확인
  • 응답에 HATEOA와 profile 관련 링크가 있는지 확인.

    • self (view)
    • update (만든 사람은 수정할 수 있으니까)
    • events (목록으로 가는 링크)
  • API 문서 만들기

    • 요청 문서화
    • 응답 문서화
    • 링크 문서화
    • profile 링크 추가

이벤트 생성 API 구현 : 201 응답 받기

@RestController

  • @ResponseBody를 모든 메소드에 적용한 것과 동일하다.

ResponseEntity를 사용하는 이유

  • 응답 코드, 헤더, 본문 모두 다루기 편한 API

Location URI 만들기

  • HATEOS가 제공하는 linkTo(), methodOn() 사용

객체를 JSON으로 변환

  • ObjectMapper 사용

테스트 할 것

  • 입력값들을 전달하면 JSON 응답으로 201이 나오는지 확인.

    • Location 헤더에 생성된 이벤트를 조회할 수 있는 URI 담겨 있는지 확인.
    • id는 DB에 들어갈 때 자동생성된 값으로 나오는지 확인

이벤트 생성 API 구현 : EventRepository 구현

스프링 데이터 JPA

  • JpaRepository 상속 받아 만들기

Enum을 JPA 맵핑시 주의할 것

  • @Enumerated(EnumType.STRING)

@MockBean

  • Mockito를 사용해서 mock 객체를 만들고 빈으로 등록해 줌.
  • (주의) 기존 빈을 테스트용 빈이 대체 한다.

테스트 할 것

  • 입력값들을 전달하면 JSON 응답으로 201이 나오는지 확인.

    • Location 헤더에 생성된 이벤트를 조회할 수 있는 URI 담겨 있는지 확인.
    • id는 DB에 들어갈 때 자동생성된 값으로 나오는지 확인

이벤트 생성 API 구현 : 입력값 제한하기

입력값 제한

  • id 또는 입력 받은 데이터로 계산해야 하는 값들은 입력을 받지 않아야 한다.
  • EventDto 적용

DTO -> 도메인 객체로 값 복사

  • ModelMapper
<dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>2.3.1</version>
</dependency>

통합 테스트로 전환

  • @WebMvcTest 빼고 다음 애노테이션 추가

    • @SpringBootTest
    • @AutoConfigureMockMvc
  • Repository @MockBean 코드 제거

테스트 할 것

  • 입력값으로 누가 id나 eventStatus, offline, free 이런 데이터까지 같이 주면?

    • Bad_Request로 응답 vs 받기로 한 값 이외는 무시

이벤트 생성 API 구현 : 입력값 이외에 에러 발생

ObjectMapper 커스터마이징

  • spring.jackson.deserialization.fail-on-unknown-properties=true

테스트 할 것

  • 입력값으로 누가 id나 eventStatus, offline, free 이런 데이터까지 같이 주면?

    • Bad_Request로 응답 vs 받기로 한 값 이외는 무시

이벤트 생성 API 구현 : Bad Request 처리하기

@Valid와 BindingResult (또는 Errors)

  • BindingResult는 항상 @Valid 바로 다음 인자로 사용해야 함. (스프링 MVC)
  • @NotNull, @NotEmpty, @Min, @Max, ... 사용해서 입력값 바인딩할 때 에러 확인할 수 있음

도메인 Validator 만들기

  • Validator 인터페이스 없이 만들어도 상관없음

테스트 설명 용 애노테이션 만들기

  • @Target, @Retention

테스트 할 것

  • 입력 데이터가 이상한 경우 Bad_Request로 응답

    • 입력값이 이상한 경우 에러
    • 비즈니스 로직으로 검사할 수 있는 에러
    • 에러 응답 메시지에 에러에 대한 정보가 있어야 한다.

이벤트 생성 API 구현 : Bad Request 응답 본문 만들기

커스텀 JSON Serializer 만들기

  • extends JsonSerializer (Jackson JSON 제공)
  • @JsonComponent (스프링 부트 제공)

BindingError

  • FieldError 와 GlobalError (ObjectError)가 있음
  • objectName
  • defaultMessage
  • code
  • field
  • rejectedValue

테스트 할 것

  • 입력 데이터가 이상한 경우 Bad_Request로 응답

    • 입력값이 이상한 경우 에러
    • 비즈니스 로직으로 검사할 수 있는 에러
    • 에러 응답 메시지에 에러에 대한 정보가 있어야 한다.

이벤트 생성 API 구현 : 비즈니스 로직 적용

테스트 할 것

  • 비즈니스 로직 적용 됐는지 응답 메시지 확인

    • offline과 free 값 확인

이벤트 생성 API 구현 : 매개변수를 이용한 테스트

테스트 코드 리팩토링

  • 테스트에서 중복 코드 제거
  • 매개변수만 바꿀 수 있으면 좋겠는데?
  • JUnitParams

JUnitParams

<!-- https://mvnrepository.com/artifact/pl.pragmatists/JUnitParams -->
<dependency>
    <groupId>pl.pragmatists</groupId>
    <artifactId>JUnitParams</artifactId>
    <version>1.1.1</version>
    <scope>test</scope>
</dependency>