본문 바로가기

국비과정/Spring

20230726 _[38일차]_01. Spring 게시판 페이징

SQL 활용 시험 봤다

 

( SQL _ if문 사용 )

SELECT IF( 조건문, 참일때값, 거짓일때값 ) AS '필수여부' FROM (TABLE)

 

 

SELECT if ( 1=1, '1은 1입니다.', '1이 아닙니다.' )
FROM DUAL

       가상테이블

조건문 1=1 참이니까  '1은 1입니다.' 출력

 

NOW() 를 이용해서 년월일 추출

 

NOW() 에서 년월일 & 시분초 를 분리해서 출력해보자

 

SELECT DATE_FORMAT(NOW(), '%Y-%M-%d') AS '날짜',
               DATE_FORMAT(NOW(), '%H:%I:%s') AS '시간'
FROM DUAL

 

Y (대문자) => 2023  //  y (소문자) => 23

H (대문자) => 24시간  //  h (소문자) => 12시간 (으로 표현)


(% 표기법 참고)

DATE_FORMAT - MariaDB Knowledge Base

 

DATE_FORMAT

Formats the date value according to the format string.

mariadb.com


Now() 를 활용해서 

오늘 작성한 글이면 시분초를 써주고, 이전에 작성된 글이면 년월일을 써주자

 

 

(쿼리문)

SELECT 
if (
DATE_FORMAT(NOW(), '%Y-%m-%d') =
DATE_FORMAT(bdate, '%Y-%m-%d') ,
'같아요', '달라요'
)
FROM board
LIMIT 10;

 

Now() 로 뽑아낸 년월일(오늘)과  bdate에서 뽑아낸 년월일을 비교하는 조건식

참이면 => 같아요

거짓이면 => 달라요

 

오늘 게시판에 글을 1개 새로 써보면 

오늘 쓴 글에 대해서는 '같아요' 라고 뜬다

 

'같아요' 대신 시분초 넣어주고, 

'달라요' 대신 년월일 넣어주자

 

(쿼리문)

SELECT 
if(
DATE_FORMAT(NOW(), '%Y-%m-%d')=
DATE_FORMAT(bdate, '%Y-%m-%d'),           => 조건식
DATE_FORMAT(bdate, '%H:%i:%s'),             => 참일때 나올값 (시분초)
DATE_FORMAT(bdate, '%Y-%m-%d')            => 거짓일때 나올값(년월일)
AS bdate
FROM board
ORDER BY bno DESC
LIMIT 10;

 

이 if문을 boardview 에다가 추가해서 수정해주자

boardview - CREATE 코드에서 bdate 대신 위의 if 조건문 넣어주기

노란부분 대신에 아래만큼 넣기

if(
DATE_FORMAT(NOW(), '%Y-%m-%d')=
DATE_FORMAT(bdate, '%Y-%m-%d'),        
DATE_FORMAT(bdate, '%H:%i:%s'),       
DATE_FORMAT(bdate, '%Y-%m-%d')      
) AS bdate

 

아래처럼 자동으로 정리가 되어서 NOW() => current_timestamp() 로 변경된다

 

그럼 이제 게시판에서

오늘 쓴글은 '시분초'가 뜨고

이전에 쓴글은 '년월일'만 뜬다


 

 


 

이제 페이징을 하려나보다

 

egovframework:rte:ptl:view:paginationtag [eGovFrame]

 

egovframework:rte:ptl:view:paginationtag [eGovFrame]

전자정부프레임워크에서는 페이징 처리의 편의를 위해 <ui:pagination/> 태그를 제공한다. 페이징 기능을 사용할때 기능은 유사하지만 이미지나 라벨등의 포맷만 다양하게 사용하게 되는 경우가 있

www.egovframe.go.kr

 

변수들 & 메소드들 정리되어있음 

 

 

총 글의 수는 아래처럼 193개인데

한 화면에 10개씩 보이게 할거니까

193 / 10 = 19.3 

=> 총 20페이지가 되도록 해야함 (소수점이 있다면 올림해줘야함) 


예를들어 168개의 글이라면

페이지는 1 ~10 까지 하나, 11~17까지 둘


이제 저장소를 추가해주자

pom.xml에다가

repository & 전자정부페이징 추가해주기

저장해주면 요렇게 아래에 파일들이 잘 들어가 있다.

 

게시판 에러 안나는지 확인~

 

위의 홈페이지에서 아래 코드 따와서

root-context.xml 에다가 추가해주기 _ 근데 에러난다 

아래 밑줄있는 클래스가 없어서  => 수정해주자

아래처럼 패키지명 수정해주기

위에서 객체가(bean이) 총 세개

1. imageRenderer

2. textRenderer

3. paginationManager

 

그런데

imageRenderer 와 textRenderer 는 각각 image, text라는 id로 paginationManager에 들어가 있으니

우린 맨아래 paginationManager만 가져다가 쓰면 된다.

일단 첫번째에서 ImagePaginationRenderer 클래스에 있는 객체를 id인 "imageRenderer"로 가져와서 사용하자.

이렇게 root에 경로 먼저 넣어줬으니 패키지 & 클래스 생성하자

 

com.phyho.util 패키지 생성

그 내부에 ImagePaginationRenderer 클래스 생성

 

요렇게 만들고 싶음

ImagePaginationRenderer 가져올거야

홈페이지에서 코드 가져오자

ImagePaginationRenderer  클래스에 넣어줘

 

홈페이지에서 아래 컨트롤러부분 참고해서 만들어보자


boardController

@GetMapping("/board") 부분에서 처리해주자 

 

 

PaginationInfo paginationInfo = new PaginationInfo(); 

=> 객체생성 _ 한국에서 만든거라 한글로 설명이 뜬다

여기에 값을 넣어서 DB로 보내서 JSP에 띄울거다.

 

model.addAttribute("paginationInfo", paginationInfo);

요 paginationInfo를 "paginationInfo" 라는 이름으로 model에 붙여서 db로 같이 보내자

paginationInfo  요기 안에 필요한 값들 넣어줌

현재 페이지번호 & 한페이지에 게시되는 게시물 수 & 페이징 리스트 사이즈 & 전체 게시물 수

 

전체 게시글 수 (totalCount) 가져오는 기능인 totalCount() 메소드 생성해서 서비스에게 일을 시키자

가져온 totalCount 를 paginationInfo에 넣어줌!

밑줄클릭_ 서비스에 totalCount() 메소드 생성

서비스에서도 totalCount() 메소드 실행시켜서  DAO한테 일시켜

밑줄클릭_ DAO에 totalCount() 메소드 생성

 

DAO도 totalCount() 메소드 실행시켜서 mapper한테 일시켜

board-mapper 에서는 totalcount 를 가져오는 쿼리문 실행시켜

 

이렇게 받아온 totalcount 값을 가져와서 setTotalRecordCount() 로 paginationInfo 에 넣어줌

firstRecordIndex & recordCountPerPage 변수 선언하고 paginationInfo에 들어있던 해당값을 넣어줌

   시작위치              페이지당 글갯수

 

주소창에 pageNo 가 뜨면 이걸 int타입인 pageNo 에 저장시켜줄거

 

pageNo 에 대해 defaultValue 설정 

 

이 pageNo 가 아래 화살표따라 저기에 들어가는거 (현재 페이지 번호)

 

 

넣어주고 출력값으로 확인해보자

브라우저에서 게시판을 클릭해보면 출력

첫번째 페이지 인덱스

페이지당 게시글 수

페이지넘버

 

주소창에 쳐서 10번째 페이지로 이동해보면

출력값 확인해보자

 

 

 

 

firstRecordIndex랑 recordCountPerPage 두개 값을 한꺼번에 dto에 담아서 가져가자

getter / setter 생성 

컨트롤러에서 

일단  firstRecordIndex, recordCountPerPage (처음시작위치, 페이지당글수_10으로 정해줌)를 

page 변수에 담아줌 


mapper까지 가져가면 아래 쿼리문을 활용해서

SELECT FROM board
ORDER BY bno DESC
LIMIT 20,  10 ;

요기에 firstRecordIndex, recordCountPerPage 이렇게 각각 넣어줄거임


 

boardList() 메소드로 서비스-DAO-mapper까지 일을 시킬 때 이 page를 메소드의 매개변수로 같이 보내면 된다 

일단 list 객체 생성해서 여기에 page가 처리된 값을 담는다

 

밑줄 클릭해서 서비스에서도 boardList의 매개변수를 PageDTO page 로 채워주고

 DAO에 일을 시켜

DAO에서도 boardList의 매개변수를 PageDTO page 로 채워주고

mapper로 보내는데 이때 ( , page ) 추가해줘서 page값을 같이 보내면 됨

 

mybatisConfig 에서 PageDTO 연결해주고 pageDTO 으로 설정

db의 boardview에서는 limit을 삭제하고 

mapper에 쿼리문에서 limit 설정

 

아래처럼 주소창으로 들어가면 이제 18번째 페이지로 이동가능

홈페이지에서 요부분 가져와서 ( 내가 사용할 type은 text!! )

board.jsp 에 추가

테이블 아래쪽에

<ui:pagination paginationInfo="${paginationInfo}" type="text" jsFunction="linkPage" /> 추가

 

아래 <%@  ~~ %> 선언해주고 <script> 부분도 추가

 

아래처럼 주소 수정해주면 

 

이제 페이지 번호가 뜬다!!!

페이지로 이동할 수 있어

div로 감싸서 가운데정렬 해주자

 

type="img" 로 바꾸고 img 파일 다운받아서 넣어보자

 

다운받은 이미지파일은 img 폴더에 넣어주고

img들 경로를 각각 해당하는 곳에 넣어준다

firstPageLabel   previousPageLabel     1 2 3 4 .......    nextPageLabel  lastPageLabel   

스타일지정