본문 바로가기
웹 프로그래밍/스프링부트

1. 스프링 데이터(인메모리 데이터베이스) H2

by Backchus 2019. 10. 24.

인메모리 데이터베이스란?

우리가 평소에 사용하는 Mysql이나 Oracle과 같은 DBMS를 사용할 때 데이터는 디스크에 저장됩니다.

인메모리 데이터베이스는 디스크가 아닌 메인 메모리에 모든 데이터를 보유하고 있는 데이터베이스로 디스크에서 검색하는 것보다 자료 접근이 훨씬 빠른 것이 가장 큰 장점입니다.

단점이라면 역시 메모리에 저장되기때문에 휘발성이라는 점입니다. 이런 인메모리 데이터베이스를 SpringBoot에서 설정하는 방법을 다뤄보겠습니다.

먼저 IntelliJ에서 SpringInitioalizer로 SpringBoot 프로젝트를 만들어 보겠습니다. 만약 IntelliJ가 Community 버전이라면 

https://start.spring.io/

여기로 들어가셔서 프로젝트를 만드시고 인텔리 제이로 임포트 하시면 됩니다.

 

메이븐 설정

이렇게 Dependencies에 Spring Web, JDBC, H2를 추가하고 프로젝트를 생성합니다.

 

spring-boot-autoconfigure의 spring.factories를 확인해보면 DataSourceAutoConfiguration, JdbcTemplateAutoConfiruation이 Spring JDBC의존성으로 인해 설정되어있는 것을 확인할 수 있습니다.

 

현재 아무런 DataSource설정을 설정하지 않았는데 이러한 경우에 SpringBoot는 자동으로 H2 인메모리 데이터베이스가 의존성에 추가되어있기때문에 바로 데이터베이스를 사용할 수 있습니다.

 

org.springframework.boot.autoconfigure에 jdbc패키지안에 DataSourceProperties클래스 안에 DataSource에 대한 설정이 되어있는 것을 알 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package me.weekbelt.springbootjdbc;
 
import org.springframework.stereotype.Component;
 
 
@Component
public class H2Runner implements ApplicationRunner {
    private DataSource dataSource;
 
    public H2Runner(DataSource dataSource) {
        this.dataSource = dataSource;
    }
 
    @Override
    public void run(ApplicationArguments args) throws Exception {
        try (Connection connection = dataSource.getConnection()) {
            System.out.println(connection.getMetaData().getURL());
            System.out.println(connection.getMetaData().getUserName());
 
            Statement statement = connection.createStatement();
            String sql = "CREATE TABLE USER(id INTEGER NOT NULL, name VARCHAR(255), PRIMARY KEY(id))";
            statement.executeUpdate(sql);
        }
 
 
    }
}
 
 
 

기본 패키지 바로 아래에 H2Runner라는 클래스를 만들고 DataSource의 메타데이터중에 URL과 UserName을 출력하고 간단한 테이블을 생성하는 쿼리를 작성하고 실행하였습니다.

 

실행결과 DataSource의 메타데이터가 출력하는 것을 확인했고 정상적으로 동작하는 것은 알았는데 실제로 DB에 테이블이 생성되었는지는 여기서 확인할 수가 없습니다.

그래서 H2 콘솔을 사용해서 확인하려고 합니다.

H2 콘솔을 사용하는 방법은 2가지가 있습니다. 

  • pom.xml에 spring-boot-devtools를 추가
  • application.properties에 spring.h2.console.enabled=true를 추가

 

spring-boot-devtools를 추가하면 다른 설정들도 추가가 되는데 저는 다른 설정을 추가하지 않고 H2 콘솔만 사용하기 위해서 두 번째 방법으로 application.properties에 spring.h2.console.enabled=true를 추가하겠습니다.

 

설정을 추가한 후 다시 스프링부트를 재실행시켜주시고 http://localhost:8080/h2-console 이렇게 접속해 주시면 이러한 화면이 나옵니다. JDBC URL이 지금 기본 설정과 다르기 때문에 위에서 콘솔에서 찍은 URL인 jdbc:h2:mem:testdb로 바꿔서 설정해줍니다.

 

JDBC URL을 바꿔준 후 TestConnection을 클릭해 접속이 정상적으로 되는 것을 확인하고 Connect버튼을 클릭합니다.

 

USER테이블이 생성된 것을 확인할 수 있습니다.

 

USER테이블이 비어있기 때문에 직접 데이터를 넣어보겠습니다. 그전까지 DataSource로 직접 Statement객체를 생성하여 실행했지만 JdbcTemplate도 빈으로 설정되어 있기 때문에 Spring JDBC가 제공하는 JdbcTemplate을 주입받아서 훨씬 더 간결하게 쿼리를 실행할 수 있습니다. 

 

데이터가 잘 들어가 있는 것을 볼 수 있습니다.