All Articles

파이썬으로 살펴보는 아키텍처 패턴 (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 (프로토콜)을 활용하라고 한다.

  1. 자바로 치면 hashCode() , equals() 같은걸로 객체의 유일성 제공 및 동등함 부여를 체크한다 라는 말

Published Apr 11, 2023

Non scholæ sed vitæ discimus.

his/him