파이프라인 조합하기

기술적인 관점에서 보면 파이프라인은 다음 과정이 일어난다.

  • UnvalidatedOrder 를 받아서 유효성 검사 성공 시 ValidatedOrder 로 변환하고 실패 시 오류 반환

  • 앞 단계 출력 ValidatedOrder 를 받아 추가 정보를 더해 PricedOrder 생성

  • 앞 단계 출력 pricedOrder 로 주문 확인 메일 작성 및 전송

  • 관련 이벤트들 생성 및 반환

우리는 기술적인 세부 사항에 얽매이지 않고 원래의 요구사항을 유지한 채 코드로 변환하고자 한다.

파이핑으로 단계별 함수들을 연결 지은 코드는 다음과 같다:

const placeOrder = flow(
  validateOrder,
  priceOrder,
  sendConfirmationEmail,
  createEvents,
)

일련의 단계를 잘 보여주는 이 코드는 개발자가 아닌 누구라도 이해하기 좋다. 이제 이것을 어떻게 구현할 지 살펴보자. 작업 흐름을 구현하는 과정은 먼저 개발 단계를 만드는 과정과 그 뒤에 이들을 결합하는 과정으로 나뉜다.

파이프라인의 각 단계부터 독립적인 함수로 구현한다. 상태나 부수 효과가 없도록 함수를 구현하여 독립적으로 테스트하고 추론할 수 있게 해야한다.

그 다음으로 이 작은 함수들을 모아 하나의 큰 함수로 합성한다. 말은 쉬운데 실제로 해보면 디자인한 함수들의 출력과 그 다음 함수의 입력이 서로 맞지 않는 문제와 맞닥뜨리기 일쑤다.

이러한 문제를 해결하려면 함수들이 조합 가능하도록 각 단계의 입력과 출력을 조작하는 방법을 배워야 한다.

다음과 같이 두 가지 이유로 함수들을 조합하지 못한다:

  • 일부 함수는 데이터 파이프라인에 속하지 않는 추가 매개변수, 의존(dependency)을 가진다.

  • 오류 효과를 함수 시그니처에 Either 타입으로 명시했듯이 효과가 포함된 함수 출력은 효과 없이 데이터만 받는 함수의 입력이 될 수가 없다.

이번장에서는 함수형 방식으로 의존성 주입을 하여 의존 문제를 해결한다. 효과를 처리하는 방법은 다음 장에서 다룬다.

단순 타입 다루기

대다수 단순 타입은 어떤 식으로든 제약이 있으므로 앞서 살펴봤던 제약 타입처럼 구현해보자.

단순 타입 모두는 최소 두 가지 함수가 필요하다.

  1. String 이나 Int 같은 원시 타입에서 단순 타입을 생성해내는 create 함수
  • 정상 문자열인 경우 OrderId 생성
  • 비정상 문자열이면 오류 발생
  1. 내부 원시값을 추출하는 value 함수
함수 타입으로 구현 가이드하기
유효성 검증 단계 구현
나머지 단계 구현
파이프라인 단계들 모두 모으기
의존 주입
의존 테스트
조립한 파이프라인