파이썬으로 살펴보는 아키텍처 패턴 (1)
이 내용은 "파이썬으로 살펴보는 아키텍처 패턴" 을 읽고 작성한 내용입니다. 블로그 게시글과, 작성한 코드를 함께 보시면 더욱 좋습니다.
1장은 해당 코드를 살펴봐주세요. 코드 링크
1장 도메인 모델링
이번 장에서는
- 엔티티
- 값 객체(Value object)
- 도메인 서비스(Domain service)
를 알아보도록 한다.
1.1. 도메인 모델?
비즈니스 로직 계층을 도메인 모델로 부른다.
- 도메인: 해결하려는 문제. 회사마다 다르겠죠? 회사에서 고객에게 뭘 내어줘야 할 지가 곧 도메인.
- 모델: 유용한 특성을 포함하는 프로세스나 현상의 지도
객체를 통한 개념의 추상화, 의인화를 하면 눈과 손에 잡히니 생각을 더 확장하기 쉽다.
이걸 도출하는 설계가 DDD(Domain-driven Design)라 할 수 있다. 그리고 아래 책들은 읽고 오면 다음 내용이 수월하게 읽힙니다. 안 읽고 독파하면 '왜 저게 저렇게 됨?' 이란 의문이 계속 생긴다고 생각한다. 위에서 아래 순으로 쭉 읽으면 좋다고 생각한다.
책을 보면, 책 대로 나온 "고객의 주문에 할당하는 프로세스를 조율"하기 위해 시스템을 배치한 다이어그램이 나온다. 이런 주요 모델부터 뽑아서 시작하면 될 것이다.
1.2. 도메인 언어 탐구
이걸 하기 위해 유비쿼터스 언어, DSL 등의 각종 도구를 들고와서 포스트잇으로 나눈다. 각 파트 사람이 둘러앉아 뭐가 뭐다 하는 논의를 잘 거치면 된다는 뜻이다.
1.3. 도메인 모델 단위 테스트
도메인을 만든다. 그냥 클래스로 만들고 불변객체에 대해서도 만든다.
불변객체는 @dataclass(frozen=True) 로 만들 수 있다.
코드를 작성하더라도 아래와 같이 접근한다.
- 테스트 먼저, 개념 다음
- 도메인 전문가들의 언어를 따르고, 그 예제를 코드로 옮긴 후 계속해서 나아간다(그래야 실제 요구사항을 반영하는 것이니).
1.3.1. VO로 쓰기 좋은 @dataclass
dataclass 는 VO로 쓰기 좋다. value equality(값 동등성)을 부여할 수 있다. 얘는 데이터는 있고 식별자(ID)가 없다.
1.3.2 VO와 엔티티
엔티티는 정체성이 있다. 객체를 식별할 유일무이한 값이 있단 뜻이다[1]. 파이썬에선 이를 위해 __eq__(self, other) 매직 메소드와 __hash__(self) 매직 메소드를 만든다. 이걸 통해서 엔티의 identity에 대한 동일성 점검을 구현할 수 있다. 책에선 파이썬에서의 hashable 의 뜻을 설명한 공식문서 경로와 이 링크를 통해 소개한다.
1.4. 도메인 서비스 함수
모든걸 객체로 만들 필요는 없다.
필요하면 파이썬은 그걸 객체화할 필요가 없다. 함수로 만들고 처리하면 되니까. → ‘동사’ 로 표현되는 부분을 표현하려면 그냥 함수로 풀어쓰면 된다.
근데 이런 식으로 도메인 서비스를 죄다 만들면 객체가 아니라 도메인 서비스 함수에 힘이 더 실리게 된다. 그렇게 힘이 잔뜩 빠진 도메인 객체를 anemic domain model 이라 일컫는다.
1.4.1 매직 메소드 쓸 때 pythonic idioms 를 써먹으려면?
next(), sorted() 를 구현하려면 도메인 모델 내의 __gt__ 가 구현되어야 한다.
1.4.2 예외를 사용한 도메인 개념 표현
도메인 전문가하고 얘기하다보면 ‘이건 이렇게 할 수 없습니다’ 가 도출되는데, 이걸 예외로직으로 풀어내면 된다.
그러고보니 도메인 개념 안에도 별도의 exception을 도출해서 써먹으면 좋을 것 같다...
정리
- 이 방법론은 DDD로 설계 후 도메인 모델을 도출하고 작업하는걸 권장한다. 그렇게 시작한 프로젝트라면 무리없이 작업가능하다
- 도메인 모델에 주요 개념들이 계속해서 들어갈거다.
- 엔티티 구현 시
- 파이썬의
__eq__(self, other)매직 메소드와__hash__(self)매직 메소드를 오버라이딩해서 객체간의 동일함을 점검할 수 있도록 하자 - 객체를 파이썬스럽게(pythonic) 써먹으려면 매직메소드를 내 논리에 맞게 오버라이딩해서 써먹어보자
- 파이썬의
- VO는
@dataclass(frozen=True)을 사용하라 - '상속 보다는 구성을 사용하라' 라는 유명한 말을 파이썬에서 써먹을 때, 저자는 PEP 544 (프로토콜)을 활용하라고 한다.
자바로 치면
hashCode(),equals()같은걸로 객체의 유일성 제공 및 동등함 부여를 체크한다 라는 말 ↩︎