본문으로 건너뛰기

함수형으로 성공 주도 값 객체 구현하기

C# Functorium으로 타입 안전한 값 객체를 구현하는 실전 가이드


string email"not-an-email"을 넣어도 컴파일러는 아무 말 하지 않습니다. int age-1을 넣어도 마찬가지입니다. 런타임이 되어서야 ArgumentException이 터지고, 그제야 “아, 여기서도 검증이 필요했구나”를 깨닫게 됩니다.

이 튜토리얼은 그 문제를 타입 시스템으로 해결합니다. string 대신 Email을, int 대신 Age를 쓰면 잘못된 값은 애초에 만들어지지 않습니다. 기본적인 나눗셈 함수에서 시작해 완성된 값 객체 프레임워크까지, 29개의 실습 프로젝트를 통해 이 과정을 직접 경험합니다.

“string email에 잘못된 값이 들어가는 순간을 런타임이 아닌 컴파일 타임에 잡아내는 세상을 만들어 봅시다.”

다음 표는 경험 수준에 따른 권장 학습 범위를 안내합니다.

수준대상권장 학습 범위
초급C# 기본 문법을 알고 함수형 프로그래밍에 입문하려는 개발자Part 1 (1장~6장)
중급함수형 개념을 이해하고 실전 적용을 원하는 개발자Part 1~3 전체
고급프레임워크 설계와 아키텍처에 관심 있는 개발자Part 4~5 + 부록

이 튜토리얼을 완료하면 다음을 할 수 있습니다:

  1. 예외 대신 명시적 결과 타입으로 안전한 코드를 작성할 수 있습니다
  2. 도메인 규칙을 타입으로 표현하여 컴파일 타임에 검증할 수 있습니다
  3. Bind/Apply 패턴을 활용해 유연한 검증 로직을 구현할 수 있습니다
  4. Functorium 프레임워크를 활용해 실전 값 객체를 개발할 수 있습니다

예외 기반 코드가 왜 문제인지, 성공 주도 개발이 어떤 대안을 제시하는지 살펴봅니다.

10 / 0이 터지는 단순한 예제에서 출발해, 예외 → 방어적 프로그래밍 → 함수형 결과 타입 → 항상 유효한 값 객체로 한 단계씩 진화합니다. 왜 각 단계가 필요한지를 코드로 직접 확인합니다.

주제핵심 학습 내용
1기본 나눗셈예외 vs 도메인 타입의 차이점
2방어적 프로그래밍방어적 프로그래밍과 사전 검증
3함수형 결과 타입함수형 결과 타입 (Fin, Validation)
4항상 유효한 값 객체항상 유효한 값 객체 구현
5연산자 오버로딩연산자 오버로딩과 타입 변환
6LINQ 표현식LINQ 표현식과 함수형 조합
7값 동등성값 동등성과 해시코드
8비교 가능성비교 가능성과 정렬
9생성과 검증 분리생성과 검증의 분리
10검증된 값 생성검증된 값 생성 패턴
11프레임워크 타입프레임워크 타입
12타입 안전한 열거형타입 안전한 열거형
13에러 코드구조화된 에러 코드
14에러 코드 FluentDomainError 헬퍼
15FluentValidation 검증FluentValidation 기반 검증 패턴
16아키텍처 테스트아키텍처 테스트와 규칙

값 객체 하나를 검증하는 것은 어렵지 않습니다. 하지만 여러 필드를 동시에 검증하면서 모든 오류를 한번에 수집하려면 Bind와 Apply의 차이를 이해해야 합니다.

주제핵심 학습 내용
1순차 검증 (Bind)Bind를 통한 순차 검증
2병렬 검증 (Apply)Apply를 통한 병렬 검증
3Apply와 Bind 조합Apply와 Bind 조합
4내부 Bind 외부 Apply내부 Bind와 외부 Apply
5내부 Apply 외부 Bind내부 Apply와 외부 Bind
6컨텍스트 기반 검증ContextualValidation — 필드 이름 기반 검증

Part 1~2에서 익힌 개념을 Functorium 프레임워크의 기본 클래스로 조립합니다. 단일 값 래퍼부터 복합 값 객체, 타입 안전 열거형까지 실전에서 바로 쓸 수 있는 패턴을 완성합니다.

주제프레임워크 타입
1SimpleValueObjectSimpleValueObject<T>
2ComparableSimpleValueObjectComparableSimpleValueObject<T>
3ValueObject (Primitive)ValueObject
4ComparableValueObject (Primitive)ComparableValueObject
5ValueObject (Composite)ValueObject
6ComparableValueObject (Composite)ComparableValueObject
7TypeSafeEnumSmartEnum + IValueObject
8아키텍처 테스트ArchUnitNET
9UnionValueObjectUnionValueObject (Discriminated Union)

값 객체를 EF Core, CQRS 같은 인프라와 통합할 때 발생하는 실전 문제를 다룹니다.

주제핵심 학습 내용
1Functorium 프레임워크 통합Functorium 프레임워크와 값 객체 통합
2ORM 통합 패턴EF Core와 값 객체 통합
3CQRS와 값 객체CQRS 패턴에서 값 객체 활용
4테스트 전략값 객체 테스트 전략

이커머스, 금융, 사용자 관리, 일정 예약 등 실제 도메인에서 값 객체가 어떻게 쓰이는지 확인합니다.

주제값 객체 예제
1이커머스 도메인Money, ProductCode, Quantity, OrderStatus
2금융 도메인AccountNumber, InterestRate, ExchangeRate
3사용자 관리 도메인Email, Password, PhoneNumber
4일정/예약 도메인DateRange, TimeSlot, Duration

[Part 1] 값 객체 개념 이해 1장: 기본 나눗셈 → 2장: 방어적 프로그래밍 → 3장: 함수형 결과 타입 → 4장: 항상 유효한 값 객체 → 5장: 연산자 오버로딩 → 6장: LINQ 표현식 → 7장: 값 동등성 → 8장: 비교 가능성 → 9장: 생성과 검증 분리 → 10장: 검증된 값 생성 → 11장: 프레임워크 타입 → 12장: 타입 안전한 열거형 → 13장: 에러 코드 → 14장: 에러 코드 Fluent → 15장: FluentValidation 검증 → 16장: 아키텍처 테스트

[Part 2] 검증 패턴 마스터 1장: 순차 검증 (Bind) → 2장: 병렬 검증 (Apply) → 3장: Apply와 Bind 조합 → 4장: 내부 Bind 외부 Apply → 5장: 내부 Apply 외부 Bind → 6장: 컨텍스트 기반 검증

[Part 3] 값 객체 패턴 완성 1장: SimpleValueObject → 2장: ComparableSimpleValueObject → 3장: ValueObject (Primitive) → 4장: ComparableValueObject (Primitive) → 5장: ValueObject (Composite) → 6장: ComparableValueObject (Composite) → 7장: TypeSafeEnum → 8장: 아키텍처 테스트 → 9장: UnionValueObject

[Part 4] 실전 가이드 1장: Functorium 프레임워크 통합 → 2장: ORM 통합 패턴 → 3장: CQRS와 값 객체 → 4장: 테스트 전략

[Part 5] 도메인별 실전 예제 1장: 이커머스 도메인 → 2장: 금융 도메인 → 3장: 사용자 관리 도메인 → 4장: 일정/예약 도메인


  • .NET 10.0 SDK 이상
  • VS Code + C# Dev Kit 확장
  • C# 기초 문법 지식

functional-valueobject/
├── Part0-Introduction/ # Part 0: 서론
├── Part1-ValueObject-Concepts/ # Part 1: 값 객체 개념 이해 (16개)
│ ├── 01-Basic-Divide/
│ ├── 02-Defensive-Programming/
│ ├── ...
│ └── 16-Architecture-Test/
├── Part2-Validation-Patterns/ # Part 2: 검증 패턴 마스터 (6개)
│ ├── 01-Bind-Sequential-Validation/
│ ├── 02-Apply-Parallel-Validation/
│ ├── ...
│ └── 06-Contextual-Validation/
├── Part3-ValueObject-Patterns/ # Part 3: 값 객체 패턴 완성 (9개)
│ ├── 01-SimpleValueObject/
│ ├── 02-ComparableSimpleValueObject/
│ ├── ...
│ └── 09-UnionValueObject/
├── Part4-Practical-Guide/ # Part 4: 실전 가이드 (4개)
│ ├── 01-Functorium-Framework/
│ ├── 02-ORM-Integration/
│ ├── 03-CQRS-Integration/
│ └── 04-Testing-Strategies/
├── Part5-Domain-Examples/ # Part 5: 도메인별 실전 예제 (4개)
│ ├── 01-Ecommerce-Domain/
│ ├── 02-Finance-Domain/
│ ├── 03-User-Management-Domain/
│ └── 04-Scheduling-Domain/
├── Appendix/ # 부록
└── index.md # 이 문서

모든 Part의 예제 프로젝트에는 단위 테스트가 포함되어 있습니다. 테스트는 단위 테스트 가이드를 따릅니다.

Terminal window
# 튜토리얼 전체 빌드
dotnet build functional-valueobject.slnx
# 튜토리얼 전체 테스트
dotnet test --solution functional-valueobject.slnx

Part 1: 값 객체 개념 이해 (16개)

테스트 프로젝트주요 테스트 내용
1BasicDivide.Tests.Unit예외 vs 도메인 타입 나눗셈
2DefensiveProgramming.Tests.Unit방어적 프로그래밍, 사전 검증
3FunctionalResult.Tests.UnitFin, Validation 결과 타입
4AlwaysValid.Tests.Unit항상 유효한 값 객체 생성
5OperatorOverloading.Tests.Unit연산자 오버로딩, 타입 변환
6LinqExpression.Tests.UnitLINQ 표현식, 함수형 조합
7ValueEquality.Tests.Unit값 동등성, 해시코드
8ValueComparability.Tests.Unit비교 가능성, 정렬
9CreateValidateSeparation.Tests.Unit생성과 검증 분리
10ValidatedValueCreation.Tests.Unit검증된 값 생성 패턴
11ValueObjectFramework.Tests.Unit프레임워크 타입 검증
12TypeSafeEnums.Tests.Unit타입 안전한 열거형
13ErrorCode.Tests.Unit구조화된 에러 코드
14ErrorCodeFluent.Tests.UnitDomainError 헬퍼
15ValidationFluent.Tests.UnitFluentValidation 기반 검증
16ArchitectureTest.Tests.Unit아키텍처 규칙 검증

Part 2: 검증 패턴 마스터 (6개)

테스트 프로젝트주요 테스트 내용
1BindSequentialValidation.Tests.UnitBind 순차 검증
2ApplyParallelValidation.Tests.UnitApply 병렬 검증
3ApplyBindCombinedValidation.Tests.UnitApply+Bind 조합 검증
4ApplyInternalBindValidation.Tests.Unit내부 Bind 외부 Apply
5BindInternalApplyValidation.Tests.Unit내부 Apply 외부 Bind
6ContextualValidation.Tests.Unit컨텍스트 기반 검증

Part 3: 값 객체 패턴 완성 (8개)

테스트 프로젝트주요 테스트 내용
1SimpleValueObject.Tests.UnitSimpleValueObject 검증
2ComparableSimpleValueObject.Tests.UnitComparableSimpleValueObject 검증
3ValueObjectPrimitive.Tests.UnitValueObject (Primitive) 검증
4ComparableValueObjectPrimitive.Tests.UnitComparableValueObject (Primitive) 검증
5ValueObjectComposite.Tests.UnitValueObject (Composite) 검증
6ComparableValueObjectComposite.Tests.UnitComparableValueObject (Composite) 검증
7TypeSafeEnum.Tests.UnitSmartEnum + IValueObject 검증
9UnionValueObject.Tests.UnitUnionValueObject (Discriminated Union) 검증

Part 4: 실전 가이드 (4개)

테스트 프로젝트주요 테스트 내용
1FunctoriumFramework.Tests.UnitFunctorium 프레임워크 통합
2OrmIntegration.Tests.UnitEF Core 값 객체 통합
3CqrsIntegration.Tests.UnitCQRS 패턴 값 객체 활용
4TestingStrategies.Tests.Unit값 객체 테스트 전략

Part 5: 도메인별 실전 예제 (4개)

테스트 프로젝트주요 테스트 내용
1EcommerceDomain.Tests.UnitMoney, ProductCode, Quantity, OrderStatus
2FinanceDomain.Tests.UnitAccountNumber, InterestRate, ExchangeRate
3UserManagementDomain.Tests.UnitEmail, Password, PhoneNumber
4SchedulingDomain.Tests.UnitDateRange, TimeSlot, Duration

T1_T2_T3 명명 규칙을 따릅니다:

// Method_ExpectedResult_Scenario
[Fact]
public void Create_ReturnsSuccess_WhenValueIsValid()
{
// Arrange
var input = "user@example.com";
// Act
var actual = Email.Create(input);
// Assert
actual.IsSucc.ShouldBeTrue();
}

이 튜토리얼의 모든 예제 코드는 Functorium 프로젝트에서 확인할 수 있습니다:

  • 프레임워크 타입: Src/Functorium/Domains/ValueObjects/
  • 튜토리얼 프로젝트: Docs.Site/src/content/docs/tutorials/functional-valueobject/
  • 명세 패턴: ValueObject와 Specification을 결합하여 도메인 규칙을 표현하는 방법을 학습합니다.
  • 아키텍처 규칙 테스트: ValueObject의 아키텍처 규칙 검증을 자동화하는 방법을 학습합니다.

이 튜토리얼은 Functorium 프로젝트의 실제 값 객체 프레임워크 개발 경험을 바탕으로 작성되었습니다.