검색 기능을 구현해 봅니다.

1. Dao 테스트에 다음과 같이 "s"로 검색 했을 때 두명이 나올 것이라고 예상합니다. 이런 예상의 근거는 DBUnit을 사용해서 XML에 있는 Data를 넣어서 사용할 것이기 때문에 XML에 있는 데이타를 근거로 삼았습니다.

    public void testGetMembers() throws Exception{
        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();
            }
        });
    }

위 코드에서 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();

callback을 사용하는 이유가 있겠죠? 궁금하네요~ *_*