Chapter 2

현실에서의 함수형 사고

  • 2.1 토니의 피자 가게
  • 2.2 파트 1: 액션과 계산, 데이터
  • 2.3 파트 2: 일급 추상
  • 2.4 타임라인 다이어그램
  • 2.5 변경 가능한 상태와 분산 시스템

함수형 사고를 현실 문제에 대입하면 어떻게 되는지, 토니의 피자 가게라는 비유로 보여주는 챕터야.

토니는 피자 가게 사장인데 로봇을 이용해 피자를 만들어. 주방에 로봇이 여러 대 있고, 각각 반죽 만들기, 토핑 올리기, 굽기 같은 일을 하지. 여기서 핵심 문제가 뭐냐면 — 로봇들이 동시에 일하다 보니 타이밍 문제가 생긴다는 거야. 반죽이 아직 안 됐는데 토핑 로봇이 토핑을 올리려 한다든가, 같은 반죽에 두 로봇이 동시에 토핑을 올린다든가. 이게 바로 분산 시스템의 동시성 문제를 피자 가게로 비유한 거거든. 웹 서비스에서 여러 API가 동시에 호출되고, 여러 사용자가 동시에 같은 데이터를 수정하는 상황이랑 똑같아. 저자가 말하고 싶은 건 — 이런 문제를 풀려면 "어떤 작업이 타이밍에 민감한가(액션)"와 "어떤 작업이 타이밍과 무관한가(계산)"를 구분하는 게 첫 번째 단계라는 거야.

책의 파트 1(챕터 1~9)에서 다루는 내용을 미리 맛보기로 보여주는데, 피자 가게로 비유하면 데이터는 피자 레시피, 메뉴판, 재고 목록 같은 사실의 기록이고, 계산은 레시피를 보고 필요한 재료 계산하기나 가격 합산하기처럼 같은 입력이면 항상 같은 결과가 나오는 거고, 액션은 반죽 만들기, 오븐에 넣기, 고객에게 배달하기처럼 실제 세계를 바꾸고 타이밍이 중요한 거야. 파트 1에서는 이 구분법을 체계적으로 배우고, 액션에서 계산을 빼내는 리팩터링 기법을 익히게 돼. 핵심 원칙은 액션 안에 숨어있는 계산을 찾아 빼내라, 계산은 테스트하기 쉽고 재사용하기 쉽고 이해하기 쉬우니까, 그리고 **카피-온-라이트(copy-on-write)**로 불변성을 유지하라는 거지.

파트 2(챕터 10~19)에서는 함수를 값처럼 다루는 기법을 배워. 피자 가게로 비유하면 — 로봇한테 "이 순서대로 해"라고 구체적 명령을 내리는 게 아니라, "이 전략대로 해"라고 추상적 명령을 내리는 거야. 새로운 피자가 추가되어도 로봇의 소프트웨어를 고칠 필요 없이 전략만 바꾸면 되지. 일급 함수, 고차 함수(map, filter, reduce), 함수를 리턴하는 함수 같은 래핑 패턴을 다루게 돼.

2장에서 처음 등장하는 중요한 도구가 타임라인 다이어그램이야. 코드의 실행 순서를 시간 축에 따라 시각적으로 표현한 건데, 각 타임라인은 순차적으로 실행되는 액션의 흐름이고, 여러 타임라인이 동시에 존재하면 그게 동시성(concurrency)이거든. 피자 가게에서 로봇 A의 타임라인은 반죽 만들기 → 소스 바르기, 로봇 B의 타임라인은 토핑 준비 → 토핑 올리기인데, 이 두 타임라인이 교차되는 지점에서 문제가 생길 수 있어. 이 다이어그램을 쓰면 "어디서 두 타임라인이 같은 자원에 접근하는지"를 눈으로 볼 수 있고, 챕터 15~17에서 이걸 본격적으로 다루게 돼.

토니의 피자 가게가 성공해서 여러 지점으로 확장된다고 해봐. 이제 각 지점의 재고를 중앙에서 관리해야 하고, 주문도 여러 지점에서 동시에 들어와. 이게 바로 분산 시스템이고, 여기서 **변경 가능한 공유 상태(mutable shared state)**가 문제의 근원이 되는 거야. 저자의 해법은 역시 함수형 사고 — 변경 가능한 상태를 최소화하고, 공유 자원에 대한 접근을 제어하고(큐, 동시성 기본형), 계산은 공유 상태를 건드리지 않으니 계산이 많을수록 동시성 문제가 줄어든다는 거지. 이건 이론이 아니라 실전이야 — 프론트엔드에서 여러 AJAX 요청이 동시에 날아가서 장바구니가 꼬이는 문제, 백엔드에서 여러 요청이 같은 DB 레코드를 동시에 수정하는 문제, 전부 같은 맥락이거든.


정리

2장 읽고 기억할 거 세 가지:

  1. 토니의 피자 가게 = 분산 시스템의 비유. 여러 로봇이 동시에 일하면 타이밍 문제가 생김. 이게 현실 소프트웨어의 동시성 문제
  2. 타임라인 다이어그램은 동시성을 시각화하는 도구. 어디서 문제가 생길 수 있는지 눈으로 파악 가능
  3. 이 책은 두 파트로 나뉜다. 파트 1은 액션/계산/데이터 분류, 파트 2는 일급 추상. 둘 다 현실 문제를 푸는 실용적 기법