ORM & JPA

Woozy9ucci·2023년 12월 14일
0

ORM (Object-Relational-Mapping)

  • 프로그램상의 객체와 RDB 간 Mapping을 담당
  • RDB 테이블을 객체지향적으로 사용 할 수 있게 함

JDBC, Hibernate, JPA, SpringDataJpa

  • JDBC (Java Database Connectivity)
    • Java 애플리케이션에서 DB에 접근하여 각종 SQL을 사용할 수 있도록 해주는 라이브러리
    • JDBC API (인터페이스) -> JDBC Driver(구현체들)
  • JPA (Java Persistence API)
    • JDBC API 를 내부적으로 사용하는 인터페이스
    • SQL을 직접 사용하기보다 객체지향적으로 DB를 다룰 수 있도록 해줌
  • Hibernate
    • JPA의 구현체 중 하나, 여러 구현체 중 성숙도가 높아 가장 많이 쓰임
  • SpringDataJpa
    • JPA를 더욱 쓰기 편하게 만들어주는 라이브러리
    • JPA의 EntityManager를 한 단계 더 추상화 한 Repository 인터페이스를 제공

JPA (Entity, PersistenceContext, EntityManager)

  • Entity of JPA

    • 테이블과 맵핑되는 Java 객체 (Entity의 인스턴스는 테이블의 한 행과 맵핑 됨)
    • 몇몇 어노테이션을 지정함으로써 JPA에서 관리하는 객체로 작동
  • PersistenceContext of JPA

    • 애플리케이션 내 변수로 데이터를 저장하고 관리할 때 애플리케이션이 종료되면 데이터는 모두 휘발('영속성'이 없다) / 이를 영속성 컨텍스트에 두어 '영속성'을 부여할 수 있다.
      (아직 DB에 저장 된 것은 아니지만 휘발 되지 않는 직전의 상태랄까)

    • JPA는 Entity가 영속성 컨텍스트에 포함되어 있는지 여부에 따라 영속성을 부여할 지 말지를 결정

    • 다음과 같은 역할들을 수행

      • Entity 상태 추적 : (Transient(new), Managed, Detached, Removed등)을 통해 트랜잭션 종료 시 어떤 Query를 날릴 지 결정
        (트랜잭션이 끝나는 시점에 Managed, Removed 상태의 Entity들의 변경사항이 DB에 반영)

      • 캐싱(Cahcing) : 영속성 컨텍스트 내 Entity를 Map형태로 임시 저장하여 동일한 Entity 조회 시 DB까지 가지 않고 해당Entity를 조회 가능하도록 함

      • 지연로딩(Lazy Loading) 및 즉시로딩(Eager Loading) : 지연 로딩은 프록시 객체를 활용하여 연관된 Entity가 실제 필요한(프로퍼티가 호출된) 시점에 DB에서 로드할 수 있도록 함

      • 트랜잭션(Transaction)을 통한 쓰기지연 : Entity를 수정한다고 바로 변경하지 않고 쓰기지연 저장소에 Query를 저장 해 두다가 최종적으로 트랜잭션이 종료되는 시점에 flush & commit

      • Dirty Checking : Entity의 변경 사항을 추적하여 어떤 쿼리를 보내야하는 지 판단하는 과정(Managed 상태에서만 수행 됨)

  • EntityManager of JPA

    • 위의 영속성 Context를 두어 Entity를 관리하는 주체

영속성 컨텍스트 참고: https://dev-monkey-dugi.tistory.com/72#1.%20JPA%20%EC%98%81%EC%86%8D%EC%84%B1%20%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%97%90%20%EA%B4%80%ED%95%98%EC%97%AC

0개의 댓글