Skip to content

Commit

Permalink
refactor : NPlusOneDetector 를 통한 N+1 문제 감지 추가 및 중복 체크 검사 제거
Browse files Browse the repository at this point in the history
  • Loading branch information
oownahcohc committed Nov 21, 2023
1 parent 7f8ce5d commit 73c13ba
Showing 1 changed file with 18 additions and 25 deletions.
43 changes: 18 additions & 25 deletions src/main/java/backend/wal/support/query/JPAQueryInspector.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package backend.wal.support.query;

import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
Expand All @@ -11,12 +12,14 @@
public class JPAQueryInspector implements StatementInspector {

private static final Logger LOGGER = LoggerFactory.getLogger(JPAQueryInspector.class);
private static final int MAX_QUERY_COUNT = 10;

private static final ThreadLocal<QueryManager> queryManagers = new ThreadLocal<>();

void start() {
queryManagers.set(new QueryManager(new ArrayList<>()));
queryManagers.set(new QueryManager(
new ArrayList<>(),
System.currentTimeMillis()
));
}

void finish() {
Expand All @@ -25,7 +28,7 @@ void finish() {

@Override
public String inspect(String sql) {
LOGGER.info("sql: {}", sql);
LOGGER.info("🚀sql: {}", sql);
QueryManager queryManager = queryManagers.get();
if (queryManager != null) {
queryManager.addQuery(sql);
Expand All @@ -35,32 +38,22 @@ public String inspect(String sql) {

public QueryInspectResult inspectResult() {
QueryManager queryManager = queryManagers.get();
int queryCount = queryManager.getQueryCount();
if (queryManager.hasDuplicatedQuery()) {
LOGGER.warn("중복된 쿼리가 있습니다");
}
if (queryCount > MAX_QUERY_COUNT) {
LOGGER.warn("쿼리가 10번 이상 실행되었습니다");
}
return new QueryInspectResult(queryCount, queryManager.calculateDuration(System.currentTimeMillis()));
long queryDurationTime = queryManager.calculateDuration(System.currentTimeMillis());
checkQueryCountIsOverThanMaxCount(queryManager);
return new QueryInspectResult(queryManager.getQueryCount(), queryDurationTime);
}

static class QueryInspectResult {

private final int count;
private final long time;

public QueryInspectResult(int count, long time) {
this.count = count;
this.time = time;
}

public int getCount() {
return count;
private void checkQueryCountIsOverThanMaxCount(@NotNull QueryManager queryManager) {
if (queryManager.isOverThanMaxQueryCount()) {
LOGGER.warn("🚨쿼리가 10번 이상 실행되었습니다");
checkIsSusceptibleToNPlusOne(queryManager);
}
}

public long getTime() {
return time;
private void checkIsSusceptibleToNPlusOne(@NotNull QueryManager queryManager) {
NPlusOneDetector nPlusOneDetector = new NPlusOneDetector(queryManager.extractIndexOfSelectQuery());
if (nPlusOneDetector.isSelectCountOverThanWarnCount() && nPlusOneDetector.detect()) {
LOGGER.warn("🚨select 문이 연속해서 5회 이상 실행되었습니다. N+1 문제일 수 있습니다");
}
}
}

0 comments on commit 73c13ba

Please sign in to comment.