FSD를 위한 ESLint 플러그인 개발 일지
아래의 링크에서 사용할 수 있습니다.
배경

항해 플러스의 과정 중 '클린 코드' 교육이 있다.
과정을 들으면서 리팩토링의 핵심 요인이나, 코드 품질을 높이기 위한 방법을 배웠다.
그리고, 그 과정에서 Feature-Sliced-Design(FSD)
의 개념을 배우고 적용해보았다.
강제되는 규칙이 많아, 프로젝트나 네이버 웹툰 인턴을 하며 경험중인 실무에서 이를 적용해보려고 하는데, 마땅한 Lint 플러그인이 없어서 불편함을 느꼈다.
그래서, 이를 개발하기로 결정했다.
문제 상황
만약 도구를 쓴다면, 무조건 만들려고 하기 보다는 이미 있는 것을 활용하는 것이 좋다.
내가 가진 개발 철학 중 하나이다. 소프트웨어의 장점 중 하나는 '재사용성'이다. 그래서, 리서치 과정을 꼭 거치는 편이다.
공식 문서에서는 Steiger라는 도구를 권장하고 있었다.
그러나, 내가 필요한 설정은 없었고, ESLint
가 아닌 별도 라이브러리이기에 설치해서 관리해야한다는 어려움이 있었다.
비교 항목 | Steiger (별도 CLI 툴) | ESLint 플러그인 |
---|---|---|
설치 및 유지보수 | - 프로젝트에 별도 툴(클라이언트/서버) 설치 필요 - 추가 의존성 및 버전 관리 필요 - 툴 업데이트 시 팀 전체에 재설치 안내 | - 이미 존재하는 ESLint 구성에 플러그인만 추가 - 별도 툴 관리 부담 감소 - ESLint 버전 관리만 신경 쓰면 됨 |
개발 워크플로 및 에디터 통합 | - 전용 CLI를 실행해야 하므로, IDE 내 즉각적인 피드백이 어려울 수 있음 - 에디터마다 Steiger 관련 플러그인이 있을 수도 있지만, 보편적이지 않 을 수 있음 | - VSCode, WebStorm 등 거의 모든 IDE에서 ESLint를 바로 연동 - 실시간으로 린트 에러 확인 가능 - GitHooks/CI 파이프라인에서 별도 세팅 없이 자동 검사 가능 |
규칙 제어 및 세분화(린트 룰) | - 제공되는 규칙을 기반으로 사용해야 함 - 규칙 세분화나 직접적인 커스터마이징(오픈소스 기여 제외)은 제한적 - CLI 기반이므로, 에디터 내 오토픽스(autofix) 기능 사용이 어려울 수 있음 | - ESLint의 Rule 시스템을 그대로 활용 가능 - 규칙 세분화 및 에러/워닝 등 심각도 설정이 자유롭고, 예외 처리를 쉽게 구성 - AST 분석을 통한 깊이 있는 룰 작성 가능 - ESLint autofix 등 자동 수정 활용 가능 |
온보딩 및 교육 | - 새로 들어온 팀원에게 Steiger 도구 설치 및 사용법을 추가로 안내해야 함 - ESLint 경험만 있는 사람에게는 별도 툴 학습 부담 | - 대부분의 개발자가 ESLint에 익숙 - “ESLint 룰이 추가됐다” 정도로 안내하면 되므로 학습 부담 최소화 - 마이그레이션 및 팀 합의가 수월 |
확장성 및 커스터마이징 | - 도구 자체가 제공하는 옵션, 버전을 고려해야 함 - 고도화나 수정이 필요한 경우 툴 자체 업데이트를 기다려야 함 - 오픈소스 기여 과정이 복잡할 수 있음 | - 오픈소스로 릴리스 시, 빠른 피드백 및 기여 가능 - TypeScript 확장 시 @typescript-eslint/parser 등과 쉽게 연동 - 프로젝트 요구사항에 맞게 룰을 추가/변경하기 용이 |
위와 같은 이유로, ESLint
플러그인을 리서치햇다.
검색하는 과정에서 몇가지 도구를 찾았다. 그러나, 이들은 저마다 문제를 안고 있었다.
도구 | 설명 | 불편한 점 |
---|---|---|
Eslint plugin for FSD best practices | FSD BP를 기준으로 만들어진 ESLint이다. | 마지막 관리가 4~5년전으로, 관리가 제대로 이루어지지 않고 있다. 이에 따라서, ESLint 9 이상의 최신 버전에서 강제되는 Flat Config 에 대한 대응이 부족했다. |
ESLint plugin fsd import | 아마도 개인이 사용하기 위해 만들어진 Lint 같았다. | 관리가 제대로 되고 있지 않으며 기능도 제한적이다. 신뢰성이 적어 사용이 어려웠다. |
@feature-sliced/eslint-config | 135개의 스타와 8000명 이상이 다운받은 FSD를 위한 Lint 이다. | 제대로 된 관리가 2022년이며, Flat Config 의 대응이 되고 있지 않았다. |
이 외에도 여러가지 도구를 찾아보았으나, 마음에 쏙 드는 플러그인이 없었다.
필요한 요소 중, 특히 핵심적으로 다루어야 하는 부분이 Flat Config
에 대한 대응이었다.

특히나, 공식문서에서 ESLint 8.x 버전 이전의 지원이 끊긴다고 언급하고 있으므로, 신생 프로젝트에서는 ESLint 9 이상을 사용이 필요했다.
내가 찾은 방법에서는 특정 ESLint Plugin
이 Flat Config
를 제공하지 않을 경우, 플러그인 자체의 코드를 수정하지 않고서는 이를 Flat Config
에 적용할 수 있는 방법이 없었다.
그래서, 이를 해결하기 위해 직접 ESLint Plugin
을 만들기로 결정했다.