모노레포란 무엇일까?
두 개 이상의 프로젝트 코드를 하나의 버전 관리 저장소(repository)에서 관리하는 방법을 말합니다.
모노레포(Monorepo)는 여러 프로젝트를 하나의 Git 저장소에서 관리하는 방식입니다.
참고 문서: https://monorepo.tools/
Monorepo Explained
Everything you need to know about monorepos, and the tools to build them.
monorepo.tools
모노레포의 장단점
장점
- 코드의 일관성을 유지할 수 있음
- 공통 모듈 재사용이 편리함
- 하나의 레포에서 전체 프젝 흐름 파악 가능
- 변경 사항을 한 번의 커밋으로 관리
단점
- 저장소(repository)가 커질수록 관리가 어려워짐
- CI/CD 설정이 복잡할 수도 있음. 여기서 CI/CD는 코드를 더 빠르고 안정적으로 배포하기 위해 사용하는 것입니다.
멀티레포와 모노레포의 차이
우선 멀티레포란 무엇일까요?
멀티레포(Multi-repo)는 모노레포와 다르게
프로젝트의 구성 요소마다 각각 독립된 저장소(repository)에서 관리하는 방법을 말합니다.
참고 문서: https://multirepo-docs.github.io/root-docs/
Multi-Repo Docs
Home In a microservice architecture, each subsystem can be in its own repository. Furthermore, each individual repository would also have documentation under /docs that makes it easier to keep documentation updated as code changes within each repo. Multi-R
multirepo-docs.github.io

멀티레포의 장단점
장점:
- 프로젝트별로 독립적인 개발이 가능함
- 특정 서비스만 배포하거나 관리하기 쉬움
단점:
- 공통 모듈을 공유하기 어려움
- 프로젝트 간의 의존성 관리가 복잡해질 수 있음
- 여러 레포를 동시에 수정해야 하는 작업이 번거러움
어떤 상황에서 모노레포가 더 효율적일까?
사실 모노레포를 쓰냐 멀티레포를 쓰냐는 상황마다 다르지만 우선
1. 클라이언트와 어드민의 역할이 명확히 구분되는 경우
2. 두 애플리케이션이 같은 비즈니스 로직을 공유해야할때
3. 프로젝트 규모가 크지 않고, 빠른 개발이 중요한 경우
4. 프로젝트 초기 단계로 구조 변경이 많을 때
5. 학생 프로젝트나 동아리 프로젝트처럼 한 팀이 전체를 관리하는 경우
Hello, GSM에서 모노레포를 활용한 이유
Hello, GSM에서 모노레포 구조를 활용한 이유는 프론트엔드 내부에서 client와 admin을 함께 관리하기 위해라고 생각합니다.
Hello, GSM은 입학 지원 서비스 특성상 클라이언트 화면과 어드민이 사용하는 화면이 명확히 구분되기 때문에 이러한 상황에서 프론트를 하나의 레포로 관리하고 client와 admin을 분리하면 공통 컴포넌트, 타입, 설정을 공유할 수 있어서 효율적인 것 같고
또한 제 생각으로는 더모먼트 팀의 규모가 크지 않은 상황에서 client와 admin을 각각 다른 레포로 분리하는 것보다 모노레포 구조가 더 나은 선택이었을 것 같습니다.
Hello, GSM의 프로젝트 구조 분석
현재 Hello, GSM의 프로젝트 폴더 구조는 아래 사진처럼 되어있습니다.

1. client / admin 분리 구조
apps 디렉토리 아래에 두 개의 애플리케이션을 두는 방식을 썼습니다.
apps/
├─ client // 사용자용
└─ admin // 관리자용
- client
입학 지원자 및 일반 사용자가 사용하는 서비스 화면 - admin
지원자 관리, 데이터 관리 등 운영을 위한 관리자 화면
두 앱은 기능과 사용자 역할이 명확히 다르기 때문에 앱 단위로 분리했습니다.
2. 독립적인 Next.js 애플리케이션 구조
apps/client와 apps/admin은 각각 독립적인 Next.js 애플리케이션으로 구성되어 있는 것 같습니다.
각 파일들을 들어가서 보았는데
- src/ : 애플리케이션 소스 코드
- public/ : 정적 리소스
- .env.local : 앱별 환경 변수
- next.config.mjs, tsconfig.json : 설정 파일
- tailwind.config.ts, postcss.config.mjs : 스타일 설정
얘네들 덕분에 client와 admin은 서로 영향을 주지 않으면서 독립적으로 실행 및 배포할 수 있는 것 같습니다.
마무리
모노레포가 무엇인지 알고있기만했지 실제론 사용해본적이 없어서
초반엔 공부하면서 헷갈렸지만 이번 기회를 통해 Hello, GSM의 프로젝트 구조를 예전보다 더 깊게 이해할 수 있었습니다!