Dev/Java

[Java] Value Object와 Entity에 대한 소신 정리

yo0oni 2024. 5. 19. 13:45

한 명의 Member가 Account라는 객체를 가지도록 구현했는데 값 객체와 엔티티의 개념이 모호하여 정리하게 되었다. 아래는 기존 코드이다.

 

1️⃣ Member Entity

public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Valid
    @Embedded
    private Account account;

    @NotBlank
    private String nickname;

    private Role role;

    @Builder
    public Member(Account account, String nickname, Role role) {
        this.account = account;
        this.nickname = nickname;
        this.role = role;
    }
}

Account를 임베디드 해서 가지고 있다.

 

 

2️⃣ Account Value Object

@Embeddable
public record Account(@NotBlank @Column(name="auth_id") String authId, @NotBlank String password) { }

Account는 record로 구현했다. 근데 값 객체로 구현한 Account를 엔티티로 변환할 예정이다. 이유는 아래와 같다.

 


 

Entity

  • 식별자를 가진다. ➡️ 식별자로 동등 여부 파악
  • 생명주기가 있다.
  • 가변성

 

Value Object

  • 식별자가 없다. ➡️ 필드 상태로 동등 여부 파악
  • 생명주기가 없다. ➡️ 무조건 엔티티에 속해야 한다.
  • 불변성 ➡️ 변경하면 새로운 객체 생성한다. ➡️ 만약 가변성을 가진다면 고유한 식별성이 생겨 식별자를 가진다. (DDD 위반)

 

✅ 정리

하나의 객체가 같은 특성 값을 가질 때, 다른 객체로 대체해도 된다면 값 객체에 적합하다. 예를 들어 내가 가지고 있는 1달러가 다른 사람의 1달러와 교환할 수 있으니 달러는 값 객체로 구현하는 게 맞다. 만약 1달러마다 고유한 식별성을 갖고 있어 교환이 어렵다면 엔티티로 구현하는 게 맞다.

 

따라서 Account의 경우 "Member"라는 고유한 식별성을 가지기 때문에 값 객체가 아닌 엔티티로 구현할 것이다.

 

 

https://enterprisecraftsmanship.com/posts/entity-vs-value-object-the-ultimate-list-of-differences/