Frontend Engineer · Platform & Build Architecture
오태훈. 여러 팀의 프론트엔드 앱을 하나의 제품으로 묶는 플랫폼 계층을 3년간 담당했습니다. 도구의 오탐과 제 자신의 진단 오류까지 실측으로 검증하고 정정하는 것을 습관으로 삼습니다.
CI가 원리적으로 못 잡는 조용한 실패 — 이슈 등록부터 릴리스 반영까지 하루.
eager: true shared 사용 시 프로덕션 빌드 산출물이 부팅 시점에 크래시.
빌드는 EXIT 0·경고 0으로 정상 종료 — 배포 후 런타임에만 드러난다.// 플러그인 후처리: Vite preload 헬퍼를 지우려는 정규식이 모듈 경로를 보지 않고
// `{ _ as X }` 형태의 import를 전부 매칭한 뒤, X의 "함수 호출"이 없으면 문장째 삭제한다.
// 네임스페이스 import는 값으로만 참조되므로 여기 걸려 지워졌다.
if (!hasCall(local, chunk)) dropImportStatement() // 판정: 호출되는가
// 수정(v1.20.3): 판정 기준을 "참조되는가"로 교체 — 기존 동작 보존, 결함만 제거
if (!new RegExp(`\\b${local}\\b`).test(chunk)) dropImportStatement()
"전체를 마이그레이션해야 한다"는 전제를 POC 하나로 반박하고 1년 6개월 프로덕션 운영.
잡을 빠르게 만드는 것과 파이프라인을 빠르게 만드는 것은 다른 문제였다.
| 병목 | 원인 (실측) | 조치 | 효과 |
|---|---|---|---|
| 정적분석 스캔 | 순회 86만 경로 — pnpm 심볼릭 링크가 실파일 7.5만 개를 33만 경로로 증폭, 제외 설정은 순회를 막지 않음 | 스캔 루트를 실제 대상만 열거 (순회 → 약 2.8만 경로) | 350 → 80초 |
| 캐시 아카이빙 | 4개 잡이 동일한 2.5GB 캐시를 각각 push | 쓰기를 임계 경로 밖 잡으로 한정 | 잡당 −35~39초 |
| 테스트 환경 | 전역 jsdom 설정이 파일 단위 환경 선언과 충돌 — DOM 불필요한 167개 파일이 비용 지불 | 기본값 반전 + 누락 독블록 6개 보강 (전수 실행으로 확인) | 91 → 59초 |
| 러너 자원 | 호스트 14코어 중 4개만 VM에 할당 | VM 8코어로 확장 (공용 머신이라 메모리는 불변) | vitest 124 → 58초 |
| 스케줄링 | 슬롯 부족 76초 큐잉(queued_duration으로 확인) + 의존 없는 잡의 스테이지 직렬화 82초 | concurrent 확장 + needs: [] | 사장 82 → 3초 |
이미 발행한 문서를 정정하고 주입 축을 컴파일 타임으로 재설계.
nodeTransform으로 빌드 타임 주입. 템플릿 AST에서 업무 의미를
추출하는 9단계 폴백 + 위치 기반 스냅샷 병합으로 문구 수정이 테스트를
깨뜨리지 않게. 해결 안 되는 구간은 "해결했다" 대신 미보증 등급으로 정직하게 표기.