Skip to content

Dockerel/KnuChatbot-BE

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

  • 2025.06 - 2025.08 (3M / 4명) [BE]

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

  • 회원 마이페이지 화면에서 질문 수를 필요로 함

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECT COUNT(*)
FROM Member m
JOIN m.histories h
JOIN h.questions q
WHERE m.id = :memberId
  • 다중 테이블 JOIN 및 COUNT 쿼리가 발생하여 마이페이지 조회 속도가 느려지고 DB에 부하 누적
  • 프론트 팀원과 회의한 결과 질문 수는 단순한 UI 표시용 지표이며, 회원의 거래나 중요한 작업에는 영향을 주지 않는 부가 정보임을 확인
  • 이를 바탕으로 다음 내용을 제안
    1. 비즈니스 임팩트가 낮은 questionCount 데이터를 member 테이블에 반정규화하여 별도 저장
    2. 스케줄링 작업을 통해 매일 저장된 값과 실제 질문 개수가 일치하는지 정기적으로 검증

2. 스케줄링 작업에서 발생한 비효율

  • 회원 질문 수 조회 시 1:N 관계와 1:1 관계 엔티티들 간 N+1 문제 발생
  • 질문 수 갱신 작업이 동기 순차 처리로 실행 시간이 과도하게 소요됨

1:1 관계에서 발생하는 N+1 문제

  • 서비스 엔티티 관계
    • member -- (1:N) -< history --(1:N) -< question -- (1:1) -- answer
image
  • question 조회 시 answer 프록시 객체를 만들기 위해 question은 answer의 pk를 알고 있어야 함
  • 현재 fk가 answer 쪽에 있으므로 answer를 조회하는 쿼리가 한번씩 더 발생
image
  • 이는 위와 같이 fk의 위치를 바꿈으로써 해결 가능
  • 하지만 question과 answer의 관계가 1:N으로 발전하면 answer쪽에 fk를 재배치해야 함 (엔티티 구조를 바꿔야 함)
  • 현재 상황에서는 question과 answer의 관계가 1:N으로 발전하지 않을것이라 판단하여 fk를 재배치 하는 방식으로 해결

동기 순차 처리로 발생하는 비효율

  • 동기 로직을 CompletableFuture 기반 비동기 병렬 처리로 전환하여 전체 실행 시간을 단축
  • 비동기 검증 작업용 버스트 스레드풀을 설계하여 평소에는 리소스를 절약하고, 갱신 작업 시작 시 스레드 할당

성과

  • 마이페이지 조회 속도를 1600ms에서 132ms로 12배 개선 및 스케줄링 된 검증 작업을 통해 반정규화의 데이터 무결성을 보장
  • 조회 시에는 단순 SELECT로 빠르게 처리하면서도, 배치 검증으로 데이터 정합성이라는 반정규화의 위험을 완벽하게 관리할 수 있음
  • 질문 수 갱신 작업 전체 처리 시간을 2700ms에서 257ms로 11배 개선

2. CI CD 파이프라인 및 무중단 배포 인프라 구축

개요

  • 홈 서버 구축 및 백엔드 서버 배포 인프라 구성
  • Git Actions를 통한 자동 CI/CD 구성
  • 경량화된 쿠버네티스인 k3s를 사용하여 클러스터 운영 효율성 증대 및 무중단 배포 적용

성과

image
  • 홈서버 구축으로 인스턴스 비용 절약
  • 쿠버네티스의 자동 포드 관리 기능으로 장애가 발생하면 자동으로 재시작하거나 재배포해 서비스의 가용성을 보장
  • Rolling update 기능을 통해 서비스를 중단하지 않고 점진적으로 새로운 버전을 배포할 수 있어, 안정적인 서비스 운영이 가능

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published