밤에만 실패하는 테스트 — 같은 커밋이 낮에는 통과했습니다
CI 게이트가 밤 9시 42분에 실패했고, 같은 커밋이 오후에는 통과했습니다. 낮에 도는 CI 가 숨은 전제가 된 테스트 8건, 밤에는 초록인데 아무것도 재지 않던 테스트, MySQL 세션 시계로 고친 과정을 정리했습니다.
MySQL e2e 테스트 시간의 39%가 정리 함수의 ALTER TABLE AUTO_INCREMENT 였습니다. 통계 캐시를 건너뛰어 필요한 표만 되돌리고, 연결은 COM_RESET_CONNECTION 으로 비워 다시 써서 로컬 381초를 205.5초로 줄인 과정과 한계를 정리했습니다.
vitest의 기본 격리는 테스트 파일마다 모듈을 다시 읽습니다. 소스를 읽어 상태를 남기는 스펙만 격리에 두고 나머지를 isolate: false로 옮긴 분류기와 거짓 통과를 막는 표지, extends 함정, 8코어 CI 측정 결과를 한계와 함께 정리합니다.
TypeScript 7은 API 없이 나와 lint와 next build에는 쓸 수 없습니다. pnpm 모노레포에서 타입 검사 명령만 7로 옮기고 나머지는 5.x에 둔 구성과 peer 함정, 검증 방법, 8코어 CI 26초가 6초가 된 측정을 정리했습니다.
릴리스마다 46분 걸리던 CI 게이트가 8.5분이 됐습니다. 그중 34.5분은 러너 교체였고 코드로 줄인 몫은 2.5분 남짓입니다. 실행마다 1.5배 다른 러너 속도와 5% 규칙, 더해지지 않는 개선까지 측정 기록을 정리했습니다.
영상 제공자를 바꾸면 기존 진도와 수료증의 의미도 다시 확인해야 합니다. 제공자·영상 버전·발급 근거를 분리하고, 스키마 확장과 서버 환경변수, 커밋 단위 배포를 준비한 과정을 정리합니다. 테스트별 검증 범위와 실제 영상 검수, 학습 기록과 동의 기반 GA4 분석의 경계도 다룹니다.
영상의 마지막 위치만으로는 실제 학습 진도를 판단하기 어렵습니다. 시청 구간의 합집합, 관측 시간과 요청 순번, 배속·탐색 처리, 토큰 갱신 중 저장과 로그아웃의 경쟁 조건을 다룹니다. 모든 회차 100%라는 수료 정책을 서버에서 판정하는 방법과 모의 테스트의 검증 범위를 정리합니다.
유료 강의의 재생 권한을 학생 인증·수강권·영상 버전과 연결했습니다. RS256 서명 URL의 claim, 서버 전용 키 관리, 15분 만료와 재발급, 공급자 보호 설정 검증을 살펴봅니다. 로그아웃 이후 남는 토큰의 유효 범위와 서명 URL이 보장하지 않는 영역도 구체적으로 정리합니다.
유료 온라인 강의를 Cloudflare Stream으로 전환하며 영상의 저장·인코딩·전달 경로를 구분했습니다. HLS와 적응형 스트리밍의 원리, 애플리케이션 서버와 CDN의 역할, 저장·전달 분량에 따른 비용 계산, 학습 진도와 과금 사용량이 달라지는 이유를 구현을 바탕으로 정리합니다.
macOS에서 관리자 APK를 빌드하고 Android 기기에 설치한 과정을 정리했습니다. JDK·SDK·Gradle의 역할, release 서명 키 관리, 충전과 ADB 연결의 차이, adb reverse를 이용한 로컬 검증을 다룹니다. 에뮬레이터 테스트와 실제 휴대폰에서 확인한 범위를 구분해 기록했습니다.