[Spring] h2 DB 연결하고 JPA 사용하기

skyepodium·2021년 12월 19일
3

H2 DB를 설치형으로 사용하고, 연결해서 JPA를 사용해봅시다.

1. H2 Database

1) 다운로드

https://www.h2database.com/html/main.html

저는 mac을 사용하기 때문에 AllPlatforms로 받습니다.

2) 설치

압축을 해제하면 h2라는 디렉토리가 생성되고
bin 폴더안의 h2.sh라는 스크립트가 있습니다.

먼저 다음 명령어를 통해 권한을 부여합니다.

chmod 755 h2.sh

그리고 실행합니다.

./h2.sh

3) 확인

다음과 같이 웹 콘솔이 실행됩니다.

연결을 누르면 접속됩니다.

4) 저장 위치

데이터의 기본 저장위치는 root 디렉토리이며 test.mv.db 파일로 저장됩니다.

삭제하면 DB의 데이터가 모두 사라지면, 웹 콘솔에 접속하면 새로 파일이 생성됩니다.

2. spring

1) 빈 프로젝트 생성

저는 h2-db라는 gradle 프로젝트를 생성했습니다.

2) 의존성 설치

dependencies에 다음 2개를 넣어주고 refresh 해줍니다.

    // java에서 DB에 붙으려면 JDBC 드라이버가 꼭 있어야합니다. spring-data-jpa에 내장되어 있습니다.
    // 정말 붙었는지 테스트 하기 위해 JPA를 넣어줍니다.
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // DB와 연결하기 위한 클라이언트 입니다.
    runtimeOnly 'com.h2database:h2'

3) application.yml

설정파일을 넣어줍니다.
(그냥 야믈 파일이 보기 편해서 yml로 .properties 상관없음)

중요한것은
테스트를 위해서 ddl-auto옵션을 create로 정했습니다.
create는 JPA가 객체를 보고 있는 테이블도 지우고, 테이블을 자동으로 생성합니다.
테스트 이기 때문에 create로 지정하지만
실제 사용에서는 none으로 합니다.

spring:
  # DB 연결
  datasource:
    # 설치된 H2 DB와 연결 URL
    url: jdbc:h2:tcp://localhost/~/test
    # 접속을 위한 드라이버
    driver-class-name: org.h2.Driver
    # springboot 2.4 부터는 username이 꼭 있어야합니다. 없으면 에러가 발생합니다.
    username: sa
  jpa:
    # JPA가 수행하는 SQL을 볼 수 있다.
    show-sql: true
    # 객체를 보고 자동으로 테이블 생성 여부. 생성 - create, 비생성 - none
    # 테스트이기 때문에 create로 설정하며
    # 실제로는 none 으로 합니다. create이면 기존의 테이블을 전부 밀어버립니다.
    hibernate:
      ddl-auto: create
  # 콘솔 확인 을 위한 always
  output:
    ansi:
      enabled: always
# 파라미터 확인을 위한 trace
logging:
  level:
    org.hibernate.type: trace

여기 까지 했으면 연결까지 완료되었습니다. 그런데 실제로 쿼리을 날려봐야 감이 오니까 JPA로 쿼리도 날려봅시다.

3. JPA

  1. 도메인, 2. repository 만 만들고, 테스트 코드로 검증해봅시다.

1) 도메인

id, name만 넣어주었습니다.

@Entity
public class Member {
    // PK 지정
    @Id
    // 데이터베이스에 따라 자동으로 ID가 지정됩니다. - 기본 세팅
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2) repository

MemberRepository 인터페이스를 만들고

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

SpringDataMemberRepository 인터페이스를 만들어줍니다.

public interface SpringDataMemberRepository extends JpaRepository<Member, Long>, MemberRepository{

    @Override
    Optional<Member> findByName(String name);
}

3) 테스트 코드 작성

@SpringBootTest
class H2DbApplicationTests {

    private final MemberRepository memberRepository;

    // 의존성 주입
    @Autowired
    public H2DbApplicationTests(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Test
    void 회원가입() {
        // 멤버 저장
        Member member = new Member();
        member.setName("skyepodium");
        memberRepository.save(member);

        // 저장한 멤버 아이디로 검색
        Member findMember = memberRepository.findById(member.getId()).get();
        Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
    }
}

4) 확인

테스트 코드도 통과했고

콘솔에서 쿼리로 확인해도 제대로 멤버가 들어갔습니다.

4. 전체코드

https://github.com/skyepodium/h2-jpa

profile
callmeskye

0개의 댓글