inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

@EmbeddedId 관련 질문

1108

park

작성한 질문수 12

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로 사용하는 것에 대해서 어떻게 생각하시는 지 궁금합니다.

항상 좋은 강의 감사합니다.

jpa 값타입 JPA java

답변 2

1

김영한

안녕하세요. 강동혁님 좋은 질문입니다.

1) 위와 같이 애그리거트 루트의 Id를 값 타입으로 만들어 사용할 때, auto_increment 기능 또한 사용할 수 있는 방법이 있는지 궁금합니다.

이 방법은 저도 잘 모르겠습니다. 혹시 아시는 분 있으면 답변 부탁드립니다.

결국 외부에서 ID를 생성해서 넣어주어야 할 것 같네요.

2) 선생님께서는 위와 같이 값 타입을 생성해  애그리거트 루트의 Id로 사용하는 것에 대해서 어떻게 생각하시는 지 궁금합니다.

이 부분은 장단점이 있습니다. 장점은 ID의 타입이 명확해집니다. 단점은 개발할 때 여러가지 번거로운 점들이 많습니다. JPQL 쿼리를 하나 작성해도 더욱 번잡해집니다.

잘 시도하면 타입이 명확하니 더 좋은 결과를 얻을수 있을 것 같은데, 말씀드린 번잡함 때문에 저는 주로 사용하지 않는 편입니다.

감사합니다.

0

Jung Myeongju

지나가다가 답변 남깁니다.

1. auto_increment 안되네요. null id generated for ...Member 오류가 발생합니다. 외부에서 UUID 같은 것을 이용해서 주입해야할 것 같네요.
2. 저 같은 경우에는 가끔 사용합니다. 대부분의 ID 타입이 Long형이 되기 때문에 인자 입력 시 타입으로 구분이 안되는 경우가 생겨서 실수를 하는 경우를 방지하기 위해서 사용합니다. 예를 들면 2개의 인자가 필요하고 Member.id, Company.id 둘 다 같은 Long 타입인데, 인자로 두개 순서가 바뀌어서 버그를 만드는 경우가 있어서;;

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

28

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

실무 조언 관련 질문입니다.

0

47

1

H2데이터베이스 파일 생성

0

56

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

53

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

94

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

95

2

연관관계 매핑 질문드립니다.

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

87

1

임베디드 타입 예시 코드 관련 질문

0

115

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

95

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

145

1