Java/오류노트

[Java/오류노트] Solved - org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL

adjh54 2024. 4. 12. 20:00
728x170
Spring Boot JPA 기반으로 프로젝트를 수행하는 도중에 발생하는 오류에 대해 알아보고 해결책을 알아봅니다.


1) 문제점


💡 문제점

- Spring Boot JPA를 테스트하는 도중에 application.properties 값을 spring.jpa.hibernate.ddl-auto= create로 해둔 상태에서 발생한 문제점이었습니다.


💡 오류메시지 
- org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table if exists xxxx" via JDBC Statement

- 해당 문제는 하단의 오류에서 확인해 볼 수 있듯이 Cannot drop table 'tb_board' referenced by a foreign key constraint 'XXXXXXX' on table 'tb_user_board_list'. 와 같은 오류도 발생하고 있습니다.

- 이는 외래 키 제약 조건 'XXXXXX'이 'tb_user_board_list' 테이블에 'tb_board' 테이블을 참조하고 있어 'tb_board' 테이블을 삭제할 수 없습니다.라는 문제입니다.

 

 

 

2) 해결방법


💡 해결방법

- 이를 해결하기 위한 방법으로 spring.generate-ddl 속성과 spring.jpa.hibernate.ddl-auto 속성값을 변경하였습니다.

- spring.generate-ddl 속성의 기본값은 false로 이 상태라면 DDL 스크립트를 자동으로 생성하거나 실행하지 않습니다. 그렇기에 이 상태에서 spring.jpa.hibernate.ddl-auto = create 속성으로 지정하게 되었다면 DROP DROP TABLE XXX 명령어가 실행되지 않아서 발생한 문제였습니다.

- 그렇기에 아래와 같이 속성을 적용하여 해결하였습니다.

 

 

💡 속성 사용예시

- 데이터베이스 스키마를 자동으로 생성합니다. : spring.generate-ddl = true

- 기존의 테이블이 존재할 경우 DROP 하고 새로 테이블을 생성합니다. : spring.jpa.hibernate.ddl-auto = update
- 결론적으로 서버를 실행시킬 때 엔티티 클래스에 정의된 내용을 통해 최초 존재하는 DB를 Drop 한 다음 새롭게 Create 하는 처리를 수행합니다.
spring.generate-ddl = true
spring.jpa.hibernate.ddl-auto = update

 

 

 💡 아래와 같이 문제없이 잘 수행됨을 확인하였습니다.

 

 

 

3) 참고 : 속성 값 알아보기


1. spring.generate-ddl (default: false)


 💡 spring.generate-ddl

- 데이터베이스 스키마를 자동으로 생성할지 여부를 지정하는 데 사용되는 속성입니다.
- 이 속성이 true로 설정되면 Spring Boot가 DDL(Data Definition Language) 스크립트(테이블 생성, 수정, 삭제 등의 명령을 포함)를 자동으로 생성하고 실행합니다.
- 이 속성을 사용하면 개발자가 직접 데이터베이스 스키마를 관리할 필요 없이, 엔티티 클래스의 변경 사항을 데이터베이스에 자동으로 반영할 수 있습니다.
 

59. Database initialization

An SQL database can be initialized in different ways depending on what your stack is. Or of course you can do it manually as long as the database is a separate process. 59.2 Initialize a database using Hibernate You can set spring.jpa.hibernate.ddl-auto e

docs.spring.io

 

 

 

2. spring.jpa.hibernate.ddl-auto


💡 spring.jpa.hibernate.ddl-auto

- Hibernate의 DDL 생성 행동을 결정하는 속성입니다.

- Hibernate는 데이터베이스 스키마를 자동으로 생성하거나 업데이트하며, 개발자는 이를 통해 데이터베이스 스키마를 자동으로 관리할 수 있습니다.
속성 값 설명 사용시점
create 세션 팩토리가 시작될 때 데이터베이스 드롭 후 다시 생성 개발 초기 단계
create-drop 세션 팩토리가 시작될 때 데이터베이스 드롭 후 다시 생성, 세션 팩토리가 종료될 때 데이터베이스 드롭 개발 초기 단계
update 세션 팩토리 시작 시 데이터베이스 스키마를 업데이트 테스트 단계
validate 세션 팩토리 시작 시 엔티티와 테이블이 일치하는지 확인 스테이징 / 운영 단계
none Hibernate에서 DDL을 수행하지 않음 스테이징 / 운영 단계

 

 

 [더 알아보기]

💡validate 속성으로 지정하면 일치하는지 어떻게 확인하는가?


- 엔티티 내의 컬럼이 추가된 경우 기존의 엔티티 테이블과 비교하여 아래와 같은 오류를 냅니다.

 

 

 

 

오늘도 감사합니다. 😀

 

 

 

 

 

그리드형