[DDD] Repository Pattern μ΄λ, μ΄λ‘ νΈ
μ΄ κΈμ μ΄λ‘ κ³Ό μ€μ΅, λ ννΈλ‘ λλμ΄μ Έ μμ΅λλ€.
- Repository Pattern μ λν΄μ, μ΄λ‘ νΈ <- νμ¬ κΈ
- Repository Pattern - μ€μ νΈ (Spring μμ DIP λ₯Ό ν΅ν΄ Repository μ μ μΈκ³Ό ꡬν λΆλ¦¬μν€κΈ°)
λͺ©μ°¨
- μλ‘
- Repository Pattern
- DIP μ Repository
- DDD κ΄μ μ Repository λ?
μλ‘
Spring Data JPA λ₯Ό μ¬μ©νλ€λ©΄ κ°μ₯ λ§μ΄ μ νλ κ²μ΄ λ°λ‘ Repository κ° μλκΉ μΆλ€.
μ΄ Repository λΌλ κ°λ μ JPA μμ μ¬μ©λλ μΈν°νμ΄μ€κ° μλλΌ Spring Data μμ μ¬μ©λλ μΈν°νμ΄μ€μ΄λ€.
μ°λ¦¬λ νΉμ λλ©μΈ κ°μ²΄λ₯Ό μ§μμ μΌλ‘ μ¬μ©νκΈ° μν΄μ (νΉμ μμνκΈ° μν΄) μ ν리μΌμ΄μ μ μ§ν±νλ Backing Service μ μμν΄μΌ νλ€.
κ·Έκ² RDBMS λ NoSQL, λ‘컬μ μ‘΄μ¬νλ νμΌ νΉμ remote μ μ΄λκ°λ 물리μ μΈ μ μ₯μκ° νμνλ€.
κ·Έλμ spring-data-jpa
, spring-data-jdbc
, spring-data-elasticsearch
λ₯Ό λ§λ‘ νκ³ repository
λ₯Ό ν΅ν΄μ μμμ± μ₯μΉμ ν΅μ μ νκ² λλ€.
μ΄λ¬ν Repository λ μ¬μ€ Spring μ κ°λ μ μλλ©° μμ Javaλ μ΄λ€ ꡬν κΈ°μ μ μ’ μμ μΈ μ΄μΌκΈ° μμλ μλλ€.
Spring-Data λͺ¨λ μμ repository λΌλ κ°λ μ μν΄μ μμλμκ³ μ€λμ κ·Έμ λν΄μ μμλ³΄λ € νλ€.
Repository Pattern
Repository Pattern μ 2004 λ Eric Evans μ Domain-Driven-Design μμ μ²μ μκ°λ κ°λ μΌλ‘, 곡ν΅μ μΈ λ°μ΄ν° Access & Manipluate μ μ§μ€νμ¬ λλ©μΈ λͺ¨λΈ κ³μΈ΅κ³Ό ꡬν κΈ°μ μ λΆλ¦¬μν€λ κ²μ μλ―Ένλ€.
μ΄λ κ² ν¨μΌλ‘μ¨ RDB λ Query μ κ°μ΄ μ΄λ ν ꡬν κΈ°μ μ μ’ μμ μ΄μ§ μκ³ λλ©μΈμ λμ± μ§μ€ν μ μκ² λλ ν¨ν΄μ μλ―Ένλ€.
Repository μ λν΄μ Martin Fowler λ λ€μκ³Ό κ°μ΄ νννλ€.
A repository performs the tasks of an intermediary between the domain model layers and data mapping, acting in a similar way to a set of domain objects in memory. Client objects declaratively build queries and send them to the repositories for answers. Conceptually, a repository encapsulates a set of objects stored in the database and operations that can be performed on them, providing a way that is closer to the persistence layer. Repositories, also, support the purpose of separating, clearly and in one direction, the dependency between the work domain and the data allocation or mapping.
μ¦ ν λ¬Έμ₯μΌλ‘ μμ½νμλ©΄ λ€μκ³Ό κ°λ€.
Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.
μ¦, domain κ³Ό data source layer κ°μ μ€μ¬μ μν μ μννλ κ²μ΄λΌκ³ νλ€.
repository λ μμμ± μ₯μΉμμ 쿼리μ κ²°κ³Όλ‘ λ°μμ¨ λ°μ΄ν°λ₯Ό repository μμλ domain μμ μ¬μ©νκΈ° μ ν©νλλ‘ Domain κ°μ²΄λ‘ mapping νλ μν μ μννλ€.
μ κ·Έλ¦Όμ Jpa λ₯Ό μ¬μ©ν λ κΈ°λ³ΈμΌλ‘ μ¬μ©λλ Repository μ ꡬνμ²΄μΈ (μ ννλ JpaRepository
μ ꡬν체) SimpleJpaRepository
ν΄λμ€μ΄λ€.
μμ κ°μ΄ entity μ λν μ 보λ₯Ό λ°κΈ°λ νλ©° μ€μ connection μ μ²λ¦¬ν entity manager λν 보μ νκ³ μλ κ²μ μ μ μλ€.
κΌ μμμ± μ₯μΉμΌ νμλ μλ€.
domain κ΄μ μμ 보면 repository λ€μ μ΄λ€ μ₯μΉκ° μ¨μ΄μλ μκ΄ μμ΄ λ°μ΄ν°λ₯Ό μ‘°μνλ λ°μ νμν μΈν°νμ΄μ€λ§μ λ°λΌλ³΄κ³ νλ ₯νκΈ° λλ¬Έμ RDBMS μ΄λ, WebServer μ΄λ, FileSystem μ΄λ μκ΄ μλ€.
DIP μ Repository
DDD μμ λ§νλ Layered Architecture λ₯Ό μ μ©νλ€λ©΄ μλ§ λ€μκ³Ό κ°μ κ΅¬μ‘°κ° μΌλ°μ μΌλ‘ μ¬μ©λ κ²μ΄λ€.
κ°μ΄λ° μλ Infrastructure Persistence Layer κ° λ°λ‘ Repository κ° μ‘΄μ¬νλ λ μ΄μ΄μ΄λ€.
μμμ μ Repository κ° μ‘΄μ¬νλ€κ³ νλμ§ κΈ°μ΅λλκ°?
λ€μ νλ² λ§νμλ©΄ Repository λ λλ©μΈμ μμννλλ° νμν μΌμ’ μ λͺ μΈμ΄λ€.
λλ©μΈ κ΄μ μμ "λλ μ΄λ° κ²λ€μ μ΄λ κ² μ μ₯ν κ²μ΄κ³ μ΄λ κ² λΆλ¬μ¬κ±°μΌ!" λΌλ λͺ μΈλ₯Ό λ§λ€μ΄λκ³ μ€μ ꡬν κΈ°μ μ λν λΆλΆμ λΆλ¦¬μν¨λ€λ κ²μ΄λ€.
κ·Έλμ μμ Domain Model Layer μ Infrastructure Layer λ₯Ό λλλ κ²λ κ°μ λ§₯λ½μ΄λ€.
- Domain Model Layer μμλ μ μ₯νλ λ°©λ²μ λν΄μ κ΄μ¬μ κ°κ³ ,
- Infrastructure Layer μμλ μ€μ λ‘ μ΄λ»κ² μ μ₯νλμ§μ λν΄μ κ΄μ¬μ κ°λλ€.
μ΄ λ μ¬μ΄λ₯Ό μ΄λ»κ² ꡬνν κΉ?
μ λ΅μ DIP μ΄λ€.
DIP λ₯Ό μ΄μ©ν΄μ λλ©μΈ λͺ¨λΈμ μ‘΄μ¬νλ Repository μΆμνλ‘ λ§λ€κ³ μ€μ ꡬνμ infrastructure μμ νκ² νλ€.
DIP λ₯Ό μ¬μ©νλ€λ κ²μ μμ‘΄μ λ°©ν₯μ μμ μν€κ² λ€λ μ΄μΌκΈ°λ€.
μ¦, κ³ μμ€ λͺ¨λ(μλ―Έ μλ λ¨μΌ κΈ°λ₯)μ΄ μ μμ€ λͺ¨λ(κ³ μμ€ λͺ¨λμ ꡬννκΈ° μν κΈ°λ₯)μ μμ‘΄νμ§ μλλ‘ νκΈ° μν¨μΈλ°, λ¨μ§ μ μΈκ³Ό ꡬνμ λΆλ¦¬ μ―€μΌλ‘ μκ°νλ€λ©΄ μλͺ»λ DIP μ κ²°κ³Όκ° λμ¬ μ μλ€.
μλ₯Ό λ€λ©΄ μλμ κ°μ ννλ‘ λ§μ΄λ€.
μ΄λ κ² λλ€λ©΄ Repository λ₯Ό λ€μν ννμ ꡬνμΌλ‘ λ€νμ μ΄κ² λ§λ λ€λ 쑰건μ λ§μ‘±μμΌ°λ€.
νμ§λ§ μ¬μ ν κ³ μμ€ λͺ¨λμ΄ μ μμ€ λͺ¨λμ μμ‘΄νκ³ μλ€. μ¦, μμ‘΄μ κ΄μ μμ λ³Έλ€λ©΄ OrderDomainService
κ° infrastructure λ₯Ό μκ² λλ ννμ΄λ€.
μ΄λ κ² μμ‘΄μ λ°©ν₯μ΄ μλͺ»λλ€λ©΄ λ§μ κ³ ν΅μ΄ λ°μν μ μλ€. νμ¬λ μ΄μμλκ² μ²λΌ 보μ΄κ² μ§λ§ ν ν΄κ° μ§λκ³ , λ€μ ν΄κ° μ§λμ λ€λ₯Έ κ°λ°μκ° λλ©μΈ λ‘μ§μμ Repository λ₯Ό μΆμμ μΈ κ²μ μμ‘΄νλ κ² μλλΌ κ΅¬μ²΄μ μΈ ElasticsearchRepository λ₯Ό μμ‘΄νλ€κ³ ν΄λ³΄μ. κ·Έλ¦¬κ³ κ·Έ λ€μν΄μ λΉμ¦λμ€κ° λ³κ²½λμ΄ μ μ₯ν νμ μμ΄ λ¨μ§ API λ‘ λ€λ₯Έ κ³³μ relay λ§ νλ€κ³ νμλ, μ΄λ€μ λΆλ¦¬νλ κ²μ λ λ€λ₯Έ pain point κ° λ κ²μ΄λ€.
κ·Έλμ μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ OrderRepository
λ₯Ό κ³ μμ€ λͺ¨λλ‘ λ§λλ κ²μ΄λ€.
μ΄λ κ² λλ€λ©΄ νλμ μΆμμ μΈ Repository μ λν΄μ λ€μν ꡬνμ΄ κ°λ₯νκ² λλ€.
κ²°κ΅ Repository λ Jpa μ§μμμ DB μ μ°κ²°νκΈ° μν layer λ‘ λΆλ₯΄λ κ²μ΄ μλλΌλ κ²μ μ μ μλ€.
λλ©μΈμ κ΄μ μμ Repository λ λ°μ΄ν°λ₯Ό μ μ₯νλ backing μ μΆμνν κ²μΌλ‘ λλ©μΈμ μ΄λ»κ² Repository μ μ μ₯λλμ§ κ΄μ¬μ κ°μ§ μλλ€.
μ€λ‘μ§ λλ©μΈ λ‘μ§ μ체μλ§ κ΄μ¬μ κ°λλ€.
κ·Έλμ λλ©μΈ κ΄μ μΌλ‘ 보μλ©΄ Repository λ₯Ό λκ³ infrastructure μμ μ΄λ₯Ό JPA λ₯Ό μ¬μ©νλ MyBatis λ₯Ό μ¬μ©ν΄μ DAO κ³μΈ΅μ λ§λ€κ±΄ μ€μνμ§ μκ² λλ κ²μ΄λ€.
DDD κ΄μ μ Repository λ?
μ΄μ Domain Driven Design, μ€κ³μ κ΄μ μμ Repository λ₯Ό μκ°ν΄λ³΄μ
DDD μμλ μ 그리거νΈλΌλ μ©μ΄κ° μ‘΄μ¬νλ€.
μ 그리거νΈλ κ°λ΅νκ² λ§νμλ©΄ νλμ unit, λΉμ¦λμ€ λ¨μλ‘ μ·¨κΈν μ μλ μ€λΈμ νΈμ μ§ν©μ΄λ€.
μλ₯Ό λ€μ΄μ Review λΌλ μ 그리거νΈκ° μ‘΄μ¬νλ€κ³ ν΄λ³΄μ.
κ·ΈλΌ ν΄λΉ Review λΌλ μ 그리거νΈμλ λ€μκ³Ό κ°μ μ€λΈμ νΈκ° μ‘΄μ¬ν κ²μ΄λ€.
- Review μλ κΈμ μ΄ μ¬λμΈ
Reviewer
- κΈμ λ³Έλ¬ΈμΈ
Contents
- 리뷰μ μ λͺ©μΈ
Title
- ν΄λΉ 리뷰μ
Tag
μ΄μΈμλ 리뷰λ₯Ό νννλ λ€μν μ€λΈμ νΈκ° μ‘΄μ¬ν κ²μΈλ°, ν΄λΉ μ€λΈμ νΈλ 리뷰λΌλ λΉμ¦λμ€ κ°λ νλλ₯Ό ꡬμ±νλ μμλ€μ΄λ€.
κ²°κ΅ μ΄λ€ μ 그리거νΈκ° μ μ₯λλ€λ μ리λ ν΄λΉ μ 그리거νΈμ ν¬ν¨λλ λͺ¨λ entity μ value λ€μ λν΄μ transaction consistency λ₯Ό 보μ₯ν΄μΌ νλ€.
κ·Έλμ μΌλ°μ μΌλ‘ DDD μμλ νλμ Aggregate λ₯Ό Repository μ λμ μν°ν°λ‘ μΌλλ€.
μ¦ Review λΌλ μ 그리거νΈκ° μ‘΄μ¬ν λ, ν΄λΉ μ 그리거νΈλ₯Ό μ μ₯νκ³ λ‘λνλ Repository λ ReviewRepository λ§ μ‘΄μ¬ν΄μΌ νλ€λ μ리λ€.
Review κ° Tag λ€μ ν¬ν¨νκ³ μλ€κ³ ν΄μ TagRepository κ° μ‘΄μ¬ν΄μλ μλλ€λ κ²μ΄λ€.
μ΄μ λν΄μ μμΈν μ΄μΌκΈ°λ ν΄λΉ λΈλ‘κ·Έμ DDD μΉ΄ν κ³ λ¦¬ μ Aggregate μ AggregateRoot μμ μμΈν νμΈν μ μλ€.
λμΌλ‘
μ΄λ κ² μ€λμ Repository μ λν΄μ μμ보μλ€.
μ΅κ·Όμ DDD λ₯Ό νμ΅νλ©΄μ μ€ν΄λ₯Ό νκ²λ κ²μ΄ Repository λΌλ κ²μ κ°λ μΈ κ²μ΄κ³ μ΄λ ν κΈ°μ μ κ΅νλ λ΄μ©μ΄ μλλΌλ κ²μ΄λ€.
μ Repository Pattern μ΄ μ€μνκ³ μ΄λ€ κ²λ€μ μ€ν΄νλμ§ λ§νλ©΄μ λ€μ μΆμμ μΈ μ΄μΌκΈ°λ₯Ό νμ μλ μλ€.
λ€μ μκ°μλ μ€μ λ‘ Spring μμ Repository Pattern μ ꡬννκ³ , DIP λ₯Ό ν΅ν΄μ λλ©μΈμ΄ μΆμμ μΈ κ²μ μμ‘΄νλλ‘ λ§λ€μ΄ λ³Ό μμ μ΄λ€.
References
- https://4z7l.github.io/2020/11/24/repository-pattern.html
- https://docs.microsoft.com/ko-kr/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design
- https://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/
- https://deviq.com/design-patterns/repository-pattern
- https://martinfowler.com/eaaCatalog/repository.html