ddl-auto 관련 오류와 해결 방법

업데이트:

JPA/Hibernate 초기화 전략 사용 시 오류 관련

겪었던 오류에 대한 목록과 그 해결방법을 기록한다. 우선 초기화 전략(create, create-drop, update, validate)에 대해서 정확히 작동 방식을 알고 있어야한다.
사용 시 오류가 발생하면 최우선으로 hibernate 에 대한 설정파일을 열어서 확인한다.
Spring boot 초기 환경에서 특별한 변경이 없었다면 application.properties에 설정 했을 것이고 그것을 먼저 확인한다.
또한, 정확한 파악을 위해 spring.jpa.show-sql=true 다음 설정을 추가하여 hibernate가 생성하는 모든 sql 문을 확인하도록 한다.

SQL 문법이 틀렸다

아니, hibernate가 만드는데 문법이 틀릴일이 뭐가 있지? 라는 생각이 들 수 있다. 하지만…생각보다 다양한 이유로 문법이 틀리게 생성될 수 있다. 이제 하나씩 나열해보자.

SQL 예약어를 사용해버린 경우

해결법 : 오류가 나는 SQL을 확인한 뒤 해당 매핑 테이블을 찾아가서 예약어로 사용 중인 부분(대표적으로 변수명, 테이블명) 등을 고친다. 만약, 변수명이 문제라면 @Column(name=”…somthing…”) 어노테이션으로 직접 컬럼 이름을 지어주는 방법도 있다. 테이블명이 문제라면 @Table(name=”…somthing…”) 어노테이션을 사용해도 된다.

엔티티를 매핑을 하다보면 이런 일이 생길 수 있다. 예를들면, 필자는 부끄럽지만 이런 문제를 겪었었다.

create table movie (id bigint not null auto_increment, actor varchar(20), desc varchar(255),
genre varchar(20), title varchar(100), primary key (id)) engine=InnoDB

MariaDB 방언이 기준이며 위와 같은 SQL문이 실행했다. 아쉽게도 문법이 틀렸다는 오류가 나온다. 눈썰미 좋은 분들은 바로 찾았겠지만, 필자는 그렇지 못했다. 한참 헤매다가 desc가 생각해보니 예약어였던 것이다. 결국, 매핑 시킨 엔티티 클래스로 가서 변수명을 description 으로 바꿔주고 해결되었다. 이런 문제로 시간을 쓰다보면 정말 참담하기 그지 없으니 꼭 다음엔 주의하고 예약어는 매핑 시킬 테이블 컬럼 이름을 @Column(name=”…”) 어노테이션으로 바꿔서 넣어주던가 변수명 자체를 예약어를 쓰지 말도록 하자.


시간 날 때마다 추가 될 예정이다.