Main: https://github.com/zagdang/design-system/pull/3
최근 새로운 프로젝트를 시작하게 되어 디자인 시스템을 구현하게 되었다. 여기서 프로젝트에 관련된 가장 큰 고민은 서비스들이 배포한 npm을 다운받아 UI를 구성하다가 버그가 났을 때 이슈를 빠르게 수정하고 배포해야 하는 상황이었다. 팀원 또한 이것에 관하여 npm 배포보다는 오히려 서비스 내에 모노레포를 넣는 것이 어떻겠느냐라는 의견이 있었고, 이 과정에서 디자인 시스템을 분리하여 서비스 레포의 번들 사이즈를 줄이고 그 대신 배포 속도를 확실히 높인 Yarn Berry와 Turbo Repo를 택하게 되었다.
실제 구조 예시
node_modules/
├── react/
│ └── node_modules/
│ ├── prop-types/
│ └── loose-envify/
├── react-dom/
│ └── node_modules/
│ ├── prop-types/
│ ├── loose-envify/
│ └── scheduler/
└── next/
└── node_modules/
├── react/
│ └── node_modules/
│ └── prop-types/
└── webpack/
발생하는 문제
중복 설치
prop-types
가 react, react-dom, next/react 각각의 node_modules에 설치됨디스크 공간 계산 예시
설치 시간 증가
**2. 동일 패키지의 다양한 버전 중복 설치 현상
실제 사례 예시
node_modules/
├── package-a/
│ └── node_modules/
│ └── lodash@4.17.21/
├── package-b/
│ └── node_modules/
│ └── lodash@4.17.20/
└── package-c/
└── node_modules/
└── lodash@4.17.19/
문제점 상세
버전 충돌
메모리 사용량 증가
번들 사이즈 증가
3. 깊은 의존성 트리로 인한 경로 길이 제한 문제
Windows 환경에서의 제한
C:\Project\node_modules\package-a\node_modules\package-b\node_modules\package-c\node_modules\package-d\node_modules\...
Windows 경로 길이 제한
실제 발생하는 오류 예시
Error: ENAMETOOLONG: name too long
현실적인 영향
개발 환경 문제
// 이런 긴 경로를 가진 모듈 import 시
import module from './node_modules/package-a/node_modules/package-b/node_modules/package-c/lib/index.js'
CI/CD 파이프라인 영향
해결을 위한 임시 방편
// package.json
{
"scripts": {
"postinstall": "node ./scripts/fix-windows-paths.js"
}
}
이러한 문제들은 프로젝트 규모가 커질수록 더욱 심각해지며, 특히 모노레포 환경에서는 그 영향이 배가된다.
디자인 시스템 내에서도 ui, icons, colors로 분리했었기 때문에 npm보다는 다른 패키지를 생각하였다.
Yarn Berry를 첫 선택으로 한 이유
디자인 시스템을 설계할 때 가장 중요하게 생각한 부분은 '빠른 수정과 배포' 였다. 여러 서비스에서 공통으로 사용하는 컴포넌트들이다 보니, 문제가 발생했을 때 얼마나 빨리 수정하고 배포할 수 있는지가 핵심이었다.
1. Plug'n'Play의 강력한 이점
기존 node_modules 방식이 아닌 PnP 방식을 사용하면서 얻은 장점들:
2. 모노레포 구성의 편의성
디자인 시스템을 이렇게 구성했다:
packages/
├── ui/ # shadcn 기반 컴포넌트
├── icons/ # 아이콘 컴포넌트
└── colors/ # 디자인 토큰
이렇게 나눠놓으니:
3. Zero-Install 시스템
협업할 때 정말 편했던 점:
Turbo Repo 추가 도입
Yarn Berry에 Turbo Repo를 더하면서 개발 환경이 더 좋아졌다.
1. 빌드 시스템 최적화
// turbo.json
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"dev": {
"cache": false
}
}
}
이렇게 설정하니:
2. 개발 생산성 향상
실제로 체감한 변화들:
실제로 좋았던 점
빠른 이슈 대응
개발 환경의 일관성
퍼포먼스 향상
지금은 기본적인 구조만 잡아놓은 상태다. 앞으로:
이런 구조 덕분에 디자인 시스템 운영이 한결 수월해졌다. 특히 현재 진행중인 서비스에서 동시에 사용하는 상황에서 진가를 발휘했다고 팀원들에게 긍정적인 평가를 받았다. 앞으로 더 고도화를 진행해볼 예정이다.