도메인 주도 설계 - 철저입문(2)

SeungHyuk Shin·2022년 2월 26일
0
post-thumbnail

도메인 주도 설계 2장을 읽고 요약한 내용입니다.

시스템 특유의 값을 나타내기 위한 '값 객체'

2.1 값 객체란?

프로그래밍 언어에는 원시 데이터 타입이 있다. 이 원시 데이터 타입만으로도 개발을 할 수 있지만, 때로는 시스템 특유의 값을 정의해야 할 때가 있다. 위의 프로그램을 실행하면 콘솔에 이름이 출력된다.

var fullName = "Shin SeungHyuk";
var tokens = fullNmae.Split(' ');
var lastName = tokens[0];
Console.WriteLine(lastName);

이 코드는 우리가 의도한 대로 fullName의 값에서 성시 뿌부남ㄴ 떼어내 출력하면 되지만, 이 로직이 제대로 동작하지 않는 상황이 있다.

var fullName = "john smith"
var tokens = fullName.Split(' ')
var lastName = tokens[0]
Console.WriteLine(lastName)

john smith의 성은 smith이다. 이는 이름을 쓰는 관습에 따라 성시까 앞에 오는 경우도 있고 뒤에 오는 경우도 있기 때문이다. 객체지향 프로그래밍에서는 이런 문제를 해결하기 위해 클래스를 사용한다.

class FullName{

	public FullName(string firstName, string lastName){
    
    firstName = firstName;
    lastNmae = lastName;
    
    }
    
    public string FirstName { get;}
    public string LastName { get; }

}

값의 성질로는 대표적으로 다음 세가지를 꼽을 수 있다.

  • 불변성
  • 주고받을 수 있다.
  • 등가성을 비교할 수 있다.

값의 불변성

우리는 변수를 통해서 값을 수정하는 것처럼 느낀다. 하지만 사실 대입은 값을 수정하는 과정이 아니다. 대입을 통해 수정 되는 것은 변수의 내용이지, 값 자체가 수정되는 것이 아니다.

값은 처음부터 끝까지 변하지 않는다. 값이 변했다면 어떤일이 일어날까?

"안녕하세요".ChangeTo("Hello") // 실제로 이런 메서드는 없다.
Console.WriteLine("안녕하세요") // Hello가 출력된다

만약 이런 동작이 가능하다면 개발자는 매우 혼란스러울 것이다.

var fullName = new FullName("SeungHyuk","Shin")
fullName.ChangeLastName("Kim")

fullName은 시스템 특유의 값을 표현하는 값 객체다. 그리고 FullName은 값이기도 하다. 그러므로 변하지 않아야 한다.

교환 가능하다.

변하지 않는 성질을 갖는 값 자체를 수정할 수 없다. 이것은 값 객체 또한 마찬가지다. 값 객체의 수정 역시 값과 마찬가지로 대입문을 통해 교환의 형식으로 표현된다.

var fullName = new Fullname("seunghyuk", "shin")
fullName = new Fullname("seunghyuk", "kim")

값 객체를 도입했을 때의 장점

당연한 일이지만 시스텍 고유의 값을 객체로 나타내면 그만큼 정의하는 클래스의 수도 늘어난다. 원스 타입 값을 잘 활용하는 방법으로 개발해왔기 때문에 많은 수의 클래스를 정의하는 것을 껄끄러워 하는 개발자도 많다

값 객체를 도입하려면 여기에 따르는 심리적 장애물을 넘어야 한다.

어떤 이유로 값 객체가 필요한지 이해한다면 좀 더 많은 사람이 값 객체의 필요성을 느끼고 프로젝트에 도입하게 될 것이다.

값 객체의 장점은 크게 네가지다.

  • 표현력이 증가한다.
  • 무결성의 유지된다.
  • 잘못된 대입을 방지한다.
  • 로직이 코드 이고저곳에 흩어지는 것을 방지한다.

0개의 댓글