[Clean Architecture] 6장 :: 함수형 프로그래밍

Jihyoung·2022년 3월 20일
0

Clean Architecture

목록 보기
6/23
post-thumbnail

📕 정수를 제곱하기

  • 리스프에서 파생한 클로저(Clojure)는 함수형 언어이다.
(println //출력한다. 
	(take 25 // 처음부터 25까지
    	(map (fn [x] (* x x)) //제곱을 
        	(range)))) //정수의
  • 리스프에서는 함수를 괄호 안에 넣는 방식으로 호출한다.
  • 자바 프로그램은 가변 변수(Mutable variable)를 사용하는데, 가변 변수는 프로그램 실행 중에 상태가 변할 수 있다.
  • 클로저 프로그램에서는 이러한 가변 변수가 전혀 없다.
  • 함수형 언어에선 변수가 한 번 초기화 되면 절대로 변하지 않는다.

📗 불변성과 아키텍처

아키텍처를 고려할 때 왜 변수의 가변성을 염려할까? 아래와 같은 문제가 모두 가변 변수로 인해 발생하기 때문이다.

  • 경합(race) 조건
    • 두 명령어가 동시에 같은 기억 장소를 액세스할 때 그들 사이의 경쟁에 의해 수행 결과를 예측할 수 없게 되는 것
  • 교착상태(deadlock) 조건
    • 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
  • 동시 업데이트(concurrent update) 문제

아키텍트라면 동시성(concurrency) 문제에 큰 관심을 가져야만 한다.


📙 가변성의 분리

불변성을 실현 시키기 위해서는 가변 컴포넌트와 불변 컴포넌트를 분리해야 한다.

불변 컴포넌트

  • 함수형 방식으로만 작업되며, 가변 변수를 사용하지 않는다.
  • 순수 함수형 컴포넌트가 아닌 하나 이상의 다른 컴포넌터와 서로 통신한다.

상태변경으로 인해 동시성 문제를 마주할 수 있기 때문에, 트랜잭션 메모리사용하여 동시성 문제로 부터 가변 변수를 보호한다.

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

* 트랜잭션 : 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위

📘 이벤트 소싱

저장 공간과 처리 능력의 한계가 줄어들며 가변 상태도 함께 줄어들게 되었다.

이벤트 소싱을 이용하면 되기 때문이다.

  • 가변 변수를 설정하지 않고 트랜잭션을 저장하여 상태가 필요할때 상태의 시작점부터 트랜잭션을 처리한다.

저장 공간과 처리 능력이 충분하다면 어플리케이션이 불변성을 갖도록 할 수 있고, 함수형으로 만들 수 있다.


📒 결론

컴퓨터 프로그램은 순차(sequence), 분기(selection), 반복(iteration), 참조(indirection)로 구성된다.


📚 Reference

  • Clean Architecture : 소프트웨어 구조와 설계의 원칙
profile
로그를 생활화

0개의 댓글