Hibernate에서 SessionFactory와 Session의 차이점은 무엇인가요

kkambbak1·2024년 1월 12일

SessionFactory (org.hibernate.SessionFactory)

도메인 모델을 데이터베이스로 맵핑하는 thread-safe하고 immutable한 표현이다.

org.hibernate.Session 인스턴스의 팩토리

JPA의 EntityManagerFactory와 동등한 명세이며 기본적으로 이 둘은 동일한 SessionFactory 구현에 수렴.

(위 다이어그램을 보면, EntityManagerFactory와 SessionFactory는 인터페이스이고 SessionFactoryImpl이 구현체이다. 두 인터페이스를 SessionFactoryImpl가 구현한다는 뜻)

SessionFactory 하나를 생성하기 위해서는 매우 비싼값을 치러야한다(시스템 자원을 많이 소모한다).  그래서, 주어진 어떤 데이터베이스에 대해 애플리케이션은 오직 하나의 연관된 SessionFactory를 가져야한다.

SessionFactory는 2단계 캐시, 커넥션 풀, 트랜잭션 시스템 통합 등과 같이 Hibernate가 모든 세션에서 사용하는 서비스를 유지 관리한다.

Session (org.hibernate.Session)

세션의 라이프사이클은 논리적 트랜잭션의 시작과 끝에 의해 제한된다. 하지만 긴 논리적 트랜잭션은 여러 데이터베이스 트랜잭션에 걸쳐 있을 수 있다.

세션의 주된 목적은 매핑된 엔티티 클래스들의 인스턴스들에 대한 생성, 판독 및 삭제 동작들을 제공하는 것이다. 하나의 인스턴스는 주어진 오픈 세션에 관하여 다음과 같은 세 가지 상태들 중 하나에 있을 수 있다

  • transient(일시적): 지속적이지 않으며, 세션과 연관되지 않음.
  • persistent(지속성): 현재 세션과 연결되어 있음.
  • detached(분리됨): 이전에는 지속되었지만 현재 세션과 연결되어있지 않음.

객체를 삽입, 갱신, 삭제하는 메소드를 제공
또한 Transaction, Query 및 Criteria에 대한 팩토리 메소드를 제공합니다

싱글 스레드로 동작시켜야하는, 개념적으로 짧은 생명주기를 가진 오브젝트로 모델링된 "작업 단위"이다. 

JPA에서는 Session을 EntityManager라고 이름 짓는다.

뒷 단에서, 하이버네이트 Session은 JDBC java.sql.Connection을 감싸고 org.hibernate.Transaction의 팩토리로 동작한다.

하이버네이트 Session은 일반적으로 애플리케이션 도메인 모델의 "반복가능한 읽기" Persistence context(first level cache)를 유지관리한다.

SessionFactory와 Session

  1. 생성 및 소멸 시점: SessionFactory는 애플리케이션 시작 시에 한 번만 생성되고, 애플리케이션 종료 시에 소멸합니다. 즉, 애플리케이션의 생명 주기와 동일합니다. 반면에 Session은 요청이 시작될 때마다 생성되고, 요청이 끝나면 닫히거나 소멸됩니다.
  2. 리소스: SessionFactory는 설정 정보, 캐싱, 커넥션 풀 등과 같은 무거운 리소스를 가지고 있습니다. 이에 비해 Session은 가벼운 객체로, 데이터베이스 연결과 같은 가벼운 리소스를 가지고 있지 않습니다.
  3. 스레드 안전성: SessionFactory는 스레드에 안전합니다. 여러 스레드에서 동시에 접근해도 문제가 없습니다. 반면에 Session은 스레드에 안전하지 않습니다. 각 스레드는 자체 세션을 가져야 합니다.
  4. 역할: SessionFactory는 Session을 생성하는 역할을 합니다. 반면에 Session은 실제 데이터베이스 연산을 수행합니다.
profile
윤성

0개의 댓글