728x90
스프링 기반 REST API 개발
4. 이벤트 목록 조회 및 수정 REST API 개발
포스팅 참조 정보
GitHub
공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다
해당 포스팅에 대한 내용의 GitHub 주소
실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다
https://github.com/freespringlecture/spring-rest-api-study/tree/chap04-03_event_update
해당 포스팅 참고 인프런 강의
https://www.inflearn.com/course/spring_rest-api/dashboard
실습 환경
- Java Version: Java 11
- SpringBoot Version: 2.1.2.RELEASE
3. Events 수정 API 구현
EventController에 updateEvent 메서드 추가
@PutMapping("/{id}")
public ResponseEntity updateEvent(@PathVariable Integer id, @RequestBody @Valid EventDto eventDto, Errors errors) {
Optional<Event> optionalEvent = this.eventRepository.findById(id);
if(optionalEvent.isEmpty()) {
return ResponseEntity.notFound().build();
}
if(errors.hasErrors()) {
return badRequest(errors);
}
this.eventValidator.validate(eventDto, errors);
if(errors.hasErrors()) {
return badRequest(errors);
}
Event existingEvent = optionalEvent.get();
this.modelMapper.map(eventDto, existingEvent);
Event saveEvent = this.eventRepository.save(existingEvent);
EventResource eventResource = new EventResource(saveEvent);
eventResource.add(new Link("/docs/index.html#resources-events-update").withRel("profile"));
return ResponseEntity.ok(eventResource);
}
EventControllerTests에 updateEvent 테스트 코드 추가
@Autowired
ModelMapper modelMapper;
@Test
@TestDescription("이벤트를 정상적으로 수정하기")
public void updateEvent() throws Exception {
// Given
Event event = this.generateEvent(200);
EventDto eventDto = this.modelMapper.map(event, EventDto.class);
String eventName = "Updated Event";
eventDto.setName(eventName);
// When & Then
this.mockMvc.perform(put("/api/events/{id}", event.getId())
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(this.objectMapper.writeValueAsString(eventDto)))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("name").value(eventName))
.andExpect(jsonPath("_links.self").exists())
.andDo(document("update-event"))
;
}
@Test
@TestDescription("입력값이 비어있는 경우에 이벤트 수정 실패")
public void updateEvent400_Empty() throws Exception {
// Given
Event event = this.generateEvent(200);
EventDto eventDto = new EventDto();
// When & Then
this.mockMvc.perform(put("/api/events/{id}", event.getId())
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(this.objectMapper.writeValueAsString(eventDto)))
.andDo(print())
.andExpect(status().isBadRequest());
}
@Test
@TestDescription("입력값이 잘못된 경우에 이벤트 수정 실패")
public void updateEvent400_Wrong() throws Exception {
// Given
Event event = this.generateEvent(200);
EventDto eventDto = this.modelMapper.map(event, EventDto.class);
eventDto.setBasePrice(20000);
eventDto.setMaxPrice(1000);
// When & Then
this.mockMvc.perform(put("/api/events/{id}", event.getId())
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(this.objectMapper.writeValueAsString(eventDto)))
.andDo(print())
.andExpect(status().isBadRequest());
}
@Test
@TestDescription("존재하지 않는 이벤트 수정 실패")
public void updateEvent404() throws Exception {
// Given
Event event = this.generateEvent(200);
EventDto eventDto = this.modelMapper.map(event, EventDto.class);
// When & Then
this.mockMvc.perform(put("/api/events/123123")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(this.objectMapper.writeValueAsString(eventDto)))
.andDo(print())
.andExpect(status().isNotFound());
}
// generateEvent builder에 셋팅 값 추가
private Event generateEvent(int index) {
Event event = Event.builder()
.name("event " + index)
.description("test event")
.beginEnrollmentDateTime(LocalDateTime.of(2018, 11, 23, 14, 21))
.closeEnrollmentDateTime(LocalDateTime.of(2018, 11, 24, 14, 21))
.beginEventDateTime(LocalDateTime.of(2018, 11, 25, 14, 21))
.endEventDateTime(LocalDateTime.of(2018, 11, 26, 14, 21))
.basePrice(100)
.maxPrice(200)
.limitOfEnrollment(100)
.location("강남역 D2 스타텁 팩토리")
.free(false)
.offline(true)
.eventStatus(EventStatus.DRAFT)
.build();
return this.eventRepository.save(event);
}
테스트 할 것
- 수정하려는 이벤트가 없는 경우 404 NOT_FOUND
- 입력 데이터 (데이터 바인딩)가 이상한 경우에 400 BAD_REQUEST
- 도메인 로직으로 데이터 검증 실패하면 400 BAD_REQUEST
- (권한이 충분하지 않은 경우에 403 FORBIDDEN)
정상적으로 수정한 경우에 이벤트 리소스 응답
- 200 OK
- 링크
- 수정한 이벤트 데이터
728x90
'개발강의정리 > Spring' 카테고리의 다른 글
[스프링 기반 REST API 개발] 5-1. Account 도메인 추가 (0) | 2020.04.01 |
---|---|
[스프링 기반 REST API 개발] 4-4. 테스트 코드 리팩토링 (0) | 2020.03.31 |
[스프링 기반 REST API 개발] 4-2. Event 조회 API 구현 (0) | 2020.03.29 |
[스프링 기반 REST API 개발] 4-1. Event 목록 조회 API 구현 (0) | 2020.03.28 |
[스프링 기반 REST API 개발] 3-8. API 인덱스 만들기 (0) | 2020.03.27 |
댓글