기업·직무·이력서 정보를 기반으로 맞춤 질문을 생성하고,
음성 답변과 비언어 신호를 분석해 면접 리포트를 제공하는 AI 모의면접 서비스
기존 면접 준비는 예상 질문을 정리하는 데 그쳐 실제 면접처럼 연습하기 어렵고, 답변의 구조와 전달 방식을 객관적으로 확인하기 어렵다는 문제가 있습니다.
Re:terview는 다음 과정을 하나의 서비스로 연결합니다.
- 기업·직무·JD·이력서 기반 맞춤 질문 생성
- 음성 기반 모의면접 진행
- 답변 내용과 비언어 신호 분석
- 구조화된 AI 면접 리포트 생성
- 리포트 기반 약점 보완 재면접
- 회사, 직무, 경력 수준 입력
- 채용공고 JD 및 이력서 PDF 등록
- 자기소개서·경력기술서 등 추가 자료 관리
- 지원 정보별 독립적인 면접 Space 구성
- JD와 이력서 정보를 반영한 맞춤형 질문
- 이전 답변의 맥락을 반영한 꼬리질문
- 질문 개수와 면접 길이 선택
- 4가지 면접관 페르소나 제공
- 전문형
- 친절형
- 실무형
- 압박형
- OpenAI TTS 기반 질문 음성 재생
- OpenAI Whisper 기반 답변 STT 변환
- 면접 시작 전 웹캠·마이크 장비 확인
- 자기소개부터 시작하거나 본 면접부터 시작 가능
- 면접 진행 상태를 상태 머신으로 관리
답변 내용은 다음 기준으로 구조화해 분석합니다.
- STAR 구조
- 직무 관련성
- 답변 구체성
- 논리 흐름
원본 영상을 저장하지 않고 다음 행동 요약 지표만 활용합니다.
- 시선 안정성
- 침묵 시간과 횟수
- 말속도
- 얼굴 미검출 구간
- 면접 전체 총평
- 답변 패턴 및 강점 분석
- 개선이 필요한 답변과 코칭
- 질문별 평가 결과
- 비언어 신호 요약
- 다음 면접을 위한 액션 아이템
- 약점 보완 재면접
- 외부 AI 전송 전 개인정보 마스킹
- 이력서와 JD 원문 대신 구조화된 메타데이터 활용
- 임시 음성·PDF 파일 처리 후 삭제
- 원본 영상과 음성 경로를 DB에 영구 저장하지 않음
- Supabase Access Token 기반 인증
flowchart LR
User[User] --> React[React Client]
React -->|Supabase Token| Security[Spring Security]
React -->|Session and Interview API| API[Spring Boot API]
React -->|Behavior Metrics| MediaPipe[MediaPipe]
Security --> API
API --> Session[Session Service]
API --> Interview[Interview AI Service]
API --> Speech[Speech Service]
API --> Report[Report AI Service]
Session --> PostgreSQL[(PostgreSQL)]
Interview --> PII[PII Sanitizer]
Report --> PII
PII --> OpenAI[OpenAI API]
Speech --> Whisper[Whisper STT]
Speech --> TTS[OpenAI TTS]
React --> Supabase[Supabase Auth]
flowchart TD
A[로그인] --> B[Interview Space 생성]
B --> C[회사·직무·JD·이력서 입력]
C --> D[페르소나와 질문 길이 선택]
D --> E[웹캠·마이크 장비 확인]
E --> F[AI 질문 생성 및 음성 재생]
F --> G[사용자 음성 답변]
G --> H[STT 변환]
H --> I[답변 및 비언어 지표 평가]
I --> J{마지막 질문인가?}
J -- No --> F
J -- Yes --> K[종합 AI 리포트 생성]
K --> L[약점 보완 재면접]
web_test
├── frontend
│ ├── public
│ └── src
│ ├── features/interview-space
│ │ ├── hooks
│ │ │ ├── auth
│ │ │ ├── behavior
│ │ │ ├── session
│ │ │ └── speech
│ │ └── ui
│ │ ├── auth
│ │ ├── dashboard
│ │ ├── session
│ │ ├── space
│ │ └── shared
│ ├── lib
│ └── styles
│
├── backend
│ ├── src/main/java/com/semi/interview
│ │ ├── common
│ │ │ ├── ai
│ │ │ ├── config
│ │ │ ├── exception
│ │ │ └── security
│ │ └── domain
│ │ ├── interview
│ │ ├── landing
│ │ ├── preference
│ │ ├── report
│ │ ├── resume
│ │ ├── session
│ │ └── speech
│ ├── src/main/resources/db/migration
│ └── docker-compose.yml
│
├── PROJECT_PLAN.md
├── INTERVIEW_RUNTIME_STATE_MACHINE.md
└── TEAM_README.md
- Node.js 18+
- Java 21
- Maven 3.9+
- Docker
- Supabase Project
- OpenAI API Key
git clone https://github.com/Re-terview/web_test.git
cd web_testcd backend
docker compose up -d기본 PostgreSQL 포트는 다음과 같습니다.
localhost:5433
backend/.env 파일을 생성합니다.
DB_URL=jdbc:postgresql://localhost:5433/interview_app
DB_USERNAME=postgres
DB_PASSWORD=postgres
SUPABASE_URL=your_supabase_url
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
SUPABASE_ANON_KEY=your_anon_key
OPENAI_API_KEY=your_openai_api_key
FRONTEND_ORIGIN=http://localhost:5173cd backend
mvn spring-boot:runBackend:
http://localhost:8000
frontend/.env.local 파일을 생성합니다.
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
VITE_API_BASE=http://localhost:8000cd frontend
npm install
npm run devFrontend:
http://localhost:5173
면접 과정에서 발생할 수 있는 STT·질문 전환·일시정지·종료·리포트 생성의 충돌을 방지하기 위해 런타임 상태를 명시적으로 관리합니다.
idle
→ preparing_question
→ ready
→ playing_question
→ recording
→ recording_stopping
→ stt_processing
→ stt_done
→ advancing
→ reporting
오류나 사용자 입력에 따라 다음 상태로 전환할 수 있습니다.
paused
error
자세한 상태 전이 기준은 INTERVIEW_RUNTIME_STATE_MACHINE.md에서 확인할 수 있습니다.
| Domain | Responsibility |
|---|---|
/api/sessions |
Space, 면접 세션, 턴 및 리포트 관리 |
/api/interview |
질문 생성, 답변 평가, 다음 질문 전환 |
/api/speech |
STT 및 TTS 처리 |
/api/resume |
이력서 PDF 텍스트 추출 |
/api/preferences |
사용자 환경설정 |
/api/landing |
랜딩 페이지 AI 기능 |
프로젝트는 다음 3개 도메인을 중심으로 역할을 분리했습니다.
| Domain | Responsibility |
|---|---|
| Interview Runtime | 상태 전이, 질문 전환, 체감 속도와 비동기 요청 제어 |
| AI Question & Evaluation | JD·이력서 기반 질문, 답변 평가, 피드백 전략 |
| Space UX | 입력 구조, 시작 흐름, 페르소나 체인과 Space 관리 |
공용 상태와 데이터 구조를 변경할 때는 담당자 간 합의를 거쳐 충돌을 최소화했습니다.
- Supabase JWT 기반 사용자 인증
- Spring Security를 통한 보호 API 관리
- OpenAI 전송 전 PII 마스킹
- 원본 영상 미저장
- STT 및 이력서 임시 파일 처리 후 삭제
- 원문과 외부 AI 전달용 메타데이터 분리
- Flyway 기반 DB 스키마 버전 관리
자세한 내용은 backend/PRIVACY_ARCHITECTURE.md에서 확인할 수 있습니다.