[Spring Boot #21] 스프링 부트가 지원하는 인메모리 데이터베이스

2021. 3. 25. 00:43 Spring Framework/Spring boot #2

| 인메모리 데이터베이스

  • 디스크가 아닌 주 메모리에 모든 데이터를 보유하고 있는 데이터베이스입니다. 
  • 디스크 검색보다 자료 접근이 훨씬 빠른 것이 큰 장점입니다. 단점은 매체가 휘발성이기 때문에 DB 서버가 꺼지면 모든 데이터가 유실된다는 단점이 있습니다.
  • 스프링 부트에서 H2, HSQL 같은 인메모리, 디스크 기반 DB를 지원합니다.

 

| H2 데이터베이스 사용하기

 

프로젝트 구조

|   pom.xml
+---src
|   +---main
|   |   +---java
|   |   |   \---com
|   |   |       \---tutorial
|   |   |           \---springdatatutorial
|   |   |                   H2Runner.java
|   |   |                   SpringDataTutorialApplication.java
|   |   |
|   |   \---resources
|   |       |   application.properties
|   |       |
|   |       +---static
|   |       \---templates

 

의존성 추가

<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 데이터베이스 의존성을 추가하고 난 후, 설정 파일에 아무 설정이 되어 있지 않으면 스프링 부트는 자동적으로 H2 데이터베이스를 기본 데이터베이스로 채택합니다.
  • spring-boot-starter-jdbc 의존성을 추가하면 DataSource, JdbcTemplate을 별다른 설정없이 @Autowired 같은 빈 주입 어노테이션만 가지고도 쓸 수 있습니다.

 

소스 코드

@SpringBootApplication
public class SpringDataTutorialApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataTutorialApplication.class, args);
    }

}
@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);
            String URL = connection.getMetaData().getURL();
            System.out.println(URL);
            String User = connection.getMetaData().getUserName();
            System.out.println(User);

            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, 'saelobi')");
    }
}
  • dataSource에 의존성을 주입받아(H2 dataSource 구현체) H2에 접속하여 SQL문을 실행할 수 있습니다.
  • jdbcTemplate에 의존성을 주입받아 SQL문을 간편하게 실행할 수 있습니다.
  • 만일 해당 코드를 다시 실행하여도 인메모리 기반 DB로 실행되기 때문에 기존 데이터가 유실되어 위 SQL구문이 충돌없이 동작합니다.

 

결과 화면

HikariProxyConnection@1747631271 wrapping conn0: url=jdbc:h2:mem:testdb user=SA
jdbc:h2:mem:testdb
SA

 

http://localhost:8080/h2-console에 접속한 후 connect 버튼을 누르면 h2-console로 연결됩니다. 이때 URL이 jdbc:h2:mem:testdb 인지 확인해야합니다.

 

 

참고자료 : https://www.inflearn.com/course/스프링부트



출처: https://engkimbs.tistory.com/782?category=767865 [새로비]