matzip JPA

@VERO
Created Date · 2023년 05월 30일 10:05
Last Updated Date · 2023년 05월 30일 10:05

Spring Data JPA

// 그냥 JPA만 쓸 경우
public class MemberRepository {
    @PersistenceContext
    private final EntityManager em;

    // 생성자
    ...

    public Member save(Member member) {
        em.persist(member);
    }
}

// Spring Data Jpa
public interface MemberRepository extends JpaRepository<Member, Long> {
    Member save(Member member);
}

Entity 생성하기

보통은 도메인과 엔티티를 일치시키는 편이다.

@Entity 어노테이션을 사용하여 도메인 객체를 엔티티로 만든다.

영속성 컨텍스트

엔티티를 영구히 저장할 수 있는 환경. EntityManager 를 통해 관리되는데, 우리는 Spring Data JPA 를 사용하므로 EntityManager를 직접 사용할 필요는 없고, JpaRepository 구현체 내부에서 자동으로 사용된다.

1차 캐시

JpaRepository 를 통해 엔티티를 save 하면 영속성 컨텍스트에 엔티티가 담기게 된다. 엔티티를 조회할 때 영속성 컨텍스트를 통해 꺼내오게 되는데, 이때 객체의 동일성 을 보장해줄 수 있다.

Long id = memberRepository.save(오찌).getId();

Member 오찌1 = memberRepository.findById(id).get();
Member 오찌2 = memberRepository.findById(id).get();

오찌1 == 오찌2

영속성 컨텍스트는 조회 시 영속성 컨텍스트에 있는 데이터를 반환해주기 때문에 다른 변수에 담겨있지만 '주소값' 까지 동일한 객체이다.

영속성 컨텍스트는 기본적으로 트랜잭션 범위에서 작동한다. 즉, 다른 트랜잭션에서 조회하게 되면 다른 객체가 된다.

JpaRepository

save, findById, findAll, delete, deleteById 메서드들을 기본으로 제공한다.