하이버네이트(Hibernate)는 자바 언어에서 사용하는 ORM(Object-Relational Mapping) 프레임워크로, 관계형 데이터베이스와 자바 객체 간의 매핑을 자동으로 처리해주는 도구입니다. 이를 통해 개발자가 SQL을 직접 작성하지 않고, 자바 객체를 이용해 데이터베이스와 상호작용할 수 있게 도와줍니다.
주요 개념
- ORM(Object-Relational Mapping): 객체 지향 프로그래밍 언어(예: 자바)의 객체와 관계형 데이터베이스의 테이블을 매핑하여, 객체를 데이터베이스에 쉽게 저장하고 불러올 수 있도록 돕는 기술입니다. 즉, 데이터베이스 테이블의 레코드를 자바의 객체로 변환하거나, 자바 객체를 데이터베이스 테이블의 레코드로 변환하는 역할을 합니다.
- JPA(Java Persistence API): 자바에서 ORM을 처리하는 표준 API입니다. 하이버네이트는 JPA의 구현체 중 하나로, JPA의 표준 기능을 따르면서도 자체적인 확장 기능을 추가로 제공합니다.
하이버네이트의 장점
- SQL 자동 생성: 하이버네이트는 데이터베이스와 상호작용하는데 필요한 SQL 쿼리를 자동으로 생성합니다. 따라서 개발자는 SQL을 직접 작성할 필요 없이, 자바 객체를 다루는 것만으로도 데이터베이스 작업을 할 수 있습니다.
- 데이터베이스 독립성: 하이버네이트는 여러 데이터베이스(DBMS)를 지원합니다. 따라서 특정 데이터베이스에 종속되지 않고, DBMS가 변경되어도 코드 수정이 최소화됩니다.
- 캐싱 기능: 하이버네이트는 캐싱을 통해 자주 조회되는 데이터를 메모리에 저장하여 성능을 향상시킵니다. 1차 캐시(세션 범위)와 2차 캐시(세션 팩토리 범위) 두 가지 종류가 있습니다.
- 자동 테이블 생성 및 관리: 하이버네이트는 애플리케이션의 엔티티(자바 객체)에 맞춰 데이터베이스 테이블을 자동으로 생성하거나 업데이트할 수 있습니다.
- 트랜잭션 관리: 데이터베이스 작업에서 트랜잭션을 명시적으로 관리할 수 있으며, 트랜잭션의 원자성을 보장합니다.
기본 구조
하이버네이트를 사용할 때 가장 중요한 개념 중 하나는 Session과 SessionFactory입니다.
- Session: 데이터베이스와의 연결을 담당하는 객체입니다. 하나의 세션은 하나의 데이터베이스 트랜잭션을 처리합니다. 세션은 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
- SessionFactory: 세션을 생성하는 팩토리 역할을 합니다. 애플리케이션이 시작될 때 한 번만 생성되며, 다중 스레드에서 공유 가능합니다.
하이버네이트 사용 예시
- 엔티티 클래스 정의: 자바 객체와 데이터베이스 테이블을 매핑할 엔티티 클래스를 작성합니다.
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
// getter, setter 생략
}
- 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;
}
}
- 데이터베이스 작업 수행:
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 표준을 따르며, 데이터베이스 독립적이고, 성능 최적화 및 트랜잭션 관리 기능을 제공합니다.
세션과 세션 팩토리의 차이점
- SessionFactory의 역할:
- 세션 생성: SessionFactory는 데이터베이스와 상호작용하는 세션을 생성하는 공장(팩토리) 역할을 합니다.
- 다중 스레드에서 공유 가능: SessionFactory는 애플리케이션이 실행될 때 한 번만 생성되며, 여러 스레드에서 안전하게 공유될 수 있습니다.
- 데이터베이스 연결 정보 보유: SessionFactory는 데이터베이스에 대한 설정(예: URL, 사용자명, 비밀번호 등)을 보유하고 있으며, 이를 기반으로 세션을 생성합니다.
- Session의 역할:
- 데이터베이스와의 연결: Session은 실제로 데이터베이스와의 CRUD 작업을 수행하는 객체입니다. 예를 들어, 데이터를 저장하거나, 조회, 업데이트, 삭제하는 작업을 처리합니다.
- 짧은 생명주기: Session은 주로 트랜잭션 단위로 사용되며, 작업이 완료되면 세션을 닫아야 합니다. 일반적으로 하나의 세션은 하나의 트랜잭션을 처리한 후 닫힙니다.
- 세션 저장 X: Session 객체는 SessionFactory가 생성하는 것이며, 생성된 후 사용하고 나면 폐기됩니다. 세션을 따로 저장하거나 관리하는 작업은 하지 않습니다.
세션 팩토리와 세션 사용 흐름
- SessionFactory 생성:
- 애플리케이션 시작 시 SessionFactory는 한 번만 생성됩니다. 이때 데이터베이스 설정 정보는 SessionFactory에 저장됩니다.
- 세션 생성:
- 데이터베이스와 상호작용해야 할 때마다 SessionFactory에서 Session을 생성합니다.
- 세션은 데이터베이스와의 연결을 관리하고, 작업이 끝나면 반드시 닫습니다.
- 세션을 사용한 데이터베이스 작업:
- 세션을 이용해 데이터를 저장하거나 조회할 수 있습니다. 이러한 작업은 주로 트랜잭션 범위 내에서 이루어지며, 세션이 종료되면 데이터베이스와의 연결도 종료됩니다.
요약
- 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 |