emiling / TIL

RAM → SSD
1 stars 0 forks source link

Hexagonal Architecture #12

Open emiling opened 1 year ago

emiling commented 1 year ago

Hexagonal Architecture

emiling commented 1 year ago

전문 : https://alistair.cockburn.us/hexagonal-architecture

결국 몇 년이 지난 후에 나는 이 아키텍처가 무엇인지 더 잘 이해하게 되었고 이를 포트와 어댑터 아키텍처로 부르도록 바꿨습니다. 왜냐하면 육각형의 각 면은 포트를 나타내며, 외부 레이어에 있는 것들은 외부 기술들에 대한 프로토콜을 매핑하는 GoF 스타일 어댑터이기 때문입니다. 이 다음에 해야할 일은 "포트"가 무엇으로 구성되는지 좀 더 제대로 정의 내리는 것이라고 생각합니다.

GoF 스타일 어댑터가 뭔데.. 어댑터 패턴 말하는건가? 🤔

emiling commented 1 year ago

이것은 계층형(Layered) 아키텍처를 논하는 표준 토론에 대한 나의 응답입니다.

이 글을 쓰게 된 계기는 4계층 아키텍처 에서 나온 "인프라 계층이란 응용 프로그램 외부 엔티티들(객체 밖의 공간)에 대한 연결을 나타내는 개체가 있는 곳입니다" 라는 단 한 줄이었습니다. 이 줄을 선택한 악의적인 의도는 없으며 이는 표준적인 방법을 정확하게 묘사하고 있습니다. 나는 단지 대안을 제시하여 이 토론이 우리를 어디로 이끌지 보고 싶습니다.

나는 표준 계층형 모델을 더 일반적이라 생각하고 더 쉽게 적용 할 수 있는 모델이라고 생각합니다. 여기서의 "표준 계층형 모델"은 UI → 어플리케이션 → 도메인 → 네트워크 및 데이터베이스를 나타냅니다.

나는 네트워크 혹은 데이터베이스가 화면 앞에 앉아 UI 상으로 일하는 사람과 비교했을 때 크게 다를게 없다고 생각합니다. 사실 나는 의도적으로 차이가 없기를 바랍니다. 저는 특히 화면 앞에 앉아있는 사람들을 테스트 케이스로 가득한 플랫 파일이나 다른 회사로 연결되는 EDI 링크, 대화록 창에서 입력하는 개발자, 다른 로컬 프로그램에 대한 핫 링크로 교체하고 싶습니다. 또한 네트워크와 데이터베이스를 canned script나 로컬 데모 데이터베이스로 교체하거나, 데이터를 바로바로 만들어내는 개발자나 GUI, 혹은 위성 링크로 교체하고 싶습니다.

나는 본질적으로 대칭주의자입니다. 어느 순간 모든 것이 대칭을 이루길 바라며 그 차이점들을 해결하길 바랍니다. 따라서 나는 계층형 모델의 대칭 버전을 만들었고, 여기에서 UI는 프론트(front)가 아니고 DB는 백(back)이 아닙니다. 그냥 둘다 외부(OUTSIDE)에 있습니다. 이제 계층형 아키텍처는 다음과 같습니다.

OUTSIDE <-> transformer <--> ( application  <->  domain )

나는 이걸 동심원 육각형 형태로 그립니다. 왼쪽 위에 사람과 오른쪽 위에 네트워크/DB를 놓고 프린터와 위성, 그리고 내가 생각할 수 있는 모든 것을 놓았습니다. 바깥쪽 육각형의 안쪽에는 더 작은 육각형이 있습니다. 두 육각형 사이에는 변형(transformer) 계층의 변형 객체가 존재합니다. 내부 육각형 안에는 어플리케이션 객체와 도메인 객체가 존재하는데, 이에 대해 어떤 사람들을 계층화 하기를 선호하고 또 어떤 사람들은 계층화하지 않는 것을 선호합니다.

image

어플리케이션은 다음과 같이 동작합니다 : 외부 세계에서 이벤트가 도달합니다. 트랜스포머는 이 이벤트를 사용 가능한 프로시저 호출 혹은 메세지로 변환하여 어플리케이션으로 전달합니다. 어플리케이션은 이러한 입력 장치의 특성을 잘 모릅니다.

이렇게 되면 어플리케이션의 회귀 테스트도 마침내 가능해집니다. "백엔드"(육각형에는 "백엔드"가 없음)에서 네트워크 레이어는 실제로 특정 출력 형식, 즉 사용중인 네트워크나 데이터베이스로 변환하기 위한 또 다른 트랜스포머 계층입니다. 어플리케이션이 화면 앞에 앉아 있는 사람에게 보고할 내용이 있다면, 의미론적으로 의미 있는 메세지를 트랜스포머에게 전달하고, 트랜스포머는 이를 적당한 출력 형식으로 변환합니다. 애플리케이션은 액터의 특성을 실제로 알지 못해도 사방에 있는 트랜스포머와 의미론적으로 건전한 상호작용을 합니다.

육각형의 각 면은 어플리케이션이 외부 세계와 대화하려는 "이유"를 나타냅니다. 이것이 동심원이 아닌 동심육각형인 이유입니다. 제가 그린대로 왼쪽에는 입력 제어 기능이, 오른쪽에는 저장 및 보조 입력 기능이 있습니다 .