밤빵's 개발일지
[TIL]20240723 Hibernate 본문
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 문제, 로딩 전략 선택, 캐시 관리, 복잡한 쿼리 처리에 유의해야 한다. 이를 통해 효율적이고 유지보수하기 쉬운 애플리케이션을 개발할 수 있다.
'개발Article' 카테고리의 다른 글
[TIL]20240725 님버스?.. 왜 내 토큰은 파싱이 안되는걸까..? (0) | 2024.07.26 |
---|---|
[TIL]20240724 쓰리 레이어 아키텍처(Three-Layer Architecture) (0) | 2024.07.24 |
[TIL]20240722 DI & IOC (0) | 2024.07.22 |
[WIL]20240721 팀프로젝트 시작! 그리고 SOLID (0) | 2024.07.21 |
[TIL]20240720 ORM...? (0) | 2024.07.21 |