김솔비 블로그
개발 도구

JPA Pattern Analyzer

코드 분석 기반 JPA 패턴 학습 및 성능 비교 도구

기간
2025.12.19 ~ 2025.12.19
기술
JavaScript, WASM, Tree-sitter

개발 배경: 복잡한 JPA 쿼리, 어떻게 관리할까?

실무에서 JPA를 도입하면서 가장 많이 부딪힌 질문은 "이 쿼리는 어떤 방식으로 짜는 게 맞을까?" 였다.

Query Method, @Query(JPQL), Specification, QueryDSL 등 선택지는 많았지만, 팀원마다 선호하는 방식이 달랐고 각 방식의 장단점을 명확한 수치로 비교하기도 어려웠다.

특히 "QueryDSL이 컴파일 타임에 안전하니까 무조건 좋다" 라거나 "Specification은 가독성이 떨어지니 쓰지 말자" 같은 주관적인 의견이 오갈 때마다, 코드 레벨에서 객관적으로 비교해 줄 기준이 절실했다.

문제 분석: '감'에 의존하는 성능 튜닝

흔히 쿼리 성능을 이야기할 때는 실제 DB 실행 시간(Execution Time)에만 집중한다. 하지만 JPA 같은 ORM 환경에서는 애플리케이션 로딩 시점의 파싱 비용이나 동적 쿼리 빌딩 오버헤드 같은 '숨은 비용'도 무시할 수 없다.

  • Query Method — 메서드 이름이 길어질수록 파싱 비용이 늘어난다.
  • JPQL — 문자열 기반이라 런타임 에러 위험과 리팩터링 비용이 있다.
  • QueryDSL — Q클래스 생성과 빌더 패턴 사용으로 초기 컴파일 오버헤드가 있다.

이런 코드 복잡도(Code Complexity) 와 이론적 오버헤드를 개발 단계에서 미리 시뮬레이션해 볼 수 있다면, 더 나은 기술적 의사결정을 내릴 수 있지 않을까?

해결 과정: AST 분석을 통한 정량화

이 문제를 풀기 위해 Java 코드를 직접 파싱해 분석하는 도구를 만들기로 했다. 핵심은 Tree-sitter 라이브러리로 웹 브라우저에서 실시간으로 Java 코드의 AST(Abstract Syntax Tree, 추상 구문 트리) 를 만드는 것이었다.

주요 분석 로직

1. 패턴 감지

AST를 순회하며 Query Method, @Query, Specification 등 JPA 사용 패턴을 자동으로 식별하고 분류한다.

2. 복잡도 산출

코드 라인 수, 조건문의 깊이, AST 노드 개수 등을 종합해 정량적인 복잡도 점수를 계산한다.

3. 성능 시뮬레이션

실제 DB 연결 없이도 패턴별 오버헤드 계수(Coefficient)를 적용해 이론적인 컴파일·실행 효율을 예측한다.

javascript
// 시뮬레이션 로직 예시 const predictedCompileTime = (lineCount * 0.8 + astNodeCount * 0.3) * patternCoefficient;

덕분에 코드를 붙여 넣기만 하면 "이 코드는 컴파일 비용이 높지만 런타임 안정성이 뛰어납니다" 같은 구체적인 피드백을 받을 수 있다.

결과물 및 배포

완성된 JPA Pattern Analyzer는 별도 백엔드 서버 없이 브라우저(WASM) 환경에서만 동작하는 분석 도구가 되었다. JPA를 처음 배우는 사람에게는 패턴별 차이를 시각적으로 보여 주는 학습 도구로, 실무자에게는 코드 리뷰 때 객관적인 복잡도 지표를 주는 보조 도구로 쓰일 수 있을 것 같다.

  • Tech Stack — HTML, CSS, Vanilla JavaScript, Tree-sitter (WASM)

만들며 한 생각

JPA 패턴 학습의 새로운 기준
JPA 패턴 학습의 새로운 기준Java 코드의 AST(Abstract Syntax Tree)를 분석하여 JPA 쿼리 패턴을 감지하고, 시뮬레이션 기반 성능 지표로 패턴별 특성을 비교하는 교육용 도구입니다.
개발 배경
개발 배경실제 데이터베이스 없이도 코드 레벨에서 JPA 패턴(QueryDSL, Specification 등)의 복잡도와 이론적 성능 특성을 직관적으로 이해하고 비교할 수 있는 도구가 필요했습니다.
AST 기반 코드 분석
AST 기반 코드 분석Tree-sitter를 활용하여 웹 브라우저 상에서 Java 코드를 직접 파싱하고, 추상 구문 트리(AST) 구조를 시각화하여 코드의 복잡도를 정량적으로 측정합니다.
다양한 JPA 패턴 자동 감지
다양한 JPA 패턴 자동 감지단순 Query Method부터 @Query(JPQL/Native), Specification, QueryDSL, Query by Example까지 다양한 JPA 사용 패턴을 자동으로 식별하고 분류합니다.
성능 시뮬레이션
성능 시뮬레이션실제 DB 실행 없이도 코드 라인 수, AST 노드 수, 그리고 각 패턴의 오버헤드 계수를 적용한 독자적인 로직으로 컴파일 타임과 런타임 성능을 시뮬레이션합니다.
패턴별 비교 & 최적화 점수
패턴별 비교 & 최적화 점수현재 코드를 표준 참조 값(Baseline)과 시각적으로 비교하고, Type Safety와 유연성 등을 고려한 '최적화 점수(0~100점)'를 산출하여 개선 방향을 제시합니다.
기술 스택 & 아키텍처
기술 스택 & 아키텍처Tree-sitter(WASM)을 도입하여 브라우저 내에서 고성능 파싱을 구현했으며, Vanilla JS와 HTML/CSS만으로 구성되어 별도의 백엔드 없이 정적 호스팅이 가능합니다.
시뮬레이션 방법론
시뮬레이션 방법론단순 추측이 아닌, '컴파일 시간 = (라인 수 × 0.8ms + AST 노드 × 0.3ms) × 패턴 계수'와 같은 구체적인 시뮬레이션 공식을 적용하여 신뢰도 있는 학습 지표를 제공합니다.
기대 효과
기대 효과초보자에게는 JPA의 다양한 쿼리 방식을 한눈에 파악할 수 있는 학습 도구로, 실무자에게는 프로젝트의 쿼리 스타일을 점검하는 가이드로 활용될 수 있습니다.