역사

여러가지 의미로 함수형 프로글밍이라는 개념은 프로그래밍 그 자체보다 앞서 등장했다고 한다.

함수형 프로그램의 언어

함수형 프로그램을 직접적으로 지원하는 언어가 존재한다. 클로저 언어와 함수형 프로그래밍을 보다 자세힌 다루지 않는다. ( 클로저.. ?? 롤 프로게이머 ㅎ.. 나아중에 알아보도록 하자 )

클로저와 자바 프로그램의 극단적인 차이

자바는 가변변수 ( mutable variable ) 을 사용하는데 이는 즉 프로그램이 실행 중에 상태가 변할 수 있다는 것 이다 ( 예를들어 for 문의 i 값 같은 경우 )

하지만 클로저 프로그램에는 가변 변수가 전혀 존재하지 않는다.

불변성과 아키텍처

왜 이러한 불변성이 중요할까? 경합 ( Race ), 조건 , 교착상태 ( Deadlock ), 동시 업데이트 ( Concurrent update ) 해당 문제들은 모두 가변 변수로 인해 발생한다고 한다..! ( 헉..! 진짜 맞말… 이중 아는건 데드락 밖에 없지만 ,,, )

다시 말해 동시성 애플리케이션에서 마주치는 모든 문제 , 즉 다수의 스레드와 프로세스를 사용하는 애플리케이션에서 마주치는 모든 문제는 가변 변수가 없다면 절대로 생기지 않는다..!

그렇다면 불변성을 정말 실현 가능할까??? 물론 가능하지만 저장 공간이 무한대가 아니라면 일종의 타협을 해야 한다.

가변성의 분리

타협 중 하나는 애플리케이션 또는 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일이다.

불변 컴포넌트에서는 어떠한 가변 변수도 사용되지 않으며 변수의 상태를 변경할 수 있는 순수 함수형 컴포넌트가 아닌 하나 이상의 다른 컴포넌트와 서로 통신한다..? ( ㅇㅁㅇ.. 무슨 말이지 감이 안잡히네.. 가변 변수를 안 쓸수가 있나.. ? )

상태 변경은 컴포넌트를 갖가지 동시성 문제에 노출하는 꼴이라서 트랜잭션 메모리 Transctional Memory 와 같은 실천법을 사용해서 동시 업데이트와 경합 조건 문제로부터 가변 변수를 보호한다고 한다. ( ㅇ..아하.. 그.. 그렇군요.. 완벽히.. 이해했어… 아마 클로저 언어를 공부해야 좀 이해가 쉬울듯 )

아무튼! 애플리케이션을 제대로 구조화 하려면 불변 컴포넌트와 가변 컴포넌트를 분리해야 하며 이를 위해서는 가변 변수들을 보호하는 적절한 수단을 동원해서 뒷받침 해야한다.

현명한 아키텍트라면 가능한 한 많은 처리를 불변 컴포넌트로 옮겨야 하고 , 가변 컴포넌트에서는 가능한 한 많은 코드를 빼내야 한다.

이벤트 소싱

저장 공간과 처리 능력의 한계는 우리의 시야에서 급격히 사라지고 있으며 더 많은 메모리를 확보할수록, 기계가 더 빨라질수록 , 필요한 가변 상태는 더 적어진다.

은행 어플을 생각해보자 , 이 어플에서는 입금 트랜잭션과 출금 트랜잭션이 실행되면 잔고를 변경해야 한다