책 <클린 아키텍처>의 [Part2 벽돌부터 시작하기:프로그래밍 패러다임]을 참조하여 정리한 내용입니다.

람다(lambda)계산법을 비롯한 함수형 프로그래밍에 대한 기본적인 이해가 부족하여 본문의 요지만 간략히 정리합니다.

 

가변 변수


함수형 언어에서 변수는 변경되지 않는다.

대표적인 함수형 언어인 클로저와 자바의 극명한 차이는 가변 변수 사용 여부에 있다. 가변 변수는 프로그램 실행 중에 상태가 변할 수 있는 변수이며, 자바 언어는 가변 변수를 사용하는 반면 클로저는 가변 변수를 사용하지 않는다.

아키텍처를 고려할 때 변수의 가변성이 중요한 이유는 경합 조건(Race Condition), 교착상태(Deadlock), 동시성 문제(Concurrent Update)가 모두 가변 변수에 의해서 발생하기 때문이다. 

그러나 불변하는 변수만을 사용하여 프로그램을 만드는 것이 가능할지라도 자원이 한정되어 있다는 점에서 타협이 필요하다. 대표적인 타협안 중 하나는 컴포넌트의 분리다. 즉, 가변 컴포넌트와 불변 컴포넌트를 분리하여 프로그램을 설계하는 것이다.

 

가변성의 분리

프로그램을 구성하는 컴포넌트를 불변과 가변으로 분리할 경우, 하나의 불변 컴포넌트는 하나 이상의 가변 컴포넌트와 통신하도록 설계하며, 가변 컴포넌트는 트랜잭션 메모리와 같은 전략을 사용한다.

 

이벤트 소싱 전략

가변성을 분리하는 방법을 사용한다는 것은 저장공간과 연산 능력의 한계를 전제로 한다. 그런데 만약 이러한 한계가 없다면?  이벤트 소싱은 상태가 아닌 트랜잭션을 저장하는 전략으로서 충분한 저장공간과 연산 능력이 있다면 유효할 수 있는 전략이다

 

요약을 해보자면..

  1. 경합 조건, 교착 상태, 동시성 문제는 가변 변수에 의해서 발생하는 문제이다.
  2. 함수형 패러다임의 가장 큰 특징은 가변 변수를 사용하지 않는다는 것이다.
  3. 자원이 충분하다면 이벤트 소싱 전략을 이용하여 순수 함수형 프로그램을 만들 수 있다.
  4. 그렇지 않다면 컴포넌트를 가변과 불변으로 분리하여 적용해 볼 수 있다.

 

참고 문헌

  • 로버트C.마틴, 클린 아키텍처(소프트웨어 구조와 설계의 원칙), 인사이트, 송준이 옮김, 2019

+ Recent posts