도메인 주도 설계 입문 - 챕터 03

BackEnd_Ash.log·2023년 6월 17일
0

nestjs

목록 보기
8/12

생애주기를 갖는 객체 ( 엔티티 )

엔티티란 무엇인가 ?

동일성으로 식별되는 객체

객체라는 말은 흔히 들어서 이해가 되지만 동일성이란 무슨 말일까 ?

사용자가 최초로 등록되고 난후 값들이 변경이 되어도 해당 사용자가 다른 사용자가 되는 일은 없다.

우리는 이러한 구별값을 각자마다 UUID , Primary Key 로 식별하곤 한다.

어떠한 특징들을 가질까 ??

  • 가변이다.
  • 속성이 같아도 구분할 수 있다.
  • 동일성을 통해 구별된다.

가변이다.

앞서 얘기한것처럼 식별할 수 있는 값만 있으면 값들은 변동이 된다.
username 이 변경이 될 수도 있고 , age 가 변경 될 수도 있다.

이는 반드시 가변일 필요가 없으며, 필요에 따라 속성을 가변으로 만들 수 있는 객체일 뿐이다.

다만

class User
  private string name;
  public User(string name) {
     if (name == null) throw new ArgumentNullException(nameof(name));
  if (name.Legnth < 3) throw new ArgumentException("user 3글자")
  this.name = name;
  ...
class user
  private string name;
  public User(string name) {
    ChangeName(name);
  }
  
  public void ChangeName(string name) {
  if (name == null) throw new ArgumentNullException(nameof(name));
  if (name.Legnth < 3) throw new ArgumentException("user 3글자")
  this.name = name;
  }

setter 를 사용하기 보단, 이름을 변경하는 메서드를 생성해서 변경 하도록 하자

속성이 같아도 구분 할 수 있다.

이는 쉽게 이해할 수 있을것 같다.

id = 1
name = jon
age = 32
id =2
name = jon
age = 32

두개의 값 객체는 같은 객체가 아니다. 값이 같을 뿐이지 엄연히 다른 객체이다.
값이 같아도 무언가의 식별자가 존재하게 되는데 위에서는 id 라고 볼 수 있다.

class UserId
{
	private string value;
    
    public UserId(string value)
    {
    	if (value == null) throw new ArgumentNullException(nameof(value));
        this.value = value;
    }
}
...

동일성

사용자가 이름을 변경 하기전과 변경하기 이후 같은 사용자로 인식해야한다.

class User
{
	private readonly UserId; // 식별자
    private string name;
    
    public User(string name)
    {
    	if (id == null) throw new ArgumentNullException(nameof(id));
        
        this.id = id;
        ChangeUserName(name);
    }

	public void ChangeUserName(string name)
	{
		if (name == null) throw new ArgumentNullException(nameof(name));
    	if (name.Length < 3 ) throw new ArgumentException("사용자명은 3글자 이상이어야 함");
    	this.name = name;
    }
}

식별자를 통해 같은 User 인지 아닌지를 판단하기 때문에 UserId 로 판단 하기 위한 메서드가 필요로 하다. 이책에서는

void Check(User leftUser, User rightUser)
{
	if (leftUser.Equals(rightUser))
    {
    	console.WriteLine("동일한 사용자임");
    }
}

를 통해서 판단하고있다.

엔티티의 판단 기준 - 생애주기 와 연속성

엔티티와 값 객체 두개는 유사한점이 많다.
그럼 어떻게 구별을 할까 ?

  • 생애주기를 가지며 연속성을 갖는것 : entitiy
  • 생애주기를 갖지않는것 : 값객체

로서 다루면 좋다.

도메인 객체를 정의할때의 장점

  • 자기 서술적인 코드가 된다.
  • 도메인에 변경사항이 있을 시 코드에 반영하기 쉽다.

자기 서술적인 코드가 된다.

주석이 없어도 술술 익히는코드를 지향하는것처럼 보였다.

class User
{
	public string Name { get; set;}
}

위의 코드에선 내용을 잘 알려주지 않고 있다.

class UserName
{
	private readonly string Value;
    public UserName(string value)

이처럼 코드에 대한 힌트를 많이 줘야한다.

도메인에 일어난 변경을 코드에 반영하기 쉽다.

사람일이 변하기 쉬운것처럼 도메인도 같다.

사용자명의 최소길이가 3글자 이상이였다가 최소길이 6글자 이상으로 바뀔 수도 있다.

profile
꾸준함이란 ... ?

0개의 댓글