독서/2024

[쏙쏙들어오는 함수형 코딩] CHAPTER2 현실에서의 함수형 사고 - 요약 정리

_OIL 2023. 8. 30. 00:00
반응형
💡 이번 장에서 살펴볼 내용:
  - 현실적인 문제에 함수형 사고를 적용해 봅니다.
  - 소프트웨어 구조를 잡는데 계층형 설계가 좋은 이유를 설명합니다.
  - 액션을 타임라인으로 시각화해 봅니다.
  - 타임라인을 사용하면 시간에 관한 문제를 잘 해결할 수 있다는 것을 배웁니다. 

이 장에서는 함수형 사고가 무엇이고, 왜 함수형 사고가 더 좋은 소프트웨어를 만들려는 개발자에게 도움이 되는지 설명합니다.

토니 피자에 오신 것을 환영합니다.

토니가 운영하는 피자 가게를 살펴보고 두 개의 함수형 사고를 어떻게 적용했는지 알아봅시다.

파트 1: 액션과 계산, 데이터

토니의 피자가게 로봇들을 프로그래밍한 코드에서 액션과 계산, 데이터 각 분류에 해당하는 예를 살펴보고 코드에 적용한 계층형 설계 원칙이 어떤 것인지 알아봅시다.

파트 2: 일급 추상

가게 주방에는 많은 로봇이 분산 시스템 구조로 피자를 만들고 있습니다. 토니는 가끔 실패하는 분산 시스템을 디버깅하기 위해 타임라인 다이어그램을 사했습니다. 또한 토니는 여러 로봇이 협력할 수 있도록 함수를 인자로 받는 일급함수를 사용했습니다.

파트 1: 액션과 계산, 데이터

토니가 피자가게를 운영하기 위한 코드도 액션과 계산, 데이터로 나누면 다음과 같습니다:

1. 액션
액션은 호출 횟수와 시점에 의존하는 것입니다. 오븐이나 배달 차와 같은 자원과 요리 재료를 사용하는 것은 액션에 해당합니다. 액션은 사용할 때 조심해야 합니다.
ex)
- 반죽 펴기
- 피자 배달
- 재료 주문
2. 계산
어떤 것을 결정하거나 계획하는 것은 계산입니다. 계산은 실행해도 다른 곳에 영향을 주지 않습니다. 계산은 언제나 사용해도 주방이 엉망진창될 걱정이 없기 때문에 토니는 계산을 좋아합니다.
ex)
- 조리법에 나온 것을 두 배로 만들기
- 쇼핑 목록 결정
3. 데이터
토니는 변경 불가능한(immutable) 데이터를 가능한 한 많이 사용하려고 합니다. 결제, 재고, 피자 조리법 같은 것이 데이터입니다. 데이터는 유연하기 때문에 저장하거나 네트워크로 전송하는 등 다양하게 쓸 수 있습니다.
ex)
- 고객 주문
- 영수증
- 조리법

부가설명

더보기

위에 나온 액션과 계산, 데이터 예는 토니 피자 사업의 일부분입니다. 이제부터 가장 작은 자바스크립트 코드부터 큰 함수에 이르기까지 모든 계층에 액션과 계산, 데이터를 구분해 보겠습니다. 그리고 3장에서 액션과 계산, 데이터가 서로 어떻게 부르고 상호작용하는지 배울 것입니다. 파트 1이 끝나면 액션과 계산을 구분하고 액션과 계산을 자유롭게 옮길 수 있을 것입니다. 다음은 토니가 적용한 계층화 설계를 살펴보겠습니다.

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

계층화 설계 맛보기

사업이 성장하면 소프트웨어도 그에 맞춰 달라져야 합니다. 위쪽으로 갈수록 자주 바뀌는 코드가 있고 아래쪽으로 갈수록 자주 바뀌지 않는 코드가 있는 그림입니다.

쏙쏙 들어오는 함수형 코딩 - 20p

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

각 계층은 그 아래에 있는 계층을 기반으로 만들어집니다. 그래서 각 계층에 있는 코드는 더 안정적인 기반 위에 작성할 수 있습니다. 이런 구조로 소프트웨어를 만들면 코드를 쉽게 변경할 수 있습니다. 가장 위에 있는 코드는 의존성이 거의 없기 때문에 쉽게 바꿀 수 있습니다. 아래에 있는 코드들은 위에 있는 코드보다 의존성이 많아 바꾸기 어렵지만 자주 바뀌지 않습니다.

 

함수형 프로그래머는 이 아키텍처 패턴이 계층을 만들기 때문에 계층형 설계라고 부릅니다. 계층형 설계는 일반적으로 비즈니스 규칙, 도메인 규칙, 기술 스택 계층으로 나눕니다.

계층형 설계로 만든 코드는 테스트, 재사용, 유지보수가 쉽습니다. 이 내용은 8장과 9장에서 다룹니다.

파트 2: 일급 추상

토니의 주방에는 로봇이 혼자 일하고 있었기 때문에 얼마 지나지 않아 확장성 문제가 생겼습니다.

다음 타임라인 다이어그램은 로봇 한 대가 피자를 만들기 위한 액션들입니다.

쏙쏙 들어오는 함수형 코딩 -20p

타임라인 다이어그램을 사용하면 액션이 시간 순서에 따라 어떻게 실행되는지 볼 수 있습니다. 액션은 실행 시점에 의존하기 때문에 실행 순서가 중요하다는 것을 잊으면 안 됩니다! (15장에서 다이어그램을 그리는 법을 다루니 우선은 그냥 봅시다)

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

로봇 한대가 하는 일을 로봇 세 대가 함께 만들면 더 빠를 것입니다. 여러 대의 로봇이 함께 일을 하는 것은 분산 시스템을 의미합니다.

쏙쏙 들어오는 함수형 코딩 - 22p

💡 여기서 퀴즈! 위 그림처럼 분산 시스템에 대해 타임라인 다이어그램을 그리면 문제를 파악하는 데 도움이 되지만 무엇을 할 수 없을까요?

정답

더보기

실행 순서가 섞이는 것을 어떻게 할 수 없습니다. 따라서 엉뚱한 피자가 만들어집니다.

각각의 타임라인은 다른 순서로 실행됩니다.

기본적으로 타임라인은 서로 순서를 맞출 수 있는 기능이 없습니다. 즉, 서로 다른 타임라인에 있는 액션 간 실행 순서는 보장할 수 없습니다. 타임라인을 서로 맞추지 않은 분산 시스템은 예측 불가능한 순서로 실행됩니다.

어려운 경험을 통해 분산 시스템에 대해 배운 것

토니의 회고

  • 순차적인 프로그램을 분산 시스템으로 바꾸는 것은 어렵습니다.
  • 올바른 순서로 동작하는 프로그램을 만들려면 액션(시간 의존적인)에 집중할 필요가 있습니다.
  1. 기본적으로 타임라인은 서로 순서를 맞추지 않습니다
  2. 반죽이 준비되지 않았는데도 다른 타임라인이 그냥 진행되었습니다.
  3. 액션이 실행되는 시간은 중요하지 않습니다.
  4. 일반적으로 소스 만드는 것이 가장 오래 걸리는 작업이지만 항상 그렇지는 않습니다. 그래서 각각의 타임라인은 다른 타임라인의 순서와 관계없이 만들어야 합니다.
  5. 드물지만 타이밍이 어긋나는 경우는 실제 일어납니다.
  6. 타임라인 다이어그램으로 시스템의 문제를 알 수 있습니다.
  7. 타임라인을 보고 어느 곳에 문제가 생길지 알 수 있습니다.

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

토니는 타임라인 커팅이라는 기술을 사용해 타임라인이 동시에 진행될 때 순서를 맞추기로 합니다.

타임라인 커팅은 고차 동작으로 구현합니다. 타임라인 커팅을 사용하면 각 타임라인은 독립적으로 동작 후 작업이 완료되면 다른 타임라인이 끝나기를 기다리기 때문에 어떤 타임라인이 먼저 끝나도 괜찮습니다.

(고차 동작은 고차 함수로 만든 동작을 말합니다. 10장에서 자세히 다룹니다.)

쏙쏙 들어오는 함수 - 25P

이렇게 타임라인의 시간을 맞추는 작업을 커팅(cuting)이라고 부릅니다. 구현 방법에 대해서는 17장에서 살펴봅니다.

좋은 경험을 통해 타임라인에 대해 배운 것

협력하는 로봇에 대한 회고

  1. 타임라인 커팅으로 서로 다른 작업들을 쉽게 이해할 수 있습니다.
  2. 타임라인에 컷을 그려 동시에 할 수 있는 재료 준비와 순서대로 해야 하는 피자 만들기를 분리했습니다. 타임라인 커팅으로 더 짧아진 타임라인을 실행 순서에 상관없이 이해할 수 있습니다.
  3. 타임라인 다이어그램을 사용하면 시간에 따라 진행하는 작업을 쉽게 이해할 수 있습니다.
  4. 타임라인은 동시에 실행되는 분산 시스템을 시각화하기 좋습니다.
  5. 타임라인 다이어그램은 유연합니다.

결론

  • 토니가 피자 가게 소프트웨어에 함수형 사고를 적용하면서 앞으로 배울 내용을 알아봤습니다.
  • 토니는 유지보수 비용을 줄이기 위해 액션과 계산에 계층화 설계를 사용했습니다. 계층화 설계에 대해서는 3장부터 9장까지 다룰 예정입니다.
  • 토니는 로봇 여러 대로 주방 효율을 높이고 시간에 따라 발생하는 어려운 버그도 고쳤습니다. 이 부분은 15장에서 17장에 걸쳐 타임라인 다이어그램을 다루면서 살펴보겠습니다.

요점 정리

  • 액션과 계산, 데이터를 구분하는 일은 함수형 프로그래머에게 가장 중요하고 첫 번째로 해야 하는 일입니다.
  • 함수형 프로그래머는 유지보수를 잘하기 위해 계층형 설계를 사용합니다.
  • 타임라인 다이어그램은 시간에 따라 변하는 액션을 시각화하는 방법입니다. 또한 액션이 다른 액션과 어떻게 연결되는지 볼 수 있습니다.
  • 타임라인 커팅은 액션이 올바른 순서로 실행할 수 있도록 보장해 줍니다.

반응형