2025.11–현재
기획 · 개발 · 운영 1인 담당
v3.78
실사용자 대상 암기 학습 웹서비스
학습 기능을 만드는 데서 끝내지 않고, 운영 지표와 AI 비용까지 직접 책임졌습니다.
React · TypeScript 프론트엔드와 FastAPI · PostgreSQL 백엔드, OpenAI 기반 출제·채점을 한 저장소에서 설계하고 실제 학습 현장에 배포해 개선하고 있습니다.
449명 전체 회원
16,496회 14일 학습 완료
36명 최고 동시 접속
1,016개 자동화 테스트
회원 수: 2026.08.23 기준 · 운영 지표: 2026.08.10 ~ 08.23 · 테스트 수: 최신 이력서 기준. 실측 최고 동시접속 36명과 설계 시나리오 100~300명을 구분합니다.
01 · TRAFFIC & INFRASTRUCTURE
사용자 수에 체류 시간과 폴링 주기를 함께 대입했습니다.
클라이언트에서 주기적으로 발생하는 요청을 계산하고, 함수 인스턴스별 커넥션 상한과 운영 DB의 컴퓨트 예산을 함께 관리했습니다.
01 React · Vite Vercel 정적 웹 배포
02 FastAPI 서버리스 함수 · sin1
03 PgBouncer Neon pooled 연결
04 PostgreSQL 운영 데이터 · 학습 기록
02 · PRODUCT
학습과 복습이 이어지는 화면
전체 구절 쓰기부터 빈칸·키워드·주제·암송 훈련까지 학습 난이도를 선택하고, 틀린 구절과 학습 기록으로 자연스럽게 복습하도록 구성했습니다.
학습 모드 과정 · 범위 · 난이도별 훈련 선택
빈칸 퀴즈 핵심 단어를 입력하며 반복 학습
오답노트 틀린 구절을 시험과 암송 훈련으로 재학습
나의 기록 학습 시간과 점수 추이를 달력으로 확인
이미지를 선택하면 원본 크기로 볼 수 있습니다.
03 · IMPLEMENTATION
운영에서 발견한 문제를 제품과 코드로 되돌렸습니다.
01
서버리스 커넥션 상한
함수 인스턴스별로 생성되는 풀을 pool_size 1 / max_overflow 2로 제한하고 Neon pooled 연결을 사용했습니다. 로컬 개발과 운영 환경의 풀 설정을 분리해 연결 수 증가를 통제했습니다.
02
폴링 기반 트래픽 산정
배지 30초 · 알림 30초 · heartbeat 2분 주기를 기준으로, 해당 폴링이 모두 활성화된 탭의 요청을 1인당 시간당 약 270회로 산정했습니다. 100~300명은 설계 시나리오이며 부하 테스트 실측값은 아닙니다.
03
컴퓨트 예산 운영 기준
당시 100 CU-hour 예산에 대해 2 CU × 하루 8시간이면 하루 16 CU-hour, 6일이면 96 CU-hour임을 계산했습니다. 예산·저장 공간 70~80%를 점검 기준으로 두고 피크 기간의 플랜 전환을 계획했습니다.
04
API · DB 리전 정렬
FastAPI 함수 배포 리전을 운영 DB와 동일한 sin1로 고정해 불필요한 지역 간 왕복을 피했습니다. 배포 설정과 저장소 운영 규칙에 기준을 남겼습니다.
05
AI 품질 · 비용 가드레일
출제·채점의 추론 강도를 분리하고 예산·주간 생성 한도를 적용했습니다. 관측 기간 14일간 시험지 170개, 추정 비용 약 $0.24를 기록하고 관리자 화면에서 실패와 누적 추정 비용을 확인했습니다.
06
조회 개선 · 회귀 검증
시험 목록의 N+1 쿼리를 배치 조회로 바꾸고 페이지네이션을 적용했습니다. 백엔드 685개 · 프론트 331개 테스트에 실제 화면의 요청 파라미터 형식까지 포함해 재발을 점검했습니다.
04 · QUALITY & OPERATIONS
한 번 겪은 장애를 다시 겪지 않기 위한 테스트
백엔드 pytest 685개와 프론트 Node 테스트 331개를 유지하며, 서버 요청 형식뿐 아니라 실제 화면이 보내는 파라미터 형태까지 회귀 테스트에 포함했습니다.
실사용 운영
프론트와 API를 분리 배포하고, 버전 변경 때마다 변경 내역 · README · 앱 메타데이터를 함께 갱신하는 릴리스 규칙으로 운영하고 있습니다.
서비스 열기
API 문서
GitHub (private)