헥사고날 아키텍처에서 useCase
와 port
인터페이스의 설계 방식은 개발자들마다 접근 방식이 다를 수 있습니다. 특히 CRUD와 같은 간단한 작업에서는 아래와 같은 방식으로 구현할 수 있습니다:
1. UseCase및 Port는 CRUD에 따라 설계되는가?
UseCase 및 Port 설계
- 개별 UseCase 인터페이스 생성:
- 각 CRUD 작업(Create, Read, Update, Delete)에 대해 개별
UseCase
인터페이스를 만드는 것이 일반적입니다. 예를 들어, CreateOrderUseCase
, ReadOrderUseCase
등으로 각각의 작업을 독립적으로 처리합니다. 이렇게 하면 단일 책임 원칙(Single Responsibility Principle)을 준수할 수 있습니다.
- 각
UseCase
인터페이스는 특정 비즈니스 로직을 캡슐화하며, 이를 통해 명확한 역할과 책임 분리를 할 수 있습니다.
- Port 인터페이스 설계:
Port
인터페이스도 각 작업에 대해 개별적으로 정의하는 것이 좋습니다. 예를 들어, CreateOrderPort
, UpdateOrderPort
등을 만들어서 각 UseCase에서 필요한 외부 시스템과의 상호작용을 정의합니다.
- 이러한 설계는 시스템을 보다 유연하게 만들며, 각 포트가 특정 작업에만 의존하도록 하여 시스템의 변경이 다른 부분에 영향을 미치지 않도록 합니다.
- Service 및 Adapter 구현:
- 서비스 클래스는 보통 각 UseCase 인터페이스를 구현하여 해당 비즈니스 로직을 처리합니다. 이를 통해 각 작업이 독립적으로 구현될 수 있으며, 테스트 및 유지보수가 용이해집니다.
- 어댑터는 포트를 구현하여 외부 시스템과의 실제 상호작용을 처리합니다. 각 어댑터는 특정 포트를 구현하도록 설계되며, 이를 통해 아키텍처가 변경될 때 유연하게 대처할 수 있습니다.
통합 및 결론
- 통합 접근법: 각 UseCase와 Port를 개별적으로 정의하여, 각 서비스와 어댑터가 특정 기능에 집중할 수 있도록 합니다. 이로 인해 시스템의 모듈화가 향상되며, 각 모듈이 독립적으로 개발 및 유지보수될 수 있습니다.
- 비즈니스 로직의 독립성: UseCase 인터페이스와 Port를 통해 비즈니스 로직을 외부 의존성으로부터 분리하여, 도메인 로직이 변화해도 외부 시스템에 미치는 영향을 최소화합니다.
이러한 접근 방식은 시스템의 복잡성을 줄이고, 코드의 가독성과 유지보수성을 높이는 데 기여합니다. 특히, 헥사고날 아키텍처를 적용할 때 각 모듈의 독립성을 강조하는 데 적합한 방법입니다.
2. 구현체는 어떻게 하나? 이것도 CRUD별로 나누나?
헥사고날 아키텍처와 도메인 주도 설계(DDD), 클린 코드 관점에서 서비스 클래스와 어댑터 클래스를 어떻게 구현하는 것이 좋은지에 대해 설명드리겠습니다. 여기서는 여러 유즈케이스와 포트를 구현할 때의 접근 방식을 중점적으로 다룹니다.
서비스 클래스 구현
- 하나의 서비스 클래스에서 여러 유즈케이스 구현