현재 회사 프로젝트는 안정적인 코드 품질 유지를 위해 husky를 이용한 pre-push 체크를 수행하고 있다. 하지만 체크 과정에서 약 4분 30초가 소요됨에 따라 개발자의 집중력이 저하되고 배포 흐름이 끊기는 문제가 발생하여 이를 최적화하기로 했다.
빌드 관련 작업(build:packages + web + storybook)이 전체의 43%를 차지하며, TypeScript Check 역시 빌드 시간과 맞먹는 시간을 소요하고 있었다.
| 작업 항목 | 소요 시간 | 비중 |
|---|---|---|
| Prettier Check | ~40초 | 15% |
| ESLint Check | ~47초 | 18% |
| pnpm install | ~4초 | 2% |
| build:packages | ~58초 | 22% |
| web build | ~37초 | 14% |
| storybook build | ~18초 | 7% |
| TypeScript Check | ~59초 | 22% |
문제점: 파일 변경 여부와 상관없이 매번 전체 프로젝트에 대해 빌드 및 린트 검사를 수행하여 불필요한 리소스 낭비가 발생함.
turbo.json의 캐시 정책을 설정하여, 소스 코드 변경이 없는 패키지는 빌드 과정을 건너뛰고 기존 dist 결과물을 재사용하도록 개선함.
// turbo.json
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"],
"inputs": ["src/**", "package.json", "tsconfig.json", "vite.config.ts"]
},
"typecheck": {
"dependsOn": ["^build"],
"cache": true,
"inputs": ["src/**", "tsconfig.json"]
},
}
}
전체 파일을 검사하던 방식에서 git diff를 활용해 실제 수정된 파일에 대해서만 Lint와 Prettier를 실행하도록 스크립트를 최적화함.
# 변경된 파일만 추출하는 로직 예시
REMOTE_BRANCH=$(git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null || echo "origin/dev")
CHANGED_FILES=$(git diff --name-only "$REMOTE_BRANCH"...HEAD)
TS_FILES=$(echo "$CHANGED_FILES" | grep -E '\.(ts|tsx|js|jsx)$' | while read -r file; do
[ -f "$file" ] && echo "$file"
done)
# xargs를 이용해 변경된 파일만 타겟팅하여 검사
echo "$TS_FILES" | xargs -r npx eslint
| 작업 항목 | 개선 전 | 개선 후 | 비고 |
|---|---|---|---|
| Lint/Prettier | ~87초 | ~15초 | 변경 파일만 검사 (Diff) |
| Packages Build | ~58초 | ~1초 | Turbo Cache 활용 |
| Storybook Build | ~18초 | ~1s | Turbo Cache 활용 |
| TypeScript Check | ~59초 | ~13s | 변경 파일만 검사 |
| 총합 | 약 4분 23초 | 약 1분 11초 | 3분 12초 단축 (73%↓) |
이번 개선의 가장 큰 장점 중 하나는 비코드 파일(Markdown, 단순 설정 등) 수정 시의 극적인 속도 향상이다.