1. H2 데이터베이스 설치

https://www.h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2.5 MB jar file size     Supp

www.h2database.com

위 링크에서 OS에 맞는 버전을 설치하면 된다.

 

H2 설치 화면

H2를 실행하려면 H2가 설치되는 디렉토리를 반드시 기억해야 한다! 설치되기 전에 설치되는 디렉토리를 꼭 확인하자!


2. H2 데이터베이스 실행하기

H2의 디렉토리에서 'bin' 으로 이동 후 H2 실행

나는 OS가 Windows 10 이므로, Powershell로 H2가 설치된 디렉토리인 C:\Program Files (x86)\H2 로 이동한 뒤, 'bin' 디렉토리로 이동하여 'h2.bat' 프로그램을 실행하였다. 그러면 H2 데이터베이스가 실행되면서, 아래 그림과 같은 H2 콘솔 화면이 뜨게 된다.

H2 실행한 후, 콘솔 화면


3. H2 데이터베이스 파일 만들기(DB 맨 처음 만들 때에만 하는 과정)

H2 콘솔 화면

H2 데이터베이스를 처음 만들 때에는 반드시 DB 파일을 생성해주어야 한다. [JDBC URL] 항목에 해당 DB 파일이 설치될 경로를 입력해주는 데, 이때 양식은 'jdbc:h2:{DB 파일이 설치될 경로}' 이다.

위 그림에서는 '~/h2_db_testfile' 이라고 지정하여, 홈 디렉토리에 'h2_db_testfile' 이라는 이름으로 H2 데이터베이스 파일을 생성하겠다는 것이다.

 연결을 누르면 콘솔 창이 아래 그림처럼 이동하면서 DB에 연결된다.

H2 DB에 연결된 화면 (H2 콘솔 창)

또한 홈 디렉토리로 이동하면 아래 그림과 같은 지정한 이름으로 파일(.mv 형식)이 생성된 것을 확인할 수 있을 것이다!

생성된 H2 데이터베이스 파일

4. Spring Boot 프로젝트와 H2 데이터베이스 연동시키기 (application.yml 작성)

application.yml 디렉토리 반드시 확인!

 자 이제 H2 데이터베이스 파일도 생성된 것을 확인했으니, 우리가 작성하는 Spring Boot 프로젝트에서 생성한 DB로 연동하는 것을 해보자!

 우선 프로젝트 폴더 내의 [src] - [main] - [resources] 디렉토리 아래에 'application.yml' 파일을 생성해주자!

이때 디폴트로 'application.properties' 라는 파일이 있을 텐데, 프로젝트의 설정 파일은 하나만 존재해야 하므로, 본 포스팅에서는 해당 파일을 삭제하고 'application.yml' 파일로 새로 작성하기로 한다.

application.yml 파일의 내용은 아래와 같다.

spring:
    datasource:
        url: jdbc:h2:tcp://localhost/~/h2_db_testfile;
        username: sa
        password:
        driver-class-name: org.h2.Driver
    
    jpa:
        hibernate:
            ddl-auto: create
        properties:
            hibernate:
                show_sql: true
                format_sql: true
                
logging:
    level:
        org.hibernate.SQL: debug

참고로 위 코드에서 보이는 들여쓰기는 반드시 4칸으로 해야 한다.

위 코드를 하나하나 해석하자면 다음과 같다.

  • spring.datasource : DB Connection 정보
  • spring.jpa.hibernate.ddl-auto
    none : No action is performed. The schema will not be generated.
    create : Create the schema, the data previously present (if there) in the schema is lost
    create-drop : (default) Create the schema with destroying the data previously present(if there). It also drop the database schema when the SessionFactory is closed.
    update : update the schema with the given values.
    validate : validate the schema. It makes no change in the DB.

  • spring.jpa.properties.hibernate.show_sql : 콘솔에 JPA 실행 쿼리 표시할지 여부 지정
  • spring.jpa.properties.hibernate.format_sql : 실행쿼리를 가독성 있게 표현할지 여부 지정
  • logging.level.org.hibernate.SQL : 로깅 레벨을 지정

5. H2 데이터베이스에 잘 연동되었는지 테스트 하는 코드 작성

application.yml 작성을 통한 애플리케이션-DB 간 연동 과정을 마쳤으니, 이제 실제로 애플리케이션의 로직이 DB에 잘 반영되는지 테스트를 해보자!

 

5.1. Entity 클래스 생성 - 'Member

프로젝트의 [src] - [main] - [java] - [프로젝트 아티팩트] 디렉토리 아무 곳에 다음과 같은 'Member' 엔티티 클래스를 생성해주자.

import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Member {

    @Id
    @GeneratedValue
    private Long id;

    private String username;
}

5.2. Repository 클래스 - 'MemberRepository'

프로젝트의 [src] - [main] - [java] - [프로젝트 아티팩트] 디렉토리 아무 곳에 다음과 같은 'MemberRepository' 클래스를 생성해주자.

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

@Repository
public class MemberRepository {

    @PersistenceContext
    private EntityManager em;
	
    // H2 DB에 member 엔티티에 해당하는 데이터 생성
    public Long save(Member member) {
        em.persist(member);
        return member.getId();	// member 가 잘 생성되었는지 확인하기 위한 id 컬럼 조회
    }
	
    // 
    public Member find(Long id) {
        return em.find(Member.class, id); // 해당 id 값을 가지는 레코드 조회
    }
}

5.3. 테스트 코드 작성 - 'MemberRepositoryTest'

프로젝트 내의 [src] - [test] - [java] - [프로젝트 아티팩트] 디렉토리 아무 곳에 다음과 같은 'MemberRepositoryTest' 클래스를 생성해 주자.

import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
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.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;


@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(false)	// H2 DB 상에서 직접 확인하기 위해, 테스트 이후에도 DB를 롤백하지 않겠다.
    public void testMember() throws Exception {
        //given
        Member member = new Member();
        member.setUsername("memberA");

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

        //then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());

    }
}

위와 같은 테스트 코드를 작성한 후, Run 하여 테스트 코드가 정상적으로 작동한다면, 애플리케이션과 H2 DB 간 연동이 잘 되었다는 것을 의미한다.

MemberRepositoryTest 테스트 코드 정상 작동


6. H2 데이터베이스 상에서 쿼리 통한 직접 확인

H2 콘솔 화면 - 생성한 테스트 데이터 조회

H2 콘솔로 DB에 접속하여, 직접 SELECT 쿼리를 날려서 데이터가 제대로 들어갔는지 확인할 수 있다. 

위 그림처럼 테스트 코드에서 추가한 레코드가 존재한다면, 애플리케이션과 DB 간 연동이 되었다는 것을 이제 확신할 수 있을 것이다!

참고로 위 그림은 MEMBER 도메인에 'city', 'street', 'zipcode' 라는 튜플을 추가하고, 'id' 컬럼을 'member_id'로, 'username' 컬럼을 'name'으로 바꾼 것이다. 5.1. 과 똑같은 코드를 작성했다면, 'id', 'username' 컬럼이 나타날 것이다. 

 


참고

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

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/unit/24278

 

학습 페이지

 

www.inflearn.com

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/unit/24279

 

학습 페이지

 

www.inflearn.com

https://vkein.tistory.com/entry/JPA-%EC%84%A4%EC%A0%95h2-%EC%83%98%ED%94%8C-applicationyml

 

JPA 설정(h2) 샘플 (application.yml)

spring: datasource: url: jdbc:h2:tcp://localhost/~/task_agile_test username: sa password: driver-class-name: org.h2.Driver jpa: database-platform: org.hibernate.dialect.H2Dialect open-in-view: false..

vkein.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기