( DB ) H2 DB를 사용하는 이유

H2 데이터베이스는

간단한 프로젝트 또는 테스트용

적합한 데이터베이스입니다.

H2가 고유한 이유는 임베디드 모드 때문입니다.

지원하기 때문에


애플리케이션 및 DB 통신


Oracle, MySQL, MariaDB의 동작 원리는 위의 그림과 같습니다.

Application에서 DB를 읽고 쓰기 위해서는 DBMS에 적합한 JDBC 라이브러리를 설치하고 TCP/IP 통신을 해야 합니다. 이와 같이 Application과 DBMS가 독립된 프로세스로 분리된다면 DBMS는 많은 기능을 제공할 수 있다.

그러나 반면에 설정하기가 어렵고 무거워집니다. 개발자는 DB를 설치 및 설정하고 프로세스를 유지해야 합니다. 또한 App과 DBMS는 독립적인 프로세스이기 때문에 ‘의사소통’ 관련된 프로세스. 따라서 속도도 느립니다. 프로덕션 환경에서는 이러한 단점을 고려하지 않지만 간단한 프로젝트나 단위 테스트의 경우 무겁고 느리고 어려운 방법은 비효율적입니다.

H2 데이터베이스의 장점이 여기에 나타납니다. H2 데이터베이스는 임베디드 모드지지하다

임베디드

H2는 두 가지 모드를 지원합니다.

1. 임베디드 모드

2. 서버 모드

H2가 다른 DB와 다른 점은 임베디드 모드오전. SpringBoot로 프로젝트를 생성해 봅시다. ( https://start.spring.io/ )

> 스프링 부트 버전: 3.0.5


SpringWEB, Lombok, JPA 및 h2를 종속 항목으로 추가했습니다. 회원 정보를 DB에 저장하는 간단한 과정을 구현해 봅시다. Member 클래스를 생성하여 MemberRepository 클래스로 DB에 저장하고 다시 조회하는 코드입니다. Junit5로 테스트 클래스를 만들고 테스트했습니다. JPA 문법을 사용하지만 문법을 몰라도 충분히 이해할 수 있다.

회원 등급

package com.example.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter @Setter
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String username;
}

MemberRepositoryClass

package com.example.demo;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;

@Repository
public class MemberRepository {
    @PersistenceContext
    EntityManager em;
    
    // DB에 member 저장 
    public Long save(Member member){
        em.persist(member);
        return member.getId();
    }

    // DB에서 member 조회
    public Member find(Long id){
        return em.find(Member.class,id);
    }
}

Junit5 단위 테스트

package com.example.demo;


import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;

@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(value = false) // 커밋과 같은 의미
    public void testMember(){
        //회원 생성
        Member member = new Member();
        member.setUsername("강민구");
        
        //회원정보 DB에 삽입하기 
        Long saveId = memberRepository.save(member);
        //회원정보 조회하기
        Member findMember = memberRepository.find(saveId);

        //테스트 ( 삽입데이터와 조회데이터가 일치하는지 확인 )
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo((member.getUsername()));
        Assertions.assertThat(findMember).isEqualTo(member);

    }
}

회원 정보를 DB에 입력하고 입력된 데이터를 다시 불러옵니다. 그런 다음 삽입된 데이터와 검색된 데이터가 일치하는지 확인합니다. 기존 방식이었다면 DB 설치, 테이블 생성, DBMS 실행 등 다양한 설정이 필요했을 것이다. 그러나 h2 Embeded 모드는 하나의 설정만 필요합니다.

src/main/resources/application.yml

spring: #띄어쓰기 없음
    datasource: #띄어쓰기 2칸
      url: jdbc:h2:~/h2test2 #띄어쓰기 4칸
      username: sa
      password:
      driver-class-name: org.h2.Driver

    jpa: #띄어쓰기 2칸
        hibernate: #띄어쓰기 4칸
            ddl-auto: create #띄어쓰기 6칸
        properties: #띄어쓰기 4칸
            hibernate: #띄어쓰기 6칸
              #show_sql: true #띄어쓰기 8칸
              format_sql: true #띄어쓰기 8칸
logging.level: #띄어쓰기 없음
    org.hibernate.SQL: debug #띄어쓰기 2칸
    org.hibernate.orm.jdbc.bind: trace
  # org.hibernate.type: trace #띄어쓰기 2칸

(간격에 주의하세요!)

위의 파일과 같이 데이터 소스 구성을 넣습니다. jdbc 드라이버는 h2 드라이버이고 url을 입력하면 해당 위치에 (파일명 입력).mv.db 파일이 생성된다. mv.db 파일은 DB 정보, 테이블, 삽입된 데이터 정보를 저장하는 파일이다. 위의 설정을 추가하면 완료됩니다.

JAVA 코드를 작성하고 하나의 설정만 넣으면 끝입니다.

JVM은 자체적으로 H2를 실행하고, H2는 mv.db 파일을 생성하여 DB 정보를 유지 관리한다.


Application과 h2 db는 모두 하나의 JVM 프로세스에서 작동합니다. 하나의 프로세스에서 실행할 때 메모리와 CPU를 공유하기 때문에 속도도 빠릅니다. 별도의 TCP 통신이 필요 없습니다.

단위 테스트를 실행하면 다음과 같은 결과가 나타납니다.


로그를 통해 SQL 쿼리문이 실행되었음을 확인할 수 있습니다. SQL 문은 JPA와 관련이 있으므로 이 게시물에서는 다루지 않습니다.


위의 그림과 같이 지정된 경로에 mv.db 파일이 생성된 것도 확인할 수 있습니다. 즉, DB를 설치하지 않고 h2 라이브러리만 추가했는데도 테이블 생성은 물론 데이터 삽입 및 조회도 가능했다. 그런 다음 H2 프로그램을 설치하고 콘솔을 통해 시각적으로 확인하십시오.

H2 데이터베이스 엔진

H2 데이터베이스 엔진 Java SQL 데이터베이스인 H2에 오신 것을 환영합니다. H2의 주요 기능은 다음과 같습니다. 매우 빠른 오픈 소스, JDBC API Embedded 및 서버 모드; 메모리 내 데이터베이스 브라우저 기반 콘솔 애플리케이션 작은 설치 공간: 약 2.5MB jar 파일 크기 지원

h2database.com

위 사이트에서 설치 후 압축을 풉니다. 그리고 h2 폴더에서 bin 폴더로 이동합니다.


Mac의 경우 터미널에서 > sh h2.sh를 실행하고, Windows의 경우 h2.bat를 실행합니다.


그러면 위의 창이 자동으로 열립니다. H2를 Embeded로 변경하고 application.yml과 동일하게 설정합니다. 연결


MEMBER 테이블이 생성되고 데이터가 삽입된 것을 확인할 수 있습니다.


정리하다

이와 같이 H2 데이터베이스는 임베디드 모드를 제공하므로 JAVA 코드로만 DB에 데이터를 읽고 쓸 수 있습니다. Application과 함께 mv.db를 빌드하여 배포함으로써 다른 환경에서도 자동으로 DB 구성을 할 수 있습니다. 물론 복잡한 기능을 제공하지 않기 때문에 실제 운용에는 적합하지 않을 수 있지만 간단한 테스트나 소규모 프로젝트에는 쉽게 사용할 수 있습니다.