본문 바로가기

2022/03

(33)
DDD 구현 : 모나드로 Result 생성 함수 연결 Result type을 생성하는 함수끼리 깔끔하게 합성하는 법을 알아봅시다. 다음은 문제의 시각적 표현입니다. 일반 함수는 철도 트랙의 일부로 시각화할 수 있습니다. 그러나 Result 출력이 있는 함수는 다음과 같이 두 개로 분할되는 철도 트랙으로 시각화할 수 있습니다. 이러한 종류의 함수를 철도에 비유한 후 스위치 함수라 부를 것입니다. 종종 "모나딕" 함수라고도 합니다. 그렇다면 이러한 "스위치" 함수 중 두 개를 어떻게 연결해야 할까요? 출력이 성공하면 시리즈의 다음 함수로 넘어가고 싶지만, 출력이 오류라면 그림과 같이 우회하고 싶습니다. 두 오류 트랙이 모두 연결되도록 이 두 스위치를 어떻게 결합합니까? 다음과 같이 분명합니다. 그리고 이러한 방식으로 파이프라인의 모든 단계를 연결하면 다음과 같..
DDD 구현 : 오류 모델링 제품 코드의 형식이 잘못되었거나 고객 이름이 너무 길거나 주소 확인 서비스가 시간 초과되면 어떻게 될까요? 모든 시스템에는 오류가 있으며 이를 처리하는 방법이 중요합니다. 일관되고 투명한 오류 처리는 모든 종류의 시스템에 중요합니다. Result type 시그니처를 다루는 방법을 알아봅니다. 우리는 못생긴 조건문과 try/catch 문으로 코드를 오염시키지 않고 오류를 우아하게 캡처하는 함수형 접근 방식을 탐구합니다. 또한 특정 종류의 오류를 도메인 오류로 처리해야 하는 이유를 살펴봅니다. 해당 오류들은 도메인 주도 설계의 연장입니다. Result type으로 에러를 명확히 표현하기 함수형 프로그래밍 기술들은 무언가를(값, 타입, 오류 등) 가능한 한 명확하게 만드는 데 중점을 두며 이는 오류 처리에도 ..
함수 파이프라인 합성하기 with F# 2. 작은 파이프라인 조합하기 이제 서브스텝의 구현을 하나의 파이프라인으로 합성하여 워크플로를 완료할 준비가 되었습니다. ​ ​let​ placeOrder : PlaceOrderWorkflow = ​ ​fun​ unvalidatedOrder -> ​ unvalidatedOrder ​ |> validateOrder ​ |> priceOrder ​ |> acknowledgeOrder ​ |> createEvents 그러나 validateOrder에는 UnvalidatedOrder 외에 두 개의 추가 입력(의존성)이 있다는 문제가 있습니다. 현재로서는 PlaceOrder 워크플로의 입력을 validateOrder 함수에 연결하는 쉬운 방법이 없습니다. 입력과 출력이 일치하지 않기 때문입니다. 다양한 "모양"의 함수를 합성하는 것은 함수형 ..
함수 파이프라인 합성하기 with F# 1. 검증 로직 구현하기 https://pragprog.com/titles/swdddf/domain-modeling-made-functional/ Domain Modeling Made Functional Use domain-driven design to effectively model your business domain, and implement that model with F#. pragprog.com 이펙트 시그니처를 피해가며 파이프라인의 단계를 구현하고, 종속성을 주입하는 방법을 알아봅니다. 또한 세 가지 함수형 프로그래밍 패턴을 알아봅니다. "adapter function"를 사용하여 함수를 한 "모양"에서 다른 "모양"으로 변환. (ex : checkProductCodeExists의 출력을 bool에서 ProductC..
DDD 기능 구현을 위한 함수 이해하기 with F# https://pragprog.com/titles/swdddf/domain-modeling-made-functional/ Domain Modeling Made Functional Use domain-driven design to effectively model your business domain, and implement that model with F#. pragprog.com 해당 시리즈는 Domain Modeling Made Functional 책의 번역 및 정리 내용입니다. Functions, Functions, Everywhere 먼저 함수형 프로그래밍이 객체 지향 프로그래밍과 왜 다른지 살펴보겠습니다. 함수형 프로그래밍은 함수를 가장 중요한 것으로 다루며 프로그래밍하는 것입니다. 대부분의 모..
파이프라인으로 워크플로 모델링하기 - 워크플로 합성 및 나머지 서브스텝을 조합하여 워크플로 만들기 이제 모든 단계에 대한 정의가 있습니다. 따라서 각각에 대한 구현이 있을 때 한 단계의 출력을 다음 단계의 입력에 연결하여 전체 워크플로를 구축할 수 있어야 합니다. 하지만 그렇게 간단하지 않을 것입니다! 입력과 출력만 나열되도록 종속성을 제거한 상태에서 모든 단계의 정의를 한 곳에서 살펴보겠습니다. ​ ​type​ ValidateOrder = ​ UnvalidatedOrder ​// input​ ​ -> AsyncResult ​// output​ ​ ​ ​type​ PriceOrder = ​ ValidatedOrder ​// input​ ​ -> Result ​// output​ ​ ​ ​type​ AcknowledgeOrder = ​ PricedOrder ​// i..
파이프라인으로 워크플로 모델링하기 - 함수 타입으로 워크플로 모델링, 이펙트 모델링 타입을 사용하여 워크플로의 각 단계 모델링 상태 기계 접근 방식은 주문 배치(order-placing) 워크플로를 모델링하는 데 완벽하므로 이제 각 단계의 세부 사항을 모델링하겠습니다. ​ workflow "Place Order" = ​ input: OrderForm ​ output: ​ OrderPlaced event (put on a pile to send to other teams) ​ OR InvalidOrder (put on appropriate pile) ​ ​ // step 1 - 순수하지 않은 스텝 ​ do ValidateOrder ​ If order is invalid then: ​ add InvalidOrder to pile ​ stop ​ ​ // step 2 ​ do PriceOrd..
파이프라인으로 워크플로 모델링하기 - 개요 및 상태 머신 이전 두 장에서 타입을 사용하여 일반적인 방식으로 도메인 모델링을 수행하는 방법을 보았습니다. 이 장에서는 거기서 배운 내용을 주문 처리(order-placing ) 워크플로에 적용할 것입니다. 그 과정에서 모든 워크플로를 모델링하는 데 유용한 여러 기술을 살펴보겠습니다. 목표는 항상 그렇듯이 도메인 전문가가 읽을 수 있는 것을 만드는 것입니다. 이제 주문하기 워크플로의 단계를 다시 살펴보겠습니다. 다음은 모델링해야 할 사항에 대한 요약입니다. ​ workflow "Place Order" = ​ input: UnvalidatedOrder ​ output (on success): ​ OrderAcknowledgmentSent ​ AND OrderPlaced (to send to shipping) ​ AND..