제가 속한 팀에서는 10개 이상의 프론트 서버를 운영 중인데, 다양한 서비스와 서버를 운영하다 보니, 코드 중복과 유지보수의 복잡성, 그리고 서버 비용 증가와 같은 문제들이 발생했습니다. 이로 인해 코드 중복과 관리의 복잡성이 커졌고, 이를 해결하기 위한 방법을 고민한 끝에, 저는 모노레포(Monorepo)를 도입하기로 결정했습니다.
왜 모노레포인가?
여러 아키텍처 옵션 중 모노레포(Monorepo)를 선택한 이유는 여러 가지입니다. 멀티레포(Multi-repo)와 비교했을 때, 모노레포는 코드 중복 문제와 유지보수 복잡성 측면에서 큰 이점을 제공합니다. 특히 멀티레포 구조에서는 각 프로젝트가 별도의 저장소로 관리되기 때문에 공통 코드나 라이브러리를 여러 번 작성해야 하며, 서로 다른 버전을 관리하는 과정에서 비효율성도 발생할 수 있습니다. 이런 문제들을 해결하기 위해 모노레포를 선택하게 되었습니다.
모노레포와 멀티레포 비교
- 멀티레포(Multi-repo): 각 프로젝트가 개별 저장소에서 관리되며, 서로 다른 버전 및 코드베이스를 유지해야 합니다. 코드 중복과 라이브러리 관리가 어려워지고, 동일한 코드의 수정이 여러 저장소에서 동시에 이루어져야 하는 번거로움이 있습니다. 또한 각 레포지토리의 변경 사항을 일관성 있게 반영하는 것이 어렵습니다.
- 모노레포(Monorepo): 하나의 저장소에서 여러 프로젝트를 관리합니다. 이를 통해 공통 코드를 쉽게 공유할 수 있고, 변경 사항이 모든 프로젝트에 즉시 반영되기 때문에 버전 관리가 간소화됩니다. 공통된 라이브러리나 유틸리티를 한 번 작성하면 모든 프로젝트에서 사용할 수 있으며, 코드 중복을 줄여 유지보수를 더 쉽게 할 수 있습니다. 또한 CI/CD 파이프라인을 단일화하여 빌드와 배포 속도를 높일 수 있습니다.
모노레포 선택 이유
- 코드 중복 최소화: 여러 서버에서 공통적으로 사용하는 코드를 하나의 저장소에 두고 공유할 수 있기 때문에, 코드 중복을 줄이고 유지보수에 드는 시간을 크게 절약할 수 있습니다.
- 일관된 버전 관리: 멀티레포에서는 각 프로젝트가 개별적으로 버전을 관리해야 하기 때문에 버전 불일치나 의존성 문제를 겪을 수 있지만, 모노레포에서는 이러한 문제를 단일화하여 더 쉽게 관리할 수 있습니다.
- 통합된 빌드 및 테스트 환경: 모노레포에서는 모든 프로젝트가 동일한 빌드 및 테스트 파이프라인을 사용할 수 있어 일관성을 유지하면서도 빌드 시간을 단축할 수 있습니다.
- 공유 라이브러리 관리: 공통적으로 사용되는 라이브러리나 유틸리티를 모노레포 내에서 쉽게 재사용할 수 있어, 새로운 기능을 추가할 때마다 라이브러리를 중복 작성할 필요가 없습니다.
팀 커뮤니케이션 비용 감소
모노레포는 코드베이스의 일관성을 유지함으로써 여러 개발자나 팀이 협업할 때 발생할 수 있는 충돌이나 불일치 문제를 최소화합니다. 특히 코드 리뷰나 변경 사항 반영이 투명하게 이루어져 협업이 더욱 원활해집니다. 모든 팀이 동일한 저장소에서 작업하기 때문에, 개발자들 간의 코드 충돌을 줄이고 일관된 코드 품질을 유지할 수 있습니다.
모노레포 도입 시의 잠재적 문제점 및 대응 방안
모노레포에도 도전 과제가 없는 것은 아닙니다. 프로젝트가 커지면서 빌드 시간이 길어지거나, 여러 프로젝트 간의 의존성 충돌이 발생할 수 있습니다. 하지만 이러한 문제는 Turborepo와 같은 도구를 통해 해결할 수 있습니다. Turborepo는 빌드 캐싱과 병렬 처리를 지원하여 빌드 시간을 크게 줄여주고, 대규모 프로젝트에서도 효율적으로 빌드를 관리할 수 있습니다. 또한, Pnpm workspace를 사용하면 프로젝트 간 의존성을 명확하게 정의하여 충돌을 방지할 수 있습니다.
모노레포 관리 툴 선택: Pnpm workspace + Turborepo
모노레포를 효과적으로 관리하기 위해서는 적절한 도구가 필요합니다. 저는 Pnpm workspace와 Turborepo를 선택했습니다. 이 두 가지 툴을 선택한 이유는 다음과 같습니다.
- Pnpm workspace: Pnpm은 의존성 관리에서 빠르고 효율적인 성능을 제공합니다. 특히 워크스페이스 기능은 여러 패키지를 단일 프로젝트처럼 관리할 수 있어, 모노레포에서 각 서버를 패키지로 분리하고 의존성을 쉽게 관리할 수 있게 도와줍니다. 또한 Pnpm의 성능과 디스크 공간 절약 측면에서의 장점은 대규모 프로젝트에서 매우 유용합니다.
- Turborepo: Turborepo는 모노레포 환경에서 빌드와 테스트를 최적화하는 데 중점을 둔 툴로, 빌드 캐싱 및 병렬 처리를 통해 빌드 시간을 크게 단축시켜 줍니다. 이를 통해 대규모 프로젝트에서도 빠르고 효율적으로 빌드 프로세스를 관리할 수 있습니다.
다음 글에서는 모노레포가 되어가는 과정에 대해 더욱 구체적으로 다루어 보겠습니다.
monorepo에 대해 조금 더 자세한 설명을 원하시면 이곳을 추천드립니다!
사진출처: https://monorepo.tools/
'개발일지 > Monorepo' 카테고리의 다른 글
[Monorepo] Monorepo 환경에서 ts-rest, zod, 그리고 tRPC 사용에 대한 고찰 (1) | 2024.09.20 |
---|