[스프링부트] 복합키 중 자동증가하는값 (ID) 지정 방법: @GeneratedValue.SEQUENCE

2024. 11. 7. 22:49·백엔드

 

결론

복합키 중 자동증가하는 값(ID)이 있으면

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="gen1")

이렇게 SEQUENCE 타입을 써야 한다 !!

(GenerationType.IDENTITY로 지정 x)

 


문제발견

프로젝트를 진행하며 스프링부트로 백엔드를 구현하고 있었다.

 

(ID) (AnotherKey)

 

2개를 엮어 복합키로 사용하고자 한다!

 

그런데

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "memberId", nullable = false)
Long memberId;

 

Identity generation isn't supported for composite ids: ID generation이 복합키 지원 x

Identity Generation이 복합키를 지원하지 않는다!

 


해결방법

public class Member extends BaseTimeEntity {
    @SequenceGenerator( // 제너레이터 정의
            name = "gen1", // JPA에서 사용할 제너레이터 이름
            sequenceName = "gen1", // DB 시퀀스 이름
            allocationSize = 1 // 증가 간격
    )

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="gen1") // 제너레이터(gen1) 연결
    @Column(name = "ID", nullable = false)
    Long memberId;

    @Id
    @Column(name = "AnotherKey", nullable = false)
    String anotherKey;

ID값 생성 방식을 SEQUENCE로 바꿔줬다!

 


왜 되는가?

@GeneratedValue의 키본키 생성 방식

IDENTITY 기본키 생성을 데이터베이스에 위임  
SEQUENCE 기본키 생성을 시퀀스에서 담당
(@SequenceGenerator시퀀스 생성, 매핑 필요)
 
TABLE 기본키 생성을 테이블에서 담당
(@TablleGenerator로 테이블 생성, 매핑 필요)
 
AUTO (기본) IDENTITY, SEQUENCE, TABLE 중 하나 자동선택  

 


Identity 의 키 생성 방식

 

1.  Database에 INSERT할 데이터를 먼저 넣음 (키는 NULL)

키 데이터
NULL (넣을 데이터값)

현재 데이터베이스

 

🙋‍♀️ 키는 알아서 DB에서 만들어줘~

(키 생성은 DB에 일임)

 

 

 

2.  엔티티 ➔ 영속성 컨텍스트로 등록 시 INSERT쿼리 날림

🙋‍♀️이때, DB에 조회해 키를 가져옴 (DB에서 생성한 키)

키 데이터
NULL이 아닌값 (넣을 데이터값)

현재 데이터베이스

 

이때, 복합키의 경우에는,

즉 예를 들어

ID 다른 키 값
1 ABCD

 

라고 한다면,

스프링부트는 1, ABCD 중에 어떤 게 ID값인지 모른다.

(스프링부트 구현 상 그렇게 해둔 듯)

 

그래서 INSERT 쿼리를 날릴 때 ID를 채우지 못하고 실패하는 것이다.

 


 

Sequence 의 키 생성 방식

Oracle, PostgreSQL, DB2, D2 DB에서 지원하는 전략인 Sequence의 경우

 

연속 숫자를 생성하도록 Sequence를 생성하고,

이것을 이용해 ID를 생성하도록 하는 방식이다

 

public class Member extends BaseTimeEntity {
    @SequenceGenerator( // 제너레이터 정의
            name = "gen1", // JPA에서 사용할 제너레이터 이름
            sequenceName = "gen1", // DB 시퀀스 이름
            allocationSize = 1 // 증가 간격
    )

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="gen1") // 제너레이터(gen1) 연결
    @Column(name = "ID", nullable = false)
    Long memberId;

나의 경우,

1씩 증가하는 sequence를 생성하고

이를 ID 생성 방식에 적용한 것이다

 

참고로 

@SequenceGenerator로 만든 Sequence

MINVALUE, MAXVALUE, NOCYCLE, START WITH, INCREASE 등 다양한 옵션을 사용할 수 있다

(더 많은 option에 대한 정보는 이 글에서 볼 수 있다)

 

 

 


참고

- @Generated 기본키 생성 방식 https://velog.io/@tritny6516/JPA-기본키Primary-Key-매핑-Id-GeneratedValue

- IDENTITY 기본키 생성 방식 https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html#google_vignette

 

'백엔드' 카테고리의 다른 글

[DB 해킹] MySQL DB 털린 썰 풉니다 (RECOVER_YOUR_DATA)  (2) 2024.12.23
MySQL 연결 - characterEncoding=utf8mb4 쓰지 마세요!  (0) 2024.12.12
[스프링부트] Soft delete 구현  (1) 2024.12.09
[스프링부트] Spring Batch와 적용방법  (3) 2024.12.09
MySQL 한글 (인코딩) 에러 났을 때 해결방법  (0) 2024.12.09
'백엔드' 카테고리의 다른 글
  • MySQL 연결 - characterEncoding=utf8mb4 쓰지 마세요!
  • [스프링부트] Soft delete 구현
  • [스프링부트] Spring Batch와 적용방법
  • MySQL 한글 (인코딩) 에러 났을 때 해결방법
KyuminKim
KyuminKim
컴퓨터공학과 학생의 이모저모 개발 일지 📝
  • KyuminKim
    이모저모
    KyuminKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 프로젝트 (2)
        • first-blog (2)
      • 클라우드 (22)
        • 도커 (14)
        • 쿠버네티스 (5)
        • AWS (2)
      • 알고리즘 (5)
        • 코드트리 (0)
        • 프로그래머스 (5)
      • 백엔드 (8)
      • 프론트엔드 (2)
      • 보안 (3)
        • 드림핵 (2)
      • python (3)
      • 네트워크 (1)
      • 기타 (6)
        • 2025 프로펙트 부트캠프(1차) | 클라우드 엔.. (0)
        • OSSCA | 2024 오픈소스 컨트리뷰션 아카데.. (0)
        • WIK (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DB
    오블완
    recover_your_data
    고랭
    알고리즘
    주간레포트
    cannot send an empty message
    amazonlinux
    코딩트리조별과제
    apiserver-runtime
    characterencoding
    탈퇴구현
    자료구조
    인코딩
    DP
    EC2
    도커
    쿠버네티스
    2024 당근 테크 밋업
    코드트리
    urf8
    파이썬
    docker
    MySQL
    코드트리조별과제
    진단평가
    코딩테스트
    도커파일
    character_set_server
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
KyuminKim
[스프링부트] 복합키 중 자동증가하는값 (ID) 지정 방법: @GeneratedValue.SEQUENCE
상단으로

티스토리툴바