[java Anti Pattern Series] 16.anemicdomainmodel
January 30, 2025
Anemic Domain Model
- 도메인 객체에 동작이 거의 또는 포함되지 않고 있고 대부분의 비즈니스 로직이 별도의 서비스 또는 관리자 클래스에서 구현되는 안티패턴이다.
- 도메인 객체가 수동적인 데이터 구조로, 해당 객체와 연관되어야 하는 동작이 없는 애플리케이션 아키텍쳐가 생성된다.
1. 빈약한 도메인 모델
- 도메인 객체에 동작이 없고 대신 상태를 저장하는 단순한 데이터 구조로 사용되는 아티 패턴이다.
- 동작과 데이터를 객체 안에 컵슐화 해야하는 객체 지향 프로그래밍의 기본 원칙에 위배된다.
- 보통 이런 객체는 getter, setter만 포함한다.
2. 의미
- 객체 지향 원칙 위반 : 동작, 데이터를 분리함으로써 객체 지향 프로그래밍 원칙을 위반한다.
- 코드 중복 : 비즈니스 로직이 별도의 서비스 클래스로 구현되기 때문에 여러 서비스 간의 코드가 중복될 가능성이 높다.
- 낮은 응집성 : 도메인 객체는 동작이 없는 단순한 데이터 컨테이너가 되어 클래스 내 응집성이 낮아진다.
- 제한된 캡슐화 : 동작과 데이터가 분리되어 있기에 캡슐화가 손상된다.
- 테스트의 어려움 : 동작이 없기에 비즈니스 로직 테스트가 어렵다.
3. 의미있는 모델
- 리치 도메인 모델 : 도메인 객체가 동작과 데이터를 모두 캡슐화하는 풍부한 도메인 모델을 추구
- DDD : 도메인 주도 설계 원칙을 채택하면 풍부한 도메인 객체를 만드는데 도움이 된다. 도메인 로직에 초점을 맞추고 도메인 객체 내에서 모델링함으로써 DDD는 소프트웨어 개발에 대한 보다 전체적인 접근 방식을 장려
- 디자인 패턴 : strategy, factoryMethod, command 등과 같은 디자인 패턴을 활용해서 객체 내 동작을 캡슐화
- 서비스 계층 리펙토링 : 상속 대신 객체 구성을 강조하여 복잡한 도메인 모델을 구축