h2 데이터베이스를 제대로 알아보자

청포도봉봉이·2024년 3월 29일
2

DataBase

목록 보기
2/3
post-thumbnail

h2 데이터베이스를 구글링으로 설치하고 JDBC 연결하는걸 보고 베끼기만 하니까 기억에 남지도 않고 왜 쓰는건지도 모르겠고 인메모리 DB도 잘 모르겠어서 정리해봤습니다.

h2 데이터베이스란?

위키피디아에 나온 정의는 H2는 자바로 작성된 관계형 데이터베이스 관리 시스템이다. 자바 애플리케이션에 임베드하거나 클라이언트-서버 모드에서 구동할 수 있다. 라고 적혀있습니다.

그리고 공식 사이트에 나와있는 특징으로는

  • 매우 빠르고, 오픈 소스인 JDBC API이다.
  • 인메모리 데이터 베이스이다. (Embedded 모드, Server 모드를 지원)
  • 브라우저 기반 콘솔 애플리케이션이다.
  • 2.5 MB의 작은 크기를 가진 jar 설치 파일이다.

인메모리 데이터베이스

위 설명에 나와있는 인메모리 데이터 베이스라는 것이 h2 데이터베이스의 큰 장점이라는건 들어봤을 겁니다. 그렇다면 인메모리 데이터베이스가 뭘까요?

AWS의 설명을 보면 아래와 같습니다.
인 메모리 데이터베이스는 데이터 저장에 내부 메모리를 주로 사용하는 목적별 데이터베이스입니다. 표준 디스크 드라이브(SSD)에 액세스할 필요가 없으므로 응답 시간을 최소화할 수 있습니다. 인 메모리 데이터베이스는 게임 순위표, 세션 스토어, 실시간 데이터 분석과 같이 마이크로초의 응답 시간이 요구되거나 트래픽이 큰 폭으로 급증하는 애플리케이션에 적합합니다. 주 메모리 데이터베이스(MMDB), 인 메모리 데이터베이스 시스템(IMDS), 실시간 데이터베이스 시스템(RTDB)이라는 용어도 인 메모리 데이터베이스를 가리킵니다.

특징

  1. 인메모리 DB는 RAM과 같은 주기억 장치에 저장한다. (하드디스크는 보조 기억 장치)
  2. 주기억장치에서의 접근은 보조기억 장치의 수천배 빠르다. 엄청 빠르다!

활용

인메모리 DB를 활용한 사례에는 인메모리 캐싱이 있습니다.

  • 인메모리 캐싱은 자주 사용되는 데이터를 메모리에 저장함으로써 데이터 액세스 속도를 높이는 기술입니다.
  • 캐시는 key-value 구조로 데이터를 저장하며, key는 데이터의 위치를 value는 실제 데이터를 가리킵니다.
  • 주로 메모리 기반 데이터베이스나 Redis, Memcached 등의 서버가 캐시 역할을 합니다.

한계

이렇게 좋은 점만 있을거 같은 인메모리 데이터베이스도 한계가 분명 존재합니다.

  • RAM의 용량이 제한적이므로 데이터 저장 크기에 한계가 있습니다. RAM은 확실히 성능은 좋지만 하드디스크(SSD)와 비교하면 용량이 적은데 가격도 비쌉니다.
  • 시스템 오류나 정전시에 데이터 손실의 위험이 큽니다.

따라서 인메모리 DB는 성능 최적화 용도로 사용되며, 중요 데이터는 하드디스크와 같은 보조기억장치에 저장하는 식으로 많이 사용합니다.




h2 연결모드

네 위와 같이 h2 데이터베이스를 파니까 깊은 내용을 조금이나마 알게되었습니다. 원래 제가 하려고 했던 h2 데이터베이스 연결모드에 대해 알아보겠습니다.

h2 데이터베이스는 임베디드 모드서버 모드 2가지로 존재합니다.

임베디드 모드

임베디드 모드는 위와 같이 Application 내에서 사용할 수 있는 모드입니다.

SpringBoot를 사용하시는 분들은 h2 데이터베이스를 설치하고 application.yml 파일에

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:~/joyMall;MODE=MYSQL;
    username: sa
    password:

이런식으로 저장합니다. 순수 자바로 JDBC를 연결하려면 아래와 같습니다.

import java.sql.*;
public class Test {
    public static void main(String[] a)
            throws Exception {
        Connection conn = DriverManager.
            getConnection("jdbc:h2:~/test", "sa", "");
        // add application code here
        conn.close();
    }
}

위 코드에서 jdbc:h2:~/test 이런 식으로 작성을 하면 임베디드 모드를 사용하겠다는 것입니다. yml 파일에서 선언한 방식과도 유사하죠?

인텔리제이를 사용하신다면 yml 파일에 위와 같이 임베디드 모드로 설정을 하고 애플리케이션을 실행하면

이렇게 연결에 성공하게 됩니다.

서버 모드

서버 모드는 TCP/IP를 이용하여 데이터를 송수신하는 방법을 말합니다.

위의 그림을 보시면 H2 Server를 따로 띄워주는거라고 생각하시면 됩니다. 이 방법을 하기 위해서는 applicatio.yml 파일을 아래와 같이 바꿔주면 됩니다.

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:tcp://localhost/~/joyMall

url 부분에만 tcp 관련 설정이 생긴걸 확인할 수 있습니다.

이 상태에서 똑같이 애플리케이션을 실행하면 어떻게 될까요?

로그를 보면 Failed to obtain JDBC Connection JDBC 연결에 실패하였습니다. 라는 에러를 볼 수 있습니다. 다시 그림을 보시면 서버 모드는 애플리케이션에 h2가 내장되어 있지 않기 때문에 저희가 수동으로 실행시켜줘야 합니다.

h2 데이터베이스를 설치하신 분들은 h2/bin 폴더에 h2.sh 실행파일이 있는것을 보실 수 있을 겁니다.
h2.sh 파일을 실행 후 애플리케이션을 실행해 보겠습니다.

정상 작동합니다! 그리고 h2.sh를 실행하니까

이런 화면도 뜨게 되었죠? ( localhost:8082 로 접속 가능합니다.) 위 콘솔에서는 GUI를 통해서 데이터베이스를 조작할 수 있게 도와주는 도구라고 생각하시면 됩니다.


마무리

이렇게 h2 DB를 알아보면서 인메모리 DB가 무엇인지 h2가 어떤 모드가 존재하는지를 알아보았습니다. 헷갈리시다면 위의 그림을 이해해보고 직접 IDE를 통해 애플리케이션을 실행해보시면서 실습해보는게 이해가 가장 빠를 거라고 생각합니다.

사실 제가 헷갈려서 작성한 글이였습니다! 모두 화이팅!

참고
https://www.h2database.com/html/features.html#connection_modes

profile
서버 백엔드 개발자

0개의 댓글