JPA 기본키 생성 전략, MySQL @GeneratedValue AUTO 사용 시 SEQ 테이블 생성 문제
Spring Boot 3.4.1 + Hibernate 6.6.4를 사용하여 새로운 프로젝트를 구축하며 발생한 이슈에 대해 기억하고자 작성합니다.
이전 프로젝트에서는 항상 DB가 명확해서 PK 컬럼에 대해서 @GeneratedValue 애노테이션을 사용하여 주로
GenerationType.IDENTITY, GenerationType.SEQUENCE 두 개 옵션을 사용했었습니다.
이번에 새로운 프로젝트는 다양한 DB에 이식해야되는 프로젝트여서 GenerationType.AUTO를 사용하여 PK를 지정하였습니다.
테스트 환경은 MySQL 8.0.26 버전이었고 예상한 시나리오는 PK에 auto_increment 옵션이 선택되는 걸 예상했으나 예상외로 seq 테이블이 생성되었습니다.
원인을 찾아보니 Hibernate 5버전 부터는 Mysql의 PK를 TABLE을 기본 시퀀스 전략으로 가져간다는 것을 알게 되었습니다.
이를 해결하기 위해 다양한 방향으로 시도해보았습니다.
1. properties 옵션 추가
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
HHH90000025: MySQL8Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
명시적으로 지정할 필요가 없다는 로그와 함께 결과는 동일하게 seq 테이블이 생성되었습니다.
Hibernate:
create table sample_table_seq (
next_val bigint
) engine=InnoDB
2. use-new-id-generator-mappings false 설정
옵션에 설정된 값을 판단하여 false인 경우 hibernate에 설정된 방언(dialect)으로 결정됩니다.
하지만 이 옵션은 spring boot 3.X 버전에서는 사라진 옵션으로 사용할 수 없었습니다.
https://github.com/spring-projects-experimental/spring-boot-migrator/issues/206
Spring Boot Upgrade to 3.0.0-M4 · Issue #206 · spring-projects-experimental/spring-boot-migrator
labels: ["upgrade:boot-recipe","3.0.0","epic"] https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0.0-M4-Release-Notes Spring Boot 3.0.0 M4 Release Notes Spring MVC and WebFlux URL m...
github.com
3. GenerationType.IDENTITY
제일 명확한 방법이긴 합니다. MySQL에서 auto_increment 옵션을 사용하지 않고 테이블 시퀀스를 적용하는 건 너무 비효율적이기 때문에 IDENTITY 옵션을 선택하는 게 제일 명확했습니다.
반드시 jpa를 사용하여 테이블을 생성해야 되는 경우 pk에 GenereationType.IDENTITY 시퀀스 전략을 선택하여 ddl을 실행 후 ddl-auto : none으로 설정을 변경하여 테이블 구조는 변경되지 않게 설정하면 될 것 같습니다.
사실 DDL은 JPA를 통해서 실행하지 않고 이미 DDL이 실행된 후 jpa를 적용하기 때문에 이런 이슈를 발견할 수 없었습니다.
이번 프로젝트는 프로토타입을 빨리 뽑아내야 하는 상황이어서 오랜만에 JPA로 DDL을 실행했는데 해당 이슈를 발견하여 작성하였습니다.
참고 사이트
https://jojoldu.tistory.com/295
Spring Boot Data JPA 2.0 에서 id Auto_increment 문제 해결
안녕하세요? 이번 시간엔 Spring Boot JPA 2.0 에서 PK의 Auto_increment 문제를 알아보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하
jojoldu.tistory.com
https://devcamus.tistory.com/16
JPA 기본키 생성 전략, @GeneratedValue 사용시 주의점
JPA로 테이블과 엔티티를 매핑할 때, 식별자로 사용할 필드 위에 @Id 어노테이션을 붙여 테이블의 Primary Key와 연결 시켜줘야한다. 이 때, 컬럼 명을 따로 지정하지 않으면, 관례에 따라 매핑되는
devcamus.tistory.com
'Spring > JPA' 카테고리의 다른 글
SpringBoot3 jpa 쿼리 파라미터 바인딩 방법 (0) | 2025.02.12 |
---|