JAVA/Architecture

[DDD] Entity와 Value Object

호두밥 2022. 1. 30. 17:23

Entity

엔티티는 식별자(identity)를 가지는 객체(Object)입니다. 예를 들어 도서는 ISBN을 식별자로 같은 Entity가 될 수 있습니다. 

엔티티는 식별자를 갖기 때문에, Equals 비교에서 식별자가 값이 같으면 같은 객체로 인식합니다.

엔티티는 데이터 변경 이력을 관리하는 대상입니다.  즉 시간이 지남에 따라 정보를 추적할 수 있는 객체입니다. 

 식별자 생성 방법

  • 채번 규칙
    • 날짜값+일련번호와 같이 정해진 규칙에 따라 식별자를 만드는 방식

 

  • UUID(Universally unique identifier)
    • java.util.UUID 클래스를 이용해서 식별자를 만드는 방식

 

  • 직접 입력
    • 회원 ID나 전화번호, 이메일 등과 같이 사용자가 입력하는 방식

 

  • 일련번호
    • DB의 auto_increment 칼럼을 이용해 식별자를 만드는 방식

 

Value Object

VO는 식별자가 없고, 어떤 개념이 가진 특성(값)들을 설명하는 객체입니다. 예를 들어 "주소지"와 같이 개별 식별자를 갖지 않으면서,  시도, 시군구, 읍면동, 도로명, 번지수 등의 값으로만 구성되는 객체들을 VO라고 합니다. 

식별자가 없기 때문에 가지고 있는 값들로 같은 객체인지 판단합니다. (값들로 객체를 식별합니다.)

Value Object를 생성할 때는 데이터 변경 기능을 제공하지 않는 타입(immutable)으로 생성하는 것을 추천합니다. set 메소드를 통해 외부에서 값을 변경하게 되면, 내부에 값이 잘못 변영되는 상황이 발생하게 될 수 있습니다. 때문에 값이 변경된다면, 새로운 객체를 만들어 반환하는 방식을 이용합니다. 

Value Object는 데이터 변경 이력을 관리하는 대상이 아닙니다. (데이터 변경 기능을 제공하지 않고, 데이터 변경이 일어나면 기존 VO는 사라지고 새로운 VO가 생성됩니다.) 특정 시점의 스냅샷과 같습니다. 

public class Juso{
	private String city;
    private String road;
    
    //생성자
    public Juso(String city, String road){
    	this.city = city;
        this.road = road;
    }
    //주소지변경
    public Juso modifyRoad(String road){
    	return new Juso(this.city, road);
    }
}

 

Entity와 Value Object 차이

  Entity Value Object
Equals 식별자 (identifier equality) 값(structural equality)
Mutability(불변성) 변할 수 있음(mutable) 불변(immutable)
Lifespan 수명 있음 수명 없음

 

참고자료