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/