앞으로 테스트를 계속 할 것인데 매번 DAO( Data Access Object) 를 계속 만들기가 힘이 듭니다.
앞으로의 테스트 환경을 위해 테스트를 위한 DAO를 만들고 하이버네이트 유틸 파일도 조금 손을 보겠습니다.
문제 : 매번 CRUD 를 위해서 비슷한 소스를 적어야하나요?! 밑에는 해답!
기존의 DaoMember를 DaoCommon 으로 확장함
제너릭을 사용하면 List, Set 같이 어떤 엔티티 클래스가 와도 이걸로 CRUD를 할 수 있었다!
(개발초보에게 뭔가 큰 즐거움이었음)
만들어진 소스는 다음과 같습니다. (장난감소스임)
package util;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
public class DaoCommon<T> {
private SessionFactory factory;
private Class clazz;
private String boardName;
public DaoCommon(Class<?> clazz) {
factory = HibernateTestUtil.getSessionFactory(clazz);
this.clazz = clazz;
this.boardName = clazz.getSimpleName();
}
public List<?> selectList() {
Session session = factory.getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("from "+boardName);
List<?> list = query.list();
session.getTransaction().commit();
return list;
}
public void delete(T member) {
Session session = factory.getCurrentSession();
session.beginTransaction();
session.delete(member);
session.getTransaction().commit();
}
public void update(T selectedMember) {
Session session = factory.getCurrentSession();
session.beginTransaction();
session.update(selectedMember);
session.getTransaction().commit();
}
public T selectById(int id) {
Session session = factory.getCurrentSession();
session.beginTransaction();
T member = (T) session.get(clazz, id);
session.getTransaction().commit();
return member;
}
public void insert(T member) {
Session session = factory.getCurrentSession();
session.beginTransaction();
session.save(member);
session.getTransaction().commit();
}
}
문제 : 기존의 하이버네이트유틸파일이 매번 같은 경로의 hibernate.cfg.xml 를 읽기 때문에 설정파일들이 나중에는 겹칠것같고 매번 db 테이블 새로 생성하기도 느릴 것같애요.
HibernateUtil 을 조금 손본 HibernateTestUtil !
하나의 패키지만 가동시키는 HibernateTestUtil 소스는 다음과 같습니다.
package util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.boot.registry.StandardServiceRegistry;
/**
* @author Deepak Kumar * Web: http://www.roseindia.net
* Update by arahansa@naver.com
*/
public class HibernateTestUtil {
private static SessionFactory sessionFactory;
private static String configFile = "hibernate.cfg.xml";
public static SessionFactory getSessionFactory(Class<?> clazz) {
if(sessionFactory==null){
try {
configFile = "/" + clazz.getPackage().getName().replace('.', '/') + "/" + configFile;
Configuration cfg = new Configuration().configure(configFile);
StandardServiceRegistryBuilder sb = new StandardServiceRegistryBuilder();
sb.applySettings(cfg.getProperties());
StandardServiceRegistry standardServiceRegistry = sb.build();
sessionFactory = cfg.buildSessionFactory(standardServiceRegistry);
} catch (Throwable th) {
System.err.println("Enitial SessionFactory creation failed" + th);
throw new ExceptionInInitializerError(th);
}
}
return sessionFactory;
}
public void shutdown() {
sessionFactory.close();
}
}

