Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

サイロ化した金融システムを、packwerk を利用して無事故でリファクタリングした話

coincheck
October 27, 2024

サイロ化した金融システムを、packwerk を利用して無事故でリファクタリングした話

私たちが提供している金融系のサービスでは、既存動作を最大限に担保しながら品質を向上させることが強く求められます。サービス開始以来10年以上運用されているRailsアプリケーションはモノリシックな構造となっており、サイロ化による弊害が顕在化していました。例えば、複雑なロジックがアプリケーションの各所に散在していることが、品質向上の妨げとなっていました。

そうした背景の中で、複雑なロジックの共通化を行う際に、今後の改善に繋がるフレーム検討を行いました。検討の末、モジュラーモノリス構造を採用し、packwerk を使って段階的に移行を進めることとしました。結果として、無事故でリファクタリングを達成しています。

本セッションではサイロ化した金融システムをリファクタリングした事例を基に、安全な手段としてpackwerkを採用した経緯、packwerkだけでは防ぎきれない観点とその対策、現在検討している今後の展望についてお話ししたいと思います。

この資料は以下イベントで発表した内容です。
https://kaigionrails.org/2024/talks/cc-kusama/

発表者
Kota Kusama / https://github.com/cc-kusama
2022年にコインチェック株式会社に入社。2023年9月よりアプリケーション基盤グループのメンバーとして、共通部品のパッケージ化などの、各事業部の開発速度、品質、生産性の向上につながる基盤作りの仕事をしています。

coincheck

October 27, 2024
Tweet

More Decks by coincheck

Other Decks in Technology

Transcript

  1. ©2024 Coincheck Inc. 2 自己紹介 Kota Kusama @mutakapi8008 • 2022年7月にコインチェック株式会社へ入社

    ◦ 現在はアプリケーション基盤部に在籍 • Rails未経験入社、Rails歴2年と少し • 16 Personalities ◦ 仲介者 - INFP型の性格 • 最近ハマっているもの ◦ ダンジョン飯 ◦ 育児(アピール)
  2. ©2024 Coincheck Inc. 3 目次 1. バックエンド部分の現状と課題 a. 現状 b.

    課題事例 2. 課題解決 a. 解決方針 b. packwerkと関連gemの説明 c. やったこと 3. 導入後の評価 a. packwerkの良い点 b. packwerkでは防ぎきれない観点の対策 c. 今後の展望 4. まとめ
  3. ©2024 Coincheck Inc. 暗号資産取引サービス「Coincheck」 5 国内最大級の顧客基盤、本人確認済210万のユーザーが利用 暗号資産取引の”ファースト口座” IEO/INOのリーディングカンパニー • 使いやすいUI/UX

    • 5年連続アプリDL数国内No.1* • 国内IEO 6例のうち3例を実施** • INO(Initial NFT Offering)実績4件 *対象:国内の暗号資産取引アプリ 期間:2019年1月〜2023年12月 データ協力:App Tweak **2024年9月末現在
  4. ©2024 Coincheck Inc. 9 背景 コインチェックのプロダクトは、大きく分けても10を超えている • 日本円入出金 • 暗号資産入出金

    • 販売所 • 取引所 • Coincheck IEO • Coincheck NFT • Coincheckつみたて • Coincheckリワード • Coincheck OnRamp • Coincheckでんき・ガス • 貸暗号資産 • …etc
  5. ©2024 Coincheck Inc. 19 どう集約するべきか 以下の要因からモジュラーモノリス構造を選択 • マイクロサービス? ◦ 現状のDB構成や、アーキテクチャ変更による品質担保の観点から非現実的

    ◦ ある程度のコードの視認性は維持しておきたい • 共通クラス? ◦ 共通クラス化はされている部分もあった ◦ 使用方法の不明確さやドメイン毎の仕様により、クラス内にメソッドが乱立する状態に • モジュラーモノリス ◦ インフラ部分に影響することなく構成を試すことができる ◦ 関心の分離を行いつつ、一定の視認性を維持することができる
  6. ©2024 Coincheck Inc. 20 どう集約するべきか 以下の要因からpackwerkを採用 • 実態は静的解析なので本番に影響を与えない • 依存関係の検知ができる

    • パブリックアクセス領域の設定 ◦ 不必要なロジックへの参照を制限できる • コード移動のみでモジュール化が実現できて認知負荷が低め ◦ Railsエンジンも同じメリットはあるものの、上述の依存検知、パブリック領域設定の点で優位
  7. ©2024 Coincheck Inc. 28 packwerkとは packwerk自身は、依存関係の違反を検知する authorizationパッケージ accountingパッケージ package.ymlで依存が認められて いなければ、違反として検知

    認可ロジックのパッケージ化ではモノリス側(Userモデルなど)への依存が存在 →今回は依存関係を排除したい目的ではない為、依存は許容する
  8. ©2024 Coincheck Inc. 29 関連gem:packwerk-extensions packwerkで検知する違反を拡充させるgem • メインはプライバシーチェッカー • パッケージ内にパブリック領域/パブリッククラスの定義を行い、非パブリック領域へ

    の参照を違反として検知 • パブリック領域の定義方法は下記 ◦ publicディレクトリ内にコード類を配置する ◦ ファイルの先頭5行に宣言コメントを追加 認可ロジックへの直接参照を制限する目的で、この違反検知を有効化している
  9. ©2024 Coincheck Inc. 42 packwerkの良い点 既存動作に極力影響を与えない構造 • packwerk自体は静的解析なので、本番環境に影響を与えない • ただし、パッケージ化するにあたってディレクトリ構造を変える必要がある

    ◦ 本来は手動でzeitwerkのオートロードパス追加をする必要があるところ、 packs-railsは起動プロセ スをフックして自動的に追加する 、とREADMEに記載されている Setting up packs-rails is straightforward. Simply by including packs-rails in your Gemfile in all environments, packs-rails will automatically hook into and configure Rails. →ちょっと見えなくて怖い、ので少し深堀り
  10. ©2024 Coincheck Inc. 56 packwerkの良い点(あらためて) • 構造 ◦ packwerk自体は静的解析なので、本番環境に影響を与えない ◦

    packs-railsを併用することで、ディレクトリ構造を変更するだけでモジュラーモノリス構造、パッケージ 化を安全・低コスト に試すことができる • 機能 ◦ パブリック領域の設定 ができる ◦ 依存関係を制限できる(現状では有用な役割とはなっていない)
  11. ©2024 Coincheck Inc. 60 packwerkで防ぎきれない観点、とその対策 モノリス側で再び同じようなロジックが作成されることを機械的に防ぐことはできない • まずは全体認知が必要 ◦ 各チームへの説明

    ◦ README.mdの整備 • 機械的に検知もしたい ◦ 今回のケースは、パッケージ内で判定しているステータスの参照をカスタム copを用いて検知 ◦ カスタムcop検知を監視するため、リリース時点での rubocop指摘をBigQueryに蓄積し、 LookerStudioで監視する仕組みも整備
  12. ©2024 Coincheck Inc. 62 今後の展望 現在社内で進めていること • 機能のパッケージ化をいくつか並行で進めている 今後は •

    目先は機能のパッケージ化を進めていく • 機能のパッケージ化の先に、ドメイン分割など次の一手の兆しが見えれば・・・ モノリス (非パッケージ化コード) 認可パッケージ XXXパッケージ XXXパッケージ
  13. ©2024 Coincheck Inc. 64 まとめ packwerkを利用した認可ロジックの集約で・・・ • 取引可否の判定をするならココ、という目印ができた👍 • サービス全体で仕様を横串で確認することが容易になった👍

    • ドメインロジックの複雑度が下がった👍 • 新しいプロダクトでも認可ロジックの適用がしやすくなった👍 ◦ 実績もあり • 既存プロダクトの仕様変更もしやすくなった👍 ◦ 実績もあり • 巨大なコードベースに対する安全なリファクタリングツールとしてのpackwerkのメ リットが見えた👍