파이썬으로 살펴보는 아키텍처 패턴
을 읽고 배운점을 기록하도록 하겠다.
이 책의 목적은 여러 가지 고전적인 아키텍처 패턴을 소개하고 이런 패턴들이 어떻게 DDD, TDD, 이벤트 기반 서비스를 지원하는지 파이썬을 통해 보여주는 것이다.
목차
1. 도메인 모델링
대부분 개발자가 새로운 시스템을 설계하라는 요청을 받으면 즉시 데이터베이스 스키마를 그리기 시작하고 그 다음 객체 모델을 생각한다.
이 책을 읽기 전까지는 이 과정이 당연하다고 생각했다. 하지만, 책에 따르면 새로운 시스템을 설계하기 위해서는 먼저 행동하고 저장에 대한 요구 사항은 행동에 맞춰 정해져야 한다고 한다.
이번 포스팅에서는 도메인 모델링(domain modeling)이 왜 중요하며, 도메인을 모델링하기 위한 핵심 패턴인 엔티티(entity)
, 값 객체(value object)
, 도메인 서비스(domain service)
에 대해 작성하도록 하겠다.
1.1 도메인 모델이란?
일반적으로 알려져 있는 3계층 아키텍처(3-layer-architecture)에서 비즈니스 로직 계층(business logic layer)
은 아키텍처의 핵심 계층을 뜻한다. 이 책에서는 해당 용어를 도메인 모델
로 정의하여 사용 한다.
도메인
이라는 용어는 처음들었을 때, 굉장히 추상적이고 생소하게 느껴졌다. 하지만, 그럴 필요 없이 도메인은 우리가 해결하는 문제라고 정의할 수 있겠다. 예를 들어, 온라인 가구 판매회사에서 일하고 있는 사람에게는 구매 및 조달, 제품 설계, 물류 및 배달 등이 도메인이 될 수 있다.
도메인 모델
은 비즈니스를 수행하는 사람이 자신의 비즈니스에 대해 마음속에 가지고 있는 지도와 같다. 즉, 인간이 복잡한 프로세스에 대해 생각하는 방식을 모델로써 표현한 것이다.
이 책에서는 도메인 모델을 만드는 기본적인 방법을 보여준다. 이로써 모델을 외부 제약과 최대한 무관하게 유지할 수 있고, 이로 인해 모델이 더 잘 진화하고 변경될 수 있게 해주는 아키텍처를 보여준다.
1.2 값 객체와 엔티티
값 객체
는 데이터는 있지만 유일한 식별자가 없는 비즈니스 개념을 뜻한다. 즉, 안에 있는 데이터에 따라 유일하게 식별될 수 있는 도메인 객체를 의미한다. 보통 값 객체
는 불변 객체(immutable object)로 만들곤 한다.
예를 들어, 주문(Order) 내에 포함되어 있고, 제품(SKU)과 수량으로 구성된 라인(line)은 각 라인에 있는 데이터에 따라 유일하게 식별될 수 있다.
파이썬에서 데이터 클래스(or namedtuple)을 사용하여, 값 동등성(value equality)을 부여할 수 있다(즉, 클래스의 속성값이 같은 두 라인은 같다).
1
2
3
4
5
@dataclass(frozen=True) #immutable object
class OrderLine:
order_id: OrderRefernce
sku: ProductReference
qty: Quantity
엔티티
는 값 객체
와 달리 유일하게 구별할 수 있는 식별자가 존재한다. 즉, 오랫동안 유지되는 정체성이 존재하는 도메인 객체를 설명할 때 엔티티
용어를 사용한다.
예를 들어, 사람은 자신의 이름이나 결혼 상태 그리고 성별도 바꿀 수 있다. 하지만, 이런 변경에도 모두 같은 사람으로 계속 인식할 수 있다. 즉, 사람은 영속적인 정체성(persistent identity)이 있다.
엔티티
에는 정체성 동등성(identity equality)이 있다. 엔티티
의 값을 바꾸더라도 바뀐 엔티티는 이전과 같은 엔티티로 인식된다.
만약, 특정한 이유로 엔티티
를 집합에 넣거나 딕셔너리의 키로 사용해야 한다면 시간과 무관하게 엔티티
의 정체성을 식별해주는 속성을 사용해 해시를 정의해야 한다. 그리고 이 속성을 읽기 전용으로 만들어야 한다.
1.3 도메인 서비스
도메인 서비스
는 비즈니스 개념이나 프로세스를 표현하며, 엔티티
나 값 객체
로 자연스럽게 표현할 수 없는 개념이다.
예를 들어, “배치 집합(엔티티
)에 대해 주문 라인(값 객체
)을 할당하는 행위”가 도메인 서비스
에 해당된다.
1.4 도메인 모델링 정리
도메인 모델링
비즈니스와 가장 가까운 부분으로 변화가 생길 가능성이 높고, 비즈니스에 가장 큰 가치를 제공하는 부분
엔티티와 값 객체 구분
값 객체
는 내부 속성들에 의해 정의되며, 불변 타입을 사용해 값 객체를 구현하는 것이 좋다. 엔티티
는 속성이 바뀌더라도 여전히 똑같은 엔티티
로 남는다. 엔티티는 주로 이름이나 참조 번호를 사용하여 식별한다.
모든 것을 객체로 만들 필요가 없다
파이썬 코드에서 ‘동사’에 해당하는 부분을 표현하기 위해 항상 객체
로 만들기 보다는 함수
를 사용하기는 것이 가독성이 더 좋고 표현력이 좋다.
설게 원칙의 적용
SOLID 원칙이나 has-a
와 is-a
의 관계, 상속(ingeritance)
보다는 구성(composition)
을 사용하라