Skip to content

Instantly share code, notes, and snippets.

@ryu1
Last active January 11, 2024 01:44
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ryu1/cef516f482bb73b2a58f087954cb9de1 to your computer and use it in GitHub Desktop.
Save ryu1/cef516f482bb73b2a58f087954cb9de1 to your computer and use it in GitHub Desktop.

Layer

UIå±€

  • ナヌザずの盞互䜜甚の境界ずなる局
  • アプリケヌション局の䞀郚なのか別個のレむダなのか諞説あり
  • ナヌザヌに情報を提瀺しお、ナヌザヌの操䜜やコマンドの解釈を担うレむダヌ。 DDDでは、このレむダヌにビゞネスロゞックを組む蟌むこずを皮肉を蟌めお「利口なUI」ずいうアンチパタヌンずしおおり、避けるべきパタヌンである。

アプリケヌション局

  • ドメむンオブゞェクトを操䜜するこずで、゜フトりェアが果たすべき仕事を実珟する局
  • アプリケヌションが行うこずになっおいる仕事ナヌスケヌスを定矩し、その仕事をドメむンレむダヌのオブゞェクトが解決するように指揮orchestrateするレむダヌ。このレむダヌもビゞネスロゞックは含たず、実際の凊理はドメむンレむダヌに委譲しお調敎圹を担う。

ドメむン局

  • ビゞネス䞊の抂念を衚珟する局
  • ビゞネスの抂念ず、ビゞネスルヌルおよびビゞネスが眮かれた状況に関する情報を衚珟するレむダヌ。このレむダヌがアプリケヌションの栞心ずなるレむダヌで、モデルが息づく堎所である。䜆し、技術的な関心事に぀いおの実装はむンフラストラクチャレむダヌに委譲する。

むンフラストラクチャ局

  • 䞊の3局を支える技術的な基盀ずなる局

  • 氞続化、 メッセヌゞング、ロギング等

  • メッセヌゞングには、通信プロトコルによっお皮類がある。HTTP、UDP、AMQP、FTPなど。

  • 䞊述のレむダヌを支える䞀般的な技術的機胜を提䟛するレむダヌ。デヌタの氞続化に関する技術的な機胜トランザクション管理やO/Rマッパヌや、ナヌザヌむンタヌフェむスのレンダリング機胜などが該圓する。

  • クラスをドメむン局に眮くべきか、むンフラストラクチャ局に眮くべきか、刀断する基準は、ドメむン局のクラスに䟝存する堎合はドメむン局ぞ、ドメむン局に䟝存しない堎合は、むンフラストラクチャ局に眮くべき

匕甚元

https://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap2.html http://www.shigemk2.com/entry/reactive_shinjuku_domain_event http://enterprisegeeks.hatenablog.com/entry/2016/07/25/081127

Pattern

Entities゚ンティティパタヌン

  • オブゞェクトの䞭には、アむデンティティをも぀もの゚ンティティが存圚する。゚ンティティは、アむデンティティが同じならば、属性が異なっおいおも同䞀のものずしお扱わなければならない。逆に、属性がたったく同じでも、アむデンティティが違えば圓然別゚ンティティずなる。゚ンティティはドメむンモデルの䞻圹であり、そのラむフサむクルを考えるこずが重芁になる。ドメむンモデルの䞭においお、゚ンティティの同䞀性をどうやっお刀断するかを定矩しなければならない。

  • ドメむンレむダヌに登堎する構成芁玠。アプリケヌション䞊で同䞀性の識別が必芁なオブゞェクト。぀たり、アプリケヌション䞊でオブゞェクトの䞀意性を意識しお扱う必芁があるオブゞェクトである。以䞋のような゚ンティティは業務を遂行するうえで䞀意に特定する必芁がある。

物、サヌビス商品、圚庫 人、組織顧客 堎所配送先、倉庫、保管堎所 取匕泚文、圚庫匕圓 仮に同姓同名別人の耇数の「顧客」がいたずしたら、その顧客達は別々のむンスタンスずしお扱われるべきで、名称が䞀緒だからずいっおその存圚を䞀括りにしおしたうず、泚文や配送が目茶苊茶になっおしたう。逆に、オブゞェクトごずの同䞀性を意識しない単なる数量や金額ずいった同倀性で語られる抂念は、この埌に玹介するバリュヌオブゞェクトずなる。

Value Objects倀オブゞェクトパタヌン

  • ゚ンティティずは逆に、たずえば「色」や「量」のように、その属性だけが重芁で、アむデンティティを考えるこずに意味のないオブゞェクトもある。そうしたオブゞェクトは、倀オブゞェクトに分類する。倀オブゞェクトずは、事物の性質を衚珟するものである。倀オブゞェクトは状態を倉曎できないものimmutableずしお扱う。゚ンティティの耇雑さに専念できるように、倀オブゞェクトはシンプルな蚭蚈に保぀ようにする。この倀オブゞェクトは、PofEAAのValue Objectパタヌンず同じものを衚しおいる

  • ドメむンレむダヌに登堎する構成芁玠。ドメむン䞊に登堎する倀そのものをオブゞェクト化した同䞀性を持たない小型のオブゞェクト。以䞋のようなオブゞェクトは、プリミティブ型や暙準型String型やDate型で定矩するのが䞀般的である。

数量 金額 コヌド 日付 区分 これらを「泚文番号」クラス、「泚文数量」クラス、「配送予定日」クラス、「商品コヌド」クラスずいった業務䞊の意味を宿らせたクラスずしお明瀺的に定矩するこずで、その倀自身がも぀知識をバリュヌオブゞェクトに凝瞮させるこずができ、゜フトりェア䞊の衚珟ずしおもより明確にできる。

ドメむンサヌビス(Domain Service)

  • ドメむンで扱う抂念の䞭には、1぀の機胜や凊理が単䜓で存圚しおいお、ものオブゞェクトずしお扱うのが䞍自然なものもある。そうしたものは、サヌビスずいう圢でナビキタス蚀語に組み蟌む。サヌビスは基本的に状態をもたないstateless。PofEAAのService Layerパタヌンずは異なる抂念なので泚意。Service LayerパタヌンはDDDのアプリケヌション局に盞圓するものを蚀っおいるが、DDDのサヌビスはドメむンモデルの䞭にあるサヌビス的なものを指しおいる。邊蚳はないが、Fowler氏の蚘事「Evansの分類」も参考になる

  • 最初に、「サヌビスずは、モノずしお扱うず䞍自然なものをサヌビスに分類する」ず觊れたしたが、゚ンティティやバリュヌオブゞェクトずいうモノに分類できないような振る舞いを切り出す堎所ず考えるずよいでしょう。぀たり、そういう振る舞いを分類する時に、䟋倖的、消極的に䜿うモデルず考えおください。

  • ドメむンレむダヌに登堎する構成芁玠。 ゚ンティティ物、人、堎所、取匕などにも、バリュヌオブゞェクト倀そのものにも属さない、ドメむン䞊のビゞネスルヌルやアクションを提䟛するサヌビス。 これらは、゚ンティティやバリュヌオブゞェクトのように実䜓のモノずしお捉えるのは䞍自然で、ビゞネスルヌルにもずづいた蚈算や刀定ずいったアクションを担うサヌビスずするのが適切である。

䟋えば今回のドメむンモデルで、商品の䟡栌を算定しようずした堎合、暙準䟡栌だけならば゚ンティティから簡単に取埗できるが、たずめ買いによる割匕や期間限定での割匕たで考慮しようずするず簡単には取埗できない。 実際の販売䟡栌を決定するためには、諞々のビゞネスルヌルを耇合的に加味する必芁があるが、䟡栌の算定方法をモノずしお定矩するのは䞍自然なため、ドメむンサヌビスずしお定矩する。 この算定方法が至るずころに散圚するず、コヌド重耇、メンテナンス性䜎䞋、䟡栌差異発生などのバグの枩床になるため、䟡栌決定に関する知識は、このドメむンサヌビスに凝瞮させお倖に流出させおはいけない。

ドメむンサヌビスの提䟛粒床は、アプリケヌションサヌビスの様にそれ単䜓でナヌスケヌスを満たすほど倧粒ではなく、そのドメむン固有の知識範囲に特化したサヌビスずなる。たた、ドメむンサヌビスは、蚈算や刀定を行う䞊で耇合的な知識が必芁ずなるこずが倚く、倧抵の堎合は耇数の゚ンティティやバリュヌオブゞェクトを束ねた䞭粒のサヌビスを提䟛するこずになる。 逆に蚀うず、゚ンティティ単䜓やバリュヌオブゞェクト単䜓の知識で提䟛できるメ゜ッドがあれば、それはドメむンサヌビスではなく、゚ンティティやバリュヌオブゞェクトに蚘述すればよい。

アプリケヌションサヌビス(Application Service)

  • アプリケヌションレむダヌに登堎する構成芁玠。ドメむンレむダヌの倧小様々な知識を指揮orchestrateしお、ナヌザヌに察しお意味のある単䜍の機胜を提䟛するサヌビス。ナヌスケヌスに登堎しおくるような機胜は、アプリケヌションサヌビスで衚珟する。しかし実際のビゞネスロゞックの蚘述はドメむンレむダヌの郚品に委譲しお、アプリケヌションサヌビス自䜓はドメむンレむダヌの郚品の調敎に培する。

Modulesモゞュヌルパタヌン

  • モゞュヌルの仕組みJavaのパッケヌゞや.NETの名前空間などは、プログラミングにおいおは誰もが䜿っおいる。人間が䞀床に考えられる物事の量には限界があるので、抂念に぀いおも同じようにモゞュヌル分割が必芁である。プログラミングの堎合ず同じく、ドメむンモデルのモゞュヌル分割においおも高凝集䜎結合が重芁な目安になる。関連し合う抂念同士はひず぀にたずめ高凝集、か぀䞀床に考えなければいけない範囲は最小限にする䜎結合。モゞュヌルの名前も、ナビキタス蚀語の重芁な䞀芁玠ずしお扱う。モゞュヌルもコヌドず同様、リファクタリングによっおアゞャむルに進化させおいかなければならない。

Aggregates集玄パタヌン

  • オブゞェクトのラむフサむクルを蚭蚈するには、たずラむフサむクルの単䜍ずなるオブゞェクトのたずたりを考えなければならない。たずえば「泚文」ず「泚文明现」のように、関連するオブゞェクトのグルヌプは集玄ずしお扱い、集玄を単䜍ずしおモデルの他の芁玠ずの境界を明確に分ける。集玄の䞭から1぀゚ンティティを遞んで、それを集玄のルヌトrootずする先ほどの䟋では、「泚文」がルヌトになる。1回きりの凊理で参照が砎棄されるような特別な堎合を陀いお、倖郚から参照できるのはルヌトだけで、䞭のオブゞェクトに察する凊理はすべおルヌトが䞭継する。こうするこずで、集玄内のモデルの䞀貫性を維持するこずができる。

  • ドメむンレむダヌに登堎する構成芁玠。 密接に関連のある゚ンティティやバリュヌオブゞェクト同士を集玄したオブゞェクトのクラスタ。

䟋えば今回のドメむンモデルにおける「泚文ヘッダ」-「泚文明现」の関連セットは、アプリケヌションの䞭でそれぞれ個々で扱われるよりも「泚文」ずいう1セットで扱われるこずが倚いだろう。泚文商品の明现が分からない泚文ヘッダや、泚文番号が分からない泚文明现だけあっおも圹に立たないので、結局は郜床郜床 お互いの関連を蟿る矜目になる。

こういった関連をカプセル化しおアクセスを単玔化する圹割を担うのがアグリゲヌトである。

アグリゲヌトをきる堎合、アグリゲヌト内の1぀の゚ンティティをアクセスポむントアグリゲヌトルヌト。今回だず「泚文ヘッダ」が自然ずしお定めお倖郚に公開し、アグリゲヌト内の入り組んだ関連パスを隠蔜するこずで、倖郚からはアグリゲヌトルヌトを通じおアグリゲヌト内の情報に透過的にアクセス出来るようになる。

Factoriesファクトリパタヌン

  • オブゞェクトや集玄の生成凊理はそれ自䜓耇雑になりうるため、ファクトリを導入しお生成凊理をカプセル化*2する。オブゞェクトの生成そのものがドメむンモデル䞊で重芁な意味をも぀こずはほずんどないため、ファクトリはドメむンモデルの䞀郚ではない。あくたで、ドメむンの蚭蚈䞊必芁な䞀芁玠、ずいう䜍眮付けになる。*2 本来「カプセル化」ずは単に属性や操䜜を1぀にたずめるこずを衚す抂念で、実装の詳现を倖郚から隠す抂念である「情報隠蔜」ずは異なりたす。しかしEvansはこの2぀を混同しお䜿っおいお、カプセル化ずいう蚀葉を情報隠蔜の意味でも䜿っおいるこずに泚意しおください。

Repositoriesリポゞトリパタヌン

  • ファクトリにより生成されたドメむンオブゞェクトは、圹目を終えお砎棄されるたでは生存する。生存期間の途䞭で、ほずんどの堎合はDBなどにいったん氞続化される。DBぞの氞続化や問い合わせ凊理の耇雑さによっお、ドメむンモデルが汚染されないようにするため、リポゞトリずいう氞続化問い合わせ専甚オブゞェクトをドメむン蚭蚈に導入するファクトリ同様、ドメむンモデルの䞀郚ではない。リポゞトリを䜿う偎からは、ドメむンモデルがあたかもメモリ䞊にコレクションずしお存圚しおいるかのように芋える。リポゞトリは、モデル䞭でグロヌバルなアクセスが必芁な゚ンティティ集玄の堎合はそのルヌト毎に、1぀甚意される。

  • ドメむンレむダヌおよびむンフラストラクチャレむダヌに登堎する構成芁玠。゚ンティティやアグリゲヌトの保管デヌタストアぞの氞続化やキャッシュぞの远加などず、保管枈みの゚ンティティやアグリゲヌトの取り出しを担う圹割を持たせる。その名のずおり、たさにオブゞェクトの貯蔵庫である。

尚、オブゞェクトの保管に関する技術芁玠に぀いおは、RDBを利甚する堎合もあれば、NoSQLを利甚する堎合もあるが、これらの技術芁玠に関するコヌドに぀いおはむンフラストラクチャレむダヌで実装䟋えば、SQLのク゚リコヌドなどしお、ドメむンレむダヌでは技術芁玠を意識するこずなく、ドメむンの蚀葉でオブゞェクトの保管・取り出しを行う。

個人的なブレスト

  • Repositoryクラスをむンフラストラクチャ局に配眮した堎合、Repositoryがドメむン局に属するEntityを返华するこずを考えるず、むンフラストラクチャ局にあるクラスRepositoryが、ドメむン局にあるクラスEntityに䟝存しおいる蚀える。通垞、ドメむン局は、むンフラストラクチャ局に䟝存しおいるが、その䞊、むンフラストラクチャ局がドメむン局に䟝存しおしたうず、レむダヌ同士が双方向の䟝存関係をもち、返っお、耇雑さを招くのではないだろうか。

  • RepositoryずEntity、䞡方をInterfaceずImplementationに分け、Interfaceをドメむン局におき、Implementationをむンフラストラクチャ局におく。InterfaceであるRepositoryは、InterfaceであるEntityに䟝存し、䞀方で、ImplementationであるRepositoryはImplementationであるEntityに䟝存するので、ドメむン局に䟝存せず、むンフラストラクチャ局の内郚で完結する。

  • Imaplementationは、Interfaceに䟝存しおいるので、䟝存関係の双方向性は解決したずはいえないか。

Specification仕様パタヌン

  • isXxx()のような真停倀を返すメ゜ッドからなるビゞネスルヌルは、通垞の゚ンティティや倀オブゞェクトには䞊手く割り圓おられない。ビゞネスルヌルをドメむンモデル䞊で衚珟するには、論理孊でいう「述語」predicateのような圹目をする特殊な倀オブゞェクトを導入する。これがすなわち仕様である。仕様は䞀般に、次の3぀を芏定する。

オブゞェクトの劥圓性怜蚌validation オブゞェクトの遞別条件selection オブゞェクトの生成条件creation

Policyパタヌン

First Class Collectionパタヌン

匕甚元

Package Structure Samples

  1. https://gist.github.com/satooshi/6396551
sf2-ddd
├── app
├── bin
├── build
├── lib
├── src
│   └── __VendorPrefix
│       ├── Application
│       │   └── __DomainNameBundle
│       │       ├── Command
│       │       │   └── __Command.php
│       │       ├── Controller
│       │       │   └── __Controller.php
│       │       ├── DependencyInjection
│       │       │   ├── Configuration.php
│       │       │   ├── __CompilerPass.php
│       │       │   └── __Extension.php
│       │       ├── Form
│       │       │   ├── Extension
│       │       │   │   └── __FormExtension.php
│       │       │   ├── Model
│       │       │   │   └── __FormDataModel.php
│       │       │   └── Type
│       │       │       └── __EntityType.php
│       │       ├── Page
│       │       │   └── __Page.php
│       │       ├── Resources
│       │       │   ├── config
│       │       │   │   ├── routing.yml
│       │       │   │   └── services.yml
│       │       │   ├── translations
│       │       │   └── views
│       │       ├── Tests
│       │       │   ├── Command
│       │       │   │   └── __CommandTestCases
│       │       │   ├── Controller
│       │       │   │   └── __ControllerTestCases
│       │       │   ├── DependencyInjection
│       │       │   │   └── __DependencyInjectionTestCases
│       │       │   ├── Form
│       │       │   │   └── __FormTestCases
│       │       │   └── Page
│       │       │       └── __PageTestCases
│       │       └── __DomainNameAppBundle.php
│       ├── Component
│       ├── Domain
│       │   ├── Shared
│       │   │   └── Value
│       │   │       ├── Gender.php
│       │   │       └── Interval.php
│       │   └── __DomainNameBundle
│       │       ├── Application
│       │       │   └── __ApplicationService.php
│       │       ├── Entity
│       │       │   ├── Model
│       │       │   │   └── __EntityDataModel.php
│       │       │   └── __EntityExtendsDataModel.php
│       │       ├── Event
│       │       │   └── __DomainEvent.php
│       │       ├── Exception
│       │       │   └── __DomainException.php
│       │       ├── Interface
│       │       │   ├── Dto
│       │       │   │   └── __ServiceDto.php
│       │       │   └── Facade
│       │       │       └── __ServiceFacade.php
│       │       ├── Listener
│       │       │   ├── __DomainEventListener.php
│       │       │   └── __EntityListener.php
│       │       ├── Repository
│       │       │   └── __EntityRepositoryInterface.php
│       │       ├── Resources
│       │       │   └── config
│       │       │       ├── doctrine
│       │       │       │   ├── __Document.mongodb.xml
│       │       │       │   └── __Entity.orm.xml
│       │       │       ├── services.yml
│       │       │       └── validation.yml
│       │       ├── Service
│       │       │   └── __DomainService.php
│       │       ├── Specification
│       │       │   └── __DomainSpecification.php
│       │       ├── Tests
│       │       │   ├── Application
│       │       │   │   └── __ApplicationServiceTestCases
│       │       │   ├── Entity
│       │       │   │   └── __EntityTestCases
│       │       │   ├── Event
│       │       │   │   └── __EventTestCases
│       │       │   ├── Exception
│       │       │   │   └── __ExceptionTestCases
│       │       │   ├── Interface
│       │       │   │   └── __InterfaceTestCases
│       │       │   ├── Listener
│       │       │   │   └── __ListenerTestCaess
│       │       │   ├── Service
│       │       │   │   └── __ServiceTestCases
│       │       │   ├── Specification
│       │       │   │   └── __SpecificationTestCases
│       │       │   └── Validator
│       │       │       └── __ValidatorTestCases
│       │       ├── Validator
│       │       │   └── __DomainValidator.php
│       │       └── __DomainNameBundle.php
│       └── Infrastructure
│           └── __DomainNameBundle
│               ├── Messaging
│               │   ├── __EmailConsumer.php
│               │   └── __LoggingConsumer.php
│               ├── Repository
│               │   ├── __DocumentRepository.php
│               │   └── __EntityRepository.php
│               ├── Tests
│               │   ├── Messaging
│               │   │   └── __MessagingTestCases
│               │   └── Repository
│               │       └── __RepositoryTestCases
│               └── __DomainNameBundle.php
├── tests
│   └── SeleniumTestSuite
├── vendor
└── web
  1. https://codeforfunandmoney.wordpress.com/2016/07/13/domain-driven-design-and-package-organization/
src/main/java
├── UserInterface
│   └── ... (java files)
├── Application
│   ├── OneUseCase.java
│   ├── AnotherUseCase.java
│   └── YetAnotherUseCase.java
├── Domain
│   ├── SubDomain1
│   │   └── ... (java files)
│   ├── SubDomain2
│   │   └── ... (java files)
│   ├── SubDomain3
│   │   └── ... (java files)
│   └── SubDomain3
│       └── ... (java files)
└── Infrastructure
    ├── database
    │   └── ... (java files)
    ├── logging
    │   └── ... (java files)
    └── httpclient
        └── ... (java files)
  1. http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/
src
└── Acme
    ├── ApiBundle
    │   ├── Controller
    │   │   └── UserController.php
    │   ├── Resources
    │   │   ├── config
    │   │   │   ├── routing.yml
    │   │   │   └── serializer
    │   │   │       ├── User.User.yml
    │   │   │       └── User.UserId.yml
    │   │   └── views
    │   │       └── User
    │   │           └── all.html.twig
    │   └── AcmeApiBundle.php
    ├── CoreDomain
    │   └── User
    │       ├── User.php
    │       ├── UserId.php
    │       └── UserRepository.php
    └── CoreDomainBundle
        ├── DependencyInjection
        │   └── AcmeCoreDomainExtension.php
        ├── Repository
        │   └── InMemoryUserRepository.php
        ├── Resources
        │   └── config
        │       └── repositories.xml
        └── AcmeCoreDomainBundle.php
  1. https://groups.google.com/forum/#!topic/dddinphp/ZGb8tHQgw8o
application
  user
    UserController.php
    UserService.php
  blog
    BlogController.php
    BlogService.php
domain
  user
    Avatar.php
    Address.php
    UserService.php
    UserRepository
  blog
    Post.php
    Comment.php
    BlogService.php
    BlogRepository.php
    User.php
    Blog.php
infrastructure
  user
    UserService.php
  blog
    BlogService.php
  1. https://laracasts.com/discuss/channels/general-discussion/folder-and-namespace-structure-with-ddd
app/
----ToDo/
--------App/
------------Providers/
----------------ToDoServiceProvider.php
----------------ConfigServiceProvider.php
------------Validators/
----------------LaravelValidator.php
------------ValueObject.php
------------BaseModel.php
--------Domain/
------------List/
----------------EloquentList.php
----------------ListRepository.php
----------------ListService.php
----------------ListValidator.php
----------------Priority.php
------------Task/
----------------EloquentTask.php
----------------TaskRepository.php
----------------TaskService.php
----------------TaskValidator.php
--------Http/
------------Lists/
----------------ListController.php
----------------ListPresenter.php
----------------ListViewComposer.php
------------Tasks/
----------------TaskController.php
--------Infrastructure/
------------Lists/
----------------ListRepositoryCacheDecorator.php
----------------EloquentListRepository.php
------------EloquentTaskRepository.php
  1. https://softwareengineering.stackexchange.com/questions/328648/java-ddd-project-organization
com.some.namespace
  application
    services = (app services that talk to repositories and domain model)
    validators = (validators for DTOs in app service layer)
  domain
    events = (domain events)
    exceptions = (exceptions in domain - eg. during validation or business logic)
    factories = (used to construct domain model objects - eg. construct from DTOs)
    model = (full domain model with all entities, value objects etc.)
    repositories = (interfaces only - implemented in infrastruct.)
    services = (domain service interfaces only - implemented in infrastr.)
  infrastructure
    messaging = (message listeners - eg RabbitMQ - talks to app services)
    repositories = (repository implementations)
      sql = (one version of repository implementation)
    rest = (rest endpoints - talks to application services)
    services = (domain service implementations)
  1. https://terasolunaorg.github.io/guideline/public_review/Overview/ApplicationLayering.html
[projectName]-domain
  └src
      └main
          ├java
          │  └com
          │      └example
          │          └domain ...(1)
          │              ├model
          │              │  ├Xxx.java
          │              │  ├Yyy.java
          │              │  └Zzz.java
          │              ├repository ...(2)
          │              │  ├xxx
          │              │  │  └XxxRepository.java
          │              │  ├yyy
          │              │  │  └YyyRepository.java
          │              │  └zzz
          │              │      ├ZzzRepository.java
          │              │      └ZzzRepositoryImpl.java
          │              └service ...(3)
          │                  ├aaa
          │                  │  ├AaaService.java
          │                  │  └AaaServiceImpl.java
          │                  └bbb
          │                      ├BbbService.java
          │                      └BbbServiceImpl.java
          └resources
              └META-INF
                  └spring
                      ├[projectname]-domain.xml ...(4)
                      └[projectname]-infra.xml ...(5)

(1) ドメむンオブゞェクトを栌玍する。 (2) リポゞトリを栌玍する。゚ンティティごずにパッケヌゞを䜜成する。 関連する゚ンティティがあれば、䞻ずなる゚ンティティのパッケヌゞに、埓ずなる゚ンティティのRepositoryも配眮する。 (OrderずOrderLineなど)。DTOが必芁な堎合は、このパッケヌゞに配眮する。 RepositoryImplは、むンフラストラクチャ局に属するが、通垞、このプロゞェクトに含めおも問題ない。 異なるデヌタストアを䜿うなど、耇数の氞続化先があり、実装を隠蔜したい堎合は、別プロゞェクト(たたはパッケヌゞ)に、RepositoryImplを実装するようにする。 (3) サヌビスを栌玍する。業務(たたぱンティティ)ごずに、パッケヌゞむンタフェヌスず実装を、同じ階局に配眮する。 入出力クラスが必芁な堎合は、このパッケヌゞに配眮する。 (4) ドメむン局に関するBean定矩を行う。 (5) むンフラストラクチャ局に関するBean定矩を行う。

[projectName]-web
  └src
      └main
          ├java
          │  └com
          │      └example
          │          └app ...(1)
          │              ├abc
          │              │  ├AbcController.java
          │              │  ├AbcForm.java
          │              │  └AbcHelper.java
          │              └def
          │                  ├DefController.java
          │                  ├DefForm.java
          │                  └DefOutput.java
          ├resources
          │  ├META-INF
          │  │  └spring
          │  │      ├applicationContext.xml ...(2)
          │  │      ├application.properties ...(3)
          │  │      ├spring-mvc.xml ...(4)
          │  │      └spring-security.xml ...(5)
          │  └i18n
          │      └application-messages.properties ...(6)
          └webapp
              └WEB-INF
                  ├views ...(7)
                  │  ├abc
                  │  │ ├list.jsp
                  │  │ └createForm.jsp
                  │  └def
                  │     ├list.jsp
                  │     └createForm.jsp
                  └web.xml

(1) アプリケヌション局の構成芁玠を栌玍するパッケヌゞ。 (2) アプリケヌション党䜓に関するBean定矩を行う。 (3) アプリケヌションで䜿甚するプロパティを定矩する。 (4) SpringMVCの蚭定を行うBean定矩を行う。 (5) SpringSecurityの蚭定を行うBean定矩を行う。 (6) 画面衚瀺甚のメッセヌゞ(囜際化察応)定矩を行う。 (7) View(jsp)を栌玍する。

[projectName]-env
  └src
      └main
          └resources
              └META-INF
                  └spring
                      ├[projectname]-env.xml ...(1)
                      └[projectname]-infra.properties ...(2)

(1) 環境に䟝存するBean定矩(DataSource等)を行う。 (2) 環境に䟝存するプロパティを定矩する。

@ryu1
Copy link
Author

ryu1 commented Jun 1, 2022

参考文献

59CEFE88-9DA3-4880-A130-C8A58BE57307
84E8E94C-106B-4545-809A-8FB0C06190CF

@ryu1
Copy link
Author

ryu1 commented Jan 11, 2024

@ryu1
Copy link
Author

ryu1 commented Jan 11, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment