인프런 커뮤니티 질문&답변

park님의 프로필 이미지
park

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

@EmbeddedId 관련 질문

작성

·

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 타입인데, 인자로 두개 순서가 바뀌어서 버그를 만드는 경우가 있어서;;

park님의 프로필 이미지
park

작성한 질문수

질문하기