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가 설치되는 디렉토리를 반드시 기억해야 한다! 설치되기 전에 설치되는 디렉토리를 꼭 확인하자!
2. H2 데이터베이스 실행하기

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

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

H2 데이터베이스를 처음 만들 때에는 반드시 DB 파일을 생성해주어야 한다. [JDBC URL] 항목에 해당 DB 파일이 설치될 경로를 입력해주는 데, 이때 양식은 'jdbc:h2:{DB 파일이 설치될 경로}' 이다.
위 그림에서는 '~/h2_db_testfile' 이라고 지정하여, 홈 디렉토리에 'h2_db_testfile' 이라는 이름으로 H2 데이터베이스 파일을 생성하겠다는 것이다.
연결을 누르면 콘솔 창이 아래 그림처럼 이동하면서 DB에 연결된다.

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

4. Spring Boot 프로젝트와 H2 데이터베이스 연동시키기 (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 간 연동이 잘 되었다는 것을 의미한다.

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

H2 콘솔로 DB에 접속하여, 직접 SELECT 쿼리를 날려서 데이터가 제대로 들어갔는지 확인할 수 있다.
위 그림처럼 테스트 코드에서 추가한 레코드가 존재한다면, 애플리케이션과 DB 간 연동이 되었다는 것을 이제 확신할 수 있을 것이다!
참고로 위 그림은 MEMBER 도메인에 'city', 'street', 'zipcode' 라는 튜플을 추가하고, 'id' 컬럼을 'member_id'로, 'username' 컬럼을 'name'으로 바꾼 것이다. 5.1. 과 똑같은 코드를 작성했다면, 'id', 'username' 컬럼이 나타날 것이다.
참고
인프런 - 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 (김영한 님 강의)
학습 페이지
www.inflearn.com
학습 페이지
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
'Java' 카테고리의 다른 글
[Java] JVM 실행 옵션 (3) - Advanced Runtime Options (0) | 2022.11.28 |
---|---|
[Java] Spring 프레임워크에서의 MVC 패턴과 레이어드 아키텍처 (0) | 2022.11.03 |
[Java] JVM 실행 옵션 (2) - Non-Standard Options (1) | 2022.10.04 |
[Java] JVM 실행 옵션 (1) - Standard Options (1) | 2022.09.30 |
[JAVA] Java의 클래스 로딩 (0) | 2022.07.19 |
최근댓글