Java 기반의 DB액세스 기술(JPA)

hun·2023년 11월 29일

1. JPA

  • 1-1 JPA란?

    JPA(Java Persistence API)는 자바에서 관계형 데이터베이스와의 상호작용을 간소화하는 자바 진영의 ORM(Object-Relational Mapping) 기술입니다. ORM은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 자동으로 처리하는 기술을 말합니다.

    객체-관계 매핑 (ORM): JPA는 자바 객체와 데이터베이스 테이블 간의 매핑을 지원합니다. 개발자는 객체 지향적인 방식으로 데이터를 다룰 수 있으며, JPA가 해당 객체와 데이터베이스 레코드 간의 매핑을 처리합니다.

  • 1-2 Persistence(영속성)란?

  1. "영속성"은 데이터의 지속성이나 영구성을 의미합니다. 객체의 상태가 프로그램의 실행이나 특정 작업을 넘어서 지속되는 것을 말합니다.

  2. JPA에서는 영속성이 주로 엔티티 객체(Entity Object)의 상태를 지속적으로 관리하는 개념으로 사용됩니다. 엔티티의 상태가 데이터베이스에 저장되어 지속되는 것을 말합니다.

  • 1-3 Persistence Context(영속성 컨텍스트)란?

  1. "영속성 컨텍스트"는 JPA에서 엔티티의 상태를 관리하는 환경을 나타냅니다.
  2. 영속성 컨텍스트는 엔티티의 생명주기를 관리하며, 엔티티를 데이터베이스에 저장하거나 조회하고, 엔티티의 변경을 감지하며, 트랜잭션 범위 내에서 엔티티를 캐싱하는 등의 역할을 수행합니다.
  3. 영속성 컨텍스트는 주로 EntityManager를 통해 사용되며, 트랜잭션 범위 내에서 엔티티의 상태를 추적하고 관리합니다.
  • 1-4 1차, 2차 캐시란?

  1. 1차 캐시는 영속성 컨텍스트 내부에서 관리되는 엔티티 객체의 캐시를 말합니다.
  2. 영속성 컨텍스트가 엔티티를 조회하거나, 데이터베이스에서 가져오는 순간에 해당 엔티티는 1차 캐시에 저장됩니다.
  3. 같은 엔티티에 대한 다수의 조회가 발생할 때 데이터베이스에 여러 번 접근하지 않고 캐시에서 엔티티를 가져와 성능을 향상시킵니다.

간단한 예시를 통해 설명하면, 한 번 조회한 엔티티는 영속성 컨텍스트의 1차 캐시에 저장되며, 이후 동일한 엔티티를 조회할 때는 1차 캐시에서 가져와 데이터베이스에 다시 접근하지 않습니다. 이로써 성능이 향상되고 데이터베이스 부하가 감소합니다.

중요한 점은 1차 캐시는 트랜잭션 범위 내에서만 유효하며, 트랜잭션이 종료될 때 영속성 컨텍스트의 1차 캐시도 초기화됩니다.

  1. 2차 캐시는 주로 영속성 컨텍스트 외부에 위치하며, 여러 영속성 컨텍스트 간에 공유됩니다.
  • 1-5 EntityManager란?

  1. EntityManager는 위에 설명한 영속성 컨텍스트를 두어 엔티티를 관리하게 된다

엔티티 생명 주기(4가지 상태)

  1. 비영속(new/transient)
    영속성 컨텍스트와 연관이 없는 상태
  1. 영속(managed)
    영속성 컨텍스트에서 관리 중인 상태
  1. 준영속(detached)
    영속성 컨텍스트에 저장되어 있었으나 분리된 상태
  1. 삭제(remove)
    영속성 컨텍스트에서 완전히 삭제된 상태

@PersistenceContext
private final EntityManager em;
  1. @PersistenceContext 란?
    EntityManager를 빈으로 주입할 때 사용하는 어노테이션입니다.
    스프링에서는 영속성 관리를 위해 EntityManager가 존재합니다.
    그래서 스프링 컨테이너가 시작될 때 EntityManager를 만들어서 빈으로 등록해둡니다.
    이 때 스프링이 만들어둔 EntityManager를 주입받을 때 사용합니다.
    @PersistenceContext로 지정된 프로퍼티에 아래 두 가지 중 한 가지로 EntityManager를 주입해줍니다.
    EntityManagerFactory에서 새로운 EntityManager를 생성하거나
    Transaction에 의해 기존에 생성된 EntityManager를 반환해줍니다.
  1. @PersistenceContext를 사용해야 하는 이유
    EntityManager를 사용할 때 주의해야 할 점은 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생하여 쓰레드 간에는 EntityManager를 공유해서는 안됩니다.
    일반적으로 스프링은 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유합니다.
    그러나 @PersistenceContext으로 EntityManager를 주입받아도 동시성 문제가 발생하지 않습니다.
    동시성 문제가 발생하지 않는 이유는
    스프링 컨테이너가 초기화되면서 @PersistenceContext으로 주입받은 EntityManager를 Proxy로 감쌉니다.
    그리고 EntityManager 호출 시 마다 Proxy를 통해 EntityManager를 생성하여 Thread-Safe를 보장합니다.
  1. 비영속(new/transient)
  • 엔티티 객체를 생성하긴 했지만 아직 순수한 객체 상태이므로 영속성 컨텍스트나 DB와는 전혀 관련이 없다.
//객체만 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
  1. 영속(managed)
  • 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장이 되어 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 한다.
//객체를 영속성 컨텍스트에 저장
em.persist(member);
  1. 준영속(detached)
  • 영속성 컨텍스트에서 관리하지 않겠다하면 준영속 상태가 된다. em.close(), em.clear()를 호출해서 영속성 컨텍스트를 초기화 해도 엔티티는 준영속 상태가 된다.
//영속성 컨텍스트에서 분리 객체
em.detach(member);
  1. 삭제(remove)
  • 엔티티를 영속성 컨텍스트와 DB에서 삭제한다.
em.remove(member);

2. Spring Data JPA

  • 2-1 Spring Data JPA란?

    DB액세스 개발할 때 반복 되는 CRUD(Create, Read, Update, Delete)처리하기 위해 인터페이스를 제공한다.
    그래서 개발할 때 인터페이스만 작성하면 Spring Data JPA가 구현 객체를 동적으로 생성해서 주입해준다.
    따라서 구현 클래스 없이 인터페이스만 작성해도 개발 가능하다.
public interface MemberRepository extends JpaRepository<Member, Long>{
}

3. Hibernate

  • 3-1 Hibernate란?

    Jpa는 ORM을 사용하기 위한 인터페이스를 모아둔 것이며, JPA를 사용하기 위해 구현한 주로 Hibernate같은 ORM 프레임워크를 사용한다.
    업로드중..
profile
짧더라도 확실한 기록

0개의 댓글