[JPA] 집계 테이블로 통계 조회를 최적화하기
·
DB 접근 기술/JPA
개요서비스를 사용하는 사용자에게 원하는 데이터를 서비스하기 위해서는 데이터베이스에 쿼리를 하여 즉시 서빙하는 방식이 기본적입니다. 하지만 쿼리가 복잡해질수록 DB 에는 부하가 발생하고 이는 지연시간의 증가로 이어지게 됩니다. 좋아요 수, 주문 상품의 수 등의 여러 테이블에서 데이터를 집계하는 통계성 쿼리가 이에 해당됩니다. 이번 포스팅에서는 이런 통계성 쿼리를 시간별로 실행하여 집계 테이블에 저장하는 방식을 실습해보겠습니다. 실습은 다음의 링크에서 직접해보실 수 있습니다.https://github.com/juno71w/jpa-optimize-statistic-query GitHub - juno71w/jpa-optimize-statistic-queryContribute to juno71w/jpa-optim..
[JPA JDBC] PK 생성 전략 별로 사용해야할 bulk insert 를 알아보자
·
DB 접근 기술/JPA
개요개발을 하다보면 대용량의 데이터를 insert 해야하는 순간이 옵니다. 이 때 JPA 를 사용하는 프로젝트라면 bulk insert 시 발생하는 문제에 대해서 한번씩 마주하고는 합니다. 이번 포스팅에서는 JPA 에서 bulk insert 를 해야할 때 ID 생성 전략에 따라 주의해야하는 점을 파악하고 취하는 전략마다 성능이 얼마나 차이나는지 확인하는 시간을 가지겠습니다. 이번 포스팅에 대한 실습은 다음 리포지토리에서 진행하실 수 있습니다.https://github.com/juno71w/jpa-bulk-insert-strategy GitHub - juno71w/jpa-bulk-insert-strategyContribute to juno71w/jpa-bulk-insert-strategy developme..
[JPA] 페이지네이션과 N + 1 문제
·
DB 접근 기술/JPA
개요대용량 트래픽 환경에서 JPA를 사용하다 보면 가장 자주 마주치는 문제 중 하나가 N + 1 문제입니다.특히 페이지네이션이 포함된 조회 API에서는 Fetch Join 사용에 제약이 생기기 때문에, 단순한 해결책이 오히려 더 큰 문제를 만들기도 합니다. 이번 포스트에서는 페이지네이션 API 에 대해서 어떤 쿼리 최적화 전략을 사용할지에 대해 알아보겠습니다. 배울 수 있었던 점Fetch Join 을 사용하기 어려운 페이지네이션 API 에서 사용할 수 있는 대안인 '쿼리를 나누어 IN 절로 묶기' 를 통해 문제를 해결할 수 있었습니다.또한 이 방법이 만능은 아니며 IN 절의 제한이 있는 DB에서는 다른 방식으로 해결할 수 있는 방법을 확인할 수 있었습니다. 해당 코드에 대한 실습은 다음 레포지토리에서 진..
MySQL에서의 B+트리는 뭐가 다를까?
·
Database/MySQL
소개데이터베이스 성능 최적화를 논할 때 가장 먼저 떠오르는 요소는 인덱스 성능입니다. 인덱스가 없다면 대량의 데이터 속에서 원하는 값을 찾기 위해 풀 스캔을 수행해야 하고, 이는 곧 쿼리 성능 저하로 이어집니다. 그래서 대부분의 RDBMS는 효율적인 탐색을 위해 B+Tree 기반 인덱스 구조를 사용합니다. 하지만 MySQL 에서는 단순히 알려진 B+Tree 방식을 사용한다고 생각하지 않았습니다. 현대 시스템에서는 데이터가 수천만 건에서 수억 건이 넘어갈 것인데 이를 B+Tree 구현 그대로 사용한다면 성능저하가 있을 것이라는 생각이 들어 MySQL이 B+Tree 를 어떻게 활용하고 있는지 알아 보았습니다. 이번 포스트에서는 MySQL InnoDB 스토리지 엔진이 단순히 B+Tree를 사용하는 수준을 넘어..
[테크 블로그 실습] 힙 덤프를 통해 디버깅을 해보자
·
Java
개요https://techblog.woowahan.com/2628/ 도움이 될수도 있는 JVM memory leak 이야기 | 우아한형제들 기술블로그도움이 될지도 모르는 JVM memory leak 얘기인데 제목을 뭐라고 하지? 안녕하세요. 배민 플랫폼실 주문중계 시스템팀 오민철입니다. 이 글은 몇 줄의 코드와 어디서 걸렸는지 모를 dependency library로techblog.woowahan.com 안녕하세요. 테크 블로그의 어떤 글을 읽고 블로그 포스팅을 남기려고합니다. 최근 JVM 관련 책을 읽고 있어서 관련 내용을 많이 찾아보게되네요. 이 글은 본인도 겪을지도 모르는 OOM이 발생했을 때 어떤 도구로 분석하고 어떻게 원인을 발견할 수 있는지 실습을 해보기 위해 작성되었습니다. 포스팅에 사용된 ..
[테코톡 실습] 분산 환경에서 상태 동기화를 위한 저장소 선택 전략 분석 (글로벌 캐시 vs 로컬 캐시)
·
Redis
개요최근 테코톡에서 게임 데이터를 동기화시키기 위해 사용된 3가지 방식에 대한 발표를 보았습니다.https://www.youtube.com/watch?v=SWFSpPH2v0I 여기서 제시된 방법들이 실제 환경에서 어떤 차이를 보이는지 궁금했고, 이를 직접 구현하여 성능을 비교해보고자 실험용 프로젝트를 만들었습니다. 실험용 소스코드는 아래 GitHub 레포지토리에서 확인하실 수 있습니다.https://github.com/juno71w/global-cache-local-cache-compare 본 글에서는 세 가지 방식의 구현 과정과 k6 기반 부하 테스트 결과를 공유합니다. 비교 대상 방식 소개영상에서 언급된 3가지 방식을 간략하게 소개하고자합니다. 자세한 내용은 영상을 보시면 더 정확하게 확인하실 수..