회사에서 서비스를 개발하면서 GeneratedValue에 대한 이슈를 접하면서 정리하는 글
Spring Data JPA에서 기본키를 할당하는 방법을 정해주는 어노테이션이다.
어노테이션의 기본키를 할당하는 방법은 두가지가 있는데,
SQL 벤더들마다 자동 생성의 방법이 다르기 때문에, 4가지의 자동 생성방법을 제공한다.
IDENTITY: 기본 키 생성을 데이터베이스에 위임
→ MySql, PostgresSQL 등에서 사용
SEQUENCE: 데이터베이스 시퀀스를 사용해 기본키를 할당 (DB에 의존적)
→ 시퀀스를 이용하는 디비 (오라클, H2 등)에서 사용
→ @SequenceGenerator를 사용하여 시퀀스 생성기를 등록, 실제 데이터베이스의 생성될 시퀀스 이름을 정해주어여 한다.
TABLE: 키 생성 테이블을 사용
→ 키를 생성하는 전용 테이블을 만들고, 여기에 이름과 값으로 사용할 컬럼을 만든다.
→ 모든 DB 벤더에서 사용할 수 있는 타입이다.
AUTO: 데이터베이스 벤더에 의존하지 않고, 데이터베이스는 기본키를 할당하는 방법
→ 데이터베이스에 따라 위의 세가지 방법 중 하나를 자동으로 선택
직접 할당을 사용하려면 @Id 어노테이션을 사용하면 되고,
자동 생성 전략을 사용하려면 @Id + @GeneratedValue를 추가해 생성 전략을 사용하면 된다.
그래서 나는 회사에서 개발하는 코드에서 MySQL에서 지원하는 auto_increment를 사용하고자 @GeneratedValue 어노테이션을 걸어주고 실행했다. 그랬더니 이상한 에러가 났다.
java.sql.SQLSyntaxErrorException: Table 'db_name.hibernate_sequence' doesn't exist
그냥 단순히 @GeneratedValue를 사용했을 때는 AUTO type을 사용하는 것으로 알고있는데, 자기 멋대로 DB 내의 hibernate_sequence를 찾는다.
결론부터 말하자면, 스프링 부트 2.0으로 업데이트 되면서, 스프링 부트에서 설정하는 JPA의 자동설정 조건이 달라졌기 때문이다.