株式会社Azoopで「トラッカーズ」の開発している員(Yun)です。
最近、ドメインにおける大規模なリファクタリングを実施したので、その経緯と内容を共有したいと思います。
背景
「トラッカーズ」は、中古車のオークションサービスとしてスタートし、多くの試行錯誤を経てきました。私が入社する前から、さまざまなビジネスモデルが試されていたようです。主要なサービス「トラッカーズオークション」は、フリマやヤフオクのような形式から独自の形に進化してきました。しかしその過程で、サービスの変更が頻繁に行われ、コード上のドメインモデルが現実のビジネスモデルに追いついていない状態が発生しました。
リファクタリング前の状態
以下は、リファクタリングを始める前のドメインモデルの状態です。
主に二つバージョンのオークションが存在していました。
旧オークションモデル
現行オークションモデル
そして、新しい概念として「入札会(Sale)」を導入し、以下のように車両をグルーピングしました。
全体像はこの感じです。
これらの複雑なモデルを扱うため、生のSQLを駆使していましたが、その結果、メンテナンスが困難なSQLが生成されることがありました。
(例えば、ログイン中に会社が自身の特定の入札会においての入札を全て抽出する)
新しいオークションモデル
現実のビジネスをべースに、議論を通して、重複の概念を除去した以下のような新しいドメインモデルを策定しました。
CurrentAuction/OldAuctionの責務をSaleとTruckSaleに移り、BidをTruckerSaleに紐づくように変更しました。
リファクタリングのステップ
新しいモデルへの移行をスムーズに行うため、以下の要件を満たす必要がありました。
- サービスを停止せずに移行する
- 業務に影響を与えない
- 問題が発生した場合、すぐ前の状態に戻せる必要がある
これらの要件を基に、以下のステップでリファクタリングを行いました。
- 新しい関連を持つテーブルのマイグレーション
- 新旧のデータ構造を同時に生成
- 新しいデータ構造へのアクセスを優先し、新しいデータがない場合は古いデータにフォールバック
- 既存のデータを新しい構造に移行
- 古いデータを扱うコードの削除
- 不要な外部キーとテーブルの削除
結果として、オークションに関するドメインモデルが現実のビジネスモデルにより近づいたと感じています。
今後の展望
開発の効率は大幅に向上しましたが、まだ「トラッカーズマーケット」というサービスとの結合度が高い部分が残っています。次のステップとして、ドメインのリファクタリングを続ける予定です。この挑戦に参加したい方は、是非、弊社のエンジニアチームにご応募ください。