Back-end/Spring

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

Tigger 2020. 6. 27. 23:56

인메모리 데이터베이스

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

H2, JDBC 의존성 추가하기

        <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

@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

@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을 통해 안전하고 편하게 데이터를 넣어보겠습니다.

@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문을 활용하여 테이블에 데이터가 잘 들어간 것을 확인하면 됩니다.