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