본문 바로가기
JPA/Setting

JPA와 DB 설정, 동작 확인

by BAYABA 2021. 9. 24.
  1. 이 포스팅은 개인 공부 목적으로 작성한 포스팅입니다
  2. 아래 출처를 참고하여 작성하였습니다.

1. build gradle에 의존성 추가

dependencies {
    //...    
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('com.h2database:h2')
}

  1. spring-boot-starter-data-jpa
  • 스프링 부트용 Spring Data JPA 추상화 라이브러리입니다.
  • 스프링 부트 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해줍니다.
  1. h2
  • 인메모리 관계형 데이터베이스
  • 별도의 설치가 필요 없이 프로젝트 의존성만으로 관리할 수 있습니다.
  • 메모리에서 실행되기 때문에 애플리케이션을 재시작할 때 마다 초기화된다는 점을 이용하여 테스트 용도로 많이 사용됩니다.

2. application.yml 작성

# sample1: h2

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    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

  1. spring.jpa.hibernate.ddl-auto: create
  • 이 옵션은 애플리케이션 실행 시점에 테이블을 drop하고, 다시 생성합니다.
  1. show_sql
  • 이 옵션은 System.out에 하이버네이트 실행 SQL을 남깁니다.
  1. org.hibernate.SQL
  • 이 옵션은 logger를 통해 하이버네이트 실행 SQL을 남깁니다.
  1. yml 파일은 스페이스 2칸으로 계층을 만듭니다.

# sample2: mysql

spring:
  application:
    name: algorithm_quiz_curator
  datasource:
    url: jdbc:mysql://db.park-yh.com:3306/aqc_dev?autoReconnect=true&useSSL=false&serverTimezone=UTC
#    url: jdbc:mysql://db.park-yh.com:3306/aqc?autoReconnect=true&useSSL=false&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: ${ID}
    password: ${PASSWORD}
  jpa:
    properties:
      hibernate:
        ddl-auto: validate
        show_sql: true
        format_sql: true

3. 실제 동작하는지 확인


4-1. 도메인 클래스 생성

//Member.java

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;

}

4-2. Repository 생성

//MemberRepository.java
package jpabook.jpashop;

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Repository
public class MemberRepository {

    //Jpa를 쓰기 때문에 EntityManager가 있어야 합니다.
    //Spring-Boot를 쓰기 때문에, 이 어노테이션이 있으면 SpringBoot Container가 매니저를 주입을 해줍니다.
    //implementation 'spring-boot-starter-data-jpa' 때문에 가능
    @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);
    }
}

4-3. TestCase 생성

//MemberRepositoryTest.java
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 org.springframework.transaction.annotation.Transactional;

import static org.junit.Assert.*;

//JUnit에게 "나 스프링과 관련된 것으로 테스트 할 거야"라고 알려주는 것.
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    //import org.springframework.transaction.annotation.Transactional 사용 권장
    //EntityManager를 통한 모든 데이터 변경은 항상 트랜잭션 안에서 이뤄져야 합니다.
    @Transactional
    public void testMember() throws Exception {

        //given
        Member member = new Member();
        member.setUsername("memberA");

        //when
        final Long savedId = memberRepository.save(member);
        final Member findMember = memberRepository.find(savedId);

        //then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        Assertions.assertThat(findMember).isEqualTo(member);
    }
}

출처

  1. 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
  2. 이동욱, 『스프링 부트와 AWS로 혼자 구현하는 웹 서비스』, 프리렉(2019)
  3. Spring Boot With H2 Database