본문 바로가기

스프링

[Hibernate] 하이버네이트_1

1.     Com.springsource.antlr.jar : Hibernate 구문분석 파서

2.     Com.springsource.javassist : Hibernate javassist바이트코드 생성기 클래스 동적변형

3.     Com.springsource.javax.activation Spring java-mail

4.     Com.springsource.javax.mail : Spring java-mail

5.     Com.springsource.javax.persistence : spring JPA 지원을 위한 클래스 로더 필요

6.     Com.springsource.javax.transaction : JTA

7.     Com.springsource.org.aopalliance : Spring ProxyFactoryBean

8.     Apache.commons.collection : Java 콜렉션 라이브러리 확장

9.     Com.springsource.org.aspectj.tools : AspectJExpressionPointcut 포인트컷 표현식 지원

10.   Com.springsource.org.castor : OXM castor Framework

11.   Com.springsource.org.dom4j : XML파싱

12.   Com.springsource.org.hibernate : 하이버네이트

13.   Com.springsource.org.hibernate.annotation : 하이버네이트

14.   Com.springsource.org.hibernate.annotation.commons : 하이버네이트

15.   Com.springsource.org.hibernate.validator : 하이버네이트

16.   Com.springsource.org.hsqldb : spring 내장형 DataBase

17.   Com.springsource.junit : junit

18.   Com.springsource.slf4j : 수많은 로그파일들의 인터페이스 제공 프레임웍 현재 대세

19.   Commons-logging : Spring-context가 사용

20.   Eclipselink.jar : 이클립스 JPA 구현제품 사용시 사용시

21.   Javax.persistence-api : 줄여서 JPA. JavaSE, EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바API

22.   Mail : java-mail

23.   Mockito : 목 프레임워크 중 Mockito

24.   Mysql-connector : Mysql JDBC

25.   Org.springframework.context.support : Spring java-mail

26.   Org.springframework.orm : spring orm

27.   Org.springframework.oxm : Spring OXM(Object XML Mapping) Jaxb .

28.   Spring-aop : 스프링 기능 자체의 aop, Spring ProxyFactoryBean

29.   Spring-bean : 스프링 코어와 함께 의존성 주입 제공 (Core Container)

30.   Spring-context : 스프링 코어, BeanFactory를 확장한 어플리케이션 컨텍스트 구현, 리소스 로드 및 국제화 지원(Core Container)

31.   Spring-core : 다른 스프링 모듈이 사용하는 유틸리티(Core Container)

32.   Spring-expression : EL 확장 Bean속성(배열, 컬렉션 포함).(Core Container)

33.   Spring-jdbc : 스프링이 지원하는 jdbc.

34.   Spring-test.jar

-       @RunWith : Junit 프레임워크의 테스트 실행방법을 확장시 사용.

-       SpringJUnit4ClassRunner : 어플리케이션컨텍스트를 만들고 관리하는 확장 클래스

-       @ContextConfiguration(경로) : 자동으로 만들어줄 어플리케이션 컨텍스트 설정파일

35.   Spring-tx : DuplicateKeyException.class 파일 존재 및 스프링 트랜잭션

 

 

* 하이버네이트에는 JPAEntityManagerFactory 처럼 핵심 엔진 역할을 하는 SessionFactory가 있다. SessionFactory는 엔티티 매핑정보와 설정 프로퍼티 등을 이용해 초기화한 뒤에 애플리케이션에서 사용해야 한다.

* 스프링에서는 SessionFactory를 빈으로 등록하고 초기화할 수 있는 두 가지 팩토리 빈을 제공한다.(LocalSessionFactoryBean, AnnotationSessionFactoryBean)

 

8~11. SessionFactory가 참고할 프로퍼티 정보기입

12. 매핑파일의 위치를 지정 하나 이상의 매핑파일을 사용가능

* 하지만 위의 설정파일은 스프링의 SessionFactoryBean<property>태그의 설정으로 대체가 가능하다. 이미 만들었거나, 굳이 다른 파일로 만들어야할 이유가 있는 것이 아니라면 하나의 설정에 몰아넣는 것이 좋다.

 

Member클래스 나머지 get,set

> Hibernate 역시 JPA의 일원으로 동일한 애노테이션으로 매핑시켜줘야함(Spring AnnotaionSessionFactoryBean 사용시)

> LocalSessionFactoryBean 사용시 애노테이션은 필요없다.

 

7. Member 클래스와 Member테이블 사이의 매핑정보를 넣는다.

> LocalSessionFactoryBean 사용시에만 사용되고 AnnotationSessionFactoryBean은 매핑파일 필요없이 애노테이션만으로 매핑이 가능하다.

 

8. LocalSessionFactoryBean

> 빈으로 등록된 DataSource를 이용해서 스프링이 제공하는 트랜잭션 매니저와 연동할 수 있도록 설정된 SessionFactory를 만들어주는 팩토리빈이다.

> SessionFactory를 만들 때는 매핑파일 목록과 프로퍼티를 담은 hibernate.cfg.xml이라는 설정파일을 이용한다.

> 이렇게 빈으로 등록된 SessionFactoryDAO에서 DI 받아서 사용하면 된다.

> 캐시 프로바이더, 엔티티 인터셉터, 이벤트 리스너와 같은 다양한 SessionFactory에 설정용 프로퍼티가 제공된다. 자세한 내용은 LocalSessionFactoryBean API문서를 참고하자.

11. mappingLocations : hibernate.cfg.xml<mapping> 태그로 등록한 매핑파일 정보는 LocalSessionFactoryBeanmappingLocations 프로퍼티를 이용해 등록할 수도 있다.

13. classpath : 디폴트이므로 생략가능

16. hibernateProperties : mappingLocationhibernateProperties를 모두 사용한다면 굳이 hibernate.cfg.xml 파일을 만들지 않아도 된다. 미리 만들어둔 hibernate.cfg.xml을 사용하거나 특별한 이유로 외부 설정파일을 유지해야 하는 경우가 아니라면, 스프링 빈을 이용해 모든 하이버네이트 설정을 지정하는 것이 관리하기 편할 것이다.

17. HibernateTransactionManager : SessionFactory를 통해 하이버네이트 DAO를 만들 때 스프링의 트랜잭션 경계설정 기능을 적용하려면 스프링이 제공하는 트랜잭션 매니저를 이용해야 한다. 단일 DB를 사용하고 JTA(Java Transaction API)를 이용할 필요가 없다면 해당 빈을 사용한다. 해당 빈은 하이버네이트 DAOJDBC DAO를 같은 트랜잭션으로 묶어서 동작시킬 수 있다. 동일한 DataSource를 사용하도록 SessionFactoryJDBC DAO를 설정해주기만 하면 된다.

> JtaTransactionManager : 여러 개의 DB에 대한 작업을 하나의 트랜잭션으로 묶으려면 JTA를 통해서 서버가 제공하는 글로벌 트랜잭션 기능을 이용해야한다.

 

8. AnnotationSessionFactoryBean : 하이버네이트는 JPA처럼 엔티티 클래스에 애노테이션을 부여하고 이를 매핑정보로 사용하는 방법을 제공한다. 기본적으로 JPA에 정의된 매핑용 애노테이션을 그대로 사용할 수 있으며, 추가로 하이버네이트가 제공하는 확장 애노테이션을 이용하면 확장 애노테이션을 이용하면 하이버네이트의 고급 매핑정보를 애노테이션을 이용해 정의해줄 수 있다.

10. packagesToScan : 엔티티 클래스의 개수가 많거나 자주 추가 또는 삭제된다면 자동스캔을 통해 엔티티 클래스를 찾는 것이 편하다. 지정된 패키지에서 @Entity 애노테이션이 달린 클래스를 찾아서 등록해주는 방식

11. annotatedClasses : 매핑 애노테이션이 부여된 클래스 목록을 지정할 수 있다.

34. HibernateTransactionManager : 단일 DB를 사용하고 JTA를 이용할 필요가 없다면 간단히 이 빈 하나로 끝난다. 하이버네이트 DAOJDBC DAO를 같은 트랜잭션으로 묶어서 동작시킬 수 있다. 동일한 DataSource를 사용하도록 SessionFactoryJDBC DAO를 설정해주기만 하면 된다.

 

 

Session은 하이버네이트의 핵심 API. SessionSessionFactory로부터 만들어지며 보통 트랜잭션과 동일한 스코프를 갖고 있다. 하이버네이트 DAO는 스프링이 관리하는 트랜잭션과 동기화된 Session을 가져와 사용한다. 스프링은 Session을 사용하는 두가지 방법을 제공한다.

1. 스프링의 템플릿/콜백 패턴이 적용된 HibernateTemplate를 이용하는 방법이다. HibernateTemplateSessionFactory를 생성자로 제공해서 만든다.

* HibernateTemplate

> 하이버네이트의 Session에 있는 대부분의 기능을 템플릿이 제공하는 메소드를 통해 이용하게 해준다. 진행 중인 트랜잭션과 동기화된 Session을 사용하는 코드를 직접 만들려면 excute() 메소드와 HibernateCallback 인터페이스를 구현한 콜백 오브젝트를 사용하면 된다.

> 트랜잭션과 동기화되는 세션을 제공해주는 기능이 없던 하이버네이트 구버전에서는 매우 유용한 방법이었다. 그럼에도 하이버네이트가 제공하는 API를 직접 사용하지 못하고 스프링의 템플릿 구조에 종속된다는 점이 불만이었던 하이버네이트 개발자도 있었다.

> 하이버네이트 3.0.2부터 트랜잭션 동기화되 Session을 손쉽게 가져올 수 있는 기능을 제공함으로써 스프링은 트랜잭션 관리 기능을 하이버네이트의 기능과 맞물려 동작하게 함으로 하이버네이트 API를 직접 사용해서 코드를 작성해도 스프링의 트랜잭션 동기화 기능을 적용할 수 있다.

> 스프링은 외부 기술의 API를 가능한 한 직접 사용하도록 권장한다. JDBC 코드와 같이 어쩔 수 없는 경우를 제외하면, 스프링 API나 오브젝트가 관여하지 않는 순수한 코드를 유지할 수 있도록 많은 노력을 기울이고 있다. 데이터 액세스 기술의 템플릿 스타일을 특별히 선호하는 경우가 아니라면 HibernateTemplate의 사용은 그다지 권장되지 않는다.

 

스프링이 제공하는 HibernateDaoSupport를 상속해서 getHibernateTemplate()로 템플릿 오브젝트를 가져와 사용할 수 있다.

 

38. SessionFactory.getCurrentSession()

> 현재 트랜잭션에 연결되어 있는 하이버네이트의 Session을 가져올 수 있다.

33. SessionFactoryDI 받아서 저장해두고 사용한다.

* 위 코드에는 스프링 API가 전혀 등장하지 않는다. 평범한 하이버네이트 API를 사용하는 코드로만 만들어졌다. 그러면서도 스프링의 트랜잭션 동기화 기능과 완벽하게 연동되어 동작하는 코드다.

> 하이버네이트 API는 런타임 예외를 던지기 때문에 try/catch, throws 선언은 필요없다. 대신 스프링의 DataAccessException 계층으로 변환되게 하려면 JPA에서와 마찬가지로 @Repository 애노테이션을 클래스에 부여하고 PersistenceExceptionTranslationPostProcessor 빈을 추가해줘야 한다.

> 이 방법의 한가지 단점은 HibernateTemplate처럼 DAO가 단독으로 사용될 때 트랜잭션을 자동으로 만들어주지 못하는 점이다. 반드시 트랜잭션이 시작된 후에만 사용될 수 있다. 그렇지 않으면 현재 스레드에 바인딩된 Session이 없다는 하이버네이트 예외를 만나게 된다.

'스프링' 카테고리의 다른 글

AOP_Aspectj  (0) 2021.02.04
JPA_JTA_하이버네이트 트랜잭션_2  (0) 2021.02.03
[JPA] ORM 정의  (0) 2021.02.01
[spring] ibatis  (0) 2021.01.31
Spring_DataAccess기술_프로시저  (0) 2021.01.30