[Spring boot] Test H2 DB설정

이정규·2022년 2월 15일
5

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개의 댓글