본문 바로가기

Coding/내일배움캠프

[내일배움캠프] 모노레포 | Node.js 4기 | Day 65 | 24.03.09.(토)

모노레포: 하나의 저장소, 무한한 가능성

모노레포는 하나의 버전 관리 저장소에 여러 프로젝트 및 코드베이스를 함께 관리하는 소프트웨어 개발 전략입니다. 마치 거대한 책장에 모든 이야기가 담겨있는 것처럼, 모노레포는 모든 코드를 하나의 체계적인 공간에 집중하여 개발 프로세스의 효율성을 극대화합니다.

 

모노레포의 등장 배경:

  • 거대한 소프트웨어 시대: 오늘날 소프트웨어는 단일 기능의 모노리식 시스템에서 벗어나, 여러 서비스, 라이브러리, 모듈들이 복잡하게 연결된 거대한 생태계로 진화했습니다. 이러한 변화는 코드 관리의 복잡성을 증가시켰고, 효율적인 개발 방식에 대한 끊임없는 탐구를 불러일으켰습니다.
  • 분산 개발의 부작용: 여러 프로젝트를 분산된 저장소로 관리하는 방식은 코드 중복, 버전 관리 어려움, 의존성 문제 등 다양한 문제점을 야기했습니다. 프로젝트 간의 긴밀한 연관성을 고려했을 때, 분산 관리 방식은 비효율적이고 오류 가능성이 높다는 단점을 드러냈습니다.
  • 효율성과 일관성을 위한 욕구: 개발자들은 코드 관리의 효율성을 높이고 프로젝트 간 일관성을 유지하기 위한 새로운 방안을 모색했습니다. 이러한 맥락에서 모노레포는 하나의 탁월한 해결책으로 등장했습니다.

 

모노레포가 해결하는 문제:

  • 코드 중복 최소화: 모든 코드가 하나의 저장소에 집중되어 중복 코드를 쉽게 찾아 제거할 수 있으며, 공통 코드베이스를 활용하여 코드 재사용성을 극대화합니다.
  • 버전 관리 간소화: 모든 프로젝트의 버전 정보를 하나의 저장소에서 통합 관리하여 버전 충돌 및 불일치 문제를 해결하고, 프로젝트 간 버전 연동을 손쉽게 관리할 수 있습니다.
  • 의존성 관리 효율화: 모든 프로젝트의 의존성 관계를 명확하게 파악하고 관리하여 의존성 충돌 및 결함을 사전에 예방하고, 의존성 업데이트를 간편하게 처리할 수 있습니다.
  • 개발 프로세스 통합: 모든 개발 활동이 하나의 저장소에서 이루어지므로 개발 프로세스의 투명성을 높이고 협업 효율성을 극대화하며, 지속적인 통합 및 배포(CI/CD) 프로세스를 간소화합니다.
  • 변경 추적 및 감사: 모든 코드 변경 사항을 쉽게 추적하고 감사할 수 있으며, 코드 변경 이력을 통해 문제 해결 및 버그 추적을 효율적으로 수행할 수 있습니다.

 

모노레포를 구축할 때 고려할 측면:

  • 프로젝트 특성: 모든 프로젝트가 모노레포 구조에 적합한 것은 아닙니다. 프로젝트의 크기, 복잡성, 의존성, 개발 팀 규모 등을 종합적으로 고려하여 적절성을 판단해야 합니다.
  • 규모 및 성능: 모노레포는 저장소 크기가 커짐에 따라 성능 저하 문제가 발생할 수 있습니다. 코드베이스 분할, 효율적인 빌드 시스템 구축, 저장소 관리 도구 활용 등을 통해 성능 문제를 해결해야 합니다.
  • 팀 문화 및 프로세스: 모노레포는 팀의 협업 문화와 개발 프로세스에 큰 영향을 미칩니다. 명확한 코드 소유 구조, 변경 관리 프로세스, 의사소통 및 협업 방식 등을 정립해야 합니다.
  • 도구 및 기술: 모노레포 구축 및 관리를 위한 다양한 도구 및 기술이 존재합니다. 팀의 요구 사항에 맞는 도구를 선택하고 효율적으로 활용해야 합니다.

모노레포 구축 도구

모노레포 구축 및 관리를 위한 다양한 도구들이 존재하며, 각 도구마다 특징과 장점, 단점이 존재합니다. 팀의 요구 사항과 프로젝트 특성에 맞는 적절한 도구를 선택하는 것이 중요합니다.

 

대표적인 모노레포 구축 도구:

  • Yarn:
    • Yarn workspaces를 통해 모노레포 구조를 쉽게 설정하고 관리할 수 있습니다.
    • 의존성 관리, 패키지 설치, 빌드 등을 효율적으로 수행합니다.
    • 활발한 커뮤니티와 풍부한 문서를 제공합니다.
  • Lerna:
    • 여러 JavaScript 프로젝트를 관리하는 데 특화된 도구입니다.
    • 버전 관리, 스크립팅, 배포 등을 위한 다양한 기능을 제공합니다.
    • 명령 줄 인터페이스를 통해 사용합니다.
  • Nx:
    • Angular, React, Vue.js 등 다양한 프레임워크를 지원하는 모노레포 도구입니다.
    • 코드 생성, 빌드, 테스트, 배포 등을 통합된 방식으로 제공합니다.
    • 그래픽 UI를 통해 사용할 수 있어 초보자도 쉽게 사용할 수 있습니다.
  • Turborepo:
    • 빠른 성능을 강조하는 모노레포 도구입니다.
    • 빌드 시간을 최적화하고 개발자 생산성을 향상시키는 데 초점을 맞추고 있습니다.
    • TypeScript 및 JavaScript 프로젝트를 지원합니다.
  • Bazel:
    • Google에서 개발한 빌드 시스템 및 모노레포 관리 도구입니다.
    • 대규모 프로젝트에 적합하며, 다양한 프로그래밍 언어를 지원합니다.
    • 복잡한 의존성 관계를 관리하는 데 강력합니다.

 

모노레포 도구 선택 가이드:

 

  • 프로젝트 규모:
    • 프로젝트 규모가 크고 복잡할 경우, Nx, Bazel과 같은 강력한 도구가 필요합니다.
    • 작은 프로젝트의 경우 Yarn workspaces 또는 Lerna로 충분할 수 있습니다.
  • 프레임워크:
    • 특정 프레임워크를 사용하는 경우, 해당 프레임워크에 특화된 도구를 선택하는 것이 효율적입니다.
    • 예를 들어, Angular 프로젝트의 경우 Nx를 사용하는 것이 좋습니다.
  • 팀 숙련도:
    • 팀의 숙련도가 높다면 Bazel과 같은 복잡한 도구도 활용할 수 있습니다.
    • 팀 숙련도가 낮다면 Yarn workspaces 또는 Lerna와 같은 사용하기 쉬운 도구를 선택하는 것이 좋습니다.

 

추가 고려 사항:

 

  • CI/CD 파이프라인:
    • 모노레포 구축 도구가 CI/CD 파이프라인과 잘 통합되는지 확인해야 합니다.
  • 커뮤니티 및 지원:
    • 활발한 커뮤니티와 지원을 제공하는 도구를 선택하는 것이 좋습니다.

 

모노레포는 강력한 개발 전략이지만, 모든 프로젝트에 적합한 것은 아닙니다. 팀의 요구 사항과 프로젝트 특성을 꼼꼼하게 분석하여 적절성을 판단하고, 신중하게 도구를 선택하여 성공적인 모노레포 구축을 이루어야 합니다.

참고 자료:

 

출처 : NAVER D2

 

* 해당 게시글은 gemini를 참고하여 작성되었음을 알립니다.