-
객체를 이용해 뭔가를 하려면 해당 객체에 대한 참조를 가지고 있어야 한다.
- 한 가지 방법은 객체를 생성하는 것
- 두 번째 방법은 연관관계를 탐색하는 것
- 데이터베이스 검색은 어디서든 이용할 수 있으며, 곧바로 어떠한 객체에도 접근하게 해준다.
- 유감스럽게도 개발자들은 보통 그와 같은 설계의 미묘한 사항에 관해 충분히 고민하지 않곤 하는데, 이것은 개발자들이 객체를 저장하고 그것을 다시 가져오고, 결국 객체를 저장소에서 제거하는 요령을 알아내는 메커니즘에만 관심을 두기 때문
- 이제 기술적 관점에서 보면 저장된 객체를 가져오는 것은 실제로는 생성의 한 부분집합으로 볼 수 있다.
- 이는 데이터베이스에서 가져온 데이터를 토대로 새로운 객체를 만들어내기 때문
- 하지만 개념상 이것은 특정 ENTITY의 생명주기 가운데 중간 단계에 불과하다.
-
이러한 구분을 염두에 두고자 저자는 저장돼 있는 객체로부터 인스턴스를 만들어 내는 것을 재구성(reconstitution)이라고 한다.
- 도메인 주도 설계의 목표는 기술보다는 도메인에 대한 모델에 집중해 더 나은 소프트웨어를 만들어내는 것
- 메타데이터 매핑 계층과 같은 인프라스트럭처는 질의 결과를 손쉽게 객체로 변환할 수 있어 굉장히 도움되지만 개발자들은 여전히 도메인이 아닌 기술적 메커니즘에 관해 생각하게 된다.
- 더 안 좋은 점은 클라이언트 코드에서 직접적으로 데이터베이스를 사용할수록 개발자들은 AGGREGATE 나 캡슐화와 같은 특징을 활용하는 것을 우회하려 하고, 그 대신 필요한 데이터를 직접 획득해서 조작하게 된다는 것
- 클라이언트는 이미 존재하는 도메인 객체의 참조를 획득하는 실용적인 수단을 필요로 한다.
-
인프라스트럭처에서 도메인 객체의 참조를 쉽게 획득할 수 있게 해준다면 클라이언트 측을 개발하는 개발자들이 좀 더 탐색 가능한 연관관계를 추가해 모델을 엉망으로 만들어 버릴지도 모른다.
- 더 중요한 것은 AGGREGATE 내부에 존재하는 모든 객체는 루트로부터 탐색을 토대로 접근하는 것 말고는 접근이 금지돼 있다는 점이다.
- 대개 영속화된 VALUE OBJECT 는 그것들을 캡슐화하고 AGGREGATE 의 루트 역할을 하는 특정 ENTITY 에서부터 탐색해서 찾을 수 있다.
- 대부분의 객체는 전역적인 검색으로 접근하지 말아야 한다는 점이 분명해진다.
- 이러한 점이 설계에 드러아면 바람직할 것
- 영속 객체는 해당 객체의 속성에 근거해서 검색하는 식으로 전역적으로 접근할 수 있어야 한다.
- 그러한 접근 방식이 필요한 곳은 탐색으로 도달하기에는 편리하지 않은 AGGREGATE 의 루트다.
- 일반적으로 루트는 ENTITY 이며, 간혹 복잡한 내부 구조를 지닌 VALUE OBJECT 이거나 열거형 VALUE 이기도 하다.
-
다른 객체에도 접근할 수 있게 한다면 중요한 구분법이 혼동될 것
- REPOSITORY는 특정 타입의 모든 객체를 (대개 모방된) 하나의 개념적 집합으로 나타낸다.
- 더욱 정교한 질의 기능이 있다는 점을 제외하면 REPOSITORY 는 컬렉션처럼 동작한다.
- 이 같은 정의에는 생명주기의 초기 단계에서 마지막 단계에 이르기까지 AGGREGATE 의 루트에 대한 접근을 제공하는 각종 응집력 있는 책임이 포함된다.
-
REPOSITORY 는 클라이언트에서 요구하는 기준에 근거해 객체를 선택하는 다양한 질의를 구현할 수 있다.
- 객체를 추가하고 제거하는 메서드를 제공하고, 이 메서드가 실제로 데이터 저장소에 데이터를 삽입하고 데이터 저장소에서 제거하는 연산을 캡슐화하게 하라.
- 실질적으로 직접 접근해야 하는 AGGREGATE 의 루트에 대해서만 REPOSITORY 를 제공하고, 모든 객체 저장과 접근은 REPOSITORY 에 위임해서 클라이언트가 모델에 집중하게 하라.
- REPOSITORY 에는 다음과 같은 이점이 있다.
- REPOSITORY는 영속화된 객체를 획득하고 해당 객체의 생명주기를 관리하기 위한 단순한 모델을 클라이언트에 제시
- REPOSITORY는 영속화 기술과 다수의 데이터베이스 전략, 또는 심지어 다수의 데이터 소스로부터 애플리케이션과 도메인 설계를 분리
- REPOSITORY는 객체 접근에 관한 설계 결정을 전해준다.
- REPOSITORY를 이용하면 테스트에서 사용할 가짜 구현을 손쉽게 대체할 수 있다.