REST API 만들기-2

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

Event 생성 API

TDD를 위한 테스트 작성

테스트 할것
입력값들을 전달하면 JSON 응답으로 201이 나오는지 확인.

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

    EventControllerTest 클래스 생성

    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
    27
    28
    29
    30
    31
    32
    33
    34
    @RunWith(SpringRunner.class)
    @WebMvcTest //web과 관련된 빈들이 등록 됨
    public class EventControllerTests {

    @Autowired
    MockMvc mockMvc; // 가짜 요청을 만들어 DispatcherServlet 에게 보내고 응답을 확인(웹서버를 띄우진 않음)

    @Autowired
    ObjectMapper objectMapper; //자동으로 빈으로 등록해줌
    @Test
    public void createEvent(){
    Event event = Event.builder()
    .name("Spring")
    .description("REST API Development with Spring")
    .beginEnrollmentDateTime(LocalDateTime.of(2018,11,23,14,22))
    .closeEnrollmentDateTime(LocalDateTime.of(2018,11,24,14,22))
    .beginEventDateTime(LocalDateTime.of(2018,11,25,14,22))
    .endEventDateTime(LocalDateTime.of(2018,11,26,14,22))
    .basePrice(100)
    .maxPrice(200)
    .limitOfEnrollment(100)
    .location("강남역 D2 스타텁 팩토리")
    .build();

    mockMvc.perform(post("/api/events")
    .contentType((MediaType).APPLICATION_JSON_UTF8)
    .accepot(MediaTypes.HAL_JSON)
    .content(objectMapper.writeValueAsString(event)))
    .andDo(print())
    .andExpect(status().isCreated()
    .andExpect(jsonPath("id").exists());
    }

    }

@WebMvcTest

  • MockMvc 빈을 자동 설정
  • 웹 관련 빈만 등록.(슬라이스)

MockMvc

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

ObjectMapper

  • 스프링 부트에 mapping Jackson이 의존성주입이 되있을경우 자동 빈등록

objectMapper.writeValueAsString(event)

  • 객체를 JSON으로 변환!

EventController 클래스 작성

1
2
3
4
5
6
7
8
9
10
@RequestMapping(value ="/api/events", produces = MediaTypes.HAL_JSON_UTF8_VALUE )
public class EventController{

@PostMapping
public ResponseEntity createEvent(@RequestMapping Event event){
URI createdUri = linkTo(EventController.class).slash("{id}").toUri();
event.setID(10); //우선 임의로 아이디값을 준다.
return ResponseEntity.created(createdUri).body(event);
}
}

테스트를 진행하면 정상적으로 실행이 된다.