이번엔 바로 GenericService 인터페이스부터 만들죠.

public interface GenericService<E, S> {
    void add(E e);
    List<E> list(PageParam pageParam, S s);
    E getById(int id);
    void update(E e);
    void deleteBy(int id);
    
}
간단합니다. GenericDao랑 비슷하죠. 이 구현체도 간단합니다. 오히려 GenericDaoImpl 보다 훨씬더..
public class GenericServiceImpl<D extends GenericDao<E, S>, E, S> implements GenericService<E, S>{
    @Autowired protected D dao;
    public void add(E e) {
        dao.add(e);
    }
    public List<E> list(PageParam pageParam, S s) {
        pageParam.initCurrentPageInfosWith(dao.totalSize(s));
        return dao.list(pageParam, s);
    }
    public E getById(int id) {
        return dao.getById(id);
    }
    public void update(E e) {
        dao.update(e);
    }
    public void deleteBy(int id) {
        dao.deleteBy(id);
    }
    
}
유일하게 복잡한 부분이 저 위에 Generic 타입 선언한 부분인데.. GenericDao에 있는 메서드를 사용하려면 D라는 타입이 GenericDao를 확장한 녀석이라는걸 알려줘야 합니다. 그리고 GenericDAO에 넘겨주는 타입이 GenericService에서 사용할 타입과 같다는것도 알려줘야 해서 저렇게 복잡해졌습니다. 만야게 GenericDao 뒤에 붙인 <E, S>를 때어내면 dao.getById(id) 부분에서 타입 불일치 때문에 컴파일 에러가 떨어집니다.ㅋ
public interface MemberService extends GenericService<Member, MemberSearchParam>{
}
public class MemberServiceImpl extends GenericServiceImpl<MemberDao, Member, MemberSearchParam> implements MemberService{
    
}
위에서 만든걸 이용해서 만든 MemberService와 MemberServiceImpl 입니다. 캬.. 간단하군요.