하이버네이트(Hibernate)는 자바 언어에서 사용하는 ORM(Object-Relational Mapping) 프레임워크로, 관계형 데이터베이스와 자바 객체 간의 매핑을 자동으로 처리해주는 도구입니다. 이를 통해 개발자가 SQL을 직접 작성하지 않고, 자바 객체를 이용해 데이터베이스와 상호작용할 수 있게 도와줍니다.

주요 개념

  1. ORM(Object-Relational Mapping): 객체 지향 프로그래밍 언어(예: 자바)의 객체와 관계형 데이터베이스의 테이블을 매핑하여, 객체를 데이터베이스에 쉽게 저장하고 불러올 수 있도록 돕는 기술입니다. 즉, 데이터베이스 테이블의 레코드를 자바의 객체로 변환하거나, 자바 객체를 데이터베이스 테이블의 레코드로 변환하는 역할을 합니다.
  2. JPA(Java Persistence API): 자바에서 ORM을 처리하는 표준 API입니다. 하이버네이트는 JPA의 구현체 중 하나로, JPA의 표준 기능을 따르면서도 자체적인 확장 기능을 추가로 제공합니다.

하이버네이트의 장점

  1. SQL 자동 생성: 하이버네이트는 데이터베이스와 상호작용하는데 필요한 SQL 쿼리를 자동으로 생성합니다. 따라서 개발자는 SQL을 직접 작성할 필요 없이, 자바 객체를 다루는 것만으로도 데이터베이스 작업을 할 수 있습니다.
  2. 데이터베이스 독립성: 하이버네이트는 여러 데이터베이스(DBMS)를 지원합니다. 따라서 특정 데이터베이스에 종속되지 않고, DBMS가 변경되어도 코드 수정이 최소화됩니다.
  3. 캐싱 기능: 하이버네이트는 캐싱을 통해 자주 조회되는 데이터를 메모리에 저장하여 성능을 향상시킵니다. 1차 캐시(세션 범위)와 2차 캐시(세션 팩토리 범위) 두 가지 종류가 있습니다.
  4. 자동 테이블 생성 및 관리: 하이버네이트는 애플리케이션의 엔티티(자바 객체)에 맞춰 데이터베이스 테이블을 자동으로 생성하거나 업데이트할 수 있습니다.
  5. 트랜잭션 관리: 데이터베이스 작업에서 트랜잭션을 명시적으로 관리할 수 있으며, 트랜잭션의 원자성을 보장합니다.

기본 구조

하이버네이트를 사용할 때 가장 중요한 개념 중 하나는 SessionSessionFactory입니다.

  • Session: 데이터베이스와의 연결을 담당하는 객체입니다. 하나의 세션은 하나의 데이터베이스 트랜잭션을 처리합니다. 세션은 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
  • SessionFactory: 세션을 생성하는 팩토리 역할을 합니다. 애플리케이션이 시작될 때 한 번만 생성되며, 다중 스레드에서 공유 가능합니다.

하이버네이트 사용 예시

  1. 엔티티 클래스 정의: 자바 객체와 데이터베이스 테이블을 매핑할 엔티티 클래스를 작성합니다.
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    private Long id;
    private String name;

    // getter, setter 생략
}
  1. SessionFactory 생성: 하이버네이트 설정 파일을 통해 데이터베이스 연결 및 세션 팩토리를 생성합니다.
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
  1. 데이터베이스 작업 수행: Session을 통해 데이터베이스에 데이터를 저장하거나 조회하는 작업을 수행합니다.
import org.hibernate.Session;
import org.hibernate.Transaction;

public class MyApp {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();

        // 데이터 저장
        User user = new User();
        user.setId(1L);
        user.setName("John Doe");
        session.save(user);

        // 트랜잭션 커밋
        transaction.commit();
        session.close();
    }
}

요약

  • 하이버네이트는 자바 객체와 데이터베이스 테이블을 매핑하는 ORM 프레임워크입니다.
  • 데이터베이스 작업을 객체 지향 방식으로 처리할 수 있으며, SQL 쿼리를 직접 작성할 필요가 없습니다.
  • JPA 표준을 따르며, 데이터베이스 독립적이고, 성능 최적화 및 트랜잭션 관리 기능을 제공합니다.

 


세션과 세션 팩토리의 차이점

  1. SessionFactory의 역할:
    • 세션 생성: SessionFactory는 데이터베이스와 상호작용하는 세션을 생성하는 공장(팩토리) 역할을 합니다.
    • 다중 스레드에서 공유 가능: SessionFactory는 애플리케이션이 실행될 때 한 번만 생성되며, 여러 스레드에서 안전하게 공유될 수 있습니다.
    • 데이터베이스 연결 정보 보유: SessionFactory는 데이터베이스에 대한 설정(예: URL, 사용자명, 비밀번호 등)을 보유하고 있으며, 이를 기반으로 세션을 생성합니다.
  2. Session의 역할:
    • 데이터베이스와의 연결: Session은 실제로 데이터베이스와의 CRUD 작업을 수행하는 객체입니다. 예를 들어, 데이터를 저장하거나, 조회, 업데이트, 삭제하는 작업을 처리합니다.
    • 짧은 생명주기: Session은 주로 트랜잭션 단위로 사용되며, 작업이 완료되면 세션을 닫아야 합니다. 일반적으로 하나의 세션은 하나의 트랜잭션을 처리한 후 닫힙니다.
    • 세션 저장 X: Session 객체는 SessionFactory가 생성하는 것이며, 생성된 후 사용하고 나면 폐기됩니다. 세션을 따로 저장하거나 관리하는 작업은 하지 않습니다.

세션 팩토리와 세션 사용 흐름

  1. SessionFactory 생성:
    • 애플리케이션 시작 시 SessionFactory는 한 번만 생성됩니다. 이때 데이터베이스 설정 정보는 SessionFactory에 저장됩니다.
  2. 세션 생성:
    • 데이터베이스와 상호작용해야 할 때마다 SessionFactory에서 Session을 생성합니다.
    • 세션은 데이터베이스와의 연결을 관리하고, 작업이 끝나면 반드시 닫습니다.
  3. 세션을 사용한 데이터베이스 작업:
    • 세션을 이용해 데이터를 저장하거나 조회할 수 있습니다. 이러한 작업은 주로 트랜잭션 범위 내에서 이루어지며, 세션이 종료되면 데이터베이스와의 연결도 종료됩니다.

요약

  • SessionFactory: 데이터베이스와의 연결 정보를 관리하며, 세션을 생성하는 역할을 합니다. 다중 스레드에서 공유될 수 있고, 애플리케이션이 실행되는 동안 한 번만 생성됩니다.
  • Session: 데이터베이스와의 실제 상호작용을 처리하는 객체로, 하나의 세션은 하나의 트랜잭션을 처리합니다. 세션은 짧은 생명주기를 가지고 있으며, 사용 후에는 반드시 닫아야 합니다.
  • 세션 저장: 세션을 따로 저장하지 않으며, 필요할 때 SessionFactory에서 세션을 생성하고 사용 후 닫습니다.

'JPA' 카테고리의 다른 글

Page와 Slice & Sort와 Limit  (0) 2024.11.05
파싱(Parsing), 파생(Derived), 선언된 쿼리  (5) 2024.11.05
N+1 문제 해결방법  (0) 2024.09.25
JPQL과 QueryDSL  (3) 2024.09.24
더티 체킹(Dirty Checking) ( 변경 감지 )  (1) 2024.09.23

+ Recent posts