728x90
스프링 기반 REST API 개발
4. 이벤트 목록 조회 및 수정 REST API 개발
포스팅 참조 정보
GitHub
공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다
해당 포스팅에 대한 내용의 GitHub 주소
실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다
https://github.com/freespringlecture/spring-rest-api-study/tree/chap04-01_event_list_select
해당 포스팅 참고 인프런 강의
https://www.inflearn.com/course/spring_rest-api/dashboard
실습 환경
- Java Version: Java 11
- SpringBoot Version: 2.1.2.RELEASE
1. Event 목록 조회 API 구현
페이징, 정렬 어떻게 하지?
- 스프링 데이터 JPA가 제공하는 Pageable
Page<Event>
에 안에 들어있는 Event 들은 리소스로 어떻게 변경할까?
- 하나씩 순회하면서 직접 EventResource로 맵핑을 시킬까..
PagedResourceAssembler<T>
사용하기
EventController에 queryEvents 메서드 추가
PagedResourceAssembler<T>
를 사용하는 queryEvents 메서드 추가
...
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PagedResourcesAssembler;
import org.springframework.web.bind.annotation.GetMapping;
/**
* Event Create API
* @param eventDto
* @param errors
* @return
*/
@PostMapping
public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) {
...
// eventResource.add(new Link("/docs/index.html").withRel("profile")); 를 아래와 같이 변경
eventResource.add(new Link("/docs/index.html#resources-events-create").withRel("profile"));
...
}
/**
* Event List Select API
* @param pageable
* @param assembler
* @return
*/
@GetMapping
public ResponseEntity queryEvents(Pageable pageable, PagedResourcesAssembler<Event> assembler) {
Page<Event> page = this.eventRepository.findAll(pageable);
var pagedResources = assembler.toResource(page, e -> new EventResource(e));
//profile로 가는 Link를 추가
pagedResources.add(new Link("/docs/index.html#resources-events-list").withRel("profile"));
return ResponseEntity.ok(pagedResources);
}
테스트 할 때 Pageable 파라미터 제공하는 방법
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web
- page: 0부터 시작
- size: 기본값 20
- sort: property, property(ASC|DESC)
EventControllerTests 에 queryEvents 테스트 코드 추가
@Autowired
EventRepository eventRepository;
...
@Test
@TestDescription("30개의 이벤트를 10개씩 두번째 페이지 조회하기")
public void queryEvents() throws Exception {
//Given
IntStream.range(0, 30).forEach(this::generateEvent);
// When
this.mockMvc.perform(get("/api/events")
.param("page", "1")
.param("size", "10")
.param("sort", "name,DESC")
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("page").exists())
.andExpect(jsonPath("_embedded.eventList[0]._links.self").exists())
.andExpect(jsonPath("_links.self").exists())
.andExpect(jsonPath("_links.profile").exists())
.andDo(document("query-events"))
;
}
private void generateEvent(int index) {
Event event = Event.builder()
.name("event " + index)
.description("test event")
.build();
this.eventRepository.save(event);
}
테스트 할 것
- Event 목록 Page 정보와 함께 받기
content[0].id
확인- pageable 경로 확인
- Sort과 Paging 확인
- 30개를 만들고, 10개 사이즈로 두번째 페이지 조회하면 이전, 다음 페이지로 가는 링크가 있어야 한다.
- 이벤트 이름순으로 정렬하기
- page 관련 링크
- Event를 EventResource로 변환해서 받기
- 각 이벤트 마다 self
var pagedResources = assembler.toResource(page, e -> new EventResource(e));
- 각 이벤트 마다 self
- 링크 확인
- self
- profile
- (create)
- 문서화
728x90
'개발강의정리 > Spring' 카테고리의 다른 글
[스프링 기반 REST API 개발] 4-3. Events 수정 API 구현 (0) | 2020.03.30 |
---|---|
[스프링 기반 REST API 개발] 4-2. Event 조회 API 구현 (0) | 2020.03.29 |
[스프링 기반 REST API 개발] 3-8. API 인덱스 만들기 (0) | 2020.03.27 |
[스프링 기반 REST API 개발] 3-7. 테스트용 DB와 설정 분리하기 (0) | 2020.03.26 |
[스프링 기반 REST API 개발] 3-6. 스프링 REST Docs: 문서 빌드 (0) | 2020.03.25 |
댓글