Whiteship's Note


주소록 개발 카탈로그



프로젝트 시작
* 요구 사항 인터뷰
개발 준비 작업
* 프로젝트 생성 + jar 파일 추가
* MySQL 설치 + 사용
* MySQL Connector Down + testAdd()
신나게 개발
개발 도중 공부
중간 점검
* 수정해야 할 것들
* 중간점검
에피소드
* Alt + Shift + X, R 주의
* DB 인코딩 문제
* MySQL 설치 시 주의 할 점



'Spring > 주소록 만들기' 카테고리의 다른 글

SimpleFormController 에피소드2  (0) 2007.02.02
SimpleFormController 에피소드1  (2) 2007.02.02
Spring's form tag  (0) 2007.02.01
DisplayTag과 SpringMVC  (0) 2007.01.31
DisplayTag 배끼기  (2) 2007.01.31
주소록 개발 카탈로그  (4) 2006.12.30
JSP 화면 작성  (0) 2006.12.29
Spring MVC configuration 파일들 설정 하기  (0) 2006.12.26
MVC 컨트롤러 작성  (0) 2006.12.26
화면 작성  (0) 2006.12.26
Alt + Shift + X, R 주의  (2) 2006.12.25
top

  1. 한산 2006.12.30 00:28 PERM. MOD/DEL REPLY

    아 이게 준비하고 있는 주소록이군요. -_- 방금 유재석이 방송 연예 대상 탔음 ㅎㅎㅎ
    하이버네이트 잠깐 봤는데 신기하네요.. 스터디때 잠깐 질문을 하도록 할게용..

    이유야 어찌되었건 밑에 댓글단것에 대해서 많이 미안하네요..
    연말 잘 보내시고.. 춥습니다.. 감기 조심하삼...

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.12.30 00:42 신고 PERM MOD/DEL

    ㅇㅇ만들고 있는데 슬슬 끝이 보여서 정리좀 했지.

    뭐 그럴 수도 있지. 시행착오는 누구나 겪는거니깐.. 나도 그랬었고~ 너도 연말 잘 보내고. 감기조심해.

  2. Favicon of https://zerry82.tistory.com BlogIcon 동자~ 2006.12.30 01:33 신고 PERM. MOD/DEL REPLY

    와 대단한 정리다..

    Favicon of http://whiteship.tistory.com/ BlogIcon 기선 2006.12.30 09:41 PERM MOD/DEL

    뭐그리 대단한건 아니고...너무 정신이 없길래 한번 정리해봤어;

Write a comment.


페이징 기능 구현하기(TDD, Easymock, iBATIS, MySQL)



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 상수로 바꿉니다.

'Spring > 주소록 만들기' 카테고리의 다른 글

주소록 화면 완성  (3) 2006.12.19
중간점검  (0) 2006.12.17
HTML 공부 중 2탄  (2) 2006.12.14
Strict HTML 4.01 지침서  (6) 2006.12.14
HTML 공부 중  (2) 2006.12.13
페이징 기능 구현하기(TDD, Easymock, iBATIS, MySQL)  (2) 2006.12.11
Easymock 연습하기 3탄  (0) 2006.12.06
Easymock 연습하기 2탄  (0) 2006.12.05
Easymock 연습하기  (0) 2006.12.05
단위 테스트 모르겠슴 ㅠ.ㅠ  (0) 2006.12.05
Eclipse에서 Rename Method 리팩토링  (0) 2006.12.04
top

  1. Favicon of http://younghoe.info/ BlogIcon 영회 2006.12.12 00:48 PERM. MOD/DEL REPLY

    http://blog.empas.com/ahnyounghoe/read.html?a=14022746

    예전에 썼던 시리즈에 보면 Spring의 PagedListHolder 쓴 거 있는데
    이거 쓰면 페이징을 화면에 표현할 때 좋지.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.12.12 07:33 신고 PERM MOD/DEL

    네. 아~ Spring Korea 개발할 때도 살짝 봤었던 것 같네요. 개발을 마무리 하진 못했지만 많은 걸 반추하며 배울 수 있어서 좋습니다. :)

Write a comment.


세련된 SQL map (iBATIS)



현재 어플리케이션에서 XML파일에 있는 SQL문들 중에서 find관련 SQL문들 입니다.

얼핏보면 전부 같아 보이지만 다들 매~우 조금씩 다릅니다. 좀더 세련되게 고치기 위해서 다음과 같이 코드를 수정합니다.

그리고 SqlmapMemberDao 클래스의 코드를 다음과 같이 맵을 사용하도록 수정합니다.

이전의 SqlmapMemberDao 클래스에 있던 코드는 다음과 같았습니다.

코드에서의 차이는 각 메소드마다 구체적인 findByXXX와 같은 SQL문을 부르다가 좀더 추상적인 find라는 SQL을 부르게 바뀌었습니다. 이것도 이 전에 썼던 메소드 추상화와 비슷한 특징이 있는 것 아닌가 생각해봅니다.

'Spring > 주소록 만들기' 카테고리의 다른 글

Easymock 연습하기 3탄  (0) 2006.12.06
Easymock 연습하기 2탄  (0) 2006.12.05
Easymock 연습하기  (0) 2006.12.05
단위 테스트 모르겠슴 ㅠ.ㅠ  (0) 2006.12.05
Eclipse에서 Rename Method 리팩토링  (0) 2006.12.04
세련된 SQL map (iBATIS)  (0) 2006.12.04
메소드 추상화  (2) 2006.12.04
log4j.properties 파일 위치 시키기  (2) 2006.12.04
log4j 설정하기(in spring)  (0) 2006.12.02
수정해야 할 것들  (2) 2006.11.28
iBATIS에서 selectKey 사용하기  (2) 2006.11.23
top

TAG iBATIS, map

Write a comment.


iBATIS에서 selectKey 사용하기



수정해야 할 것 중에 4번에 해당 했던 것을 오늘에서야 수정했습니다. DB 인코딩 문제도 해결하고 오늘 아주 수확이 좋습니다.

id값을 예측 할 수 없었던 상황

DB를 MySQL을 사용할 때 ID 값을 AUTO_INCREMENT로 설정해 두었더니 ID값은 트랜잭션이 끝나고 롤백이 되지 않고 그대로 쌓여나가게 됩니다. 따라서 get(int id)와 같은 메소드로 DB에서 id를 사용해서 특정 값을 가져오고 싶은데 id값을 예측할 수 없기 때문에 테스트를 할 수가 없습니다.

id값을 임의로 지정해 주었던 상황

Member 테이블의 id 속성에서 AUTO_INCREMENT를 삭제하고 내가 원하는 id값으로 Member객체의 데이터를 세팅하고 Member 객체를 테이블에 insert할 때 id 값도 명시적으로 넣었습니다.
별 문제는 없지만 일일히 id를 신경써야 한다는 것이 다소 불편합니다. 그리고 왠지 AUTO_INCREMENT를 쓰고 싶습니다.

AUTO_INCREMENT를 사용해도 id값을 알 수 있게 된 상황

그래서 DB에 insert 할 때 selectKey 태그를 사용해서 주키 값을 반환하여 DB에 삽입한 객체의 id 값을 setting해 주기로 했습니다.
그렇게 하면 Member객체를 DB에 insert할 때 id값은 세팅되지 않은 상태에서 DB에 들어가게 되고 들어갈 때 selectKey 태그에서 주키 값을 반환 받아서 Member 객체의 id 필드에 세팅해주면 됩니다.

iBATIS 소스보기

녹색 부분이 selectKey를 사용한 부분인데 영회형의 말에 따르면 이 부분이 INSERT 문 위에 와야 하는 DB도 있다고 합니다. 하지만 Postgres와 MySQL의 경우에는 INSERT문이 끝나고 해보니 되네요.

selectKey로 둘러쌓인 SELECT LAST_INSERT_ID(); 이 문장은 주키 값을 select하는 SQL입니다. 이 때 MySQL에 있는 LAST_INSERT_ID() 라는 함수를 사용하였습니다.

그리고 이 부분을 사용하는 SqlmapMemberDao 클래스의 코드에는 다음과 같이 수정합니다.

'Spring > 주소록 만들기' 카테고리의 다른 글

세련된 SQL map (iBATIS)  (0) 2006.12.04
메소드 추상화  (2) 2006.12.04
log4j.properties 파일 위치 시키기  (2) 2006.12.04
log4j 설정하기(in spring)  (0) 2006.12.02
수정해야 할 것들  (2) 2006.11.28
iBATIS에서 selectKey 사용하기  (2) 2006.11.23
MySQL 설치 시 주의 할 점  (6) 2006.11.23
DB 인코딩 문제  (0) 2006.11.20
SqlMapClientDaoSupport  (0) 2006.11.18
AbstractTransactionalDataSourceSpringContextTests  (4) 2006.11.13
회원 목록 추가  (0) 2006.11.13
top

  1. Favicon of https://duronex.tistory.com BlogIcon 사오정 2008.05.09 16:01 신고 PERM. MOD/DEL REPLY

    글 잘보고 있네여 ㅋㅋ 질문이 있어서 코멘트 남기네요.
    AUTO_INCREMENT 없이 예를들어 A테이블에 a,b 가 결합 PK 로 되어있는상태라면
    a에대한 b가 AUTO_INCREMENT 되어야하거든요 그렇게 되질않아서.
    MAX를 해서 최대값가져오면 풀스캔 일어나니깐.

    Limit 1 해서 가장 마지막거를 가져와서 + 1 해주려고하거든여.

    근데 저도 iBatis 사용하는데... selectkey 를 이용해서 해주면되겠지만 데이터가 없을때는
    그렇지 않으니깐 문제거든요..

    물론 각각의 쿼리를 별도로만들어서 하면되겠지만...

    SelectKey 를 두번 사용을 할수없나해서요... 그럼 첫번째 건이 null 이거나 행이 없는경우.
    다음 selectkey를 이용한다거나 ...

    혹시 있다면 여기에대해서 조언좀 해주세요..^^

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.05.09 21:02 신고 PERM MOD/DEL

    흠.. iBatis는 저 당시 잠시 보고 안 해봐서 새하얗게 잊어버렸습니다. 저 글을 제가 썼던 글인가 싶을 정도로 생소하네요.

    주키를 복잡하게 생성하시는 군요. 주키 값을 만드는 로직을 프로시저로 만들고 해당 프로시저를 매번 호출하도록 하는것은 어떨런지요.

    흠~ DB와 iBatis는 잘 몰라서요. ^^;

Write a comment.