AI 에이전트와 함께 레거시 시스템 성능 개선, SQL Injection, N+1 문제 해결!
Claude Code를 활용하여 380개 Java 클래스, 49개 MyBatis Mapper XML로 구성된 레거시 시스템의 성능 병목 지점 분석
SQL Injection 취약점 14곳을 발견하고, MyBatis의 `${}` 사용으로 인한 보안 문제를 해결
블로그 작성자별 목록 페이지에서 발생한 N+1 문제를 해결하여 DB 호출 횟수를 46회에서 6회로 감소
GROUP_CONCAT, 서브쿼리(Subquery) 제거 및 JOIN(Join) 최적화를 통해 메인 페이지와 블로그 상세 페이지의 성능 개선
향후 페이징(Paging) 적용, 댓글 쿼리 개선, 캐싱(Caching) 적용 등 추가적인 성능 개선 계획 제시
AI 에이전트 기반 성능 분석 시스템
본문에서는 Claude Code를 활용하여 레거시 시스템의 성능 문제를 분석하는 과정을 설명한다. Tracer, Query Analyst, Optimizer 3가지 에이전트를 구성하여 Controller에서 Mapper XML까지의 호출 경로 추적, SQL 쿼리 성능 분석, 개선안 제시를 자동화했다.
Tracer: Controller에서 Mapper XML까지의 호출 경로 추적(Call Path Tracking)
Query Analyst: SQL 쿼리의 성능 문제 패턴 탐지(Performance Issue Detection)
Optimizer: 분석 결과를 종합하여 우선순위별 개선안 제시(Prioritized Improvement Suggestions)
이러한 AI 기반 분석 시스템은 개발자가 수작업으로 수 시간 이상 소요되는 작업을 단 5분 만에 완료하도록 지원한다.
SQL Injection 취약점 해결
본문에서는 MyBatis에서 `${loginId}`와 같이 사용자 입력을 SQL 쿼리에 직접 삽입하는 방식으로 인해 발생한 SQL Injection 취약점(SQL Injection Vulnerability)을 해결한 사례를 제시한다. 이러한 방식은 공격자가 악의적인 SQL 구문을 삽입하여 데이터베이스를 조작할 수 있는 위험을 초래한다.
취약점 발견: 7개 파일, 14곳에서 발견된 SQL Injection 취약점
해결 방법: `${}` 대신 `#{}` 바인딩 방식으로 변경하여 SQL Injection 공격 방지
중요성: 보안 취약점은 성능 개선과 별개로 즉시 수정(Immediate Fix)해야 하는 문제이다.
N+1 문제 해결: 블로그 작성자 목록 페이지 개선
본문에서는 블로그 작성자별 목록 페이지에서 발생한 N+1 문제(N+1 Problem)를 해결하여 DB 호출 횟수를 대폭 감소시킨 과정을 설명한다. N+1 문제는 쿼리 성능 저하의 주요 원인 중 하나이며, 데이터베이스 부하를 증가시켜 시스템 전체의 성능에 악영향을 미친다.
문제 상황: 10개의 게시글을 보여주기 위해 46번의 DB 호출 발생
원인 분석: 게시글 목록 조회 후, 각 게시글의 작성자 정보를 가져오기 위해 추가적인 쿼리 실행
해결 방법: 서브쿼리(Subquery)를 LEFT JOIN(Left Join)으로 변경하여 DB 호출 횟수를 6회로 감소
결과적으로 DB 호출 횟수 감소(Reduced DB Calls)를 통해 페이지 로딩 속도를 개선하고, 데이터베이스 부하를 줄였다.
쿼리 최적화: 메인 및 블로그 페이지 성능 개선
본문에서는 메인 페이지와 블로그 상세 페이지의 쿼리 최적화를 통해 성능을 개선한 사례를 소개한다. 불필요한 쿼리 제거, JOIN(Join) 사용, 서브쿼리(Subquery) 최적화 등을 통해 데이터베이스 접근 횟수를 줄이고, 응답 시간을 단축했다.
메인 페이지: GROUP_CONCAT과 LIKE 제거, 서브쿼리(Subquery)를 JOIN(Join)으로 변경
블로그 상세 페이지: 서브쿼리(Subquery) 10개를 JOIN(Join)으로 변경
개선 효과: 메인 페이지의 DB 호출 횟수를 7~21회에서 7~9회로, 블로그 상세 페이지의 DB 호출 횟수를 25회 이상에서 10~12회로 감소
이러한 쿼리 최적화는 페이지 로딩 속도 향상(Improved Page Load Speed)과 사용자 경험 개선에 기여한다.
향후 개선 계획: 페이징, 캐싱, 검색 기능 추가
본문에서는 성능 개선을 위한 추가적인 계획을 제시한다. 페이징(Paging) 적용, 댓글 쿼리 개선, 캐싱(Caching) 적용, FULLTEXT 검색(Full-text Search) 기능 추가 등을 통해 시스템의 전반적인 성능을 더욱 향상시킬 수 있다.
페이징(Paging) 적용: 대량 데이터 처리 성능 개선을 위해 페이징 기능 추가
댓글 쿼리 개선: 댓글 관련 쿼리 최적화를 통해 페이지 로딩 속도 향상
캐싱(Caching) 적용: P4 캐싱을 통해 배너, 메뉴, 태그 등 마스터 데이터의 DB 호출 빈도 감소
FULLTEXT 검색(Full-text Search) 기능 추가: 검색 성능 향상을 위해 FULLTEXT 검색 기능 도입
이러한 계획들은 지속적인 성능 개선(Continuous Performance Improvement)을 위한 중요한 단계이다.