본문 바로가기
mybatis

springboot with mybatis - test 설정(인메모리 db: h2)

by khds 2023. 4. 5.

springboot로 mybatis를 이용하여 실제 데이터를 기반으로test를 진행하고 있었다.

하지만 실제데이터로 진행하면 그때그때마다 상황이 달라지기 때문에 테스트 코드가 무조건 성공할 수는 없다. 그렇기에 테스트가 실행될 동안만 필요한 DB를 구현해야 했다. 

바로 인메모리 DB를 말이다. 

현 상황은 springboot로 mybatis를 사용중이고 flyway를 통해 DB마이그레이션을 하고 있다. Repository 테스트 코드를 작성하기 위해 인메모리 DB인 h2를 사용하려고 한다. 

 

테스트 코드 내의 resources는 아래와 같다.

 

application.yml의 내용은 아래와 같다.

spring:
  datasource:
    driverClassName: org.h2.Driver
    password: password
    url: jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1
    username: sa
  flyway:
    enabled: false

 

여기서 주의해야 할것은 url에 MODE=MYSQL 부분과 flyway.enabled = false 부분이다. 

test에서는 flyway를 적용하지 않아야 하기에 flyway를 비활성화 하였다. 그리고 mybatis는 jpa와 다르게 sql문을 통해 테이블을 생성해야 하므로 init-table.sql을 생성하였다. 

 

진행하던 도중에 마주진 에러가 있는데 아래와 같다.

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement ~~ expected "identifier"

statement ~~ 부분은 sql문 마다 다른 형태를 띄지만 전체적인 에러의 양상의 위와 같다.

위의 에러가 발생시 두가지로 추측될 수 있다. 하나는 위에 환경파일에 url에 MODE=MYSQL를 사용하지 않아서이다.

mysql 문법이라는 것을 알려줘야하기 때문이다.

두번째는 예약어 사용이다. 나는 user를 테이블 이름으로 사용해서 위와 같은 에러가 발생했었고 테이블 명을 member로 변경하니 문제없이 잘 실행되었다.

 

init-table.sql의 내용은 아래와 같다.

 

drop table article if exists;
drop table member if exists;


create table member (
    id bigint not null auto_increment,
    email varchar(100) not null,
    image_url varchar(255),
    join_date datetime(6),
    nick_name varchar(100) not null,
    password varchar(255),
    provider varchar(255),
    provider_id varchar(255),
    role varchar(20) not null,
    refresh_token varchar(255),
    primary key (id)
);

create table article (
    id bigint not null auto_increment,
    content longtext,
    create_date datetime(6),
    latitude double precision,
    longitude double precision,
    private_map bit not null,
    public_map bit not null,
    title varchar(50) not null,
    member_id bigint not null,
    primary key (id)
);

alter table article
add constraint article_member_id_foreign_key
foreign key (member_id)
references member (id);

 

아래는 RepositoryTest시 어노테이션들이다.

@RunWith(SpringRunner.class)
@MybatisTest
@ActiveProfiles("test")
@Sql(value = "/init-table.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD)
public class RepositoryTest {

}

 

 

 

참고

https://leeeehhjj.tistory.com/52

 

org.h2.jdbc.JdbcSQLSyntaxErrorException 에러

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "CREATE TABLE SCHEDULES (ID BIGINT NOT NULL AUTO_INCREMENT, CONTENT VARCHAR(255), DATE VARCHAR(255) NOT NULL, PRIMARY KEY (ID)) ENGINE=[*]INNODB"; expected "identifier"; SQL statement:

leeeehhjj.tistory.com

 

https://msyu1207.tistory.com/entry/spring-boot-JdbcSQLSyntaxErrorException-Syntax-error-in-SQL-statement-expected-identifier-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88

 

[spring boot] JdbcSQLSyntaxErrorException: Syntax error in SQL statement ... expected "identifier" 해결 방안

안녕하세요 😉 유유자적한 개발자 유로띠 입니다 😀 👏👏👏👏 이번 포스팅에서는 JdbcSQLSyntaxErrorException: Syntax error in SQL statement ... expected "identifier" 에 대해 삽질기와 해결 방법에 대해 알아

msyu1207.tistory.com