본문 바로가기

Spring Framework 개발 일지/Spring으로 게시판 만들기

FirstSpringBoard#6-4] mysql limit 기능을 이용한 페이징

반응형

우리는 지난시간 Controller에서 페이징 처리를 했었습니다.

편의상 Controller에서 페이징을 했었는데. 이로 인해 생기는 문제점은 무엇일까요?

우선 모든 게시글의 목록을 불러오는 문제가 있습니다.

지금이야 게시글이 별로 안되지만 점점 게시물이 많아 진다면 DBMS에 부하가 엄청 생기겠죠.

모든 사용자가 게시판에서 페이지를 이동할 때 마다 DB에서 모든 게시물 목록을 가져오기 때문이죠.

그리고 마지막 페이지에 대한 분기처리와 같이 코드가 길어진다는 단점이 있습니다.

이런 문제점을 해결하기 위해서 mysql에서 제공하는 limit 기능을 이용해서 페이징 처리를 해볼게요.


우선 Mapper.xml을 수정해야합니다.

getSearchWriterAndContent를 아래와 같이 수정해주세요.

order by 뒤에 limit #{startpoint}, #{row}가 추가되었네요.

limit는 두개의 파라미터를 가집니다.

첫번째 파라미터는 보여줄 게시글의 시작입니다.

두번째 파라미터는 보여줄 게시글의 갯수입니다. 우리같은경우는 3개이죠.

이렇게 해주면 마지막 페이지에 게시물이 2개가 남더라도 2개를 그대로 넘겨줘서 복잡하게 if문을 사용할 필요가 없어집니다.




이렇게하면 전체 게시글을 list로 받아서 사용할 필요가 없어졌네요.

DB에 오는 부하도 줄이고 코드로 줄일 수 있습니다.

그런데 문제가 하나 생겼어요.

여태까지 list.size()를 통해서 전체 게시글의 갯수를 구해서 페이징 처리에 필요한 totalpage를 구했었잖아요.

그런데 이제는 list.size()를 사용할 수 없어요.

그래서 따로 DB에서 전체 게시글의 갯수를 가져와야합니다. Mapper.xml에 아래의 매퍼 구문을 추가해줍니다.

앞으로는 이 쿼리를 이용해서 totalpage를 구할겁니다.



테스틀 코드를 작성해서 매퍼 구문이 잘 작동하는지 확인해봅시다.

startpoint의 값을 바꿔서 페이징 처리가 되는지 확인해보세요.

(매퍼 인터페이스, DAO, Service 클래스 등에 메소드 추가하는 부분은 생략합니다.)



이제 컨트롤러도 수정해줍니다.

코드가 한결 깔끔해졌어요. 전 포스팅에서 Controller와 한번 비교해보세요.



검색해서 결과를 확인해보세요. 정상적으로 검색이 되나요?


검색 결과가 나오는 걸 보실 수 있습니다.

하지만 또 문제점이 있습니다.

'처음'이나 '다음' 버튼을 눌러서 페이지를 넘어가보세요.

그러면 검색결과와 상관없는 게시물들이 보일거에요.

주소창을 한번 보세요. 검색결과와 상관없는 2번째 페이지로 이동했네요.


위의 문제는 다음 포스팅에서 해결해볼게요.

다음 포스티잉 끝나면 비로소 완벽한 페이징 처리가 끝나는 셈입니다.

수고하셨습니다.


반응형