CateQuest
📅 기간: 2025.06 ~ 진행 중 (6개월)
👥 팀원: BE 1명, FE 2명
✨ 프로젝트 소개
사용자에게 카테고리 별 질문을 주어 오늘 하루에 대한 마무리 혹은 평소에 하는 생각을 정리할 수 있도록 하는 앱입니다.
연애, 공부, 가치관, 경제 등 사용자가 카테고리를 선택하여, 인공지능에게 알맞은 질문을 생성하여 사용자에게 줍니다.
🛠 기술 스택
- Spring boot
- Spring boot Data JPA
- MySQL
- AWS
- Git
- Swagger
💪 맡은 기능 구현
-
MVP 핵심 기능 개발 (Spring Boot)
- MVP 기반 구축: 1인 백엔드로서 비즈니스 요구사항 분석부터 기능 명세, 핵심 기능(인증, 질문, 답변, 이웃) 구현까지 MVP 개발 전반을 주도하며 서비스 기반을 마련했습니다.
- 신속한 피드백 반영: Figma 와이어프레임을 기반으로 FE 개발자와 협업하며, 사용자 피드백을 신속하게 프로덕트에 반영했습니다.
-
API 설계 및 협업 프로세스 구축 (Google Docs & Swagger)
- 선제적 API 설계: MVP 개발 전, FE 개발자와의 명확한 통신 규약 정립을 위해 Google Docs를 사용하여 API를 선제적으로 설계했습니다.
- 문서 자동화 및 유지보수: 설계된 API 명세를 Swagger로 이전하여 RESTful API 명세서를 자동화하고, FE 개발자가 직접 테스트할 수 있게 하여 개발 효율을 증대시켰습니다.
- 인프라 개선 기여: API 부하 테스트 수행 결과, 개발 서버와 운영 서버의 분리 필요성을 파악하여 안정적인 인프라를 구축하는 데 기여했습니다.
-
CI/CD 파이프라인 구축 및 코드 품질 관리 (GitHub Actions)
- 파이프라인 구축: GitHub Actions를 활용하여 코드 빌드, Lint(코드 스타일 검사), 배포 자동화까지의 CI/CD 파이프라인을 구축했습니다.
- 코드 품질 자동화: 정적 코드 분석 도구(SonarQube)와 AI 코드 리뷰 도구(Code Rabbit)를 도입하여 코드 품질 관리를 자동화했습니다.
- 운영 환경 분리: 안정적인 서비스 운영을 위해 개발(Dev)과 운영(Prod) 환경의 배포 파이프라인을 분리했습니다.
-
AI 모델 파인튜닝 (PyTorch)
- 도입 목적: 서비스 핵심인 '카테고리별 맞춤 질문'을 지속적이고 무한하게 생성하기 위해 AI 언어 모델을 도입했습니다.
- 모델 파인튜닝: 오픈소스 모델(EleutherAI/polyglot-ko-1.3b)을 PyTorch로 파인튜닝하고, 모델 학습에 필요한 고품질의 데이터셋을 직접 설계하고 구축했습니다.
🔍 트러블 슈팅
다대다(M:N) 관계에서의 N+1 쿼리 문제 해결
문제 상황
일기(Diary)와 태그(Tag)의 다대다 관계 조회 시, 지연 로딩으로 N+1 쿼리 문제가 발생하는 것을 확인했습니다.
원인 분석
지연 로딩(Lazy Loading)으로 설정된 Tag 목록을 가져오는 과정에서, Diary 조회 쿼리(1) 이후, 각 Diary에 대한 Tag 조회 쿼리(N)가 추가로 발생했습니다.
해결 과정: JPQL 및 Projection DTO 도입
N+1 문제 해결을 위해 @BatchSize 사용도 고려했습니다. 하지만 해당 API가 읽기 전용(Read-Only)이므로, 엔티티를 조회하고 영속성을 관리하는 방식은 불필요한 오버헤드라고 판단했습니다.
따라서 읽기 성능 극대화를 위해, API 스펙에 최적화된 DTO로 직접 조회하는 방식을 채택했습니다.
- 조회 전용 DTO(
DiaryFlatProjection)를 정의했습니다.
DiaryRepository에 @Query 어노테이션을 사용하여, Diary와 Tag를 JOIN하는 JPQL 쿼리를 직접 작성했습니다.
SELECT 절에 별칭(alias)을 사용하여 쿼리 결과가 DTO에 자동 매핑되도록 구현했습니다.
결과
기존 (1+N)번 쿼리를 단 1번의 JOIN 쿼리로 최적화했습니다. 읽기 작업에 불필요한 엔티티 조회를 피하게 되어, API 응답 속도 및 DB 부하를 개선했습니다.