작성
·
956
0
안녕하세요 선생님,
DDD 공부하면서 적용해보던 중 JPA 관련 궁금한 점이 생겨 질문드립니다.
애그리거트 루트에 해당하는 엔티티의 @Id 필드를 아래와 같이 작성하는 것보다,
Member 엔티티
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "members")
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String password;
@Builder
public Member(String email, String password) {
this.email = email;
this.password = password;
}
}
아래와 같이 값 타입을 만들어 사용하는 것이 의미상 명확하고, 다른 애그리거트에서 해당 애그리거트 루트의 Id를 참조할 때도 직관적이겠다 생각했습니다.
MemberId 값 타입
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Embeddable
public class MemberId implements Serializable {
@Column(name = "member_id")
private Long id;
public MemberId(Long id) {
this.id = id;
}
}
Member 엔티티
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "members")
@Entity
public class Member {
@EmbeddedId
@GeneratedValue(strategy = GenerationType.IDENTITY)
private MemberId memberId;
private String email;
private String password;
@Builder
public Member(String email, String password) {
this.email = email;
this.password = password;
}
}
그런데 문제는 @Id에 해당하는 필드에 값 타입을 사용하면 @GeneratedValue가 정상적으로 동작하지 않았습니다.
찾아보니, @Id에 해당하는 필드에 값 타입이 쓰이면 복합키로 인식해 @GeneratedValue를 무시한다는 것을 알았습니다.
제가 여쭙고 싶은 질문은 다음과 같습니다.
1) 위와 같이 애그리거트 루트의 Id를 값 타입으로 만들어 사용할 때, auto_increment 기능 또한 사용할 수 있는 방법이 있는지 궁금합니다.
2) 선생님께서는 위와 같이 값 타입을 생성해 애그리거트 루트의 Id로 사용하는 것에 대해서 어떻게 생각하시는 지 궁금합니다.
항상 좋은 강의 감사합니다.
답변 2
1
안녕하세요. 강동혁님 좋은 질문입니다.
1) 위와 같이 애그리거트 루트의 Id를 값 타입으로 만들어 사용할 때, auto_increment 기능 또한 사용할 수 있는 방법이 있는지 궁금합니다.
이 방법은 저도 잘 모르겠습니다. 혹시 아시는 분 있으면 답변 부탁드립니다.
결국 외부에서 ID를 생성해서 넣어주어야 할 것 같네요.
2) 선생님께서는 위와 같이 값 타입을 생성해 애그리거트 루트의 Id로 사용하는 것에 대해서 어떻게 생각하시는 지 궁금합니다.
이 부분은 장단점이 있습니다. 장점은 ID의 타입이 명확해집니다. 단점은 개발할 때 여러가지 번거로운 점들이 많습니다. JPQL 쿼리를 하나 작성해도 더욱 번잡해집니다.
잘 시도하면 타입이 명확하니 더 좋은 결과를 얻을수 있을 것 같은데, 말씀드린 번잡함 때문에 저는 주로 사용하지 않는 편입니다.
감사합니다.
0
지나가다가 답변 남깁니다.
1. auto_increment 안되네요. null id generated for ...Member
오류가 발생합니다. 외부에서 UUID 같은 것을 이용해서 주입해야할 것 같네요.
2. 저 같은 경우에는 가끔 사용합니다. 대부분의 ID 타입이 Long형이 되기 때문에 인자 입력 시 타입으로 구분이 안되는 경우가 생겨서 실수를 하는 경우를 방지하기 위해서 사용합니다. 예를 들면 2개의 인자가 필요하고 Member.id, Company.id 둘 다 같은 Long 타입인데, 인자로 두개 순서가 바뀌어서 버그를 만드는 경우가 있어서;;