반응형
함수형 프로그래밍의 핵심
- 함수형 프로그램과 일반적인 자바 프로그램의 핵심 차이는 변수의 가변성이다.
- 자바 프로그램은 가변 변수를 사용하며, 가변 변수는 프로그램 실행 중에 상태가 변할 수 있다.
- 반면 함수형 프로그램(책에서는 클로저 프로그램을 예시로 들었다)은 가변 변수가 없다. 함수형 언어에서 변수는 변경되지 않는다.
불변성과 아키텍처
- 변수가 가변적이고 불변적인 것이 왜 중요한가? 이유는 대부분의 동시성 문제가 가변적인 변수로 인해 발생하기 때문이다.
- 레이스 컨디션, 데드락 상태, 데이터베이스 동시 업데이트의 문제는 모두 가변 변수로 인해 발생한다.
- 어떠한 변수도 갱신되지 않으면 레이스 컨디션, 데이터베이스 동시 업데이트 문제가 발생하지 않는다.
- 두 문제의 공통점은 하나의 값을 여러 대상이 동시에 바꾸려한다는 것이다. 즉, 갱신이라는 행위가 없으면 동시성 문제도 발생하지 않는다.
- 락이 가변적이지 않다면 데드락 상태가 발생하지 않는다.
- 데드락 상태 역시 둘 이상의 대상이 하나의 자원을 공유하며 락을 서로 번갈아가며 사용하기 때문에 발생한다. 한 대상만 락을 가지고 이 값이 변하지 않으면 데드락 상태가 발생하지 않는다.
- 어떠한 변수도 갱신되지 않으면 레이스 컨디션, 데이터베이스 동시 업데이트 문제가 발생하지 않는다.
- 즉 멀티 프로세싱, 멀티 스레딩 상황에서 발생할 수 있는 모든 문제는 가변 변수가 없다면 발생하지 않는다.
- 그렇다면 이런 문제를 해결하기 위한 불변성은 정말 실현 가능한가? 특정 조건 하에서는 가능하다.
- 저장 공간이 무한해야 하고 프로세서의 속도가 무한히 빨라야한다.
- 이렇게 보니 완벽하게 불변성을 구현하긴 어려워보인다. 대신 약간의 타협을 통해 불변성을 실현할 수 있다.
가변성의 분리
- 불변성과 관련한 가장 주요한 타협 중 하나는 애플리케이션이나 내부 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 것이다.
- 분리된 불변 컴포넌트는 순수하게 함수형 방식으로만 작업을 처리한다. 어떤 가변 변수도 사용되지 않는다.
- 불변 컴포넌트는 하나 이상의 가변 컴포넌트와 통신한다.
- 이 때, 가변 컴포넌트의 상태 변경은 트랜잭셔널 메모리와 같은 방법을 사용해 데이터베이스 동시 업데이트 문제와 레이스 컨디션 문제로부터 가변 변수를 보호한다.
- 애플리케이션을 제대로 구조화하기 위해서는 가변 컴포넌트와 불변 컴포넌트를 분리해야 한다. 또한 이렇게 분리한 상태에서 가변 컴포넌트는 가변 변수를 보호하는 적절한 수단을 동원해 뒷받침해야한다.
- 당연하게도 가능한 한 많은 처리를 불변 컴포넌트에서 담당해야 할 것이다.
이벤트 소싱
- 앞서 언급한대로, 완벽한 불변성을 보장하기 위해서는 무한한 저장 공간과 무한한 처리 능력이 필요하다.
- 그런데, 진짜로 이만큼 필요할까? 애플리케이션이 살아있는 동안만 저장 공간과 처리 능력에 문제가 발생하지 않으면 되지 않을까?
- 이벤트 소싱 패턴은 이러한 생각을 기저에 깔고있다.
- 이벤트 소싱은 상태(결과 값)가 아닌 트랜잭션(이벤트)을 저장하는 전략이다. 상태가 필요해지면 상태의 시작점부터 모든 트랜잭션을 처리한다.
- 은행의 예시를 들면, 입/출금이 발생할 때마다 해당 트랜잭션을 처리하는 것이 아니라, 그런 이벤트가 발생했다는 사실을 저장한다.
- 이후 처리가 필요해지면 저장했던 모든 트랜잭션을 처리해 실제 저장된 금액 값을 변경한다.
- 이벤트 소싱을 사용하기 위해서는 큰 저장 공간이 필요할 것이지만, 우리는 저장 공간의 문제는 없을만큼의 하드웨어적 뒷받침이 된다.
- 중요한 점은 데이터베이스에서 삭제되거나 변경되는 것은 없다. 애플리케이션은 CRUD 중에 CR만 수행한다.
- 트랜잭션을 만들어서 저장하고, 읽기만 한다.
- 수정, 삭제가 발생하지 않으므로 데이터베이스 동시 업데이트 문제도 발생하지 않는다.
반응형
'Programming > Clean Architecture' 카테고리의 다른 글
8장. OCP: 개방 - 폐쇄 원칙 (0) | 2023.11.21 |
---|---|
7장. SRP: 단일 책임 원칙 (1) | 2023.11.13 |
5장. 객체지향 프로그래밍 (0) | 2023.10.26 |
4장. 구조적 프로그래밍 (0) | 2023.10.23 |
3장. 패러다임 개요 (0) | 2023.10.17 |
댓글