단위 테스트 스타일 비교
함수형 아키텍처와 육각형 아키텍처의 관계
출력 기반 테스트로 전환
출력 기반 테스트는 SUT에 입력을 주고 출력을 확인하는 테스트 스타일이다(이 테스트 스타일은 숨은 입출력이 없다고 가정시 SUT 작업의 결과를 반환하는 값뿐임)
상태 기반 테스트는 작업이 완료된 후의 시스템 상태를 확인
통신 기반 테스트는 목을 사용해서 테스트 대상 시스템과 협력자 간의 통신을 검증
단위 테스트의 고전파는 통신 기반 스타일보다 상태 기반 스타일을 선호하며 런던파는 반대를 선호함( 두 분파 모두 출력 기반 테스트를 사용)
출력 기반 테스트가 품질이 가장 좋다(이러한 테스트는 구현 세부 사항에 거의 결합되지 않아 리팩토링 내성이 존재하며 작고 간결하여 유지 보수에 유리함)
상태 기반 테스트는 안정성을 위해 더 신중해야 함
(상태 기반 테스트는 출력 기반 테스트보다 유지 보수가 쉽지 않음 헬퍼 메서드와 값 객체를 사용해 유지 보수성 문제를 완화할 수도 있지만 제거는 불가능)
단위 테스트를 하려면 비공개 상태를 노출하지 않도록 해야함
통신 기반 테스트 역시 안정성을 위해 신중해야함 (앱 경계를 넘어서 외부 환경에 부작용이 보이는 통신만 확인해야함)
통신 기반의 유지 보수성은 출력 기반 테스트 및 상태 기반 테스트와 비교할 때 좋지 않음(목은 공간을 많이 차지하는 경향이 있어서 테스트 가독성이 떨어짐)
함수형 프로그래밍은 수학적 함수로 된 프로그래밍임
(수학적 함수는 명시적이므로 테스트 용이성을 상당히 높인다)
수학적 함수는 숨은 입출력이 없는 함수(또는 메서드)이며 부작용과 예외가 숨은 출력에 해당함(내부 상태 또는 외부 상태에 대한 참조는 숨은 입력에 해당함)
함수형 프로그래밍의 목표는 비즈니스 로직과 부작용을 분리하는것임
함수형 아키텍처는 부작용을 비즈니스 연산의 가장자리로 밀어내 분리를 이루는데 도움을 줌
(해당 방법으로 부작용을 다루는 코드를 최소화하면서 순수 함수 방식으로 작성된 코드의 양을 최대화 가능)
함수형 아키텍처는 모든 코드를 함수형 코어와 가변 셸이라는 두 가지 범주로 나눔
(가변 셸은 입력 데이터를 함수형 코어에 공급하고, 코어가 내린 결정을 부작용으로 변환)
함수형 아키텍처와 육각형 아키텍처의 차이는 부작용의 처리에 있다
함수형 아키텍처: 모든 부작용을 도메인 계층 밖으로 밀어냄
육각형 아키텍처: 도메인 계층에만 한정돼 있는 한은 도메인 계층에 의해 만들어진 부작용도 괜찬음
함수형 아키텍처와 전통적인 아키텍처 사이의 선택은 성능과 코드 유지 보수성 사이의 절충이며,
함수형 아키텍처는 유지 보수성 향상을 위해 성능을 희생함
모든 코드베이스를 함수형 아키텍처로 전환할 수는 없다
따라서 함수형 아키텍쳐를 전략적으로 적용해야한다
시스템 복잡도와 중요성을 고려하라
(코드베이스가 단순하거나 그렇게 중요하지 않으면, 함수형 아키텍처에 필요한 초기 투자는 별 효과가 없다)