• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[Hibernate에 대해서 제대로 알자!] 2탄 Hibernate의 구조를 알자!

20 Mar 2019

Reading time ~2 minutes

제 블로그의 모든 글은 IMHO로 쓴 것입니다. 잘못된 부분이 있으면 덧글을 통해서 소통을 하면 더 좋은 글로 발전이 될 수 있을 것 같습니다. 그렇지만 소통을 할 때 서로의 감정을 존중하는 선에서 해주셨으면 좋겠습니다. 감사합니다:) — 이 글은 시리즈 물입니다. [1탄 ORM이란? JPA란? Hibernate란?] https://joosjuliet.github.io/orm_jpa_hibernate/
[2탄 Hibernate의 구조를 알자!] https://joosjuliet.github.io/hibernate_structure/
[3탄 Hibernate가 어떻게 obejct를 만드는가?] https://joosjuliet.github.io/hibernate_first_step/

1. Hibernate는?

  • ORM의 tool
  • 프로그래밍 언어 내에서 사용될 수있는 “virtual object database”가 생성

  • Hibernate는 persistence framework
    • Java 환경에서 database로 data를 persist하는데 사용된다.
  • Persistence은 영구적인 매체에 데이터를 저장하고, 데이터를 생성 한 애플리케이션이 종료 된 후에도 언제든지 데이터를 검색하는 프로세스
    • db가 connection이 연결이 되어 있지 않아도 db를 가지고 일처리를 할 수 있다.]

2. Hibernate Architecture

Hibernate의 최소 구조

diagram_of_hibernate_architecture

크게 4가지 layers로 되어있다.

  • Java application layer
  • Hibernate framework layer
  • Backhand api layer
  • Database layer

하이버네이트 framework layer

  • 데이터베이스와 응용 프로그램 사이에 레이어를 만든다.
  • 데이터베이스 연결 문자열, 엔터티 클래스, 매핑 등의 구성 정보를 로드
  • 애플리케이션과 데이터베이스 간의 데이터를 동기화하는 영속 객체를 생성

Hibernate 중점 구조

high_level_architecture_of_hibernate

Hibernate 구조의 elements들

  • Hibernate는 데이터를 데이터베이스에 유지하기 위해 엔티티 클래스 (데이터베이스 테이블과 매핑 된 Java 클래스)의 인스턴스를 생성
  • 이 객체는 세션과 아직 연관되지 않았거나 아직 데이터베이스에 유지되지 않았으므로 Transient 객체라고합니다.
  • 객체를 데이터베이스에 유지하려면 SessionFactory 인터페이스의 인스턴스가 만들어집니다.

  • SessionFactory는 Factory 디자인 패턴을 구현하는 싱글 톤 인스턴스입니다.
  • SessionFactory는 hibernate.cfg.xml 파일 (Hibernate 구성 파일, 다음 섹션에서 더 자세하게 설명 됨)을 로드한다.
  • TransactionFactory와 ConnectionProvider의 도움을 받아 데이터베이스의 모든 구성 설정을 구현한다.
  • Hibernate의 각 데이터베이스 연결은 Session 인터페이스의 인스턴스를 생성함으로써 생성된다.
  • 세션은 데이터베이스와의 단일 연결을 나타낸다.
  • 세션 객체는 SessionFactory 객체로부터 생성된다.
  • 또한 Hibernate는 기본 JDBC 또는 JTA 트랜잭션으로부터 응용 프로그램을 추상화하는 내장 트랜잭션 API를 제공합니다.
  • 각 트랜잭션은 단일 원자 단위의 작업 단위를 나타냅니다. 하나의 세션은 여러 트랜잭션을 채울 수 있다.

elements 하나씩 보기

많은 object로 구성되어 있다. 대표적으로는

  • SessionFactory
    • SessionFactory는 ConnectionProvider의 세션 및 클라이언트 팩토리
    • 데이터의 2 차 레벨 캐시 (선택 사항)를 보유
    • org.hibernate.SessionFactory 인터페이스는 Session 객체를 얻기위한 팩토리 메소드를 제공
  • Session
    • 세션 객체는 응용 프로그램과 데이터베이스에 저장된 데이터 간의 인터페이스를 제공
    • 수명이 짧은 객체이며 JDBC 연결을 래핑합니다. 트랜잭션, 쿼리 및 기준의 팩토리
    • 데이터의 1 차 수준 캐시 (필수)를 보유합니다.
    • org.hibernate.Session 인터페이스는 객체를 삽입, 갱신, 삭제하는 메소드를 제공
    • 또한 Transaction, Query 및 Criteria에 대한 팩토리 메소드를 제공합니다.
  • Transaction
    • 트랜잭션 오브젝트는 원자 단위의 작업 단위를 지정합니다.
  • ConnectionProvider
    • JDBC connection을 만드는 공장이다.
    • DriverManager or DataSource의 application을 추상화한다.
  • TransactionFactory
  • JAVA API
    • JDBC (Java Database Connectivity)
    • JTA (Java Transaction API)
    • JNDI (Java Naming Directory Interface)

session에서 하는 일을 repository가 알아서 해주는 것이다.

  • 한건 조회시 기본으로 되는데 findall 을 하면 lazy가 일어나서 n+1문제가 일어나서 해결책 -> 최신 스팩을 사용하면 entitygraph라는 anotate사용하면 join으로 가져올 수 잇게 된다. 그 전이면 query jpql을 사용해서 fetch라는 쿼리를 날리거나

사진 출처 : https://viralpatel.net/blogs/introduction-to-hibernate-framework-architecture/
참고:
https://viralpatel.net/blogs/introduction-to-hibernate-framework-architecture/



SpringJavaJPA글또2기시리즈물 Share Tweet +1