ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
OPIc 말하기 연습 서비스 답변을 녹음하면 등급과 고친 문장을 주고, 쌓인 답변에서 반복되는 버릇을 찾아 시험일까지 할 일을 정해 줍니다. 사이트의 "로그인 없이 둘러보기"로 같은 화면을 볼 수 있습니다. 예시 기록도 실제 채점 파이프라인으로 만든 결과입니다. OPIc은 배경설문으로 고른 주제와 정해진 출제 규칙으로 15문항이 나오고, 채점자가 전체 답변을 듣고 등급을 매기는 시험입니다. 준비하면서 영어 자체보다 번거로웠던 건 주제를 뭘 고를지, 오늘 뭘 연습할지, 내 답의 무엇이 문제인지를 매번 직접 판단하는 일이었습니다. OPIcnic은 이 판단들을 대신 내려 줍니다. 답변마다 등급과 고친 문장을 주고, 답변이 쌓이면 반복되는 버릇을 찾고, 그 기록으로 시험일까지 할 일을 정합니다. 답변마다 등급(IM2, IH 등)을 알려 주고, 약한 문장을 인용해 고친 문장을 붙입니다. 모범 답안은 새로 지은 답이 아니라 내 답을 한 단계 위 수준으로 다시 쓴 것이고, 듣고 따라 말할 수 있습니다. 답변이 쌓이면 여러 답변에 반복되는 버릇(감정 없이 사실만 나열하기 등)과 유형별 약점, 이번 주 과제를 정리합니다.README 전문 보기 ↗
OPIc 말하기 연습 서비스답변을 녹음하면 등급과 고친 문장을 주고, 쌓인 답변에서 반복되는 버릇을 찾아 시험일까지 할 일을 정해 줍니다.
사이트의 "로그인 없이 둘러보기"로 같은 화면을 볼 수 있습니다. 예시 기록도 실제 채점 파이프라인으로 만든 결과입니다.
목차
OPIc은 배경설문으로 고른 주제와 정해진 출제 규칙으로 15문항이 나오고, 채점자가 전체 답변을 듣고 등급을 매기는 시험입니다. 준비하면서 영어 자체보다 번거로웠던 건 주제를 뭘 고를지, 오늘 뭘 연습할지, 내 답의 무엇이 문제인지를 매번 직접 판단하는 일이었습니다.
OPIcnic은 이 판단들을 대신 내려 줍니다. 답변마다 등급과 고친 문장을 주고, 답변이 쌓이면 반복되는 버릇을 찾고, 그 기록으로 시험일까지 할 일을 정합니다.
답변마다 등급(IM2, IH 등)을 알려 주고, 약한 문장을 인용해 고친 문장을 붙입니다. 모범 답안은 새로 지은 답이 아니라 내 답을 한 단계 위 수준으로 다시 쓴 것이고, 듣고 따라 말할 수 있습니다.
답변이 쌓이면 여러 답변에 반복되는 버릇(감정 없이 사실만 나열하기 등)과 유형별 약점, 이번 주 과제를 정리합니다.
버릇은 3개 이상의 답변에서 반복된 것만 "12개 중 8개 답변"처럼 횟수와 실제 문장을 붙여 보여 줍니다. 예상 등급은 실제 시험처럼 IH 이상이면 롤플레이 문제 해결(12번), AL이면 비교와 이슈(14, 15번)에서도 그 수준이 나와야 인정합니다. 등급 기준을 잡은 과정은 채점 보정 기록에 있습니다.
시험일을 정하면 남은 기간과 쌓인 기록으로 하루 목표를 정하고, 기록이 적거나 점수가 낮은 콤보와 유형, 오래 안 한 유형을 먼저 추천합니다.
온보딩에서 고득점에 불리한 배경설문 선택지(직업 관련 등)는 처음부터 빼고, 남은 21개 주제를 준비 부담과 함께 보여 줍니다. 목표 등급을 고르면 연습 난이도도 맞춰집니다.
연습은 아래 단위 중에서 고르고, 어떤 단위든 실제 시험 출제 규칙대로 문제가 나옵니다.
| 단위 | 구성 |
|---|---|
| 콤보 | 한 주제로 2~3문항(묘사, 루틴, 경험 등). 실제 시험의 기본 단위 |
| 문제 유형 | 묘사, 경험, 롤플레이, 비교, 이슈 중 한 유형만 |
| 주제 | 배경설문에서 고른 주제 하나 |
| 돌발 | 배경설문에서 고르지 않은 주제(전용 23개) |
| 모의고사 | 자기소개와 콤보 5개(선택 주제 3, 돌발 2). 실제 시험과 같은 15문항 |
로그인 없이 둘러보기를 누르면 예시 기록과 학습 패턴 분석, 3주 뒤 시험 일정이 채워진 계정으로 바로 써 볼 수 있습니다. 방문자마다 별도 계정이고 7일 뒤 지워지며, 무료 LLM 한도 때문에 채점은 하루 6문항까지입니다.
녹음 파일(S3)과 채점 작업(DB)이 요청 밖에 있어서, 사용자가 화면을 떠나거나 서버가 재시작돼도 채점이 이어집니다.
설계 기준은 MAU 24만, 피크 동시 채점 30건을 가정했습니다. 목표는 접수 응답 p95 0.5초 이내, 이탈이나 재시작에도 채점 완료율 100%, 외부 API 일시 장애에도 실패 문항 0입니다(docs/performance/slo.md).
앞의 셋은 로컬에서 mock 외부 API에 장애를 주입한 실험, 마지막은 실제 녹음으로 실제 외부 API를 호출해 잰 값입니다(12.9s는 문항별 처리 시간의 합).
채점 비동기 전환: 녹음 파일을 서버 메모리에 올려 요청 안에서 채점하다 보니, 장애가 나면 녹음이 사라지고 재시도도 요청 시간 안에서만 할 수 있었습니다. 녹음은 S3에 직접 올리고 채점은 DB 큐의 워커가 재시도까지 맡도록 바꿔, 접수는 바로 응답하고 외부 장애는 뒤에서 흡수합니다.
문제 원인
해결 과정
결과
더 자세히: 블로그 글 / 설계 기록 (ADR)
재시도 폭주 방지: 외부 API가 복구되는 순간 밀린 재시도가 한꺼번에 몰려 제공자 한도를 다시 넘겼습니다. full jitter 지수 백오프로 재시도 시점을 흩고 워커 동시성을 제한해, 기존 백오프 대비 복구 후 채점 완료가 270초에서 54초로, 429 비율이 33%에서 0.4%로 줄었습니다.
문제 원인
해결 과정
결과
(mock 외부 API로 테스트: 콤보 30건, 60초 장애 후 복구, 복구 직후 초당 10건 처리)
디스크 I/O 병목 제거: DB 풀 확장과 가상 스레드 pinning 가설을 1KB 격리 실험과 JFR로 하나씩 기각하고, 톰캣 멀티파트 임시파일 쓰기가 원인임을 찾았습니다. 멀티파트 임계치를 올려 디스크 쓰기를 없애 RPS 96 → 652, 평균 지연 1,100ms → 249ms(2026-04, mock 외부 API, 단일 실행). 함께 넣은 InputStream 릴레이는 6월에 재시도 때문에 되돌렸습니다(아래 접기).
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗
더 자세히: 실험 기록
문항 병렬 처리: 콤보 3문항을 차례로 채점해 외부 API 대기가 문항 수만큼 쌓였습니다. 문항마다 가상 스레드로 나눠 병렬로 처리해, 문항별 처리 시간의 합 12.9초가 걸리던 채점이 4.7초에 끝났습니다(실제 녹음, 실제 외부 API).
StructuredTaskScope로 문항을 병렬로 채점하고, 하나가 실패하면 나머지를 취소했습니다. 문항별 시간의 합 12,886ms → 병렬 실측 4,719ms(2.7배).
지금은 비동기 워커가 문항을 각각 독립된 작업으로 가상 스레드에서 처리합니다.
코칭 리포트 역할 분리: 처음엔 답변 묶음을 LLM에 통째로 주고 패턴을 찾게 했더니 "오류가 거의 없는데 시제가 적절하지 않다"처럼 앞뒤가 안 맞는 진단이 나왔습니다. 답변 하나에 대한 판단(태그)만 LLM이 하고, 세기와 문턱값, 묶기는 코드가 하도록 나눴습니다. 이후 잘한 점 태그 일부(VOCAB_RICH 등)가 약점으로 세어지던 버그도 이 집계 단계에서 찾아 고쳤습니다.
모니터링: Prometheus, Grafana, Alertmanager로 앱 골든 시그널과 외부 API, 비동기 워커 큐를 봅니다. 알림은 서버 지표가 아니라 사용자가 겪는 증상(접수 실패, 채점 지연) 기준으로 걸었습니다.
로컬 재현: 사용자 30명, 외부 API 45% 장애 8분 뒤 복구. 장애 중 실패율과 429, 재시도가 오르지만 복구 후 밀린 문항이 처리되어 최종 실패 0