내장 h2 db로 Hibernate를 이용한 jpa를 통해 Entity Class 들을 db table로 매핑하려고 하는데,
GenerationTarget encountered exception accepting command : Error executing DDL “
DDL 수행중 오류가 났다는 오류가 잔뜩이다.
나의 경우는 h2 내장db로 테스트하지만 결국 배포시에는 Mysql을 사용할 것이고,
그에 따라 Dialect 설정을 통해 ORM의 객체 맵핑으로 Mysql 쿼리문으로 DDL을 날리겠다고 했다.
그리고 h2 datasource를 사용하지만, mysql 모드로 사용하기위한 설정도 yml파일에 진행한 상태,
아래는 내 application-test.yml 코드
spring:
config:
activate:
on-profile: test
h2:
console:
enabled: true
jpa:
database: h2
database-platform: org.hibernate.dialect.MySQLDialect # Mysql Dialect
show-sql: true
generate-ddl: true
properties:
hibernate:
show_sql: true
format_sql: true
hbm2ddl:
auto: create
hibernate:
ddl-auto: create
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb;MODE=MySQL;DATABASE_TO_LOWER=TRUE # mysql처럼 사용하기
username: SA
password:
이는 @DataJpaTest 어노테이션 내부적으로 정의된 @AutoConfigureTestDatabase 의 default 옵션의 replace=Any 옵션 때문에, 자동으로 spring 내부적으로 설정되어있는 h2를 사용하게되어서 그렇다.
아래는 @DataJpaTest 어노테이션에 포함된 어노테이션들이다.
이중 @AutoConfigureTestDatabase 어노테이션의 정의를 살펴보면 replace() 옵션에 대하여 설명되어있다.
현재 default 값인 Replace.ANY 는 아래 코드에서 확인할 수 있는데, 자동 설정되어있는 직접 정의했든 datasource를 그냥 내부적으로 정의된 기본값으로 교체해버린다.
enum Replace {
/**
* Replace the DataSource bean whether it was auto-configured or manually defined.
*/
ANY,
/**
* Only replace the DataSource if it was auto-configured.
*/
AUTO_CONFIGURED,
/**
* Don't replace the application default DataSource.
*/
NONE
}
따라서 application.property 안에 h2 with mysqldialect 설정을 한 대로 datasource가 지정되지 않았기 때문에 이런 오류가 발생한 것.
내가 설정한 DB를 사용해서 @DataJpaTest를 진행하려면, @AutoConfigureTestDatabase를 replace=NONE으로 변경해야 한다.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class SomeRepositoryTest {
// ...
}