# JPA와 DB 설정, 동작 확인

yml 설정

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

jpa:\
&#x20; hibernate:\
&#x20;    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'


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heunnajo.gitbook.io/jpa/1.-1/jpa-db.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
