반응형
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) 스크립트(테이블 생성, 수정, 삭제 등의 명령을 포함)를 자동으로 생성하고 실행합니다.
- 이 속성을 사용하면 개발자가 직접 데이터베이스 스키마를 관리할 필요 없이, 엔티티 클래스의 변경 사항을 데이터베이스에 자동으로 반영할 수 있습니다.
2. spring.jpa.hibernate.ddl-auto
💡 spring.jpa.hibernate.ddl-auto
- Hibernate의 DDL 생성 행동을 결정하는 속성입니다.
- Hibernate는 데이터베이스 스키마를 자동으로 생성하거나 업데이트하며, 개발자는 이를 통해 데이터베이스 스키마를 자동으로 관리할 수 있습니다.
속성 값 | 설명 | 사용시점 |
create | 세션 팩토리가 시작될 때 데이터베이스 드롭 후 다시 생성 | 개발 초기 단계 |
create-drop | 세션 팩토리가 시작될 때 데이터베이스 드롭 후 다시 생성, 세션 팩토리가 종료될 때 데이터베이스 드롭 | 개발 초기 단계 |
update | 세션 팩토리 시작 시 데이터베이스 스키마를 업데이트 | 테스트 단계 |
validate | 세션 팩토리 시작 시 엔티티와 테이블이 일치하는지 확인 | 스테이징 / 운영 단계 |
none | Hibernate에서 DDL을 수행하지 않음 | 스테이징 / 운영 단계 |
[더 알아보기]
💡validate 속성으로 지정하면 일치하는지 어떻게 확인하는가?
- 엔티티 내의 컬럼이 추가된 경우 기존의 엔티티 테이블과 비교하여 아래와 같은 오류를 냅니다.
오늘도 감사합니다. 😀
반응형