H2 Database란?
💡 Java로 작성된 관계형 데이터베이스 관리 시스템 (RDBMS)이다.
데이터가 시스템 메모리에 저장되어, 서버를 종료하거나, 재시작하면
해당 데이터가 삭제되는 Database이다.
특징
- Spring Boot가 지원하는 인 메모리 데이터베이스이다.
- 매우 빠른 속도를 지원하는 오픈 소스이다.
- 2MB jar 파일 크기로, 용량이 매우 가볍다.
- 주로 로컬 및 테스트 환경에서 쓰인다.
💡 위 특징대로 빠른 속도를 지원하고, 브라우저 기반 콘솔이기에 접근성도 좋다.
개발 중 테스트 데이터들로, 로컬 메모리에서 테스트하기 적합하다.
H2 Database 사용법
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 설정만으로도 테스트가 가능한 방법이 있다.
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
'DataBase' 카테고리의 다른 글
[H2DB] H2 설치 후 Database creation 오류 해결 방법 (0) | 2024.04.10 |
---|