도메인 이란?

조영호님 : 개발자 입장에서 소프트웨어를 개발하는 대상 영역정도로 생각하자.

ex) 택시 앱을 만든다면 택시 기사님께 콜을 하고, 탑승하고, 요금을 지불하는 전 과정이 도메인이 된다.

이렇게 개발 대상과 범위를 간단히 도메인이라고 봐도 무방하다.

소프트웨어로 해결하고자 하는 문제 영역이 도메인에 해당한다.

도메인 모델

특정 도메인을 개념적으로 표현한 것.

도메인은 다수의 하위 도메인으로 구성된다. 도메인에 따라 용어의 의미가 결정되므로, 여러 하위 도메인을 하나의 다이어그램에 모델링하면 안된다.

  • ex) 카탈로그 도메인의 상품은 상품의 상세내용 이지만 배송 도메인의 상품은 고객에게 실제 배송되는 물리적인 상품을 의미한다.

Entity, Value Object

Entity

  • 가장 큰 특징은 식별자(ID)를 갖는다는 것.
  • 식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 가진다.
  • equals() 와 hashCode를 ID로 정의하자!

Value Object (이하 VO)

  • 개념적으로 완전한 하나를 표현할 때 사용.
  • VO를 사용함으로써 개념적으로 완전한 하나를 잘 표현할 수 있다.
  • 비교할 때 객체의 모든 값을 이용해 비교한다. 모든 값이 같다면 같은 객체로 취급한다.
  • VO는 코드의 의미를 더 잘 이해할 수 있도록 한다.
  • VO의 데이터를 변경할 때는 기존의 데이터를 변경하기보다는 변경한 데이터를 갖는새로운 VO를 생성하는 방식을 선호한다. (궁금하면 String class를 까보자! String은 대표적인 VO이다.)
    • 데이터 변경 기능을 제공하지 않는 타입을 불변(immutable)이라고 표현한다.
    • 불변으로 구현하는 가장 큰 이유는 불변 타입을 사용하면 보다 안전한 코드를 작성할 수 있다.
public class Money {
    private int value;

    public Money(int value) {
        this.value = value;
    }

    public Money add(Money money) {
        return new Money(this.value + money.value);
    }

    public int getValue() {
        return value;
    }
}

DTO (Date Transfer Object)

  • 최근 많은 프레임워크나 개발 도구는 set 메서드가 아닌 private 필드에 직접 값을 할당할 수 있는 기능을 제공하고 있다. 따라서 set 메서드를 제공하지 않아도 프레임워크를 이용해서 데이터를 전달받을 수 있다. 해당 기능을 최대한 활용해 DTO(Data Transfer Object)도 불변 객체로 만들어 보자! 링크

도메인 용어

코드를 작성할 때 도메인에서 사용하는 용어는 매우 중요하다. 도메인에서 사용하는 용어를 코드에 반영하지 않으면 그 코드는 개발자에게 코드의 의미를 해석해야 하는 부담을 준다.

적당한 단어를 찾는 노력을 하지 않고 도메인에 어울리지 않는 단어를 사용하면 코드는 도메인과 점점 멀어진다. 그러니, 도메인 용어에 알맞는 단어를 찾는 시간을 아까워하지 말자.