Junjangsee's Blog

SpringBoot - 인메모리 데이터베이스(H2)

2019-05-12

images

인메모리 데이터베이스

메모리를 사용하여 DB를 조작하는 것을 말합니다.
다양한 종류가 있지만 H2를 활용해서 실습해 볼 것입니다.


H2, JDBC 의존성 추가하기

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

h2 jdbc의존성을 추가하면 두개의 항목을 자동설정 해줍니다.

  • DataSource
  • JdbcTemplate

이 두가지를 사용하여 리소스 반납처리, 에러 확인 등을 가독성 높고 편리하게 사용할 수 있습니다.


인메모리 데이터베이스 연결 정보 확인하기

autoconfigure - DataSourceAutoConfiguration - DataSourceProperties에 기본 정보가 들어가있습니다.

  • URL: “testdb”
  • username: “sa”
  • password: “”



H2 조회하기

총 2가지의 방법이 있습니다.

  • spring-boot-devtools 의존성을 추가합니다.
  • application.properties에 spring.h2.console.enabled=true를 추가합니다.

1번 방법에 2번이 포함되어 있기 때문에 devtools를 쓰신다면 2번이 필요 없지만 굳이 의존성을 추가하기 싫으시다면 2번을 하셔도 무방합니다.

h2

H2 사용하기

H2를 사용할 Runner 클래스를 생성합니다.

DataSource

Connection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class H2Runner implements ApplicationRunner {

@Autowired
DataSource dataSource;

@Override
public void run(ApplicationArguments args) throws Exception {
Connection connection = dataSource.getConnection();

System.out.println(connection.getMetaData().getURL());
System.out.println(connection.getMetaData().getUserName());

}
}

h2 ApplicationRunner를 구현하여 서버 실행시 함께 실행되도록 하고 @Component를 통해 빈으로 등록합니다.
DataSource를 주입받고 Connection 정보를 알아보기 위해 URL과 UserName을 가져옵니다.

서버를 구동하면 DataSourceProperties에 선언되어있는 기본 정보를 확인할 수 있습니다.


Statement

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
public class H2Runner implements ApplicationRunner {

@Autowired
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);
}


}
}

h2 CreateStatement함수를 이용하여 Statement객체를 받고 DDL 쿼리를 선언할 수 있습니다.
그리고 실행시 Update되도록 선언합니다.
그리고 서버를 구동시키고 오류가 나지 않으면 정상적으로 테이블이 생성된 것입니다.

h2 localhost:8080/h2-console로 접속하면 위와 같이 기본 정보가 출력되는 것을 확인할 수 있습니다.
기본정보가 일치하다면 접속을 합니다.

h2 접속하면 테이블이 생성된 것을 확인하실 수 있습니다.


JdbcTemplate

테이블을 생성했으니 이제 데이터를 삽입해야합니다.
그러기 위해서 JdbcTemplate을 통해 안전하고 편하게 데이터를 넣어보겠습니다.

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
@Component
public class H2Runner implements ApplicationRunner {

@Autowired
DataSource dataSource;

@Autowired
JdbcTemplate jdbcTemplate;

@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);

}

jdbcTemplate.execute("INSERT INTO USER VALUES(1, 'junjang')");

}
}

h2 DataSource와 동일하게 의존성을 주입하고 execute 함수를 통해 DML을 선언합니다.

h2 SELECT문을 활용하여 테이블에 데이터가 잘 들어간 것을 확인하면 됩니다.