스프링 JDBC와 in memory db 사용하기

스프링 JDBC 와 in memory db

  • 스프링은 인메모리데이타베이스를 제공한다. 외부 DB와 않고 사용 가능하다.
  • 보통 H2를 사용한다. 웹 콘솔을 사용할 수 있다.

H2 구현

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url= jdbc:h2:mem:testdb
  • 인메모리로 사용할 경우 url을 위와 같이 사용한다(사실 위의 설정이 없어도 잘 동작한다). 만약 휘발되지 않기를 바라거나 웹 콘솔을 사용하고 싶으면, h2 웹 콘솔을 이용하여 데이타베이스를 만들고 해당 url을 삽입하자.
  • 아래의 코드로 H2의 동작을 확인할 수 있다.
@Component
@Slf4j
public class H2Runner implements ApplicationRunner {

    @Autowired
    private DataSource dataSource; // Data-JDBC 를 호출

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        try(Connection connection = dataSource.getConnection();){ //Connection 객체는 AutoCloseable 을 지원. 안전한 close()를 보장한다.

            System.out.println(connection.getMetaData().getURL()); // properties 에서 설정한 값이 나온다. 
            System.out.println(connection.getMetaData().getUserName());

            Statement statement = connection.createStatement();
            String sql = "CREATE TABLE USER(ID INTEGER NOT NULL, name VARCHAR, PRIMARY KEY(id))";
            statement.executeUpdate(sql);
        }
        jdbcTemplate.execute("INSERT INTO USER VALUES(1,'hi')");

    }
}

스프링부트와 DBCP

  • DBCP란 Database Connection Pool 의 약자이다.
  • 스프링부트는 HikariCP 를 기본으로 사용한다.
  • 어플리케이션의 성능은 내부 어플리케이션의 로직보다, DB를 연결하기 위한 커넥션풀에 설정이나 DB 자체의 성능에 좌우되는 경우가 많다. 안정적인 커넥션풀의 선택과 커넥션풀에 대한 적절한 설정이 필요하다.

라이센스 비용에 따른 관계형 데이타베이스의 선택

  • 라이센스 비용 측면에서는 다음과 같은 선호도를 가진다. Oracle -> Mysql -> MariaDB -> PostgreSQL
  • Mysql 의 경우 엔터프라이즈를 사용하려면 오라클에 비용을 내야 한다.
  • MariaDB의 경우 무료이지만 GPL2 에 따라 해당 DB를 사용하는 어플리케이션에 대한 소스코드를 공개해야 할 수 있다.
  • PostgreSQL의 경우 무료에 특별한 의무사항이 없어서 무료 관계형 데이타베이스로 법적인 특별한 문제 없이 선택하기에 좋다.
  • 라이센스 비용과 관계 없이 상황에 따른 성능 차이로 Mysql와 PostgreSQL 중 하나를 선택하기도 한다.