jsp로 게시판을 만들면서 의문점이 몇가지 있었지만 우선 끝까지 진행을 하고 잘 모르고 따라쳤던 jsp 명령어나 java 클래스, 메서드에 대해 하나씩 뜯어보았다.
대부분 이해하고 해결했지만 페이지 처리 알고리즘에서 버그를 발견했고 버그에 대한 자세한 내용을 적은 뒤 해결해보려 한다.
해당 게시판만들기 코드에서 게시글의 갯수에 따라 목록을 보여주고 페이지를 처리하는 방식을 보면
- 게시글을 작성하면 해당 게시글에 ID를 부여한다. (PK)
- 이 ID를 게시판에서 게시글 번호로 표시한다.
리스트출력
- 새로운 게시물이 저장되면 이전 게시글 목록에서 가장 마지막에 작성된 게시글의 ID를 가져온다.
- 마지막 게시글의 ID - (현재 보는 페이지*10) 만큼의 행에서 상위 10개의 행만 골라내서 한 행씩 추가시켜준 뒤 출력한다.
다음페이지 처리
- nextPage(pageNumber+1)메서드의 리턴값이 true라면 [다음]버튼 표시
- nextPage는 표시할 게시글의 ID가 현재 페이지넘버*10 보다 크다면 true를 리턴한다.
- [다음]버튼을 클릭하면 리스트 출력 코드로 ~
중간에 있는 게시글을 삭제해도 마지막 게시글의 ID즉 마지막 게시글의 번호가 바뀌지 않아서 다음페이지를 표시하지 않아도 되는 상황에 다음페이지와 게시글리스트가 출력된다.
이 상황이 되면 현재 보고있는 페이지에 출력되는 게시글이 다음페이지에서도 중복해서 보여진다.
글을 삭제해서 현재 페이지에서 보여지는 글의 수를 10개 미만으로 만들어도 전체 글의 수로 페이지 처리를 하는 것이 아니기 때문에 다음페이지에 해당 페이지와 10 이상 차이나는 게시글이 표시된다.
select * from BBS where bbsID < getNext() - (pageNumber-1)*10 and bbsAvailable = 1;
에서
select count(*) from BBS where bbsAvailable = 1;
로 수정해서 현재 페이지 수보다 게시글이 많아야지만 true를 리턴해서 다음 버튼을 표시하도록 수정했다.
가장 최근에 작성된 게시글의 ID를 기준으로 10개씩 끊어서 현재 페이지에 표시할 게시글 리스트를 만들기 때문에 중간에 게시글이 삭제되면 현재페이지와 다음페이지에 중복된 게시글이 출력된다.
select * from BBS where bbsID < getNext() - (pageNumber-1)*10 and bbsAvailable = 1 order by bbsID desc limit 10;
에서
select * from BBS where bbsAvailable = 1 order by bbsID desc limit (pageNumber-1)*10, 10;
로 수정했다.
만약 첫번째 페이지라면 가장 최근 게시물부터 최대 10개를, 그 이후 페이지면 페이지당 게시글 10개씩 뒤로뒤로~ 최대 10개 출력
수정한 메서드는 리스트를 출력하고 다음페이지 유무를 결정할 때 이외엔 사용되지 않으니 이부분을 수정했다고 해서 다른 버그가 또 생기진 않았을 것이다.
게시글 번호를 ID말고 출력순으로 보여지게도 하고싶었지만 테이블과 게시글 리스트를 편하게 비교하기 위해 건들지 않았다.