5P by GN⁺ 5일전 | ★ favorite | 댓글 2개
  • "TDD with Python" 저자 Harry와 소프트웨어 아키텍트 Bob이 복잡한 소프트웨어 아키텍처를 이해하고 관리하는 방법을 설명한 책
  • 이커머스 회사에서 실제 사용한 아키텍처 기법들을 정리하여 공유함
  • MADE.com은 유럽 기반의 온라인 가구 판매 회사로, 글로벌 공급망을 운영
    • 물류 최적화를 통해 재고를 최소화하고, 소비자 주문과 동시에 물류가 도착하도록 조율하는 것이 목표임
  • 하지만 실제 세계는 복잡하고 예측 불가능하므로, 이를 반영한 지능적인 소프트웨어를 구축하여 자동화하고 있음
  • 이 책은 그런 실전 문제들을 해결하기 위해 고안된 아키텍처 패턴들을 다룸

왜 Python인가

  • Python은 세계적으로 빠르게 성장하고 있는 언어이며 점점 더 복잡한 엔터프라이즈 문제에 도전하고 있음
  • 기존의 아키텍처 책들은 대부분 Java나 C# 기반 예제를 사용하고 있어 Python 사용자에게는 접근이 어려움
  • 이 책은 Python 커뮤니티에 적합한 방식으로 클래식 아키텍처 패턴들을 소개함

TDD, DDD, 이벤트 기반 아키텍처 소개

  • TDD (Test-Driven Development):
    • 테스트 우선 개발은 안정적인 리팩토링과 기능 추가를 가능하게 함
    • 빠르고 의존성 없는 단위 테스트를 우선하고, 느리고 불안정한 end-to-end 테스트는 최소화해야 함
  • DDD (Domain-Driven Design):
    • 비즈니스 도메인 모델에 집중하지만, 인프라와 프레임워크 의존도를 줄이는 것이 중요함
  • 이벤트 기반 아키텍처:
    • 마이크로서비스 간 메시지 기반 통신으로 복잡성을 관리
    • Flask, Django, Celery 등 기존 Python 도구들과 어떻게 통합할지에 대한 고민이 필요함

참고: 이 책에서 다루는 패턴 대부분은 모놀리식 아키텍처에도 적용 가능함

  • 이 책의 목적은 Python에서 TDD, DDD, 이벤트 기반 서비스를 지원하는 아키텍처 패턴을 소개하고 적용 방법을 제시하는 것임

이 책의 대상 독자

  • 복잡한 Python 애플리케이션을 다뤄 본 경험이 있는 개발자
  • 아키텍처 패턴이나 DDD에 대한 배경 지식이 없어도 괜찮음
  • 테스트를 먼저 작성하고 구현하는 TDD 스타일에 익숙하지 않아도 따라갈 수 있도록 구성함
  • Flask, SQLAlchemy, pytest, Docker, Redis 등을 사용하지만 필수 지식은 아님
  • 특정 기술이 아닌, 기술 독립적인 아키텍처 설계를 목표로 함

학습 내용 개요

Part 1

  • 도메인 모델링과 DDD (1, 2, 7장)
    • 도메인 모델을 외부 의존성 없이 구축하는 방법 소개
    • 빠른 단위 테스트 작성법 및 데이터 무결성과의 관계 고려
    • 적절한 Aggregate 선택 방법 설명
  • Repository, Service Layer, Unit of Work 패턴 (2, 4, 5장)
    • 영속성 계층을 추상화하여 모델을 외부 의존성에서 분리
    • 시스템 진입점으로서의 서비스 계층 설계
    • Flask API나 CLI 같은 얇은 진입점 구축에 적합함
  • 테스트와 추상화에 대한 고찰 (3, 5장)
    • 적절한 추상화 계층을 선택하는 기준과 역할 탐구
    • 높은 추상화 수준에서 단위 테스트를 작성해 테스트 피라미드 달성

Part 2

  • 이벤트 기반 아키텍처 (8–11장)
    • Domain Events, Message Bus, Handler 패턴 소개
    • 이벤트를 통해 시스템 내 상호작용을 트리거함
    • 이벤트를 이용한 마이크로서비스 간 통합 방법 설명
    • 명령(command)과 이벤트(event)의 차이 구분
    • 전체 애플리케이션이 메시지 처리 시스템으로 전환됨
  • CQRS (Command-Query Responsibility Segregation) (12장)
    • 명령과 조회 책임 분리를 통한 구조적 효율성 소개
    • 이벤트 사용 유무에 따른 구현 예시 포함
  • 의존성 주입 (13장)
    • 명시적/암시적 의존성 정리
    • 간단한 의존성 주입 프레임워크 구현

부록 및 실습 가이드

  • 기존 프로젝트에 적용하는 방법 (에필로그)
    • 단순한 예제보다 기존 시스템에 패턴을 적용하는 것이 어려움
    • 이를 위한 적용 전략과 참고 자료 제공
  • 코드 실습 및 GitHub 예제
    • 책의 모든 내용을 하나의 예제 프로젝트로 구성
    • 각 장마다 GitHub 브랜치로 코드 제공
    • 실습 방식:
      • 직접 예제 앱을 따라 구현
      • 자신의 프로젝트에 패턴을 적용해 보기
      • 각 장의 "Exercise for the Reader" 활용하여 연습 코드 작성

팁: 각 장의 시작 부분에서 GitHub의 해당 브랜치를 checkout하여 실제 작동하는 코드와 함께 학습하는 것을 추천함

Hacker News 의견
  • 이 책은 아키텍처 패턴에 대한 금광과 같음. 주제를 쉽게 이해할 수 있는 점이 마음에 듦

    • 하지만 실무적으로는 이러한 패턴들이 복잡성과 성능 문제를 야기할 수 있음. 특히 Django 같은 이미 의견이 강한 프레임워크를 사용할 때
    • 큰 회사와 작은 회사에서 Python을 사용해 본 경험이 있음. 엄격한 아키텍처 패턴을 사용하는 큰 회사들은 코드가 "깨끗"하지만 너무 복잡하고 느림
    • 반면, 패턴을 무시한 큰 회사들은 코드가 정말 지저분하지만 생산성이 높았음. 코드가 지저분해도 읽고 이해하고 수정할 수 있었음
    • 이는 나 자신에 대한 이야기일 수도 있지만, 나는 비정형 코드 회사에서 더 생산적이었음. 깨끗한 코드에 대한 논쟁을 피할 수 있었음
  • 이 책의 일부는 매우 유용함. 특히 Python이나 특정 언어에 국한되지 않은 개념을 다룰 때

    • 하지만 다른 부분에서는 문제가 있음. 경험이 부족한 개발자가 모든 것을 한 번에 구현하려고 할 때 위험할 수 있음
    • 예를 들어, 리포지토리 패턴은 일반적으로 유용하지만, 책의 예시를 포함해 많은 경우에 복잡성을 더할 뿐임
    • 서비스 레이어와 작업 단위는 복잡한 애플리케이션에 유용하지만, 작은 서비스로 구성된 시스템에서는 과도하게 비대해질 수 있음
    • 디자인 패턴은 다른 도구와 마찬가지로 언제 사용해야 하고 언제 사용하지 말아야 하는지 이해해야 함. 이 책은 이에 대한 조언을 제공하지만, 더 강조되어야 함
  • Python을 좋은 접착제 언어로 봄

    • 강제된 OOP 사고방식에 지침. 모든 것에 캡슐화와 상속을 강요하는 것에 지침
    • SOLID, 깨끗한 코딩, 깨끗한 아키텍처, GoF 패턴, Uncle Bob에 지침
    • 명령형 또는 함수형 흐름을 따르며 가능한 한 적은 OOP를 사용함
    • Python을 사용할 때 객체와 패턴이 없는 경험을 원함
    • 이 책이 가치가 없다는 것이 아님. 패턴을 배우는 데 유용함. 하지만 모든 것을 실제 프로그래밍에 맞추지 말아야 함
  • 나는 Typescript 개발자지만 이 책은 내가 가장 좋아하는 아키텍처 책 중 하나임. 항상 참고함

    • 테스트를 위한 가짜 작업 단위/서비스 패턴을 종교적으로 사용함. 제3자 서비스를 가짜로 만드는 데 도움을 줌
    • 이벤트를 도메인에 특화된 방식으로 명명하는 것을 추천함. 이는 팀원에게 설명하기 번거로운 부분을 해결함
    • Cosmic Python이 온라인에 완전히 공개되어 있어 링크하기 쉬움. 전반적으로 훌륭하고 형성적인 자원임
  • 몇 년 전부터 Python을 전문적으로 작성하기 시작함. Kotlin과 TypeScript에서 왔으며, 언어가 접근하기 쉬웠지만 느슨한 결합과 테스트 가능성을 달성하는 데 어려움을 겪었음

    • 동료의 추천으로 이 책을 구입하고 처음부터 끝까지 읽음. 복잡한 Python 코드베이스에서 복잡성을 관리하는 방법을 이해하는 데 도움이 되었음
    • 모든 패턴을 따르지는 않지만, 가능성과 다른 패러다임의 경험을 Python에 적용하는 방법을 알게 됨
    • 강력히 추천함. 가치가 있음
  • 정말 훌륭한 Python 프로그래밍 책 중 하나임. 코드에 정적 타이핑이 없다는 점이 아쉬웠지만, 이는 저자의 의도적인 결정이었음

  • 훌륭한 자료 공유에 감사함

  • 이 책의 페이퍼백을 2년 반 또는 3년 전에 읽었음. 매우 즐거웠음. 테스트를 일급 주제로 유지하고 각 추가 사항과 함께 지속적으로 업데이트함

    • 테스트가 준비되고 작성하기 쉽고 업데이트하기 쉬운 것이 개발 과정을 더 즐겁게 만듦. 수동으로 코드를 실행하여 문제를 확인하는 것이 덜 필요함
    • 이벤트 지향 부분이 흥미로웠지만 현재 작업에서 구현하기에는 실용적이지 않았음
  • Polylith에 대한 언급이 없음. 관련이 있는지 궁금함

  • 이 책은 훌륭한 읽을거리였음. 3년 전 C#/.NET DDD 환경에서 일했으며, 이제 Python에서 이러한 개념을 다시 방문하면서 본질적인 부분을 정제함

    • 이와 같은 주제에 관심이 있다면 강력히 추천함