Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240723 Hibernate 본문

개발Article

[TIL]20240723 Hibernate

최밤빵 2024. 7. 23. 23:38

Java에서 가장 널리 사용되는 ORM(Object-Relational Mapping) 프레임워크 중 하나인 Hibernate! Hibernate는 데이터베이스와 객체 지향 프로그래밍 간의 불일치를 해결해주는 강력한 도구로, Hibernate의 기본 개념과 장점, 동작 방식, 그리고 사용 시 주의할 점들을 정리해봤다.

🤓Hibernate에 대한 이해와 활용

▶Hibernate란 ?

Hibernate는 Java 기반의 ORM 프레임워크로, 데이터베이스의 테이블과 Java 객체 간의 매핑을 자동으로 처리해주는 도구이다. Hibernate는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있게 해주며, JPA(Java Persistence API)의 표준 구현체 중 하나이다. 이를 통해 개발자는 데이터베이스에 독립적인 객체 지향 프로그래밍을 구현할 수 있다.

ORM(Object-Relational Mapping) 프레임워크: ORM은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 자동으로 처리하는 기술을 말한다. Hibernate는 가장 널리 사용되는 Java ORM 프레임워크로, 데이터베이스 테이블과 Java 객체 간의 변환을 자동으로 수행한다.

 

▶ Hibernate의 주요 특징과 장점

Hibernate는 다른 ORM 프레임워크와 차별화되는 여러 가지 특징과 장점을 가지고 있다:

 

데이터베이스 독립성:

Hibernate는 다양한 데이터베이스를 지원하며, SQL Dialect를 통해 데이터베이스에 맞는 SQL을 자동으로 생성한다. 이를 통해 특정 데이터베이스에 종속되지 않고 코드의 이식성을 높일 수 있다.

자동 CRUD 처리:

Hibernate는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 자동으로 처리하는 기능을 제공한다. 간단한 메서드 호출만으로 데이터베이스에서 데이터를 조회하거나 저장할 수 있다.

HQL(Hibernate Query Language) 제공:

Hibernate는 객체 지향 쿼리 언어인 HQL을 제공하여, SQL과 유사하지만 객체 모델을 사용하는 쿼리를 작성할 수 있게 해준다. 더 직관적이고 이해하기 쉬운 쿼리를 작성할 수 있다.

캐싱 메커니즘:

Hibernate는 1차 캐시와 2차 캐시를 지원하여, 데이터베이스 접근을 최소화하고 성능을 향상시킬 수 있다. 1차 캐시는 Session 범위 내에서 유지되며, 2차 캐시는 SessionFactory 범위에서 사용할 수 있다.

지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading):

Hibernate는 엔터티를 로딩할 때 지연 로딩과 즉시 로딩을 지원하여 성능 최적화를 도모할 수 있다. 필요한 경우에만 데이터를 로딩하여 메모리 사용량과 성능을 최적화할 수 있다.

트랜잭션 관리:

Hibernate는 데이터베이스 트랜잭션을 쉽게 관리할 수 있도록 도와준다. @Transactional 어노테이션을 통해 선언적으로 트랜잭션을 관리할 수 있다.

 

▶ Hibernate의 동작 방식

Hibernate는 내부적으로 다양한 기능을 제공하여 객체와 데이터베이스 간의 매핑을 수행한다. 다음은 Hibernate의 기본적인 동작 방식이다:

Configuration:

Hibernate는 hibernate.cfg.xml 또는 application.properties 파일을 통해 데이터베이스와 관련된 설정을 구성한다. 데이터베이스 URL, 사용자 이름, 비밀번호, Dialect 등의 정보가 포함된다.

SessionFactory:

SessionFactory는 Hibernate의 핵심 인터페이스로, 데이터베이스와의 연결을 설정하고 Session 객체를 생성하는 데 사용된다. 애플리케이션이 시작될 때 한 번만 생성되며, 데이터베이스와의 상호작용을 위한 팩토리 역할을 한다.

Session:

Session은 Hibernate의 인터페이스로, 데이터베이스와의 실제 연결을 나타내며, CRUD 작업을 수행하는 데 사용된다. Session 객체는 SessionFactory를 통해 생성되며, 데이터베이스 트랜잭션을 관리한다.

Transaction:

Hibernate는 데이터베이스 트랜잭션을 관리하기 위해 Transaction 객체를 사용한다. 트랜잭션은 데이터베이스의 일관성을 유지하기 위해 중요하며, beginTransaction(), commit(), rollback() 등의 메서드를 통해 관리된다.

Query:

Hibernate는 HQL 또는 Criteria API를 사용하여 데이터베이스 쿼리를 실행한다. HQL은 객체 지향 쿼리 언어로, SQL과 유사하지만 객체와 속성으로 쿼리를 작성할 수 있게 해준다.

 

▶ Hibernate의 설정 예시

Hibernate를 사용하기 위해서는 설정 파일을 작성하고, 엔티티 클래스를 정의해야 한다. 아래는 간단한 Hibernate 설정 파일과 엔티티 클래스의 예시!

▽ application.properties 파일

# DataSource 설정
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Hibernate JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

▽ Entity 클래스 (Book.java):

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String author;

    // 기본 생성자
    public Book() {
    }

    // 생성자, Getter, Setter 메서드
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

→ 위 설정 파일과 엔티티 클래스는 Hibernate가 Book 엔티티를 books 테이블에 매핑하도록 설정하는 간단한 예시이다.

 

▶ Hibernate 사용 시 주의사항

Hibernate를 사용할 때는 몇 가지 주의할 점이 있다:

N+1 문제:

Hibernate를 사용할 때 자주 발생하는 문제 중 하나는 N+1 문제이다. 이는 한 번의 쿼리로 가져올 수 있는 데이터를 여러 번의 쿼리로 가져오는 경우를 말한다. 이를 해결하기 위해 fetch 전략을 잘 설정해야 한다.

지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading):

지연 로딩과 즉시 로딩을 적절히 선택해야 한다. 즉시 로딩은 필요한 데이터를 즉시 가져오기 때문에 성능에 영향을 줄 수 있고, 지연 로딩은 필요할 때만 데이터를 가져오기 때문에 메모리 사용을 줄일 수 있다.

캐시 관리:

Hibernate는 1차 캐시와 2차 캐시를 제공하지만, 캐시를 잘못 설정하거나 관리하지 않으면 데이터 불일치 문제가 발생할 수 있다. 캐시의 유효성 관리가 중요하다.

→ 복잡한 쿼리 처리:

복잡한 쿼리가 필요한 경우 HQL이나 Criteria API를 사용하거나 네이티브 SQL 쿼리를 사용하는 것이 좋다. HQL로는 일부 복잡한 쿼리를 표현하기 어려울 수 있다.

 

▶ 정리

Hibernate는 Java 에서 매우 중요한 ORM 프레임워크로, 데이터베이스의 테이블과 Java 객체 간의 매핑을 자동으로 처리하여 SQL 쿼리 작성 없이 데이터베이스와 상호작용할 수 있게 해준다. 주요 장점으로는 데이터베이스 독립성, 자동 CRUD 처리, HQL 지원, 캐싱 메커니즘, 지연 로딩과 즉시 로딩을 통한 성능 최적화, 트랜잭션 관리 기능이 있다. Hibernate를 사용할 때는 N+1 문제, 로딩 전략 선택, 캐시 관리, 복잡한 쿼리 처리에 유의해야 한다. 이를 통해 효율적이고 유지보수하기 쉬운 애플리케이션을 개발할 수 있다.