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

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

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

문제 해결을 위한 추적
우선 @GeneratedValue가 기본 전략이 AUTO가 맞는지 우선 확인하였습니다.

다음과 같이 default 전략이 AUTO 전략인 것을 확인 하였고, 그 다음은 사용하는 DB는 MYSQL인데 왜 IDENTITY 전략이 실행되지 않았는지 찾아야 했습니다.
관련 내용을 찾던 중 향로님의 블로그에서 관련 문제를 해결할 수 있었습니다.
결론부터 정리하자면, Hibernate 5부터 MySQL에서의 GenerationType.AUTO는 IDENTITY가 아닌 TABLE을 기본 시퀀스 전략으로 가져간다는 것입니다.
순서대로 정리를 해보겠습니다.
- 다음 내용은 2.0 JpaProperties.java의 Hibernate의 ID 생성 규칙을 결정하는 설정 값으로 true가 되어 있습니다.

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

그리고 추가적인 내용으로 설정 값이 false일 경우 Hibernate 5 설정을 따라가지 않는다고 합니다. (이 부분이 중요한 문장입니다.)
- 다음 Hibernate 5.0 이전 내용을 살펴 보면 기본 전략은 AUTO 이고, MYSQL의 경우 IDENTITY 전략을 가져가는 것을 확인할 수 있습니다.


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

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

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

참고자료