\(@^0^@)/

[BOOK] 쏙쏙 들어오는 함수형 코딩 2 본문

BOOKS/Grokking simplicity 함수형 코딩

[BOOK] 쏙쏙 들어오는 함수형 코딩 2

minjuuu 2022. 7. 26. 15:55
728x90

챕터 2 - 현실에서의 함수형 사고

피자를 만드는 함수형 사고를 사용한 로봇을 예로 들어서
1. 함수형 사고 기술인 액션과 계산, 데이터 각 분류에 해당하는 예를 살펴보고 코드에 적용한 계층형 설계(stratufued design) 원칙과 
2. 일급 추상의 분산 시스템을 이해하기 위한 타임라인 다이어그램(timeline diagram)에 대해 살펴보자.


1. 액션

액션은 호출 횟수와 시점에 의존하는 것. 오븐이나 배달차 같은 자원과 요리 재료를 사용하는 것은 액션.
ex) 반죽 펴기, 피자 배달, 재료 주문

2. 계산

어떤 것을 결정하거나 계획하는 것은 계산. 계산은 실행해도 다른 곳에 영향을 주지 않음.
따라서 계산은 아무 때나 사용해도 됨. ex) 조리법에 나온 것을 두 배로 만들기, 쇼핑 목록 결정

3. 데이터

결제, 재고, 피자 조리법 같은 것이 데이터. 데이터는 유연하기 때문에 저장하거나 네트워크로 전송하는 등 다양하게 쓸 수 있음. ex) 고객 주문, 영수증, 조리법


변경 가능성에 따라 코드 나누기

계층화 설계 맛보기

피자 로봇을 예시로 위쪽으로 갈수록 자주 바뀌는 코드, 아래쪽으로 갈수록 자주 바뀌지 않는 코드의 그림을 그려보자.

자바 스크립트 언어는 잘 바뀌지 않으니 가장 아래쪽에는 배열이나 객체 같은 언어 기능을 놓고,
가운데에는 바뀔 수도 있지만 자주 바뀌지 않는 피자 조리에 대한 것,
마지막으로 가장 위쪽은 이번 주 메뉴와 같이 자주 바뀌는 사업적인 내용을 둔다.

자주 바뀌는 것 피자 주방 레이어 창고 레이어 메인 레이어






이번 주 메뉴
● 이번 주 특별 메뉴를 위한 조리법
이번 주 사야 할 것
재료를 어디서 구입할지 결정
비즈니스 규칙
피자 만들기
조리법 순서
재료 목록
재료 목록에 대한 동작
도메인 규칙
자주 바뀌지 않는 것 자바스크립트
 객체
 배열
자바스크립트
 객체
 숫자
기술 스택
(계층화 설계가 비즈니스, 도메인 및 기술 문제를 명확하게 분리한다)

가장 위에 있는 코드는 의존성이 거의 없기 때문에 쉽게 바꿀 수 있고, 아래에 있는 코드들은 위에 있는 코드보다 의존성이 많아 바꾸기 어렵지만 자주 바뀌지 않는다.

함수형 프로그래머는 이 아키텍처 패턴이 계층을 만들기 때문에 계층형 설계(stratifued design)라고 부른다.
계층형 설계는 일반적으로 비즈니스 규칙, 도메인 규칙, 기술 스택 계층으로 나눈다.
계층형 설계로 만든 코드는 테스트, 재사용, 유지보수가 쉽다.


주방을 자동화하기

다음 타임라인 다이어그램은 로봇 한 대가 피자를 만들기 위한 액션들을 보여준다.
타임라인에 있는 모든 단계는 액션이다.

액션은  실행 시점에 의존하기 때문에 실행 순서가 중요하다.


분산 시스템을 타임라인으로 시각화하기

현재 단 한 대의 로봇이 일을 차례 대고 하고 있어서 고객의 요구를 맞출 만큼 빠르지 않다.
로봇 세 대가 함께 만들면 더 빠를 것이기에 반죽 만들기, 소스 만들기, 치즈 갈기 작업을 로봇 세 대로 나눈다.
여러 대의 로봇이 함께 일을 하는 것은 분산 시스템이다. 분산 시스템에서의 독립된 액션의 실행 순서를 알아보자.

로봇 세 대가 각자 타임라인을 가지고 동시에 일하지만, 각각의 타임라인에서 처리되는 일은 순서가 섞여 누가 먼저 끝날지 알 수 없기에 엉뚱한 피자가 만들어질 가능성이 있다.


각각의 타임라인은 다른 순서로 실행된다

기본적으로 타임라인은 서로 순서를 맞출 수 있는 기능은 없다.
다른 타임라인 작업이 끝날 때까지 기다리라는 표시가 없어서 순서대로 다음 단계를 그냥 진행한다.
타임라인을 서로 맞추지 않은 분산 시스템은 예측 불가능한 순서로 실행된다.


이러한 경험을 통해 분산 시스템에 대해 배운 것

순차적인 프로그램을 분산 시스템으로 바꾸는 것은 어렵다는 것을 알았다.
올바른 순서로 동작하는 프로그램을 만들려면 액션(시간에 의존적인)에 집중할 필요가 있다는 것도 알았다.

  • 기본적으로 타임라인은 서로 순서를 맞추지 않는다.
    • 반죽이 준비되지 않았는데도 다른 타임라인은 그냥 진행되었음.
      타임라인은 서로 실행 순서를 맞춰야 한다.
  • 액션이 실행되는 시간은 중요하지 않다.
    • 따라서 각각의 타임라인은 다른 타임라인의 순서와 관계없이 만들어야 한다.
  • 드물지만 타이밍이 어긋나는 경우는 실제로 일어난다.
    • 타임라인은 항상 올바른 결과를 보장해야 한다.
  • 타임라인 다이어그램으로 시스템의 문제를 알  수  있다.

타임라인  커팅 : 로봇이 서로를 기다릴 수 있게 하기

타임라인 커팅은 여러 타임라인이 동시에 진행될 때 서로 순서를 맞추는 방법이다.
타임라인 커팅은  고차 동작(high-order operation)으로 구현한다.
각 타임라인은 독립적으로 동작하고 작업이 완료되면 다른 타임라인이 끝나기를 기다리기 때문에 어떤 타임라인이 먼저 끝나도 괜찮다.

파란 점선은 모든 작업이 끝날 때까지 진행하지 말라는 뜻이다.
로봇들은 다른 로봇의 작업이 끝나기를 기다리고, 모든 작업이 완료되면 로봇 한대가 나머지 피자를 완성한다.
이렇게 하면 재료를 준비하는 작업은 순서가 중요하지 않다.


이러한 경험을 통해 타임 라인에 대해 배운 것

  • 타임라인 커팅으로 서로 다른 작업들을 쉽게 이해할 수 있다.
    • 타임라인 커팅으로 더 짧아진 타임라인을 실행 순서에 상관없이 이해할 수 있다.
  • 타임라인 다이어그램을 사용하면 시간에 따라 진행하는 작업을 쉽게 이해할 수 있다.
    • 타임라인은 동시에 실행되는 분산 시스템을 시각화하기 좋다.
  • 타임라인 다이어그램은 유연하다.
    • 타임라인을 보고 하려고 했던 것을 쉽게 코드로 옮길 수 있었다.
    • 또한, 타임라인 다이어그램으로 동시에 진행되는 작업을 쉽게 모델링할 수 있다.

요점 정리

  • 액션과 계산, 데이터를 구분하는 일은  함수형 프로그래머에게 가장 중요하고 첫 번째로 해야 하는 일
  • 함수형 프로그래머는 유지보수를 잘하기 위해 계층형 설계를 사용한다.
  • 타임라인 다이어그램은 시간에 따라 변하는 액션을 시각화하는 방법이다.
  • 액션 간 협력을 위해 타임라인  커팅을 실행할 수 있다.

[ 출처 : 쏙쏙 들어오는 함수형 코딩 ]

728x90