영어로 말하고 싶어도 무엇을 이야기해야 할지 막막하고, 반복되는 교재식 질문만으로는 영어 스피킹 습관을 꾸준히 이어가기 어렵습니다.
TodayEng은 정해진 주제가 아닌 사용자의 실제 하루에서 질문을 만듭니다.
사용자가 직접 남긴 기록뿐 아니라 Google Calendar 일정, 날씨, Spotify 음악 기록, 사진과 과거 회고를 활용해 오늘의 나에게 맞는 영어 질문을 생성합니다. 질문에 음성 또는 텍스트로 답하면 AI가 자연스러운 영어 표현으로 교정하고 이유를 설명하며, 완성된 질문과 답변은 하나의 영어 회고록으로 차곡차곡 기록됩니다.
| Feature | Description | |
|---|---|---|
| 🧠 | Personalized Questions | 오늘의 기록과 과거 회고를 분석하여 매일 다른 개인화 질문을 생성합니다. |
| 🎙️ | AI Speaking Reflection | 음성·텍스트 답변을 AI가 자연스러운 영어 표현으로 교정하고 교정 이유를 제공합니다. |
| 📖 | Diary Archive | 회고를 날짜별로 보관하고 원문과 교정문, 교정 이유를 다시 확인할 수 있습니다. |
| 🔔 | Habit Building | 연속 작성 기록과 Web Push 리마인더를 통해 꾸준한 영어 회고 습관 형성을 지원합니다. |
김성연 |
이희원 |
이가윤 |
이은우 |
이현경 |
| Design · Frontend | Planning · Design | Frontend · Backend | Backend · Infra | Frontend · Backend |
|
회원가입 · 마이페이지 UI 회고 플로우 FE |
서비스 기획 Design System · Branding |
Home · Archive Web Push |
Context · AI Memory OAuth · CI/CD |
Auth · MyPage Voice Reflection · SSE |
사용자는 오늘 있었던 일과 사진을 가볍게 기록하는 것만으로 회고를 시작할 수 있습니다.
Today's Context → Personalized Questions → English Speaking → AI Correction → Diary
오늘의 기록과 외부 데이터를 바탕으로 세 개의 개인화 질문을 생성하고, 사용자는 AI와 대화하듯 영어로 답하며 자신의 하루를 돌아봅니다.
TodayEng은 React 기반 Frontend와 Spring Boot 기반 Backend를 중심으로 구성했습니다.
Frontend는 Vercel을 통해 배포하며, Backend는 Google Compute Engine의 Blue / Green 두 개 환경에서 운영합니다. 사용자 요청은 GCP Load Balancer를 통해 현재 활성 환경으로 전달됩니다.
정형 데이터는 Cloud SQL for MySQL, 사진과 음성 등의 비정형 데이터는 Amazon S3에 저장하여 애플리케이션 서버와 영구 데이터를 분리했습니다.
또한 Gemini, Google Cloud Speech-to-Text / Text-to-Speech, Google Calendar, Spotify, Open-Meteo 등의 외부 서비스를 연동하여 개인화된 영어 회고 경험을 제공합니다.
-
서로 다른 형태와 출처를 가진 사용자 데이터를 내부의 공통
DiaryContext모델로 통합하여 질문 생성 계층에서 동일한 Context 단위로 활용합니다. -
당일 최초 접속 시 오늘의 데이터를 사전 수집하고 실제 회고 시작 직전에 다시 최신화하는 2단계 Context 수집 구조를 적용하여 불필요한 외부 API 호출을 줄이면서도 질문 생성 시점의 최신성을 확보했습니다.
-
각 외부 Context Provider는 독립적으로 처리하여 일부 외부 서비스가 실패하더라도 정상적으로 확보된 Context만으로 회고를 계속할 수 있도록 구성했습니다.
-
과거 회고 원문을 계속 LLM에 누적하는 대신 반복되는 사람·장소·활동·관심 주제와 최근 감정 등을 구조화한
DIARY_MEMORY로 변환하여 다음 질문 생성에 재사용합니다. -
Memory가 참조하는 원본 회고를
sourceDiaryIds로 함께 관리하고 서버에서 실제 입력 회고와의 관계를 검증하여 생성형 AI가 존재하지 않는 출처를 생성하는 것을 방지했습니다. -
후보 회고 수에 따른 Token·응답 시간·유효 기억 수를 직접 비교한 결과를 바탕으로 최근 30일 내 최대 10개의 완료 회고를 기본 후보 상한으로 결정했습니다.
-
음성 답변 이후 수행되는 STT → AI Correction → Follow-up Question → TTS 작업을 업로드 HTTP 요청과 분리된 비동기 파이프라인으로 처리합니다.
-
클라이언트는 SSE를 구독하고 서버는 처리 단계별로
answer.transcribed·answer.corrected·question.ready·follow-up.ready·ready-to-complete이벤트를 전달하여 사용자가 결과를 순차적으로 확인할 수 있도록 구성했습니다. -
처리 실패 시
processing_failed이벤트를 전달하고, 일부 AI 처리 실패 상황에서는 기본 후속 질문을 사용하여 회고 흐름이 가능한 한 중단되지 않도록 처리합니다.
-
Google Compute Engine의 Blue / Green 두 환경과 GCP Load Balancer를 이용해 신규 버전을 비활성 환경에 먼저 배포하고 Health Check 이후에만 트래픽을 전환합니다.
-
Docker 이미지는
latest대신 Git Commit SHA를 배포 단위로 사용하며, 전환 이후 문제가 발생하면 기존 정상 환경으로 트래픽을 다시 전환할 수 있도록 롤백 흐름을 구성했습니다. -
Blue / Green 두 인스턴스에서 동일한 Scheduler가 동시에 실행되며 Web Push가 중복 발송되는 문제에는 ShedLock + MySQL Distributed Lock을 적용하여 하나의 인스턴스만 작업을 수행하도록 제어했습니다.
-
두 VM의 운영 로그는 Google Cloud Logging으로 중앙화하여 서버별 로그와 Scheduler·Web Push 실행 결과를 Logs Explorer에서 추적할 수 있도록 구성했습니다.





