Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
モジュラモノリスにおける境界をGoのinternalパッケージで守る
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
magavel
February 21, 2026
Programming
3.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
モジュラモノリスにおける境界をGoのinternalパッケージで守る
Go Conference mini 2026 in Sendai:
https://sendaigo.jp/
magavel
February 21, 2026
More Decks by magavel
See All by magavel
uniqueパッケージの内部実装を支えるweak pointerの話
magavel
0
1.6k
Other Decks in Programming
See All in Programming
継続モナドとリアクティブプログラミング
yukikurage
3
410
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
15
2.9k
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
240
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
140
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
350
symfony/aiとlaravel/boost
77web
0
120
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
0
1.6k
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
290
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
340
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
160
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
The Cult of Friendly URLs
andyhume
79
6.9k
Why Our Code Smells
bkeepers
PRO
340
58k
Making the Leap to Tech Lead
cromwellryan
135
10k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
63
55k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.5k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Transcript
モジュラモノリスにおける境界を Goのinternalパッケージで守る Go Conference mini 2026 in Sendai magavel /
SODA inc.
自己紹介 • 大阪からやってきました • 普段はGoでSNKRDUNKを開発しています magavel / SODA inc. @magavel_dev
\ 2秒でフォロバします/
本日のテーマ 結合とGo
ソフトウェア文脈でいう結合って何ですか?
”結合はむしろ、 忘れてはならない設計ツールだ。” ソフトウェア設計の結合バランス (2025) 第1章 結合とシステム設計 P14
前回の仙台での発表から約3年... モジュール分割、今もしっかり進めています! ref: https://speakerdeck.com/sh0e1/snkrdunkdego-plus-grpcde-susumerumoziyuramonorisu
前回の仙台での発表から約3年... コードベースの規模もさらに拡大中 🤯 13,309 2,238,707 Goのファイル数 Goのコード行数 2026/02/20時点
CASE. 1 internalパッケージで結合強度を コントロールする
Goのinternalパッケージを使うと • あるモジュールのinternal配下へはその モジュールからしか参照できなくなる • コードレビューや運用ルールではな く、Go標準の仕組みを使ってビルド段 階で境界を守れる • 各モジュールを
interface/(公開層) と internal/(内部実装層)の二層に分 けて、ドメイン・ユースケース・イン フラなどはすべて internal に閉じ込め ている
internalパッケージの抜け穴 • ちなみに絶対に突破できない仕組みというわけではない • 例えばtsgoとtsgolintのケース ◦ • とはいえ、Goチームでも使われているので、硬い仕組みであることには変 わりない ref:
https://speakerdeck.com/syumai/how-tsgolint-exposes-typescript-gos-private-apis
CASE. 2 public functionsパターン(※1)を 導入する ※1:public functionsパターンは造語なので覚える必要はありません。
モジュールの公開インターフェース設計 • interface/配下に通信方式ごとにディレ クトリを切って外部に公開する • 他モジュールからはこの公開関数(Go のinterface)を呼び出す • モジュールから直接クライアントアプ リにAPIを提供する場合は、httpディレ
クトリ配下にhandlerを実装する
実例:商品カタログモジュールの公開関数と呼び出しイメージ 呼び出し元↓ ↑定義元
CASE. 3 depguardで旧コードへの依存を防ぐ
OpenPeeDeeP/depguardとは • golangci-lintに組み込まれているリン ターの一つ。 • importパスのホワイトリスト/ブラック リストを定義し、禁止したい依存をCI で自動検知・制限できる • SNKRDUNKでは、分離モジュールから
モノリス(旧コード)への依存を防ぐ ルールを.golangci.ymlに定義し、CIで全 PRをチェックしている
段階的に移行を進めている • DBはコンテキスト境界がより明確になってきた段階で分割する方針に変わ りなし、なのでモジュールとモノリスでDBを共有している • モジュールのinfrastructure層だけはモノリスへの依存を許容する • ここでも、将来的な抵抗要因と現時点でのコストを天秤にかけるなど、結 合バランスの考え方が必要になってくる •
現在進行形の重要トピック ◦ コンテキスト/モジュール間でトランザクションを受け渡し可能にする か、Sagaパターンなど分散トランザクションを導入するか...等
まとめ • 結合は設計ツール。 ◦ 教科書通り(完全な疎結合)を目指すのではなく、トレードオフ や組織戦略を踏まえたうえで結合をむやみに恐れないことも大 事。 • Goのコードベースでモジュラモノリスを実現するために、Goの internalと公開関数という建て付けを採用して今のところうまくいっ
てそう。 • リアーキテクチャ推進の文脈でもガードレール設計は大事。 ◦ 今回取り上げたdepguardなどlinterを活用しよう。
おまけ ブースに居る鑑定士Gopherくん にぜひ会いにきてください! Xにイラストの感想投稿してもらえる と、手伝ってくれたイラストレーター が喜びます🙏
Thank you. ご清聴ありがとうございました! Special Thanks SNKRDUNKにおけるモジュラモノリスへの移行は、 同じリアーキテクチャ推進チームの@avexbesukeさん、@mishさ ん、@shinodaさんをはじめ、担当ドメインのモジュール分割に関 わってくれている人たちによって支えられています。