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

중국산북극곰님의 프로필 이미지
중국산북극곰

작성한 질문수

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

파티셔닝 복합키 관련해서 질문드립니다.

작성

·

282

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

안녕하세요.

저도 강의를 듣고 실무에 적용하다가 궁금한점이 있어서 문의드립니다.

현재 MySql을 DB로 사용하고있습니다. 데이터가 많아 파티셔닝을 적용한다고 가정을 했을때 GenerationType.Identity가 사용이 불가능할까요?

MySql에서 파티셔닝을 위해서는 PK로 지정해야하는것으로 알고있습니다. 그래서 대체키(Table AutoIncrement Key Id), CreatedAt을 PK로 지정한 상황입니다.

그리고 이것을 Entity(자바 코드)레벨에서 Entity 매핑을 위해 복합키를 쓴다면 GenerationType.Identity가 불가능한것으로 알고있습니다.

하지만 지금 상황을 놓고보면 DB에 파티셔닝을 위해서 복합키를 걸었지만, 연관관계 매핑시 PK의 일부인 createdAt은 실질적으로 의미가 없는 상황이구요.

따라서 시퀀스 제네레이터방식을 적용해야할까요? 아니면 아래와 같은 방법이 통상적으로 사용하는 방법일까요? 

  1. 파티셔닝을 위해서 DB에는 대체키(자동증가값) + CreatedAt(생성일자를 파티션키로 사용한다는 가정)

  2. JPA에서는 자동증가 대체키는 키 생성전략으로 Identity(MySql)로 지정하고 createdAt 필드는 ID지정을 안하고 @PrePersist로 영속상태 만들기전에 주입하는 방식

     

  3. 엔티티에는 EmbeddedId나 IdClass어노테이션으로 복합키 지정 x

     

     

    혹시 위 방법이 단점이 있거나 불가능할까요?

시퀀스 제네레이터로 테이블을 관리하는것이 리소스 낭비라고 생각이 들어 AutoIncrement를 사용하고 싶어 질문드립니다.

 

한줄 요약하자면 파티셔닝을 위해서 createdAt을 DB단에서 PK로 지정했지만, 이것을 꼭 Entity레벨에서 복합키로써 @IdClass나 @EmbeddedKey로 지정을 해야만 하는가? 입니다.

답변 1

0

안녕하세요 중국산북극곰 님, 인프런 AI 인턴이에요.

복합키와 GenerationType.Identity 사용에 관해 질문주셨군요.

일반적으로 MySQL에서 파티셔닝을 위해 복합키를 사용하는 경우가 많습니다. 따라서 파티셔닝을 위해 PK로 지정된 createdAt을 Entity 매핑을 위해 복합키로 사용하려면 GenerationType.Identity는 사용할 수 없습니다.

시퀀스 제네레이터 대신에 AutoIncrement를 사용하고 싶다면, 다음과 같은 방법을 고려해볼 수 있습니다:

  1. 파티셔닝을 위해 DB에는 대체키(자동증가값) + CreatedAt(생성일자를 파티션키로 사용한다는 가정)
  2. JPA에서는 자동증가 대체키를 키 생성 전략으로 Identity(MySQL)로 지정하고, createdAt 필드는 ID 지정을 하지 않고 @PrePersist를 사용하여 영속 상태 만들기 전에 주입하는 방식
  3. 엔티티에는 EmbeddedId나 IdClass 어노테이션으로 복합키를 지정하지 않고, 복합키로 생성된 테이블을 사용합니다.

위 방법은 주어진 상황에서 파티셔닝을 위한 createdAt을 복합키로 사용하지 않고도 AutoIncrement를 사용할 수 있는 방법입니다.
단점이나 불가능한 점은 상황과 요구사항에 따라 다를 수 있으니 정확한 판단을 위해서는 세부적인 사항과 해당 시스템의 요구사항을 고려해야합니다.

좀 더 자세한 내용이 필요하시다면, DB 및 JPA 전문가에게 자문을 구하시는 것을 추천드립니다. 감사합니다.

중국산북극곰님의 프로필 이미지
중국산북극곰

작성한 질문수

질문하기