쏙쏙 들어오는 함수형 코딩 - 2

binary·2022년 5월 15일
2
post-thumbnail

Chapter 2 현실에서의 함수형 사고

🌟 토니 피자

토니는 로봇이 피자를 만드는 가게를 운영한다. 함수형 사고를 이용하여 주방과 재고 창고를 관리하고 있다.
액션과 계산, 데이터로 구분하여 계층형 설게 원칙을 세우고, 이를 통해 분산 시스템을 사용하며 가끔 실패하는 분산 시스템을 이해하기 위해 타임라인 다이어그램도 사용하고 있다.

🍕 토니 피자의 액션과 계산, 데이터 구분하기

  1. 액션
  • 반죽 펴기
  • 피자 배달
  • 재료 주문
  1. 계산
  • 조리법에 나온 것을 두 배로 만들기
  • 쇼핑 목록 결정
  1. 데이터
  • 고객 주문
  • 영수증
  • 조리법

🍕 토니 피자의 계층화 설계

코드를 변경할 때 드는 비용을 줄이기 위해 함수형 사고로 코드를 구성하면 좋겠다는 생각이 든 토니는 변경 가능성에 따라 코드를 나누기로 했다.

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

  1. 피자 주방 레이어
  • 이번 주 메뉴 : 자주 바뀌는 것
  • 피자만들기 : 바뀔 수 있지만 자주 바뀌지 않는것
    - 조리법 순서
  • 자바스크립트 : 자주 바뀌지 않는 것
    • 객체
    • 배열
  1. 창고 레이어
  • 이번 주 사야 할 것 : 자주 바뀌는 것
  • 재료 목록 : 바뀔 수 있지만 자주 바뀌지 않는 것
  • 자바스크립트 : 자주 바뀌지 않는 것
    • 객체
    • 배열

각 계층은 그 아래에 있는 계층을 기반으로 만들어진다. 이와 같은 패턴을 계층형 설계라고 부르고, 일반적으로 비즈니스 규칙, 도메인 규칙, 기술 스택 계층으로 나뉜다.

계층화 설계의 장점

테스트, 재사용, 유지보수가 쉽다.

🍕 토니 피자의 일급 추상

토니는 로봇 한 대가 피자를 만들기 위해 해야 할 일, 액션들을 다이어그램으로 정리했다.

🧀 치즈피자 만들기

  1. 주문 접수

  2. 반죽 만들기

  3. 반죽 펴기

  4. 소스 만들기

  5. 소스 뿌리기

  6. 치즈 갈기

  7. 치즈 뿌리기

  8. 오븐에 넣기

  9. 10분 기다리기

  10. 서빙

로봇 한 대는 이 일을 끝내기 전까지 다른 피자를 만들 수 없다. 그래서 토니는 로봇 세 대가 일을 나누어 함께 만들면 빠를 것이라 생각했다.

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

< 🧀 치즈피자 만들기 >

  • 주문 접수
    • 🤖1호 : 반죽 만들기
    • 🤖2호 : 치즈 갈기
    • 🤖3호 : 소스 만들기
      1. 반죽 펴기
      2. 소스 뿌리기
      3. 치즈 뿌리기
      4. 오븐에 넣기
      5. 10분 기다리기
      6. 서빙

그러나 실행순서가 섞여 토니의 예상대로 빠르고 올바른 피자가 나오지 못했다.
반죽이 다 만들어지지 않았는데 반죽을 편다던가 치즈가 다 갈아지지 않았는데 치즈를 갈아야 하는 등의 문제가 생겼다.

❓왜 이런 일이 생겼을까요?

타임라인은 서로 순서를 맞추는 기능이 없어 다른 타임라인의 작업이 끝날 때까지 기다리지 않고 바로 다음 순서의 액션을 실행한다.

🤯 토니의 회고

순차적인 프로그램을 분산 시스템으로 바꾸는 것은 어렵다는 걸 안 토니는 올바른 순서로 동작하는 프로그램을 만드려면 시간에 의존적인 액션에 집중할 필요가 있다는 것을 알게 된다.

  1. 타임라인은 서로 순서를 맞추지 않는다.
  2. 액션이 실행되는 시간은 중요하지 않다.
  3. 드물지만 타이밍이 어긋나는 경우가 생긴다.
  4. 타임라인 다이어그램으로 시스템의 문제를 알 수 있다.

✂️ 타임라인 커팅

토니는 회고 끝에 여러 타임라인이 동시에 진행될 때 서로 순서를 맞출 수 있는 커팅이라는 기술을 쓰기로 한다.

커팅은 고차 동작으로 구현한다.

각 타임라인은 독립적으로 동작하고 작업이 완료되면 다른 타임라인이 끝나기를 기다려서 어떤 타임라인이 먼저 끝나도 상관없다.

< 🧀 치즈피자 만들기 >

  • 주문 접수
    • 🤖1호 : 반죽 만들기
    • 🤖2호 : 치즈 갈기
    • 🤖3호 : 소스 만들기

✂️------ 타임라인 커팅 ------✂️
위의 액션들이 끝나야 아래의 액션들을 실행할 수 있다.

  1. 반죽 펴기
  2. 소스 뿌리기
  3. 치즈 뿌리기
  4. 오븐에 넣기
  5. 10분 기다리기
  6. 서빙

토니는 타임라인 커팅 기술을 통해 로봇 세 대는 협력하여 빠르고 올바른 피자를 만들었다.

😎 성공한 토니의 회고

  1. 타임라인 커팅으로 서로 다른 작업들을 쉽게 이해할 수 있다.
  2. 타임라인 다이어그램을 사용하면 시간에 따라 진행하는 작업을 쉽게 이해할 수 있다.
  3. 타임라인 다이어그램은 유연하다.

🤔 함수형 프로그래밍을 하기 위해서 해야 하는 일

4줄 요약

  1. 액션, 계산, 데이터 구분하기

  2. 코드의 변경 가능성에 따라 계층형 설계 사용

  3. 타임라인 다이어그램으로 시간에 따라 변하는 액션을 시각화 하기

  4. 액션이 올바른 순서로 실행할 수 있도록 타임라인 커팅 기술 사용하기


혹시나 잘못된 정보가 있다면 댓글로 알려주세요 ! 저의 성장의 큰 도움이 될 것 같습니다.🌱

0개의 댓글