• 배경

기존 프로젝트들에서 SCSS 코드가 중복되고 일관성이 부족한 문제가 있었습니다. 각 프로젝트마다 비슷한 스타일 코드를 반복해서 작성하고 있었고, 디자인 시스템의 변경사항을 여러 프로젝트에 적용하는 것이 번거로웠습니다.

• 목표

  • 공통 SCSS 컴포넌트를 모듈화하여 재사용성 증대
  • 디자인 시스템의 일관성 유지
  • 프로젝트 간 스타일 코드 중복 제거
  • 유지보수성 향상
  • 퍼블리싱 팀도 쉽게 사용할 수 있는 배포 방식 구축

• 배포 방식 고민 과정

SCSS 모듈화를 진행하면서 가장 고민이 되었던 부분은 어떤 방식으로 배포하고 관리할 것인가? 였습니다. 개발팀뿐만 아니라 퍼블리싱 팀도 쉽게 사용할 수 있어야 했고, 동시에 보안과 관리 효율성도 고려해야 했습니다.

1. 사내 NPM Registry (Verdaccio) 방식

첫 번째로 고려한 방식은 Verdaccio를 사용한 사내 NPM Registry 구축이었습니다.

장점

  • npm 생태계와 완벽 호환
  • 패키지 버전 관리 자동화
  • 의존성 관리 용이
  • 표준적인 배포 방식

단점

  • 별도 서버 운영 필요
  • 초기 설정 복잡도
  • 서버 관리 비용
  • 퍼블리싱 팀의 npm 명령어 학습 필요
# Verdaccio 설치 및 실행
npm install -g verdaccio
verdaccio
 
# 사내 registry 설정
npm config set @your-company:registry http://localhost:4873/
npm publish --registry=http://localhost:4873/

2. 웹 개시 방식 (CDN/CloudFront)

두 번째로 검토한 방식은 웹 개시 방식으로, CloudFront나 일반 웹 서버를 통해 SCSS 파일을 직접 제공하는 방식이었습니다.

장점

  • 간단한 URL로 접근 가능
  • 캐싱 최적화
  • 별도 도구 설치 불필요
  • 브라우저에서 직접 확인 가능

단점

  • 치명적 한계: @mixin 사용 불가
  • 컴파일 시 경로 해석 문제
  • 버전 관리 복잡
  • 의존성 관리 어려움
// 웹 개시 방식 - 불가능한 예시
@import 'https://cdn.your-company.com/scss/mixins.scss'; // 작동하지 않음

이 방식은 SCSS가 모두 CSS로 빌드되어 배포되기 때문에 @mixin 방식을 사용할 수 없다는 치명적인 단점 때문에 초기에 배제되었습니다.

3. Git 방식 (최종 선택)

세 번째로 고려하고 최종 선택한 방식Git Repository를 직접 활용하는 방식입니다.

선택 이유

  1. 간편성: npm의 Git 직접 설치 기능 활용
  2. 보안성: AWS CodeCommit을 통한 사내 저장소 관리
  3. 접근성: 퍼블리싱 팀도 쉽게 사용 가능
  4. 유연성: 브랜치, 태그를 통한 버전 관리
  5. 비용 효율성: 별도 서버 운영 불필요

• Git 방식 선택의 결정적 요인

퍼블리싱 팀 접근성 고려

퍼블리싱 팀이 기존에 사용하던 방식과 크게 다르지 않아야 했습니다. Git 방식은 단순히 @use 문의 경로만 수정하면 되는 수준이었고, 새로운 도구나 개념을 학습할 필요가 없었습니다.

// 기존 방식
@use "../abstract/abstract" as *;
 
// 변경된 방식
@use "scss/abstract/abstract" as *;

WAS 소스 수정 사항

기존 빌드 시스템에서 node_modules 경로를 인식하도록 build, gulp 과정에 includePaths: ['node_modules']를 추가했습니다.

실제 테스트 결과

팀 내 테스트를 통해 다음을 확인했습니다:

  1. 기존 구조 유지: 기존 소스의 구조 변경 없이 경로만 수정
  2. 선택적 import: 기존처럼 common만 또는 abstract만 import도 가능
  3. 간편한 업데이트: npm update scss로 간단한 버전 업데이트
  4. 별도 관리 불필요: 추가적인 서버 운영이나 관리 작업 없음
  5. 엔터프라이즈 호환: 망 분리 환경에서도 Git 파일을 압축하여 배포 가능

버전 관리 전략 검증

다양한 Git 참조 방식을 테스트한 결과:

// 태그 방식 (동작하지 않음)
"scss": "git+https://git-codecommit.your-region.amazonaws.com/scss#v1.0.0"
 
// 브랜치 방식 (✅ 선택됨)
"scss": "git+https://git-codecommit.your-region.amazonaws.com/scss#develop"
 
// 커밋 해시 방식 (테스트 예정)
"scss": "git+https://git-codecommit.your-region.amazonaws.com/scss#a1b2c3d"

최종적으로 브랜치를 통한 버전 관리 방식을 채택했습니다.

• 모듈화 진행 과정

1. 공통 컴포넌트 분석

기존 프로젝트들을 분석하여 자주 사용되는 스타일 패턴들을 파악했습니다:

  • 버튼 컴포넌트
  • 폼 요소 스타일
  • 레이아웃 유틸리티
  • 색상 팔레트
  • 타이포그래피
  • 아이콘 세트

2. SCSS 모듈 구조 설계

실제 프로젝트 구조를 기반으로 다음과 같이 설계했습니다:

scss/
├── package.json
├── abstract/          # 변수, 믹스인, 함수 및 기본 스타일
│   ├── _color.scss
│   ├── _fontStyle.scss
│   └── _commonMixIn.scss
├── common/           # 일반적인 UI 컴포넌트 및 범용 유틸리티
│   ├── _baseModule.scss
│   └── _popup.scss
├── iconSet/          # 아이콘 관리
│   ├── _iconSet.scss
│   ├── svg-form/
│   └── svg-ic/
└── README.md

3. Git 저장소 설정

AWS CodeCommit을 사용하여 사내 SCSS 모듈을 관리하기로 결정했습니다.

# 저장소 생성
aws codecommit create-repository --repository-name scss --repository-description "사내 SCSS 모듈화 프로젝트"
 
# 초기 설정
git init
git add .
git commit -m "Initial commit: SCSS 모듈화 프로젝트 시작"
git remote add origin https://git-codecommit.your-region.amazonaws.com/scss
git push -u origin main

4. 패키지 설정

package.json 파일을 통해 모듈의 메타데이터와 의존성을 관리합니다:

{
  "name": "scss",
  "version": "1.0.0",
  "description": "사내 SCSS 모듈화 프로젝트",
  "main": "abstract/abstract.scss",
  "style": "abstract/abstract.scss",
  "scripts": {
    "build-css": "sass --load-path node_modules main.scss output.css"
  },
  "keywords": ["scss", "css", "design-system"],
  "author": "your-team",
  "license": "MIT"
}

• 사용 방법

설치

프로젝트에서 다음 명령어로 SCSS 모듈을 설치합니다:

npm i git+https://git-codecommit.your-region.amazonaws.com/scss

사용 예시

// 기존 방식
@use "../abstract/abstract" as *;
 
// 새로운 방식
@use "scss/abstract/abstract" as *;
 
// 선택적 import도 가능
@use "scss/common/baseModule" as *;
@use "scss/iconSet/iconSet" as *;

소스 최신화 방법

# 패키지 버전 업데이트
npm update scss
 
# 또는 특정 브랜치로 업데이트
npm install git+https://git-codecommit.your-region.amazonaws.com/scss#develop

• 배포 방식별 비교 결과

방식장점단점퍼블리싱 팀 접근성선택 여부
Verdaccionpm 생태계 호환, 표준적 방식서버 운영 필요, 학습 비용보통
웹 개시간단한 URL 접근Mixin 사용 불가좋음
Git 방식간편성, 보안성, 비용 효율성Git 이해 필요매우 좋음

• 도입 효과

1. 개발 효율성 증대

  • 재사용 가능한 컴포넌트로 개발 시간 30% 단축
  • 검증된 스타일 패턴 사용으로 품질 향상

2. 일관된 디자인 시스템

  • 모든 프로젝트에서 동일한 스타일 가이드 적용
  • 브랜드 일관성 유지

3. 유지보수성 향상

  • 중앙 집중식 관리로 업데이트 용이
  • 버전 관리를 통한 안정성 확보

4. 팀 협업 개선

  • 퍼블리싱 팀과 개발팀 간 원활한 협업
  • 별도 학습 없이 기존 방식 활용

5. 보안성 강화

  • 사내 CodeCommit 사용으로 외부 노출 위험 최소화
  • 접근 권한 관리 가능

• 향후 계획

  1. 컴포넌트 확장: 기능별 추가 UI 컴포넌트들을 모듈로 분리
  2. 문서화: 각 컴포넌트의 사용법과 예시 문서 작성 (완)
  3. 팀 교육: 사용 방법 가이드 배포 및 교육 진행 (완)
  4. 성능 최적화: 불필요한 코드 제거 및 최적화
  5. 디자인 토큰: 더 체계적인 디자인 시스템 구축

• 결론

SCSS 모듈화를 통해 프로젝트 간 스타일 코드의 일관성과 재사용성을 크게 향상시킬 수 있었습니다. Git을 통한 버전 관리와 npm 패키지 형태의 배포로 효율적인 관리가 가능해졌습니다.

특히 npm i git+https://git-codecommit.your-region.amazonaws.com/scss 명령어 하나로 간단하게 설치할 수 있어 팀 내 도입 장벽이 낮아졌습니다.

앞으로도 지속적인 개선과 확장을 통해 더욱 완성도 높은 디자인 시스템을 구축해 나갈 예정입니다.