앞으로 테스트를 계속 할 것인데 매번 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(); } }