https://github.com/Seungkyu-Han/micro_service_webflux
GitHub - Seungkyu-Han/micro_service_webflux: Webflux 환경에서 MSA의 Saga, Outbox, CQRS를 연습해보기 위한 리포지
Webflux 환경에서 MSA의 Saga, Outbox, CQRS를 연습해보기 위한 리포지토리입니다. - Seungkyu-Han/micro_service_webflux
github.com
기존에 사용하던 Architecture는 보통 DDD였다.
물론 DDD도 굉장히 좋은 설계이지만, 다음과 같은 문제가 있었다.
보통 이렇게 개발이 되는데, 여기서 가장 핵심인 부분은 Domain Layer이다.
다른 Layer에 영향을 최대한 받지 않고, 독립적으로 존재할 수 있어야 가장 좋을 것이다.
하지만 지금은 Data Layer에 종속이 되어 있으며, Data Layer가 변경이 될 때마다 Domain Layer도 수정이 되어야 한다는 문제가 생긴다.
그렇기 때문에 이런 구조를 다음과 같이 변경해보려고 한다.
Domain Layer에서 사용할 Data Layer의 인터페이스만 만들어두고, 해당 인터페이스는 Data Layer에서 하는 것이다.
Domain Layer에서 사용하는 인터페이스를 포트라고 하고, 해당 인터페이스를 구현하는 객체를 어뎁터라고 한다.
이렇게 Domain Layer에서 포트를 만들고, Data Layer에서 어뎁터로 연결하는 방식을 사용하여 Domain Layer의 독립성을 높이는 방법이 Hexagonal Architecture이다.
이런 방법으로 다른 Layer들이 Domain Layer에 의존하도록 한다.
예를 들어보자면, 결제와 관련된 서비스를 개발하고 있다.
여기서 가장 독립적인 모듈은 domain인 payment-domain이다.
이런 식으로 포트를 만든다.
여기서 포트는 입력으로 들어오는 포트와 나는 출력 포트가 있다.
입력으로 들어오는 포트는 domain layer에서 기존처럼 개발 할 수 있다.
어차피 상위 layer에서 해당 포트를 사용하는 구조이기 때문이다.
출력으로 나가는 포트는 여기서 구현하는 것이 아닌, 인터페이스만 만들어두고 해당 인터페이스를 사용해서 domain layer를 개발한다.
이런 식으로 인터페이스만 만들어 사용한다.
해당 인터페이스의 구현은 외부 persistence 모듈이다.
이런 식으로 어뎁터 클래스를 만들고
dependency injection을 통해 외부에서 구현한 repository를 주입해준다.
message와 관련한 kafka도 데이터베이스와 같다.
이런 식으로 설계한다면, domain layer는 어떤 모듈도 의존하지 않는 가장 독립적인 상태로 개발이 가능하다.
'MSA' 카테고리의 다른 글
MSA에 CQRS 패턴 적용하기 (0) | 2025.03.01 |
---|---|
MSA에 Outbox 패턴 적용하기 (0) | 2025.02.28 |
MSA에 SAGA 패턴 적용하기 (0) | 2025.02.24 |
Spring + Kafka에서 avro 사용하기 (1) | 2025.02.15 |
DDD의 핵심 요소 (0) | 2025.02.14 |