H2 DDL-Auto 연관관계 Drop 오류 해결

Dev_ch·2023년 6월 1일
0

주로 테스트를 할때 H2 DB를 사용해 가볍게 관리한다. 또한 이 경우 ddl-auto를 사용해 create, create-drop, update 등을 사용하곤 하는데 이번의 경우 DB가 create 또는 create-drop으로 ddl-auto로 작동될때 연관관계로 매핑된 테이블이 FK의 값으로 인해 정상적으로 DB의 테이블이 삭제되지 않았을때의 해결 방법이다.

Exception의 경우

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "MEMBER" because "FKH0DB7KQR88ED8HQTCQW3JKCIA" depends on it; SQL statement:

drop table Member if exists [90107-200]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:576)

이와 같이 비슷한 로그가 찍힐 것 이다.

해결방법

  1. 자신의 H2 버전이 1.4.200 인지 확인하기
    • H2 1.4.200 버전은 해당 오류와 같은 이슈가 있어서 1.4.199로 다운그레이드하거나 이상으로 재설치해주면 된다.
  2. H2와 hibernate 버전 설정파일 최신화
    • 위에서 H2 버전을 업그레이드 시켜주었다면, 사용하려하는 h2, hibernate의 버전을 그에 맞게 설정 해주도록 하자. 아래는 대략적인 예시이고 Spring JPA를 사용한다면 버전을 자동으로 잡아주기에 hibernate를 직접 넣어주지 않아도 된다.

ex) pom.xml (maven)

        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.13.Final</version>
        </dependency>
        
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.1.214</version>
        </dependency>

ex) gradle

implementation 'org.hibernate:hibernate-core:5.4.13.Final'
testImplementation 'com.h2database:h2:2.1.214'
// runtimeOnly 'com.h2database:h2:2.1.214'

상황에 맞게 잘 설정해주면된다. 현재 포스팅 기준으로는 H2는 2.1.214 버전이 제일 최신이고 hibernate의 경우 6.2.3 final 버전이 가장 최신이다.


사실 별거 아니면서도 별게 될 수 있는 문제이기에 해당 익셉션이 터진다면 최대한 빨리 해결해주는 것이 정신건강에 좋을 것 같다. 괜히 이것저것 삭제 안되다가 데이터 꼬여서 테스트가 이상해진다고 생각하면(...) 아무튼 위와같이 해결해주면 된다 🤔

profile
내가 몰입하는 과정을 담은 곳

0개의 댓글