본문 바로가기
Programming/Clean Architecture

6장. 함수형 프로그래밍

by JKROH 2023. 11. 9.
반응형

함수형 프로그래밍의 핵심

  • 함수형 프로그램과 일반적인 자바 프로그램의 핵심 차이는 변수의 가변성이다.
  • 자바 프로그램은 가변 변수를 사용하며, 가변 변수는 프로그램 실행 중에 상태가 변할 수 있다.
  • 반면 함수형 프로그램(책에서는 클로저 프로그램을 예시로 들었다)은 가변 변수가 없다. 함수형 언어에서 변수는 변경되지 않는다.

불변성과 아키텍처

  • 변수가 가변적이고 불변적인 것이 왜 중요한가? 이유는 대부분의 동시성 문제가 가변적인 변수로 인해 발생하기 때문이다.
  • 레이스 컨디션, 데드락 상태, 데이터베이스 동시 업데이트의 문제는 모두 가변 변수로 인해 발생한다.
    • 어떠한 변수도 갱신되지 않으면 레이스 컨디션, 데이터베이스 동시 업데이트 문제가 발생하지 않는다.
      • 두 문제의 공통점은 하나의 값을 여러 대상이 동시에 바꾸려한다는 것이다. 즉, 갱신이라는 행위가 없으면 동시성 문제도 발생하지 않는다.
    • 락이 가변적이지 않다면 데드락 상태가 발생하지 않는다.
      • 데드락 상태 역시 둘 이상의 대상이 하나의 자원을 공유하며 락을 서로 번갈아가며 사용하기 때문에 발생한다. 한 대상만 락을 가지고 이 값이 변하지 않으면 데드락 상태가 발생하지 않는다.
  • 멀티 프로세싱, 멀티 스레딩 상황에서 발생할 수 있는 모든 문제는 가변 변수가 없다면 발생하지 않는다.
  • 그렇다면 이런 문제를 해결하기 위한 불변성은 정말 실현 가능한가? 특정 조건 하에서는 가능하다.
    • 저장 공간이 무한해야 하고 프로세서의 속도가 무한히 빨라야한다.
  • 이렇게 보니 완벽하게 불변성을 구현하긴 어려워보인다. 대신 약간의 타협을 통해 불변성을 실현할 수 있다.

가변성의 분리

  • 불변성과 관련한 가장 주요한 타협 중 하나는 애플리케이션이나 내부 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 것이다.
  • 분리된 불변 컴포넌트는 순수하게 함수형 방식으로만 작업을 처리한다. 어떤 가변 변수도 사용되지 않는다.
  • 불변 컴포넌트는 하나 이상의 가변 컴포넌트와 통신한다.
  • 이 때, 가변 컴포넌트의 상태 변경은 트랜잭셔널 메모리와 같은 방법을 사용해 데이터베이스 동시 업데이트 문제와 레이스 컨디션 문제로부터 가변 변수를 보호한다.
  • 애플리케이션을 제대로 구조화하기 위해서는 가변 컴포넌트와 불변 컴포넌트를 분리해야 한다. 또한 이렇게 분리한 상태에서 가변 컴포넌트는 가변 변수를 보호하는 적절한 수단을 동원해 뒷받침해야한다.
  • 당연하게도 가능한 한 많은 처리를 불변 컴포넌트에서 담당해야 할 것이다.

이벤트 소싱

  • 앞서 언급한대로, 완벽한 불변성을 보장하기 위해서는 무한한 저장 공간과 무한한 처리 능력이 필요하다.
  • 그런데, 진짜로 이만큼 필요할까? 애플리케이션이 살아있는 동안만 저장 공간과 처리 능력에 문제가 발생하지 않으면 되지 않을까?
  • 이벤트 소싱 패턴은 이러한 생각을 기저에 깔고있다.
  • 이벤트 소싱은 상태(결과 값)가 아닌 트랜잭션(이벤트)을 저장하는 전략이다. 상태가 필요해지면 상태의 시작점부터 모든 트랜잭션을 처리한다.
    • 은행의 예시를 들면, 입/출금이 발생할 때마다 해당 트랜잭션을 처리하는 것이 아니라, 그런 이벤트가 발생했다는 사실을 저장한다.
    • 이후 처리가 필요해지면 저장했던 모든 트랜잭션을 처리해 실제 저장된 금액 값을 변경한다.
  • 이벤트 소싱을 사용하기 위해서는 큰 저장 공간이 필요할 것이지만, 우리는 저장 공간의 문제는 없을만큼의 하드웨어적 뒷받침이 된다.
  • 중요한 점은 데이터베이스에서 삭제되거나 변경되는 것은 없다. 애플리케이션은 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

댓글