
| 컴포넌트 |
역할 |
비고 |
| 웹 클라이언트 |
녹음, UI, 사용자 인터랙션 |
React + Vite |
| 로드 밸런서 |
트래픽 분산, Rolling 배포 지원 |
NCP Load Balancer |
| 서버 (x2) |
비즈니스 로직, API 제공, 인증 처리 |
Spring Boot |
| DB |
사용자, 녹음 메타데이터, 분석 결과, 질문 저장 |
MySQL |
| 클라우드 스토리지 |
음성 파일 임시 저장 (STT 처리용) |
NCP Object Storage |
| STT API |
음성 → 텍스트 변환 |
Whisper API |
| LLM API |
텍스트 요약, 심화 질문 생성 |
OpenAI API (GPT-4o mini) |
| 카카오 인증 서버 |
소셜 로그인 OAuth 2.0 처리 |
Kakao Developers |
Rolling 배포를 적용한다. 평상시 서버 2대가 모두 트래픽을 처리하며, 배포 시 1대씩 순차 업데이트한다.
- 로드 밸런서에서 서버 1을 제외
- 서버 1에 신버전 배포 및 정상 동작 확인
- 서버 1을 로드 밸런서에 복귀
- 서버 2에 동일 과정 반복
JWT + HttpOnly Cookie 방식을 사용한다. 서버 2대 운영 시 세션 스토어 없이 stateless로 동작한다.
| 토큰 |
저장 위치 |
만료 |
용도 |
| Access Token |
HttpOnly Cookie |
짧은 만료 (30분) |
API 요청 인증 |
| Refresh Token |
HttpOnly Cookie + DB |
긴 만료 (14일) |
Access Token 재발급, DB 저장으로 서버 측 무효화 가능 |
- HttpOnly: JavaScript에서 토큰 접근 불가 → XSS 방어
- SameSite=Lax: 외부 사이트에서의 쿠키 전송 제한 → CSRF 완화
- Secure: HTTPS에서만 쿠키 전송

분석은 3단계로 순차 실행되며, 각 단계의 결과가 다음 단계의 입력이 된다.
| 단계 |
상태값 |
처리 내용 |
입력 |
출력 |
| 1 |
STT |
Whisper API로 음성→텍스트 변환 |
클라우드 임시 음성 파일 |
변환 텍스트 (DB 저장) |
| 2 |
SUMMARIZING |
LLM으로 텍스트 요약 |
변환 텍스트 |
요약본 JSON (DB 저장) |
| 3 |
QUESTIONING |
LLM으로 심화 질문 생성 |
요약본 |
질문 5개 (DB 저장) |
상태 전이: PENDING → STT → SUMMARIZING → QUESTIONING → COMPLETED (또는 FAILED)
- 분석 요청(POST)은 즉시 202 응답을 반환하고, 서버에서 비동기로 파이프라인을 실행한다
- 클라이언트는 폴링(GET /analysis/status)으로 진행 상태를 확인한다
- 완료 또는 실패 시 Web Notifications API로 브라우저 알림을 표시한다
질문 재생성은 분석 파이프라인과 별도로, 기존 요약본을 기반으로 질문 생성(3단계)만 재실행한다.
- 기존 질문 5개를 새로운 질문 5개로 대체
- 분석이 COMPLETED 상태인 경우에만 요청 가능
- 요약본은 DB에 저장되어 있으므로 추가 입력 없이 처리
| 실패 단계 |
재시도 방법 |
시간 제한 |
| STT |
클라우드 임시 파일로 재시도 |
24시간 (임시 파일 만료 후 재시도 불가, 분석 새로 요청) |
| 요약 |
DB에 저장된 변환 텍스트로 재시도 |
없음 |
| 질문 생성 |
DB에 저장된 요약본으로 재시도 |
없음 |
- 빈 텍스트: STT 결과가 빈 텍스트인 경우 분석 실패로 처리
- API 오류: 외부 API(Whisper, OpenAI) 호출 실패 시 해당 단계에서 FAILED 처리
클라이언트가 Object Storage에 직접 업로드하기 위해 Presigned URL 방식을 사용한다.
- 클라이언트가 서버에 업로드 URL 발급 요청
- 서버가 NCP Object Storage의 Presigned URL 생성 후 응답
- 클라이언트가 Presigned URL로 Object Storage에 음성 파일 직접 업로드
- 업로드 완료 후 클라이언트가 서버에 분석 요청

| 데이터 |
생성 시점 |
저장 위치 |
삭제 시점 |
| 녹음 메타데이터 |
녹음 완료 |
DB |
사용자 삭제 또는 계정 탈퇴 |
| 음성 파일 (임시) |
분석 요청 |
클라우드 스토리지 /tmp/{recording_id}.m4a |
STT 성공 시 즉시 삭제, 실패 시 24시간 후 자동 삭제 |
| 변환 텍스트 |
STT 완료 |
DB |
사용자 삭제 또는 계정 탈퇴 |
| 요약본 |
LLM 요약 완료 |
DB |
사용자 삭제 또는 계정 탈퇴 |
| 심화 질문 (5개) |
LLM 질문 생성 완료 |
DB |
사용자 삭제 또는 계정 탈퇴 |
| 사용자 정보 |
최초 소셜 로그인 |
DB |
계정 탈퇴 |
| 인증 토큰 (JWT) |
로그인 |
HttpOnly Cookie |
로그아웃 또는 만료 |
- 분석 결과 (변환 텍스트, 요약본, 질문): 사용자가 녹음을 삭제하거나 계정을 탈퇴할 때까지 유지
- 임시 음성 파일: STT 성공 시 즉시 삭제. STT 실패 시 24시간 보관 후 자동 삭제
- 계정 탈퇴 시: 사용자 데이터 및 관련 녹음/분석/질문 데이터 일괄 삭제
| 항목 |
제약 |
비고 |
| 녹음 최대 길이 |
2시간 |
초과 시 자동 종료 및 안내 |
| 녹음 최대 파일 크기 |
200MB |
초과 시 자동 종료 및 안내 |
| 동시 분석 |
사용자당 1건 |
초과 시 요청 거부 |
| 브라우저 탭 전환 |
녹음 유지 |
MediaRecorder API + 백그라운드 동작 |
| 지원 오디오 포맷 |
M4A (AAC) |
MediaRecorder 출력을 M4A로 변환하여 사용 |
| 구분 |
기술 |
선정 이유 |
| 프론트엔드 |
React + Vite |
CSR 기반 SPA, 정적 파일 배포로 운영 단순화, 빠른 빌드 |
| 백엔드 |
Spring Boot (Java) |
안정적인 REST API 구축, 풍부한 생태계 및 레퍼런스 |
| DB |
MySQL |
정형 데이터 관리에 적합, 운영 안정성 확보 |
| 인프라 |
NCP (Naver Cloud Platform) |
Load Balancer, Object Storage, 서버 호스팅, 국내 리전 |
| STT |
OpenAI Whisper API |
한국어 인식 정확도 우수, API 기반으로 별도 인프라 불필요 |
| LLM |
OpenAI API (GPT-4o mini) |
요약 및 질문 생성에 충분한 성능, 비용 효율적 |
| 인증 |
카카오 로그인 (OAuth 2.0) + JWT |
HttpOnly Cookie 기반, stateless로 서버 확장에 유리 |
| 상태 관리 |
Zustand |
경량 상태 관리, 간결한 코드 구조 |
| API 통신 |
Axios |
인터셉터 기반 토큰 관리 용이 |
| 알림 |
Web Notifications API |
브라우저 기본 알림 지원, 별도 인프라 불필요 |