반응형
* 이 글은 책을 읽고 주관적인 생각과 함께 요약 정리한 글입니다. 설명을 위한 글이 아니므로 내용이 정확하지 않을 수 있습니다.
제목 : 파이썬으로 살펴보는 아키텍처 패턴
저자 : 해리 퍼시벌, 밥 그레고리
범위 : 1. 도입 ~ 2. 도메인 모델링
느낀 점
- 시스템을 설계할 때, 도메인 관점에서 행동을 먼저 떠올리자.
- 테스트 코드를 작성할 때, 코드만 보더라도 어떻게 동작하는지 알 수 있도록 작성하자.
- 값 객체, 엔티티 등, 데이터 클래스와 매직매서드를 활용해보자.
- 동사의 경우 되도록 함수로 표현하자.
- 클래스 내 ‘매서드’와 ‘일반 함수’, 이 둘을 어떤 기준으로 선택, 구현해야할까?
더보기
정리
도입
- 추상화는 00모듈이 검색 엔진 api를 캡슐화해준 것처럼 해동을 캡슐화하는 단순화한 인터페이스다.
- **DIP(의존성 역전 원칙)**의 첫 부분은 비즈니스 코드가 기술적인 세부 사항에 의존해서는 안 된다는 의미다. 대신 양 쪽 모두 추상화를 사용해야 한다.
- 왜냐하면, 고수준 모듈은 비즈니스의 필요에 따라 쉽게 변경이 가능해야 한다. ex. 함수 이름 바꾸기
- 저수준 모듈(세부 사항)은 실제로 변경하기 어렵다. ex. 마이그레이션, 테스트, 배포
- 비즈니스 계층을 변경하지 않고도 인프라 세부 사항을 바꿀 수 있어야 한다. → 추상화를 사용하면 두 계층을 독립적으로 변경할 수 있다.
- 시스템을 설계할 때 데이터베이스 스키마를 그리고 그 다음 객체 모델을 생각하는 것은 잘못이다.
- 먼저 행동하고, 저장에 대한 요구 사항(스키마)은 행동에 맞춰 정해져야 한다.
- 영속성을 모르는 코드 만드는 방법과 안정적인 api 만드는 방법을 위한 4가지 패턴
- 저장소 패턴은 영속적인 저장소에 대한 추상화다.
- 서비스 계층 패턴은 유스 케이스의 시작과 끝을 명확하게 정의하기 위한 패턴이다.
- 작업 단위 패턴은 원자적 연산을 제공한다.
- 에그리게이트 패턴은 데이터 정합성을 강화하기 위한 패턴이다.
도메인 모델이란
- 비즈니스를 수행하는 사람이 자신의 비즈니스에 대해 마음속에 가지고 있는 지도(심적표상)
- 변화가 생길 가능성이 가장 높은 부분 → 변경하기 쉽게 만들어보자.
도메인 모델의 단위 테스트
- 클래스나 변수 이름은 비즈니스 용어를 사용한다.
- 기술을 전혀 모르는 동료들이 코드를 보더라도 어떤 동작을 묘사하는지 알 수 있다.
값 객체
- 데이터는 있지만 유일한 식별자가 없는 비즈니스 개념이 있으면, 이를 표현하기 위해 값 객체 패턴을 선택하기도 한다.
- 값 객체 는 안에 있는 데이터에 따라 유일하게 식별될 수 있는 도메인 객체를 의미한다.
- 내부의 속성들의 의해 정의된다.
- 값 객체의 속성을 변경하면 새로운 값 객체가 된다.
- 보통 값 객체를 불변 객체로 만드는 것이 가장 좋다.
- 값 객체의 경우, 모든 값 속성을 사용해 해시를 정의하고 객체를 반드시 불변 객체로 만들어야 한다.
- 데이터 클래스에 대해 @dataclass(frozen=True)를 지정하면 공짜로 이런 동작을 얻을 수 있다.
엔티티
- 오랫동안 유지되는 정체성이 존재하는 도메인 객체를 엔티티라고 부른다.
- 값과 달리 엔티티 는 정체성 동등성이 있다.
- 엔티티의 값을 바꿔도 바뀐 엔티티는 이전과 같은 엔티티로 인식된다.
- 엔티티에 대한 동등성 연산자를 구현함으로써 명시적으로 코드로 작성할 수 있다.
class Batch: ... def __eq__(self, other): if not isinstance(other, Batch): return False return other.reference == self.reference def __hash__(self): return hash(self.reference)
- __eq__ 매직 메서드를 사용해 == 연산자의 작동방식을 정의한다.
- __hash__ 객체를 집합에 추가하거나 딕셔너리의 키로 사용할 때 동작을 제어하는 매직 메서드
- 자세한 내용과 사용법은 공식문서를 참고하자.
- __eq__ 를 변경하지 않았다면 __hash__ 를 변경해서는 안된다.
도메인 서비스
- 도메인 서비스는 비즈니스 개념이나 프로세스를 표현한다.
- 서비스 계층의 서비스는 앱의 유스 케이스 하나를 표현한다.
- 종종 서비스 계층을 도메인 서비스라고 부르기도 한다.
sorted() 작동을 위한 gt 구현 방법
# 예시
class Batch:
...
def __gt__(self, other):
if self.eta is None:
return False
if other.eta is None:
return True
return self.eta > other.eta
모든 것을 객체로 만들 필요가 없다.
- 파이썬은 다중 패러다임 언어(객체지향, 함수형 등)이므로 코드에서 ‘동사'에 해당하는 부분은 함수를 사용하는 것이 가독성과 표현력 측면에서 더 좋다.
반응형
'나는 이렇게 본다 > Architecture Patterns with Python' 카테고리의 다른 글
Repository Pattern (0) | 2022.05.11 |
---|