πŸ’»
Albert's Til
GitHub
  • 맀일맀일 μ‘°κΈˆμ”© μ„±μž₯ν•˜κΈ°
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • 였λ₯˜ μ½”λ“œ
      • ORM 도ꡬ
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • λ””λ―Έν„° 법칙
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT 토큰 μ‚¬μš©ν•œ 인가
        • OAuth 2 Login
        • OAuth 2 인증
        • 인가
        • 인증
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud μœ ν˜•
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • 무쀑단 배포
        • μ—”μ§„μ—‘μŠ€(Nginx)
      • μ½”λ“œ μžλ™ 배포
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) ν‚€
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1μ£Όμ°¨ 회고
      • Spring Boot Project 2μ£Όμ°¨ 회고
      • Spirng Boot Project 3μ£Όμ°¨ 회고
      • Spring Boot Project 4μ£Όμ°¨ 회고
    • Foody Moody ν”„λ‘œμ νŠΈ
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • 기술 μŠ€νƒ 적용 이유
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • μ£Όμš” κ°œλ…κ³Ό 원칙
  • 도메인
  • 도메인 λͺ¨λΈ
  • μ• κ·Έλ¦¬κ²Œμž‡(Aggregate):
  • 도메인 주도 섀계:
  • μ•„ν‚€ν…μ²˜ ꡬ성
  • 엔티티와 λ°Έλ₯˜
  • μ—”ν‹°ν‹°
  • λ°Έλ₯˜
  • 도메인 μ˜μ—­μ˜ μ£Όμš” κ΅¬μ„±μš”μ†Œ
  • μ—”ν‹°ν‹°(ENTITY)
  • λ°Έλ₯˜(VALUE)
  • μ• κ·Έλ¦¬κ±°νŠΈ(AGGREGATE)
  • 리포지터리(REPOSITORY)
  • 도미엔 μ„œλΉ„μŠ€(DOMAN SERVICE)
  • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ(Bounded Context)
  • νŠΉμ§•
  • Architecture
  • Layered
  • Clean
  • Hexagonal
  • Reference

Was this helpful?

  1. 맀일맀일 μ‘°κΈˆμ”© μ„±μž₯ν•˜κΈ°

DDD

Domain Driven Design

DDD(Domain-Driven Design)λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 방법둠 쀑 ν•˜λ‚˜λ‘œ, λ³΅μž‘ν•œ 도메인을 λ‹€λ£¨λŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ„ κ°œλ°œν•˜κΈ° μœ„ν•œ μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. DDDλŠ” λ„λ©”μΈμ˜ λ³΅μž‘μ„±μ— μ΄ˆμ μ„ λ§žμΆ”κ³ , 도메인 전문가와 개발자 κ°„μ˜ ν˜‘μ—…μ„ κ°•μ‘°ν•©λ‹ˆλ‹€.

μ£Όμš” κ°œλ…κ³Ό 원칙

도메인

  • μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ΄ μ μš©λ˜λŠ” 문제 μ˜μ—­ λ˜λŠ” 업무 μ˜μ—­μ„ λ§ν•©λ‹ˆλ‹€. 도메인은 λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™, κ°œλ…, ν”„λ‘œμ„ΈμŠ€ 등을 ν¬ν•¨ν•˜λ©°, μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ€ 도메인을 λͺ¨λΈλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.

도메인 λͺ¨λΈ

  • 도메인을 ν‘œν˜„ν•˜κΈ° μœ„ν•œ μΆ”μƒν™”λœ κ°œλ…μ΄μž κ΅¬μ‘°μž…λ‹ˆλ‹€. 도메인 λͺ¨λΈμ€ λ„λ©”μΈμ˜ 핡심 κ·œμΉ™, κ°œλ…, ν”„λ‘œμ„ΈμŠ€λ₯Ό 객체, κ°’ 객체, μ—”ν‹°ν‹°, μ• κ·Έλ¦¬κ²Œμž‡ λ“±μ˜ κ°œλ…μ„ μ‚¬μš©ν•˜μ—¬ ν‘œν˜„ν•©λ‹ˆλ‹€.

μ• κ·Έλ¦¬κ²Œμž‡(Aggregate):

  • κ΄€λ ¨λœ κ°μ²΄λ“€μ˜ 그룹을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ 묢은 κ°œλ…μž…λ‹ˆλ‹€. μ• κ·Έλ¦¬κ²Œμž‡μ€ λ‚΄λΆ€μ μœΌλ‘œ μΌκ΄€λœ μƒνƒœλ₯Ό μœ μ§€ν•˜κ³  도메인 κ·œμΉ™μ„ μ μš©ν•©λ‹ˆλ‹€. μ• κ·Έλ¦¬κ²Œμž‡μ€ 도메인 λͺ¨λΈμ˜ 쀑심 μš”μ†Œμ΄λ©°, λ„λ©”μΈμ˜ 경계와 일관성을 μœ μ§€ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

도메인 주도 섀계:

  • 도메인을 μ€‘μ‹¬μœΌλ‘œ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜λŠ” λ°©λ²•λ‘ μž…λ‹ˆλ‹€. 도메인 주도 μ„€κ³„λŠ” 도메인 전문가와 개발자 κ°„μ˜ ν˜‘μ—…μ„ κ°•μ‘°ν•˜κ³ , 도메인 λͺ¨λΈλ§μ„ 톡해 문제 μ˜μ—­μ„ μ΄ν•΄ν•˜κ³  μ„€κ³„ν•˜λŠ” 방식을 μΆ”κ΅¬ν•©λ‹ˆλ‹€.

μ•„ν‚€ν…μ²˜ ꡬ성

μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ UI λ˜λŠ” ν‘œν˜„ Presentation

  • μ‚¬μš©μžμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  μ‚¬μš©μžμ—κ²Œ 정보λ₯Ό 보여쀀닀. μ—¬κΈ°μ„œ μ‚¬μš©μžλŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬λžŒλΏλ§Œ μ•„λ‹ˆλΌ μ™ΈλΆ€ μ‹œμŠ€ν…œμΌ μˆ˜λ„ μžˆλ‹€.

μ‘μš© Application

  • μ‚¬μš©μžκ°€ μš”μ²­ν•œ κΈ°λŠ₯을 μ‹€ν–‰ν•œλ‹€. 업무 λ‘œμ§μ„ 직접 κ΅¬ν˜„ν•˜μ§€ μ•ŠμœΌλ©° 도메인 계측을 μ‘°ν•©ν•΄μ„œ κΈ°λŠ₯을 μ‹±ν–‰ν•œλ‹€

도메인

  • μ‹œμŠ€ν…œμ΄ μ œκ³΅ν•  도메인 κ·œμΉ™μ„ κ΅¬ν˜„ν•œλ‹€.

μΈν”„λΌμŠ€νŠΈλŸ­μ²˜ infrastructure

  • λ°μ΄νŠΈλ² μ΄μŠ€λ‚˜ λ©”μ‹œμ§• μ‹œμŠ€ν…œκ³Ό 같은 μ™ΈλΆ€ μ‹œμŠ€ν…œκ΄€μ˜ 연동을 μ²˜λ¦¬ν•œλ‹€

엔티티와 λ°Έλ₯˜

μ—”ν‹°ν‹°

  • μ—”ν‹°ν‹°λŠ” 식별 κ°€λŠ₯ν•˜κ³  λ³€κ²½ κ°€λŠ₯ν•œ κ°œλ…μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ—”ν‹°ν‹°λŠ” 주둜 고유 μ‹λ³„μžλ₯Ό κ°€μ§€λ©°, κ·Έ μ‹λ³„μžλ₯Ό 기반으둜 λ„λ©”μΈμ—μ„œ μ‹λ³„λ©λ‹ˆλ‹€.

    • 예λ₯Ό λ“€μ–΄, 고객(Customer) μ—”ν‹°ν‹°λŠ” 고객의 κ³ μœ ν•œ μ‹λ³„μžλ‘œ 식별될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ—”ν‹°ν‹°λŠ” κ³ μœ ν•œ μ‹λ³„μžμ— μ˜ν•΄ μ‹λ³„λ©λ‹ˆλ‹€. μ—”ν‹°ν‹°μ˜ 속성이 λ³€κ²½λ˜λ”λΌλ„ μ‹λ³„μžκ°€ μœ μ§€λ˜λ©΄ μ—¬μ „νžˆ 같은 μ—”ν‹°ν‹°λ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€.

    • 예λ₯Ό λ“€μ–΄, 고객의 이름이 λ³€κ²½λ˜λ”λΌλ„ μ‹λ³„μžλ‘œ 고객을 식별할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ—”ν‹°ν‹°λŠ” λ³€κ²½ κ°€λŠ₯ν•œ μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 도메인 κ·œμΉ™μ— 따라 μ—”ν‹°ν‹°μ˜ 속성이 λ³€κ²½λ˜κ³ , μ—”ν‹°ν‹°μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ—”ν‹°ν‹°λŠ” λ„λ©”μΈμ—μ„œ 개체(Entity)λ‘œμ„œ μ€‘μš”ν•œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ—”ν‹°ν‹°λŠ” λ„λ©”μΈμ˜ 핡심 κ°œλ…μ„ ν‘œν˜„ν•˜κ³  도메인 κ·œμΉ™μ„ μ μš©ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

λ°Έλ₯˜

  • λ°Έλ₯˜λŠ” λ³€κ²½ λΆˆκ°€λŠ₯ν•˜κ³  동등성(Equality)을 κΈ°μ€€μœΌλ‘œ λΉ„κ΅λ©λ‹ˆλ‹€. λ°Έλ₯˜λŠ” 주둜 λ„λ©”μΈμ—μ„œ κ°œλ…μ μΈ 속성을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

    • 예λ₯Ό λ“€μ–΄, μ£Όμ†Œ(Address) κ°’ κ°μ²΄λŠ” 일련의 속성(λ„μ‹œ, 우편번호 λ“±)을 κ°€μ§€κ³  있으며, 두 μ£Όμ†Œκ°€ λ™μΌν•œ 속성을 κ°€μ§€λ©΄ λ™λ“±ν•˜λ‹€κ³  νŒλ‹¨λ©λ‹ˆλ‹€.

private String city; // λ„μ‹œ
private String zipCode; // 우편번호

// ===>

public class Address {
    private String city;
    private String zipCode;
}
  • λ°Έλ₯˜λŠ” κ·Έ 자체둜 μ‹λ³„λ˜μ§€ μ•Šκ³ , μ†μ„±μ˜ μ‘°ν•©μœΌλ‘œ μ‹λ³„λ©λ‹ˆλ‹€. λ°Έλ₯˜λŠ” 속성이 λ³€κ²½λ˜λ©΄ μƒˆλ‘œμš΄ κ°’ 객체둜 μ·¨κΈ‰λ©λ‹ˆλ‹€.

    • 예λ₯Ό λ“€μ–΄, μ£Όμ†Œμ˜ 속성이 λ³€κ²½λ˜λ©΄ μƒˆλ‘œμš΄ μ£Όμ†Œ 객체가 μƒμ„±λ©λ‹ˆλ‹€.

  • λ°Έλ₯˜λŠ” λ³€κ²½ λΆˆκ°€λŠ₯ν•œ(Immutable) 속성을 κ°€μ§‘λ‹ˆλ‹€. λ°Έλ₯˜μ˜ 속성은 생성 μ‹œμ μ— κ²°μ •λ˜κ³  μ΄ν›„μ—λŠ” λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ°Έλ₯˜μ˜ 속성을 λ³€κ²½ν•˜λ €λ©΄ μƒˆλ‘œμš΄ κ°’ 객체λ₯Ό 생성해야 ν•©λ‹ˆλ‹€.

  • λ°Έλ₯˜λŠ” λ„λ©”μΈμ—μ„œ κ°œλ…μ μΈ 속성을 λ‚˜νƒ€λ‚΄λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. λ°Έλ₯˜λŠ” λ„λ©”μΈμ˜ νŠΉμ • 속성을 ν‘œν˜„ν•˜κ³ , κ°’μ˜ λ³€κ²½μ΄λ‚˜ 동등성 비ꡐ에 μ‚¬μš©λ©λ‹ˆλ‹€.

도메인 μ˜μ—­μ˜ μ£Όμš” κ΅¬μ„±μš”μ†Œ

μ—”ν‹°ν‹°(ENTITY)

  • 고유의 μ‹λ³„μžλ₯Ό κ°–λŠ” 객체둜 μžμ‹ μ˜ 라이프 사이클을 κ°–λŠ”λ‹€. μ£Όλ¬Έ(Order), νšŒμ›(Member), μƒν’ˆ(Product)κ³Ό 같이 λ„λ©”μΈμ˜ κ³ μœ ν•œ κ°œλ…μ„ ν‘œν˜„ν•œλ‹€. 도메인 λͺ¨λΈμ˜ 데이터λ₯Ό ν¬ν•¨ν•˜λ©° ν•΄λ‹Ή 데이터와 κ΄€λ ¨λœ κΈ°λŠ₯을 ν•¨κ»˜ μ œκ³΅ν•œλ‹€.

λ°Έλ₯˜(VALUE)

  • 고유의 μ‹λ³„μžλ₯Ό κ°–μ§€ μ•Šμ€ 객체둜 주둜 κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜μΈ 값을 ν‘œν˜„ν•  λ•Œ μ‚¬μš©λœλ‹€. 배솑지 μ£Όμ†Œλ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ μ£Όμ†Œ(Address)λ‚˜ ꡬ맀 κΈˆμ•‘μ„ μœ„ν•œ κΈˆμ•‘(Meney)와 같은 νƒ€μž…μ΄ λ°Έλ₯˜ νƒ€μž…μ΄λ‹€. μ—”ν‹°ν‹°μ˜ μ†μ„±μœΌλ‘œ μ‚¬μš©ν•  뿐만 μ•„λ‹ˆλΌ λ‹€λ₯Έ λ°Έλ₯˜ νƒ€μž…μ˜ μ†μ„±μœΌλ‘œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μ• κ·Έλ¦¬κ±°νŠΈ(AGGREGATE)

  • μ• κ·Έλ¦¬κ±°νŠΈλŠ” μ—°κ΄€λœ 엔티티와 λ°Έλ₯˜ 객체λ₯Ό κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜λ‘œ 묢은 것이닀. 예λ₯Ό λ“€μ–΄ μ£Όλ¬Έκ³Ό κ΄€λ ¨λœ Order μ—”ν‹°ν‹°, OrderLine λ°Έλ₯˜, Orderer λ°Έλ₯˜ 객체λ₯Ό 'μ£Όλ¬Έ' μ• κ·Έλ¦¬κ±°νŠΈλ‘œ 묢을 수 μžˆλ‹€.

리포지터리(REPOSITORY)

  • 도메인 λͺ¨λΈμ˜ μ˜μ†μ„±μ„ μ²˜λ¦¬ν•œλ‹€. 예λ₯Ό λ“€μ–΄ DBMS ν…Œμ΄λΈ”μ—μ„œ μ—”ν‹°ν‹° 객체λ₯Ό λ‘œλ”©ν•˜κ±°λ‚˜ μ €μž₯ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

도미엔 μ„œλΉ„μŠ€(DOMAN SERVICE)

  • νŠΉμ • 엔티티에 μ†ν•˜μ§€ μ•Šμ€ 도메인 λ‘œμ§μ„ μ œκ³΅ν•œλ‹€. '할인 κΈˆμ•‘ 계산'은 μƒν’ˆ, 쿠폰, νšŒμ› λ“±κΈ‰, ꡬ맀 κΈˆμ•‘ λ“± λ‹€μ–‘ν•œ 쑰건을 μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν•˜κ²Œ λ˜λŠ”λ°, μ΄λ ‡κ²Œ 도메인 둜직이 μ—¬λŸ¬ 엔티티와 λ°Έλ₯˜λ₯Ό ν•„μš”λ‘œ ν•˜λ©΄ 도메인 μ„œλΉ„μŠ€μ—μ„œ λ‘œμ§μ„ κ΅¬ν˜„ν•œλ‹€.

λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ(Bounded Context)

λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ(Bounded Context)λŠ” 도메인 주도 섀계(Domain-Driven Design)μ—μ„œ μ€‘μš”ν•œ κ°œλ… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ„ μž‘μ€ 도메인 λͺ¨λΈλ‘œ λΆ„ν• ν•˜λŠ” 기술적 κ·Έλ£Ήν™”λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 각 λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” νŠΉμ • λΉ„μ¦ˆλ‹ˆμŠ€ 도메인과 κ΄€λ ¨λœ κΈ°λŠ₯, κ·œμΉ™, ν”„λ‘œμ„ΈμŠ€ 등을 ν¬ν•¨ν•˜κ³ , ν•΄λ‹Ή 도메인에 λŒ€ν•œ λͺ…ν™•ν•œ 경계λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

νŠΉμ§•

경계:

  • 각 λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” νŠΉμ • 도메인을 λ‚˜νƒ€λ‚΄λ©°, ν•΄λ‹Ή λ„λ©”μΈμ˜ 경계λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μ„œλ‘œ λ‹€λ₯Έ λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” λ…λ¦½μ μœΌλ‘œ 개발, 배포 및 관리될 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λΈ:

  • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” νŠΉμ • 도메인에 λŒ€ν•œ λͺ¨λΈμ„ ν¬ν•¨ν•©λ‹ˆλ‹€. 이 λͺ¨λΈμ€ λ„λ©”μΈμ˜ 핡심 κ°œλ…, μ—”ν‹°ν‹°, κ°’ 객체, μ• κ·Έλ¦¬κ²Œμ΄νŠΈ 등을 ν¬ν•¨ν•˜λ©°, ν•΄λ‹Ή 도메인에 ν•„μš”ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™κ³Ό λ‘œμ§μ„ λ°˜μ˜ν•©λ‹ˆλ‹€.

μœ λΉ„μΏΌν„°μŠ€ μ–Έμ–΄:

  • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” νŠΉμ • 도메인을 μ΄ν•΄ν•˜κΈ° μœ„ν•œ 곡톡 언어인 μœ λΉ„μΏΌν„°μŠ€ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μœ λΉ„μΏΌν„°μŠ€ μ–Έμ–΄λŠ” 도메인 μ „λ¬Έκ°€, 개발자, μ‚¬μš©μž λ“± λͺ¨λ“  μ΄ν•΄κ΄€κ³„μžλ“€μ΄ μ‚¬μš©ν•  수 μžˆλŠ” 곡유 μ–Έμ–΄μž…λ‹ˆλ‹€.

μ»¨ν…μŠ€νŠΈ λ§€ν•‘:

  • μ„œλ‘œ λ‹€λ₯Έ λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ κ°„μ—λŠ” μ»¨ν…μŠ€νŠΈ 맀핑을 톡해 μƒν˜Έμž‘μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»¨ν…μŠ€νŠΈ 맀핑은 각 μ»¨ν…μŠ€νŠΈμ˜ 경계λ₯Ό λ„˜μ–΄μ„œ 도메인 이벀트, μš”μ²­, 응닡 등을 κ΅ν™˜ν•˜κ³  데이터 일관성을 μœ μ§€ν•˜λŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.

Architecture

Layered

  • Presentation Laye

    • Presentation LayerλŠ” μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©ν•˜κ³  정보λ₯Ό ν‘œμ‹œν•˜λŠ” λ ˆμ΄μ–΄μž…λ‹ˆλ‹€. μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)와 κ΄€λ ¨λœ κΈ°λŠ₯을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우 HTML, CSS, JavaScriptλ₯Ό μ‚¬μš©ν•˜λ©°, λͺ¨λ°”일 μ•±μ΄λ‚˜ λ°μŠ€ν¬ν†± μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” ν•΄λ‹Ή ν”Œλž«νΌμ˜ UI μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • Application Layer

    • Application LayerλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” λ ˆμ΄μ–΄μž…λ‹ˆλ‹€. μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ 핡심 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³ , μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•˜μ—¬ 도메인 λ ˆμ΄μ–΄λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. 이 λ ˆμ΄μ–΄λŠ” λ„λ©”μΈμ˜ 핡심 κ°œλ…μ„ μ΄ν•΄ν•˜κ³  λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μ μš©ν•©λ‹ˆλ‹€.

  • Domain

    • Domain LayerλŠ” Layered Architectureμ—μ„œ μ€‘μš”ν•œ λΆ€λΆ„μž…λ‹ˆλ‹€. 도메인 λ ˆμ΄μ–΄λŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ˜ 핡심을 λŒ€ν‘œν•©λ‹ˆλ‹€. 도메인 λͺ¨λΈ, μ—”ν‹°ν‹°, κ°’ 객체, μ• κ·Έλ¦¬κ²Œμ΄νŠΈ λ“±μ˜ κ°œλ…μ„ ν¬ν•¨ν•˜λ©°, 도메인 κ·œμΉ™κ³Ό 도메인 νŠΉν™” λ‘œμ§μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

  • Infrastructure

    • Data Access LayerλŠ” λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•˜λŠ” λ ˆμ΄μ–΄μž…λ‹ˆλ‹€. 데이터 μ•‘μ„ΈμŠ€, 데이터 μ‘°μž‘, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μ—°κ²° 등을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 이 λ ˆμ΄μ–΄λŠ” 데이터 μ €μž₯μ†Œμ™€μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³ , μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ 데이터 μš”κ΅¬λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.

Clean

  • μ—”ν‹°ν‹°(Entity):

    • μ—”ν‹°ν‹°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ ν¬ν•¨ν•˜λŠ” κ°€μž₯ μ•ˆμͺ½ λ ˆμ΄μ–΄μž…λ‹ˆλ‹€. 도메인 λͺ¨λΈμ„ κ΅¬μ„±ν•˜κ³  λΉ„μ¦ˆλ‹ˆμŠ€ 도메인 λ‘œμ§μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. μ—”ν‹°ν‹°λŠ” μ‹œμŠ€ν…œμ˜ λ‹€λ₯Έ λ ˆμ΄μ–΄μ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

  • μœ μŠ€μΌ€μ΄μŠ€(Use Case):

    • μœ μŠ€μΌ€μ΄μŠ€ λ ˆμ΄μ–΄λŠ” 엔티티에 μ˜μ‘΄ν•˜λ©°, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  엔티티에 λŒ€ν•œ μ‘°μž‘μ„ μ œμ–΄ν•©λ‹ˆλ‹€. μœ μŠ€μΌ€μ΄μŠ€ λ ˆμ΄μ–΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ • κΈ°λŠ₯ λ˜λŠ” μ‚¬μš© 사둀에 ν•΄λ‹Ήν•˜λŠ” μ½”λ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

  • μΈν„°νŽ˜μ΄μŠ€(Interface):

    • μΈν„°νŽ˜μ΄μŠ€ λ ˆμ΄μ–΄λŠ” μ‚¬μš©μžμ™€ μ‹œμŠ€ν…œ κ°„μ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ΄λŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI), μ›Ή API, CLI(Command Line Interface) 등을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€ λ ˆμ΄μ–΄λŠ” μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„ μœ μŠ€μΌ€μ΄μŠ€ λ ˆμ΄μ–΄λ‘œ μ „λ‹¬ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό μ‚¬μš©μžμ—κ²Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • ν”„λ ˆμž„μ›Œν¬ 및 λ“œλΌμ΄λ²„(Frameworks and Drivers):

    • ν”„λ ˆμž„μ›Œν¬ 및 λ“œλΌμ΄λ²„ λ ˆμ΄μ–΄λŠ” μ™ΈλΆ€ μš”μ†Œμ™€μ˜ 연동을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€, μ›Ή ν”„λ ˆμž„μ›Œν¬, μ„œλ“œνŒŒν‹° 라이브러리 λ“±κ³Όμ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. 이 λ ˆμ΄μ–΄λŠ” λ‚΄λΆ€μ˜ μ•ˆμͺ½ λ ˆμ΄μ–΄μ— λŒ€ν•œ μ˜μ‘΄μ„±μ„ κ°€μ§€λ©°, μ™ΈλΆ€ μš”μ†Œμ— λŒ€ν•œ μ„ΈλΆ€ κ΅¬ν˜„μ„ μΊ‘μŠν™”ν•©λ‹ˆλ‹€.

Hexagonal

  • μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(User Interface):

    • μ‚¬μš©μžμ™€ μ‹œμŠ€ν…œ κ°„μ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›κ³ , 좜λ ₯을 ν‘œμ‹œν•˜λŠ” λ“±μ˜ 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

  • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜(Application):

    • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν¬ν•¨ν•˜κ³  있으며, μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°μ˜ μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ΄λŠ” μ‹œμŠ€ν…œμ˜ 핡심 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.

  • 포트(Ports):

    • μ™ΈλΆ€ μš”μ†Œμ™€μ˜ μƒν˜Έμž‘μš©μ„ μΆ”μƒν™”ν•©λ‹ˆλ‹€. 주둜 μΈν„°νŽ˜μ΄μŠ€λ‘œμ¨ 역할을 ν•˜λ©°, μ™ΈλΆ€ μ‹œμŠ€ν…œμ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ λ“±κ³Όμ˜ 톡신을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • μ–΄λŒ‘ν„°(Adapters):

    • ν¬νŠΈμ™€ μ‹€μ œ κ΅¬ν˜„μ²΄ κ°„μ˜ 연결을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. μ–΄λŒ‘ν„°λŠ” 포트λ₯Ό κ΅¬ν˜„ν•˜κ³ , ν•΄λ‹Ή 포트λ₯Ό 톡해 μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Ό μƒν˜Έμž‘μš©ν•©λ‹ˆλ‹€.

  • 도메인(Domain):

    • λΉ„μ¦ˆλ‹ˆμŠ€ λ„λ©”μΈμ˜ 핡심 κ·œμΉ™κ³Ό κ°œλ…μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. 도메인은 μ‹œμŠ€ν…œμ˜ 핡심 λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λ©°, λΉ„μ¦ˆλ‹ˆμŠ€μ˜ 본질적인 νŠΉμ„±μ„ ν‘œν˜„ν•©λ‹ˆλ‹€.

  • μΈν”„λΌμŠ€νŠΈλŸ­μ²˜(Infrastructure):

    • λ°μ΄ν„°λ² μ΄μŠ€, μ™ΈλΆ€ μ„œλΉ„μŠ€, μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 톡신 λ“±κ³Ό 같이 μ‹œμŠ€ν…œμ˜ 인프라λ₯Ό κ΅¬μ„±ν•˜λŠ” μš”μ†Œλ“€μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

Reference

μ±…: 도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - μ΅œλ²”κ· 

Last updated 1 year ago

Was this helpful?

γ„·γ„·γ„·: Domain Driven Designκ³Ό 적용 μ‚¬λ‘€κ³΅μœ  / if(kakao)2022