(스프링) 11장 객체 관계형 매핑을 통한 데이터 퍼시스팅

퍼시스턴스 세계는 자전거와 같다. JDBC는 자신의 일을 훌륭하게 수행하며, 몇몇 업무에는 잘 동작한다. 하지만 애플리케이션이 점점 복잡해짐에 따라 퍼시스턴스와 관련된 요구 사항도 덩달아 복잡해졌다. 따라서 객체의 프로퍼티를 데이터베이스 칼럼에 매핑하고 질의객체를 자동으로 생성함으로써 끝없는 물음표(?) 문자의 행렬로부터 우리들 자신을 해방시킬 수 있어야 한다.
게다가 다음과 같은 좀 더 복잡하고 정교한 기능도 필요해졌다.


  • 지연로딩(lazy loading) : 객체구조가 점점 복잡해짐에 따라 종종 관련성 있는 객체 전체를 한번에 가져오는 것을 원하지 않는 경우가 생긴다. 예를들어, PurchaseOrder객체의 컬렉션을 조회하는데 내부에 있는 LineItem객체 컬렉션을 담는다고 가정하자. PurchaseOrder가 가진 프로퍼티에만 관심이 있는데도 불구하고 PurchaseOrder내부의 LineItem 데이터까지 한꺼번에 데이터베이스에서 읽어들인다면 이는 비효율적이다. 지연로딩은 우리가 필요로 하는 실제 데이터만 불러올 수 있다.
  • 조기인출(eager fetching) : 지연 로딩의 반대 개념이다. 조기 인출은 한 번의 쿼리로 전체 객체 구조를 가져올 수 있다 이를 통해 데이터베이스와 애플리케이션 사이에서 발생하는 값비싼 왕복 비용을 줄일 수 있다.
  • 캐스케이딩(cascading) : 때떄로 데이터베이스 테이블에 변경을 가했을 때 다른 테이블도 동일하게 변경되어야 하는 경우가 있다. 구매 주문 예제로 다시 설명하면, 데이터베이스에서 PurcaseOrder객체가 삭제되면 이에 딸린 LineItem객체까지 함께 삭제된다.
이런 서비스를 일반적으로 객체관계매핑(ORM, Object-Relational Mapping)이라고 한다.
종류로는 하이버네이트, iBATIS, 아파치 OJB, JDO,JPA, 오라클의 톱링크 등이 포함된다.


1. 스프링과 하이버네이트 통합

캐시, 지연로딩, 조기인출, 분산캐시등의 기능이 있다.

Session인터페이스는 데이터베이스로부터 객체에 대한 저장, 업데이트, 삭제 그리고 로드와 같은 기본적인 데이터 액세스 기능을 제공한다. 애플리케이션의 DAO는 이런 모든 퍼시스턴스 관련 요구 사항을 하이버네이트의 Session 인터페이스를 통해 수행한다.

하이버네이트 Session 객체의 레퍼런스를 얻으려면 하이버네이트의 SessionFactory인터페이스를 이용해야 한다. SessionFactory는 하이버네이트의 Session 객체들을 열고 닫으며, 관리에 대한 책임을 진다.
스프링은 세 개의 세션 팩토리 빈을 가진다.
  • org.springframework.orm.hibernate3.LocalSessionFactoryBean
  • org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
  • org.springframework.orm.hibernate4.LocalSessionFactoryBean

예) LocalSessionFactoryBean을 설정한 경우

@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource)
{
  LocalSessionFactoryBean sfb=new LocalSessionFactoryBean();
  sfb.setDataSource(dataSource);
  sfb.setMappingResources(new String[] {"Spitter.hbm.xml"});
  Properties props=new Properties();
  props.setProperty("dialect", "org.hibernate.dialect.H2Dialect");
  sfb.setHibernateProperties(props);
  return sfb;
}



댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기