-
[21] Spring Data : In-memory DatabaseSpring/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의 종류는 다음과 같습니다.
- H2 (recommended)
- HSQL
- 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를 사용한 programming 은 반복적인 code가 많아 생산성을 떯어트리는 원인이 됩니다. 1
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 문이 정상적으로 실행 되었음을 확인할 수 있습니다.
'Spring > Spring boot' 카테고리의 다른 글
[23] Spring Data : PostgreSQL 설정하기 (0) 2020.07.11 [22] Spring Data : MySQL 설정하기 (0) 2020.07.09 [20] Spring Web MVC : CORS (0) 2020.07.04 [19] Spring Web MVC : Spring HATEOAS (0) 2020.06.30 [18] Spring Web MVC : ExceptionHandler (0) 2020.06.28