https://engineering.mercari.com/blog/entry/20210817-8f561697cc/
こんにちは!ソウゾウのSoftware Engineerの@ogataka50です。連載:「メルカリShops」プレオープンまでの開発の裏側の9日目を担当させていただきます。
1日目の記事「メルカリShops の技術スタックと、その選定理由」にあった通りメルカリShopsではMonorepoで開発を行なっています。この記事では主にSoftware Engineerとして、DX (Developer eXperience)の観点からPJ初期からMonorepo上で開発を進めていった中で経験したこと感じたことを実際に起きた出来事とともに共有したいと思います。
Monorepoとは単一のリポジトリに特定のプロジェクトのコードをすべて含めるパターンです。 下記のような利点があると言われています。
プロジェクトに関わるすべてのコードが含まれているため、その1リポジトリを取得すればプロジェクトのすべてを把握することができます。またインターフェースの変更なども呼び出し元、先を一度に修正することが可能なため大規模なリファクタリングが可能です。リポジトリによる境界がないため、組織変更によるチーム、オーナーシップの変更にも柔軟に対応できるとされています。
メルカリShopsのリポジトリ構成は下記のようになっています。 各言語ごとにルートディレクトリが分割されており、それらの配下にそれぞれのapplication codeがあります。BackendとなるMicroservicesにはGoを採用しており、BFF (Backend for Frontend), FrontendにはTypeScriptを採用しているため、Go以下にMicroservices群、typescript以下にGraphQL, Web Frontendなどが配置されています。
.
├── containers
├── docs
│ ├── adr
│ ├── erd
│ └── sequence
├── go
│ ├── pkg
│ ├── services
│ │ ├── serviceA
│ │ ├── serviceB
│ │ └── serviceC
│ └── tools
├── proto
├── python
│ ├── libs
│ ├── projects
│ │ ├── projectA
│ │ └── projectB
│ └── tools
├── resources
├── terraform
└── typescript
├── apps
│ ├── graphql
│ └── web
├── libs
└── tools
ここからは実際に私がMonorepoでの開発中に体験した出来事をもとに事例の共有をしていきたいと思います。 前提として私のこれまでの経験は下記になります。