You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
계층적인 컬렉션을 구상하였을 때 '아... N+1 문제 어떻게 해결하지' 라는 생각이 먼저 들었습니다.
물론, Spring Boot JPA의 Fetch Join이나 EntityGraph 등 여러 방법이 있고 적용한 경험이 있지만 Ktor Framework에서 해결할 수 있는지 알 수 없었기 때문에 걱정이 있었습니다.
✏️ 일단 부딪쳐보자~
여러 API를 완성하고 컬렉션 목록 가져오기 API를 만들어야 할 때가 왔습니다.
첫 번째로, 조인을 사용하는 방법을 구상했습니다.
조인된 Row를 가져올 수 있지만, 데이터 가공이 어려웠기 때문에 다른 방법을 찾아야 했습니다.
두 번째로, Kotlin Exposed DAO를 사용했습니다.
DAO는 유용한 메서드와 자동 매핑을 지원하기 때문에 가능하지 않을까 생각했습니다.
DAO의 즉시 로딩을 사용해 같은 계층의 컬렉션을 한 번에 가져오는 쿼리를 사용할 수 있었습니다.
하지만 DAO의 메서드를 사용하면 쿼리가 중복으로 요청되는 문제가 추가로 발생하였습니다.
중복된 IS NULL LIMIT 20 쿼리
세 번째로, Kotlin Exposed DSL을 사용했습니다.
DAO에서 IN 쿼리가 보내지는 걸 확인하고 DSL로 시도하게 되었습니다.
컬렉션 뿐만 아니라 연관된 하이라이트까지 IN 쿼리로 요청하면서 N+1 문제를 해결할 수 있었습니다.
한 번만 수행되는 IS NULL LIMIT 20 쿼리
마지막으로, IN 쿼리의 성능을 확인했습니다.
EXPLAIN문 쿼리로 DB가 어떤 SCAN을 확인할 수 있습니다.
필터링된 100개의 row에 대해 최대 37개의 아이디로 조회했을 때, Index Range Scan을 통해 접근하였습니다.
계층적인 컬렉션을 구상하였을 때 '아... N+1 문제 어떻게 해결하지' 라는 생각이 먼저 들었습니다.
물론, Spring Boot JPA의
Fetch Join
이나EntityGraph
등 여러 방법이 있고 적용한 경험이 있지만Ktor Framework에서 해결할 수 있는지 알 수 없었기 때문에 걱정이 있었습니다.
✏️ 일단 부딪쳐보자~
여러 API를 완성하고 컬렉션 목록 가져오기 API를 만들어야 할 때가 왔습니다.
첫 번째로, 조인을 사용하는 방법을 구상했습니다.
두 번째로, Kotlin Exposed DAO를 사용했습니다.
DAO의 즉시 로딩을 사용해 같은 계층의 컬렉션을 한 번에 가져오는 쿼리를 사용할 수 있었습니다.
세 번째로, Kotlin Exposed DSL을 사용했습니다.
마지막으로, IN 쿼리의 성능을 확인했습니다.
필터링된 100개의 row에 대해 최대 37개의 아이디로 조회했을 때, Index Range Scan을 통해 접근하였습니다.
최적화하는 과정에서 데이터베이스와 Ktor에 대해 공부한 점이 많아 재미있었습니다.
The text was updated successfully, but these errors were encountered: