Spring Boot Data JPA 2.0 에서 id Auto_increment 문제 해결

Jakezo·2021년 9월 20일
0

JPA

목록 보기
1/1

회사의 시스템 구축을 Spring Boot 2.0으로 진행하게 되었습니다.진행 도중 Spring Data Jpa의 @GeneratedValue가 기존과 다르게 작동하는걸 발견하게 되었습니다. 파일 첨부를 넣으니 2의 배수로 아이디가 증가하였습니다.

2.0의 migration guide는 1.5 -> 2.0 마이그레이션시 주의사항이 기록되있습니다.

그리고 아주 큰! 힌트를 찾았습니다.

뭔가 id generator의 기본값이 변경되었다는 패치 내용입니다!저 값이 어떤 역할을 하는지 한번 가보겠습니다.

2.0 JpaProperties.java

Javadoc 내용만 봐도 이 값이 Hibernate의 Id 생성 규칙을 결정하는 설정값임을 알 수 있는데요.실제로 코드에서도 해당 설정값이 지정되지 않으면 기본으로 true가 되는것을 알 수 있습니다.

그럼 1.5.x에서는 어떤지 한번 보겠습니다.

1.5 JpaProperties.java

1.5의 설정에서는 false가 기본값인게 확인 됩니다!Javadoc에 재밌는 이야기가 있는데요 false일 경우 Hibernate 5 설정을 따라가지 않는다고 합니다.

Hibernate 5에서 어떤일이 있었는지 좀 더 찾아보겠습니다.

Hibernat 5.0 MySQL id generate 내용을 정리한 블로그에 딱! 맞는 내용이 있습니다.

Hibernate 5.0 이전

Hibernate 5.0

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

정리

결론은 다음과 같습니다.

  • Spring Boot는 Hibernate의 id 생성 전략을 그대로 따라갈지 말지를 결정하는 useNewIdGeneratorMappings 설정이 있다.
  • 1.5에선 기본값이 false2.0부터는 true
  • Hibernate 5.0부터 MySQL의 AUTO는 IDENTITY가 아닌 TABLE을 기본 시퀀스 전략으로 선택된다.
  • 즉, 1.5에선 Hibernate 5를 쓰더라도 AUTO를 따라가지 않기 때문에 IDENTITY가 선택
  • 2.0에선 true이므로 Hibernate 5를 그대로 따라가기 때문에 TABLE이 선택

으로 정리가 됩니다.

해결

해결책은 크게 2가지가 있습니다.

  1. application.properties/yml의 use-new-id-generator-mappings을 false로 설정한다

  1. @GeneratedValue의 전략을 GenerationType.IDENTITY로 지정한다

둘 중 어느것을 하더라도 아래처럼 의도했던대로 잘 수행되는 것을 확인할 수 있습니다.

저는 일단 2번째 방법인 GenerationType.IDENTITY을 사용하고 있습니다.Spring Data Jpa와 Hibernate을 똑같이 가져가는게 이후 문제 해결에 도움이 될것 같아서요 :)

profile
탐험가

0개의 댓글