DataBase

[H2DB] H2 Database란? + 설치 및 사용법

苦盡甘來 2024. 4. 1. 01:38

 


H2 Database란?

💡 Java로 작성된 관계형 데이터베이스 관리 시스템 (RDBMS)이다.
데이터가 시스템 메모리에 저장되어, 서버를 종료하거나, 재시작하면
해당 데이터가 삭제되는 Database이다.

특징

  • Spring Boot가 지원하는 인 메모리 데이터베이스이다.
  • 매우 빠른 속도를 지원하는 오픈 소스이다.
  • 2MB jar 파일 크기로, 용량이 매우 가볍다.
  • 주로 로컬 및 테스트 환경에서 쓰인다.
💡 위 특징대로 빠른 속도를 지원하고, 브라우저 기반 콘솔이기에 접근성도 좋다.
개발 중 테스트 데이터들로, 로컬 메모리에서 테스트하기 적합하다.

H2 Database 사용법

https://www.h2database.com/

 

H2 Database Engine (redirect)

H2 Database Engine Welcome to H2, the free SQL database. The main feature of H2 are: It is free to use for everybody, source code is included Written in Java, but also available as native executable JDBC and (partial) ODBC API Embedded and client/server mo

www.h2database.com

 

먼저 상단 링크에 접속하여, All Platforms를 클릭 후 다운로드 한다.

 

 

⚠️ Spring Boot 2.x를 사용하려면 1.4.200 버전을,
      Spring Boot 3.x를 사용하려면 2.1.214 버전 이상을 다운로드 해야한다.

 

압축을 풀고 설치된 경로로 이동하여, /bin 디렉토리에 h2.sh 또는 h2.bat을 실행하면 서버가 실행된다.

linux, window 환경에 따라 다른데,

필자는 window를 사용했기에, 해당 OS에 맞춰서 설명 하려고한다

 

➡️ 명령어 : 설치된 경로/bin/h2.bat

 

⚠️ 필자는 이미 실행해놓은 상태이기에, Address already 오류가 발생했지만
처음 실행하면 오류 없이 실행이 될것이다.

 

이후 build.gradle에 플러그인 설정을 한다.

 

H2 플러그인 설정됨에 따른, application.yml 혹은 properties를 설정해줘야한다.

spring:
  h2:
    console:
      enabled: true
  datasource:
    # jdbc:h2:~/jpashop 최소 한번 실행 후
    # ~/jpashop.mv.db 파일이 정상적으로 생성됐는지 확인
    # 이후 부터는 jdbc:h2:tcp://localhost/~/jpashop tcp로 접속한다. 
    url: jdbc:h2:tcp://localhost/~/jpashop  
    username: sa
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create # application 실행 시점에 테이블을 drop하고 다시 생성한다.
    properties:
      hibernate:
        show_sql: true # System.out에 hibernate 실행 SQL을 출력한다.
        format_sql: true
logging:
  level:
    org.hibernate.sql: debug # logger를 통해 hibernate 실행 SQL을 출력한다.

 

실제 동작하는지 확인하기위해, Entity와 Repository를 설정한다.

 

Entity

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "member") // order에 있는 member에 mapping됐다는 의미.
    private List<Order> orders = new ArrayList<>();

}

 

Repository

@Repository
public class MemberRepository {

    @PersistenceContext
    private EntityManager em;

    public Long save(Member member) {
        em.persist(member);
        return member.getId();
    }
    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

 

Test

@SpringBootTest
public class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(false)
    public void testMember() throws Exception {
        // given
        Member member = new Member();
        member.setName("memberA");

        // when
        Long saveId = memberRepository.save(member);
        Member findMember = memberRepository.find(saveId);

        // then
        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getName()).isEqualTo(member.getName());

        /**
         * 1차캐시 비교, ID 값이 같으면 같은 Entity로 판단, 즉 영속성 컨테이너에서 식별자가 같다.
         */
        assertThat(findMember).isEqualTo(member);

        System.out.println("findMember = " + findMember);
        System.out.println("member = " + member);
    }
}

 

현재 필자는 여러 Entity를 생성해뒀기 떄문에, 하단 사진처럼 여러 테이블이 생성된걸 볼 수 있다. 

 


Cheat Sheet

별도 H2 설치 없이, build.gradle 설정만으로도 테스트가 가능한 방법이 있다.

 

https://www.h2database.com/

 

H2 Database Engine (redirect)

H2 Database Engine Welcome to H2, the free SQL database. The main feature of H2 are: It is free to use for everybody, source code is included Written in Java, but also available as native executable JDBC and (partial) ODBC API Embedded and client/server mo

www.h2database.com

 

동일하게 상단 링크에 접속 후, 좌측 Home - Cheat Sheet를 클릭한다.

 

 

기존에 application.yml에 설정했던 url을 하단 url로 설정한다.

 

# test에서는 test-resources를 우선권으로 가진다.
# in-memory를 지원하기때문에, 별도 h2 설치 없이, 테스트가 가능하다.
# 하단 spring ~ logging 전까지 내용이 없어도 된다.
spring:
  datasource:
    url: jdbc:h2:mem:test
    username: sa
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create # application 실행 시점에 테이블을 drop하고 다시 생성한다.
    properties:
      hibernate:
        show_sql: true # System.out에 hibernate 실행 SQL을 출력한다.
        format_sql: true
logging:
  level:
    org.hibernate.sql: debug # logger를 통해 hibernate 실행 SQL을 출력한다.

 

테스트 목적으로 만든 application.yml이기 때문에,

경로는 src/test/resources/applicaton.yml로 설정해줬다.

💡 패키지는 main과 test로 구성되어있는데,
Test 실행 시 test/resources에 있는 application.yml을 적용하기때문에, 위 경로로 설정해두었다.
사실상 Test에서는 spring.datasource를 지워도 in-memory로 동작한다.

사용 예제 GIT LINK

https://github.com/HyunDove/inflearn_jpashop

 

GitHub - HyunDove/inflearn_jpashop: 인프런 김영한님의 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션

인프런 김영한님의 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 을 학습한 프로젝트 - HyunDove/inflearn_jpashop

github.com

 

위 H2 Database 설정으로 구현한 프로젝트가 있다.

참고용으로 예제 링크를 첨부한다.


OUTRO

오늘은 In-Memory-Database H2에 대해서 알아봤습니다.

테스트 및 로컬 환경에서 자주 쓰이게 될 것 같아서 작성 하게 되었습니다.

 

그러면 다음 포스팅에서 뵙겠습니다.

위 포스팅 글은 김영한님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발을 참고했습니다.

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 | 김영한 - 인프런

김영한 | 실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니

www.inflearn.com