목록에서 페이징에 도전 이전글에 이어서 2부를 이어나가겠다.
페이징 부분과 관련지어서 꼭 필요한 내용이 검색어가 되겠다. 그래서, 전에도 밝힌바 Parameters라는 클래스를 하나 둬서, 그 곳에 페이징 관련 값과 검색어 관련 값을 설정토록 하였다.
이 Parameters 클래스를 iBATIS에 잘 써먹기 위해서 queryForList( arg0, arg1, arg2, arg3 ) 이 메소드를 사용하기로 하였다.
여기까지가 전까지 작성된 부분이다.
이번에는 어떻게 작성된 Parameters 클래스를 queryForList를 통해 잘 사용 할 수 있을까 고민해보자.
수행할 과정은 이렇다.
1. Controller에서 bind 메소드를 통해서, Parameters 클래스에 request에서 넘어오는 파라미터들을 바인드시킨다.
2. Service 인터페이스를 약간 수정해서, 리스트 메소드를 호출할때 인자값으로 바인드된 Parameters 클래스 레퍼런스를 넘겨준다.
3. Serivce 를 통과 결국 Dao까지 넘어온 파라미터 클래스 레퍼런스는 getSqlMapClientTemplate().queryForList(arg0,arg1,arg2,arg3) 메소드를 호출하도록 한다.
4. queryForList 메소드는 첫째 인자값인 iBatis 매퍼를 찾아서 쿼리를 만들게 되는데, 여기서 두번째 인자로 우리가 만든 Parameters 클래스를 넘겨주면 되겠다. 셋째와 넷째 인자는 범위값들이다.
2. Service 인터페이스를 약간 수정해서, 리스트 메소드를 호출할때 인자값으로 바인드된 Parameters 클래스 레퍼런스를 넘겨준다.
3. Serivce 를 통과 결국 Dao까지 넘어온 파라미터 클래스 레퍼런스는 getSqlMapClientTemplate().queryForList(arg0,arg1,arg2,arg3) 메소드를 호출하도록 한다.
4. queryForList 메소드는 첫째 인자값인 iBatis 매퍼를 찾아서 쿼리를 만들게 되는데, 여기서 두번째 인자로 우리가 만든 Parameters 클래스를 넘겨주면 되겠다. 셋째와 넷째 인자는 범위값들이다.
과연 파라미터들은 잘 넘어갈까? 특히나 우리가 만든 Parameters 클래스의 파라미터들이 잘 넘어갈까가 검증의 핵심이 될 것 같다.
답은?
more..
잘 넘어간다.^^
<select id="listManager" resultMap="result">
SELECT user_id
FROM user
<isParameterPresent prepend="WHERE">
<isNotEmpty property="searchText">
user_id = #searchText# or user_id='%$searchText$%'
</isNotEmpty>
</isParameterPresent>
ORDER BY regdate DESC
</select>
간단하게 user_id가 파라미터로 넘겨온 값과 일치한지를 따져서 결과셑을 resultMap에 매핑해준다. SELECT user_id
FROM user
<isParameterPresent prepend="WHERE">
<isNotEmpty property="searchText">
user_id = #searchText# or user_id='%$searchText$%'
</isNotEmpty>
</isParameterPresent>
ORDER BY regdate DESC
</select>
검색을 할 수도 있고, 안 할 수도 있으므로 동적쿼리를 사용했다. 여기서 생각해 볼만한 문제가 있다.
user_id = #searchText# or user_id='%$searchText$%'이 부분은 일부러 이렇게 처리해봤다. 음... 두개 모두 같은 값을 가져온다.
#searchText#로 쓰던 $searchText$로 쓰던 공히 넘어온 값을 찍는데 성공했다. 이 둘의 차이점은 쿼리에서 명백해진다.
쿼리 결과는 이렇게 찍힌다.
user_id=? or user_id='%test_id%'둘의 차이를 바로 알 수가 있다. iBatis의 파라미터로 처리하게 되면 기본적으로 PreparedStatement로 처리를 해줘서 쿼리에 "?"가 찍히게 되는 것이었다.!!!
$searchText$로 쓰는 것의 단점은 알다시키 SQL Injection의 여지를 주는 것이기에, 생각해 보니 #searchText#로 써야겠다.
어쿠~!! 페이징 하려다가 그만 검색하는 쪽으로 빠져버렸네.
다음에는 페이징에 집중해 보자.
반응형
'Spring framework > Spring' 카테고리의 다른 글
Spring IDE 2.0 final 기사 간단 요약 (0) | 2010.05.07 |
---|---|
목록에서 페이징에 도전 [3부] (0) | 2010.05.07 |
목록에서 페이징에 도전 (0) | 2010.05.07 |
MultiActionController에서 bind 할때 오류 (0) | 2010.05.07 |
Spring에서 한글이 말썽일때... (0) | 2010.05.07 |
최근댓글