[Database Rider] 테이블명을 대문자(uppercase)로만 참조하려고 하는 문제

by 스뎅(thDeng) on

문제

Integration test 데이터 셋 설정으로 Database Rider를 사용하는데, 아래와 같은 오류가 발생한다. 이상한 점은 내 테이블 설정은 모두 소문자(lowercase)인 user인데, 대문자(uppercase)인USER로 참조한다는 것이다.

java.lang.RuntimeException: Could not create dataset for test '$spock_feature_1_1'.
	at com.github.database.rider.core.RiderRunner.runBeforeTest(RiderRunner.java:47) ~[rider-core-1.17.0.jar:na]
	at com.github.database.rider.spring.DBRiderTestExecutionListener.beforeTestMethod(DBRiderTestExecutionListener.java:25) ~[rider-spring-1.17.0.jar:na]
	.. (중략) ..
Caused by: com.github.database.rider.core.exception.DataBaseSeedingException: Could not initialize dataset: datasets/user.xml
	.. (중략) ..
Caused by: org.dbunit.dataset.DataSetException: Exception while searching the dependent tables.
	.. (중략) ..
Caused by: org.dbunit.util.search.SearchException: org.dbunit.dataset.NoSuchTableException: The table 'USER' does not exist in schema 'null'
	.. (중략) ..
Caused by: org.dbunit.dataset.NoSuchTableException: The table 'USER' does not exist in schema 'null'
	at org.dbunit.database.search.AbstractMetaDataBasedSearchCallback.getNodes(AbstractMetaDataBasedSearchCallback.java:186) ~[dbunit-2.5.3.jar:na]
	at org.dbunit.database.search.AbstractMetaDataBasedSearchCallback.getNodes(AbstractMetaDataBasedSearchCallback.java:149) ~[dbunit-2.5.3.jar:na]
	... 47 common frames omitted

엔티티에는 아래처럼 테이블명이 소문자 user로 되어 있다.

@Entity
@Table(name = "user")
class User(
  ..
)

원인 및 해결방법

Database Rider 는 내부적으로 DbUnit 을 사용하고 있다. 그리고 간단하게 DbUnit 을 설정할 수 있는 방법도 제공한다. (설정 방법)

아래는 src/test/resources/dbunit.yml 파일의 기본값이다. yml 파일 대신 @DBUnit annotation 을 사용하는 방법도 있다.

cacheConnection: true
cacheTableNames: true
leakHunter: false
caseInsensitiveStrategy: !!com.github.database.rider.core.api.configuration.Orthography 'UPPERCASE'
properties:
  batchedStatements:  false
  qualifiedTableNames: false
  schema: ""
  caseSensitiveTableNames: false
  batchSize: 100
  fetchSize: 100
  allowEmptyFields: false
  escapePattern: ""
connectionConfig:
  driver: ""
  url: ""
  user: ""
  password: ""

여기서 문제가 되는 포인트는 caseInsensitiveStrategyproperties.caseSensitiveTableNames설정이다.

이 설정들 때문에 user 대신 USER 라는 이름으로 테이블명을 참조하는 것이다. 간단하게 LOWERCASE로 바꿔주면 된다.

caseInsensitiveStrategy: !!com.github.database.rider.core.api.configuration.Orthography 'LOWERCASE'

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License