Controller 로직입니다.
- Pageable 객체와 검색조건을 QueryParam으로 받아서, mapService를 호출합니다.
MapServiceImpl 로직입니다.
- 지도 이름 검색조건이 있을시 없을시에 따라서 Query를 다르게 호출하도록 했습니다.
- fullDisclosure 필드의 의미는 지도 전체 공개, 비공개의 의미로 true일 경우 전체공개지도입니다.
MapRepository의 경우 (SpringDataJpa)JpaRepository를 통해서 NamedQuery를 활용했습니다.
Join과 paging 쿼리를 함께 사용할 때, count쿼리를 수정해주어야하는 이유입니다.
page
는 offset
(page * size)으로 작동하게 됩니다.커넥션 타임아웃이 지속적으로 발생하는 것을 확인할 수 있습니다.
위에서 DB에 직접 쿼리를 통해서 확인했던 것과 같이 쿼리 응답시간이 너무 오래걸리게 되어서, timeout이 발생하게 됩니다.
이전 map 데이터를 1000개 넣고 테스트했을 때는 정상적으로 작동했던 API가 제 기능을 하지 못하는 것을 확인할 수 있습니다.
/map/public?lastMapId=1000
SimpleSlice
는 직접만든 클래스로, Slice에서 제가 필요한 정보만 담도록 구현했습니다. JPA를 통해서 쿼리를 JPQL로 짜게되면, limit를 사용할 수 없습니다.
SpringDataJpa를 통해서 Named query를 활용한다면 findMapsTop10
과 같이 조회할 데이터의 갯수를 지정해줄 수 있지만,
요청 size를 고정하지 않도록 요구사항이 변경된다면 활용할 수 없습니다.
다른 방법으로는 native query를 활용해서 직접 쿼리를 구성하는 방법이 있습니다.
Chunk
의 경우 Pageable의 유무에 따라서 반환되는 size의 갯수와 요청된 size의 갯수를 다르게 반환합니다.