『파이썬으로 살펴보는 아키텍처 패턴』을 보고 본 포스팅을 작성했다.
1. 저장소 패턴 소개
저장소 패턴은 모든 데이터가 메모상에 존재하는 것처럼 가정해 데이터 접근과 관련된 지루한 세부 사항을 감춘다.
import all_my_data # 모든 데이터를 가져온다
def create_a_batch():
batch = Batch(...)
all_my_data.batches.add(batch
def modify_a_batch(batch_id, new_quantity):
batch = all_my_data.batches.get(batch_id)
batch.change_initial_quantity(new_quantity)
모든 객체가 메모리에 있더라도 이 객체들을 나중에 다시 찾을 수 있도록 어딘가에 보관해야 한다. 인메모리 데이터는 리스트나 집합과 같은 새로운 객체를 얼마든지 추가할 수 있다. 객체가 메모리에 존재하므로. saveI() 메서드를 호출할 필요가 없다. 대신 원하는 데이터를 (어딘가로부터) 가져와서 메모리상에서 변경하면 된다.
2. 추상화한 저장소
가장 간단한 저장소에는 메서드가 두 가지밖에 없다. add()는 새 원소를 저장소에 추가하고, get()은 이전에 추가한 원소를 저장소에서 가져온다. 이렇게 단순성을 강제로 유지하면 도메인 모델과 데이터베이스 사이의 결합을 끊을 수 있다.
다음은 저장소의 추상 기반 클래스(ABC)가 어떤 모양인지 보여준다.
class AbstractRepository(abc.ABC):
@abc.abstractmethod
def add(self, batch: model.Batch):
raise NotImplementedError
@abc.abstractmethod
def get(self, reference) -> model.Batch:
raise NotImplementedError
추상 기반 클래스, 덕 타이핑, 프로토콜
프로덕션 코드에서 ABC를 제거하는 경우가 종종 있다. 파이썬에서는 ABC를 무시하기가 너무 쉬워서 종종 유지보수가 불가능해지거나, 더 심하면 ABC 때문에 잘못된 코드를 작성하게 된다. 실무에서는 파이썬의 덕 타이핑에 의존해 추상화하는 경우도 많다. 파이썬 개발자에게는 add(thing)과 get(id)메서드를 제공하는 어떤 객체든 저장소가 될 수 있다.
ABC나 덕타이핑 외에 살펴볼만한 대안으로는 PEP 544 포로토콜이 있다. 프로토콜은 상속을 사용하지 않고 타입을 지정할 수 있다. 따라서 특히 상속보다는 구성을 사용하라는 규칙을 선호한다면 프로토콜을 더 좋아할 것이다.
3. 트레이드오프란 무엇인가?
이러한 패턴으로 얻는 이익은 무엇인가? 이 패턴을 채택하면 치러야 하는 대가는 무엇인가? 를 자문하면서 적용해라. 보통은 새로운 추상화 계층을 소개할 때마다 그 추상화를 추가해 전체적인 복잡성이 최소한으로 줄어들기를 기대한다. 하지만 새 추상화는 지역적으로는 복잡성을 증가시키고, 움직이는 부품 수나 지속적으로 유지보수해야 한다는 측면에서는 비용이 증가한다. 읽어야 하는 도메인 객체를 새로 추가할 때마다 저장소 클래스에 코드를 몇 줄 더 추가해야 한다. 하지만 반대급부로 저장소 계층을 간단하게 추상화할 수 있고, 이 추상화를 제어할 수도 있다. 저장소 패턴을 사용하면 사물을 저장하는 방법을 더 쉽게 바꿀 수 있고 단위 테스트 시 가짜 저장소를 제공하기가 더 쉬워진다.
'디자인패턴' 카테고리의 다른 글
저장소 패턴 - 2 (0) | 2023.02.08 |
---|