본문 바로가기

일경험

[국민취업지원제도 일경험프로그램 18일차] 게시판 페이징 Dao, service 코드

반응형

18일 차 특이사항

1. 게시판 페이징 기능 구현 완료. 

2. 게시판 페이징 원리 

  • 컨트롤러(Controller)에서 사용자의 URL 요청을 받습니다.
  • 서비스(Service) 클래스에서는 요청을 처리하기 위한 비즈니스 로직을 구현, 필요한 Data를 DB에 요청
  • 이때 사용하는 것이 Dao입니다. Dao를 사용하여 데이터베이스에 접근합니다. 
  • Dao는 데이터베이스와의 통신을 담당하며, 데이터베이스에서 데이터를 조회, 쓰기, 수정, 삭제 등의 작업을 수행
  • Dao가 데이터를 가져오면, 서비스 클래스에서는 필요한 데이터 가공 및 비즈니스 로직을 수행
  • 서비스 클래스는 처리 결과를 컨트롤러로 반환
  • 컨트롤러는 처리 결과를 뷰(View)에 전달하여 사용자에게 보여줍니다.

소스 코드 

페이징 처리와 검색 기능을 처리하려면 service 클래스에서 조작 과정이 필요하다. 

 

1) BoardDaoImpl.java

@Repository("dao")
public class BoardDaoImpl implements BoardDao{
	
	@Inject
	public SqlSessionTemplate sqlSession;
	
	@Override
	public List<Map<String, Object>> list(Map<String, Object> paramMap) {
		// TODO Auto-generated method stub
		return sqlSession.selectList("mapper.list", paramMap);
	}
	
	@Override
	public int pageMap(Map<String, Object> paramMap) {
		// TODO Auto-generated method stub
		return sqlSession.selectOne("mapper.pageMap", paramMap);
	}
	
	@Override
	public int insert(Map<String, Object> map) {
		// TODO Auto-generated method stub
		return sqlSession.insert("mapper.insert", map);
	}

	@Override
	public int delete(int seq) {
		// TODO Auto-generated method stub
		return sqlSession.delete("mapper.delete", seq);
	}
	
	@Override
	public int update(BoardDto boardDto) {
		// TODO Auto-generated method stub
		return sqlSession.update("mapper.update", boardDto);
	}
}

 

2) BoardServiceImpl.java

@Service("service")
public class BoardServiceImpl implements BoardService{
	
	@Inject
	public BoardDao dao;
	
	@Override	
	public List<Map<String, Object>> list(Map<String, Object> paramMap) {
		int curPage=0;
		int pageScale=0;
		
		if(paramMap.isEmpty()) {
			curPage = 1;
			pageScale = 10;
		}else {
			curPage = Integer.parseInt(paramMap.get("curPage").toString());
			pageScale = Integer.parseInt(paramMap.get("pageScale").toString());
		}
		
		int pageBegin = (curPage - 1) * pageScale + 1;
		int pageEnd = pageBegin+pageScale - 1;
		
		paramMap.put("pageBegin", pageBegin);
		paramMap.put("pageEnd", pageEnd);
		
		return dao.list(paramMap);
	}

	@Override
	public Map<String, Object> pageMap(Map<String, Object> paramMap) {
		int count = dao.pageMap(paramMap); // 총 게시글 수
		int pageScale = 10; 			   // 페이지당 게시글 수
		int blockScale = 5;				   // 페이징 번호 5개 출력
		int curPage = paramMap.get("curPage") == null ? 1 : Integer.parseInt(paramMap.get("curPage").toString());
		int totPage = (int) Math.ceil(count * 1.0 / pageScale);
		int totBlock = (int) Math.ceil(totPage / blockScale);
		
		// *현재 페이지가 몇번째 페이지 블록에 속하는지 계산
		int curBlock = (int) Math.ceil((curPage - 1) / blockScale) + 1;
		
		// *현재 페이지 블록의 시작, 끝 번호 계산
		int blockBegin = (curBlock-1) * blockScale + 1;

		// 페이지 블록의 끝번호
		int blockEnd = blockBegin + blockScale - 1;
		
		// *마지막 블록이 범위를 초과하지 않도록 계산
		if(blockEnd > totPage) blockEnd = totPage;
		
		// *이전을 눌렀을 때 이동할 페이지 번호
		int prevPage = (curPage == 1) ? 1:(curBlock-1) * blockScale;

		// *다음을 눌렀을 때 이동할 페이지 번호
		int nextPage = curBlock > totBlock ? (curBlock * blockScale) : (curBlock * blockScale) + 1;

		// 마지막 페이지가 범위를 초과하지 않도록 처리
		if(nextPage >= totPage) nextPage = totPage;

		Map<String, Object> pageMap = new HashMap<String, Object>();
		pageMap.put("curBlock", curBlock); 
		pageMap.put("prevPage", prevPage);
		pageMap.put("blockBegin", blockBegin); 
		pageMap.put("blockEnd", blockEnd);
		pageMap.put("curPage", curPage);
		pageMap.put("totBlock", totBlock);
		pageMap.put("nextPage", nextPage); 
		pageMap.put("totPage", totPage);

		return pageMap;
	}
	
	@Override
	public int insert(Map<String, Object> map) {
		// TODO Auto-generated method stub
		return dao.insert(map);
	}
	
	@Override
	public int delete(int seq) {
		// TODO Auto-generated method stub
		return dao.delete(seq);
	}

	@Override
	public int update(BoardDto boardDto) {
		// TODO Auto-generated method stub
		return dao.update(boardDto);
	}
}

 

검색 후 페이지 블락 클릭 시 오류

게시판 페이징

특정 키워드를 검색하고 아래 페이지 블락을 클릭하면 검색 키워드가 풀려버린다. 검색조건을 남기는 작업 필요하다. 어떻게 할지 고민해 봐야겠다. 

반응형