불필요한 SCSS 파일 제거로 개발 환경 정리
목차
프로젝트에 한동안 손 안 댔던 디렉토리를 열면 항상 뭔가 나온다. 이번엔 SCSS였다.
aaa 와 kingdriver 관련 SCSS 파일들이 소스 트리 안에 아직 살아있었다. 실제로 import하는 곳도 없고, 빌드 결과물에 포함되는지조차 불분명한 상태. 이런 파일들은 딱히 "문제"를 일으키는 것처럼 안 보여서 오래 방치된다. 근데 쌓이다 보면 신규 개발자가 온보딩할 때 혼란의 원인이 되고, 나중에 빌드 설정 건드릴 때도 "이거 쓰이는 건지 아닌지" 확인하는 데 시간을 날리게 된다.
총괄 팀장 입장에서 이런 cleanup 작업은 사소하게 느껴지기 쉬운데, 오히려 이게 팀 전체 속도에 직결된다는 걸 반복 경험으로 알게 됐다. 기능 개발 속도만큼이나 코드베이스를 읽는 비용도 중요하다.
SCSS가 orphan 파일로 남게 되는 이유
대부분 서비스나 기능이 deprecated될 때 CSS/SCSS는 뒷순위로 밀린다. 컴포넌트 삭제하고, 라우팅 제거하고, API 연결 끊고 나면 지쳤거나 바빠져서 스타일 파일까지 손이 안 가는 경우가 많다. 기능은 사라졌는데 스타일만 커밋 이력 속에 남는 식이다.
SCSS는 특히 더 그런데, import 체계가 복잡해지면 어디서 실제로 쓰이는지 추적이 까다롭다. @import나 @use로 연결된 참조가 여러 파일에 걸쳐있으면, "혹시 어딘가에서 쓰이는 건 아닌가" 싶어서 손을 못 대는 경우도 생긴다. 결국 확인이 귀찮아서 그냥 놔두게 된다.
이번 케이스가 딱 그 패턴이었다. kingdriver 관련 서비스 컴포넌트는 이미 제거된 상태였는데 스타일 파일만 orphan으로 남아있었고, aaa 쪽은 초기 개발 단계에서 작업하다가 방향이 바뀌면서 그냥 커밋된 채로 묶여있었다. 둘 다 참조를 grep으로 추적했을 때 import 경로가 아무데도 없었다.
# SCSS 참조 여부 확인
grep -rn "@import.*aaa" src/
grep -rn "@use.*aaa" src/
grep -rn "@import.*kingdriver" src/
grep -rn "@use.*kingdriver" src/
# partial 파일(_로 시작)이면 파일명으로도 확인
grep -rn "_aaa" src/ --include="*.scss"
grep -rn "_kingdriver" src/ --include="*.scss"
전부 결과 없음이면 제거해도 안전하다. 동적으로 경로를 조합해서 import하는 패턴이 있으면 이것만으론 부족하지만, 이 프로젝트 구조에서는 grep으로 충분히 커버됐다.
빌드 파이프라인 관점에서 본 dead SCSS
파일 몇 개 남아있는 게 뭐 대수냐 싶을 수 있는데, 빌드 파이프라인 관점에서 보면 이야기가 달라진다.
| 항목 | 영향 |
|---|---|
| 번들 포함 여부 | entry point에서 직·간접 import되면 dead code도 번들에 그대로 들어감 |
| tree-shaking | SCSS는 JS와 달리 tree-shaking이 제한적, 명시적 삭제가 더 확실 |
| 빌드 시간 | 컴파일 대상 파일 수 증가로 전체 빌드에 미세하게 영향 |
| lint 노이즈 | stylelint 등이 dead 파일까지 검사해서 불필요한 경고 발생 |
| 온보딩 비용 | 실제 사용 파일과 dead 파일이 섞이면 코드 파악 시간 증가 |
특히 PurgeCSS나 UnCSS 같은 도구를 별도로 붙이지 않는 전통적인 Sass → PostCSS → bundle 체인에서는 entry에 물려있는 파일은 사용하지 않는 selector도 그냥 번들에 포함된다. "어차피 purge 단계에서 걸러지겠지"라고 생각하기 쉬운데, purge 설정이 완벽하지 않은 경우 그냥 나가버린다. 도구 의존보다 소스 정리가 더 근본적인 해결이다.
이런 cleanup을 반복하지 않으려면
지금처럼 나중에 별도 cleanup PR을 올리는 건 결국 context를 두 번 쓰는 일이다. 기능 삭제할 때 "관련 스타일 파일도 같이 정리"가 done criteria에 포함돼 있어야 이런 잔여물이 안 쌓인다.
팀 컨벤션으로 남기면 좋을 것들:
- 기능/서비스 삭제 PR에 관련 SCSS 파일 제거가 포함돼야 완료로 인정
- 제거 전 참조 확인 grep 명령어를 PR description 템플릿에 체크항목으로 추가
- 주기적으로 orphan 파일을 탐지하는 lint rule이나 CI 스크립트 도입 고려
커밋 메시지에도 이유를 남겨두는 게 중요하다. "aaa 기능 deprecated 후 참조 없는 SCSS 파일 제거" 이 한 줄이 6개월 뒤 히스토리 볼 때 "이거 왜 없지?" 하는 혼란을 막는다. 파일 삭제 커밋은 특히 배경 설명이 없으면 나중에 되돌려야 하나 말아야 하나 판단이 어렵다.
코드베이스를 깨끗하게 유지하는 건 결국 팀의 시간을 아끼는 일이다. 당장 눈에 보이는 기능 추가가 아니라서 티가 안 날 뿐이지, 쌓이면 분명히 속도 차이가 난다. 이번 작업이 작았던 만큼, 이런 cleanup을 한 번에 끝내는 습관을 팀 단위로 만드는 계기로 삼으려고 한다.
댓글 0
첫 댓글 달아줘.