나는 이렇게 본다/Architecture Patterns with Python

도메인 관점에서 행동을 먼저 떠올리자

daco2020 2022. 5. 11. 18:33
반응형

* 이 글은 책을 읽고 주관적인 생각과 함께 요약 정리한 글입니다. 설명을 위한 글이 아니므로 내용이 정확하지 않을 수 있습니다. 

 

 

제목 : 파이썬으로 살펴보는 아키텍처 패턴

저자 : 해리 퍼시벌, 밥 그레고리

범위 : 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