반응형
* 이 글은 책을 읽고 주관적인 생각과 함께 요약 정리한 글입니다. 설명을 위한 글이 아니므로 내용이 정확하지 않을 수 있습니다.
제목 : 파이썬으로 살펴보는 아키텍처 패턴
저자 : 해리 퍼시벌, 밥 그레고리
범위 : 3. 저장소 패턴
느낀 점
- 도메인 모델과 인프라간에 의존성을 줄여 변경에 용이하다.
- 가짜 저장소를 만들어 단위 테스트를 구현하는데 용이하다.
- 아직까지는 도메인 모델과 저장소 패턴의 장단점이 와닿지 않는다.
- 이번 프로젝트는 저장소 패턴을 구현하는 것인데 직접 경험해봐야겠다.
더보기 키워드
dependency injection
abc (추상화 기반 클래스)
정리
저장소 패턴
- 저장소 패턴은 데이터 저장소를 더 간단히 추상화한 것으로 모델 계층과 데이터 계층을 분리할 수 있다.
- 데이터베이스의 복잡성을 감춰서 시스템을 테스트하기 더 좋게 만든다.
- MVC, MVT는 계층을 분리해서 유지하고, 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것이 목표다.
- 하지만 도메인 모델에는 그 어떤 의존성도 없기 바란다.
- 하부 구조와 관련된 문제가 도메인 모델에 영향을 끼쳐 단위 테스트를 느리게 하고, 도메인 모델의 변경 능력을 감소시키면 안된다.
- 모델을 내부에 있는 것으로 간주하고 의존성이 내부로 들어오게 만들어야 한다. - 양파 아키텍처
- 저장소 패턴은 영속적 저장소를 추상화한 것이다.
- 모든 데이터가 메모리상에 존재하는 것처럼 가정해 데이터 접근과 관련된 지루한 세부 사항을 감춘다.
- 단점 : 도메인 객체를 추가할 때마다 저장소 클래스에 코드를 추가해야한다.
- 장점 : 저장 방법을 더 쉽게 바꿀 수 있고, 단위 테스트 시 가짜 저장소를 제공하기 쉽다.
- 저장소 구현에 어떤 SQL을 쓰는지는 자유다. ORM을 안써도 된다.
- 세션의 커밋은 저장소를 호출하는 쪽의 책임으로 한다. → 장단점이 있는데 6장에서 자세히 다룬다.
- 테스트를 위한 가짜 저장소 - 만약 가짜 객체를 만들기 어렵다면 추상화를 복잡하게 설계한 것이다.
추상화 기반 클래스
@abc.abstractmethod는 자식 클래스가 부모 클래스에 정의된 모든 abstractmethod를 구현하지 않으면 인스터스가 생성되지 않는다.
실전에서는 abc(추상화 기반 클래스)는 거의 사용하지 않고 덕 타이핑을 사용하는 경우가 많다.
포트와 어댑터
- 포트는 인터페이스
- 어댑터는 인터페이스나 추상화가 뒤에 있는 구현 이다.
- 파이썬은 인터페이스를 제공하지 않는다. 따라서 어댑터는 식별하기 쉽지만 포트를 정의하기는 어렵다.
- 추상 기반 클래스를 사용한다면 그것이 포트다.
- 아니라면, 포트는 덕 타입(사용 중인 함수와 메서드 이름과 인수 이름과 타입)이다.
덕 타이핑이란?
- 실제 타입과 무관하게 같은 이름의 속성이나 메서드가 있다면, 구별하지 않고 사용하는 것을 의미함.
마치며
- 장점
- 영속적 저장소와 도메인 모델 사이의 인터페이스를 간단히 유지
- 모델과 인프라를 분리하여, 단위 테스트를 위한 가짜 저장소를 쉽게 만들 수 있음
- 영속성에 대해 생각하기 전에 도메인 모델을 작성하여 비즈니스 문제에 집중
- 객체를 테이블에 매핑하는 과정에서 원하는 대로 제어할 수 있고 스키마를 단순화할 수 있음
- 단점
- ORM이 결합을 완화시켜줌
- ORM 매핑을 수동으로 하려면 작업과 코드가 더 필요
- 간접 계층을 추가하면 유지보수 비용이 증가
💡 앱이 래퍼를 감싸는 단순한 CRUD라면 도메인 모델이나 저장소가 필요하지 않다.
저장소 패턴 정리
- ORM에 의존성 역전을 적용하자
- 도메인 모델은 인프라에 대해 걱정할 필요가 없어야 한다.
- ORM은 모델을 import해야 하며, 모델이 ORM을 import해서는 안된다.
- 저장소 패턴은 영속적 저장소에 대한 단순한 추상화다.
- 저장소는 컬렉션이 메모리상에 있는 객체라는 환상을 제공한다.
- 비즈니스 로직에는 영향을 주지 않으면서 인프라를 이루는 세부 구조를 변경할 수 있다.
반응형
'나는 이렇게 본다 > Architecture Patterns with Python' 카테고리의 다른 글
도메인 관점에서 행동을 먼저 떠올리자 (0) | 2022.05.11 |
---|