[java] Hibernate와 캐싱

Hibernate는 매번 데이터베이스에서 데이터를 가져오거나 저장하는 방식으로는 성능 문제가 발생할 수 있습니다. 이런 문제를 해결하기 위한 방법 중 하나가 캐싱입니다. 캐싱이란 데이터를 임시로 저장하여 데이터베이스나 다른 소스에서 반복적으로 가져오지 않고 사용하는 것을 말합니다.

Hibernate에서 제공하는 캐싱은 데이터베이스 쿼리 결과, 엔티티, 컬렉션 등을 캐싱할 수 있습니다. 이를 통해 매번 데이터베이스에 접근하여 데이터를 가져오는 비용을 줄일 수 있습니다.

캐싱 종류

1. 세션 캐시

세션 캐시는 Hibernate 세션 내에서만 유효한 캐시로, 같은 세션 내에서 쿼리 결과를 캐싱합니다. 세션이 종료되면 이 캐시도 함께 없어집니다.

Session session = sessionFactory.openSession();
session.setCacheMode(CacheMode.NORMAL);

2. 이차 캐시

이차 캐시는 여러 세션 간에 공유되는 캐시로, 데이터베이스에 대한 다량의 쿼리를 한 번에 캐싱합니다.

@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
    // ...
}

캐시 설정

Hibernate의 캐싱 설정은 hibernate.cfg.xml 파일이나 어노테이션을 통해 진행됩니다. 이를 이용하여 캐시 전략, 유효시간, 캐시 관리 전략 등을 설정할 수 있습니다.

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

캐시 사용 시 주의사항

캐싱을 사용할 때는 데이터 무결성원자성을 유지할 수 있도록 주의해야 합니다. 또한, 의도치 않은 데이터 불일치를 방지하기 위해 관련 엔티티가 변경될 때 캐시를 업데이트해주어야 합니다.

좋은 성능을 위해 Hibernate의 캐싱 기능을 활용할 때에는 적절한 전략과 설정을 통해 데이터의 일관성과 안정성을 유지하는 것이 중요합니다.


참고 문헌: