RAG 기반 학사 챗봇 서비스
- 2025.06 - 2025.08 (3M / 4명) [BE]
- 마이페이지 조회 개선
- CI CD 파이프라인 및 무중단 배포 인프라 구축
- 채팅 히스토리 및 인증 기능 개발
- 회원 마이페이지 화면에서 질문 수를 필요로 함
- 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECT COUNT(*)
FROM Member m
JOIN m.histories h
JOIN h.questions q
WHERE m.id = :memberId- 다중 테이블 JOIN 및 COUNT 쿼리가 발생하여 마이페이지 조회 속도가 느려지고 DB에 부하 누적
- 프론트 팀원과 회의한 결과 질문 수는 단순한 UI 표시용 지표이며, 회원의 거래나 중요한 작업에는 영향을 주지 않는 부가 정보임을 확인
- 이를 바탕으로 다음 내용을 제안
- 비즈니스 임팩트가 낮은 questionCount 데이터를 member 테이블에 반정규화하여 별도 저장
- 스케줄링 작업을 통해 매일 저장된 값과 실제 질문 개수가 일치하는지 정기적으로 검증
- 회원 질문 수 조회 시 1:N 관계와 1:1 관계 엔티티들 간 N+1 문제 발생
- 질문 수 갱신 작업이 동기 순차 처리로 실행 시간이 과도하게 소요됨
1:1 관계에서 발생하는 N+1 문제
- 서비스 엔티티 관계
- member -- (1:N) -< history --(1:N) -< question -- (1:1) -- answer
- question 조회 시 answer 프록시 객체를 만들기 위해 question은 answer의 pk를 알고 있어야 함
- 현재 fk가 answer 쪽에 있으므로 answer를 조회하는 쿼리가 한번씩 더 발생
- 이는 위와 같이 fk의 위치를 바꿈으로써 해결 가능
- 하지만 question과 answer의 관계가 1:N으로 발전하면 answer쪽에 fk를 재배치해야 함 (엔티티 구조를 바꿔야 함)
- 현재 상황에서는 question과 answer의 관계가 1:N으로 발전하지 않을것이라 판단하여 fk를 재배치 하는 방식으로 해결
동기 순차 처리로 발생하는 비효율
- 동기 로직을 CompletableFuture 기반 비동기 병렬 처리로 전환하여 전체 실행 시간을 단축
- 비동기 검증 작업용 버스트 스레드풀을 설계하여 평소에는 리소스를 절약하고, 갱신 작업 시작 시 스레드 할당
- 마이페이지 조회 속도를 1600ms에서 132ms로 12배 개선 및 스케줄링 된 검증 작업을 통해 반정규화의 데이터 무결성을 보장
- 조회 시에는 단순 SELECT로 빠르게 처리하면서도, 배치 검증으로 데이터 정합성이라는 반정규화의 위험을 완벽하게 관리할 수 있음
- 질문 수 갱신 작업 전체 처리 시간을 2700ms에서 257ms로 11배 개선
- 홈 서버 구축 및 백엔드 서버 배포 인프라 구성
- Git Actions를 통한 자동 CI/CD 구성
- 경량화된 쿠버네티스인 k3s를 사용하여 클러스터 운영 효율성 증대 및 무중단 배포 적용
- 홈서버 구축으로 인스턴스 비용 절약
- 쿠버네티스의 자동 포드 관리 기능으로 장애가 발생하면 자동으로 재시작하거나 재배포해 서비스의 가용성을 보장
- Rolling update 기능을 통해 서비스를 중단하지 않고 점진적으로 새로운 버전을 배포할 수 있어, 안정적인 서비스 운영이 가능