[SpringBoot] H2 데이터베이스 연동해보기
2023. 3. 30. 18:07
반응형
H2 데이터베이스
개발이나 테스트 용으로 주로 사용되는 가벼운 DB, 데이터베이스 사용자 UI를 제공한다.
H2 데이터베이스 다운로드
2. 최초 연결
JDBC URL에 로컬 데이터베이스 파일이 생성됨 (~/test)
최초 연결 후 데이터베이스 파일 생성에 성공했으면 JDBC URL을 다음과 같은 TCP 형식으로 작성하여 접속 가능하다.
데이터베이스 연동
데이터베이스 연동을 위한 yml 작성, application.properties 대신 yml파일을 사용
application.yml 작성
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/test
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create #엔티티 정보를 지우고 다시 생성
properties:
hibernate:
#show_sql: true #System.out에 출력
format_sql: true
logging:
level:
org.hibernate.SQL: debug #하이버네이트가 생성하는 SQL 콘솔로깅
org.hibernate.type: trace #쿼리 파라미터 로그 남기기
- datasource
- url : 커넥션 경로
- username, password : 커넥션할 유저
- driver-class-name : 커넥션 시 사용할 드라이버. h2 데이터베이스를 사용하므로 org.h2.Driver 사용
- jpa
- hibernate : 하이버네이트 ORM에 대한 옵션 지정
- ddl-auto : 작성한 모델 엔티티 테이블을 애플리케이션 실행 시점에 Drop하고 다시 생성하는 옵션
- ddl-auto : 작성한 모델 엔티티 테이블을 애플리케이션 실행 시점에 Drop하고 다시 생성하는 옵션
- properties :
- hibernate :
- show_sql : System.out을 통해 로그 출력
- format_sql : SQL을 예쁘게 보여준다.
- hibernate :
- hibernate : 하이버네이트 ORM에 대한 옵션 지정
- logging
- level : 로그의 수준(debug, warn, error 등) 에 따른 로깅 옵션 지정
- org.hibernate.SQL : 하이버네이트가 생성하는 SQL을 콘솔로 로깅
- org.hibernate.type : SQL 쿼리의 파라미터(?로 표시됨) 에 대해서 로깅을 남기기 위함
- level : 로그의 수준(debug, warn, error 등) 에 따른 로깅 옵션 지정
코드 작성
1. 엔티티 모델 작성
package jpabook.jpashop;
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;
}
- @Entity 어노테이션은 이것은 데이터베이스 엔티티 모델임을 알려주어, 스프링은 어노테이션에 따라 자동으로 의존성을 설정하게 된다.
2. Repository 작성
package jpabook.jpashop;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@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);
}
}
- Repository는 DB Entity에 접근하여 CRUD 등 자원의 접근을 위한 인터페이스
- EntityManager은 영속 컨텍스트에 접근하여 엔티티에 대한 DB 작업을 제공한다.
- @PersistenceContext는 EntityManager를 빈으로 주입시키는 어노테이션
3. 테스트 코드 작성
package jpabook.jpashop;
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 javax.transaction.Transactional;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
//Transactional이 @Test와 함께 있으면 롤백하게 됨, 이걸 하기 싫으면 롤백 어노테이션 설정
@Test
@Transactional
@Rollback(false)
public void testMember() throws Exception {
//given
Member member = new Member();
member.setUsername(("memberA"));
//when
Long saveId = memberRepository.save(member);
Member findMember = memberRepository.find(saveId);
//then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member);
//영속성 컨텍스트에서 엔티티가 관리되고 있다. ID가 같으면 같은 놈으로 인식
System.out.println("equals?" + (findMember == member));
}
}
- Repository에서 Cmd + Shift + T로 테스트 코드를 작성할 수 있음
- 테스트 코드를 작성하면 작성한 시나리오를 만족시키는가, 혹은 예외가 발생하는가에 대해서 테스트 할 수 있다.
- 테스트 코드는 아직 잘 모른다. 나중에 한번 파봐야겠다.
4. 테스트 코드 실행
- 테스트 코드를 실행하면 다음과 같이 유닛 테스트에 대한 내용들을 확인할 수 있다.
- 시나리오 및 예외를 모두 통과했음을 확인할 수 있다.
DB를 확인해보니 Member 테이블이 생성되어 있고, 데이터 하나가 Insert된 것을 확인할 수 있다.
해당 포스팅은 본 강의 수강을 따라가면서 작성합니다.
반응형
'Backend > Spring' 카테고리의 다른 글
[Spring Boot/JPA] 영속성 컨텍스트와 준영속 컨텍스트 (0) | 2023.05.09 |
---|---|
[SpringBoot] Repository/Service/Controller 계층 개발 (0) | 2023.05.09 |
[SpringBoot] Repository와 EntityManager 의존성 주입 (0) | 2023.05.02 |
[SpringBoot] Entity 클래스 개발하기 (0) | 2023.04.06 |
[SpringBoot] 프로젝트 환경설정 및 구조 알아보기 (0) | 2023.03.30 |