- Published on
2024.04.10
[함수형 코딩] - 18. 반응형 아키텍처와 어니언 아키텍처
반응형 아키텍처
애플리케이션을 구조화하는 방법, 반응형 아키텍처의 핵심 원칙은 이벤트에 대한 반응으로 일어날 일을 지정하는 것.
코드의 순차적 액션의 순서를 뒤집는다. 반응형 아키텍처를 통해 기존 핸들러 함수가 순서대로 실행되던 것을 여러 개의 핸들러에서 실행되도록 나눈다.
반응형 아키텍처가 미치는 3가지 영향
- 원인과 효과가 결합한 것을 분리한다
- 여러 단계를 파이프라인으로 처리한다
- 타임라인이 유연해진다
감시자
다른 이름: 감시자, 이벤트 핸들러, 옵저버, 콜백, 리스너
원인과 효과의 결합 분리
일반적인 아키텍처라면 원인이 되는 행동과 그로 인해 발생하는 효과가 결합되어 있어, 상태를 바꾸는 모든 이벤트 핸들러에 같은 코드를 넣어줘야 한다.
하지만, 반응형 아키텍처를 사용하면 원인과 효과가 결합한 것을 분리해 어떤 원인에 의해 상태가 변경되더라도 그에 따른 효과가 발생한다.
책에서의 장바구니 예제처럼 장바구니를 바꾸는 방법이 5가지가 있다고 하고, 그로 인해 해야 하는 액션이 4가지가 있다고 하면 총 20가지의 경우를 관리해야 한다. 원인이나 효과가 늘어나면 관리해야 할 것이 늘어난다. 이럴 때, 반응형 아키텍처를 통해 원인과 효과를 분리하여 원인이 있는 곳과 효과가 있는 곳의 관심사를 나눌 수 있다. 이는 원인과 효과의 중심이 있어야 하고, 그렇지 않다면 반드시 원인과 효과를 분리해야 하는 것은 아니다. 액션을 순서대로 표현하는 것이 더 명확할 수도 있다.
여러 단계를 파이프라인으로 처리
파이프라인: 작은 액션과 계산을 조합한 하나의 액션
어떤 일이 발생하는 여러 단계가 있다면 파이프라인으로 처리하는 것이 좋다. 각 단계에서 생성된 데이터는 다음 단계의 입력값으로 사용되는데, 데이터를 전달하지 않는다면 이 패턴을 사용하지 않는 것이 좋다. 데이터를 전달하지 않으면 파이프라인이라고 볼 수 없다.
타임라인이 유연해진다
여러 개의 순차적인 액션으로 이루어진 긴 타임라인이 여러 개의 짧은 타임라인으로 분리되어 타임라인이 유연해진다. 그러나 타임라인이 많아지는 것이 좋은 것만은 아니다.
어니언 아키텍처
어니언 아키텍처는 서비스 전체를 구성하는 데 사용되며, 바깥 세계와 상호작용 하는 부분을 다룬다. 구성 상, 반응형 아키텍처는 어니언 아키텍처 안에 들어 있지만 서로 의존하지는 않는다.
둥글게 쌓인 양파 모양을 하고 있으며, 가장 바깥 쪽에 인터랙션 계층이, 가장 안쪽에 언어 계층이 자리하고 있다.
- 인터랙션 계층
바깥세상에 영향을 주거나 받는 액션 - 도메인 계층
비즈니스 규칙을 정의하는 계산 - 언어 계층
언어 유틸리티와 라이브러리
함수형 시스템이 잘 동작할 수 있는 중요한 규칙
- 현실 세계와 상호작용은 인터랙션 계층에서 해야 한다.
- 계층에서 호출하는 방향은 중심 방향이다.
- 계층은 외부에 어떤 계층이 있는지 모른다.
변경과 재사용이 쉬워야 한다
어니언 아키텍처는 데이터베이스나 API 호출과 같은 외부 서비스(인터랙션 계층)을 바꾸기 쉽다. 가장 높은 계층에서 사용하기 때문이다. (https://github.com/MS-study/FunctionalProgramming/issues/23) 도메인 계층은 외부 서비스에 의존하지 않아 테스트하기 좋다.