• 회귀의 배경

이전 사내 SCSS 모듈화 진행기에서 여러 배포 방식을 검토한 끝에 Git 방식을 선택했다고 했었는데, 결국 Verdaccio 서버 방식으로 돌아왔습니다.

당시 Git 방식을 선택했던 이유들:

  • 간편성과 접근성
  • 별도 서버 운영 불필요
  • 비용 효율성
  • 퍼블리싱 팀의 쉬운 사용
  • 관리 포인트의 일원화

하지만 실제 운영하면서 예상치 못한 문제들이 발생했습니다.

• Git 방식의 한계점 발견

1. 버전 관리의 복잡성

// 브랜치 방식의 한계
"scss": "git+https://git-codecommit.region.amazonaws.com/scss#develop"
  • 의미 있는 버전 번호 관리 어려움
  • 롤백 시 커밋 해시를 직접 찾아야 하는 번거로움
  • 팀원들이 현재 사용 중인 버전 파악 곤란
  • 업데이트 여부의 불확실성

2. 캐싱 이슈

# 같은 브랜치명인데도 업데이트가 안 되는 경우 발생
npm install git+https://git-codecommit.region.amazonaws.com/scss#develop
# 캐시 때문에 최신 버전이 설치되지 않음

3. 권한 관리의 복잡성

  • 각 개발자마다 CodeCommit 접근 권한 설정 필요
  • AWS IAM 사용자 관리 부담
  • 임시 협력업체나 외부 개발자 접근 권한 관리 어려움
  • 도커 컨테이너 사용 시 설정의 복잡성

• Verdaccio로의 전환 결정

결국 표준적인 npm 생태계의 장점이 Git 방식의 편의성보다 크다는 결론에 도달했습니다.

Verdaccio의 장점 재평가

  1. 표준 npm 명령어 사용

    npm install @flow/scss@1.1.6
    npm update @flow/scss
  2. 명확한 버전 관리

    • semantic versioning 지원 이전 버전으로의 롤백이 자유로움
    • package.json의 버전 범위 설정 가능
    • 의존성 트리 명확성
  3. 안정적인 캐싱

    • npm 표준 캐싱 메커니즘 활용
    • 로컬 캐시로 네트워크 의존성 최소화
  4. 권한 관리 단순화

    • htpasswd 기반의 간단한 인증
    • 별도 AWS 계정 불필요

• Docker 기반 Verdaccio 구축

  1. 환경 일관성: 개발/스테이징/프로덕션 환경 동일
  2. 관리 편의성: 컨테이너 기반 배포 및 관리
  3. 확장성: 필요 시 로드 밸런싱과 고가용성 구성 가능
  4. 격리성: 호스트 시스템과 분리된 안전한 실행 환경

실제 구현

docker-compose.yml

services:
  verdaccio:
    image: verdaccio/verdaccio
    container_name: verdaccio
    environment:
      - VERDACCIO_PUBLIC_URL=https://my.path
    user: "1000:1000"
    volumes:
      - ./storage:/verdaccio/storage
      - ./plugins:/verdaccio/plugins
      - ./conf:/verdaccio/conf
    restart: always
 
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
      - "4873:4873"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - verdaccio
    restart: always

핵심 설정 포인트

  1. 볼륨 마운트로 데이터 영속성 보장

    volumes:
      - ./storage:/verdaccio/storage    # 패키지 저장소
      - ./conf:/verdaccio/conf          # 설정 파일, htpasswd(계정 정보)
  2. nginx 리버스 프록시로 HTTPS 지원

    # nginx.conf 설정으로 SSL 인증서 적용
    # 사내 도메인을 통한 접근 가능
  3. 환경변수로 공개 URL 설정

    environment:
      - VERDACCIO_PUBLIC_URL=https://my.path

config.yaml 설정

# 스코프 패키지 설정
packages:
  '@*/*':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    # proxy: npmjs
 
# htpasswd 인증
auth:
  htpasswd:
    file: ./htpasswd
    max_users: 1000
 
# npmjs 프록시 설정은 필요하지 않고 사내 모듈만 관리하기 때문에 아래 설정은 필요하지 않음
# uplinks:
#   npmjs:
#     url: https://registry.npmjs.org/

• 이전 과정에서의 깨달음

1. 도구 선택에 대한 인사이트

“간단해 보이는 방식이 항상 최선은 아니다”

Git 방식이 초기에는 간단해 보였지만, 실제 운영에서는 npm 생태계의 표준을 벗어나면서 발생하는 여러 문제들이 있었습니다.

2. 팀 협업 관점에서의 고려사항

“개발자 친화적 != 운영 친화적”

Git 방식은 개발자에게는 친숙했지만, 실제 서비스 운영 관점에서는 다음과 같은 문제가 있었습니다:

  • 의존성 추적의 어려움
  • 빌드 재현성 문제
  • 패키지 메타데이터 관리 한계

3. 다양한 환경에 대한 고려

“SaaS 환경에도, 온프레미스도 고려하라!”

저희 회사는 SaaS 환경도 사용하고, 내부망(=온프레미스 환경, 엔터 환경)에 대한 고려도 필요했습니다. 엔터 환경만 고려한다면, 혹은 클라우드 환경만 고려했다면 좀 더 쉬웠겠지만 둘 다 고려해야 했고 둘 모두 커버하기 위해 사설 NPM 서버와 doker 이미지 빌드 서버 쪽(맥에서 이미지 빌드 시 Linux에서 돌릴 때 OS 호환 이슈로 빌드 서버가 필요해졌습니다. 빌드가 서버가 필요한 이유는 배포 방식 비교참고 바랍니다.)으로 가닥이 잡혔습니다.

• 현재 운영 상황

설치 및 사용 방법

# 스코프 설정 (권장)
npm config set @flow:registry https://my.path
 
# 패키지 설치
npm install @flow/scss
 
# 버전 업데이트
npm update @flow/scss

실제 package.json

{
  "dependencies": {
    "@flow/scss": "^1.1.6"
  }
}

SCSS 사용 방법 (변경사항 없음)

// 기존
@use "../abstract/abstract" as *;
// 변경 후
@use "@flow/scss/abstract/abstract" as *;

• 성과와 개선사항

1. 버전 관리 개선

이전 (Git 방식)현재 (Verdaccio)
git+https://...#1.1.6@flow/scss@1.1.6
브랜치 기반Semantic Versioning
커밋 해시로 롤백명확한 버전 롤백

2. 팀 도입 성과

  • 패키지 배포: 현재 @flow/scss v1.1.6 배포 완료. 패키지 4개 추가 배포
  • 사용 프로젝트: 5개 프로젝트에서 활용 중
  • 팀 만족도: config 설정 후엔 npm 표준 명령어 사용으로 학습 부담 제거

3. 운영 안정성

  • 가용성: nginx + verdaccio 이중화로 안정성 확보
  • 백업: 볼륨 마운트로 데이터 백업 자동화
  • 모니터링: Docker 로그를 통한 접근 로그 및 에러 추적

• 배운 점과 향후 계획

핵심 교훈

  1. 표준을 따르는 것의 중요성

    • npm 생태계의 표준 명령어와 워크플로우 활용
    • 팀원들의 기존 지식과 경험 활용 가능
  2. 초기 복잡성 vs 장기 운영성

    • 초기 설정의 복잡성보다 장기 운영의 안정성이 중요
    • 표준 도구의 성숙한 생태계 활용
  3. 인프라 결정에서 고려해야 할 요소들

    • 개발 편의성
    • 운영 안정성
    • 팀 전체의 학습 비용
    • 장기적 확장성

향후 계획

  1. 모니터링 강화: 메트릭 수집 및 알람 시스템 구축
  2. 백업 자동화: 정기적인 storage 백업 및 복구 테스트

• 결론

때로는 원점으로 돌아가는 것이 정답이다.

Git 방식으로 우회했던 여정을 통해 Verdaccio의 진짜 가치를 더 명확하게 이해할 수 있었습니다. 초기의 복잡성이나 서버 운영 부담보다는 npm 생태계의 표준을 따르는 것이 팀 전체의 생산성과 서비스 안정성에 훨씬 유리했습니다.

현재 안정적으로 운영 중인 Verdaccio를 통해 앞으로도 더 많은 사내 패키지들을 체계적으로 관리해 나갈 예정입니다.

“돌아가는 길이 때로는 지름길이다” - 이번 프로젝트의 핵심 교훈입니다.