Skip to content
@Today-Eng

Today-Eng

TodayEng

main
preview

오늘의 나를 아는 질문으로 시작하는 영어 스피킹

오늘의 질문에 영어로 답하면, 나만의 영어 회고록 한 편이 완성됩니다.




💡 About TodayEng

about

영어로 말하고 싶어도 무엇을 이야기해야 할지 막막하고, 반복되는 교재식 질문만으로는 영어 스피킹 습관을 꾸준히 이어가기 어렵습니다.

TodayEng은 정해진 주제가 아닌 사용자의 실제 하루에서 질문을 만듭니다.

사용자가 직접 남긴 기록뿐 아니라 Google Calendar 일정, 날씨, Spotify 음악 기록, 사진과 과거 회고를 활용해 오늘의 나에게 맞는 영어 질문을 생성합니다. 질문에 음성 또는 텍스트로 답하면 AI가 자연스러운 영어 표현으로 교정하고 이유를 설명하며, 완성된 질문과 답변은 하나의 영어 회고록으로 차곡차곡 기록됩니다.


✨ Main Features

Feature Description
🧠 Personalized Questions 오늘의 기록과 과거 회고를 분석하여 매일 다른 개인화 질문을 생성합니다.
🎙️ AI Speaking Reflection 음성·텍스트 답변을 AI가 자연스러운 영어 표현으로 교정하고 교정 이유를 제공합니다.
📖 Diary Archive 회고를 날짜별로 보관하고 원문과 교정문, 교정 이유를 다시 확인할 수 있습니다.
🔔 Habit Building 연속 작성 기록과 Web Push 리마인더를 통해 꾸준한 영어 회고 습관 형성을 지원합니다.

👥 Member

김성연
김성연
이희원
이희원
이가윤
이가윤
이은우
이은우
이현경
이현경
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

📱 Service Flow

flow-1 flow-2 flow-3

사용자는 오늘 있었던 일과 사진을 가볍게 기록하는 것만으로 회고를 시작할 수 있습니다.

Today's Context → Personalized Questions → English Speaking → AI Correction → Diary

오늘의 기록과 외부 데이터를 바탕으로 세 개의 개인화 질문을 생성하고, 사용자는 AI와 대화하듯 영어로 답하며 자신의 하루를 돌아봅니다.


🏗 System Architecture

system-architecture

TodayEng은 React 기반 FrontendSpring 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 등의 외부 서비스를 연동하여 개인화된 영어 회고 경험을 제공합니다.


🛠 Tech Stack

Frontend

Backend

AI & External Services

Infrastructure & DevOps

Observability


🚀 Technical Highlights

01. Context-aware Personalized Questions

highlights-1
  • 서로 다른 형태와 출처를 가진 사용자 데이터를 내부의 공통 DiaryContext 모델로 통합하여 질문 생성 계층에서 동일한 Context 단위로 활용합니다.

  • 당일 최초 접속 시 오늘의 데이터를 사전 수집하고 실제 회고 시작 직전에 다시 최신화하는 2단계 Context 수집 구조를 적용하여 불필요한 외부 API 호출을 줄이면서도 질문 생성 시점의 최신성을 확보했습니다.

  • 각 외부 Context Provider는 독립적으로 처리하여 일부 외부 서비스가 실패하더라도 정상적으로 확보된 Context만으로 회고를 계속할 수 있도록 구성했습니다.


02. Structured Long-term Memory

highlights-2
  • 과거 회고 원문을 계속 LLM에 누적하는 대신 반복되는 사람·장소·활동·관심 주제와 최근 감정 등을 구조화한 DIARY_MEMORY로 변환하여 다음 질문 생성에 재사용합니다.

  • Memory가 참조하는 원본 회고를 sourceDiaryIds로 함께 관리하고 서버에서 실제 입력 회고와의 관계를 검증하여 생성형 AI가 존재하지 않는 출처를 생성하는 것을 방지했습니다.

  • 후보 회고 수에 따른 Token·응답 시간·유효 기억 수를 직접 비교한 결과를 바탕으로 최근 30일 내 최대 10개의 완료 회고를 기본 후보 상한으로 결정했습니다.


03. Asynchronous Real-time Reflection Pipeline

highlights-3
  • 음성 답변 이후 수행되는 STT → AI Correction → Follow-up Question → TTS 작업을 업로드 HTTP 요청과 분리된 비동기 파이프라인으로 처리합니다.

  • 클라이언트는 SSE를 구독하고 서버는 처리 단계별로 answer.transcribed · answer.corrected · question.ready · follow-up.ready · ready-to-complete 이벤트를 전달하여 사용자가 결과를 순차적으로 확인할 수 있도록 구성했습니다.

  • 처리 실패 시 processing_failed 이벤트를 전달하고, 일부 AI 처리 실패 상황에서는 기본 후속 질문을 사용하여 회고 흐름이 가능한 한 중단되지 않도록 처리합니다.


04. Blue-Green Deployment & Operations

highlights-4
  • 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에서 추적할 수 있도록 구성했습니다.


Popular repositories Loading

  1. TodayEng-BE TodayEng-BE Public

    Java 1

  2. TodayEng-FE TodayEng-FE Public

    TodayEng 프론트엔드 레포지토리입니다.

    TypeScript

  3. .github .github Public

Repositories

Showing 3 of 3 repositories

People

This organization has no public members. You must be a member to see who’s a part of this organization.

Top languages

Loading…

Most used topics

Loading…