ApplicationArchitecture (AA)

Hexagonal Architecture와 Domain Driven Development 개념 및 구현 방법 정리

짱구네 2024. 9. 4. 13:24
728x90
반응형

일단 정리하기에 앞서, SpringBoot, Java 17, Mybatis, Postgresql 정도로 프레임워크를 만들었다.
프런트는 화면에서 뿌려주는 데이터만 표시하고 링크 정도로만 구현할 거라 html로 정했다.
파일 구조는 아래와 같다.

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           ├── api                # API Layer (REST Controllers)
│   │           │   └── EntityController.java
│   │           ├── application        # Application Layer (Service Interfaces and Implementations)
│   │           │   ├── EntityService.java
│   │           │   └── EntityServiceImpl.java
│   │           ├── domain             # Domain Layer (Business Logic and Domain Models)
│   │           │   └── Entity.java
│   │           └── infrastructure     # Infrastructure Layer (Database Access and Repository Implementations)
│   │               ├── EntityMapper.java
│   │               └── TcpClient.java
│   └── resources
│       ├── application.properties
│       └── mybatis
│           └── mappers
│               └── EntityMapper.xml
└── test
    └── java
        └── com
            └── example

파일 구조에 대한 설명은 아래와 같다.
헥사고날 아키텍처와 DDD(Domain-Driven Design)는 서로 다른 개념이지만, 둘 다 소프트웨어 설계의 모범 사례를 따르며, 프로젝트 구조에 영향을 미칠 수 있다.
아래는 주어진 프로젝트 구조에서 헥사고날 아키텍처와 DDD의 차이점을 설명해 보고자 한다.
헥사고날 아키텍처와 도메인 주도 설계(DDD)는 소프트웨어 설계의 두 가지 접근 방식이다.
이 두 가지를 구분하여 설명하면 아래와 같다.

헥사고날 아키텍처 (Hexagonal Architecture)

헥사고날 아키텍처는 소프트웨어 시스템을 내부와 외부로 나누고, 이 둘을 포트와 어댑터를 통해 연결하는 방식이다. 이 아키텍처는 시스템의 핵심 비즈니스 로직을 외부의 기술적 요소들로부터 분리하는 것을 목표로 한다.

주요 구성 요소:

  1. 도메인 (Domain): 비즈니스 로직을 포함하는 핵심 부분.
  2. 애플리케이션 (Application): 도메인 로직을 호출하고 조정하는 서비스 계층.
  3. 포트 (Ports): 도메인과 외부 세계를 연결하는 인터페이스.
  4. 어댑터 (Adapters): 포트를 구현하여 외부 시스템과의 통신을 담당.

도메인 주도 설계 (DDD)

도메인 주도 설계는 소프트웨어의 복잡한 도메인 로직을 모델링하고, 이를 중심으로 시스템을 설계하는 접근 방식이다.
DDD는 도메인 모델을 중심으로 시스템을 구성하며, 비즈니스 로직을 명확하게 표현하는 것을 목표로 한다.

주요 구성 요소:

  1. 엔티티 (Entity): 고유 식별자를 가지며, 상태와 행동을 포함하는 객체.
  2. 밸류 오브젝트 (Value Object): 불변 객체로, 고유 식별자가 없으며, 속성으로만 비교됨.
  3. 애그리게이트 (Aggregate): 엔티티와 밸류 오브젝트의 집합으로, 일관성을 유지하는 단위.
  4. 리포지토리 (Repository): 애그리게이트를 저장하고 조회하는 인터페이스.
  5. 서비스 (Service): 도메인 로직을 캡슐화하는 객체.

프로젝트 구조에서의 구분

주어진 프로젝트 구조를 헥사고날 아키텍처와 DDD 관점에서 구분해면 아래와 같다.

헥사고날 아키텍처 관점:

  • 도메인 (Domain): domain 패키지 (Entity.java)
  • 애플리케이션 (Application): application 패키지 (EntityService.java, EntityServiceImpl.java)
  • 포트 (Ports): application 패키지의 인터페이스 (EntityService.java)
  • 어댑터 (Adapters): api 패키지 (EntityController.java), infrastructure 패키지 (EntityMapper.java, TcpClient.java)

DDD 관점:

  • 엔티티 (Entity): domain 패키지 (Entity.java)
  • 리포지토리 (Repository): infrastructure 패키지 (EntityMapper.java)
  • 서비스 (Service): application 패키지 (EntityService.java, EntityServiceImpl.java)
  • 애그리게이트 (Aggregate): domain 패키지 (Entity.java가 애그리게이트 루트일 수 있음)
  • 애플리케이션 서비스 (Application Service): application 패키지 (EntityServiceImpl.java)

위 내용을 기반으로 하나의 관점으로 정리하면 아래와 같다.

통합된 관점:

  • 도메인 (Domain): domain 패키지 (Entity.java)
    • 엔티티 (Entity): Entity.java
    • 애그리게이트 (Aggregate): Entity.java (애그리게이트 루트)
  • 애플리케이션 (Application): application 패키지 (EntityService.java, EntityServiceImpl.java)
    • 포트 (Ports): EntityService.java (인터페이스)
    • 애플리케이션 서비스 (Application Service): EntityServiceImpl.java
  • 어댑터 (Adapters):
    • API 어댑터: api 패키지 (EntityController.java)
    • 인프라스트럭처 어댑터: infrastructure 패키지 (EntityMapper.java, TcpClient.java)
      • 리포지토리 (Repository): EntityMapper.java

이와 같이, 헥사고날 아키텍처와 DDD의 구성 요소를 통합하여 소프트웨어 시스템을 설계할 수 있다.

 
추가로, 헥사고날 아키텍처와 도메인 주도 설계(DDD)를 통합하여 사용하는 사례는 많다. 이러한 통합된 접근 방식은 시스템의 유연성과 유지보수성을 높이는 데 도움이 된다. 특히, 복잡한 비즈니스 로직을 다루는 대규모 애플리케이션에서 많이 사용된다.
이러한 통합된 접근 방식은 다음과 같은 장점을 제공한다:

  • 비즈니스 로직의 명확한 분리: 도메인 모델을 중심으로 비즈니스 로직을 명확하게 분리할 수 있다.
  • 유연한 아키텍처: 포트와 어댑터를 통해 외부 시스템과의 통합이 용이하다.
  • 유지보수성 향상: 각 계층이 명확하게 분리되어 있어 변경이 용이하다.
  • 테스트 용이성: 도메인 로직을 독립적으로 테스트할 수 있다.

이러한 이유로 많은 프로젝트에서 헥사고날 아키텍처와 DDD를 통합하여 사용하고 있다.
 
- 끝 -

728x90
반응형