Spring Annotation 사용시 sessionFactory는 어떤 방식으로 Injection을 해주어야 하나요?
Submitted by captain on 토, 10/04/2008 - 18:22
Spring Annotation을 사용하여 개발중입니다.
DAO역할을 하는 Class를 Repository로 annotation을 걸어서 사용하려 합니다.
@Repository("UserDAO")
public class UserDAO extends HibernateDaoSupport
{
}
그런데, 보시면 아시겠지만 HibernateDaoSupport를 사용할 때
항상 sessionFactory를 가져와야 합니다.
이걸 안가져오면 sessionFactory나 HibernateTemplate이 필요하다는 Exception이 계속 나옵니다.
그래서, 검색을 해보니 대충 이렇게 하면 오류는 안나는것 같습니다.
@Autowired
public UserDAO(SessionFactory sessionFactory)
{
this.setSessionFactory(sessionFactory);
}
궁금한점은 Annotation 사용시 setSessionFactory를 설정할때 위와 같은 방식이 맞는지 궁금하며,
@Autowired가 아닌 다른 방법 (@Resource 로는 안될것 같지만...) 으로는 설정이 안되는지 궁금합니다.
확인 부탁드립니다.
감사합니다.


Spring Annotation 사용시 sessionFactory Injection
Spring에서 제공하는 HibernateDaoSupport는 Annotation 기반으로 동작하는 클래스가 아닙니다.
그리고 HibernateDaoSupport는 SessionFactory를 기반으로 동작하기 때문에 HibernateDaoSupport를 상속받은 DAO 클래스에서는 SessionFactory를 Injection하고 있어야 합니다.
만일, 해당 어플리케이션을 Spring Annotation 기반에서 개발하신다면 언급하신바와 같이 HibernateDaoSupport를 상속받은 DAO 클래스에서는 강제로 상위의 setSessionFactory(SessionFactory sessionFactory) 메소드를 호출해주어야 합니다.
그렇지 않으면 DAO 클래스에서 HibernateDaoSupport를 extends하지 않고 직접 SessionFactory를 Annotation 기반으로 injection하여 HibernateTemplate이 아닌 SessionFactory를 사용하는 형태로 구성하실 수도 있습니다.
@Resource private SessionFactory sessionFactory; public void createMovie(Movie movie) throws Exception { this.sessionFactory.getCurrentSession().save(movie); }Annotation 기반으로 개발된 간단한 MovieService와 테스트코드를 첨부하오니 참고하세요.
포럼 댓글에 첨부가 되지 않아 본문에 첨부를 붙였습니다. ^^;
답변 감사합니다. 그러면 다음의 차이는 어떤것인가요?
주신 예제 잘 받았습니다.
그렇다면 제가 질문했던 소스와 답변 주신 소스는 무슨 차이가 있을까요?...
1번 경우 (@Resource로 DI)
UserDAO.java
----------------
public class UserDAO extends HibernateDaoSupport
{
@Resource
private SessionFactory sessionFactory;
public void createMovie(Movie movie) throws Exception {
this.sessionFactory.getCurrentSession().save(movie);
}
}
---------------
2번 경우 (@Autowired 생성자에 명기)
UserDAO.java
----------------------
public class UserDAO extends HibernateDaoSupport
{
@Autowired
public UserDAO(SessionFactory sessionFactory)
{
this.setSessionFactory(sessionFactory);
}
public void createMovie(Movie movie) throws Exception {
this.getCurrentSession().save(movie);
}
}
감사합니다.
Constructor Injection vs. Setter Injection
* Constructor Injecction vs. Setter Injection
captain 님께서 사용하신 방식은 Constructor Injection 방식입니다.
Constructor Injection의 경우 Spring Context를 통해 해당 Bean의 인스턴스가 생성될 때 입력 인자로 정의한 Bean(즉, 참조 관계에 놓인 Bean)의 인스턴스를 이용합니다. 이를 이용해서 상위 클래스 내에 정의된 setSessionFactory() 메소드를 호출하여 HibernateTemplate을 사용할 수 있도록 준비할 수 있게 됩니다.
이에 반해 제가 제시해 드린 방식은 Setter Injection 방법입니다.
Setter Injection의 경우 Spring Context를 통해 해당 Bean의 Default Constructor를 호출한 후, 참조 관계에 놓인 Bean를 셋팅하는 방식입니다. Setter Injection을 사용하면 HibernateDaoSupport를 활용할 수 없어 Session을 이용한 긴 로직을 구성하셔야 합니다.
제 생각에는 코드를 간락화하기 위해 HibernateDaoSupport가 제공하는 API를 이용할 수 있는 방법인 Constructor Injection을 사용하셔도 무리가 없을 것으로 보입니다.
Constructor Injecction vs. Setter Injection에 대한 보다 자세한 내용은 Anyframe Core 매뉴얼을 참고하세요.
(http://dev.anyframejava.org/anyframe/doc/core/3.1.0/corefw/guide/ioc-dep...)