🧐TIL
[DDD] 애그리게이트, Aggregate
date
Mar 12, 2023
thumbnail
slug
ddd-aggregate
author
status
Public
summary
“도메인 주도 설계 철저 입문”을 읽으며 공부한 내용을 정리합니다.
type
Post
category
🧐TIL
tags
TIL
DDD
Architecture
updatedAt
Jun 18, 2023 05:57 AM
애그리게이트
객체 지향 프로그래밍에서는 여러 객체들이 모여 다시 하나의 의미를 갖는 객체가 된다. 이렇게 여러 객체가 모여 이룬 객체는 단일 객체와 마찬가지로 어떤 처리를 할 때 정해진 규칙과 조건을 유지해야 한다.
이런 불변 조건은 언제나 유지되어야 하지만 여러 객체를 조작하면서 데이터의 변경을 무제한으로 허용하다보면 불변 조건을 유지하기가 어려워진다. 그래서 객체의 무제한적인 조작을 막고 일관성이 유지되도록 경계와 루트를 갖도록 한 개념이 애그리게이트(Aggregate)다.
경계와 루트
애그리게이트는 서로 연관된 객체를 감싸는 경계를 통해 정의된다. 이 경계는 직접적으로 드러나는 것은 아니지만 개념상 경계 밖에서는 애그리게이트 내부의 객체를 조작할 수 없다.
대신 애그리게이트의 조작은 애그리게이트의 직접적인 인터페이스가 되는 애그리게이트 루트(aggregate root) 객체를 통해서만 가능하도록 하여 애그리게이트 경계 내에 속한 객체들의 무분별한 조작을 통제한다.
예를 들면 ‘사용자’라는 애그리게이트를 정의한다면 해당 애그리게이트에 속하는 객체들은 User, UserId, UserName 등이 되는데 이 중 User 가 애그리게이트 루트가 되며 UserId나 UserName은 외부에서 직접 조작할 수 없다. 대신 UserId나 UserName을 조작하고 싶을 경우에는 User에 정의된 메소드를 통해서만 조작이 가능하도록 한다.
객체 조작의 기본 원칙
객체 간 메소드 호출에도 질서가 유지되어야 불변 조건을 지킬 수 있는데 객체 조작에 대한 규칙을 부여하기 위해 데메테르의 법칙을 적용할 수 있다.
데메테르의 법칙은 컨텍스트에서 다음 객체의 메소드만을 호출하도록 제한한다.
- 객체 자신
- 인자로 전달받은 객체
- 인스턴스 변수
- 해당 컨텍스트에서 직접 생성한 객체
애그리게이트 변경 및 조작의 단위
애그리게이트의 경계를 어디에 둘 것인지 결정하는 것은 어려운 일이지만 가장 흔히 쓰이는 조건은 변경의 단위다. 사용자 애그리게이트를 정의했다면 애그리게이트를 조작해서 변경할 수 있는 것은 어디까지나 해당 애그리게이트 내에 정의된 사용자 관련 객체 뿐이다.
만약 사용자 애그리게이트를 조작했는데 사용자 연관 객체들이 모두 수정가능하다면 변경 단위가 너무 커져서 연관 객체 리포지토리 조작 코드로 사용자 애그리게이트가 오염되고 중복 코드가 넘쳐나게 될 것이다.
또한 애그리게이트의 크기가 커질 수록 한번에 조작해야하는 데이터의 크기가 커지고 처리가 실패할 가능성이 높아지게 된다. 따라서 애그리게이트의 크기는 가능한 한 작게 유지하는 것이 좋으며 하나의 트랜잭션에서 여러 애그리게이트를 다루는 것 또한 피해야 한다.