[Java] Spring Boot에서 H2 데이터베이스 설치 및 테스트 작동 확인하기
1. H2 데이터베이스 설치
https://www.h2database.com/html/main.html
위 링크에서 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 - 웹 애플리케이션 개발 (김영한 님 강의)
https://vkein.tistory.com/entry/JPA-%EC%84%A4%EC%A0%95h2-%EC%83%98%ED%94%8C-applicationyml