이번 시간은 앞서 설명한 함수형 프로그래밍의 개념들을 한 번, 실생활에 접목시켜보겠습니다.
함수형 코딩의 책에서는 피자를 운영하는 하나의 가게를 예를 들어서 설명합니다. 즉, 가게를 운영하는 사장의 입장에서 운영의 효율성을 극대화 시키는 용도로서 함수형 사고를 적용해 보는 것입니다.

그렇다면, 과연 어떻게 함수형 사고가 적용되는 지 살펴보시죠!
먼저, 액션은 호출 횟수와 시점에 의존한다고 말씀드렸습니다. 오븐이나 배달 차 같은 자원과 요리 재료를 사용하는 것은 액션입니다. 이런 액션은 사용 시에는 주의 해야합니다. 그에 대한 이유는 후술하겠습니다.
ex) 반죽 펴기, 피자 배달, 재료 주문.
어떤 것을 결정하거나 계획하는 것은 계산입니다. 계산은 실행해도 다른 곳에 영향을 주지는 않습니다. 이에 따라, 액션과 달리 아무때나 사용해도 크게 상관 없습니다. 그래서 가게 주인은 이 계산을 좋아합니다. 왜 그럴까요? 한 번 고민해 보시기 바랍니다. ㅎㅎ
ex) 조리법에 나온 것을 두 배로 만들기, 쇼핑 목록 결정.
데이터는 말 그대로 데이터죠. 하지만, 데이터 중에서도 가게의 주인은 불변성의 데이터를 많이 쓰려고 합니다. 결제, 재고, 피자 조리법 같츤 것이 데이터입니다. 데이터는 유연하기 때문에 저장하거나 네트워크로 전송하는 등 다양하게 쓸 수 있습니다.
ex) 고객 주문, 영수증, 조리법.
실제로 액션과 계산, 데이터라는 용어를 쓰지 않더라도 위와 같은 기준으로 나누는 것은 중요합니다. 이번 회차가 끝나면, 자유롭게 구분하실 수 있으실 겁니다. 다음은 이 3가지 개념을 적용한 계층화 설계를 살펴보죠.
먼저, 변경 가능성에 따라 코드를 나눠봅시다. 위쪽으로 갈수록 변경 가능성이 높고, 아래로 갈수록 변경 가능성이 낮은 코드가 있는 그림을 그려봅시다.
그렇다면, 어떤 게 어디에 위치하면 좋을까요?
가장 분명한 점은 자바스크립트는 언어 그 자체입니다. 따라서 잘 바뀌지 않습니다. 그래서 가장 아래쪽에는 배열이나 객체 같은 언어 기능을 놓는 것이 좋겠습니다.
그리고 가운데에는 바뀔수도 있지만, 자주 바뀌지 않는 피자 조리에 대한 것이 좋겠습니다. 마지막으로 가장 위쪽은 이번 주 메뉴와 같이 자주 바뀌는 사업적인 내용을 둡니다.
각 계층은 그 아래에 있는 계층을 토대로 만들어집니다. 따라서 각 계층에 있는 코들는 더 안정적인 기반 위에서 작성될 수 있습니다. 이런 구조로 만들어야 향후 코드를 쉽게 변경할 수 있습니다. 즉, 가장 위에 있는 코드는 의존성이 거의 없기 때문에 쉽게 변경이 됩니다. 이에 반해, 아래에 깔린 코드들은 의존성이 커서 쉽게 자주 바뀌지 않습니다.
함수형 프로그래밍에서는 이 아키텍쳐 패턴이 계층을 만들기 때문에 계층형 설계라고 부릅니다. 계층형 설계는 다음과 같이 비즈니스 규칙, 도메인 규칙, 기술 스택 이 3가지 계층으로 나눕니다.

계층형 설계로 짠 코드들은 테스트, 재사용, 유지보수 측면에서 장점을 가져옵니다. 이에 대한 자세한 설명은 따로 추후 챕터에서 다루겠습니다.
다시 피자 가게 운영 얘기로 돌아가 봅시다. 피자를 만드는 것 역시 다양한 액션들이 있습니다. 그리고 그 액션들은 순서들이 정해져 있습니다. 그에 따라 타임라인 다이어그램이 존재합니다. 이 타임라인 다이어그램을 사용하면 액션이 시간 순서에 따라 어떻게 실행되는 지 볼 수 있습니다.

여기서 중요한 점은 액션은 실행 시점에 의존하기 때문에 실행 순서가 중요하다는 것 입니다! 하지만, 현재 가게 사장은 이를 보다 효율적으로 하기 위해 다이어그램을 수정하고자 합니다. 그렇다면 어떻게 수정하는 것이 좋을까요?
현재 가게는 로봇 한 대로 피자를 만듭니다. 좋은 피자를 만들지만, 고객의 수많은 요구에는 맞출 수 있을만큼 빠르지는 않습니다. 단 한대의 로봇이 일을 차례대로 수행하기 때문이죠.
그래서 사장은 여러 대의 로봇을 사용해서 동시에 일을 하면 더 좋겠다고 생각합니다. 하지만 과연 이 방법이 좋기만 할까요?
다음과 같이 로봇 세대가 각자의 타임라인을 가지고 동시에 일합니다.

이렇게 되면 어떤 문제가 생길까요?
결국 타임라인 다이어그램은 문제를 파악하는 데는 도움이 되었지만 실행 순서가 섞이는 것은 어떻게 할 수가 없었습니다.
따라서 오히려 기존의 1대의 로봇이 피자를 만들었던 경우보다 예외적인 변수가 더 많이 발생하게 됩니다.
그렇다면 해결은 못 할까요?
기본적으로 타임라인은 서로 순서를 맞출 수 있는 기능이 없습니다. 서로 다른 타임라인에 있는 액션 간 실행 순서는 보장이 불가합니다. 따라서 뒤죽 박죽으로 뒤 섞인 피자라는 결과물이 도출되는 것 입니다.

따라서 타임라인을 서로 맞추지 않은 분산 시스템은 예측 불가능한 순서로 실행됩니다. 따라서 순서를 보장한 분산 시스템을 만들어야겠습니다.
반죽이 준비되지 않았는데도 다른 타임 라인은 그냥 진행되었습니다. 따라서 타임라인은 서로 실행 순서를 맞춰야겠죠.
일반적으로 소스 작업이 가장 소요 시간이 오래 걸리지만, 꼭 그렇지는 않습니다. 그래서 각각의 타임라인은 다른 타임라인의 순서와 관계 없이 만들어야 합니다.
테스트 시에는 문제가 없어도, 실제 서비스에는 문제가 생기는 경우는 항상 있습니다. 저녁에 주문이 많이 들어오는 경우에 가끔 오류가 발생합니다. 타임라인은 항상 올바른 결과를 보장해야 합니다.
다이어그램을 보고 치즈가 제시간에 준비되지 않음을 알 수 있었습니다. 시스템을 잘 이해하도록 하기 위해 타임라인 다이어그램을 계속 쓰기로 했습니다.
타임라인 커팅은 여러 타임라인이 동시에 진행될 때, 서로 순서를 맞추는 방법입니다. 타임라인 커팅은 고차동작(고차 함수로 만든 동작)으로 구현합니다. 각 타임 라인은 독립적으로 동작하고 작업이 끝나면 다른 타임라인이 끝나기를 기다립니다. 이렇게 하면 결국 타임라인이 먼저 끝나도 순서는 보장 받게 됩니다.
이를 통해 결국 피자 가게 사장은 예외가 많은 저녁 장사도 어떤 예외도 없이 잘 끝냅니다.

타임라인에 컷을 그려 동시에 할 수 있는 재료 준비와 순서대로 해야 하는 피자 제조를 분리했습니다. 이를 통해, 더 짧아진 타임라인을 실행 순서와 상관없이 이해할 수 있습니다.
타임라인을 동시에 실행되는 분산 시스템을 시각화하기 좋습니다.
타임라인을 보고 쉽게 코드로 옮길 수 있습니다. 또한, 타임라인 다이어그램을 통해 동시 진행 작업을 쉽게 모델링 할 수 있게 됩니다.
다음 장부터는 이제 본격적으로 액션, 계산 그리고 데이터를 구분하는 함수형 사고의 핵심으로 넘어가겠습니다. 그럼 다음 시리즈에서 봐요~