Spring/Spring boot

[21] Spring Data : In-memory Database

낙타선생 2020. 7. 7. 08:56
반응형

[In-memory Database]

data storage를 main memory(RAM)에 설치하여 운영되는 DBMS를 In-memory Database라고 합니다.

In-momory Database의 장단점은 다음과 같습니다.

  • 장점: data 접근 속도가 매우 빠름
  • 단점:  RAM이 휘발성이기 때문에 전원 차단시 RAM에 저장된 데이터는 모두 소실됨. 최근 비휘발성 RAM 기술의 도입으로 전원 차단에도 data의 영속성을 유지할 수 있게 되었음.

 

Spring boot에서 지원하는 In-memory Database의 종류는 다음과 같습니다.

  1. H2 (recommended)
  2. HSQL
  3. Derby

 

 

 


[Spring boot에서 In-memory Database 사용]

 

1.h2 database 사용을 위한 의존성 추가

우선 In-memory database를 사용하기 위해서 spring-boot-starter-jdbc와 h2 (in-memory database)에 대한 의존성을 추가해야 합니다. pom.xml file을 열어 dependencies tag 안에 다음의 내용을 추가해 줍니다.

<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>

 

고전적인 방식의 JDBC[각주:1]를 사용한 programming 은 반복적인 code가 많아 생산성을 떯어트리는 원인이 됩니다.

 

Spring boot에서는 이를 개선하기 위해 (spring-boot-starter-jdbc 의존성에 포함되어 있는) Spring JDBC를 제공합니다.

Spring JDBC가 class path에 있으면 Datasource와 JDBC Template bean이 자동으로 설정됩니다.

Spring JDBC package는 다음과 같이 구성되어 있습니다.[각주:2]

  • org.springframework.jdbc.core : 콜백 인터페이스, jdbcTemplate 관련 Helper 객체 제공
  • org.springframework.jdbc.datasource : DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜잭션매니저 및 다양한 datasource 구현체 제공
  • org.springframework.jdbc.object : RDBMS 저장, 조회, 갱신 절차를 안전하고 재사용 가능한 객체로 표현하는 클래스 포함
  • org.springframework.jdbc.support : core, object 를 사용하는 JDBC 프레임워크 지원.

 

spring-jdbc 의존성 추가로 인해 적용되는 자동설정은 spring-boot-autoconfigurer/META-INF/spring.factories에서 확인해볼 수 있습니다.

 

h2 의존성이 class path에 들어가 있고 어떤 datasource 설정도 하지 않으면 spring boot는 in-memory database를 설정해주므로 즉시 h2 database를 사용할 수 있습니다.

 

 

2. database 접속 정보 확인

database를 사용하기 위해서는 접속 정보를 먼저 확인해야 합니다. Runner class를 하나 만들어 database 접속정보를 확인해보도록 합시다.

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;

@Controller
public class H2Runner implements ApplicationRunner {

    @Autowired
    DataSource dataSource;	//	① Connection 가져오기 위한 DataSource 객체를 주입받습니다.

    @Override
    public void run(ApplicationArguments args) throws Exception {

        try(Connection connection = dataSource.getConnection()) { //	②
            String url = connection.getMetaData().getURL();  //	③
            String userName = connection.getMetaData().getUserName(); //	④

            System.out.println("URL: " + url);
            System.out.println("UserName: " + userName);
        }
    }
}

① Connection 가져오기 위한 DataSource 객체를 주입받습니다.

② Datasource를 사용하여 sql Connection을 가져옵니다. try 구문을 사용하여 실행부 완료 또는 오류발생 시 가져온 Connection을 반납합니다.

③ Connection의 meta정보에서 URL을 확인

④ Connection의 meta정보에서 UserName을 확인

 

 

 

3. Table 생성

위의 Runner class에서 USER table을 생성하는 구문을 추가합니다.

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;

@Controller
public class H2Runner implements ApplicationRunner {

    @Autowired
    DataSource dataSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        try(Connection connection = dataSource.getConnection()) {
            String url = connection.getMetaData().getURL();
            String userName = connection.getMetaData().getUserName();

            System.out.println("URL: " + url);
            System.out.println("UserName: " + userName);

            Statement statement = connection.createStatement(); //	①
            
            //	②
            String sql = "CREATE TABLE USER(ID INTEGER NOT NULL, name VARCHAR(255), PRIMARY KEY (id))";
            statement.executeUpdate(sql);	//	③
        }
    }
}

① sql 실행을 위한 Statement를 만들어 줍니다.

② USER table을 생성하기 위한 sql문입니다.

③ String type의 sql문을 실행하도록 database로 전달합니다.

 

 

 

4. H2 console을 사용하여 Database 내용을 확인.

H2 console을 사용하기 위한 준비

  • applicatioin.properties file에 spring-boot-devtools를 추가 (spring.h2.console.enabled=true 만 추가해도 됨)
spring.h2.console.enabled=true

 

 

H2 console의 접속

  • http://localhoust:8080/h2-console 로 접속

JDBC URL과 User Name을 확인하고 Test Connection을 눌러 Connection이 정상적으로 이뤄지는지 확인합니다. 문제가 없는경우 Connect button을 눌러 H2 console에 접속합니다.

 

console 좌측의 navigation을 보면 USER table이 정상적으로 생성되어 있음을 확인할 수 있습니다.

 

 

위에서 DataSourceror bean을 주입받고 Connection을 얻은 뒤 sql 실행을 위한 Statement 객체를 통해 sql문을 실행했습니다만 JdbcTemplate bean을 주입 받아 보다 간결하고 안전하게 sql문을 실행할 수도 있습니다. 또한 에러 계층구조를 잘 만들어 놓았기 때문에 오류에 대한 분석도 편하게 할 수 있습니다.

 

Runner class에 JdbcTemplate bean을 사용하여 USER table에 data를 insert하는 구문을 추가하도록 수정합니다.

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;

@Controller
public class H2Runner implements ApplicationRunner {

    @Autowired
    DataSource dataSource;

    @Autowired
    JdbcTemplate jdbcTemplate;	//	①

    @Override
    public void run(ApplicationArguments args) throws Exception {

        try(Connection connection = dataSource.getConnection()) {
            String url = connection.getMetaData().getURL();
            String userName = connection.getMetaData().getUserName();

            System.out.println("URL: " + url);
            System.out.println("UserName: " + userName);

            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, 'Dave')");	//	②
    }
}

① JdbcTemplate bean을 주입받습니다.

② JdbcTempate type의 execute() method를 사용하여 실행할 query문을 db로 전달합니다.

 

H2 console에서 실행 결과를 확인하면 INSERT 문이 정상적으로 실행 되었음을 확인할 수 있습니다.

 

 

 


 

  1. JDBC(Java Database Connectivity)는 Java에서 database에 접속할 수 있도록 하는 Java API입니다. JDBC는 database에서 data를 query하거나 update하는 방법을 제공합니다. [본문으로]
  2. 참고: https://wordbe.tistory.com/entry/Spring-Spring-JDBC-%EC%84%A4%EB%AA%85%EC%8B%A4%EC%8A%B5 [본문으로]