본문 바로가기

DDD

(29)
설계를 깔끔하게 발전시키기 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 해당 책의 마지막 장입니다(13) TLDR : 초이스 타입을 이용해 관심사가 유사한 필드를 하나의 차원으로 통합하라! 도메인 모델의 구현이 끝이 아닙니다. 요구 사항이 변경되면 모델이 지저분해지고 다양한 하위 시스템이 얽혀 테스트하기 어려워집니다. 이제 마지막 과제가 있습니다. 시스템에 영양을 최소화하면서 설계가 발전할 수 있..
Persistence 우리는 도메인 모델을 "persistence ignorance"로 설계했습니다. 즉, 데이터 저장 또는 다른 서비스와의 상호 작용과 관련된 구현 문제로 인해 설계가 왜곡되지 않도록 했습니다. 그러나 대부분의 애플리케이션에는 프로세스 또는 워크플로의 수명보다 더 오래 지속되어야 하는 상태가 필요한 시점이 있습니다. 이 시점에서 우리는 파일 시스템이나 데이터베이스와 같은 일종의 지속성 메커니즘으로 전환해야 합니다. 슬프게도 우리의 완벽한 도메인에서에서 인프라의 지저분한 세계로 이동할 때 거의 항상 불일치가 있습니다. 명령 쿼리 분리(CQRS)와 같은 몇 가지 높은 수준의 원칙에 대해 논의한 다음 낮은 수준의 구현으로 전환합니다. NoSQL 문서 데이터베이스와 기존 SQL 데이터베이스의 두 가지 방식으로 도메..
DDD 구현 : 모나드와 Async Monads and More 모나드는 "모나딕" 함수를을 직렬로 연결할 수 있는 프로그래밍 패턴일 뿐입니다. "모나딕" 함수는 무엇입니까? "normal" 값을 취하고 일종의 "enhanced" 값을 반환하는 함수입니다. 오류 처리 접근 방식에서 "enhanced" 값은 Result type에 래핑된 것이므로 모나딕 함수는 Result 생성 "switch" 함수의 종류입니다. (Ok, 혹은 serviceExceptionAdaptor) (아래의 switchFn 위치에 들어가는 Result 생성자 + map 기능 결합 함수) 모나딕 함수 (return) // 생성자 함수 예시 ​/// "Adapter block" that converts exception-throwing services​ ​ ​/// int..
DDD 구현 : 파이프라인에 모나드 적용하기, computation expression https://itchallenger.tistory.com/428 DDD 구현 : 모나드로 Result 생성 함수 연결 Result type을 생성하는 함수끼리 깔끔하게 합성하는 법을 알아봅시다. 다음은 문제의 시각적 표현입니다. 일반 함수는 철도 트랙의 일부로 시각화할 수 있습니다. 그러나 Result 출력이 있는 함수는 itchallenger.tistory.com 이전 게시물에서 모나드를 설명했습니다. 비동기 효과와 서비스 종속성을 무시하면서 파이프라인의 구성 요소를 빠르게 다시 살펴보겠습니다. 첫째, ValidateOrder는 입력 데이터가 올바른 형식이 아닌 경우 오류를 반환하므로 "switch" 함수이고 서명은 다음과 같습니다. (switch 함수는 생성자입니다~) ​type​ Validate..
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..