해당 포스트는
쏙쏙 들어오는 함수형 코딩
을 학습하며 필요한 내용을 정리한 포스트입니다.
🌈 현실에서의 함수형 사고
이번 장에서 살펴볼 내용
- 현실적인 문제에 함수형 사고 적용하기
- 소프트웨어 구조를 잡는데 계층형 설계가 좋은 이유
- 액션을 타임라인으로 시각화 해보기
- 타임라인을 사용하면 시간에 관한 문제를 잘 풀 수 있다.
💻 토니피자에 오신 것을 환영합니다.
토니는 로봇이 피자를 만드는 가게를 운영한다.
함수형 사고를 이용하여 주방과 재고 창고를 관리하고 있다.
액션과 계산, 데이터로 구분하여 계층형 설게 원칙을 세우고, 이를 통해 분산 시스템을 사용하며 가끔 실패하는 분산 시스템을 이해하기 위해 타임라인 다이어그램도 사용하고 있다.
💻 파트 1 : 액션과 계산, 데이터
🍳 액션
액션은 호출 횟수와 시점에 의존하는 것
오븐이나 배달차 같은 자원과 요리 재료를 사용하는 것은 액션
- 반죽 펴기
- 피자 배달
- 재료 주문
🍳 계산
어떤 것을 결정하거나 계획하는 것은 계산
계산은 실행해도 다른 곳에 영향을 주지 않는다.
계산은 아무 때나 사용해도 주방이 변하지 않음
- 조리법에 나온 것을 두 배로 만들기
- 쇼핑 목록 결정
🍳 데이터
변경 불가능한 데이터를 가능한 한 많이 쓰려고 한다.
결제, 재고, 피자 조리법 같은 것이 데이터
데이터는 유연하기 때문에 저장하거나 네트워크로 전송하는 등 다양하게 쓸 수 있음
- 고객 주문
- 영수증
- 조리법
💻 변경 가능성에 따라 코드 나누기
🍳 계층화 설계
코드를 변경할 때 드는 비용을 줄이기 위해 함수형 사고로 코드를 구성하면 좋겠다는 생각이 든 토니는 변경 가능성에 따라 코드를 나누기로 했다.
가장 아래 쪽에는 배열이나 객체 같은 언어 기능을 놓고, 가운데에는 바뀔 수도 있지만 자주 바뀌지 않는 피자 조리에 대한 것들을 두고, 가장 위쪽에는 이번 주 메뉴와 같이 자주 바뀌는 사업적인 내용을 두기로 했다.
피자 주방 레이어 | 창고 레이어 | 메인 레이어 | |
---|---|---|---|
자주 바뀌는 것 | 이번 주 메뉴 - 특별 메뉴를 위한 조리법 | 이번주에 사야할 것 - 재료를 어디서 구입할 지 | 비지니스 규칙 |
피자만들기 - 조리법 순서 | 재료 목록 -재료 목록에 대한 동작 | 도메인규칙 | |
자주 바뀌지 않는 것 | 자바스크립트 - 객체 - 배열 | 자바스크립트 - 객체 - 배열 | 기술 스택 |
각 계층은 그 아래에 있는 계층을 기반으로 만들어진다.
각 계층에 있는 코드는 더 안정적인 기반 위에 작성할 수 있다.
이런 구조로 만들면 코드를 쉽게 변겅할 수 있다.
- 가장 위에 있는 코드는 의존성이 거의 없기 때문에 쉽게 바꿀 수 있다.
- 아래에 있는 코드들은 의존성이 많아 바꾸기 어렵지만 자주 바뀌지 않는다.
이와 같은 패턴을 계층형 설계
라고 부르고, 일반적으로 비즈니스 규칙
, 도메인 규칙
, 기술 스택 계층
으로 나뉜다.
계층형 설계로 만든 코드는 테스트, 재사용, 유지보수가 쉽다.
💻 파트 2 : 일급 추상
🍳 주방을 자동화 하기
토니는 로봇 한 대가 피자를 만들기 위해 해야 할 일, 액션들을 다이어그램으로 정리했다.
🧀 치즈피자 만들기 1) 주문 접수 2) 반죽 만들기 3) 반죽 펴기 4) 소스 만들기 5) 소스 뿌리기 6) 치즈 갈기 7) 치즈 뿌리기 8) 오븐에 넣기 9) 10분 기다리기 10) 서빙
타임라인 다이어그램을 사용하면 액션이 시간 순서에 따라 어떻게 실행되는지 볼 수 있다.
액션은 실행 시점에 의존하기 때문에 실행 순서가 중요하다
로봇 한 대는 이 일을 끝내기 전까지 다른 피자를 만들 수 없다.
그래서 토니는 로봇 세 대가 일을 나누어 함께 만들면 빠를 것이라 생각했다.
💻 분산 시스템을 타임라인으로 시각화하기
한 대의 로봇이 일을 차례대로 수행하는 것보다 피자 하나를 로봇 세 대가 함께 만들면 빠를 것이라고 생각
피자 만드는 작업을 반죽 만들기 / 소스 만들기 / 치즈 갈기 작업으로 나누고 동시에 일을 하도록 수정
< 🧀 치즈피자 만들기 >
그러나 실행순서가 섞여 토니의 예상대로 빠르고 올바른 피자가 나오지 못했다.
반죽이 다 만들어지지 않았는데 반죽을 편다던가 치즈가 다 갈아지지 않았는데 치즈를 갈아야 하는 등의 문제가 생겼다.
💻 각각의 타임라인은 다른 순서로 실행됩니다.
기본적으로 타임라인은 서로 순서를 맞출 수 있는 기능이 없다.
타임라인을 서로 맞추지 않은 분산 시스템은 예층 불가능한 순서로 실행된다.
💻 어려운 경험을 통해 분산 시스템에 대해 배운 것
🍳 토니의 회고
순차적인 프로그램을 분산 시스템으로 바꾸는 것은 어렵다는 걸 안 토니는 올바른 순서로 동작하는 프로그램을 만드려면 시간에 의존적인 액션에 집중할 필요가 있다는 것을 알게 된다.
- 타임라인은 서로 순서를 맞추지 않는다.
- 타임 라인은 서로 실행 순서를 맞춰야 한다.
- 액션이 실행되는 시간은 중요하지 않다.
- 각각의 타임라인은 다른 타임라인의 순서와 관계 없이 만들어야 한다.
- 드물지만 타이밍이 어긋나는 경우가 생긴다.
- 타임라인은 항상 옳바른 결과를 보장해야 한다.
- 타임라인 다이어그램으로 시스템의 문제를 알 수 있다.
✂️ 타임라인 커팅
토니는 회고 끝에 여러 타임라인이 동시에 진행될 때 서로 순서를 맞출 수 있는 커팅
이라는 기술을 쓰기로 한다.
커팅은 고차 동작
으로 구현한다.
각 타임라인은 독립적으로 동작하고 작업이 완료되면 다른 타임라인이 끝나기를 기다려서 어떤 타임라인이 먼저 끝나도 상관없다.
< 🧀 치즈피자 만들기 >
주문 접수
🤖1호 : 반죽 만들기
🤖2호 : 치즈 갈기
🤖3호 : 소스 만들기
✂️—— 타임라인 커팅 ——✂️
위의 액션들이 끝나야 아래의 액션들을 실행할 수 있다.
- 반죽 펴기
- 소스 뿌리기
- 치즈 뿌리기
- 오븐에 넣기
- 10분 기다리기
- 서빙
💻 좋은 경험을 통해 타임라인에 대해 배운 것
🍳 협력하는 로봇에 대한 회고
토니는 타임라인 커팅 기술을 통해 로봇 세 대는 협력하여 빠르고 올바른 피자를 만들었다.
타임라인 커팅으로 서로 다른 작업들을 쉽게 이해할 수 있다.
- 컷을 통해 동시에 할 수 있는 작업과 순서대로 해야하는 작업을 분리
타임라인 다이어그램을 사용하면 시간에 따라 진행하는 작업을 쉽게 이해할 수 있다.
- 타임라인은 동시에 실행되는 분산 시스템을 시각화하기 좋다.
타임라인 다이어그램은 유연하다.
- 타임라인 다이어그램으로 동시에 진행되는 작업을 쉽게 모델링할 수 있다.
💻 요점 정리
액션, 계산, 데이터 구분하기
코드의 변경 가능성에 따라 계층형 설계 사용
- 각 계층은 코드의 변경 가능성에 따라 나눈다.
타임라인 다이어그램으로 시간에 따라 변하는 액션을 시각화 하기
액션이 올바른 순서로 실행할 수 있도록 타임라인 커팅 기술 사용하기
📚 레퍼런스
Normand, 김은민, and Normand, Eric. (쏙쏙 들어오는) 함수형 코딩 : 심플한 코드로 복잡한 소프트웨어 길들이기 / 에릭 노먼드 지음 ; 김은민 옮김 (2022). Print.