[JPA] PK가 1씩 상승하지 않는 이슈

이진규·2023년 3월 29일

SPRING 문제 해결

목록 보기
1/4

문제 상황

개발을 하면서 게시글을 작성할 때 마다 DB의 PK값이 4씩 상승하는것을 발견했습니다.

그래서 Post entity의 @GeneratedValue값을 확인해보았고 default값은 AUTO 전략이라고 알고 있었기 때문에 당연히 IDENTITY 전략으로 실행될 것이라고 생각했습니다.

그렇게 한참을 헤매던 중 IDENTITY 전략으로 실행되지 않고 있는 것을 확인했습니다.

문제 해결을 위한 추적

우선 @GeneratedValue가 기본 전략이 AUTO가 맞는지 우선 확인하였습니다.

다음과 같이 default 전략이 AUTO 전략인 것을 확인 하였고, 그 다음은 사용하는 DB는 MYSQL인데 왜 IDENTITY 전략이 실행되지 않았는지 찾아야 했습니다.

관련 내용을 찾던 중 향로님의 블로그에서 관련 문제를 해결할 수 있었습니다.

결론부터 정리하자면, Hibernate 5부터 MySQL에서의 GenerationType.AUTO는 IDENTITY가 아닌 TABLE을 기본 시퀀스 전략으로 가져간다는 것입니다.

순서대로 정리를 해보겠습니다.

  1. 다음 내용은 2.0 JpaProperties.java의 Hibernate의 ID 생성 규칙을 결정하는 설정 값으로 true가 되어 있습니다.

  1. 다음 내용은 1.5 JpaProperties.java의 Hibernate의 ID 생성 규칙을 결정하는 설정 값으로 false가 되어 있습니다.

그리고 추가적인 내용으로 설정 값이 false일 경우 Hibernate 5 설정을 따라가지 않는다고 합니다. (이 부분이 중요한 문장입니다.)

  1. 다음 Hibernate 5.0 이전 내용을 살펴 보면 기본 전략은 AUTO 이고, MYSQL의 경우 IDENTITY 전략을 가져가는 것을 확인할 수 있습니다.

  1. 다음 Hibernate 5.0 이후 내용을 살펴 보면 기본 전략은 AUTO 이고, MYSQL의 경우 TABLE 전략을 가져가는 것을 확인할 수 있습니다.

해결방법

해결방법은 크게 두가지 입니다.

  1. 첫번째는, 위에서 살펴보았듯이 Hibernate 5.0은 MYSQL의 기본 전략을 TABLE로 가져가고 있습니다. 다만 ID를 생성하는 설정값을 false로 설정한다면 Hibernate 5.0의 규칙을 따라 가는 것이 아닌 그 전의 기본 전략(IDENTITY)을 따라 가기 때문에 직접 application.yml파일에 ID 생성 규칙을 false로 설정할 필요가 있습니다.

  1. 두번째는, 기본전략을 이용하는 것이 아닌 @GeneratedValue 전략을 직접 IDENTITY로 설정하는 것입니다.

참고자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글