@k2works/claude-code-booster 3.5.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +42 -42
- package/bin/claude-code-booster +90 -90
- package/lib/assets/.claude/README.md +239 -239
- package/lib/assets/.claude/scripts/generate-inception-deck.mjs +911 -911
- package/lib/assets/.claude/settings.json +11 -11
- package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +111 -111
- package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +83 -83
- package/lib/assets/.claude/skills/analyzing-business/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +77 -77
- package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +117 -88
- package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +84 -84
- package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +91 -91
- package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +101 -101
- package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +89 -89
- package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +80 -80
- package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +72 -72
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +113 -113
- package/lib/assets/.claude/skills/developing-backend/SKILL.md +100 -100
- package/lib/assets/.claude/skills/developing-frontend/SKILL.md +93 -93
- package/lib/assets/.claude/skills/developing-release/SKILL.md +120 -120
- package/lib/assets/.claude/skills/generating-slides/SKILL.md +94 -94
- package/lib/assets/.claude/skills/git-commit/SKILL.md +81 -81
- package/lib/assets/.claude/skills/killing-processes/SKILL.md +44 -44
- package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -59
- package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -54
- package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -67
- package/lib/assets/.claude/skills/operating-docs/SKILL.md +219 -219
- package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -77
- package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -63
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +104 -104
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +162 -161
- package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -158
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +144 -144
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +119 -119
- package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +151 -151
- package/lib/assets/.claude/skills/tracking-progress/SKILL.md +91 -91
- package/lib/assets/.claude/skills/validating-iteration-plan/SKILL.md +215 -215
- package/lib/assets/.devcontainer/devcontainer.json +34 -34
- package/lib/assets/.env.example +17 -17
- package/lib/assets/.gitattributes +4 -4
- package/lib/assets/.github/workflows/docker-publish.yml +77 -77
- package/lib/assets/.github/workflows/mkdocs.yml +39 -39
- package/lib/assets/AGENTS.md +94 -94
- package/lib/assets/CLAUDE.md +183 -183
- package/lib/assets/README.md +254 -254
- package/lib/assets/docker-compose.yml +33 -33
- package/lib/assets/docs/adr/index.md +10 -10
- package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -519
- package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -537
- package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -320
- package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -498
- package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -322
- package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -365
- package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -156
- package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -178
- package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -312
- package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -337
- package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -388
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -380
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -352
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -529
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -399
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -485
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -566
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -462
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -401
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -739
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +518 -518
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +532 -532
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +241 -241
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -374
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -375
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -195
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -268
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -164
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -168
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -269
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -148
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -176
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -604
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -729
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -420
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -466
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -523
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -340
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +248 -248
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -452
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -495
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -416
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -687
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -442
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -427
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -428
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -309
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -596
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +355 -355
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +414 -414
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -367
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -362
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -257
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -283
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -326
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +177 -177
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -219
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -244
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -438
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -469
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -174
- package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -90
- package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -463
- package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -425
- package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -247
- package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -841
- package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -331
- package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -356
- package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -361
- package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -392
- package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -297
- package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -315
- package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -311
- package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -349
- package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +243 -243
- package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +328 -328
- package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -348
- package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -357
- package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -364
- package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -515
- package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -557
- package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -327
- package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -517
- package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -441
- package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -407
- package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -398
- package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -476
- package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +391 -391
- package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -342
- package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -730
- package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -624
- package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -512
- package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +433 -433
- package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +688 -688
- package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +243 -243
- package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -162
- package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -135
- package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -299
- package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -241
- package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -131
- package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -127
- package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -114
- package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -138
- package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -65
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -232
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -256
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -195
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -214
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -249
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -174
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -192
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -95
- package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -109
- package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -96
- package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -108
- package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -178
- package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -35
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -246
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -218
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -179
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -267
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -222
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -189
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -215
- package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -213
- package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -302
- package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -339
- package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -394
- package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -422
- package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -400
- package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -226
- package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -296
- package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -411
- package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -337
- package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -257
- package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -313
- package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -309
- package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -412
- package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -390
- package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -461
- package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -434
- package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -392
- package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -631
- package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -49
- package/lib/assets/docs/article/getting-start-tdd/index.md +93 -93
- package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -375
- package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -349
- package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -445
- package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +409 -409
- package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -330
- package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +290 -290
- package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -69
- package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -234
- package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -261
- package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -185
- package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -115
- package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -382
- package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -626
- package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -393
- package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -310
- package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -188
- package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -167
- package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -205
- package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -61
- package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -262
- package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -169
- package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -314
- package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -235
- package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -327
- package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -322
- package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -285
- package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -207
- package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -295
- package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -56
- package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -259
- package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -200
- package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -141
- package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -410
- package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -321
- package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -372
- package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -453
- package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -460
- package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -266
- package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -308
- package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -84
- package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -201
- package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -247
- package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -274
- package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -208
- package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -172
- package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -122
- package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -116
- package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -126
- package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -55
- package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -231
- package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -238
- package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -228
- package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -287
- package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -329
- package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +237 -237
- package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -398
- package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -264
- package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -164
- package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -105
- package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -111
- package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -107
- package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -99
- package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -123
- package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -186
- package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -139
- package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -106
- package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -75
- package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -404
- package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -554
- package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -469
- package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -520
- package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -420
- package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -510
- package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -435
- package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -465
- package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -377
- package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -116
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -122
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -89
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -100
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -97
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -61
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -84
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -92
- package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -80
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -103
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -104
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -121
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -107
- package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -248
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -91
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -106
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -95
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -111
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/index.md +66 -66
- package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -102
- package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -308
- package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -334
- package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -221
- package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -213
- package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -313
- package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -239
- package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -418
- package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -227
- package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -299
- package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -315
- package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -297
- package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -314
- package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -360
- package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -270
- package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -126
- package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -175
- package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -158
- package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -133
- package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -155
- package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -78
- package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -119
- package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -83
- package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -131
- package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -129
- package/lib/assets/docs/article/grokkingfp/all/index.md +368 -368
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -530
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -923
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1128 -1128
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -1104
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -1026
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +785 -785
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -871
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -972
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -926
- package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -870
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -715
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -626
- package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +712 -712
- package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -276
- package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -667
- package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -643
- package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -620
- package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -697
- package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -751
- package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -721
- package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -246
- package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -811
- package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -971
- package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -981
- package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -949
- package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -947
- package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -739
- package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -203
- package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +712 -712
- package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -838
- package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -985
- package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -974
- package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1286 -1286
- package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1049 -1049
- package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -210
- package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -714
- package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -961
- package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -972
- package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -832
- package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -911
- package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +922 -922
- package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -234
- package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -591
- package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -866
- package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -915
- package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +878 -878
- package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -845
- package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +844 -844
- package/lib/assets/docs/article/grokkingfp/index.md +143 -143
- package/lib/assets/docs/article/grokkingfp/java/index.md +211 -211
- package/lib/assets/docs/article/grokkingfp/java/part-1.md +648 -648
- package/lib/assets/docs/article/grokkingfp/java/part-2.md +675 -675
- package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -672
- package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -771
- package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -959
- package/lib/assets/docs/article/grokkingfp/java/part-6.md +1328 -1328
- package/lib/assets/docs/article/grokkingfp/python/index.md +258 -258
- package/lib/assets/docs/article/grokkingfp/python/part-1.md +443 -443
- package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -958
- package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -1004
- package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -765
- package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -747
- package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -861
- package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -330
- package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +755 -755
- package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -938
- package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -946
- package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -921
- package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -908
- package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1412 -1412
- package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -242
- package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -634
- package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -1060
- package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -994
- package/lib/assets/docs/article/grokkingfp/rust/part-4.md +573 -573
- package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -705
- package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -508
- package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -171
- package/lib/assets/docs/article/grokkingfp/scala/part-1.md +543 -543
- package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -946
- package/lib/assets/docs/article/grokkingfp/scala/part-3.md +919 -919
- package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -742
- package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -722
- package/lib/assets/docs/article/grokkingfp/scala/part-6.md +867 -867
- package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -273
- package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +561 -561
- package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -1129
- package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -842
- package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1087 -1087
- package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -717
- package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +982 -982
- package/lib/assets/docs/article/practical-database-design/index.md +121 -121
- package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +288 -288
- package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +518 -518
- package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +557 -557
- package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +924 -924
- package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +1627 -1627
- package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +2716 -2716
- package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +2082 -2082
- package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +2105 -2105
- package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +2031 -2031
- package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +1387 -1387
- package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +1677 -1677
- package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +1417 -1417
- package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +1434 -1434
- package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +667 -667
- package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +1625 -1625
- package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +1915 -1915
- package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +1708 -1708
- package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +2095 -2095
- package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +1123 -1123
- package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +1031 -1031
- package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +1382 -1382
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +991 -991
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +1300 -1300
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +1166 -1166
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +1584 -1584
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +1183 -1183
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +1016 -1016
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +1753 -1753
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +1447 -1447
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +1878 -1878
- package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +965 -965
- package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +2069 -2069
- package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +2439 -2439
- package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +3661 -3661
- package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +2916 -2916
- package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +3105 -3105
- package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +2697 -2697
- package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +2544 -2544
- package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +2180 -2180
- package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +1192 -1192
- package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +2101 -2101
- package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +1032 -1032
- package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +1609 -1609
- package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +1453 -1453
- package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +1292 -1292
- package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +1470 -1470
- package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +1698 -1698
- package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +2334 -2334
- package/lib/assets/docs/article/practical-database-design/study/study2-1.md +1693 -1693
- package/lib/assets/docs/article/practical-database-design/study/study2-2.md +1347 -1347
- package/lib/assets/docs/article/practical-database-design/study/study2-3.md +2044 -2044
- package/lib/assets/docs/article/practical-database-design/study/study2-4.md +2229 -2229
- package/lib/assets/docs/article/practical-database-design/study/study2-5.md +2418 -2418
- package/lib/assets/docs/article/practical-database-design/study/study3-1.md +2205 -2205
- package/lib/assets/docs/article/practical-database-design/study/study3-2.md +2221 -2221
- package/lib/assets/docs/article/practical-database-design/study/study3-3.md +2253 -2253
- package/lib/assets/docs/article/practical-database-design/study/study3-4.md +2106 -2106
- package/lib/assets/docs/article/practical-database-design/study/study3-5.md +2507 -2507
- package/lib/assets/docs/article/practical-database-design/study/study4-1.md +2587 -2587
- package/lib/assets/docs/article/practical-database-design/study/study4-2.md +2075 -2075
- package/lib/assets/docs/article/practical-database-design/study/study4-3.md +1805 -1805
- package/lib/assets/docs/article/practical-database-design/study/study4-4.md +1895 -1895
- package/lib/assets/docs/article/practical-database-design/study/study4-5.md +2878 -2878
- package/lib/assets/docs/assets/css/extra.css +29 -29
- package/lib/assets/docs/assets/js/extra.js +44 -44
- package/lib/assets/docs/development/index.md +39 -39
- package/lib/assets/docs/operation/index.md +11 -11
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +532 -532
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +341 -341
- package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +581 -580
- package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +642 -642
- package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +465 -465
- package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +450 -450
- package/lib/assets/docs/reference/images/Ansoff.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandBasicStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandCategorization.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandRecurutementStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandValue.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BusinessActivitiy.svg +3 -3
- package/lib/assets/docs/reference/images/HRM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/MarketingStructure.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/OrganizationElemnts.svg +3 -3
- package/lib/assets/docs/reference/images/PPM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/PositioningMap.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductLayer.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductMix.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/SWOT.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/TargetMarket.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ThreeGenericStrategies.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/VRIO.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ValueChain.drawio.svg +3 -3
- package/lib/assets/docs/reference/index.md +52 -52
- package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +250 -242
- package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +2216 -2216
- package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +1878 -1878
- package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +550 -544
- package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +705 -705
- package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +1313 -1313
- package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +311 -311
- package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +599 -599
- package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +528 -528
- package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +689 -682
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +461 -461
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +580 -560
- package/lib/assets/docs/reference//343/203/255/343/202/270/343/202/253/343/203/253/343/202/267/343/203/263/343/202/255/343/203/263/343/202/260.md +1367 -1367
- package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +2637 -2636
- package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +665 -663
- package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1248 -1248
- package/lib/assets/docs/reference//350/250/200/350/252/236/345/210/245/351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +28 -0
- package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +1482 -1482
- package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +421 -421
- package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +392 -392
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +299 -299
- package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1236 -1236
- package/lib/assets/docs/review/index.md +5 -5
- package/lib/assets/docs/strategy/index.md +1 -1
- package/lib/assets/docs/template/ADR.md +30 -30
- package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +1366 -1366
- package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +634 -634
- package/lib/assets/docs/template/README.md +50 -50
- package/lib/assets/docs/template/index.md +23 -23
- package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +12 -12
- package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +547 -547
- package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +58 -58
- package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +13 -13
- package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +379 -379
- package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +573 -573
- package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +69 -68
- package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
- package/lib/assets/docs/template//350/250/255/350/250/210.md +173 -173
- package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +688 -688
- package/lib/assets/gulpfile.js +25 -25
- package/lib/assets/mkdocs.yml +136 -135
- package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
- package/lib/assets/ops/scripts/journal.js +180 -180
- package/lib/assets/ops/scripts/mkdocs.js +82 -82
- package/lib/assets/ops/scripts/release.js +431 -431
- package/lib/assets/ops/scripts/sonar_local.js +726 -726
- package/lib/assets/ops/scripts/ssh.js +190 -190
- package/lib/assets/ops/scripts/vault.js +299 -299
- package/lib/assets/package-lock.json +1653 -1653
- package/lib/assets/package.json +40 -40
- package/lib/gulpfile.js +37 -37
- package/package.json +41 -41
- package/lib/assets/.claude/agent-memory/xp-programmer/MEMORY.md +0 -6
- package/lib/assets/.claude/agent-memory/xp-programmer/project_cargo_tracker.md +0 -11
- package/lib/assets/.claude/agent-memory/xp-programmer/project_ddd_patterns.md +0 -27
- package/lib/assets/.claude/agent-memory/xp-programmer/project_us07_route_assignment.md +0 -19
|
@@ -1,991 +1,991 @@
|
|
|
1
|
-
# 第14章:財務会計システムの全体像(ORM版)
|
|
2
|
-
|
|
3
|
-
本章では、財務会計システムの全体像を把握し、Spring Data JPA を使用した ORM 実装のアーキテクチャについて解説します。MyBatis 版との違いを比較しながら、JPA の特徴を活かした設計手法を学びます。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 14.1 財務会計システムのスコープ
|
|
8
|
-
|
|
9
|
-
### 基幹業務システムにおける位置づけ
|
|
10
|
-
|
|
11
|
-
財務会計システムは、基幹業務システムの中で他のシステムから仕訳データを受け取り、企業の財務状態を管理する重要なシステムです。
|
|
12
|
-
|
|
13
|
-
```plantuml
|
|
14
|
-
@startuml
|
|
15
|
-
|
|
16
|
-
title 基幹業務システムの全体像
|
|
17
|
-
|
|
18
|
-
state "得意先\n(Customer)" as Customer
|
|
19
|
-
state "販売管理\n(Sales Management)" as SalesManagement
|
|
20
|
-
SalesManagement : ・受注 \n・出荷 \n・売上
|
|
21
|
-
|
|
22
|
-
state "購買管理\n(Procurement Management)" as ProcurementManagement
|
|
23
|
-
ProcurementManagement : ・発注\n・入荷/受入\n・仕入(検収)
|
|
24
|
-
|
|
25
|
-
state "在庫\n(Inventory)" as Inventory
|
|
26
|
-
|
|
27
|
-
state "仕入先\n(Supplier)" as Supplier
|
|
28
|
-
|
|
29
|
-
state "生産管理\n(Production Management)" as ProductionManagement
|
|
30
|
-
ProductionManagement : ・生産計画\n・品質管理\n・工程管理\n・製造原価管理
|
|
31
|
-
|
|
32
|
-
state "債権管理\n(Accounts Receivable)" as AccountsReceivable
|
|
33
|
-
AccountsReceivable : ・請求 \n・入金
|
|
34
|
-
|
|
35
|
-
state "債務管理\n(Accounts Payable)" as AccountsPayable
|
|
36
|
-
AccountsPayable : ・支払\n・出金
|
|
37
|
-
|
|
38
|
-
state "財務会計\n(Financial Accounting)" as Accounting #LightBlue
|
|
39
|
-
Accounting : ・勘定科目管理\n・仕訳処理\n・残高管理\n・財務諸表\n・決算処理
|
|
40
|
-
|
|
41
|
-
[*] -> Customer
|
|
42
|
-
|
|
43
|
-
Customer --> SalesManagement
|
|
44
|
-
SalesManagement --> AccountsReceivable
|
|
45
|
-
SalesManagement --> ProcurementManagement : 調達依頼
|
|
46
|
-
SalesManagement --> ProductionManagement : 需要予測 \n製造指示
|
|
47
|
-
SalesManagement --> Accounting : 仕訳
|
|
48
|
-
SalesManagement --> Customer
|
|
49
|
-
Inventory --> SalesManagement
|
|
50
|
-
|
|
51
|
-
ProcurementManagement --> Inventory
|
|
52
|
-
ProcurementManagement --> AccountsPayable
|
|
53
|
-
ProcurementManagement --> Supplier
|
|
54
|
-
Supplier --> ProcurementManagement
|
|
55
|
-
ProductionManagement --> ProcurementManagement : 調達依頼
|
|
56
|
-
|
|
57
|
-
ProductionManagement --> Inventory : 入荷
|
|
58
|
-
Inventory --> ProductionManagement : 払出
|
|
59
|
-
|
|
60
|
-
AccountsReceivable --> Accounting
|
|
61
|
-
AccountsPayable --> Accounting
|
|
62
|
-
ProductionManagement --> Accounting : 仕訳
|
|
63
|
-
ProcurementManagement --> Accounting : 仕訳
|
|
64
|
-
|
|
65
|
-
Customer -> [*]
|
|
66
|
-
|
|
67
|
-
@enduml
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### 財務会計システムの業務領域
|
|
71
|
-
|
|
72
|
-
財務会計システムは、以下の業務領域をカバーします。
|
|
73
|
-
|
|
74
|
-
```plantuml
|
|
75
|
-
@startuml
|
|
76
|
-
|
|
77
|
-
[*] -> 販売管理
|
|
78
|
-
販売管理 --> 財務会計 : 売上仕訳
|
|
79
|
-
販売管理 : 売掛金 / 売上
|
|
80
|
-
|
|
81
|
-
[*] -> 購買管理
|
|
82
|
-
購買管理 --> 財務会計 : 仕入仕訳
|
|
83
|
-
購買管理 : 仕入 / 買掛金
|
|
84
|
-
|
|
85
|
-
[*] -> 債権管理
|
|
86
|
-
債権管理 --> 財務会計 : 入金仕訳
|
|
87
|
-
債権管理 : 現金預金 / 売掛金
|
|
88
|
-
|
|
89
|
-
[*] -> 債務管理
|
|
90
|
-
債務管理 --> 財務会計 : 支払仕訳
|
|
91
|
-
債務管理 : 買掛金 / 現金預金
|
|
92
|
-
|
|
93
|
-
財務会計 --> 帳票出力
|
|
94
|
-
財務会計 : 勘定科目管理 \n仕訳処理 \n残高管理
|
|
95
|
-
帳票出力 : 日計表 \n合計残高試算表 \n財務諸表
|
|
96
|
-
|
|
97
|
-
帳票出力 -> [*]
|
|
98
|
-
|
|
99
|
-
@enduml
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### 業務機能の概要
|
|
103
|
-
|
|
104
|
-
| 業務 | 説明 |
|
|
105
|
-
|------|------|
|
|
106
|
-
| **勘定科目管理** | 勘定科目マスタ・勘定科目構成マスタの管理 |
|
|
107
|
-
| **仕訳処理** | 仕訳入力・自動仕訳・仕訳照会 |
|
|
108
|
-
| **残高管理** | 日次残高・月次残高の管理 |
|
|
109
|
-
| **帳票出力** | 日計表・合計残高試算表・財務諸表の出力 |
|
|
110
|
-
| **決算処理** | 月次決算・年次決算 |
|
|
111
|
-
|
|
112
|
-
### ユースケース図
|
|
113
|
-
|
|
114
|
-
財務会計システム全体のユースケースは以下の通りです。
|
|
115
|
-
|
|
116
|
-
```plantuml
|
|
117
|
-
@startuml
|
|
118
|
-
left to right direction
|
|
119
|
-
skinparam packageStyle rectangle
|
|
120
|
-
skinparam linetype ortho
|
|
121
|
-
title 財務会計システム ユースケース図
|
|
122
|
-
|
|
123
|
-
actor 経理担当者 as accounting
|
|
124
|
-
actor 財務担当者 as finance
|
|
125
|
-
actor 営業担当者 as sales
|
|
126
|
-
actor 購買担当者 as buyer
|
|
127
|
-
actor 管理者 as admin
|
|
128
|
-
|
|
129
|
-
rectangle 財務会計システム {
|
|
130
|
-
usecase "勘定科目管理" as UC_ACCOUNT
|
|
131
|
-
usecase "仕訳入力" as UC_JOURNAL
|
|
132
|
-
usecase "自動仕訳" as UC_AUTO_JOURNAL
|
|
133
|
-
usecase "残高照会" as UC_BALANCE
|
|
134
|
-
usecase "日計表出力" as UC_DAILY
|
|
135
|
-
usecase "試算表出力" as UC_TRIAL
|
|
136
|
-
usecase "財務諸表出力" as UC_FINANCIAL
|
|
137
|
-
usecase "決算処理" as UC_CLOSING
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
admin -- UC_ACCOUNT
|
|
141
|
-
accounting -- UC_JOURNAL
|
|
142
|
-
accounting -- UC_BALANCE
|
|
143
|
-
accounting -- UC_DAILY
|
|
144
|
-
accounting -- UC_TRIAL
|
|
145
|
-
accounting -- UC_CLOSING
|
|
146
|
-
finance -- UC_FINANCIAL
|
|
147
|
-
sales -- UC_AUTO_JOURNAL
|
|
148
|
-
buyer -- UC_AUTO_JOURNAL
|
|
149
|
-
@enduml
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## 14.2 ORM アーキテクチャの概要
|
|
155
|
-
|
|
156
|
-
### MyBatis 版と JPA 版の比較
|
|
157
|
-
|
|
158
|
-
本章では、MyBatis 版と同じビジネスロジックを Spring Data JPA で実装します。ORM の違いによるアプローチの差異を理解することが目的です。
|
|
159
|
-
|
|
160
|
-
| 観点 | MyBatis 版 | JPA 版 |
|
|
161
|
-
|------|-----------|--------|
|
|
162
|
-
| マッピング方法 | XML Mapper + resultMap | @Entity + @Column |
|
|
163
|
-
| ENUM 変換 | TypeHandler | AttributeConverter |
|
|
164
|
-
| Repository | Mapper インターフェース + XML | JpaRepository インターフェース |
|
|
165
|
-
| SQL | XML で明示的に記述 | メソッド名規約で自動生成 |
|
|
166
|
-
| テスト基底クラス | @MybatisTest | @DataJpaTest |
|
|
167
|
-
| N+1 問題対策 | 明示的な JOIN | @EntityGraph, JPQL JOIN FETCH |
|
|
168
|
-
|
|
169
|
-
### JPA の特徴
|
|
170
|
-
|
|
171
|
-
```plantuml
|
|
172
|
-
@startuml
|
|
173
|
-
title JPA / Hibernate の特徴
|
|
174
|
-
|
|
175
|
-
package "JPA (Java Persistence API)" {
|
|
176
|
-
rectangle entity [
|
|
177
|
-
<b>Entity</b>
|
|
178
|
-
--
|
|
179
|
-
- @Entity
|
|
180
|
-
- @Table
|
|
181
|
-
- @Column
|
|
182
|
-
- @Id
|
|
183
|
-
]
|
|
184
|
-
|
|
185
|
-
rectangle relations [
|
|
186
|
-
<b>Relationships</b>
|
|
187
|
-
--
|
|
188
|
-
- @OneToMany
|
|
189
|
-
- @ManyToOne
|
|
190
|
-
- @ManyToMany
|
|
191
|
-
- @Embedded
|
|
192
|
-
]
|
|
193
|
-
|
|
194
|
-
rectangle query [
|
|
195
|
-
<b>Query</b>
|
|
196
|
-
--
|
|
197
|
-
- JPQL
|
|
198
|
-
- Criteria API
|
|
199
|
-
- Native Query
|
|
200
|
-
- メソッド名規約
|
|
201
|
-
]
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
package "Spring Data JPA" {
|
|
205
|
-
rectangle repo [
|
|
206
|
-
<b>Repository</b>
|
|
207
|
-
--
|
|
208
|
-
- JpaRepository
|
|
209
|
-
- @Query
|
|
210
|
-
- Specification
|
|
211
|
-
- @EntityGraph
|
|
212
|
-
]
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
' 関係線の定義
|
|
216
|
-
entity --> relations
|
|
217
|
-
entity --> query
|
|
218
|
-
query --> repo
|
|
219
|
-
|
|
220
|
-
note right of entity
|
|
221
|
-
オブジェクト指向の
|
|
222
|
-
マッピング定義
|
|
223
|
-
end note
|
|
224
|
-
|
|
225
|
-
note right of repo
|
|
226
|
-
Repository パターンの
|
|
227
|
-
自動実装
|
|
228
|
-
end note
|
|
229
|
-
@enduml
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## 14.3 プロジェクト構成
|
|
235
|
-
|
|
236
|
-
### ヘキサゴナルアーキテクチャ
|
|
237
|
-
|
|
238
|
-
財務会計システムは、ヘキサゴナルアーキテクチャ(ポート&アダプターパターン)を採用します。
|
|
239
|
-
|
|
240
|
-
```
|
|
241
|
-
src/main/java/com/example/accounting/
|
|
242
|
-
├── application/ # アプリケーション層
|
|
243
|
-
│ └── port/
|
|
244
|
-
│ └── out/ # Output Port(リポジトリインターフェース)
|
|
245
|
-
│ └── AccountRepository.java
|
|
246
|
-
├── domain/ # ドメイン層(純粋なビジネスロジック)
|
|
247
|
-
│ └── model/ # ドメインモデル
|
|
248
|
-
│ └── account/
|
|
249
|
-
│ ├── Account.java # @Entity アノテーション付き
|
|
250
|
-
│ ├── BsPlType.java
|
|
251
|
-
│ ├── DebitCreditType.java
|
|
252
|
-
│ ├── TransactionElementType.java
|
|
253
|
-
│ ├── AggregationType.java
|
|
254
|
-
│ └── TaxCalculationType.java
|
|
255
|
-
├── infrastructure/ # インフラストラクチャ層
|
|
256
|
-
│ └── persistence/
|
|
257
|
-
│ ├── converter/ # JPA AttributeConverter
|
|
258
|
-
│ │ ├── BsPlTypeConverter.java
|
|
259
|
-
│ │ ├── DebitCreditTypeConverter.java
|
|
260
|
-
│ │ ├── TransactionElementTypeConverter.java
|
|
261
|
-
│ │ ├── AggregationTypeConverter.java
|
|
262
|
-
│ │ └── TaxCalculationTypeConverter.java
|
|
263
|
-
│ └── repository/ # Repository実装
|
|
264
|
-
│ ├── AccountJpaRepository.java # Spring Data JPA
|
|
265
|
-
│ └── AccountRepositoryImpl.java
|
|
266
|
-
└── config/
|
|
267
|
-
└── JpaConfig.java
|
|
268
|
-
|
|
269
|
-
src/main/resources/
|
|
270
|
-
├── db/migration/
|
|
271
|
-
│ └── V001__create_enum_types.sql
|
|
272
|
-
└── application.yml
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
### アーキテクチャ図
|
|
276
|
-
|
|
277
|
-
```plantuml
|
|
278
|
-
@startuml hexagonal_architecture_jpa
|
|
279
|
-
!define RECTANGLE class
|
|
280
|
-
|
|
281
|
-
package "Hexagonal Architecture (財務会計API - JPA版)" {
|
|
282
|
-
|
|
283
|
-
RECTANGLE "Application Core\n(Domain + Use Cases)" as core {
|
|
284
|
-
- Account (勘定科目)
|
|
285
|
-
- Journal (仕訳)
|
|
286
|
-
- JournalEntry (仕訳明細)
|
|
287
|
-
- DailyBalance (日次残高)
|
|
288
|
-
- MonthlyBalance (月次残高)
|
|
289
|
-
- AccountUseCase
|
|
290
|
-
- JournalUseCase
|
|
291
|
-
- BalanceUseCase
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
RECTANGLE "Input Adapters\n(Driving Side)" as input {
|
|
295
|
-
- Spring Controllers
|
|
296
|
-
- REST API Endpoints
|
|
297
|
-
- Request Validation
|
|
298
|
-
- Error Handling
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
RECTANGLE "Output Adapters\n(Driven Side)" as output {
|
|
302
|
-
- Spring Data JPA Repository
|
|
303
|
-
- AttributeConverter
|
|
304
|
-
- Entity Mapping
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
input --> core : "Input Ports\n(Use Cases)"
|
|
309
|
-
core --> output : "Output Ports\n(Repository Interfaces)"
|
|
310
|
-
|
|
311
|
-
note top of core
|
|
312
|
-
純粋なビジネスロジック
|
|
313
|
-
JPA アノテーションは
|
|
314
|
-
ドメイン層に配置
|
|
315
|
-
end note
|
|
316
|
-
|
|
317
|
-
note left of input
|
|
318
|
-
外部からアプリケーションを
|
|
319
|
-
駆動するアダプター
|
|
320
|
-
HTTP, REST等
|
|
321
|
-
end note
|
|
322
|
-
|
|
323
|
-
note right of output
|
|
324
|
-
アプリケーションが外部の
|
|
325
|
-
技術を使うためのアダプター
|
|
326
|
-
PostgreSQL, Hibernate等
|
|
327
|
-
end note
|
|
328
|
-
@enduml
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
---
|
|
332
|
-
|
|
333
|
-
## 14.4 環境構築
|
|
334
|
-
|
|
335
|
-
### 前提条件
|
|
336
|
-
|
|
337
|
-
以下のツールがインストールされていることを確認してください。
|
|
338
|
-
|
|
339
|
-
- Java 17以上(推奨:Java 21 LTS)
|
|
340
|
-
- Gradle 8.x以上(推奨:Gradle Wrapper使用)
|
|
341
|
-
- Docker & Docker Compose(推奨)
|
|
342
|
-
- Git
|
|
343
|
-
|
|
344
|
-
### build.gradle の設定
|
|
345
|
-
|
|
346
|
-
<details>
|
|
347
|
-
<summary>build.gradle</summary>
|
|
348
|
-
|
|
349
|
-
```groovy
|
|
350
|
-
plugins {
|
|
351
|
-
id 'java'
|
|
352
|
-
id 'application'
|
|
353
|
-
id 'jacoco'
|
|
354
|
-
id 'org.springframework.boot' version '3.2.0'
|
|
355
|
-
id 'io.spring.dependency-management' version '1.1.4'
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
group = 'com.example.accounting'
|
|
359
|
-
version = '0.0.1-SNAPSHOT'
|
|
360
|
-
|
|
361
|
-
java {
|
|
362
|
-
sourceCompatibility = '21'
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
repositories {
|
|
366
|
-
mavenCentral()
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
dependencies {
|
|
370
|
-
// Spring Boot
|
|
371
|
-
implementation 'org.springframework.boot:spring-boot-starter-web'
|
|
372
|
-
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
|
373
|
-
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
|
374
|
-
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
|
375
|
-
|
|
376
|
-
// Flyway
|
|
377
|
-
implementation 'org.flywaydb:flyway-core'
|
|
378
|
-
implementation 'org.flywaydb:flyway-database-postgresql'
|
|
379
|
-
|
|
380
|
-
// Database
|
|
381
|
-
runtimeOnly 'org.postgresql:postgresql'
|
|
382
|
-
|
|
383
|
-
// Lombok (オプション)
|
|
384
|
-
compileOnly 'org.projectlombok:lombok'
|
|
385
|
-
annotationProcessor 'org.projectlombok:lombok'
|
|
386
|
-
|
|
387
|
-
// Test
|
|
388
|
-
testImplementation 'org.junit.jupiter:junit-jupiter-api'
|
|
389
|
-
testImplementation 'org.junit.jupiter:junit-jupiter-params'
|
|
390
|
-
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
|
|
391
|
-
testImplementation 'org.assertj:assertj-core:3.24.2'
|
|
392
|
-
testImplementation 'org.testcontainers:testcontainers:1.19.3'
|
|
393
|
-
testImplementation 'org.testcontainers:postgresql:1.19.3'
|
|
394
|
-
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
test {
|
|
398
|
-
useJUnitPlatform()
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
jacoco {
|
|
402
|
-
toolVersion = "0.8.11"
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
jacocoTestReport {
|
|
406
|
-
dependsOn test
|
|
407
|
-
reports {
|
|
408
|
-
xml.required = true
|
|
409
|
-
html.required = true
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
</details>
|
|
415
|
-
|
|
416
|
-
### Docker Compose のセットアップ
|
|
417
|
-
|
|
418
|
-
<details>
|
|
419
|
-
<summary>docker-compose.yml</summary>
|
|
420
|
-
|
|
421
|
-
```yaml
|
|
422
|
-
services:
|
|
423
|
-
postgres:
|
|
424
|
-
image: postgres:16-alpine
|
|
425
|
-
container_name: financial-accounting-postgres-jpa
|
|
426
|
-
restart: unless-stopped
|
|
427
|
-
environment:
|
|
428
|
-
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
429
|
-
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
430
|
-
POSTGRES_DB: ${POSTGRES_DB:-financial_accounting}
|
|
431
|
-
TZ: 'Asia/Tokyo'
|
|
432
|
-
ports:
|
|
433
|
-
- "${POSTGRES_PORT:-5432}:5432"
|
|
434
|
-
volumes:
|
|
435
|
-
- postgres_data:/var/lib/postgresql/data
|
|
436
|
-
healthcheck:
|
|
437
|
-
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
|
|
438
|
-
interval: 10s
|
|
439
|
-
timeout: 5s
|
|
440
|
-
retries: 5
|
|
441
|
-
|
|
442
|
-
volumes:
|
|
443
|
-
postgres_data:
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
</details>
|
|
447
|
-
|
|
448
|
-
### application.yml の設定
|
|
449
|
-
|
|
450
|
-
<details>
|
|
451
|
-
<summary>application.yml</summary>
|
|
452
|
-
|
|
453
|
-
```yaml
|
|
454
|
-
spring:
|
|
455
|
-
application:
|
|
456
|
-
name: financial-accounting-jpa
|
|
457
|
-
|
|
458
|
-
datasource:
|
|
459
|
-
url: jdbc:postgresql://localhost:5432/financial_accounting
|
|
460
|
-
username: postgres
|
|
461
|
-
password: postgres
|
|
462
|
-
driver-class-name: org.postgresql.Driver
|
|
463
|
-
|
|
464
|
-
jpa:
|
|
465
|
-
hibernate:
|
|
466
|
-
ddl-auto: validate # Flyway でスキーマ管理するため validate
|
|
467
|
-
show-sql: true
|
|
468
|
-
properties:
|
|
469
|
-
hibernate:
|
|
470
|
-
format_sql: true
|
|
471
|
-
dialect: org.hibernate.dialect.PostgreSQLDialect
|
|
472
|
-
|
|
473
|
-
flyway:
|
|
474
|
-
enabled: true
|
|
475
|
-
locations: classpath:db/migration
|
|
476
|
-
|
|
477
|
-
logging:
|
|
478
|
-
level:
|
|
479
|
-
org.hibernate.SQL: DEBUG
|
|
480
|
-
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
</details>
|
|
484
|
-
|
|
485
|
-
### PostgreSQL ENUM の定義
|
|
486
|
-
|
|
487
|
-
<details>
|
|
488
|
-
<summary>V001__create_enum_types.sql</summary>
|
|
489
|
-
|
|
490
|
-
```sql
|
|
491
|
-
-- BSPL区分(貸借対照表・損益計算書)
|
|
492
|
-
CREATE TYPE BSPL区分 AS ENUM ('BS', 'PL');
|
|
493
|
-
|
|
494
|
-
-- 貸借区分
|
|
495
|
-
CREATE TYPE 貸借区分 AS ENUM ('借方', '貸方');
|
|
496
|
-
|
|
497
|
-
-- 取引要素区分
|
|
498
|
-
CREATE TYPE 取引要素区分 AS ENUM ('資産', '負債', '資本', '収益', '費用');
|
|
499
|
-
|
|
500
|
-
-- 集計区分
|
|
501
|
-
CREATE TYPE 集計区分 AS ENUM ('見出科目', '集計科目', '計上科目');
|
|
502
|
-
|
|
503
|
-
-- 消費税計算区分
|
|
504
|
-
CREATE TYPE 消費税計算区分 AS ENUM ('課税', '非課税', '不課税', '免税');
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
</details>
|
|
508
|
-
|
|
509
|
-
---
|
|
510
|
-
|
|
511
|
-
## 14.5 JPA エンティティの基本
|
|
512
|
-
|
|
513
|
-
### 日本語テーブル名・カラム名のマッピング
|
|
514
|
-
|
|
515
|
-
本シリーズでは、**日本語テーブル名・日本語カラム名**を使用します。JPA では、`@Table` と `@Column` アノテーションを使ってマッピングします。
|
|
516
|
-
|
|
517
|
-
| 項目 | 例 |
|
|
518
|
-
|-----|-----|
|
|
519
|
-
| テーブル名 | `勘定科目マスタ`, `仕訳データ`, `日次勘定科目残高` |
|
|
520
|
-
| カラム名 | `勘定科目コード`, `勘定科目名`, `BSPL区分` |
|
|
521
|
-
| ENUM名 | `BSPL区分`, `貸借区分`, `集計区分` |
|
|
522
|
-
| ENUM値 | `BS`, `PL`, `借方`, `貸方` |
|
|
523
|
-
|
|
524
|
-
### エンティティクラスの例
|
|
525
|
-
|
|
526
|
-
<details>
|
|
527
|
-
<summary>Account.java(勘定科目エンティティ)</summary>
|
|
528
|
-
|
|
529
|
-
```java
|
|
530
|
-
package com.example.accounting.domain.model.account;
|
|
531
|
-
|
|
532
|
-
import jakarta.persistence.*;
|
|
533
|
-
import lombok.*;
|
|
534
|
-
import java.time.LocalDateTime;
|
|
535
|
-
|
|
536
|
-
@Entity
|
|
537
|
-
@Table(name = "勘定科目マスタ")
|
|
538
|
-
@Data
|
|
539
|
-
@Builder
|
|
540
|
-
@NoArgsConstructor
|
|
541
|
-
@AllArgsConstructor
|
|
542
|
-
public class Account {
|
|
543
|
-
|
|
544
|
-
@Id
|
|
545
|
-
@Column(name = "勘定科目コード", length = 5)
|
|
546
|
-
private String accountCode;
|
|
547
|
-
|
|
548
|
-
@Column(name = "勘定科目名", length = 40, nullable = false)
|
|
549
|
-
private String accountName;
|
|
550
|
-
|
|
551
|
-
@Column(name = "勘定科目略名", length = 10)
|
|
552
|
-
private String accountShortName;
|
|
553
|
-
|
|
554
|
-
@Column(name = "勘定科目カナ", length = 40)
|
|
555
|
-
private String accountNameKana;
|
|
556
|
-
|
|
557
|
-
@Convert(converter = BsPlTypeConverter.class)
|
|
558
|
-
@Column(name = "BSPL区分", nullable = false, columnDefinition = "BSPL区分")
|
|
559
|
-
private BsPlType bsPlType;
|
|
560
|
-
|
|
561
|
-
@Convert(converter = DebitCreditTypeConverter.class)
|
|
562
|
-
@Column(name = "貸借区分", nullable = false, columnDefinition = "貸借区分")
|
|
563
|
-
private DebitCreditType debitCreditType;
|
|
564
|
-
|
|
565
|
-
@Convert(converter = TransactionElementTypeConverter.class)
|
|
566
|
-
@Column(name = "取引要素区分", nullable = false, columnDefinition = "取引要素区分")
|
|
567
|
-
private TransactionElementType transactionElementType;
|
|
568
|
-
|
|
569
|
-
@Convert(converter = AggregationTypeConverter.class)
|
|
570
|
-
@Column(name = "集計区分", nullable = false, columnDefinition = "集計区分")
|
|
571
|
-
private AggregationType aggregationType;
|
|
572
|
-
|
|
573
|
-
@Column(name = "管理会計区分", length = 1)
|
|
574
|
-
private String managementAccountingType;
|
|
575
|
-
|
|
576
|
-
@Column(name = "費用区分", length = 1)
|
|
577
|
-
private String expenseType;
|
|
578
|
-
|
|
579
|
-
@Column(name = "元帳出力区分", length = 1)
|
|
580
|
-
private String ledgerOutputType;
|
|
581
|
-
|
|
582
|
-
@Column(name = "補助科目種別", length = 1)
|
|
583
|
-
private String subAccountType;
|
|
584
|
-
|
|
585
|
-
@Convert(converter = TaxCalculationTypeConverter.class)
|
|
586
|
-
@Column(name = "消費税計算区分", columnDefinition = "消費税計算区分")
|
|
587
|
-
private TaxCalculationType taxCalculationType;
|
|
588
|
-
|
|
589
|
-
@Column(name = "課税取引コード", length = 2)
|
|
590
|
-
private String taxTransactionCode;
|
|
591
|
-
|
|
592
|
-
@Column(name = "期日管理区分", length = 1)
|
|
593
|
-
private String dueDateManagementType;
|
|
594
|
-
|
|
595
|
-
@Column(name = "作成日時")
|
|
596
|
-
private LocalDateTime createdAt;
|
|
597
|
-
|
|
598
|
-
@Column(name = "更新日時")
|
|
599
|
-
private LocalDateTime updatedAt;
|
|
600
|
-
|
|
601
|
-
@Column(name = "更新者名", length = 12)
|
|
602
|
-
private String updatedBy;
|
|
603
|
-
|
|
604
|
-
@PrePersist
|
|
605
|
-
protected void onCreate() {
|
|
606
|
-
createdAt = LocalDateTime.now();
|
|
607
|
-
updatedAt = LocalDateTime.now();
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
@PreUpdate
|
|
611
|
-
protected void onUpdate() {
|
|
612
|
-
updatedAt = LocalDateTime.now();
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
</details>
|
|
618
|
-
|
|
619
|
-
### ENUM 定義
|
|
620
|
-
|
|
621
|
-
<details>
|
|
622
|
-
<summary>BsPlType.java(BSPL区分)</summary>
|
|
623
|
-
|
|
624
|
-
```java
|
|
625
|
-
package com.example.accounting.domain.model.account;
|
|
626
|
-
|
|
627
|
-
import lombok.Getter;
|
|
628
|
-
import lombok.RequiredArgsConstructor;
|
|
629
|
-
|
|
630
|
-
@Getter
|
|
631
|
-
@RequiredArgsConstructor
|
|
632
|
-
public enum BsPlType {
|
|
633
|
-
BS("BS"), // 貸借対照表
|
|
634
|
-
PL("PL"); // 損益計算書
|
|
635
|
-
|
|
636
|
-
private final String displayName;
|
|
637
|
-
|
|
638
|
-
public static BsPlType fromDisplayName(String displayName) {
|
|
639
|
-
for (BsPlType type : values()) {
|
|
640
|
-
if (type.displayName.equals(displayName)) {
|
|
641
|
-
return type;
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
throw new IllegalArgumentException("不正なBSPL区分: " + displayName);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
```
|
|
648
|
-
|
|
649
|
-
</details>
|
|
650
|
-
|
|
651
|
-
<details>
|
|
652
|
-
<summary>DebitCreditType.java(貸借区分)</summary>
|
|
653
|
-
|
|
654
|
-
```java
|
|
655
|
-
package com.example.accounting.domain.model.account;
|
|
656
|
-
|
|
657
|
-
import lombok.Getter;
|
|
658
|
-
import lombok.RequiredArgsConstructor;
|
|
659
|
-
|
|
660
|
-
@Getter
|
|
661
|
-
@RequiredArgsConstructor
|
|
662
|
-
public enum DebitCreditType {
|
|
663
|
-
DEBIT("借方"),
|
|
664
|
-
CREDIT("貸方");
|
|
665
|
-
|
|
666
|
-
private final String displayName;
|
|
667
|
-
|
|
668
|
-
public static DebitCreditType fromDisplayName(String displayName) {
|
|
669
|
-
for (DebitCreditType type : values()) {
|
|
670
|
-
if (type.displayName.equals(displayName)) {
|
|
671
|
-
return type;
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
throw new IllegalArgumentException("不正な貸借区分: " + displayName);
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
</details>
|
|
680
|
-
|
|
681
|
-
### AttributeConverter
|
|
682
|
-
|
|
683
|
-
JPA では `AttributeConverter` を使って PostgreSQL ENUM と Java Enum を変換します。
|
|
684
|
-
|
|
685
|
-
<details>
|
|
686
|
-
<summary>BsPlTypeConverter.java</summary>
|
|
687
|
-
|
|
688
|
-
```java
|
|
689
|
-
package com.example.accounting.infrastructure.persistence.converter;
|
|
690
|
-
|
|
691
|
-
import com.example.accounting.domain.model.account.BsPlType;
|
|
692
|
-
import jakarta.persistence.AttributeConverter;
|
|
693
|
-
import jakarta.persistence.Converter;
|
|
694
|
-
|
|
695
|
-
@Converter(autoApply = true)
|
|
696
|
-
public class BsPlTypeConverter implements AttributeConverter<BsPlType, String> {
|
|
697
|
-
|
|
698
|
-
@Override
|
|
699
|
-
public String convertToDatabaseColumn(BsPlType attribute) {
|
|
700
|
-
return attribute != null ? attribute.getDisplayName() : null;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
@Override
|
|
704
|
-
public BsPlType convertToEntityAttribute(String dbData) {
|
|
705
|
-
return dbData != null ? BsPlType.fromDisplayName(dbData) : null;
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
```
|
|
709
|
-
|
|
710
|
-
</details>
|
|
711
|
-
|
|
712
|
-
---
|
|
713
|
-
|
|
714
|
-
## 14.6 Spring Data JPA Repository
|
|
715
|
-
|
|
716
|
-
### JpaRepository インターフェース
|
|
717
|
-
|
|
718
|
-
Spring Data JPA では、インターフェースを定義するだけで基本的な CRUD 操作が自動実装されます。
|
|
719
|
-
|
|
720
|
-
<details>
|
|
721
|
-
<summary>AccountJpaRepository.java</summary>
|
|
722
|
-
|
|
723
|
-
```java
|
|
724
|
-
package com.example.accounting.infrastructure.persistence.repository;
|
|
725
|
-
|
|
726
|
-
import com.example.accounting.domain.model.account.Account;
|
|
727
|
-
import com.example.accounting.domain.model.account.AggregationType;
|
|
728
|
-
import com.example.accounting.domain.model.account.BsPlType;
|
|
729
|
-
import org.springframework.data.jpa.repository.JpaRepository;
|
|
730
|
-
import org.springframework.stereotype.Repository;
|
|
731
|
-
|
|
732
|
-
import java.util.List;
|
|
733
|
-
|
|
734
|
-
@Repository
|
|
735
|
-
public interface AccountJpaRepository extends JpaRepository<Account, String> {
|
|
736
|
-
|
|
737
|
-
List<Account> findByBsPlType(BsPlType bsPlType);
|
|
738
|
-
|
|
739
|
-
List<Account> findByAggregationType(AggregationType aggregationType);
|
|
740
|
-
|
|
741
|
-
List<Account> findAllByOrderByAccountCodeAsc();
|
|
742
|
-
}
|
|
743
|
-
```
|
|
744
|
-
|
|
745
|
-
</details>
|
|
746
|
-
|
|
747
|
-
### Repository インターフェース(Output Port)
|
|
748
|
-
|
|
749
|
-
ヘキサゴナルアーキテクチャでは、アプリケーション層に Output Port を定義します。
|
|
750
|
-
|
|
751
|
-
<details>
|
|
752
|
-
<summary>AccountRepository.java</summary>
|
|
753
|
-
|
|
754
|
-
```java
|
|
755
|
-
package com.example.accounting.application.port.out;
|
|
756
|
-
|
|
757
|
-
import com.example.accounting.domain.model.account.Account;
|
|
758
|
-
import com.example.accounting.domain.model.account.AggregationType;
|
|
759
|
-
import com.example.accounting.domain.model.account.BsPlType;
|
|
760
|
-
|
|
761
|
-
import java.util.List;
|
|
762
|
-
import java.util.Optional;
|
|
763
|
-
|
|
764
|
-
/**
|
|
765
|
-
* 勘定科目リポジトリ(Output Port)
|
|
766
|
-
*/
|
|
767
|
-
public interface AccountRepository {
|
|
768
|
-
|
|
769
|
-
void save(Account account);
|
|
770
|
-
|
|
771
|
-
Optional<Account> findByCode(String accountCode);
|
|
772
|
-
|
|
773
|
-
List<Account> findAll();
|
|
774
|
-
|
|
775
|
-
List<Account> findByBsPlType(BsPlType bsPlType);
|
|
776
|
-
|
|
777
|
-
List<Account> findByAggregationType(AggregationType aggregationType);
|
|
778
|
-
|
|
779
|
-
void delete(String accountCode);
|
|
780
|
-
|
|
781
|
-
void deleteAll();
|
|
782
|
-
}
|
|
783
|
-
```
|
|
784
|
-
|
|
785
|
-
</details>
|
|
786
|
-
|
|
787
|
-
### Repository 実装(Infrastructure 層)
|
|
788
|
-
|
|
789
|
-
<details>
|
|
790
|
-
<summary>AccountRepositoryImpl.java</summary>
|
|
791
|
-
|
|
792
|
-
```java
|
|
793
|
-
package com.example.accounting.infrastructure.persistence.repository;
|
|
794
|
-
|
|
795
|
-
import com.example.accounting.application.port.out.AccountRepository;
|
|
796
|
-
import com.example.accounting.domain.model.account.Account;
|
|
797
|
-
import com.example.accounting.domain.model.account.AggregationType;
|
|
798
|
-
import com.example.accounting.domain.model.account.BsPlType;
|
|
799
|
-
import lombok.RequiredArgsConstructor;
|
|
800
|
-
import org.springframework.stereotype.Repository;
|
|
801
|
-
|
|
802
|
-
import java.util.List;
|
|
803
|
-
import java.util.Optional;
|
|
804
|
-
|
|
805
|
-
@Repository
|
|
806
|
-
@RequiredArgsConstructor
|
|
807
|
-
public class AccountRepositoryImpl implements AccountRepository {
|
|
808
|
-
|
|
809
|
-
private final AccountJpaRepository jpaRepository;
|
|
810
|
-
|
|
811
|
-
@Override
|
|
812
|
-
public void save(Account account) {
|
|
813
|
-
jpaRepository.save(account);
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
@Override
|
|
817
|
-
public Optional<Account> findByCode(String accountCode) {
|
|
818
|
-
return jpaRepository.findById(accountCode);
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
@Override
|
|
822
|
-
public List<Account> findAll() {
|
|
823
|
-
return jpaRepository.findAllByOrderByAccountCodeAsc();
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
@Override
|
|
827
|
-
public List<Account> findByBsPlType(BsPlType bsPlType) {
|
|
828
|
-
return jpaRepository.findByBsPlType(bsPlType);
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
@Override
|
|
832
|
-
public List<Account> findByAggregationType(AggregationType aggregationType) {
|
|
833
|
-
return jpaRepository.findByAggregationType(aggregationType);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
@Override
|
|
837
|
-
public void delete(String accountCode) {
|
|
838
|
-
jpaRepository.deleteById(accountCode);
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
@Override
|
|
842
|
-
public void deleteAll() {
|
|
843
|
-
jpaRepository.deleteAll();
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
```
|
|
847
|
-
|
|
848
|
-
</details>
|
|
849
|
-
|
|
850
|
-
---
|
|
851
|
-
|
|
852
|
-
## 14.7 TestContainers によるテスト
|
|
853
|
-
|
|
854
|
-
### テスト基盤クラス
|
|
855
|
-
|
|
856
|
-
<details>
|
|
857
|
-
<summary>BaseIntegrationTest.java</summary>
|
|
858
|
-
|
|
859
|
-
```java
|
|
860
|
-
package com.example.accounting.testsetup;
|
|
861
|
-
|
|
862
|
-
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
|
|
863
|
-
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
|
864
|
-
import org.springframework.test.context.DynamicPropertyRegistry;
|
|
865
|
-
import org.springframework.test.context.DynamicPropertySource;
|
|
866
|
-
import org.testcontainers.containers.PostgreSQLContainer;
|
|
867
|
-
import org.testcontainers.junit.jupiter.Container;
|
|
868
|
-
import org.testcontainers.junit.jupiter.Testcontainers;
|
|
869
|
-
|
|
870
|
-
@Testcontainers
|
|
871
|
-
@DataJpaTest
|
|
872
|
-
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
|
|
873
|
-
public abstract class BaseIntegrationTest {
|
|
874
|
-
|
|
875
|
-
@Container
|
|
876
|
-
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
|
|
877
|
-
.withDatabaseName("testdb")
|
|
878
|
-
.withUsername("testuser")
|
|
879
|
-
.withPassword("testpass");
|
|
880
|
-
|
|
881
|
-
@DynamicPropertySource
|
|
882
|
-
static void configureProperties(DynamicPropertyRegistry registry) {
|
|
883
|
-
registry.add("spring.datasource.url", postgres::getJdbcUrl);
|
|
884
|
-
registry.add("spring.datasource.username", postgres::getUsername);
|
|
885
|
-
registry.add("spring.datasource.password", postgres::getPassword);
|
|
886
|
-
registry.add("spring.flyway.enabled", () -> "true");
|
|
887
|
-
registry.add("spring.flyway.locations", () -> "classpath:db/migration");
|
|
888
|
-
registry.add("spring.jpa.hibernate.ddl-auto", () -> "validate");
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
```
|
|
892
|
-
|
|
893
|
-
</details>
|
|
894
|
-
|
|
895
|
-
### データベース接続テスト
|
|
896
|
-
|
|
897
|
-
<details>
|
|
898
|
-
<summary>DatabaseConnectionTest.java</summary>
|
|
899
|
-
|
|
900
|
-
```java
|
|
901
|
-
package com.example.accounting;
|
|
902
|
-
|
|
903
|
-
import com.example.accounting.testsetup.BaseIntegrationTest;
|
|
904
|
-
import org.junit.jupiter.api.DisplayName;
|
|
905
|
-
import org.junit.jupiter.api.Test;
|
|
906
|
-
import org.springframework.beans.factory.annotation.Autowired;
|
|
907
|
-
|
|
908
|
-
import javax.sql.DataSource;
|
|
909
|
-
import java.sql.Connection;
|
|
910
|
-
import java.sql.ResultSet;
|
|
911
|
-
import java.sql.Statement;
|
|
912
|
-
|
|
913
|
-
import static org.assertj.core.api.Assertions.assertThat;
|
|
914
|
-
|
|
915
|
-
@DisplayName("データベース接続")
|
|
916
|
-
class DatabaseConnectionTest extends BaseIntegrationTest {
|
|
917
|
-
|
|
918
|
-
@Autowired
|
|
919
|
-
private DataSource dataSource;
|
|
920
|
-
|
|
921
|
-
@Test
|
|
922
|
-
@DisplayName("PostgreSQLに接続できる")
|
|
923
|
-
void canConnectToPostgres() throws Exception {
|
|
924
|
-
try (Connection conn = dataSource.getConnection();
|
|
925
|
-
Statement stmt = conn.createStatement();
|
|
926
|
-
ResultSet rs = stmt.executeQuery("SELECT 1")) {
|
|
927
|
-
assertThat(rs.next()).isTrue();
|
|
928
|
-
assertThat(rs.getInt(1)).isEqualTo(1);
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
@Test
|
|
933
|
-
@DisplayName("BSPL区分ENUMが作成されている")
|
|
934
|
-
void bsplTypeEnumExists() throws Exception {
|
|
935
|
-
try (Connection conn = dataSource.getConnection();
|
|
936
|
-
Statement stmt = conn.createStatement();
|
|
937
|
-
ResultSet rs = stmt.executeQuery(
|
|
938
|
-
"SELECT unnest(enum_range(NULL::BSPL区分))::text")) {
|
|
939
|
-
assertThat(rs.next()).isTrue();
|
|
940
|
-
assertThat(rs.getString(1)).isEqualTo("BS");
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
```
|
|
945
|
-
|
|
946
|
-
</details>
|
|
947
|
-
|
|
948
|
-
---
|
|
949
|
-
|
|
950
|
-
## 14.8 命名規則のまとめ
|
|
951
|
-
|
|
952
|
-
| 要素 | 言語 | 例 |
|
|
953
|
-
|------|------|-----|
|
|
954
|
-
| **テーブル名** | 日本語 | `"勘定科目マスタ"`, `"仕訳データ"` |
|
|
955
|
-
| **カラム名** | 日本語 | `"勘定科目コード"`, `"勘定科目名"` |
|
|
956
|
-
| **ENUM 型** | 日本語 | `BSPL区分`, `貸借区分` |
|
|
957
|
-
| **ENUM 値** | 日本語 | `'BS'`, `'借方'` |
|
|
958
|
-
| **Java クラス名** | 英語 | `Account`, `BsPlType` |
|
|
959
|
-
| **Java フィールド名** | 英語 | `accountCode`, `accountName` |
|
|
960
|
-
| **Java メソッド名** | 英語 | `findByCode()`, `save()` |
|
|
961
|
-
| **JPA アノテーション** | 日本語カラム指定 | `@Column(name = "勘定科目コード")` |
|
|
962
|
-
|
|
963
|
-
---
|
|
964
|
-
|
|
965
|
-
## 本章のまとめ
|
|
966
|
-
|
|
967
|
-
本章では、財務会計システムの全体像と JPA による ORM 実装の基本を学びました。
|
|
968
|
-
|
|
969
|
-
### 学んだこと
|
|
970
|
-
|
|
971
|
-
| カテゴリ | 内容 |
|
|
972
|
-
|----------|------|
|
|
973
|
-
| スコープ | 勘定科目管理・仕訳処理・残高管理・帳票出力・決算処理 |
|
|
974
|
-
| アーキテクチャ | ヘキサゴナルアーキテクチャ(ポート&アダプター) |
|
|
975
|
-
| ORM | Spring Data JPA / Hibernate |
|
|
976
|
-
| マッピング | @Entity, @Table, @Column, @Convert |
|
|
977
|
-
| ENUM 変換 | AttributeConverter |
|
|
978
|
-
| テスト | TestContainers + @DataJpaTest |
|
|
979
|
-
|
|
980
|
-
### MyBatis 版との主な違い
|
|
981
|
-
|
|
982
|
-
| 項目 | MyBatis 版 | JPA 版 |
|
|
983
|
-
|------|-----------|--------|
|
|
984
|
-
| SQL 記述 | XML で明示的に記述 | 自動生成(メソッド名規約) |
|
|
985
|
-
| マッピング | resultMap | @Entity + @Column |
|
|
986
|
-
| ENUM 変換 | TypeHandler | AttributeConverter |
|
|
987
|
-
| 関連取得 | 明示的な JOIN | @EntityGraph, FETCH JOIN |
|
|
988
|
-
|
|
989
|
-
### 次章の予告
|
|
990
|
-
|
|
991
|
-
第15章では、財務会計システムの基盤となる勘定科目マスタの設計を JPA で実装します。@EmbeddedId を使った複合主キーや @ManyToOne によるリレーションも解説します。
|
|
1
|
+
# 第14章:財務会計システムの全体像(ORM版)
|
|
2
|
+
|
|
3
|
+
本章では、財務会計システムの全体像を把握し、Spring Data JPA を使用した ORM 実装のアーキテクチャについて解説します。MyBatis 版との違いを比較しながら、JPA の特徴を活かした設計手法を学びます。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 14.1 財務会計システムのスコープ
|
|
8
|
+
|
|
9
|
+
### 基幹業務システムにおける位置づけ
|
|
10
|
+
|
|
11
|
+
財務会計システムは、基幹業務システムの中で他のシステムから仕訳データを受け取り、企業の財務状態を管理する重要なシステムです。
|
|
12
|
+
|
|
13
|
+
```plantuml
|
|
14
|
+
@startuml
|
|
15
|
+
|
|
16
|
+
title 基幹業務システムの全体像
|
|
17
|
+
|
|
18
|
+
state "得意先\n(Customer)" as Customer
|
|
19
|
+
state "販売管理\n(Sales Management)" as SalesManagement
|
|
20
|
+
SalesManagement : ・受注 \n・出荷 \n・売上
|
|
21
|
+
|
|
22
|
+
state "購買管理\n(Procurement Management)" as ProcurementManagement
|
|
23
|
+
ProcurementManagement : ・発注\n・入荷/受入\n・仕入(検収)
|
|
24
|
+
|
|
25
|
+
state "在庫\n(Inventory)" as Inventory
|
|
26
|
+
|
|
27
|
+
state "仕入先\n(Supplier)" as Supplier
|
|
28
|
+
|
|
29
|
+
state "生産管理\n(Production Management)" as ProductionManagement
|
|
30
|
+
ProductionManagement : ・生産計画\n・品質管理\n・工程管理\n・製造原価管理
|
|
31
|
+
|
|
32
|
+
state "債権管理\n(Accounts Receivable)" as AccountsReceivable
|
|
33
|
+
AccountsReceivable : ・請求 \n・入金
|
|
34
|
+
|
|
35
|
+
state "債務管理\n(Accounts Payable)" as AccountsPayable
|
|
36
|
+
AccountsPayable : ・支払\n・出金
|
|
37
|
+
|
|
38
|
+
state "財務会計\n(Financial Accounting)" as Accounting #LightBlue
|
|
39
|
+
Accounting : ・勘定科目管理\n・仕訳処理\n・残高管理\n・財務諸表\n・決算処理
|
|
40
|
+
|
|
41
|
+
[*] -> Customer
|
|
42
|
+
|
|
43
|
+
Customer --> SalesManagement
|
|
44
|
+
SalesManagement --> AccountsReceivable
|
|
45
|
+
SalesManagement --> ProcurementManagement : 調達依頼
|
|
46
|
+
SalesManagement --> ProductionManagement : 需要予測 \n製造指示
|
|
47
|
+
SalesManagement --> Accounting : 仕訳
|
|
48
|
+
SalesManagement --> Customer
|
|
49
|
+
Inventory --> SalesManagement
|
|
50
|
+
|
|
51
|
+
ProcurementManagement --> Inventory
|
|
52
|
+
ProcurementManagement --> AccountsPayable
|
|
53
|
+
ProcurementManagement --> Supplier
|
|
54
|
+
Supplier --> ProcurementManagement
|
|
55
|
+
ProductionManagement --> ProcurementManagement : 調達依頼
|
|
56
|
+
|
|
57
|
+
ProductionManagement --> Inventory : 入荷
|
|
58
|
+
Inventory --> ProductionManagement : 払出
|
|
59
|
+
|
|
60
|
+
AccountsReceivable --> Accounting
|
|
61
|
+
AccountsPayable --> Accounting
|
|
62
|
+
ProductionManagement --> Accounting : 仕訳
|
|
63
|
+
ProcurementManagement --> Accounting : 仕訳
|
|
64
|
+
|
|
65
|
+
Customer -> [*]
|
|
66
|
+
|
|
67
|
+
@enduml
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 財務会計システムの業務領域
|
|
71
|
+
|
|
72
|
+
財務会計システムは、以下の業務領域をカバーします。
|
|
73
|
+
|
|
74
|
+
```plantuml
|
|
75
|
+
@startuml
|
|
76
|
+
|
|
77
|
+
[*] -> 販売管理
|
|
78
|
+
販売管理 --> 財務会計 : 売上仕訳
|
|
79
|
+
販売管理 : 売掛金 / 売上
|
|
80
|
+
|
|
81
|
+
[*] -> 購買管理
|
|
82
|
+
購買管理 --> 財務会計 : 仕入仕訳
|
|
83
|
+
購買管理 : 仕入 / 買掛金
|
|
84
|
+
|
|
85
|
+
[*] -> 債権管理
|
|
86
|
+
債権管理 --> 財務会計 : 入金仕訳
|
|
87
|
+
債権管理 : 現金預金 / 売掛金
|
|
88
|
+
|
|
89
|
+
[*] -> 債務管理
|
|
90
|
+
債務管理 --> 財務会計 : 支払仕訳
|
|
91
|
+
債務管理 : 買掛金 / 現金預金
|
|
92
|
+
|
|
93
|
+
財務会計 --> 帳票出力
|
|
94
|
+
財務会計 : 勘定科目管理 \n仕訳処理 \n残高管理
|
|
95
|
+
帳票出力 : 日計表 \n合計残高試算表 \n財務諸表
|
|
96
|
+
|
|
97
|
+
帳票出力 -> [*]
|
|
98
|
+
|
|
99
|
+
@enduml
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 業務機能の概要
|
|
103
|
+
|
|
104
|
+
| 業務 | 説明 |
|
|
105
|
+
|------|------|
|
|
106
|
+
| **勘定科目管理** | 勘定科目マスタ・勘定科目構成マスタの管理 |
|
|
107
|
+
| **仕訳処理** | 仕訳入力・自動仕訳・仕訳照会 |
|
|
108
|
+
| **残高管理** | 日次残高・月次残高の管理 |
|
|
109
|
+
| **帳票出力** | 日計表・合計残高試算表・財務諸表の出力 |
|
|
110
|
+
| **決算処理** | 月次決算・年次決算 |
|
|
111
|
+
|
|
112
|
+
### ユースケース図
|
|
113
|
+
|
|
114
|
+
財務会計システム全体のユースケースは以下の通りです。
|
|
115
|
+
|
|
116
|
+
```plantuml
|
|
117
|
+
@startuml
|
|
118
|
+
left to right direction
|
|
119
|
+
skinparam packageStyle rectangle
|
|
120
|
+
skinparam linetype ortho
|
|
121
|
+
title 財務会計システム ユースケース図
|
|
122
|
+
|
|
123
|
+
actor 経理担当者 as accounting
|
|
124
|
+
actor 財務担当者 as finance
|
|
125
|
+
actor 営業担当者 as sales
|
|
126
|
+
actor 購買担当者 as buyer
|
|
127
|
+
actor 管理者 as admin
|
|
128
|
+
|
|
129
|
+
rectangle 財務会計システム {
|
|
130
|
+
usecase "勘定科目管理" as UC_ACCOUNT
|
|
131
|
+
usecase "仕訳入力" as UC_JOURNAL
|
|
132
|
+
usecase "自動仕訳" as UC_AUTO_JOURNAL
|
|
133
|
+
usecase "残高照会" as UC_BALANCE
|
|
134
|
+
usecase "日計表出力" as UC_DAILY
|
|
135
|
+
usecase "試算表出力" as UC_TRIAL
|
|
136
|
+
usecase "財務諸表出力" as UC_FINANCIAL
|
|
137
|
+
usecase "決算処理" as UC_CLOSING
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
admin -- UC_ACCOUNT
|
|
141
|
+
accounting -- UC_JOURNAL
|
|
142
|
+
accounting -- UC_BALANCE
|
|
143
|
+
accounting -- UC_DAILY
|
|
144
|
+
accounting -- UC_TRIAL
|
|
145
|
+
accounting -- UC_CLOSING
|
|
146
|
+
finance -- UC_FINANCIAL
|
|
147
|
+
sales -- UC_AUTO_JOURNAL
|
|
148
|
+
buyer -- UC_AUTO_JOURNAL
|
|
149
|
+
@enduml
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 14.2 ORM アーキテクチャの概要
|
|
155
|
+
|
|
156
|
+
### MyBatis 版と JPA 版の比較
|
|
157
|
+
|
|
158
|
+
本章では、MyBatis 版と同じビジネスロジックを Spring Data JPA で実装します。ORM の違いによるアプローチの差異を理解することが目的です。
|
|
159
|
+
|
|
160
|
+
| 観点 | MyBatis 版 | JPA 版 |
|
|
161
|
+
|------|-----------|--------|
|
|
162
|
+
| マッピング方法 | XML Mapper + resultMap | @Entity + @Column |
|
|
163
|
+
| ENUM 変換 | TypeHandler | AttributeConverter |
|
|
164
|
+
| Repository | Mapper インターフェース + XML | JpaRepository インターフェース |
|
|
165
|
+
| SQL | XML で明示的に記述 | メソッド名規約で自動生成 |
|
|
166
|
+
| テスト基底クラス | @MybatisTest | @DataJpaTest |
|
|
167
|
+
| N+1 問題対策 | 明示的な JOIN | @EntityGraph, JPQL JOIN FETCH |
|
|
168
|
+
|
|
169
|
+
### JPA の特徴
|
|
170
|
+
|
|
171
|
+
```plantuml
|
|
172
|
+
@startuml
|
|
173
|
+
title JPA / Hibernate の特徴
|
|
174
|
+
|
|
175
|
+
package "JPA (Java Persistence API)" {
|
|
176
|
+
rectangle entity [
|
|
177
|
+
<b>Entity</b>
|
|
178
|
+
--
|
|
179
|
+
- @Entity
|
|
180
|
+
- @Table
|
|
181
|
+
- @Column
|
|
182
|
+
- @Id
|
|
183
|
+
]
|
|
184
|
+
|
|
185
|
+
rectangle relations [
|
|
186
|
+
<b>Relationships</b>
|
|
187
|
+
--
|
|
188
|
+
- @OneToMany
|
|
189
|
+
- @ManyToOne
|
|
190
|
+
- @ManyToMany
|
|
191
|
+
- @Embedded
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
rectangle query [
|
|
195
|
+
<b>Query</b>
|
|
196
|
+
--
|
|
197
|
+
- JPQL
|
|
198
|
+
- Criteria API
|
|
199
|
+
- Native Query
|
|
200
|
+
- メソッド名規約
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
package "Spring Data JPA" {
|
|
205
|
+
rectangle repo [
|
|
206
|
+
<b>Repository</b>
|
|
207
|
+
--
|
|
208
|
+
- JpaRepository
|
|
209
|
+
- @Query
|
|
210
|
+
- Specification
|
|
211
|
+
- @EntityGraph
|
|
212
|
+
]
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
' 関係線の定義
|
|
216
|
+
entity --> relations
|
|
217
|
+
entity --> query
|
|
218
|
+
query --> repo
|
|
219
|
+
|
|
220
|
+
note right of entity
|
|
221
|
+
オブジェクト指向の
|
|
222
|
+
マッピング定義
|
|
223
|
+
end note
|
|
224
|
+
|
|
225
|
+
note right of repo
|
|
226
|
+
Repository パターンの
|
|
227
|
+
自動実装
|
|
228
|
+
end note
|
|
229
|
+
@enduml
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 14.3 プロジェクト構成
|
|
235
|
+
|
|
236
|
+
### ヘキサゴナルアーキテクチャ
|
|
237
|
+
|
|
238
|
+
財務会計システムは、ヘキサゴナルアーキテクチャ(ポート&アダプターパターン)を採用します。
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
src/main/java/com/example/accounting/
|
|
242
|
+
├── application/ # アプリケーション層
|
|
243
|
+
│ └── port/
|
|
244
|
+
│ └── out/ # Output Port(リポジトリインターフェース)
|
|
245
|
+
│ └── AccountRepository.java
|
|
246
|
+
├── domain/ # ドメイン層(純粋なビジネスロジック)
|
|
247
|
+
│ └── model/ # ドメインモデル
|
|
248
|
+
│ └── account/
|
|
249
|
+
│ ├── Account.java # @Entity アノテーション付き
|
|
250
|
+
│ ├── BsPlType.java
|
|
251
|
+
│ ├── DebitCreditType.java
|
|
252
|
+
│ ├── TransactionElementType.java
|
|
253
|
+
│ ├── AggregationType.java
|
|
254
|
+
│ └── TaxCalculationType.java
|
|
255
|
+
├── infrastructure/ # インフラストラクチャ層
|
|
256
|
+
│ └── persistence/
|
|
257
|
+
│ ├── converter/ # JPA AttributeConverter
|
|
258
|
+
│ │ ├── BsPlTypeConverter.java
|
|
259
|
+
│ │ ├── DebitCreditTypeConverter.java
|
|
260
|
+
│ │ ├── TransactionElementTypeConverter.java
|
|
261
|
+
│ │ ├── AggregationTypeConverter.java
|
|
262
|
+
│ │ └── TaxCalculationTypeConverter.java
|
|
263
|
+
│ └── repository/ # Repository実装
|
|
264
|
+
│ ├── AccountJpaRepository.java # Spring Data JPA
|
|
265
|
+
│ └── AccountRepositoryImpl.java
|
|
266
|
+
└── config/
|
|
267
|
+
└── JpaConfig.java
|
|
268
|
+
|
|
269
|
+
src/main/resources/
|
|
270
|
+
├── db/migration/
|
|
271
|
+
│ └── V001__create_enum_types.sql
|
|
272
|
+
└── application.yml
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### アーキテクチャ図
|
|
276
|
+
|
|
277
|
+
```plantuml
|
|
278
|
+
@startuml hexagonal_architecture_jpa
|
|
279
|
+
!define RECTANGLE class
|
|
280
|
+
|
|
281
|
+
package "Hexagonal Architecture (財務会計API - JPA版)" {
|
|
282
|
+
|
|
283
|
+
RECTANGLE "Application Core\n(Domain + Use Cases)" as core {
|
|
284
|
+
- Account (勘定科目)
|
|
285
|
+
- Journal (仕訳)
|
|
286
|
+
- JournalEntry (仕訳明細)
|
|
287
|
+
- DailyBalance (日次残高)
|
|
288
|
+
- MonthlyBalance (月次残高)
|
|
289
|
+
- AccountUseCase
|
|
290
|
+
- JournalUseCase
|
|
291
|
+
- BalanceUseCase
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
RECTANGLE "Input Adapters\n(Driving Side)" as input {
|
|
295
|
+
- Spring Controllers
|
|
296
|
+
- REST API Endpoints
|
|
297
|
+
- Request Validation
|
|
298
|
+
- Error Handling
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
RECTANGLE "Output Adapters\n(Driven Side)" as output {
|
|
302
|
+
- Spring Data JPA Repository
|
|
303
|
+
- AttributeConverter
|
|
304
|
+
- Entity Mapping
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
input --> core : "Input Ports\n(Use Cases)"
|
|
309
|
+
core --> output : "Output Ports\n(Repository Interfaces)"
|
|
310
|
+
|
|
311
|
+
note top of core
|
|
312
|
+
純粋なビジネスロジック
|
|
313
|
+
JPA アノテーションは
|
|
314
|
+
ドメイン層に配置
|
|
315
|
+
end note
|
|
316
|
+
|
|
317
|
+
note left of input
|
|
318
|
+
外部からアプリケーションを
|
|
319
|
+
駆動するアダプター
|
|
320
|
+
HTTP, REST等
|
|
321
|
+
end note
|
|
322
|
+
|
|
323
|
+
note right of output
|
|
324
|
+
アプリケーションが外部の
|
|
325
|
+
技術を使うためのアダプター
|
|
326
|
+
PostgreSQL, Hibernate等
|
|
327
|
+
end note
|
|
328
|
+
@enduml
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 14.4 環境構築
|
|
334
|
+
|
|
335
|
+
### 前提条件
|
|
336
|
+
|
|
337
|
+
以下のツールがインストールされていることを確認してください。
|
|
338
|
+
|
|
339
|
+
- Java 17以上(推奨:Java 21 LTS)
|
|
340
|
+
- Gradle 8.x以上(推奨:Gradle Wrapper使用)
|
|
341
|
+
- Docker & Docker Compose(推奨)
|
|
342
|
+
- Git
|
|
343
|
+
|
|
344
|
+
### build.gradle の設定
|
|
345
|
+
|
|
346
|
+
<details>
|
|
347
|
+
<summary>build.gradle</summary>
|
|
348
|
+
|
|
349
|
+
```groovy
|
|
350
|
+
plugins {
|
|
351
|
+
id 'java'
|
|
352
|
+
id 'application'
|
|
353
|
+
id 'jacoco'
|
|
354
|
+
id 'org.springframework.boot' version '3.2.0'
|
|
355
|
+
id 'io.spring.dependency-management' version '1.1.4'
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
group = 'com.example.accounting'
|
|
359
|
+
version = '0.0.1-SNAPSHOT'
|
|
360
|
+
|
|
361
|
+
java {
|
|
362
|
+
sourceCompatibility = '21'
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
repositories {
|
|
366
|
+
mavenCentral()
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
dependencies {
|
|
370
|
+
// Spring Boot
|
|
371
|
+
implementation 'org.springframework.boot:spring-boot-starter-web'
|
|
372
|
+
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
|
373
|
+
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
|
374
|
+
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
|
375
|
+
|
|
376
|
+
// Flyway
|
|
377
|
+
implementation 'org.flywaydb:flyway-core'
|
|
378
|
+
implementation 'org.flywaydb:flyway-database-postgresql'
|
|
379
|
+
|
|
380
|
+
// Database
|
|
381
|
+
runtimeOnly 'org.postgresql:postgresql'
|
|
382
|
+
|
|
383
|
+
// Lombok (オプション)
|
|
384
|
+
compileOnly 'org.projectlombok:lombok'
|
|
385
|
+
annotationProcessor 'org.projectlombok:lombok'
|
|
386
|
+
|
|
387
|
+
// Test
|
|
388
|
+
testImplementation 'org.junit.jupiter:junit-jupiter-api'
|
|
389
|
+
testImplementation 'org.junit.jupiter:junit-jupiter-params'
|
|
390
|
+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
|
|
391
|
+
testImplementation 'org.assertj:assertj-core:3.24.2'
|
|
392
|
+
testImplementation 'org.testcontainers:testcontainers:1.19.3'
|
|
393
|
+
testImplementation 'org.testcontainers:postgresql:1.19.3'
|
|
394
|
+
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
test {
|
|
398
|
+
useJUnitPlatform()
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
jacoco {
|
|
402
|
+
toolVersion = "0.8.11"
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
jacocoTestReport {
|
|
406
|
+
dependsOn test
|
|
407
|
+
reports {
|
|
408
|
+
xml.required = true
|
|
409
|
+
html.required = true
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
</details>
|
|
415
|
+
|
|
416
|
+
### Docker Compose のセットアップ
|
|
417
|
+
|
|
418
|
+
<details>
|
|
419
|
+
<summary>docker-compose.yml</summary>
|
|
420
|
+
|
|
421
|
+
```yaml
|
|
422
|
+
services:
|
|
423
|
+
postgres:
|
|
424
|
+
image: postgres:16-alpine
|
|
425
|
+
container_name: financial-accounting-postgres-jpa
|
|
426
|
+
restart: unless-stopped
|
|
427
|
+
environment:
|
|
428
|
+
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
429
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
430
|
+
POSTGRES_DB: ${POSTGRES_DB:-financial_accounting}
|
|
431
|
+
TZ: 'Asia/Tokyo'
|
|
432
|
+
ports:
|
|
433
|
+
- "${POSTGRES_PORT:-5432}:5432"
|
|
434
|
+
volumes:
|
|
435
|
+
- postgres_data:/var/lib/postgresql/data
|
|
436
|
+
healthcheck:
|
|
437
|
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
|
|
438
|
+
interval: 10s
|
|
439
|
+
timeout: 5s
|
|
440
|
+
retries: 5
|
|
441
|
+
|
|
442
|
+
volumes:
|
|
443
|
+
postgres_data:
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
</details>
|
|
447
|
+
|
|
448
|
+
### application.yml の設定
|
|
449
|
+
|
|
450
|
+
<details>
|
|
451
|
+
<summary>application.yml</summary>
|
|
452
|
+
|
|
453
|
+
```yaml
|
|
454
|
+
spring:
|
|
455
|
+
application:
|
|
456
|
+
name: financial-accounting-jpa
|
|
457
|
+
|
|
458
|
+
datasource:
|
|
459
|
+
url: jdbc:postgresql://localhost:5432/financial_accounting
|
|
460
|
+
username: postgres
|
|
461
|
+
password: postgres
|
|
462
|
+
driver-class-name: org.postgresql.Driver
|
|
463
|
+
|
|
464
|
+
jpa:
|
|
465
|
+
hibernate:
|
|
466
|
+
ddl-auto: validate # Flyway でスキーマ管理するため validate
|
|
467
|
+
show-sql: true
|
|
468
|
+
properties:
|
|
469
|
+
hibernate:
|
|
470
|
+
format_sql: true
|
|
471
|
+
dialect: org.hibernate.dialect.PostgreSQLDialect
|
|
472
|
+
|
|
473
|
+
flyway:
|
|
474
|
+
enabled: true
|
|
475
|
+
locations: classpath:db/migration
|
|
476
|
+
|
|
477
|
+
logging:
|
|
478
|
+
level:
|
|
479
|
+
org.hibernate.SQL: DEBUG
|
|
480
|
+
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
</details>
|
|
484
|
+
|
|
485
|
+
### PostgreSQL ENUM の定義
|
|
486
|
+
|
|
487
|
+
<details>
|
|
488
|
+
<summary>V001__create_enum_types.sql</summary>
|
|
489
|
+
|
|
490
|
+
```sql
|
|
491
|
+
-- BSPL区分(貸借対照表・損益計算書)
|
|
492
|
+
CREATE TYPE BSPL区分 AS ENUM ('BS', 'PL');
|
|
493
|
+
|
|
494
|
+
-- 貸借区分
|
|
495
|
+
CREATE TYPE 貸借区分 AS ENUM ('借方', '貸方');
|
|
496
|
+
|
|
497
|
+
-- 取引要素区分
|
|
498
|
+
CREATE TYPE 取引要素区分 AS ENUM ('資産', '負債', '資本', '収益', '費用');
|
|
499
|
+
|
|
500
|
+
-- 集計区分
|
|
501
|
+
CREATE TYPE 集計区分 AS ENUM ('見出科目', '集計科目', '計上科目');
|
|
502
|
+
|
|
503
|
+
-- 消費税計算区分
|
|
504
|
+
CREATE TYPE 消費税計算区分 AS ENUM ('課税', '非課税', '不課税', '免税');
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
</details>
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## 14.5 JPA エンティティの基本
|
|
512
|
+
|
|
513
|
+
### 日本語テーブル名・カラム名のマッピング
|
|
514
|
+
|
|
515
|
+
本シリーズでは、**日本語テーブル名・日本語カラム名**を使用します。JPA では、`@Table` と `@Column` アノテーションを使ってマッピングします。
|
|
516
|
+
|
|
517
|
+
| 項目 | 例 |
|
|
518
|
+
|-----|-----|
|
|
519
|
+
| テーブル名 | `勘定科目マスタ`, `仕訳データ`, `日次勘定科目残高` |
|
|
520
|
+
| カラム名 | `勘定科目コード`, `勘定科目名`, `BSPL区分` |
|
|
521
|
+
| ENUM名 | `BSPL区分`, `貸借区分`, `集計区分` |
|
|
522
|
+
| ENUM値 | `BS`, `PL`, `借方`, `貸方` |
|
|
523
|
+
|
|
524
|
+
### エンティティクラスの例
|
|
525
|
+
|
|
526
|
+
<details>
|
|
527
|
+
<summary>Account.java(勘定科目エンティティ)</summary>
|
|
528
|
+
|
|
529
|
+
```java
|
|
530
|
+
package com.example.accounting.domain.model.account;
|
|
531
|
+
|
|
532
|
+
import jakarta.persistence.*;
|
|
533
|
+
import lombok.*;
|
|
534
|
+
import java.time.LocalDateTime;
|
|
535
|
+
|
|
536
|
+
@Entity
|
|
537
|
+
@Table(name = "勘定科目マスタ")
|
|
538
|
+
@Data
|
|
539
|
+
@Builder
|
|
540
|
+
@NoArgsConstructor
|
|
541
|
+
@AllArgsConstructor
|
|
542
|
+
public class Account {
|
|
543
|
+
|
|
544
|
+
@Id
|
|
545
|
+
@Column(name = "勘定科目コード", length = 5)
|
|
546
|
+
private String accountCode;
|
|
547
|
+
|
|
548
|
+
@Column(name = "勘定科目名", length = 40, nullable = false)
|
|
549
|
+
private String accountName;
|
|
550
|
+
|
|
551
|
+
@Column(name = "勘定科目略名", length = 10)
|
|
552
|
+
private String accountShortName;
|
|
553
|
+
|
|
554
|
+
@Column(name = "勘定科目カナ", length = 40)
|
|
555
|
+
private String accountNameKana;
|
|
556
|
+
|
|
557
|
+
@Convert(converter = BsPlTypeConverter.class)
|
|
558
|
+
@Column(name = "BSPL区分", nullable = false, columnDefinition = "BSPL区分")
|
|
559
|
+
private BsPlType bsPlType;
|
|
560
|
+
|
|
561
|
+
@Convert(converter = DebitCreditTypeConverter.class)
|
|
562
|
+
@Column(name = "貸借区分", nullable = false, columnDefinition = "貸借区分")
|
|
563
|
+
private DebitCreditType debitCreditType;
|
|
564
|
+
|
|
565
|
+
@Convert(converter = TransactionElementTypeConverter.class)
|
|
566
|
+
@Column(name = "取引要素区分", nullable = false, columnDefinition = "取引要素区分")
|
|
567
|
+
private TransactionElementType transactionElementType;
|
|
568
|
+
|
|
569
|
+
@Convert(converter = AggregationTypeConverter.class)
|
|
570
|
+
@Column(name = "集計区分", nullable = false, columnDefinition = "集計区分")
|
|
571
|
+
private AggregationType aggregationType;
|
|
572
|
+
|
|
573
|
+
@Column(name = "管理会計区分", length = 1)
|
|
574
|
+
private String managementAccountingType;
|
|
575
|
+
|
|
576
|
+
@Column(name = "費用区分", length = 1)
|
|
577
|
+
private String expenseType;
|
|
578
|
+
|
|
579
|
+
@Column(name = "元帳出力区分", length = 1)
|
|
580
|
+
private String ledgerOutputType;
|
|
581
|
+
|
|
582
|
+
@Column(name = "補助科目種別", length = 1)
|
|
583
|
+
private String subAccountType;
|
|
584
|
+
|
|
585
|
+
@Convert(converter = TaxCalculationTypeConverter.class)
|
|
586
|
+
@Column(name = "消費税計算区分", columnDefinition = "消費税計算区分")
|
|
587
|
+
private TaxCalculationType taxCalculationType;
|
|
588
|
+
|
|
589
|
+
@Column(name = "課税取引コード", length = 2)
|
|
590
|
+
private String taxTransactionCode;
|
|
591
|
+
|
|
592
|
+
@Column(name = "期日管理区分", length = 1)
|
|
593
|
+
private String dueDateManagementType;
|
|
594
|
+
|
|
595
|
+
@Column(name = "作成日時")
|
|
596
|
+
private LocalDateTime createdAt;
|
|
597
|
+
|
|
598
|
+
@Column(name = "更新日時")
|
|
599
|
+
private LocalDateTime updatedAt;
|
|
600
|
+
|
|
601
|
+
@Column(name = "更新者名", length = 12)
|
|
602
|
+
private String updatedBy;
|
|
603
|
+
|
|
604
|
+
@PrePersist
|
|
605
|
+
protected void onCreate() {
|
|
606
|
+
createdAt = LocalDateTime.now();
|
|
607
|
+
updatedAt = LocalDateTime.now();
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
@PreUpdate
|
|
611
|
+
protected void onUpdate() {
|
|
612
|
+
updatedAt = LocalDateTime.now();
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
</details>
|
|
618
|
+
|
|
619
|
+
### ENUM 定義
|
|
620
|
+
|
|
621
|
+
<details>
|
|
622
|
+
<summary>BsPlType.java(BSPL区分)</summary>
|
|
623
|
+
|
|
624
|
+
```java
|
|
625
|
+
package com.example.accounting.domain.model.account;
|
|
626
|
+
|
|
627
|
+
import lombok.Getter;
|
|
628
|
+
import lombok.RequiredArgsConstructor;
|
|
629
|
+
|
|
630
|
+
@Getter
|
|
631
|
+
@RequiredArgsConstructor
|
|
632
|
+
public enum BsPlType {
|
|
633
|
+
BS("BS"), // 貸借対照表
|
|
634
|
+
PL("PL"); // 損益計算書
|
|
635
|
+
|
|
636
|
+
private final String displayName;
|
|
637
|
+
|
|
638
|
+
public static BsPlType fromDisplayName(String displayName) {
|
|
639
|
+
for (BsPlType type : values()) {
|
|
640
|
+
if (type.displayName.equals(displayName)) {
|
|
641
|
+
return type;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
throw new IllegalArgumentException("不正なBSPL区分: " + displayName);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
</details>
|
|
650
|
+
|
|
651
|
+
<details>
|
|
652
|
+
<summary>DebitCreditType.java(貸借区分)</summary>
|
|
653
|
+
|
|
654
|
+
```java
|
|
655
|
+
package com.example.accounting.domain.model.account;
|
|
656
|
+
|
|
657
|
+
import lombok.Getter;
|
|
658
|
+
import lombok.RequiredArgsConstructor;
|
|
659
|
+
|
|
660
|
+
@Getter
|
|
661
|
+
@RequiredArgsConstructor
|
|
662
|
+
public enum DebitCreditType {
|
|
663
|
+
DEBIT("借方"),
|
|
664
|
+
CREDIT("貸方");
|
|
665
|
+
|
|
666
|
+
private final String displayName;
|
|
667
|
+
|
|
668
|
+
public static DebitCreditType fromDisplayName(String displayName) {
|
|
669
|
+
for (DebitCreditType type : values()) {
|
|
670
|
+
if (type.displayName.equals(displayName)) {
|
|
671
|
+
return type;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
throw new IllegalArgumentException("不正な貸借区分: " + displayName);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
</details>
|
|
680
|
+
|
|
681
|
+
### AttributeConverter
|
|
682
|
+
|
|
683
|
+
JPA では `AttributeConverter` を使って PostgreSQL ENUM と Java Enum を変換します。
|
|
684
|
+
|
|
685
|
+
<details>
|
|
686
|
+
<summary>BsPlTypeConverter.java</summary>
|
|
687
|
+
|
|
688
|
+
```java
|
|
689
|
+
package com.example.accounting.infrastructure.persistence.converter;
|
|
690
|
+
|
|
691
|
+
import com.example.accounting.domain.model.account.BsPlType;
|
|
692
|
+
import jakarta.persistence.AttributeConverter;
|
|
693
|
+
import jakarta.persistence.Converter;
|
|
694
|
+
|
|
695
|
+
@Converter(autoApply = true)
|
|
696
|
+
public class BsPlTypeConverter implements AttributeConverter<BsPlType, String> {
|
|
697
|
+
|
|
698
|
+
@Override
|
|
699
|
+
public String convertToDatabaseColumn(BsPlType attribute) {
|
|
700
|
+
return attribute != null ? attribute.getDisplayName() : null;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
@Override
|
|
704
|
+
public BsPlType convertToEntityAttribute(String dbData) {
|
|
705
|
+
return dbData != null ? BsPlType.fromDisplayName(dbData) : null;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
</details>
|
|
711
|
+
|
|
712
|
+
---
|
|
713
|
+
|
|
714
|
+
## 14.6 Spring Data JPA Repository
|
|
715
|
+
|
|
716
|
+
### JpaRepository インターフェース
|
|
717
|
+
|
|
718
|
+
Spring Data JPA では、インターフェースを定義するだけで基本的な CRUD 操作が自動実装されます。
|
|
719
|
+
|
|
720
|
+
<details>
|
|
721
|
+
<summary>AccountJpaRepository.java</summary>
|
|
722
|
+
|
|
723
|
+
```java
|
|
724
|
+
package com.example.accounting.infrastructure.persistence.repository;
|
|
725
|
+
|
|
726
|
+
import com.example.accounting.domain.model.account.Account;
|
|
727
|
+
import com.example.accounting.domain.model.account.AggregationType;
|
|
728
|
+
import com.example.accounting.domain.model.account.BsPlType;
|
|
729
|
+
import org.springframework.data.jpa.repository.JpaRepository;
|
|
730
|
+
import org.springframework.stereotype.Repository;
|
|
731
|
+
|
|
732
|
+
import java.util.List;
|
|
733
|
+
|
|
734
|
+
@Repository
|
|
735
|
+
public interface AccountJpaRepository extends JpaRepository<Account, String> {
|
|
736
|
+
|
|
737
|
+
List<Account> findByBsPlType(BsPlType bsPlType);
|
|
738
|
+
|
|
739
|
+
List<Account> findByAggregationType(AggregationType aggregationType);
|
|
740
|
+
|
|
741
|
+
List<Account> findAllByOrderByAccountCodeAsc();
|
|
742
|
+
}
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
</details>
|
|
746
|
+
|
|
747
|
+
### Repository インターフェース(Output Port)
|
|
748
|
+
|
|
749
|
+
ヘキサゴナルアーキテクチャでは、アプリケーション層に Output Port を定義します。
|
|
750
|
+
|
|
751
|
+
<details>
|
|
752
|
+
<summary>AccountRepository.java</summary>
|
|
753
|
+
|
|
754
|
+
```java
|
|
755
|
+
package com.example.accounting.application.port.out;
|
|
756
|
+
|
|
757
|
+
import com.example.accounting.domain.model.account.Account;
|
|
758
|
+
import com.example.accounting.domain.model.account.AggregationType;
|
|
759
|
+
import com.example.accounting.domain.model.account.BsPlType;
|
|
760
|
+
|
|
761
|
+
import java.util.List;
|
|
762
|
+
import java.util.Optional;
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* 勘定科目リポジトリ(Output Port)
|
|
766
|
+
*/
|
|
767
|
+
public interface AccountRepository {
|
|
768
|
+
|
|
769
|
+
void save(Account account);
|
|
770
|
+
|
|
771
|
+
Optional<Account> findByCode(String accountCode);
|
|
772
|
+
|
|
773
|
+
List<Account> findAll();
|
|
774
|
+
|
|
775
|
+
List<Account> findByBsPlType(BsPlType bsPlType);
|
|
776
|
+
|
|
777
|
+
List<Account> findByAggregationType(AggregationType aggregationType);
|
|
778
|
+
|
|
779
|
+
void delete(String accountCode);
|
|
780
|
+
|
|
781
|
+
void deleteAll();
|
|
782
|
+
}
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
</details>
|
|
786
|
+
|
|
787
|
+
### Repository 実装(Infrastructure 層)
|
|
788
|
+
|
|
789
|
+
<details>
|
|
790
|
+
<summary>AccountRepositoryImpl.java</summary>
|
|
791
|
+
|
|
792
|
+
```java
|
|
793
|
+
package com.example.accounting.infrastructure.persistence.repository;
|
|
794
|
+
|
|
795
|
+
import com.example.accounting.application.port.out.AccountRepository;
|
|
796
|
+
import com.example.accounting.domain.model.account.Account;
|
|
797
|
+
import com.example.accounting.domain.model.account.AggregationType;
|
|
798
|
+
import com.example.accounting.domain.model.account.BsPlType;
|
|
799
|
+
import lombok.RequiredArgsConstructor;
|
|
800
|
+
import org.springframework.stereotype.Repository;
|
|
801
|
+
|
|
802
|
+
import java.util.List;
|
|
803
|
+
import java.util.Optional;
|
|
804
|
+
|
|
805
|
+
@Repository
|
|
806
|
+
@RequiredArgsConstructor
|
|
807
|
+
public class AccountRepositoryImpl implements AccountRepository {
|
|
808
|
+
|
|
809
|
+
private final AccountJpaRepository jpaRepository;
|
|
810
|
+
|
|
811
|
+
@Override
|
|
812
|
+
public void save(Account account) {
|
|
813
|
+
jpaRepository.save(account);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
@Override
|
|
817
|
+
public Optional<Account> findByCode(String accountCode) {
|
|
818
|
+
return jpaRepository.findById(accountCode);
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
@Override
|
|
822
|
+
public List<Account> findAll() {
|
|
823
|
+
return jpaRepository.findAllByOrderByAccountCodeAsc();
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
@Override
|
|
827
|
+
public List<Account> findByBsPlType(BsPlType bsPlType) {
|
|
828
|
+
return jpaRepository.findByBsPlType(bsPlType);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
@Override
|
|
832
|
+
public List<Account> findByAggregationType(AggregationType aggregationType) {
|
|
833
|
+
return jpaRepository.findByAggregationType(aggregationType);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
@Override
|
|
837
|
+
public void delete(String accountCode) {
|
|
838
|
+
jpaRepository.deleteById(accountCode);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
@Override
|
|
842
|
+
public void deleteAll() {
|
|
843
|
+
jpaRepository.deleteAll();
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
```
|
|
847
|
+
|
|
848
|
+
</details>
|
|
849
|
+
|
|
850
|
+
---
|
|
851
|
+
|
|
852
|
+
## 14.7 TestContainers によるテスト
|
|
853
|
+
|
|
854
|
+
### テスト基盤クラス
|
|
855
|
+
|
|
856
|
+
<details>
|
|
857
|
+
<summary>BaseIntegrationTest.java</summary>
|
|
858
|
+
|
|
859
|
+
```java
|
|
860
|
+
package com.example.accounting.testsetup;
|
|
861
|
+
|
|
862
|
+
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
|
|
863
|
+
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
|
864
|
+
import org.springframework.test.context.DynamicPropertyRegistry;
|
|
865
|
+
import org.springframework.test.context.DynamicPropertySource;
|
|
866
|
+
import org.testcontainers.containers.PostgreSQLContainer;
|
|
867
|
+
import org.testcontainers.junit.jupiter.Container;
|
|
868
|
+
import org.testcontainers.junit.jupiter.Testcontainers;
|
|
869
|
+
|
|
870
|
+
@Testcontainers
|
|
871
|
+
@DataJpaTest
|
|
872
|
+
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
|
|
873
|
+
public abstract class BaseIntegrationTest {
|
|
874
|
+
|
|
875
|
+
@Container
|
|
876
|
+
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
|
|
877
|
+
.withDatabaseName("testdb")
|
|
878
|
+
.withUsername("testuser")
|
|
879
|
+
.withPassword("testpass");
|
|
880
|
+
|
|
881
|
+
@DynamicPropertySource
|
|
882
|
+
static void configureProperties(DynamicPropertyRegistry registry) {
|
|
883
|
+
registry.add("spring.datasource.url", postgres::getJdbcUrl);
|
|
884
|
+
registry.add("spring.datasource.username", postgres::getUsername);
|
|
885
|
+
registry.add("spring.datasource.password", postgres::getPassword);
|
|
886
|
+
registry.add("spring.flyway.enabled", () -> "true");
|
|
887
|
+
registry.add("spring.flyway.locations", () -> "classpath:db/migration");
|
|
888
|
+
registry.add("spring.jpa.hibernate.ddl-auto", () -> "validate");
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
</details>
|
|
894
|
+
|
|
895
|
+
### データベース接続テスト
|
|
896
|
+
|
|
897
|
+
<details>
|
|
898
|
+
<summary>DatabaseConnectionTest.java</summary>
|
|
899
|
+
|
|
900
|
+
```java
|
|
901
|
+
package com.example.accounting;
|
|
902
|
+
|
|
903
|
+
import com.example.accounting.testsetup.BaseIntegrationTest;
|
|
904
|
+
import org.junit.jupiter.api.DisplayName;
|
|
905
|
+
import org.junit.jupiter.api.Test;
|
|
906
|
+
import org.springframework.beans.factory.annotation.Autowired;
|
|
907
|
+
|
|
908
|
+
import javax.sql.DataSource;
|
|
909
|
+
import java.sql.Connection;
|
|
910
|
+
import java.sql.ResultSet;
|
|
911
|
+
import java.sql.Statement;
|
|
912
|
+
|
|
913
|
+
import static org.assertj.core.api.Assertions.assertThat;
|
|
914
|
+
|
|
915
|
+
@DisplayName("データベース接続")
|
|
916
|
+
class DatabaseConnectionTest extends BaseIntegrationTest {
|
|
917
|
+
|
|
918
|
+
@Autowired
|
|
919
|
+
private DataSource dataSource;
|
|
920
|
+
|
|
921
|
+
@Test
|
|
922
|
+
@DisplayName("PostgreSQLに接続できる")
|
|
923
|
+
void canConnectToPostgres() throws Exception {
|
|
924
|
+
try (Connection conn = dataSource.getConnection();
|
|
925
|
+
Statement stmt = conn.createStatement();
|
|
926
|
+
ResultSet rs = stmt.executeQuery("SELECT 1")) {
|
|
927
|
+
assertThat(rs.next()).isTrue();
|
|
928
|
+
assertThat(rs.getInt(1)).isEqualTo(1);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
@Test
|
|
933
|
+
@DisplayName("BSPL区分ENUMが作成されている")
|
|
934
|
+
void bsplTypeEnumExists() throws Exception {
|
|
935
|
+
try (Connection conn = dataSource.getConnection();
|
|
936
|
+
Statement stmt = conn.createStatement();
|
|
937
|
+
ResultSet rs = stmt.executeQuery(
|
|
938
|
+
"SELECT unnest(enum_range(NULL::BSPL区分))::text")) {
|
|
939
|
+
assertThat(rs.next()).isTrue();
|
|
940
|
+
assertThat(rs.getString(1)).isEqualTo("BS");
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
</details>
|
|
947
|
+
|
|
948
|
+
---
|
|
949
|
+
|
|
950
|
+
## 14.8 命名規則のまとめ
|
|
951
|
+
|
|
952
|
+
| 要素 | 言語 | 例 |
|
|
953
|
+
|------|------|-----|
|
|
954
|
+
| **テーブル名** | 日本語 | `"勘定科目マスタ"`, `"仕訳データ"` |
|
|
955
|
+
| **カラム名** | 日本語 | `"勘定科目コード"`, `"勘定科目名"` |
|
|
956
|
+
| **ENUM 型** | 日本語 | `BSPL区分`, `貸借区分` |
|
|
957
|
+
| **ENUM 値** | 日本語 | `'BS'`, `'借方'` |
|
|
958
|
+
| **Java クラス名** | 英語 | `Account`, `BsPlType` |
|
|
959
|
+
| **Java フィールド名** | 英語 | `accountCode`, `accountName` |
|
|
960
|
+
| **Java メソッド名** | 英語 | `findByCode()`, `save()` |
|
|
961
|
+
| **JPA アノテーション** | 日本語カラム指定 | `@Column(name = "勘定科目コード")` |
|
|
962
|
+
|
|
963
|
+
---
|
|
964
|
+
|
|
965
|
+
## 本章のまとめ
|
|
966
|
+
|
|
967
|
+
本章では、財務会計システムの全体像と JPA による ORM 実装の基本を学びました。
|
|
968
|
+
|
|
969
|
+
### 学んだこと
|
|
970
|
+
|
|
971
|
+
| カテゴリ | 内容 |
|
|
972
|
+
|----------|------|
|
|
973
|
+
| スコープ | 勘定科目管理・仕訳処理・残高管理・帳票出力・決算処理 |
|
|
974
|
+
| アーキテクチャ | ヘキサゴナルアーキテクチャ(ポート&アダプター) |
|
|
975
|
+
| ORM | Spring Data JPA / Hibernate |
|
|
976
|
+
| マッピング | @Entity, @Table, @Column, @Convert |
|
|
977
|
+
| ENUM 変換 | AttributeConverter |
|
|
978
|
+
| テスト | TestContainers + @DataJpaTest |
|
|
979
|
+
|
|
980
|
+
### MyBatis 版との主な違い
|
|
981
|
+
|
|
982
|
+
| 項目 | MyBatis 版 | JPA 版 |
|
|
983
|
+
|------|-----------|--------|
|
|
984
|
+
| SQL 記述 | XML で明示的に記述 | 自動生成(メソッド名規約) |
|
|
985
|
+
| マッピング | resultMap | @Entity + @Column |
|
|
986
|
+
| ENUM 変換 | TypeHandler | AttributeConverter |
|
|
987
|
+
| 関連取得 | 明示的な JOIN | @EntityGraph, FETCH JOIN |
|
|
988
|
+
|
|
989
|
+
### 次章の予告
|
|
990
|
+
|
|
991
|
+
第15章では、財務会計システムの基盤となる勘定科目マスタの設計を JPA で実装します。@EmbeddedId を使った複合主キーや @ManyToOne によるリレーションも解説します。
|