Skip to content

hhko/beyond-code

Repository files navigation

Make It Work, Make It Right, Make It Fast

저장소 소개 오디오 .wav 파일 by 노트북LM

목표

코드는 팀이 함께 완성해 가는 한 편의 글입니다. 우리는 그 글을 차곡차곡 쌓아 시스템을 만들어 갑니다.

  • 소스 코드의 구조는 책의 목차처럼 명확하고 직관적이어야 하며, 이를 통해 도메인과 시스템을 자연스럽게 이해할 수 있어야 합니다.
  • 테스트 코드는 검증 도구를 넘어, 비즈니스 규칙을 이해하고 학습하는 데 핵심적인 가이드 역할을 해야 합니다.

도메인 주도 설계와 함수형 프로그래밍

주요 개념

도메인 주도 설계의 '무엇을 표현할지'와 함수형 프로그래밍의 '어떻게 표현할지'가 만나서, 변경에 강하고, 테스트 가능하고, 명확한 의도를 가진 코드를 만듭니다.

  • 무엇을 표현할지: 복잡성 분리
    • 복잡한 비즈니스 로직을 도메인 모델 중심으로 풀어나가는 설계 방법입니다.
    • 도메인 전문가의 언어(Ubiquitous Language)로 시스템을 설계하는 것이 핵심입니다.
  • 어떻게 표현할지: 부작용 최소화
    • 함수(수학적인 함수)에 기반한 프로그래밍 방식입니다.
    • 상태 변경 없이, 입력에 따라 일관된 출력을 보장합니다.

공통 목표

  • 변경에 강한 모델
    • 도메인 주도 설계: 복잡성 분리 (관심사의 분리: 도메인과 기술)
    • 함수형 프로그래밍: 부작용 최소화 (합성 함수: 부작용 없는 순수 함수 연결)
  • 예측 가능한 동작
    • 도메인 주도 설계: 명확한 경계 (Bounded Context)
    • 함수형 프로그래밍: 순수 함수 지향
  • 풍부한 도메인 표현
    • 도메인 주도 설계: 명확한 의미 부여 (Ubiquitous Language)
    • 함수형 프로그래밍: 타입 기반 설계

애플리케이션 아키텍처

아키텍처 기술 맵

Internal 아키텍처 (Hexagonal 아키텍처)

Internal 아키텍처 예제

  • Fin<T>는 성공(Success) 또는 실패(Failure) 상태를 나타내는 값입니다.
  • FinT<M, T>는 Fin를 다른 모나드 M과 결합하여 복합적인 효과를 처리할 수 있도록 하는 모나드 변환기입니다.
  • 예를 들어, FinT<IO, T>IO 작업 중 발생할 수 있는 오류를 Fin<T>을 통해 명시적으로 처리할 수 있게 합니다.

Internal 아키텍처 기술 스택

  • 도메인
    • LanguageExt.Core: 함수형
    • Dapr: 액터 모델
    • MediatR: 기술 관심사와 도메인 관심사 간의 느슨한 결합 (Mediator 패턴)
    • FluentValidation: 유효성 검사
    • Ardalis.SmartEnum: 열거형 도메인 타입
    • Ulid: Entity Id
  • 테스트
    • xUnit: 테스트
    • TngTech.ArchUnitNET: 아키텍처 테스트
    • Reqnroll: BDD (Behavior-Driven Development) 테스트
    • Verify: 스냅샷 테스트
    • Testcontainers: 컨테이너 테스트
    • NBomber: 부하 테스트
    • coverlet: 코드 커버리지
    • AwesomeAssertions: Fluent 테스트 검증
    • NSubstitute: 인터페이스 Mocking
    • Bogus: Fake 데이터 생성기
    • Allure Report: 테스트 보고서
  • 기술
    • OpenTelemetry: 관찰 가능성 (Observability)
    • Aspire: 분산 클라우드 네이티브
    • FastEndpoints: Web API
    • ZiggyCreatures.FusionCache: 메모리 캐시
    • MassTransit: RabbitMQ
    • Entity Framework Core: Command ORM
    • Dapper: Query ORM
    • Polly: Resilience

External 아키텍처 (Microservices 아키텍처)

TODO


글쓰기 지침


글쓰기 Hands-on Labs

1. 도메인 타입 (값 객체)

단순한 Divide 구현을 출발점으로 삼아, 부작용 없이 예측 가능한 순수 함수(Pure Function)로 개선하고, 이를 통해 유효한 값만 표현할 수 있는 도메인 타입(Value Object)을 점진적으로 설계해 나가는 과정을 통해 도메인 주도 설계와 함수형 프로그래밍의 핵심 가치를 함께 익힙니다.

// 개선 전
int Divide(int x, int y)
{
  return x / y;
}

// 개선 후
int Divide(int x, NonZeroInt y)
{
  return x / y;
}

이 과정은 의미 있는 타입 설계, 입력 유효성 보장, 오류 처리의 명확화, 도메인 언어 강화 등을 아우르며, 유지보수성과 안정성이 높은 코드를 구성하는 기반을 마련합니다.

2. 도메인 타입 (엔티티)

Scott Wlaschin "Designing with types" F# 코드를 C# 기반으로 재구성하는 글입니다.

  • TODO

3. 프로젝트 Clean Architecture

Amichai Mantinband "Clean Architecture" 템플릿을 함수형 기반의 도메인 주도 설계와 아키텍처로 재구성하는 글입니다.

  • TODO

4. 프로젝트 DddGym Monolithic

"Getting Started: Domain-Driven Design" 강의 예제를 함수형 기반의 도메인 주도 설계와 아키텍처로 재구성하는 글입니다.

  • Part 1. Hexagonal 아키텍처 (도메인 레이어: 도메인 타입)
    • Chapter 01. 도메인 탐험
    • Chapter 02. 도메인 구조화
    • Chapter 03. 도메인 함수형화
    • Chapter 04. 도메인 Entity Id 소스 생성기
    • Chapter 05. 도메인 시나리오 테스트 (BDD: Cucumber)
  • Part 2. Hexagonal 아키텍처 (애플리케이션 레이어: 유스케이스)
    • Chapter 06. 유스케이스 CQRS & Event
    • Chapter 07. 유스케이스 미들웨어
    • Chapter 08. 유스케이스 시나리오 테스트 (BDD: Cucumber)
  • Part 3. Hexagonal 아키텍처 (어댑터 레이어)
    • Chapter 09. Web API
    • Chapter 10. IAdapter 인터페이스 소스 생성기
    • Chapter 11. 저장소 CQRS (Command: EF Core, Query: Dapper)
    • Chapter 12. 컨테이너화
    • Chapter 13. 통합 테스트
    • Chapter 14. 부하 테스트

5. 프로젝트 DddGym Microservices

  • Part 1. Microservices 아키텍처
    • Chapter 01. Aspire
    • Chapter 02. RabbitMQ
    • Chapter 03. Resilience
    • Chapter 04. Reverse Proxy
    • Chapter 05. Chaos Engineering
  • Part 2. 운영
    • Chapter 06. OpenFeature (Feature Flag 관리)
    • Chapter 07. OpenSearch (Observability 시스템)
    • Chapter 08. Ansible (Infrastructure as Code)
    • Chapter 09. Backstage (Building Developer Portals)

6. 프로젝트 eShop

"eShop"을 Functional 도메인 주도 설계와 아키텍처로 재구성하는 글입니다.

  • TODO

Releases

No releases published

Packages

No packages published