| 1 인증 |
1.1 회원가입 |
1.1.1 이메일 회원가입 |
이메일·비밀번호·학생이름·학번·학교·학과 입력 후 신규 가입 |
가능 |
✅ |
|
|
1.1.2 이메일 형식 검증 |
정규식 기반 이메일 유효성 검사 |
가능 |
✅ |
|
|
1.1.3 비밀번호 복잡성 검증 |
영문·숫자·특수문자 포함 8자 이상 검증 |
가능 |
✅ |
|
|
1.1.4 학교 선택 |
활성화된 학교 목록 셀렉트박스 제공 |
가능 |
✅ |
|
|
1.1.5 학과 선택 |
학교 선택 시 해당 학과 목록 동적 로딩 |
가능 |
✅ |
|
|
1.1.6 이메일 중복 검사 |
가입 시 기존 이메일 중복 여부 409 반환 |
가능 |
✅ |
|
1.2 로그인 |
1.2.1 이메일·비밀번호 인증 |
DB 조회 후 bcrypt 비밀번호 검증 |
가능 |
✅ |
|
|
1.2.2 JWT 토큰 발급 |
로그인 성공 시 Access Token 발급 및 HttpOnly 쿠키 저장 |
가능 |
✅ |
|
1.3 로그아웃 |
1.3.1 토큰 무효화 |
form POST 방식으로 쿠키 삭제 후 홈 리다이렉트 |
가능 |
✅ |
|
1.4 접근 제어 |
1.4.1 인증된 사용자만 접근 |
비로그인 시 로그인 페이지로 리다이렉트 |
가능 |
✅ |
|
|
1.4.2 로그인 상태 리다이렉트 |
로그인 상태로 /login·/register 접근 시 /chat으로 리다이렉트 |
가능 |
✅ |
| 2 공지 수집 |
2.1 자동 크롤링 |
2.1.1 학교 공지 수집 |
n8n이 30분 주기로 school.notice_url 크롤링 |
가능 |
✅ |
|
|
2.1.2 학과 공지 수집 |
n8n이 30분 주기로 department.notice_url 크롤링 |
가능 |
✅ |
|
|
2.1.3 크롤링 대상 관리 |
school·department의 is_active 플래그로 ON/OFF 제어 |
가능 |
✅ |
|
2.2 AI 요약 |
2.2.1 공지 자동 요약 |
수집된 공지 원문을 LLM으로 요약 후 저장 |
가능 |
❌ |
|
2.3 벡터화 |
2.3.1 임베딩 생성 |
공지 텍스트를 BGE-M3로 임베딩 후 pgvector에 저장 |
가능 |
✅ |
| 3 공지 조회 |
3.1 공지 목록 |
3.1.1 학교별 공지 목록 |
로그인 유저의 school_id 기준 공지 목록 반환 |
가능 |
✅ |
|
|
3.1.2 학과별 공지 필터 |
dept_id 기준으로 학과 공지만 필터링 |
가능 |
✅ |
|
|
3.1.3 타학과·타학교 공지 차단 |
school_id + dept_id DB 레벨 필터로 접근 차단 (403) |
가능 |
✅ |
|
|
3.1.4 페이지네이션 |
offset·limit 기반 목록 페이징 + 프론트 윈도잉 처리 |
가능 |
✅ |
|
|
3.1.5 키워드 검색 |
300ms 디바운스 기반 프론트 필터링 검색 |
가능 |
✅ |
|
3.2 공지 상세 |
3.2.1 공지 원문 조회 |
공지 원문·출처 URL 상세 반환 (타학교 403 차단) |
가능 |
✅ |
| 4 챗봇 |
4.1 질문 처리 |
4.1.1 자연어 질문 입력 |
사용자 질문을 텍스트로 입력받아 RAG 파이프라인 실행 |
가능 |
✅ |
|
|
4.1.2 질문 의도 자동 분류 |
count·recent·list·search 4가지로 분류 후 라우팅 |
가능 |
✅ |
|
|
4.1.3 공지 현황 컨텍스트 주입 |
매 요청마다 학교/학과/전체 공지 개수를 컨텍스트에 포함 |
가능 |
✅ |
|
4.2 RAG 파이프라인 |
4.2.1 질문 임베딩 |
BGE-M3로 질문을 벡터로 변환 |
가능 |
✅ |
|
|
4.2.2 유사 공지 검색 |
pgvector cosine 유사도로 관련 공지 top-5 검색 |
가능 |
✅ |
|
|
4.2.3 컨텍스트 주입 |
검색된 공지를 LLM에 컨텍스트로 전달 |
가능 |
✅ |
|
|
4.2.4 답변 생성 |
LLM이 공지 기반 답변 생성 후 반환 |
가능 |
✅ |
|
4.3 세션 관리 |
4.3.1 세션 자동 생성 |
첫 질문 시 채팅 세션 자동 생성 및 제목 저장 (앞 20자) |
가능 |
✅ |
|
|
4.3.2 대화 히스토리 유지 |
세션 내 최근 20개 메시지를 컨텍스트로 포함하여 연속 질문 대응 |
가능 |
✅ |
|
|
4.3.3 세션 목록 조회 |
유저별 채팅 세션 목록 최신순 반환 |
가능 |
✅ |
|
|
4.3.4 세션 삭제 |
세션 소유권 검증 후 메시지 → 세션 순서로 삭제 (FK 제약) |
가능 |
✅ |
| 5 화면 |
5.1 메인 페이지 |
5.1.1 랜딩 페이지 렌더링 |
로그인 여부에 따라 CTA 버튼 동적 전환 |
가능 |
✅ |
|
|
5.1.2 학교·학과 선택 폼 |
비로그인 시 학교·학과 선택 후 회원가입 페이지 이동 |
가능 |
✅ |
|
5.2 채팅 페이지 |
5.2.1 채팅 UI 렌더링 |
메시지 입력·전송·응답 표시, 로딩 버블, Enter 전송 지원 |
가능 |
✅ |
|
|
5.2.2 예시 질문 버튼 |
예시 질문 클릭 시 입력창 자동 채움 |
가능 |
✅ |
|
5.3 공지 목록 페이지 |
5.3.1 공지 목록 렌더링 |
학교·학과 공지 목록 카드 형태로 표시 |
가능 |
✅ |
|
|
5.3.2 사이드바 필터 |
전체·학교 공지·학과 공지 분류 필터 |
가능 |
✅ |
|
|
5.3.3 공지 상세 모달 |
카드 클릭 시 본문 상세 모달 표시 (별도 API 호출) |
가능 |
✅ |
| 6 예외처리 |
6.1 API 예외처리 |
6.1.1 전역 예외 핸들러 |
FastAPI exception_handler 기반 커스텀 예외 메시지 반환 |
가능 |
✅ |
|
|
6.1.2 HTTP 상태코드별 처리 |
401→/login 리다이렉트, 404→/, 500→error.html 렌더링 |
가능 |
✅ |
|
6.2 응답 통일 |
6.2.1 API 에러 응답 일관화 |
형식 통일 (status_code·detail 포함) |
가능 |
✅ |
|
6.3 보안 |
6.3.1 500 에러 내용 숨김 |
스택트레이스 미노출, 일반 메시지만 반환 |
가능 |
✅ |