[Design Pattern] Monorepo 공부


결론

결론부터 적자면 Monorepo는 아래의 경우에 써야할 것 같다.

  • 독립 API로 만들기 어려운, 프로젝트 간 중복되는 공통모듈이 있을 경우
  • Micro 독립 서비스일 경우

글 하단의 “언제 쓰면 안될까?” 역시 중요하다.

개념

다양한 모듈을 여러 레포지토리에서 관리하지 않고 하나의 레포지토리에서 관리하는 디자인 패턴.
대표적인 툴 : Lerna, Yarn Workspace

장점

  • 프로젝트간 공유해야할 기능 모듈 및 라이브러리들을 쉽게 공유할 수 있다.
  • 모든 변경은 단일 원자 단위로 간주 및 검토 할수 있다.

    프로젝트간 공유해야할 기능 모듈 및 라이브러리들을 쉽게 공유할 수 있다.

    가령 모바일과 데스크탑 프로젝트가 별개로 존재할때 이 둘이 사용하는 회원관리 로직은 동일할 것이다.
    예를들어 REST API에 회원가입 요청은

    POST /v1/user
    

    로 요청을 보내고 받은 응답을 관리하고 상태관리를 하는 방식도 동일할 것이다.
    각자의 레포지토리에서 이 둘이 공통으로 사용하는 기능을 모듈화하고 공유하는 작업은 복잡할 수 있다.
    모노레포는 이러한 설계를 쉽게 설정할 수 있다.
    쉽게 공유하고 공통으로 관리할 수 있다는 것은 곧 모듈화 리팩토링이 저렴해진다는 장점 또한 있다고 할 수 있다.

    모든 변경은 단일 원자 단위로 간주 및 검토 할수 있다.

    다시말해 모든 이슈들은 Monorepo에서 검토 할수 있다.
    가령 프론트엔드 프로젝트와 백엔드 서버 프로젝트가 따로 존재할때, 각각의 이슈, 버전 등의 관리를 하나의 레포지토리에서 할 수 있다.
    또한 위의 구조에서 두 서비스를 연동해서 빌드, 테스트, 배포 프로세스를 한번에 진행하기 위해서는 따로 작업해야할 것들이 많아진다.
    하지만 Monorepo에서는 한번에 처리할 수 있다.

단점

  • 러닝커브
  • 초기 세팅이 다소 복잡함

언제 써야할까?

  • 공통으로 쓰는 모듈들이 많을 경우. ex) 모바일 웹과 데스크탑 웹을 따로 만들경우
  • Micro 독립 서비스일 경우 -> 이슈관리, 버전관리, 배포 및 테스트 관리를 한곳에서 할수 있다.

언제 쓰면 안될까?

: Mono Repo를 쓰지 말아야할 경우 = Multiple Repo로 관리해야할 경우

참고 : Why you should use a single repository for all your company’s projects

  • 프로젝트 전체 혹은 부분적으로 오픈소스 프로젝트일 경우.
  • SI 작업같은 클라이언트 마다 다른 프로젝트일 경우. 저작권을 고객에게 넘겨야하는 경우.
  • 리눅스 커널같이 1.5억 줄 이상의 큰 프로젝트일 경우. 단일 프로젝트에서만 동작해야하는 경우.
  • 기존에 만들어 놓은 다중레포(Multiple Repo) 구조가 CI/CD 등에 맞게 설계되어 있고 단일레포(Monorepo)로의 마이그레이션 비용이 엄청 큰 경우.

공부 배경과 그에 따른 결론

회사 프로젝트를 초기부터 빌드해야하는데 어떻게 디자인할지 조사하다가 정리하게 되었다.
프로젝트의 상황은 이렇다

  • 내가 만들어야할 프로젝트는 기존의 비슷한 프로젝트가 이미 하나 있음.
  • 버전을 업하며 리팩토링을 할 예정이지만 관리비용을 줄이기 위해 비슷하게 가야함.

기존의 회사의 프로젝트들의 상황은 이렇다.

  • 다중 프로젝트들로 이미 마들어졌고 그에 따른 CI/CD 구조가 정립되어 있다. -> 마이그레이션 비용이 클 수 있다.
  • 내가 만들 프로젝트가 이미 다중 레포로 만들어진 백엔드 서버에 따라 개발되어야 함.

위의 상황들은 모노레포로 얻을 수 있는 단일성이 없기 때문에 다중 레포로 관리해야할 것 같다.

참고 자료





2023

Flutter 맛보기 1

3 분 소요

직방 기술지원팀 기술공유 세미나 중 플러터를 소개한 내용입니다

Back to Top ↑

2022

Back to Top ↑

2019

[Tutorial] Storybook과 Bit을 활용한 UI 컴포넌트 관리(Workflow)

1 분 소요

회사에서 프론트엔드 개발원칙을 SFC(Single File Component)에서 UI 컴포넌트를 기준으로 CDD(Component Driven Development)를 진행하려고 한다. 그래서 체계적으로 관리하기위해 Storybook과 Bit을 도입해보고자 한다. 각각의 역할은 ...

[Workflow] 프론트엔드 개발조직을 위한 워크플로 설계

2 분 소요

작성 배경 회사의 작업구조를 페이지 중심 개발에서 UI 컴포넌트 중심 개발로 변경하면서 Workflow를 개선할만한 환경을 구성해야했다. 폐쇄망 기반에서 개발자간 UI 명세서 역할을 할 수 있는 Storybook과 그것을 공유할 Verdaccio라는 구축형 NPM Pri...

[ESlint & Prettier] 개발 관습 설정 in Visual Studio

1 분 소요

회사 프로젝트를 작업하기 전 프론트엔드 개발자들 간의 코드 규칙을 Eslint와 Prettier 설정을 맞춰 관리해가는 방향을 정했다. 아직 협업을 할 경우는 없지만 미래에 인수인계 받거나 협업을 진행할 경우 코드관습이 달라 고생할 경우를 대비하기로 했다. 설정은 작업을 진행하며 ...

[CodingTest] 2019-10-26 SQL문제

최대 1 분 소요

공부겸 코딩테스트 사이트에서 토요일 오전 10시에 백엔드 포지션 테스트를 해준다기에 참여해봤다. SQL문제가 나왔는데 더 좋은 답이 있는것 같아 나중에 기록해두고 수정해보기로 한다.

[CodingTest] 피보나치 수열

1 분 소요

문제 : 피보나치 수열 제 1항부터 입력한 자연수(N)까지의 피보나치 수열 항들의 합을 구하여라.

[Syntax] 새로 알게된 파이썬 문법 정리

최대 1 분 소요

chaning comparison 파이썬은 chaning comparison이라는 신기한 문법이 있다. 참고 if a < b and b < c : (...) 라는 구문이 if a < b < c : (...) 으로 연산된다. 직관적인 문법이 인상적. ...

[DataType] Map & Set

최대 1 분 소요

Set vs Array - 관련기사 Set 유일값들의 배열이 필요할때(distinct) 집합의 개념이 필요할때(차집합, 교집합 등등 자체 메서드들이 많음.) index가 필요 없을때 Array에서 중복값을 없앨때 => ...

Back to Top ↑

2018

SGIS-shpToGeojson

1 분 소요

SGIS에서 받은 지도데이터(.shp)를 geojson으로 변경하는 작업 내용

Back to Top ↑