문제 요약
데이터베이스에 미리 데이터를 삽입하여 필요시 삽입된 데이터를 선택하도록 구현 기능한 상황에서, 테이블 drop 후 테이블이 다시 생성이 되지 않는 상황
문제의 원인은 sql.init.mode=always 설정과 관련이 있었던 것 같습니다. 이 설정을 삭제하고 ddl-auto: update로 변경하니 테이블이 제대로 생성된다는 점에서, 데이터베이스 초기화 및 스크립트 실행 순서가 문제의 원인이었을 가능성이 큽니다.
왜 sql.init.mode=always가 문제였을까요?
sql.init.mode=always는 Spring Boot에서 data.sql 또는 schema.sql 파일을 항상 실행하도록 하는 설정입니다. 이 설정이 있으면, Spring Boot는 애플리케이션 시작 시 data.sql을 사용하여 데이터를 삽입하려고 하지만, 테이블이 아직 존재하지 않는 상태일 수 있습니다. 그 결과, 테이블이 없는 상태에서 data.sql이 먼저 실행되어 INSERT 문이 실패하는 것입니다.
ddl-auto: update가 해결책인 이유
ddl-auto: update는 Hibernate가 엔티티에 따라 필요한 테이블을 자동으로 생성하거나 업데이트하는 설정입니다. 따라서 sql.init.mode를 삭제한 후 ddl-auto: update 설정을 사용하면, Hibernate가 먼저 테이블을 생성한 후에 data.sql 파일의 데이터가 삽입되기 때문에 문제가 해결된 것입니다.
해결 과정 요약:
sql.init.mode=always 설정의 문제: 테이블이 생성되지 않은 상태에서 data.sql이 실행되면서 삽입 실패.
ddl-auto: update로 해결: Hibernate가 엔티티를 바탕으로 테이블을 먼저 생성한 후, 필요한 경우 data.sql 파일로 데이터를 삽입함.
권장 설정:
이제 테이블이 제대로 생성되므로, 현재 상태에서 다음과 같은 설정을 유지하는 것이 좋습니다.
spring:
jpa:
hibernate:
ddl-auto: update # 엔티티를 기준으로 테이블을 자동 생성 및 업데이트
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
show_sql: true
use_sql_comments: true
결론
sql.init.mode=always 설정을 사용하지 않고, ddl-auto: update 설정을 사용하는 것이 테이블 생성 문제를 해결하는 데 적합한 방법입니다. 이 방식으로는 Hibernate가 테이블을 자동으로 생성한 후, 데이터 삽입이 정상적으로 이루어지게 됩니다.
지금과 같은 설정을 유지하면 테이블이 정상적으로 생성되고, 애플리케이션도 문제없이 동작할 것입니다!