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