참고
임베디드 모드 DB
NOTE
테스트 케이스를 실행하기 위해서 별도의 데이터베이스를 설치하고, 운영하는 것은 상당히 번잡한 작업이다..
임베디드 모드
NOTE
•
H2 데이터베이스는 자바로 개발되어 있고, JVM안에서 메모리 모드로 동작하는 특별한 기능을 제공한다.
•
그래서 애플리케이션을 실행할 때 H2 데이터베이스도 해당 JVM 메모리에 포함해서 함께 실행할 수 있다
•
애플리케이션에서 자바 메모리를 함꼐 사용하는 라이브러첨 동작하게 한다!
임베디드 모드 직접 사용
@Bean
@Profile("test") // 프로필이 test 인 경우에만 데이터소스를 스프링 빈으로 등록
public DataSource dataSource() {
log.info("메모리 데이터베이스 초기화");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
Java
복사
•
jdbc:h2:mem:db
◦
이 부분이 중요하다! → dataSource를 만들 때 이렇게 적으면 임베디드(메모리) 모드로 동작이 가능하기 때문
•
DB_CLOSE_DELAY=-1
◦
임베디드 모드에서는 데이터베이스 connection 연결이 모두 끊어지면 데이터베이스도 종료되는데, 그것을 방지하기 위한 설정
•
그런데 실행하면 메모리 DB에 아직 테이블이 작성되지 않아 오류가 발생한다.
기본 SQL 스크립트를 사용해서 데이터베이스를 초기화하는 기능
NOTE
•
JDBC나 JdbcTemplate를 직접 사용해서 테이블을 생성하는 DDL을 호출해도 되지만, 너무 불편해진다.
•
스프링 부트는 SQL 스크립트를 실행해서 애플리케이션 로딩 시점에 데이터베이스를 초기화 하는 기능을 제공한다.
•
다음 파일을 //src/test/resources/schema.sql에 생성하면 된다. (파일이름과 위치가 꼭 맞아야 한다!)
drop table if exists item CASCADE;
create table item
(
id bigint generated by default as identity,
item_name varchar(10),
price integer,
quantity integer,
primary key (id)
);
SQL
복사
테스트에서 사용할 테이블 생성
스프링 부트와 임베디드 모드
NOTE
•
사실 위의 기능 다 몰라도된다. 어차피 스프링부트가 알아서 만들어준다
•
별다른 정보가 없다면 스프링 부트는 임베디드 모드로 접근하는 DataSource를 만들어서 제공한다.