JPA와 DB 설정, 동작 확인

yml 설정

JPA와 Hibernate에서 생성하는 SQL들을 로그로 출력.

jpa: hibernate: ddl-auto: create//애플리케이션 실행시점에서 내가 가진 테이블 다 지우고 다시 생성한다.

테스트용 Entity와 Repository 생성 Repository란 Entity를 찾아준다.

스프링이 제공하는 @Repository 애노테이션 사용

JPA를 사용하기 때문에 Entity Manager 있어야한다. @PersistenceContext를 사용하면 스프링 부트에서 자동으로 EntityManager로 등록해서 사용된다.

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

public class Test(){
    @PersistenceContext
    private EntityManager em;
}

EntityManager를 통한 데이터 변경은 모두 트랜잭션 안에서 이뤄져야한다! 그래서 트랜잭션이 있어야 한다!(JPA 기본편에서 강조한 내용이라고 함)

@Transactional 이 Test 위에 있으면 일반적으로 롤백한다! 그러니까 데이터를 저장하는 것을 실행해도 테이블만 생성되고 데이터는 들어가지 않는다! 테스트를 위해서는 데이터 저장이 안되는 것이 맞지만, 데이터가 잘 들어갔는지 확인하고자 한다면 @RollBack(false)로 해주면 된다!

같은 트랜잭션 안에서 객체 생성, 저장한 객체를 비교하면 영속성 컨텍스트가 똑같다.

아래 코드에서 given 절의 member와 memberRepository에 이 member를 저장하고, 이 id에 의해 memberRepository에서 찾은 Member를 findMember라고 하면 member == findMember 는 true를 만족한다!

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.*;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
    @Autowired
    MemberRepository memberRepository;

    @Test
    @Transactional//자바 표준과 스프링에서 제공하는 2가지가 있는지 스프링 종속적 개발하기 때문에 스프링에서 제공하는 걸 쓴다!
    @Rollback(false)
    public void testMember() throws Exception{
        //given
        Member member = new Member();
        member.setUsername("memberA");
        //when
        Long savedId = memberRepository.save(member);
        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);
        System.out.println("findMember == member" +(findMember == member));
    }
}

테스트 시 Tip💡

SQL 파라미터 로그를 남길 수 있다. 단, 실제 운영 환경에서 배포할 땐 성능을 고려해야한다!

외부 라이브러리 사용 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

Last updated