給与の分割 — 現在・計画・移行途中
同じシステムを 3 回: 1 つのアプリケーションと共有 DB の中の給与、専用 DB を持つ独立した給与サービス、そして @migration_target / @planned で表す移行途中の状態。
現在(index.krs)
Section titled “現在(index.krs)”// payroll-split/index.krs: 現在のアーキテクチャ。// 初回体験ガイドの 2 つ目の題材(#3601)。planned.krs(目標)と migrating.krs// (移行途中)と見比べる。//// 勤怠と給与は別のドメインだが、どちらも 1 つの Workforce Application に// 同居し、1 つの Workforce Database を共有している。給与チームは給与ドメインを// 持つが、サービスは 1 つも持っていない。
system Workforce { label "人事基盤"
user Employee [human] { label "従業員" description "勤怠を入力し、給与明細を確認する" } user PayrollStaff [human] { label "給与担当" description "給与計算と振込を確認する" }
service WorkforceApp { label "人事アプリケーション" description "勤怠と給与を抱える 1 つのデプロイ単位"
domain Attendance { label "勤怠" usecase RecordHours { label "勤務時間を入力する" resource WorkforceDB.Timesheets { operations create } } usecase ApproveTimesheet { label "勤務表を承認する" resource WorkforceDB.Timesheets { operations update } }
Attendance -> Payroll "締めた勤務表を渡す" } domain Payroll { label "給与" usecase CalculatePay { label "給与を計算する" resource WorkforceDB.Payslips { operations create } resource WorkforceDB.Timesheets { operations read } } usecase TransferPay { label "給与を振り込む" resource WorkforceDB.Transfers { operations create } } } }
service ReminderWorker { label "リマインダーワーカー" description "勤務表のリマインダーをバックグラウンドで送る"
domain Reminders { label "リマインダー" usecase SendReminder { label "リマインダーを送る" resource WorkforceDB.ReminderQueue { operations update } } } }
service BankTransfer [external] { label "銀行振込" description "給与の支払い。銀行が運営する" }
database WorkforceDB { label "人事データベース" description "基盤のすべての部分で共有" table Timesheets { label "勤務表" } table Payslips { label "給与明細" } table Transfers { label "振込" } table ReminderQueue { label "リマインダーキュー" } }
Employee -> WorkforceApp "勤怠の入力と給与明細の確認" PayrollStaff -> WorkforceApp "給与計算を確認" WorkforceApp -> ReminderWorker "リマインダーを予約" WorkforceApp -> BankTransfer "振込を送る"}
organization Corporate { label "コーポレート開発部"
team workforce { label "人事チーム" description "従業員ポータルと勤怠の流れを作る" owns WorkforceApp owns Attendance }
team payroll { label "給与チーム" description "給与のルールを持つが、人事アプリケーションの中で出荷している" owns Payroll }
team platform { label "基盤チーム" description "共有データベースとバックグラウンドワーカーを運用する" owns ReminderWorker owns Reminders }}計画(planned.krs)
Section titled “計画(planned.krs)”// payroll-split/planned.krs: 目標のアーキテクチャ。// 給与は専用のデータベースを持つ独立したサービスになり、給与のルールを持つ// チームがそれを動かすサービスも持つ。// index.krs(現在のアーキテクチャ)と見比べる。
system Workforce { label "人事基盤"
user Employee [human] { label "従業員" description "勤怠を入力し、給与明細を確認する" } user PayrollStaff [human] { label "給与担当" description "給与計算と振込を確認する" }
service WorkforceApp { label "人事アプリケーション" description "従業員ポータルと勤怠"
domain Attendance { label "勤怠" usecase RecordHours { label "勤務時間を入力する" resource WorkforceDB.Timesheets { operations create } } usecase ApproveTimesheet { label "勤務表を承認する" resource WorkforceDB.Timesheets { operations update } } } }
service PayrollService { label "給与サービス" description "給与計算と振込。独自のリリースサイクル"
domain Payroll { label "給与" usecase CalculatePay { label "給与を計算する" resource PayrollDB.Payslips { operations create } } usecase TransferPay { label "給与を振り込む" resource PayrollDB.Transfers { operations create } } } }
service ReminderWorker { label "リマインダーワーカー" description "勤務表のリマインダーをバックグラウンドで送る"
domain Reminders { label "リマインダー" usecase SendReminder { label "リマインダーを送る" resource WorkforceDB.ReminderQueue { operations update } } } }
service BankTransfer [external] { label "銀行振込" description "給与の支払い。銀行が運営する" }
database WorkforceDB { label "人事データベース" description "勤務表とリマインダー" table Timesheets { label "勤務表" } table ReminderQueue { label "リマインダーキュー" } }
database PayrollDB { label "給与データベース" description "給与だけが持つ" table Payslips { label "給与明細" } table Transfers { label "振込" } }
Employee -> WorkforceApp "勤務時間を入力する" Employee -> PayrollService "給与明細を確認" PayrollStaff -> PayrollService "給与計算を確認" WorkforceApp -> PayrollService "締めた勤務表を渡す" WorkforceApp -> ReminderWorker "リマインダーを予約" PayrollService -> BankTransfer "振込を送る"}
organization Corporate { label "コーポレート開発部"
team workforce { label "人事チーム" description "従業員ポータルと勤怠の流れを作る" owns WorkforceApp owns Attendance }
team payroll { label "給与チーム" description "給与のルールと、それを動かすサービスを持つ" owns PayrollService owns Payroll }
team platform { label "基盤チーム" description "共有データベースとバックグラウンドワーカーを運用する" owns ReminderWorker owns Reminders }}移行途中(migrating.krs)
Section titled “移行途中(migrating.krs)”// payroll-split/migrating.krs: 移行途中の状態。// 給与サービスは動いているが、まだ共有の Workforce Database を読み書きしている。// 専用の Payroll Database は計画だけで、まだ作られていない。// データの移動が、分割の完了を決める。
system Workforce { label "人事基盤"
user Employee [human] { label "従業員" description "勤怠を入力し、給与明細を確認する" } user PayrollStaff [human] { label "給与担当" description "給与計算と振込を確認する" }
service WorkforceApp { label "人事アプリケーション" description "従業員ポータルと勤怠"
domain Attendance { label "勤怠" usecase RecordHours { label "勤務時間を入力する" resource WorkforceDB.Timesheets { operations create } } usecase ApproveTimesheet { label "勤務表を承認する" resource WorkforceDB.Timesheets { operations update } } } }
service PayrollService @migration_target(from: WorkforceApp) { label "給与サービス" description "切り出し済み。まだ共有データベースを使う"
domain Payroll { label "給与" usecase CalculatePay { label "給与を計算する" resource WorkforceDB.Payslips { operations create } resource WorkforceDB.Timesheets { operations read } } usecase TransferPay { label "給与を振り込む" resource WorkforceDB.Transfers { operations create } } } }
service ReminderWorker { label "リマインダーワーカー" description "勤務表のリマインダーをバックグラウンドで送る"
domain Reminders { label "リマインダー" usecase SendReminder { label "リマインダーを送る" resource WorkforceDB.ReminderQueue { operations update } } } }
service BankTransfer [external] { label "銀行振込" description "給与の支払い。銀行が運営する" }
database WorkforceDB { label "人事データベース" description "給与のテーブルはまだ移っていない" table Timesheets { label "勤務表" } table Payslips @deprecated { label "給与明細" } table Transfers @deprecated { label "振込" } table ReminderQueue { label "リマインダーキュー" } }
database PayrollDB @planned { label "給与データベース" description "給与のテーブルの移行先" table Payslips { label "給与明細" } table Transfers { label "振込" } }
Employee -> WorkforceApp "勤務時間を入力する" Employee -> PayrollService "給与明細を確認" PayrollStaff -> PayrollService "給与計算を確認" WorkforceApp -> PayrollService "締めた勤務表を渡す" WorkforceApp -> ReminderWorker "リマインダーを予約" PayrollService -> BankTransfer "振込を送る"}
organization Corporate { label "コーポレート開発部"
team workforce { label "人事チーム" description "従業員ポータルと勤怠の流れを作る" owns WorkforceApp owns Attendance }
team payroll { label "給与チーム" description "給与サービスを運用する。移行までデータは基盤チームに頼る" owns PayrollService owns Payroll }
team platform { label "基盤チーム" description "共有データベースとバックグラウンドワーカーを運用する" owns ReminderWorker owns Reminders }}© 2026 Hiroki Kondo · Licensed underApache-2.0