매일 업데이트
2022-11-10 14:57 6 min

코드 리포지토리 전략에 대한 조명

모노레포와 멀티레포: 코드 관리 전략 심층 분석

Git을 활용하여 코드를 호스팅하고 관리하는 데 있어, 모노레포와 멀티레포는 두 가지 핵심적인 접근 방식입니다. 여기서는 각 전략의 세부 사항과 함께 장단점을 꼼꼼히 살펴보겠습니다.

서론

현대의 대부분의 프로젝트들은 Git을 통해 관리 및 호스팅됩니다. Git은 분산형 소스 코드 관리, 버전 제어, 그리고 전 세계적인 협업을 위한 필수 플랫폼으로 자리 잡았습니다. Git은 뛰어난 속도와 효율성을 자랑합니다. Git 코드를 호스팅하고 관리하는 데에는 크게 두 가지 주요 전략이 있습니다.

이러한 전략들을 자세히 알아보기 전에, 먼저 리포지토리가 어떻게 작동하는지에 대한 기본적인 이해를 다져봅시다.

리포지토리란 무엇인가?

리포지토리(줄여서 Repo)는 프로젝트의 모든 폴더와 파일들을 담고 있는 컨테이너입니다. 여기에는 프로젝트와 관련된 사용자, 팀원, 그리고 컴퓨터에 대한 모든 정보가 포함되어 있습니다.

리포지토리에 저장된 데이터는 버전 관리를 통해 추적됩니다. 리포지토리는 개인 또는 팀 단위로 소유하고 관리할 수 있습니다.

Git은 그 자체로 저장소 역할을 하며, 공개, 비공개, 혹은 내부용으로 설정할 수 있습니다. GitHub는 Git 저장소를 위한 호스팅 서비스로서, 편리한 사용자 인터페이스를 제공합니다.

Git은 단순히 버전 제어 및 코드 공유 기능만을 제공하는 것이 아닙니다. 개발자가 일부 파일을 수정하고자 할 때 전체 저장소를 자신의 로컬 시스템에 복사할 수 있다는 점이 Git의 특징입니다. 이를 통해, 특정 프로젝트에 대한 쓰기 권한이 없더라도 로컬에서 콘텐츠를 복사하고 수정할 수 있으며, 이 과정을 '포킹(Forking)'이라고 합니다.

또한, 개발자가 로컬에서 수정한 내용을 공유하고자 할 때, 프로젝트 소유자에게 "풀 리퀘스트(Pull Request)"를 보낼 수 있습니다.

프로젝트는 단일 서비스로 구성될 수도 있지만, 여러 워크플로를 포함하는 경우에는 각 워크플로에 따라 여러 서비스로 분리할 수 있습니다. 대부분의 개발자들은 더 큰 프로젝트를 하나 이상의 기능으로 구성된 독립적인 소규모 서비스로 분할하는 것을 선호합니다. 각각의 서비스는 특정 비즈니스 문제를 해결하는 데 집중할 수 있습니다. 서버리스 프레임워크의 보급으로 인해, 사용자는 기능을 서비스 형태로 쉽게 이용할 수 있게 되었습니다.

이러한 기능들을 서비스로 생성하고 배포한 후, 다음 단계는 기능들을 체계화하고 버전 관리를 적용하는 것입니다. 이때 모든 서비스를 하나의 저장소(모노레포)에 통합하거나, 각 서비스마다 별도의 저장소(멀티레포)를 사용하는 두 가지 방법 중에서 선택할 수 있습니다.

모노레포란 무엇인가?

모노레포(Mono-repository) 접근 방식은 프로젝트의 모든 서비스들을 하나의 단일 저장소에 통합하여 관리하는 방식입니다. 이때, 각 서비스는 독립적으로 배포하고 관리할 수 있으며, 공통 라이브러리와 코드를 공유할 수 있습니다.

Facebook, Google, Dropbox와 같은 대규모 기술 기업들이 모노레포를 주요 코드 관리 전략으로 채택하고 있습니다.

모노레포의 장점

모노레포 방식은 다음과 같은 다양한 이점을 제공합니다:

  • 모든 프로젝트 코드를 한 곳에 모아 팀원 모두가 쉽게 접근할 수 있도록 합니다.
  • 코드 재사용 및 공유가 간편해지며, 팀원 간의 협업이 원활해집니다.
  • 변경 사항이 전체 프로젝트에 미치는 영향을 보다 쉽게 파악할 수 있습니다.
  • 코드 리팩토링 및 코드 전반에 걸친 대규모 변경에 가장 적합한 옵션입니다.
  • 팀원들이 전체 프로젝트 구조를 한눈에 파악할 수 있습니다.
  • 종속성 관리가 용이합니다.

모노레포의 단점

물론 모노레포에도 몇 가지 단점이 존재하며, 가장 큰 단점은 성능 문제입니다. 프로젝트 규모가 커지고 파일 수가 증가할수록 체크아웃, 가져오기 등의 작업 속도가 느려지고 파일 검색에 더 많은 시간이 소요될 수 있습니다.

또한, 많은 독립 계약자를 고용하여 프로젝트를 진행하는 경우, 전체 코드베이스에 대한 접근 권한을 부여하는 것이 보안상 위험할 수 있습니다.

또한, 많은 사람들이 동시에 변경 사항을 커밋할 수 있으며, 이는 지속적 통합(CI) 시스템에서 여러 번의 재빌드를 유발하여 지속적 배포(CD)를 구현하기 어렵게 만들 수 있습니다.

대규모 기업에서 단일 저장소를 사용할 때 발생하는 확장성 문제를 해결하기 위해, 맞춤형 도구들을 활용하기도 합니다. 예를 들어, Facebook은 자체 개발한 파일 시스템과 소스 제어 시스템을 사용하고 있습니다.

멀티레포란 무엇인가?

멀티레포(Multi-repository) 접근 방식은 프로젝트의 여러 라이브러리와 서비스들을 각각 별도의 저장소에 분산하여 관리하는 방법입니다. 서비스에 변경 사항이 있을 때 개발자는 전체 프로젝트가 아닌 해당 서비스만을 다시 빌드하면 됩니다. 이를 통해, 개인이나 팀은 특정 서비스에 집중하여 작업할 수 있으며 필요한 서비스에만 접근 권한을 가질 수 있습니다.

Netflix와 Amazon과 같은 기업들이 멀티레포를 주요 코드 관리 전략으로 사용하고 있습니다.

멀티레포의 장점

멀티레포를 채택하는 기업이 모노레포를 채택하는 기업보다 훨씬 많은 이유는 다음과 같습니다:

  • 각 서비스와 라이브러리는 고유한 버전 관리를 가집니다.
  • 코드 체크아웃 및 풀링 작업이 작고 분리되어 있어, 프로젝트 규모가 커져도 성능 문제가 발생하지 않습니다.
  • 팀원들은 독립적으로 작업할 수 있으며, 전체 코드베이스에 접근할 필요가 없습니다.
  • 더욱 빠른 개발 속도와 유연성을 확보할 수 있습니다.
  • 각 서비스를 독립적으로 출시하고 자체 배포 주기를 가질 수 있어, CI 및 CD 구현이 더욱 용이해집니다.
  • 더욱 향상된 접근 제어 기능을 제공합니다. 모든 팀원이 모든 라이브러리에 대한 전체 접근 권한을 가질 필요는 없으며, 필요에 따라 읽기 권한만 부여할 수도 있습니다.

멀티레포의 단점

  • 서비스와 프로젝트에서 사용되는 종속성 및 라이브러리를 최신 버전으로 유지하기 위해 정기적인 동기화 작업이 필요합니다.
  • 각 팀이 고립된 환경에서 작업하여 코드 중복이 발생하거나, 각 팀이 동일한 문제를 개별적으로 해결하려는 경향이 나타날 수 있습니다.
  • 각 팀이 서로 다른 코드 모범 사례를 따를 수 있으므로, 일반적인 모범 사례를 유지하기 어려울 수 있습니다.

모노레포와 멀티레포의 차이점

모노레포와 멀티레포의 주요 차이점을 다음과 같이 요약할 수 있습니다:

특징 모노레포 멀티레포
코드 저장 방식 조직의 모든 프로젝트 코드가 단일 중앙 저장소에 존재 각 서비스 및 프로젝트가 별도의 저장소를 가짐
협업 방식 팀원들이 협력하여 작업 가능, 서로의 변경 사항을 확인 가능 팀원들이 자율적으로 작업 가능, 개별 변경 사항이 다른 팀이나 프로젝트에 미치는 영향이 적음
접근 권한 모든 팀원이 전체 프로젝트 구조에 접근 가능 관리자가 개발자의 접근 권한을 프로젝트 또는 서비스 단위로 제한 가능
확장성 프로젝트 규모가 커짐에 따라 확장성 문제가 발생할 수 있음 제한된 코드와 작은 서비스 단위로 인해 우수한 성능 유지
CI/CD 지속적 배포(CD) 및 지속적 통합(CI) 구현이 어려울 수 있음 개발자가 서비스를 독립적으로 구축할 수 있어, CD 및 CI 구현이 용이함
코드 공유 개발자들이 중앙 저장소에서 업데이트되는 라이브러리, API 및 기타 공통 코드를 쉽게 공유 가능 라이브러리 및 기타 공통 코드에 대한 변경 사항은 주기적인 동기화가 필요하며, 동기화 실패 시 문제가 발생할 수 있음

결론

모노레포와 멀티레포는 모두 널리 사용되는 코드 관리 전략이며, 어느 방식이 더 우수하다고 단정할 수는 없습니다. 프로젝트의 크기, 요구 사항, 필요한 버전 관리 수준, 접근 제어 필요성에 따라 적합한 전략이 달라집니다.

모노레포는 일관성을 중시하는 반면, 멀티레포는 서비스 간의 분리(디커플링)에 중점을 둡니다. 모노레포 환경에서는 전체 팀이 한 사람이 변경한 사항을 모두 볼 수 있지만, 멀티레포는 각 팀이 필요한 서비스에만 접근할 수 있도록 별도의 리포지토리를 생성합니다. 만약 프로젝트에 모노레포와 멀티레포를 혼합하여 사용하고 싶다면, 다음 도구를 고려해볼 수 있습니다. 메타(Meta)는 여러 프로젝트 및 라이브러리를 효율적으로 관리할 수 있도록 지원합니다.

Git 학습에 관심 있는 분들을 위한 무료 자료도 참고하시면 도움이 될 것입니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.