8.4. 기능 구현
검색 기능을 구현해 봅니다.
1. Dao 테스트에 다음과 같이 "s"로 검색 했을 때 두명이 나올 것이라고 예상합니다. 이런 예상의 근거는 DBUnit을 사용해서 XML에 있는 Data를 넣어서 사용할 것이기 때문에 XML에 있는 데이타를 근거로 삼았습니다.
public void testGetMembers() throws Exception{
insertFlatXmlDataSet("test/src/keesun/kSampleData.xml");
assertEquals(2, kMemberDao.getMembers("s").size());
}
insertFlatXmlDataSet("test/src/keesun/kSampleData.xml");
assertEquals(2, kMemberDao.getMembers("s").size());
}
2. 그리고 이클립스를 보고 있으면 컴파일 에러가 발생하는 것을 확인할 수 있습니다. 당연하죠. getMembers(String)이라는 인터페이스가 MemberDao 에 없기 때문입니다. 만들어 주면 되죠.
public interface KMemberDao extends GenericDao<KMember, Integer>{
public List<KMember> getMembers(String string);
}
3. 인터페이스에 추가해 줬더니 이젠 이걸 구현한 쪽에서 에러가 발생합니다. 이것을 구현해 주고 테스트의 결과 녹색불이 들어오면 구현이 끝납니다.
@SuppressWarnings("unchecked")
public List<KMember> getMembers(final String name) {
return getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session s) throws HibernateException, SQLException {
Query q = s.createQuery("from k_Member m where m.name like :name order by m.name asc")
.setParameter("name", "%" + name +"%");
return q.list();
}
});
}
public List<KMember> getMembers(final String name) {
return getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session s) throws HibernateException, SQLException {
Query q = s.createQuery("from k_Member m where m.name like :name order by m.name asc")
.setParameter("name", "%" + name +"%");
return q.list();
}
});
}
위 코드에서 getHibernateTemplate()으로 HibernateTemplate객체를 받아오고 이 객체의 executeFind() 메소드를 사용해서 자기가 할일을 남(HibernateCallback)을 시켜서 합니다.
구현을 아래 처럼 간단하게 할 수도 있는데요.
Session s = getSession();
Query q = s.createQuery("from k_Member m where m.name like :name order by m.name asc")
.setParameter("name", "%" + name +"%");
return q.list();
Query q = s.createQuery("from k_Member m where m.name like :name order by m.name asc")
.setParameter("name", "%" + name +"%");
return q.list();
callback을 사용하는 이유가 있겠죠? 궁금하네요~ *_*