클린아키텍쳐
함수형 프로그래밍
함수형 프로그래밍 개념은 프로그래밍 그 자체보다 앞서 등장했다.
이 패러다임에서 핵심이 되는 기반은 람다 계산법으로 알론조 처치가 1930년대 발명했다
클로저와 자바의 극단적인 차이를 집어보면 자바는 가변변수를 사용하는데 클로저는 불변변수를 사용한다.
함수형 언어에서 변수는 변경되지 않는다.
불변성과 아키텍처
아키텍처를 고려 할때 이러한 내용이 왜 중요한가?
경합조건, 교착상태조건, 동시업데이트 문제가 모두 가변변수로 인해 발생하기 때문이다.
다시 말해 우리가 동시성 애플리케이션에서 마주치는 모든문제는 가변변수가 없다면 절대 생기지 않는다.
아키텍트라면 동시성 문제에 지대한 관심을 가져야만 한다. 자원이 무한대라면 불변성이 실현 가능하겠지만 아니라면 대답은 미묘하다.
가변성의 분리
불변성과 관련하여 가장 주요한 타협 중 하나는 가변 컴포넌트와 불변 컴포넌트로 분리하는일이다.
불변 컴포넌트에서는 순수하게 함수형 방식으로만 작업이 처리되며, 어떤 가변 변수도 사용되지 않는다.
불면 컴포넌트는 하나이상의 다른 컴포넌트와 서로 통신한다.
상태변경은 컴포넌트를 갖가지 동시성 문제에 노출하는 꼴이므로,
흔히 트랜젝션 메모리와 같은 실천법을 사용하여 동시 업데이트와 경합 조건 문제로부터 가변변수를 보호한다.
가능한 한 많은 처리를 불변 컴포넌트로 옮겨야 하고, 가변 컴포넌트에서는 가능한 한 많은 코드를 빼야 된다.
이벤트 소싱
이벤트 소싱은 상태가 아닌 트랜젝션을 저장하자는 전략이다. 결과적으로 애플리케이션은 CRUD가 아니라 CR만 수행한다.
소스코드 버전관리 시스템이 정확히 이방식으로 동작한다.
결론
- 구조적 프로그래밍은 제어흐름의 직접적인 전환에 부과되는 규율이다.
- 객체 지향 프로그래밍은 제어흐름의 간접적인 전환에 부과되는 규율이다.
- 함수형 프로그래밍은 변수 할당에 부과되는 규율이다.
이들 세 패러다임 모두 우리에게서 무언가를 앗아갔다.
소프트웨어 즉 컴퓨터 프로그램은 순차, 분기, 반복, 참조로 구성된다.