Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

학사 챗봇 서비스

개요

RAG 기반 학사 챗봇 서비스

개발 정보

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

기술 스택





시스템 아키텍처

image

담당한 기능

1. 마이페이지 조회 개선

개요

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

문제 및 의사결정 과정

1. 회원 질문 수 반정규화

  • 마이페이지에서 회원 질문 수 조회 시, 매번 전체 질문 테이블을 집계하는 쿼리 발생
SELECTCOUNT(*)
FROM Member m
JOINm.histories h
JOINh.questions q
WHEREm.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

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages