모델 주도 설계의 기본 요소
04 도메인의 격리
05 소프트웨어에서 표현되는 모델
모델을 표현하는 세가지 패턴
- ENTITY (엔티티) : 어떤 객체가 연속성과 식별성을 지니는 것
- VALUE OBJECT (값 객체) : 다른 뭔가의 상태를 기술하는 속성에 불과한 것
- SERVICE (서비스) : 상태를 주고 받지 않고 수행하는 것 (행동이나 연산)
연관관계
- 모델링과 구현 간의 상호작용은 여러 객체 간의 연관관계에서 까다롭다.
- 연관관계를 좀 더 쉽게 다루는 방법으로 세가지가 있다.
- 탐색 방향을 부여한다.
- 한정자를 추가해서 다중성을 줄인다.
- 중요하지 않은 연관관계를 제거한다.
- 양방향 연관관계보다 단방향 연관관계가 구현하기 쉬움으로 가능한 관계를 제약한다.
- 상호의존성이 줄어들고 설계가 단순해지며 더욱 실제적인 설계를 만들 수 있다.
① ENTITY (엔티티, 참조객체)
- 엔티티는 속성이 아닌 식별성에 의해 정의된다.
- 개념적 식별성은 객체와 해당 객체의 저장 형태, 현실의 행위자의 구현 사이에서 일치해야 한다.
- 엔티티는 곧 객체의 생명주기 내내 이어지는 추상적인 연속성이며, 이런 연속성은 여러 형태를 거쳐 전달된다.
- 엔티티에는 모델링과 설계 상의 특수한 고려사항이 포함되어 있다.
- 엔티티에 포함된 특정 속성보다 엔티티 자체의 정체성에 초점을 맞춰야 한다.
- 의미에 따라 엔티티를 분류해야 모델이 투명해지고 구현이 견고해진다.
뱅킹 어플리케이션
- 두 예금 : 제각기 식별성을 지니고 있으므로 엔티티에 해당한다.
- 금액 속성 : 동일한 금액 객체의 인스턴스로 서로 구별할 필요가 없으므로 식별성이 없어 엔티티에 해당하지 않는다.
- 각 거래 : 최소한 두 가지 형태로 나타나는 엔티티에 해당한다.
엔티티 정의
- 한 객체가 속성보다는 식별성으로 구분될 경우 해당 객체의 주된 정의로 삼는다.
- 클래스 정의를 단순하게 하고 생명주기의 연속성과 식별성에 집중한다.
- 객체의 형태나 이력에 관계없이 각 객체를 구별하는 수단을 정의하고 해당 객체에 대해 유일한 결과를 반환하는 연산을 정의한다.
- 객체의 속성으로 객체의 일치 여부를 판단하는 요구사항에 주의한다.
경기장 예매 어플리케이션
- 지정석인 경우 각 입장권에는 좌석번호가 지정되므로 좌석은 엔티티다.
- 좌석의 식별자는 좌석번호이며 경기장 내에서 유일하다.
- 일반석인 경우 개별 좌석을 구분하지 않고 전체 좌석의 개수만 알면 된다.
- 특정 좌석번호와 입장권을 연관시키지 않아도 되므로 좌석은 엔티티가 아니다.
ENTITY 모델링
- 엔티티는 객체의 행위가 명확하고 예측 가능해질 수 있게 연속성을 확립한다.
- 엔티티의 속성이나 행위에 집중하기 보다, 해당 객체의 본질적인 특징만으로 정의한다.
- 특히 해당 엔티티를 식별하고 탐색하며 일치시키는 것이 가장 본질적인 특징이다.
- 개념에 필수적인 행위만 추가하고 그 행위에 필요한 속성만 추가한다.
식별 연산의 설계
각 엔티티에는 다른 객체와 구분해줄 식별성을 만들어내는 수단(ID)이 반드시 있어야 한다.
- 어떤 데이터 속성이나 여러 속성의 조합이 될 수 있음
- 해당 클래스 내에서 유일한 기호를 덧붙여 사용할 수 있음
- 다른 기관에서 발생하는 식별자를 사용할 수 있음
② VALUE OBJECT (값 객체)
- 개념적 식별성을 가지고 있지 않으면서 도메인의 서술적 측면(속성)을 나타내는 것을 VALUE OBJECT라고 한다.
- 설계 요소를 표현할 목적으로 인스턴스화된다.
- 설계 요소가 어느것인지보다 해당 요소가 무엇인지에 대해서만 관심을 가진다.
주소 (Address)
- 배달 어플리케이션에는 물건을 보낼 주소가 필요하다.
- 룸메이트끼리 같은 물건을 주문하더라도 두 사람이 같은 곳에 산다는 사실은 중요하지 않다.
- 이 경우 주소는 VALUE OBJECT다.
- 주소를 지역, 도시, 우편 구역, 블록, 개별 주소로 이루어진 계층구조로 만들 수도 있다.
- 이 경우 부모 계층으로부터 우편번호를 도출하기 때문에 모든 주소는 부모 계층의 주소에 따라 바뀔 것이다.
- 이 경우 주소는 ENTITY다.
값 객체의 예시
- 값 객체를 만들기 위해 복잡한 알고리즘이 포함되어 있을 수 있다.
- 다른 여러 객체를 조립하여 만들 수 있다.
- 엔티티를 참조할 수 있다.
- 여러 객체 간에 오가는 메세지의 매개변수로 전달되기도 한다.
VALUE OBJECT 설계
- 객체는 다른 객체로 복사될 수도 있고 두 객체 간에 공유도 가능하다.
- 한 객체의 속성이 바뀔 때 다른 객체의 속성이 변경되면 안된다.
- 객체를 안전하게 공유할 수 있으려면 해당 객체는 불변적이어야 한다.
- 만약 한 객체를 모두 상호 교환 가능한 것으로 간주한다면 해당 인스턴스를 공유해서 같은 것을 가리키게 할 수 있다.
- 복사와 공유 중 어느것이 경제성 면에서 더 나은지 판단한다.
객체를 공유하는 경우
- 공간을 절약하거나 데이터베이스 내의 객체 수를 줄이는 것이 중요한 경우
- 통신 부하가 낮은 경우 (중앙집중형 서버)
- 공유 객체의 불변성이 엄격하게 지켜지는 경우
불변성을 허용하는 경우
- 값이 자주 변경되는 경우
- 객체 생성이나 삭제에 비용이 많이 드는 경우
- 교체로 인해 클러스터링이 제한되는 경우
- 값을 공유할 일이 많이 않으나 클러스크링을 향상시키기 위해 다른 기술적인 이유로 공유가 보류된 경우
VALUE OBJECT를 활용한 데이터베이스 최적화
- 데이터베이스는 디스크 상의 물리적인 위치에 데이터를 놓아야 하고 데이터를 옮기고 읽는데 시간을 들인다.
- 동일한 인스턴스에 대한 객체 참조를 공유하기보다 사본을 만들어 사용하는 방식을 이용하면 복잡해지지만 시간은 단축할 수 있다.
- 동일한 데이터에 대해 여러 개의 사본을 저장하는 기법을 역정규화라고 한다.
- 분산 시스템에서 다른 서버에 위치한 값 객체의 참조를 갖고 있으면 응답이 느리므로 사본을 가지고 있는 것이 나을 수 있다.
VALUE OBJECT를 포함한 연관관계 설계
- 모델에 포함된 연관관계 수가 적고 단순할수록 더 나은 모델이다.
- 엔티티 간의 양방향 관계는 가능은 하지만 유지보수가 어렵다.
- 그러나 값 객체 간의 양방향 관계는 논리적으로 타당하지 않으므로 완전히 제거하도록 한다.
③ SERVICE (서비스)
- 설계가 매우 명확하고 실용적이더라도 개념적으로 어떤 객체에도 속하지 않는 도메인 연산이 있다.
- 그럴 때 모델에 서비스를 명시적으로 포함한다.
- 대부분 사물이 아닌 활동이나 행동에 해당하는데 이런 연산도 객체와 잘 어울리도록 해야 한다.
- 객체의 정의에 어울리지 않는 연산을 강제로 객체에 포함시킨다면 해당 객체는 명확성을 잃어버리고 이해하기 어려워진다.
- 행위자는 이름 끝에 Manager와 같은 것을 붙여 연산 이상으로는 어떠한 의미를 갖지 않도록 하는 것이 좋다.
잘 만들어진 서비스
중요한 도메인 연산이 엔티티나 값 객체의 고유한 책임이 아니라면 연산을 서비스로 선언되는 독립 인터페이스로 모델에 추가한다.
- 연산이 원래부터 엔티티나 값 객체의 일부를 구성하는 것이 아니라 도메인 개념과 관련되어 있다.
- 인터페이스가 도메인 모델의 외적 요소의 측면에서 정의된다.
- 연산이 상태를 갖지 않는다.
서비스와 격리된 도메인 계층
- 서비스는 도메인 계층에서만 이용되는 것은 아니다.
- 도메인 계층에 속하는 서비스와 다른 계층에 속하는 것들을 구분하고 구분을 명확하게 유지하는 책임을 나눠야 한다.
- 도메인 서비스에는 중요한 업무 규칙이 포함되며 기술과 관련된 서비스는 업무와 관련된 어떤 것도 포함되어서는 안된다.
구성 단위
- 엔티티와 값 객체로부터 클라이언트를 분리하는 것과 더불어 도메인 계층의 인터페이스 구성 단위를 제어하는 수단이 된다.
- 단순한 인터페이스 너머 중요한 기능을 캡슐화하고 있기 때문에 구성 단위가 적당한 서비스는 큰 시스템에서 재사용하기 쉬울 수 있다.
- 구성 단위가 세밀한 객체는 분산 시스템에서 비효율적인 메세지 전송을 초래할 수 있고 도메인 지식이 응용 계층으로 흘러가게 한다.
- 그래서 도메인 서비스를 적절히 도입하면 계층 간의 경계를 선명하게 하는데 도움이 된다.
④ MODULE (모듈, 패키지)
'꾸준히 하기 > 스터디' 카테고리의 다른 글
모델 주도 설계의 기본 요소 | 06 - 07 (0) | 2024.05.20 |
---|---|
동작하는 도메인 만들기 | 01 - 03 (0) | 2024.04.29 |