モジュラモノリスにおける境界をGoのinternalパッケージで守る
by
magavel
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
モジュラモノリスにおける境界を Goのinternalパッケージで守る Go Conference mini 2026 in Sendai magavel / SODA inc.
Slide 2
Slide 2 text
自己紹介 ● 大阪からやってきました ● 普段はGoでSNKRDUNKを開発しています magavel / SODA inc. @magavel_dev \ 2秒でフォロバします/
Slide 3
Slide 3 text
本日のテーマ 結合とGo
Slide 4
Slide 4 text
ソフトウェア文脈でいう結合って何ですか?
Slide 5
Slide 5 text
”結合はむしろ、 忘れてはならない設計ツールだ。” ソフトウェア設計の結合バランス (2025) 第1章 結合とシステム設計 P14
Slide 6
Slide 6 text
前回の仙台での発表から約3年... モジュール分割、今もしっかり進めています! ref: https://speakerdeck.com/sh0e1/snkrdunkdego-plus-grpcde-susumerumoziyuramonorisu
Slide 7
Slide 7 text
前回の仙台での発表から約3年... コードベースの規模もさらに拡大中 🤯 13,309 2,238,707 Goのファイル数 Goのコード行数 2026/02/20時点
Slide 8
Slide 8 text
CASE. 1 internalパッケージで結合強度を コントロールする
Slide 9
Slide 9 text
Goのinternalパッケージを使うと ● あるモジュールのinternal配下へはその モジュールからしか参照できなくなる ● コードレビューや運用ルールではな く、Go標準の仕組みを使ってビルド段 階で境界を守れる ● 各モジュールを interface/(公開層) と internal/(内部実装層)の二層に分 けて、ドメイン・ユースケース・イン フラなどはすべて internal に閉じ込め ている
Slide 10
Slide 10 text
internalパッケージの抜け穴 ● ちなみに絶対に突破できない仕組みというわけではない ● 例えばtsgoとtsgolintのケース ○ ● とはいえ、Goチームでも使われているので、硬い仕組みであることには変 わりない ref: https://speakerdeck.com/syumai/how-tsgolint-exposes-typescript-gos-private-apis
Slide 11
Slide 11 text
CASE. 2 public functionsパターン(※1)を 導入する ※1:public functionsパターンは造語なので覚える必要はありません。
Slide 12
Slide 12 text
モジュールの公開インターフェース設計 ● interface/配下に通信方式ごとにディレ クトリを切って外部に公開する ● 他モジュールからはこの公開関数(Go のinterface)を呼び出す ● モジュールから直接クライアントアプ リにAPIを提供する場合は、httpディレ クトリ配下にhandlerを実装する
Slide 13
Slide 13 text
実例:商品カタログモジュールの公開関数と呼び出しイメージ 呼び出し元↓ ↑定義元
Slide 14
Slide 14 text
CASE. 3 depguardで旧コードへの依存を防ぐ
Slide 15
Slide 15 text
OpenPeeDeeP/depguardとは ● golangci-lintに組み込まれているリン ターの一つ。 ● importパスのホワイトリスト/ブラック リストを定義し、禁止したい依存をCI で自動検知・制限できる ● SNKRDUNKでは、分離モジュールから モノリス(旧コード)への依存を防ぐ ルールを.golangci.ymlに定義し、CIで全 PRをチェックしている
Slide 16
Slide 16 text
段階的に移行を進めている ● DBはコンテキスト境界がより明確になってきた段階で分割する方針に変わ りなし、なのでモジュールとモノリスでDBを共有している ● モジュールのinfrastructure層だけはモノリスへの依存を許容する ● ここでも、将来的な抵抗要因と現時点でのコストを天秤にかけるなど、結 合バランスの考え方が必要になってくる ● 現在進行形の重要トピック ○ コンテキスト/モジュール間でトランザクションを受け渡し可能にする か、Sagaパターンなど分散トランザクションを導入するか...等
Slide 17
Slide 17 text
まとめ ● 結合は設計ツール。 ○ 教科書通り(完全な疎結合)を目指すのではなく、トレードオフ や組織戦略を踏まえたうえで結合をむやみに恐れないことも大 事。 ● Goのコードベースでモジュラモノリスを実現するために、Goの internalと公開関数という建て付けを採用して今のところうまくいっ てそう。 ● リアーキテクチャ推進の文脈でもガードレール設計は大事。 ○ 今回取り上げたdepguardなどlinterを活用しよう。
Slide 18
Slide 18 text
おまけ ブースに居る鑑定士Gopherくん にぜひ会いにきてください! Xにイラストの感想投稿してもらえる と、手伝ってくれたイラストレーター が喜びます🙏
Slide 19
Slide 19 text
Thank you. ご清聴ありがとうございました! Special Thanks SNKRDUNKにおけるモジュラモノリスへの移行は、 同じリアーキテクチャ推進チームの@avexbesukeさん、@mishさ ん、@shinodaさんをはじめ、担当ドメインのモジュール分割に関 わってくれている人たちによって支えられています。