게시판을 만들다 보면 게시글 번호를 가져야 되는데 

PRIMARY KEY, AUTO_INCREMENT 가진 컬럼으로 지정 할 경우 

게시물이 삭제 되면 그 번호가 없는 게시판이 출력이 되게 된다.

 

게시물이 삭제가 되도 번호는 순서대로 유지되게 하려면 일단 컨트롤러에서 코드 작성이 필요

 

예 ) 게시물이 34개인 출력은 10개 총 페이지 갯수는 4페이지인 경우

1페이지에서는 34 ~ 25 번호

2페이지에서는 24 ~ 15 번호

3페이지에서는 14 ~ 5 번호

4페이지에서는 4 ~ 1 번호

이렇게 출력이 되야 된다.

 

int p1 = total - 0;
int p2 = total - 10;
int p3 = total - 20;
int p4 = total - 30;

 

이렇게 페이지마다 첫번째 값을 구하는 규칙적인 계산식이 나오게 된다.

 

최종적으로

 

1pge인 경우
int startRowNo = total - (1-1)*10;
2pge인 경우
int startRowNo = total - (2-1)*10;
1, 2는 viewPage 현재 보고 있는 페이지 번호로 설정 하면 된다.

int startRowNo = total - (viewPage - 1)*unit;

unit은 보여줄 게시물 갯수

 

model.addAttribute("rowNumber", startRowNo); JSP에 보내기

 

JSP 코드 (JSTL)

	<c:set var="cnt" value="${rowNumber }" /> <!-- 번호에서 사용 할 변수 -->
		
	<c:forEach var="result" items="${resultList }">
		<tr align="center">
			<td width="15%"><c:out value="${cnt }" /></td>
			<td align="left" width="40%"><c:out value="${result.title }" /></td>
			<td width="15%"><c:out value="${result.name }" /></td>
			<td width="15%"><c:out value="${result.rdate }" /></td>
			<td width="15%"><c:out value="${result.hits }" /></td>
		</tr>
		
	<c:set var="cnt" value="${cnt-1 }" /> 
	
	</c:forEach>

 

'전자정부프레임워크' 카테고리의 다른 글

상세보기 + 조회수  (0) 2024.01.06
검색 기능 + 페이징 처리  (1) 2024.01.06
오라클, MySQL 페이징 쿼리문 + iBATIS  (0) 2024.01.05
log4j2.xml  (2) 2024.01.04
패키지 등록  (1) 2024.01.02

 

오라클 ( rownum 지원 )

 

MySQL ( MySQL 8버전 이상 row_number() 지원 )

		select b.* from (
        select row_number() over (order by unq desc) as rn, a.* from (
        
		 select	unq ,title, name, hits, DATE_FORMAT(rdate, '%Y-%m-%d')as rdate
		 from nboard

		 order by unq desc ) as a ) as b
         
         where rn >=11 and rn <= 20;

 

 

 

<, > 사용 할 수 없기 때문에 밑에 처럼 의미 부여를 위해 CDATA 사용해야됨

	<select id="boardDAO.selectNBoardList" resultClass="egovMap">
	

				select b.* from (
        select row_number() over (order by unq desc) as rn, a.* from (
        
		 select	unq ,title, name, hits, DATE_FORMAT(rdate, '%Y-%m-%d')as rdate
		 from nboard

		 order by unq desc ) as a ) as b
        <![CDATA[
         where rn >=11 and rn <= 20
         
         ]]>
         
	</select>

 

 

 

게시글 갯수를 알아야 되기 때문에 count(*) 필요

	<select id="boardDAO.selectNBoardTotal" resultClass="java.lang.Integer">
		select count(*) total from nboard
	</select>

 

 

VO에 get, set 처리 

	private int viewPage = 1;
	private int startIndex = 1;
	private int endIndex = 10;

 

 

Controller 코드 안에 주석 확인 ( 계산식 중요 ) 

	@RequestMapping("/boardList.do")
	public String selectNBoardList(BoardVO vo, ModelMap model) throws Exception{
		
		int total = boardService.selectNBoardTotal(vo);
		
		// (double)12/10 -> ceil(1.2) -> Integer(2.0) -> 2
		// ceil => 1.2, 1.1 이던 전부 2.0으로 변환
		int totalPage = (int) Math.ceil((double)total / 10);
		
		int viewPage = vo.getViewPage();
		// 1-> 1,10 // 2-> 11,20 // 3-> 21,30
		
        // 정상적이지 않는 경로로 들어왔을 때 viewpag = 1 설정
		if(viewPage > totalPage || viewPage < 1) {
			
			viewPage = 1;
			
		}
        
		int startIndex = (viewPage-1)* 10 + 1 ;
		int endIndex = startIndex + (10-1);
		// startIndex : (1-1)*10 + 1 -> 1
		// startIndex : (2-1)*10 + 1 -> 11
		
		// vo에 담기
		vo.setStartIndex(startIndex);
		vo.setEndIndex(endIndex);
		
		List<?> list = boardService.selectNBoardList(vo);
		
		System.out.println("list = " + list);
		
		model.addAttribute("resultList", list);
		
		model.addAttribute("total", total);
		model.addAttribute("totalPage", totalPage);
		
		return "board/boardList";
	}

 

 

SQL WHERE startIndex, endIndex 확인 

	<select id="boardDAO.selectNBoardList" resultClass="egovMap">
	
	
				select b.* from (
        select row_number() over (order by unq desc) as rn, a.* from (
        
		 select	unq ,title, name, hits, DATE_FORMAT(rdate, '%Y-%m-%d')as rdate
		 from nboard

		 order by unq desc ) as a ) as b
         
         <![CDATA[
         where rn >= #startIndex# and rn <= #endIndex#
         
         ]]>
         
	</select>

 

 

JSP 페이지 번호 처리

	<div style="width:600px; margin-top:5px; text-align:center;">
		
		<c:forEach var="i" begin="1" end="${totalPage }">
			
			<a href="boardList.do?viewPage=${i }"> ${i }</a> 
			
		</c:forEach>
		
	</div>

 

'전자정부프레임워크' 카테고리의 다른 글

상세보기 + 조회수  (0) 2024.01.06
검색 기능 + 페이징 처리  (1) 2024.01.06
행 번호 관련  (0) 2024.01.06
log4j2.xml  (2) 2024.01.04
패키지 등록  (1) 2024.01.02
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="java.sql" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="egovframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
          <!-- log SQL with timing information, post execution -->
        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="org.springframework" level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

 

java.sql level="DEBUG"로 설정하고 페이지를 새로 고침하면 밑에 처럼 Console에서 SQL 쿼리 관련 로그 추적하는데 

유용 INFO는 기본적인 정보만 제공되어서 출력 DEBUG는 상세한 정보를 얻을 수 있음

 

 

 

2024-01-04 19:33:07,119 DEBUG [egovframework.rte.psl.orm.ibatis.SqlMapClientTemplate] Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@485d9863] for iBATIS operation
2024-01-04 19:33:07,131 DEBUG [java.sql.Connection] {conn-100000} Connection
2024-01-04 19:33:07,136 DEBUG [egovframework.rte.psl.orm.ibatis.SqlMapClientTemplate] Obtained JDBC Connection [Transaction-aware proxy for target Connection  from DataSource [org.apache.commons.dbcp2.BasicDataSource@71c45428]] for iBATIS operation
2024-01-04 19:33:07,141 DEBUG [java.sql.Connection] {conn-100000} Preparing Statement:    SELECT unq, title, name, hits, DATE_FORMAT(rdate, '%Y-%m-%d') as rdate   FROM nboard   ORDER BY unq DESC;  
2024-01-04 19:33:07,645 DEBUG [java.sql.PreparedStatement] {pstm-100001} Executing Statement:    SELECT unq, title, name, hits, DATE_FORMAT(rdate, '%Y-%m-%d') as rdate   FROM nboard   ORDER BY unq DESC;  
2024-01-04 19:33:07,645 DEBUG [java.sql.PreparedStatement] {pstm-100001} Parameters: []
2024-01-04 19:33:07,646 DEBUG [java.sql.PreparedStatement] {pstm-100001} Types: []
2024-01-04 19:33:07,667 DEBUG [java.sql.ResultSet] {rset-100002} ResultSet
2024-01-04 19:33:07,683 DEBUG [java.sql.ResultSet] {rset-100002} Header: [unq, title, name, hits, rdate]
2024-01-04 19:33:07,683 DEBUG [java.sql.ResultSet] {rset-100002} Result: [3, test3, 홍길동, 0, 2024-01-04]
2024-01-04 19:33:07,683 DEBUG [java.sql.ResultSet] {rset-100002} Result: [2, test2, 개발, 0, 2024-01-04]
2024-01-04 19:33:07,683 DEBUG [java.sql.ResultSet] {rset-100002} Result: [1, test111, 개발, 0, 2024-01-03]
list = [{unq=3, title=test3, name=홍길동, hits=0, rdate=2024-01-04}, {unq=2, title=test2, name=개발, hits=0, rdate=2024-01-04}, {unq=1, title=test111, name=개발, hits=0, rdate=2024-01-03}]

 

 

additivity = Logger 설정에서 사용, 부모 로거에게 전파할지 여부를 결정 

true(기본값) 설정 시 상위 로거에도 전달, 로그 메시지가 중복되어 여러 Appenders에 출력 될 수 있음 

예 ) com.example.myapp 로거가 있다고 하면 이 경우, 상위 로거는 com.example

com.example의 상위 로거는 com

가장 상위에는 Root로거가 있음

 

false로 설정 시 로그 이벤트는 오직 해당 로거에 연결된 Appenders에만 전달, 상위 로거로는 전파되지 않음, 중복 로깅 방지

 

 

name="java.sql"(패키지) = 데이터베이스 연결, SQL쿼리, 트랜잭션 관리 등

name="egovframework" = 해당 프레임워크 관련 컴포넌트의 작동 방식, 내부 처리 과정 등

name="jdbc.sqltiming" = SQL 쿼리 실행 시간 관련 

name="org.springframework" = Spring 내부 작동 방식, 빈 초기화, 스프링 컨텍스트 설정, 요청 처리 과정 등 

'전자정부프레임워크' 카테고리의 다른 글

상세보기 + 조회수  (0) 2024.01.06
검색 기능 + 페이징 처리  (1) 2024.01.06
행 번호 관련  (0) 2024.01.06
오라클, MySQL 페이징 쿼리문 + iBATIS  (0) 2024.01.05
패키지 등록  (1) 2024.01.02

 

Ctrl + Shift + R

해당 단축키로 쉽게 파일 찾을 수 있음 ( 주의 : 찾고 있는 프로젝트에 있는 파일이 맞는지 확인 할 것 ) 

 

 

 

기존 egovframework만 있던거에 main 추가 

 

 

 

 

 

위와 동일하게 main 추가

'전자정부프레임워크' 카테고리의 다른 글

상세보기 + 조회수  (0) 2024.01.06
검색 기능 + 페이징 처리  (1) 2024.01.06
행 번호 관련  (0) 2024.01.06
오라클, MySQL 페이징 쿼리문 + iBATIS  (0) 2024.01.05
log4j2.xml  (2) 2024.01.04

 

 

자기 브런치 커밋, 푸쉬

git remote update 

git remote -v => 현재 로컬 Git 저장소에 등록된 원격 저장소의 목록과 URL을 보여줍니다.

이 명령어는 각 원격 저장소의 이름과 함께, 데이터를 'fetch' (가져오기) 및 'push' (보내기)

github  https://github.com/cojuns/LPuniv_LMS_TeamProject.git (fetch)
github  https://github.com/cojuns/LPuniv_LMS_TeamProject.git (push)
origin  https://github.com/Jlostcode/LPuniv.git (fetch)
origin  https://github.com/Jlostcode/LPuniv.git (push)

git add .  => 변경 사항을 스테이징 영역에 추가

git commit -m "메시지 작성"

git push origin 브랜치이름 => 원하는 브랜치 이름 작성

 

 

 

git remote update -> git 최신버전으로 업데이트
git checkout develop -> 브런치 develop 이동
git pull origin develop -> 브런치 develop 최신버전 
git checkout [본인브런치] -> 본인브런치 이동
git pull origin develop -> 자신의 브런치(프로젝트) develop으로 최신화

'코드 정리' 카테고리의 다른 글

AWS_EC2 배포 관련 (SpringBoot_gradle )  (0) 2024.01.22
Vue.js 실전_ 연습 순서  (0) 2023.11.08
스프링 시큐리티_구글 소셜로그인_DB연결  (0) 2023.11.01
Vue.js basic  (0) 2023.11.01
local=> Git  (0) 2023.11.01

+ Recent posts