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さんをはじめ、担当ドメインのモジュール分割に関 わってくれている人たちによって支えられています。