【Day 1】ディレクトリ構成を考える

## はじめに

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/9b0d3c88-ec7f-2ceb-98bb-1d52373661d0.png)

---

**2023年アドベントカレンダー1日目**です。

https://qiita.com/advent-calendar/2023/life-sync-app

初日である今回は、開発を進める前にディレクトリ構成について少し考えてみようと思います。

開発を進める前にディレクトリ構成を考えることにはいくつかメリットがあると思っています。

1. **効率的な開発**
    プロジェクトの構成を事前に計画することで、開発が効率化されます。
2. **メンテナンス性の工場**
    ファイルや機能がどこにあるかを簡単に見つけられるために、バグの修正や、機能の追加がスムーズに鳴ります。
3. **スケーラビリティ**
    拡張可能なディレクトリ構成を考えることで、プロジェクトが成長し、新しい機能がつい生かされる際にもスケールアップが容易になります。

以上の理由から、今回はソースのディレクトリ構成を考えていきます。

## ディレクトリ構成検討

まず、やりたいことを列挙していきます

### 開発環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/6c1e06fa-ce68-de50-f24d-a619ca87219b.png)

- 各環境を独立して開発できる
- web
    - Next.jsで開発
    - BFFはApollo Serverでスタブサーバーを立ち上げて利用
    - port: 3000
    - apolloServerPort: 4000
- BFF
    - NestJSで開発
    - APIはWiremockでスタブサーバーを立ち上げて利用
    - port: 3000
    - wiremockPort: 8080
- API
    - Rustで開発
    - port: 3000
    - db Port: 5432
### 本番環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/e315fd9a-8a17-3af5-6651-623a2c613f5d.png)

**展開予定はないので、ざっくりと**

- k8sで展開
- web
    - port: 80

## 完成

開発しながら随時アップデートしていきますが、ひとまずはこの構成で進めていきます。
ディレクトリ構成と、大まかな用途を書いています。

```bash
.
├── Makefile               ・・・・・・・ 環境起動用Makefile
├── README.md
├── skaffold.yaml          ・・・・・・・ prod環境用のskaffoldファイル
├── web                    ・・・・・・・ Webソースコード
│   ├── README.md
│   ├── app/
│   ├── e2e/               ・・・・・・・ e2eテスト
│   ├── mock/              ・・・・・・・ bffのスタブサーバー用
│   ├── next-env.d.ts
│   ├── next.config.js
│   ├── node_modules/
│   ├── package-lock.json
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   ├── tailwind.config.ts
│   └── tsconfig.json
├── bff           ・・・・・・・ BFFソースコード
│   ├── README.md
│   ├── dist/
│   ├── nest-cli.json
│   ├── node_modules/
│   ├── package-lock.json
│   ├── package.json
│   ├── src/
│   ├── test/     ・・・・・・・ Unit/e2eテスト
│   ├── tsconfig.build.json
│   ├── tsconfig.json
│   └── wiremock/ ・・・・・・・ apiのスタブサーバー用
├── api           ・・・・・・・ APIソースコード
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── e2e/      ・・・・・・・ E2Eテスト
│   ├── src/
│   ├── target/
│   └── test/     ・・・・・・・ Unitテスト
├── dockers       ・・・・・・・ k8s起動用のDockerfile
│   ├── bff
│   │   └── Dockerfile
│   ├── api
│   │   └── Dockerfile
│   └── web
│       └── Dockerfile
└── k8s            ・・・・・・・ k8s
    ├── bff
    │   ├── deployment.yaml
    │   └── service.yaml
    ├── api
    │   ├── deployment.yaml
    │   └── service.yaml
    ├── db
    │   ├── service.yaml
    │   └── statefulset.yaml
    └── web
        ├── deployment.yaml
        └── service.yaml
```

### ざっくり説明

#### web開発時

```
├── web           ・・・・・・・ Webソースコード
│   ├── e2e       ・・・・・・・ e2eテスト
│   ├── test/     ・・・・・・・ Unitテスト
│   └── mock/     ・・・・ bffのスタブサーバー用
```

- `./web/`
    - こちらのソースで開発
- `./web/mock/`
    - BFFのスタブサーバー設定
- `./web/test`
  - jestのテストコード
- `./web/e2e`
  - e2eのテストコード(Cypress)

#### bff開発時

```
├── bff           ・・・・・・・ BFFソースコード
|   ├── test/     ・・・・・・・ Unit/E2Eテスト
│   └── wiremock/ ・・・・・・・ apiのスタブサーバー用
```

- `./bff/`
  - こちらのソースで開発
- `./bff/wiremock/`
  - APIのスタブサーバー設定
- `./bff/test`
  - nestjsのテストコード

#### API開発時

```
├── api           ・・・・・・・ APIソースコード
|   ├── e2e/      ・・・・・・・ e2eテスト
|   ├── src/
|   └── test/     ・・・・・・・ Unitテスト
```

- `./api/`
  - こちらのソースで開発
- `./api/test`
  - rustのテストコード
- `./e2e/api`
  - e2eのテストコード

#### 本番環境

```
├── dockers/      ・・・・・・・ k8s起動用のDockerfile
├── k8s/          ・・・・・・・ k8s
├── skaffold.yaml ・・・・・・・ prod環境用のskaffoldファイル
```

- `./skaffold.yaml`
  - skaffoldの設定ファイル
- `./dockers/`
  - 各サービスのDockerfile
- `./k8s/`
  - 各サービスのdeployment.yamlおよびservice.yaml


明日からこちらで開発を進めていきます。