27 May 2019

도메인 주도 설계 12 - 모델과 디자인 패턴의 연결

디자인 패턴은 특정한 상황에서의 설계 문제 해결을 위해, 상호 교류하는 수정 가능한 객체와 클래스에 관해 설명한 것이다. (Gamma et al. 1995, p.3)

디자인 패턴에서 소개되는 패턴 가운데 일부 패턴을 도메인 패턴으로 사용할 수 있다. 도메인 모델링 결과로 나타나는 복잡한 연관 관계나 코드를 디자인 패턴을 차용한 도메인 패턴으로 승화시켜 도메인 모델링과 설계에도 활용할 수 있다.

도메인 주도 설계에서 디자인 패턴을 활용하려면 두 가지 수준의 패턴을 바라봐야만 한다. 한 가지 수준은 코드 내에 포함된 기술적인 측면을 다루는 디자인 패턴과 또 다른 하나는 모델 내에 포함된 개념 패턴이다.

도메인 모델에 디자인 패턴을 적용할 경우 가장 우선적으로 고려할 사항은 적용하려는 패턴의 기본 아이디어가 정말로 도메인 개념에 적합한지 여부이다.


Strategy (전략, Policy)

00.png

알고리즘들을 정의하고, 각 알고리즘을 캡슐화한 후 알고리즘들을 상호 교환 가능하게끔 만든다. 이 전략 패턴을 사용한다면 클라이언트의 변경이 없이, 알고리즘을 변경할 수 있다.

도메인 모델에는 기술적인 이유가 아닌 실질적으로 도메인 관점에서 의미있는 프로세스가 존재할 수 있다. 이 때 여러 프로세스가 있고 그 중 하나를 선택해야 할 경우 프로세스를 선택하는 데 따르는 복잡성과 다수의 프로세스가 존재한다는 이유로 코드 여러 부분에 산재되는 복잡성이 나타날 수 있다.

이런 프로세스의 중심 개념과 변경되는 부분을 따로 분리해야 한다. 이 두 부분을 분리한다면 중심 프로세스와 그 외의 부가적인 코드를 더욱 명확히 식별할 수 있다. 프로세스에서 변화하는 부분은 별도의 전략(strategy) 객체로 분리하여 모델로 표현하라. 프로세스의 중심 규칙과 프로세스를 제어하는 행위 부분을 서로 분리하라. 전략 패턴에 따라 대체 가능한 프로세스를 여러 벌 구현할 수 있다.

전략(Strategy)을 디자인 패턴으로 바라보는 전통적인 관점에서는 각기 다른 알고리즘을 상호 대체하는 능력에 중점을 두지만, 도메인 패턴으로서 사용되는 관점에서는 프로세스나 정책적인 규칙과 같은, 상호 대체될 수 있는 여러 개념을 표현하는 능력에 중점을 둔다.


Composite

01.png

부분과 전체의 계층을 표현하기 위해 복합 객체를 트리 구조로 만든다. Composite 패턴을 사용한다면 클라이언트가 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있다.

복잡한 도메인을 모델링하는 동안 중요한 객체가 여러 개의 작은 부분으로 조합되어 구성되는 경우가 있다. 특히 개별적인 객체들과 객체 집합 간의 처리 방법이 차이가 없을 경우에 이 Composite 패턴이 많이 사용된다.

도메인 모델링할 때 어떠한 개념에 전체 / 부분이라는 계층 구조가 존재하고 이들을 다룰 때 동일한 방법(메서드나 인터페이스)으로 추상화시킬 수 있을 때 Composite 패턴을 통해 모델링할 수 있을 것이다.


Flyweight?

Flyweight 패턴은 도메인 모델과는 전혀 상관없는 디자인 패턴이라고 할 수 있다. 제한된 수의 Value Object 집합이 자주 사용될 경우에는, Flyweight 패턴이 사용할 수도 있는 선택 사항일 뿐이지만 식별성이 존재하는 Entity에 대해서는 적용이 불가능하다.

디자인 패턴을 차용하여 도메인 모델링에 사용되는 도메인 패턴은 모델과 구현에 모두 패턴이 적용된다는 특징이 있다. 기술적인 문제에 대한 해법 뿐만 아니라 개념적인 도메인에 관한 해법, 즉 도메인 모델링을 진행함에 있어서 더 큰 통찰력을 반영할 수 있는 해법을 제공해야 한다는 것이 디자인 패턴 -> 도메인 패턴으로 차용하기 위한 유일한 요구사항이다.


Tags:
Stats:
0 comments