개발환경에서 MySQL를 사용하고 있는데, 테스트 코드를 작성할 때 데이터베이스의 분리가 필요하다고 생각되어 H2를 따로 연결하게 되었다.
runtimeOnly 'mysql:mysql-connector-java' // 개발 환경에서 사용하는 DB(MySQL)
runtimeOnly 'com.h2database:h2' // 테스트 코드 작성시 사용할 DB(H2)
spring:
datasource:
initialization-mode: always
url: jdbc:h2:tcp://localhost/~/test
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
logging.level:
org.hibernate.SQL: debug
jpa.hibernate.ddl-auto: create
: 기존 테이블 삭제 후 다시 생성한다.jpa.properties.hibernate.format_sql: true
: DB 쿼리를 포맷해 보기 좋게 보여준다.logging.level.org.hibernate.SQL: debug
: 로그의 ?에 어떤 값이 들어갔는지 확인할 수 있다.H2 DB를 In-Memory 방식으로 사용할 수도 있다.(링크 참조)
spring.datasource.url
에jdbc:h2:mem
을 작성해거나,spring.datasource
의 값들을 다 삭제하면 된다.
만약, MySQL을 사용하다가 DB를 분리했을 경우 java.lang.illegalstateexception: failed to load applicationcontext
에러가 발생할 수도 있다. 보통 H2 DB를 켜두지 않았거나, H2와 MySQL 연결에 혼동이 생겨 발생하는 에러인 듯 하다.
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class XXXTest {
// ...
}
테스트 클래스에 @AutoConfigureTestDatabase
어노테이션을 사용해 H2 DB와 연결할 것임을 명시해주면 된다.