우석
현실에서의 함수형 사고
함수형 사고
- 액션, 계산 그리고 데이터
- 일급 추상
1장에서 함수형 사고의 2가지 틀이 위 2가지라 정리했다. 2장에서는 피자를 만드는 로봇 프로그램을 예제로 1번과 2번을 적용해보고 더 나아가 분산 환경(3개의 로봇이 피자를 만드는 환경)일 때를 가정해 생각해본다.
액션, 계산 그리고 데이터
액션: 호출 횟수와 시점에 의존하는 것 -> 반죽 펴기, 피자 배달, 재료 주문 계산: 언제 어디에서 사용해도 다른 곳에 영향을 주지 않는 것 -> 조리법에 나온 것을 두 배로 만들기 데이터: 이벤트에 대한 기록이자 실행할 수 없는 것 -> 고객 주문, 조리법, 영수증
모든 코드는 액션, 계산 그리고 데이터로 나눌 수 분리할 수 있다. 1장에서도 반복해서 언급했듯이 이렇게 분리해둬야 문제가 발생할 확률이 높은 액션을 잘 다룰 수 있다.
계층형 설계
비즈니스 레이어: 이번주 특별 피자 메뉴를 위한 조리법 도메인 레이어: 피자 조리법 순서 기술 레이어: 자바스크립트 객체, 배열
책에서는 3가지 계층을 제시한다. 상단에서부터 아래로 갈 수록 바뀌지 않는 것들이 배치된다. 또한 상단으로 올라갈 수록 하단의 계층들에 의존하게 되고 상단인 비즈니스 레이어는 의존성이 적어 변경에 용이한 구조이다. 각 레이어마다 액션, 계산 그리고 데이터가 존재한다. 1차적으로 변경 빈도를 기준으로 레이어를 나누고 각 레이어에서 액션, 계산, 데이터를 구분하는 과정이 필요해 보인다.
일급 추상
반죽 만들기
>반죽 펴기
>소스 만들기
>소스 뿌리기
>치즈 갈기
>치즈 뿌리기
>오븐에 넣기
>10분 기다리기
위 타임 라인 다이어그램은 프로그램이 수행할 액션을 시간 순서로 볼 수 있다. 액션은 실행 시점에 의존하기 때문에 실행 순서가 중요한데 때문에 액션을 타임 라인 다이어그램으로 시각화하는 것은 적합하다.
분산 시스템을 타임 라인으로 시각화하기
로봇 1:
반죽 만들기
로봇 2:소스 만들기
>반죽 펴기
>치즈 뿌리기
>오븐에 넣기
>10분 기다리기
로봇 3:치즈 갈기
만약 효율성을 위해 피자를 여러 로봇으로 만든다면 어떤 문제가 생길까? 분산 시스템에서 각 서버의 동작은 순서가 보장되지 않고 독립적으로 수행된다. 작업의 순서가 중요하다면 문제가 발생한다. 예를 들어 로봇 3이 치즈를 갈지도 않았는데 로봇 2가 치즈를 뿌린다면? 동작에 오류가 발생한 것이다. 이처럼 타임 라인을 서로 맞추지 않은 분산 시스템은 예측 불가능한 순서로 실행되고 이로 인한 문제가 발생하기 쉽다.
타임라인 커팅
로봇 1:
반죽 만들기
|
로봇 2:소스 만들기
| >반죽 펴기
>치즈 뿌리기
>오븐에 넣기
>10분 기다리기
로봇 3:치즈 갈기
|
이런 문제점을 해결하기 위해 커팅
을 사용할 수 있다. 커팅은 분산 환경에서 지켜져야할 순서를 나타낸다.
예시를 보면 로봇 2가 반죽 펴기를 수행하기 위해서는 반드시 로봇 1의 반죽 만들기와 로봇 3의 치즈 갈기가 완료되어야 하기에 로봇 2는 두 동작을 대기해야 한다.
순서에 의존하는 액션들은 타임라인 커팅을 통해 분산 환경에서 실행 순서를 예측할 수 있도록 설계되어야 한다.
정리
- 액션과 계산, 데이터
- 일급 추상
- 액션 타임라인으로 시각화
- 분산 환경에서의 실행 순서 문제와 타임 라인 커팅
- 커팅
- 타임라인 내에서 동시에 수행이 가능한 로직과 순서대로 수행해이 가능한 로직을 분리하는 것
아직까지는 본격적인 설명보다는 함수형 사고의 전반적인 흐름과 해결하고자 하는 문제을 설명하는 것 같다.