Post
KO

hexagonal 2

Layerd architecture

웹 레이어에서 퍼시스턴스 계층의 의존되고, 도메인 로직이 발생 됨.

테스트 코드 작성의 어려움.

유즈케이스가 감춰지는 것.

  • 새로운 코드를 작성하는 것보다 기존 코드 유지보수 하는 시간이 더 오래 걸리게 된다.

  • 계층형 아키텍처에서는 도메인 로직을 흩어지게 만든다.

Hexagonal architecture

![](/assets/images/posts/222033781320/37476ed0cbdd.png?type=w580) ![](/assets/images/posts/222033781320/acfffe0c34d9.png?type=w580)

구성요소

UseCase

![](/assets/images/posts/222033781320/51a30373ef41.png?type=w580)

  1. 입력값을 받는다

  2. 검증을 한다

  3. 모델 상태를 관리한다

  4. 출력값을 리턴한다

검증

![](/assets/images/posts/222033781320/3fcfeff90a61.png?type=w580)

useCase에서 검증 로직이 수행되어야 한다.

이유는 유즈 케이스 이후로는 애플리케이션 코어로 들어가기 때문이다.

조회 전용(Read-Only) UseCase

![](/assets/images/posts/222033781320/4c8b816613e9.png?type=w580)

책 내용

이런 식으로, 읽기 전용 쿼리는 코드베이스에서 사용 사례 (또는 "명령")를 수정하는 것과 명확하게 구분됩니다. 이것은 CQS (Command-Query Separation) 및 CQRS (Command-Query Responsibility Segregation)와 같은 개념에서 잘 작동합니다. 위의 코드에서 서비스는 실제로 쿼리를 발신 포트로 전달하는 것 외에 다른 작업을 수행하지 않습니다.

의존성 역전의 법칙

![](/assets/images/posts/222033781320/62fcdc28b2d6.png?type=w580) ![](/assets/images/posts/222033781320/5905504880d7.png?type=w580) ![](/assets/images/posts/222033781320/bc0d197fd16b.png?type=w580)

Adapter 구현

![](/assets/images/posts/222033781320/ec35a4838d03.png?type=w580)

지속성 문제에 대해 생각할 필요없이 도메인 코드를 발전시킬 수 있도록 지속성 계층에 코드 의존성이없는 의미의 도메인 코드를 발전시킬 수 있도록이 간접 계층을 추가하고 있음을 상기시켜 보겠습니다.

![](/assets/images/posts/222033781320/d239a504966e.png?type=w580)

![](/assets/images/posts/222033781320/1a7995511737.png?type=w580)
  1. 입력값을 받는다

  2. 데이터베이스 포맷으로 인풋을 변환한다

  3. 데이터베이스로 입력값을 보낸다

  4. 데이터베이스 출력값을 애플리케이션 포멧으로 보낸다

  5. 출력값을 리턴한다

![](/assets/images/posts/222033781320/d4da67ffde51.png?type=w580)

![](/assets/images/posts/222033781320/0f29cea969df.png?type=w580) ![](/assets/images/posts/222033781320/29f80a7b7e03.png?type=w580)

![](/assets/images/posts/222033781320/068f3941e154.png?type=w580)

잘게 나눈 스타일의 추가적인 이득은 병렬적으로 서로 다른 기능을 만들어 낼 수 있다.

서로 다른 기능을 작업하기 때문에 두명 개발자들은 병합으로 인한 충돌이 발생하지 않는다.

pakcage 구조

![](/assets/images/posts/222033781320/2fab44331ac0.png?type=w580) ![](/assets/images/posts/222033781320/339e1be637ca.png?type=w580)

![](/assets/images/posts/222033781320/a5879d85ebef.png?type=w580)

테스팅 전략

![](/assets/images/posts/222033781320/c00a8014e9c6.png?type=w580)

맵핑 전략

![](/assets/images/posts/222033781320/672861aa58d3.png?type=w580) ![](/assets/images/posts/222033781320/36f3f9328a09.png?type=w580) ![](/assets/images/posts/222033781320/4e6f0bbee194.png?type=w580) ![](/assets/images/posts/222033781320/a6b93cf4c9ad.png?type=w580)

![](/assets/images/posts/222033781320/e328d14f3682.png?type=w580) ![](/assets/images/posts/222033781320/256f64b33880.png?type=w580) ![](/assets/images/posts/222033781320/fb562db1c538.png?type=w580)

패키지 검증 툴

![](/assets/images/posts/222033781320/029b067b4326.png?type=w580) ![](/assets/images/posts/222033781320/1a758429c7b1.png?type=w580)

https://www.archunit.org/

![](/assets/images/posts/222033781320/e708f9d4d134.png?type=w580)

테스트 방식

Unit Test

![](/assets/images/posts/222033781320/eb50e702e509.png?type=w580) ![](/assets/images/posts/222033781320/f009c65fec1c.png?type=w580)

Itegration Test

![](/assets/images/posts/222033781320/271dadb729db.png?type=w580) ![](/assets/images/posts/222033781320/4353d3b81b40.png?type=w580)

Persistence Adapter with Integeration Tests

![](/assets/images/posts/222033781320/d9c7005922b3.png?type=w580) ![](/assets/images/posts/222033781320/4059c1180457.png?type=w580)

도메인 중심으로 코드를 작성할 수 있는 것과,

단일 책임 원칙,

인터페이스 분리의 원칙,

의존성 역전의 법칙을 유지하면서 코드가 작성이 가능하다.

또한 이런 헥사고날 아키텍처의 중심엔 도메인이 있다는 것이 더 중요하고,

추후에 경험을 쌓으면 더 나은 아키텍처 스타일을 구축할 수 있지 않을까 라고 저자는 말한다.

좋은 책이다.

This article is licensed under CC BY 4.0 by the author.