ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [21] Spring Data : In-memory Database
    Spring/Spring boot 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 [본문으로]

    댓글

Designed by Tistory.