도메인 주도 설계 철저 입문 4장 학습 내용을 정리 한다.
서비스란?
소프트웨어 개발에서 말하는 서비스는 클라이언트를 위해 무언가를 해주는 객체를 말한다. 도메인 주도 설계에서 서비스는 크게 두가지로 나뉜다.
1. 도메인을 위한 서비스
2. 애플리케이션을 위한 서비스다.
도메인 서비스란?
시스템에서 값 객체나 엔티티로 구현하기 어색한 행동이 있다. 도메인 서비스는 이런 어색함을 해결해주는 객체다.
어색한 행동 예시 ( 사용자명 중복 허용 금지 )
class User
{
private readonly UserId id;
private UserName name;
public User(UserId id, UserName name)
{
if (id == null) throw new ArgumentNullException(nameof(id));
if (name == null) throw new ArgumentNullException(nameof(name));
this.id = id;
this.name = name;
}
//사용자명 중복 여부 확인 코드 추가
public bool Exists(User user)
{
// 사용자명 중복여부를 확인하는 코드
// ...
}
}
언뜻 보기에 문제가 없어보이지만, 아래 사용 예시를 보면 새로 만든 User객체에 중복 여부를 묻는 상황이 된다.
var userId = new UserId("id");
var userName = new UserName("mklee");
var user = new User(userId, userName);
//새로만든 User객체에 중복 여부를 묻는 상황이 됨
var duplicateCheckResult = user.Exists(user);
중복 여부 확인을 새로 생성한 객체에 맡기면 개발자가 혼란을 일으키기 쉽다. 접근법을 바꿔 사용자명 중복을 확인하는 목적으로 하는 인스턴스를 만든다면
var checkId = new UserId("id");
var checkName = new UserName("checker");
var checkObject = new User(checkId, checkName);
var userId = new UserId("id");
var userName = new UserName("mklee");
var user = new User(userId, userName);
var duplicateCheckResult = checkObject.Exists(user);
자기 자신에게 사용자명 중복 여부를 물어야되는 부자연스러움은 사라졌지만, checkObject가 사용자를 나타내는 객체이면서 사용자가 아니라는 부분에서 어색함이 남아있다.
class UserService
{
public bool Exists(User user)
{
// 사용자명 중복을 확인
// ...
}
}
이렇게 도메인 객체에 넣기 어색한 행동들을 UserService를 만들어 해결할 수 있다. 도메인 서비스는 자신의 행동을 바꿀 수 있는 인스턴스만의 값을 갖지 않는다는 점에서 값 객체나 엔티티와 다르다.
var checkId = new UserId("id");
var checkName = new UserName("checker");
var checkObject = new User(checkId, checkName);
// 도메인 서비스에 요청하기
var userService = new UserService();
var duplicateCheckResult = userService.Exists(user);
도메인 서비스 유의사항
- 남용하지 말 것
- 도메인 서비스는 가능한 한 지양할 것
도메인 객체가 포함해야할 행동들을 모두 도메인 서비스로 구현한다면, 도메인 객체를 스펙으로써 활용할 수 있는 장점들이 사라지게 된다. (빈혈 도메인 모델) 데이터와 행위를 함께 모아 놓는다는 객체 지향 설계의 기본 원칙에 위배 된다.
반응형
'서적 > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
[도메인주도설계철저입문] 7장 소프트웨어의 유연성을 위한 의존 관계 제어 (0) | 2024.03.14 |
---|---|
[도메인주도설계철저입문] 6장 애플리케이션 서비스 (0) | 2024.03.03 |
[도메인주도설계철저입문] 5장 리포지토리 (0) | 2023.10.16 |
[도메인주도설계철저입문] 3장 도메인 엔티티 (0) | 2023.10.15 |
[도메인주도설계철저입문] 2장 값 객체 (0) | 2023.10.14 |