1. 먼저 MemberRepositoryTest에 다음과 같이 Easymock을 이용한 Test코드를 추가합니다.

   @Test
   public void pagsing(){
       final Member member = new Member();
       List<Member> members = null;

       mockMemberDao.add(member);
       expectLastCall().times(15);
       expect(mockMemberDao.list(1)).andReturn(members);

       replay(mockMemberDao);
       for (int i = 0; i < 15; i++) {
           memberRepository.add(member);
       }
       assertEquals(members, memberRepository.list(1));

       verify(mockMemberDao);
   }

=> 여기서 의문이 드는 것은 "빨간색으로 표시된 부분이 올바른 표현인가?" 모르겠습니다. Return 타입을 예상하는 부분으로 기억이 나는데 다시 공부할 필요가 있겠습니다.
=> 또하나 의문이 드는 것은 return type인 "List의 크기를 예측할 순 없을까"하는 것입니다. 왠지 방법이 있을 것 같은데 이것도 좀더 공부할 필요가 있겠습니다.

이 테스트를 통과 시키기 위해서는 MemberDao 인터페이스에 새로운 메소드가 추가되어야 하며 MemberRepository 인터페이스에도 새로운 메소드가 추가되어야 합니다. 그리고 그 메소드를 구현한 MemberRepositoryImpl 에서 새로 추가한 메소드를 구현해 두어야 합니다. MemberDao의 list()를 호출하도록 수정하면 위 테스트는 간단하게 통과 합니다.

2. 이번에는 Dao Test를 하기 위해서 SqlmapMemberDaoTest 클래스에 다음의 테스트 코드를 추가합니다.

   public void testPaging(){
       final int numberOfMembers = 15;
       insertMembers(numberOfMembers);

       List<Member> members = memberDao.list(1);
       assertNotNull(members);
       assertEquals(12, members.size());

       members = memberDao.list(2);
       assertEquals(3, members.size());
   }

=> 이 테스트를 통과시키면 구현이 끝나게 됩니다.

3. 테스트를 통과 시키기 위해서 SqlmapMemberDao에 list를 아래와 같이 구현합니다.

public List<Member> list(int page) {
       Map<String, Integer> params = new HashMap<String, Integer>();
       params.put("defaultSize", 12);
       params.put("offset", 12 * (page-1));
       return getSqlMapClientTemplate().queryForList("Member.list", params);
   }

=> 아직도 테스트를 통과하지 못합니다. iBATIS에 list라는 id를 가진 SQL을 작성해야 합니다.

4. Member.xml에 다음과 같이 추가하면 테스트는 통과하고 기능 추가가 끝나게 됩니다.

<select id="list" resultMap="memberMap">
       SELECT *
       FROM Member
       ORDER BY id
       LIMIT #defaultSize# OFFSET #offset#
   </select>

=> LIMIT에 대한 MySQL document를 참조했습니다.

기본구조)  [LIMIT {[offset] row_count | row_count OFFSET offset}]
예) LIMIT 5 => 상위 5 줄
    LIMIT 2, 5 => 상위에서 2줄 버리고 5 줄
    LIMIT 5 OFFSET 2 => 상위에서 2줄 버리고 5줄

5. 코드에 수정할 부분을 찾아서 리팩토링 합니다. 한 페이지에 12개 씩 보여주기로 정했습니다.(제 맘대로ㅋㅋ) 그래서 위에 표시해 둔 12라는 숫자는 의미가 있는 숫자입니다. MemberRepository에 DEFAULT_LIST_SIZE 상수로 바꿉니다.