[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하고 다시 생성하는 옵션

    • properties :
      • hibernate :
        • show_sql : System.out을 통해 로그 출력
        • format_sql : SQL을 예쁘게 보여준다.

  • logging
    • level : 로그의 수준(debug, warn, error 등) 에 따른 로깅 옵션 지정
      • org.hibernate.SQL : 하이버네이트가 생성하는 SQL을 콘솔로 로깅
      • org.hibernate.type : SQL 쿼리의 파라미터(?로 표시됨) 에 대해서 로깅을 남기기 위함 

 

 

 


코드 작성

 

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된 것을 확인할 수 있다.

 

 

 

 

 

 

 


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

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강

www.inflearn.com

 

해당 포스팅은 본 강의 수강을 따라가면서 작성합니다.

반응형

BELATED ARTICLES

more