일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- service
- spring
- MVC CRUD
- Connection pool
- 환경설정
- CRUD
- 서비스계층
- log4j
- MVC설정
- 게시판만들기
- mybatis
- Oracle
- MVC 게시판
- 게시판 List
- hikaricp
- log4jdbc
- jdbc
- MVC
- Controller
- 게시판
- Oracle 연결
- delete
- update
- Today
- Total
yahayaha
14. MyBatis로 Spring페이징 처리하기. 본문
페이징 처리를 하기 전
Index와 order by
Rownum
인 라인 뷰
이 세가지의 개념을 잡고 오는게 좋음.
먼저 페이징 처리를 위해서 필요한 파라미터는
1. 페이지 번호(pageNum)
2. 한 페이지당 몇 개의 데이터(amount)
를 보여줄 것인지 결정 되어야함.
그럼 작업 시작
먼저 domain 패키지에 Criteria 클래스 생성.
Criteria는 DTO개념으로 생각하면됨.
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Criteria {
private int pageNum;
private int amount;
public Criteria() {
this(1,10);
}
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
}
pageNum이랑 amount는 기본값을 1페이지, 10개씩 지정해서 처리하고, Lombok을 이용해서 getter / setter를 생성함.
그리고 BoardMapper 인터페이스에 내용을 추가.
파라미터를 받아서 나중에 SQL을 처리하는 부분이 필요함.
public List<BoardVO> getListWithPageing(Criteria cri);
그리고 boardmapper.xml에 sql작성.
근대 여기서 문제가 되는게 부등호 부분에서 문제가 발생함.
이 부분은 xml 파싱이나 처리를 하면 안된다라는걸 이야기 해줘야하는데
그걸 하는게 CDATA
<select id="getListWithPageing" resultType="org.zerock.domain.BoardVO">
<![CDATA[
select * from
(
select /*+ INDEX_DESC(tbl_board pk_board) */rownum rn, bno, title, writer
from tbl_board
where bno > 0 and rownum > 0 and rownum <= (2 * 10)
)
where rn > ( 2 - 1 ) * 10;
]]>
</select>
<!CADATA[]]>로 감싸놓은 부분은 xml로 처리를 하지 않음.
여기까지 완료가 되었다면 테스트 코드를 돌려보는게 좋음.
BoardMapperTests에 테스트 추가
@Test
public void testPaging() {
//1페이지 10개 (1,10)
Criteria cri = new Criteria();
List<BoardVO> list = mapper.getListWithPageing(cri);
list.forEach(b -> log.info(b));
}
한번 실행해보면.
실패해버림
오류 로그를 읽어보면.
Caused by: Error : 911, Position : 204, SQL = select * from ( select /*+ INDEX_DESC(tbl_board pk_board) */rownum rn, bno, title, writer from tbl_board where bno > 0 and rownum > 0 and rownum <= (2 * 10) ) where rn > ( 2 - 1 ) * 10;, Original SQL = select * from ( select /*+ INDEX_DESC(tbl_board pk_board) */rownum rn, bno, title, writer from tbl_board where bno > 0 and rownum > 0 and rownum <= (2 * 10) ) where rn > ( 2 - 1 ) * 10;, Error Message = ORA-00911: invalid character at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:710) ... 71 more ERROR: jdbc.sqltiming - 1. PreparedStatement.execute() FAILED! select * from ( select /*+ INDEX_DESC(tbl_board pk_board) */rownum rn, bno, title, writer from tbl_board where bno > 0 and rownum > 0 and rownum <= (2 * 10) ) where rn > ( 2 - 1 ) * 10; {FAILED after 5 msec} java.sql.SQLSyntaxErrorException: ORA-00911: invalid character |
문자 부적격하다는 뜻의 ORA-00911이 나타난걸 볼 수 있음
이건 세미콜론( ; )때문임. mapper.xml에서 세미콜론 존재 확인
세미콜론 삭제 후 다시 테스트.
테스트 성공적으로 완료.
근대 아까 Criteria 클래스를 작성할떄 미리 기본값을 정해놨음 이걸 boardmapper.xml에 추가 수정을 할거임.
<select id="getListWithPageing" resultType="org.zerock.domain.BoardVO">
<![CDATA[
select * from
(
select /*+ INDEX_DESC(tbl_board pk_board) */rownum rn, bno, title, writer
from tbl_board
where bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount})
)
where rn > ( #{pageNum} - 1 ) * #{amount}
]]>
</select>
쿼리를 수정 했으니 다시 테스트를 진행.
INFO : jdbc.sqltiming - select * from ( select /*+ INDEX_DESC(tbl_board pk_board) */rownum rn, bno, title, writer from tbl_board where bno > 0 and rownum > 0 and rownum <= (1 * 10) ) where rn > ( 1 - 1 ) * 10 {executed in 180 msec} |
최종적으로 실행되는 SQL문임.
이제 BoardController와 BoardService에도 적용을 시켜야함.
먼저 BoardService에 getList를 하나 더 만듬.
BoardService에도 수정이 이루어졌으니 그에 대한 테스트를 진행.
그리고 Controller에도 수정 기존 BoardController의 list()는 아무런 파라미터가 없이 처리되었기에 pageNum과 amount를 처리하기 위해서 수정을 해야함.
그리고 서버를 실행해서 정상적으로 10개만 출력이 되는지 확인.
10개씩은 나오는데 날짜가 나오지 않음.
이건 데이터베이스에서 가져올떄 비어있는 부분을 안가져와서 그럼
이걸 수정 해야함 boardmapper.xml로 가서 추가작업 진행.
그리고 다시 확인을 해보면 정상적으로 출력되는게 확인됨.
'spring > 프로젝트' 카테고리의 다른 글
16. 페이징 이벤트 처리(조회 / 리스트 ) (2) | 2024.01.27 |
---|---|
15. 페이징 화면 처리 (0) | 2024.01.27 |
13. 게시물 수정과 삭제. (0) | 2024.01.27 |
12. 조회 처리하기. (0) | 2024.01.27 |
11. 목록 화면에 처리하고 등록하기 (JSTL) (2) | 2024.01.24 |