개발 일기
JAVA 게시판 만들기 4 탄 (feat. PageMaker DTO, DAO 클래스 추가 & SERVICE 클래스 만들기) 본문
Project 1. 게시판 만들기
JAVA 게시판 만들기 4 탄 (feat. PageMaker DTO, DAO 클래스 추가 & SERVICE 클래스 만들기)
개발 일기 2021. 8. 30. 20:57안녕하세요.
개인 사정이 생겨 ㅠㅠ 포스팅을 일주일 정도 못했는데요. 팀 프로젝트는 잘 마쳤고, 기존에 작성하던
프로젝트 내용에 이어서 게시판 만들기 관련 포스팅을 이어서 진행해보도록 하겠습니다.
1. 게시판 리스트의 페이징처리를 위한 PageMaker 클래스 생성 (PageMaker는 강사님께 받은 오픈소스 활용)
package com.itwill.librarian.common;
public class PageMaker {
// 페이지당 게시물 수
private int pageScale = 10;
// 화면당 페이지 수
private int blockScale = 10;
public int getPAGE_SCALE() {
return pageScale;
}
public void setPAGE_SCALE(int pAGE_SCALE) {
pageScale = pAGE_SCALE;
}
public int getBLOCK_SCALE() {
return blockScale;
}
public void setBLOCK_SCALE(int bLOCK_SCALE) {
blockScale = bLOCK_SCALE;
}
private int curPage; // 현재 페이지
private int prevPage; // 이전 페이지
private int nextPage; // 다음 페이지
private int prevGroupStartPage; // 이전 그룹시작페이지
private int nextGroupStartPage; // 다음 그룹시작페이지
private int totPage; // 전체 페이지 갯수
private int totBlock; // 전체 페이지 블록 갯수
private int curBlock; // 현재 페이지 블록
private int prevBlock; // 이전 페이지 블록
private int nextBlock; // 다음 페이지 블록
// WHERE rn BETWEEN #{start} AND #{end}
private int pageBegin; // #{start}
private int pageEnd; // #{end}
// [이전] blockBegin -> 41 42 43 44 45 46 47 48 49 50 [다음]
private int blockBegin; // 현재 페이지 블록의 시작번호
// [이전] 41 42 43 44 45 46 47 48 49 50 <- blockEnd [다음]
private int blockEnd; // 현재 페이지 블록의 끝번호
// 생성자
// PageMaker(게시물 갯수, 현재 페이지 번호)
public PageMaker(int count, int curPage){
curBlock = 1; // 현재 페이지 블록 번호
this.curPage = curPage; // 현재 페이지 설정
setTotPage(count); // 전체 페이지 갯수 계산
setPageRange();
setTotBlock(count); // 전체 페이지 블록 갯수 계산
setBlockRange(); // 페이지 블록의 시작, 끝 번호 계산
}
public PageMaker(int count, int curPage, int pageScale, int blockScale){
curBlock = 1; // 현재 페이지 블록 번호
this.curPage = curPage; // 현재 페이지 설정
this.pageScale = pageScale;
this.blockScale = blockScale;
setTotPage(count); // 전체 페이지 갯수 계산
setPageRange();
setTotBlock(count); // 전체 페이지 블록 갯수 계산
setBlockRange(); // 페이지 블록의 시작, 끝 번호 계산
}
public void setBlockRange(){
// *현재 페이지가 몇번째 페이지 블록에 속하는지 계산
curBlock = (int)Math.ceil((curPage-1) / blockScale)+1;
// *현재 페이지 블록의 시작, 끝 번호 계산
blockBegin = (curBlock-1)*blockScale+1;
// 페이지 블록의 끝번호
blockEnd = blockBegin+blockScale-1;
// *마지막 블록이 범위를 초과하지 않도록 계산
if(blockEnd > totPage) blockEnd = totPage;
// *이전을 눌렀을 때 이동할 페이지 번호
prevPage = curPage-1;
// *다음을 눌렀을 때 이동할 페이지 번호
nextPage = curPage+1;
// 마지막 페이지가 범위를 초과하지 않도록 처리
if(nextPage >= totPage) nextPage = totPage;
/***********************************************/
// 이전다음 화면그룹의 시작페이지와 끝페이지
prevGroupStartPage = blockBegin - blockScale;
//if(prevGroupStartPage < 0){// groupNo이 0인 경우(페이지 인덱스가 0~10사이)
// prevGroupStartPage = 0;
//}
nextGroupStartPage = blockBegin + blockScale;
//if(nextGroupStartPage > totPage)nextGroupStartPage=totPage;
/***********************************************/
}
public int getPrevGroupStartPage() {
return prevGroupStartPage;
}
public void setPrevGroupStartPage(int prevGroupStartPage) {
this.prevGroupStartPage = prevGroupStartPage;
}
public int getNextGroupStartPage() {
return nextGroupStartPage;
}
public void setNextGroupStartPage(int nextGroupStartPage) {
this.nextGroupStartPage = nextGroupStartPage;
}
public void setPageRange(){
// WHERE rn BETWEEN #{start} AND #{end}
// 시작번호 = (현재페이지-1)*페이지당 게시물수 +1
pageBegin = (curPage-1)*pageScale+1;
// 끝번호 = 시작번호+페이지당 게시물수 -1
pageEnd = pageBegin+pageScale-1;
}
// Getter/Setter
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getPrevPage() {
return prevPage;
}
public void setPrevPage(int prevPage) {
this.prevPage = prevPage;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getTotPage() {
return totPage;
}
public void setTotPage(int count) {
// Math.ceil(실수) 올림 처리
totPage = (int) Math.ceil(count*1.0 / pageScale);
}
public int getTotBlock() {
return totBlock;
}
// 페이지 블록(그룹)의 갯수 계산(총 100페이지라면 10개의 블록)
public void setTotBlock(int count) {
// 전체 페이지 갯수 / 10
// 91 / 10 => 9.1 => 10개
totBlock = (int)Math.ceil(count / blockScale);
}
public int getCurBlock() {
return curBlock;
}
public void setCurBlock(int curBlock) {
this.curBlock = curBlock;
}
public int getPrevBlock() {
return prevBlock;
}
public void setPrevBlock(int prevBlock) {
this.prevBlock = prevBlock;
}
public int getNextBlock() {
return nextBlock;
}
public void setNextBlock(int nextBlock) {
this.nextBlock = nextBlock;
}
public int getPageBegin() {
return pageBegin;
}
public void setPageBegin(int pageBegin) {
this.pageBegin = pageBegin;
}
public int getPageEnd() {
return pageEnd;
}
public void setPageEnd(int pageEnd) {
this.pageEnd = pageEnd;
}
public int getBlockBegin() {
return blockBegin;
}
public void setBlockBegin(int blockBegin) {
this.blockBegin = blockBegin;
}
public int getBlockEnd() {
return blockEnd;
}
public void setBlockEnd(int blockEnd) {
this.blockEnd = blockEnd;
}
}
2. List 구현용 PageMakerDto<E> 클래스 생성
package com.itwill.librarian.domain;
import java.util.List;
import com.itwill.librarian.common.PageMaker;
public class PageMakerDto<E> {
public List<E> itemList;
public PageMaker pageMaker;
public int totRecordCount;
public PageMakerDto() {
}
public PageMakerDto(List<E> itemList, PageMaker pageMaker, int totRecordCount) {
super();
this.itemList = itemList;
this.pageMaker = pageMaker;
this.totRecordCount = totRecordCount;
}
}
3. Qna List Service 메소드 생성
public class QnaService {
private QnaDao qnaDao;
private MemberDao memberDao;
private ReplyDao replyDao;
public QnaService() throws Exception {
qnaDao = new QnaDao();
}
/**
* QNA LIST 페이지
* @param currentPage (현재 페이지)
* @return
* @throws Exception
*/
public PageMakerDto<Qna> getQnaList(int currentPage) throws Exception {
// 1.전체글의 갯수
int totRecordCount = qnaDao.getQnaCount();
// 2.paging계산(PageMaker 유틸클래스)
PageMaker pageMaker = new PageMaker(totRecordCount, currentPage);
// 3.게시물데이타 얻기
List<Qna> qnaList = qnaDao.getQnaList(pageMaker.getPageBegin(), pageMaker.getPageEnd());
PageMakerDto<Qna> pageMakerQnaList = new PageMakerDto<Qna>(qnaList, pageMaker, totRecordCount);
return pageMakerQnaList;
}
4. 그 외 Qna&Reply 관련 서비스 메소드 생성
public class QnaService {
private QnaDao qnaDao;
private MemberDao memberDao;
private ReplyDao replyDao;
public QnaService() throws Exception {
qnaDao = new QnaDao();
}
/**
* QNA 상세 페이지 조회
* @param qnaNo
* @return
* @throws Exception
*/
public Qna getQnaByNo(int qnaNo) throws Exception {
return qnaDao.getQnaByNo(qnaNo);
}
/**
* QNA 작성
* @param qna
* @return
* @throws Exception
*/
public int addQna(Qna qna) throws Exception {
return qnaDao.addQna(qna);
}
/**
* QNA 게시글 조회수 증가
* @param qnaNo
* @throws Exception
*/
public void updateHitCount(int qnaNo) throws Exception {
qnaDao.increaseQnaReadCount(qnaNo);
}
/**
* QNA 공개 여부 설정
* @param qnaNo
* @return
* @throws Exception
*/
public int openSettings(int qnaNo) throws Exception {
return qnaDao.openSettings(qnaNo);
}
/**
* QNA 작성 글 수정
* @param qna
* @throws Exception
*/
public void modifyQna(Qna qna) throws Exception {
qnaDao.modifyQna(qna);
}
/**
* QNA 작성 글 삭제
* @param qnaNo
* @throws Exception
*/
public void removeQna(int qnaNo) throws Exception {
qnaDao.removeQna(qnaNo);
}
/**
* QNA 답변 작성
* @param reply
* @throws Exception
*/
public void addReply(Reply reply) throws Exception {
qnaDao.addReply(reply);
}
/**
* QNA 답변 삭제
* @param reply
* @throws Exception
*/
public void removeReply(int replyNo) throws Exception {
qnaDao.removeReply(replyNo);
}
/**
* QNA 답변 수정
* @param reply
* @throws Exception
*/
public void modifyReply(Reply reply) throws Exception {
qnaDao.modifyReply(reply);
}
}
개인적으로,, 게시판 관련 내용중 최고난도 부분이라고 생각을 했고,
강사님이 전달 주신 오픈소스를 활용해서 저희 팀에서 사용이 가능하도록 짜서 진행했습니다.
감사합니다.
'Project 1. 게시판 만들기' 카테고리의 다른 글
JAVA 게시판 만들기 5 탄 (feat. jsp페이지 적용하기) (0) | 2021.08.31 |
---|---|
JAVA 게시판 만들기 3 탄 (feat. DAO 클래스 만들기 2 (DB관련 필요 서비스 내용 + 댓글(reply) 추가하기) ) (0) | 2021.08.22 |
JAVA 게시판 만들기 2 탄 (feat. DAO 클래스 만들기 (CRUD 구현하기) ) (0) | 2021.08.20 |
JAVA 게시판 만들기 1 탄 (feat. aquerytool 테이블 설계, DTO 클래스 만들기 ) (0) | 2021.08.19 |
Comments