지원 서재
작성일
2024. 5. 7. 18:02
작성자
달빛오리

모델 주도 설계의 기본 요소

 


04 도메인의 격리

 


05 소프트웨어에서 표현되는 모델

 

모델을 표현하는 세가지 패턴

  • ENTITY (엔티티)  : 어떤 객체가 연속성과 식별성을 지니는 것
  • VALUE OBJECT (값 객체)  : 다른 뭔가의 상태를 기술하는 속성에 불과한 것
  • SERVICE (서비스)  : 상태를 주고 받지 않고 수행하는 것 (행동이나 연산)

 

연관관계

  • 모델링과 구현 간의 상호작용은 여러 객체 간의 연관관계에서 까다롭다.
  • 연관관계를 좀 더 쉽게 다루는 방법으로 세가지가 있다.
    1. 탐색 방향을 부여한다.
    2. 한정자를 추가해서 다중성을 줄인다.
    3. 중요하지 않은 연관관계를 제거한다.
  • 양방향 연관관계보다 단방향 연관관계가 구현하기 쉬움으로 가능한 관계를 제약한다.
  • 상호의존성이 줄어들고 설계가 단순해지며 더욱 실제적인 설계를 만들 수 있다.

양방향 → 단방향으로 연관관계 제거
기간이라는 제약이 더해진 연관관계

 

① ENTITY (엔티티, 참조객체)

  • 엔티티는 속성이 아닌 식별성에 의해 정의된다.
  • 개념적 식별성은 객체와 해당 객체의 저장 형태, 현실의 행위자의 구현 사이에서 일치해야 한다.
  • 엔티티는 곧 객체의 생명주기 내내 이어지는 추상적인 연속성이며, 이런 연속성은 여러 형태를 거쳐 전달된다.
  • 엔티티에는 모델링과 설계 상의 특수한 고려사항이 포함되어 있다.
  • 엔티티에 포함된 특정 속성보다 엔티티 자체의 정체성에 초점을 맞춰야 한다.
  • 의미에 따라 엔티티를 분류해야 모델이 투명해지고 구현이 견고해진다.

 

뱅킹 어플리케이션

  • 두 예금 : 제각기 식별성을 지니고 있으므로 엔티티에 해당한다.
  • 금액 속성 : 동일한 금액 객체의 인스턴스로 서로 구별할 필요가 없으므로 식별성이 없어 엔티티에 해당하지 않는다.
  • 각 거래 : 최소한 두 가지 형태로 나타나는 엔티티에 해당한다.

 

엔티티 정의

  • 한 객체가 속성보다는 식별성으로 구분될 경우 해당 객체의 주된 정의로 삼는다.
  • 클래스 정의를 단순하게 하고 생명주기의 연속성과 식별성에 집중한다.
  • 객체의 형태나 이력에 관계없이 각 객체를 구별하는 수단을 정의하고 해당 객체에 대해 유일한 결과를 반환하는 연산을 정의한다.
  • 객체의 속성으로 객체의 일치 여부를 판단하는 요구사항에 주의한다.

 

경기장 예매 어플리케이션

  • 지정석인 경우 각 입장권에는 좌석번호가 지정되므로 좌석은 엔티티다.
  • 좌석의 식별자는 좌석번호이며 경기장 내에서 유일하다.
  • 일반석인 경우 개별 좌석을 구분하지 않고 전체 좌석의 개수만 알면 된다.
  • 특정 좌석번호와 입장권을 연관시키지 않아도 되므로 좌석은 엔티티가 아니다.

 

ENTITY 모델링

  • 엔티티는 객체의 행위가 명확하고 예측 가능해질 수 있게 연속성을 확립한다.
  • 엔티티의 속성이나 행위에 집중하기 보다, 해당 객체의 본질적인 특징만으로 정의한다.
  • 특히 해당 엔티티를 식별하고 탐색하며 일치시키는 것이 가장 본질적인 특징이다.
  • 개념에 필수적인 행위만 추가하고 그 행위에 필요한 속성만 추가한다.

식별성과 관계 있는 속성은 ENTITY에 남는다.

 

식별 연산의 설계

각 엔티티에는 다른 객체와 구분해줄 식별성을 만들어내는 수단(ID)이 반드시 있어야 한다.

  1. 어떤 데이터 속성이나 여러 속성의 조합이 될 수 있음
  2. 해당 클래스 내에서 유일한 기호를 덧붙여 사용할 수 있음
  3. 다른 기관에서 발생하는 식별자를 사용할 수 있음

 

② VALUE OBJECT (값 객체)

  • 개념적 식별성을 가지고 있지 않으면서 도메인의 서술적 측면(속성)을 나타내는 것을 VALUE OBJECT라고 한다.
  • 설계 요소를 표현할 목적으로 인스턴스화된다.
  • 설계 요소가 어느것인지보다 해당 요소가 무엇인지에 대해서만 관심을 가진다.

 

주소 (Address)

  • 배달 어플리케이션에는 물건을 보낼 주소가 필요하다.
  • 룸메이트끼리 같은 물건을 주문하더라도 두 사람이 같은 곳에 산다는 사실은 중요하지 않다.
  • 이 경우 주소는 VALUE OBJECT다.
  • 주소를 지역, 도시, 우편 구역, 블록, 개별 주소로 이루어진 계층구조로 만들 수도 있다.
  • 이 경우 부모 계층으로부터 우편번호를 도출하기 때문에 모든 주소는 부모 계층의 주소에 따라 바뀔 것이다.
  • 이 경우 주소는 ENTITY다.

 

값 객체의 예시

  1. 값 객체를 만들기 위해 복잡한 알고리즘이 포함되어 있을 수 있다.
  2. 다른 여러 객체를 조립하여 만들 수 있다.
  3. 엔티티를 참조할 수 있다.
  4. 여러 객체 간에 오가는 메세지의 매개변수로 전달되기도 한다.

VALUE OBJECT는 개념적으로 완전해야 한다.

 

VALUE OBJECT 설계

  • 객체는 다른 객체로 복사될 수도 있고 두 객체 간에 공유도 가능하다.
  • 한 객체의 속성이 바뀔 때 다른 객체의 속성이 변경되면 안된다.
  • 객체를 안전하게 공유할 수 있으려면 해당 객체는 불변적이어야 한다.
  • 만약 한 객체를 모두 상호 교환 가능한 것으로 간주한다면 해당 인스턴스를 공유해서 같은 것을 가리키게 할 수 있다.
  • 복사와 공유 중 어느것이 경제성 면에서 더 나은지 판단한다.

 

객체를 공유하는 경우

  • 공간을 절약하거나 데이터베이스 내의 객체 수를 줄이는 것이 중요한 경우
  • 통신 부하가 낮은 경우 (중앙집중형 서버)
  • 공유 객체의 불변성이 엄격하게 지켜지는 경우

 

불변성을 허용하는 경우

  • 값이 자주 변경되는 경우
  • 객체 생성이나 삭제에 비용이 많이 드는 경우
  • 교체로 인해 클러스터링이 제한되는 경우
  • 값을 공유할 일이 많이 않으나 클러스크링을 향상시키기 위해 다른 기술적인 이유로 공유가 보류된 경우

 

VALUE OBJECT를 활용한 데이터베이스 최적화

  • 데이터베이스는 디스크 상의 물리적인 위치에 데이터를 놓아야 하고 데이터를 옮기고 읽는데 시간을 들인다.
  • 동일한 인스턴스에 대한 객체 참조를 공유하기보다 사본을 만들어 사용하는 방식을 이용하면 복잡해지지만 시간은 단축할 수 있다.
  • 동일한 데이터에 대해 여러 개의 사본을 저장하는 기법을 역정규화라고 한다.
  • 분산 시스템에서 다른 서버에 위치한 값 객체의 참조를 갖고 있으면 응답이 느리므로 사본을 가지고 있는 것이 나을 수 있다.

 

VALUE OBJECT를 포함한 연관관계 설계

  • 모델에 포함된 연관관계 수가 적고 단순할수록 더 나은 모델이다.
  • 엔티티 간의 양방향 관계는 가능은 하지만 유지보수가 어렵다.
  • 그러나 값 객체 간의 양방향 관계는 논리적으로 타당하지 않으므로 완전히 제거하도록 한다.

 

③ SERVICE (서비스)

  • 설계가 매우 명확하고 실용적이더라도 개념적으로 어떤 객체에도 속하지 않는 도메인 연산이 있다.
  • 그럴 때 모델에 서비스를 명시적으로 포함한다.
  • 대부분 사물이 아닌 활동이나 행동에 해당하는데 이런 연산도 객체와 잘 어울리도록 해야 한다.
  • 객체의 정의에 어울리지 않는 연산을 강제로 객체에 포함시킨다면 해당 객체는 명확성을 잃어버리고 이해하기 어려워진다.
  • 행위자는 이름 끝에 Manager와 같은 것을 붙여 연산 이상으로는 어떠한 의미를 갖지 않도록 하는 것이 좋다.

 

잘 만들어진 서비스

중요한 도메인 연산이 엔티티나 값 객체의 고유한 책임이 아니라면 연산을 서비스로 선언되는 독립 인터페이스로 모델에 추가한다.

  1. 연산이 원래부터 엔티티나 값 객체의 일부를 구성하는 것이 아니라 도메인 개념과 관련되어 있다.
  2. 인터페이스가 도메인 모델의 외적 요소의 측면에서 정의된다.
  3. 연산이 상태를 갖지 않는다.

 

서비스와 격리된 도메인 계층

  • 서비스는 도메인 계층에서만 이용되는 것은 아니다.
  • 도메인 계층에 속하는 서비스와 다른 계층에 속하는 것들을 구분하고 구분을 명확하게 유지하는 책임을 나눠야 한다.
  • 도메인 서비스에는 중요한 업무 규칙이 포함되며 기술과 관련된 서비스는 업무와 관련된 어떤 것도 포함되어서는 안된다.

서비스를 여러 계층으로 분할

 

구성 단위

  • 엔티티와 값 객체로부터 클라이언트를 분리하는 것과 더불어 도메인 계층의 인터페이스 구성 단위를 제어하는 수단이 된다.
  • 단순한 인터페이스 너머 중요한 기능을 캡슐화하고 있기 때문에 구성 단위가 적당한 서비스는 큰 시스템에서 재사용하기 쉬울 수 있다.
  • 구성 단위가 세밀한 객체는 분산 시스템에서 비효율적인 메세지 전송을 초래할 수 있고 도메인 지식이 응용 계층으로 흘러가게 한다.
  • 그래서 도메인 서비스를 적절히 도입하면 계층 간의 경계를 선명하게 하는데 도움이 된다.

 

④ MODULE (모듈, 패키지)