[Spring boot] Test H2 DB설정

이정규·2022년 2월 15일

Springboot를 혼자서 공부하다가 에러떠서 정리한 내용이다.

에러 상황

Posts객체를 만들어두고 이를 DB와 연동해서 작동이 되는지 테스트해보던 중, 분명 테이블 생성 sql문은 들어갔는데 여기서 에러가 뜨는 상황이 발생했다.

Hibernate: drop table if exists posts
Hibernate: create table posts (identifier bigint not null auto_increment, author varchar(255), content TEXT not null, title varchar(500) not null, primary key (identifier)) engine=InnoDB
2022-02-15 23:30:26.003  WARN 12420 --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL "create table posts (identifier bigint not null auto_increment, author varchar(255), content TEXT not null, title varchar(500) not null, primary key (identifier)) engine=InnoDB" via JDBC Statement

원인

H2 Database는 H2 쿼리문법을 이용한다. H2에 Mysql문법을 날리면 H2는 이해하지 못한다.
그래서 mysql로 바꿔주어야 한다.

# application.properties

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

데이터베이스 유형을 알려주는 것이 Dialect설정이다.
MySQL5버전, InnoDB 스토리지 엔진을 사용하여 진행한다는 뜻이다.

하지만 이것만 설정한다고 해서 되지는 않는다. H2 DB를 바라보게 설정을 해줘야 한다.

# application.properties

spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL

앞 부분은 jdbc:h2:mem:testdb or jdbc:h2:~/testdb 둘 중 어떤 것을 사용해도 상관없다.

두 가지의 차이점은 이렇다.

  • jdbc:h2:mem:testdb
    In-memory DB다. DB를 연결하고 닫으면 해당 DB는 사라진다. 어플리케이션이 동작할 때에만 존재하는 DB인 것이다.
  • jdbc:h2:~/dbname
    Local DB다. 직접 로컬에서 홈디렉토리로 가보면 db들이 생성되있는 것을 확인할 수 있다.
    해당 DB는 저장되며 계속 사용할 수 있다.

우리는 테스트에만 사용할 것이니 In-memory방식으로 사용하는 것이 좋아보여서 mem방식으로 진행할 것이다.

뒤에 MODE=MySQL은 MySQL문법을 사용한다는 뜻이다.

이렇게 properties를 설정한 뒤에 테스트를 해보면

성공하는 것을 볼 수 있다!

참고
https://2dongdong.tistory.com/66
https://sosohanya.tistory.com/27
https://velog.io/@jwkim/spring-boot-datajpatest-error
https://www.h2database.com/html/features.html#in_memory_databases

profile
강한 백엔드 개발자가 되기 위한 여정

0개의 댓글