본문 바로가기

IT코딩공부!

#36 스프링(Board(게시판프로젝트 만들어서 페이지, 검색찾기 기능 구현)

오늘의 노래!!!

 
Bunzi (번지)
아티스트
기리보이, 서출구, 양홍원
앨범
고등래퍼 지역대항전 Part.2
발매일
1970.01.01

 

 

JSP문 확인!!!

[1] index.jsp 가장 메인 확면에 나타내주는 jsp문이당!

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_Index</title>
</head>
<body>
	<h1>
		게시판 프로젝트

		<!-- Member 프로젝트에서 했던 기능 
	
		[1] 회원가입   <> 게시글 작성 / 게시글 번호 추가
		[2] 로그인 / 로그아웃 <>
		[3] 회원목록       <> 게시글 목록 / 페이징 처리
		[4] 회원정보   <> 게시글 상세보기 / 조회수 증가
		[5] 회원수정   <> 게시글 수정
		[6] 회원삭제   <> 게시글 삭제
		
		작성 번튼 id = write : writeForm
		목록 버튼 id = list : boardList
	
	-->
	</h1>


	<button id="write">게시글 작성</button>
	<button id="list">게시글 목록</button>
	<button id="pList">페이징 목록</button>

</body>

<script src="https://code.jquery.com/jquery-3.6.4.js"
	integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E="
	crossorigin="anonymous">
</script>

<script>

	$('#write').click(function() {
		location.href = "writeForm";
	});

	$('#list').click(function() {
		location.href = "boardList";
	});
	
	
	$('#pList').click(function() {
		location.href = "pagingList";
	});
	
	

</script>
</html>

index.jsp에서 각 버튼을 만들어 페이지 불러 올수 있게 만든다!]

[2] BoardModify.jsp

// 게시물 작성할 것에 대한  페이지를 불러와주는 코드

// 첨부파일에 무조건 사진이랑 파일 넣을것!!! >> 오류남..

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_Modify</title>
<link rel="stylesheet" href="./resources/css/table.css"/>
</head>
<body>

	<form action="boardModify" method="POST" enctype="multipart/form-data">
	<input type="hidden" name="bNum" value="${modify.BNum}"/>
	<input type="hidden" name="bFileName" value="${modify.BFileName}"/>
	
	<table>
	<caption>게시글 작성</caption>
	
	
		<tr>
			<th>작성자</th>
			<td><input type="text" name="bWriter" size="40" value="${modify.BWriter}"/></td>		
		</tr>
		
		<tr>
			<th>비밀번호</th>
			<td><input type="password" name="bPw" size="40"/></td>		
		</tr>
		
		<tr>
			<th>제목</th>
			<td><input type="text" name="bTitle" size="40" value="${modify.BTitle}"/></td>		
		</tr>
		
		<tr>
			<th>내용</th>
			<td><textarea rows="20" cols="40" name="bContent">${modify.BContent}</textarea></td>		
		</tr>
		
		<tr>
			<th>첨부파일</th>
			<td><input type="file" name="bFile"/></td>		
		</tr>
		
		<tr>
			<th colspan="2">
				<input type="submit" value="수정"/>
			</th>		
		</tr>
		
	</table>
	</form>
	
</body>
</html>

각 목록에 알맞게 작성해서 등록해야한다

// 등록 후 리스트로 나타내기

[3] BoardList.jsp

// 각각 의 리스트로 나타내어 제목에 클릭하면 상세내용을 확인할수 있도록 만든 코드!

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_List</title>
<link rel="stylesheet" href="./resources/css/table.css" />
<style>
</style>
</head>

<body>

	<table>
		<caption>게시글 목록</caption>
		<tr>
			<th>게시글 번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>조회수</th>
		</tr>

		<c:forEach var="list" items="${bList}">
			<tr>
				<td>${list.BNum}</td>
				<td><a href="boardView?bNum=${list.BNum}">${list.BTitle}</a></td>
				<td>${list.BWriter}</td>
				<td>${list.BDate}</td>
				<td>${list.BHit}</td>
			</tr>
		</c:forEach>

	</table>

</body>
</html>

[4] BoardView.jsp

// 상세내용을 확인할수 있도록 만든 코드!

// 파일을 폴더를 만들어서 거기안에서 파일을 확인 할 수 있도록 만들었다.

// 각 버튼에 수정 삭제 할수 있도록 또 다시 만들어 줬당!!

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_View</title>
<link rel="stylesheet" href="./resources/css/table.css" />
</head>
<body>

	<table>
		<caption>게시글 상세보기</caption>

		<tr>
			<th>번호</th>
			<td>${view.BNum}</td>
		</tr>

		<tr>
			<th>작성자</th>
			<td>${view.BWriter}</td>
		</tr>

		<tr>
			<th>비밀번호</th>
			<td>${view.BPw}</td>
		</tr>

		<tr>
			<th>제목</th>
			<td>${view.BTitle}</td>
		</tr>

		<tr>
			<th>내용</th>
			<td>${view.BContent}</td>
		</tr>

		<tr>
			<th>작성일</th>
			<td>${view.BDate}</td>
		</tr>

		<tr>
			<th>조회수</th>
			<td>${view.BHit}</td>
		</tr>

		<tr>
			<th>첨부파일</th>
			<td><img src="./resources/fileUpload/${view.BFileName}"
				width="200px" /></td>
		</tr>

		<tr>
			<th colspan="2">
				<button id="modify">수정</button>
				<button id="delete">삭제</button>
			</th>
		</tr>

	</table>

</body>
<!-- 
	jQuery를 사용해서 
	[수정] 버튼을 누르면 modiForm으로 bNum의 정보를 가지고 이동
	[삭제] 버튼을 누르면 boardDelete로 bNum의 정보를 가지고 이동
-->

<script src="https://code.jquery.com/jquery-3.6.4.js"
	integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E="
	crossorigin="anonymous">
</script>


<script>
	$('#modify').click(function() {

		let pw = '${view.BPw}';
		let check = prompt('비밀번호를 입력해 주세요');

		if (pw == check) {
			location.href = "modiForm?bNum=${view.BNum}";
		} else {
			alert('비밀번호가 일치 하지않습니다');
		}

	});

	$('#delete').click(function() {

		let pw = '${view.BPw}';
		let check = prompt('비밀번호를 입력해 주세요');

		if (pw == check) {
			location.href = "boardDelete?bNum=${view.BNum}";
		} else {
			alert('비밀번호가 일치 하지않습니다');
		}

	});
</script>



</html>

//수정버튼 클릭하면 수정할수 있는 코드

[5] BoardWrite.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Board_Write</title>
<link rel="stylesheet" href="./resources/css/table.css" />
</head>
<body>

	<form action="boardWrite" method="POST" enctype="multipart/form-data">
		<table>
			<caption>게시글 작성</caption>
			<tr>
				<th>작성자</th>
				<td><input type="text" name="bWriter" /></td>
			</tr>

			<tr>
				<th>비밀번호</th>
				<td><input type="password" name="bPw" /></td>
			</tr>

			<tr>
				<th>제목</th>
				<td><input type="text" name="bTitle" /></td>
			</tr>

			<tr>
				<th>내용</th>
				<td><textarea rows="20" cols="40" name="bContent"></textarea></td>
			</tr>

			<tr>
				<th>첨부파일</th>
				<td><input type="file" name="bFile" /></td>
			</tr>

			<tr>
				<th colspan="2"><input type="submit" value="등록"/></th>

			</tr>
		</table>
	</form>
</body>
</html>

[6] PagingList.jsp

// 페이징목록을 따로 버튼을 만들어서 따른 페이지안에서 나타낸 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Paging_List</title>
<link rel="stylesheet" href="./resources/css/table.css" />
</head>
<body>
	<table>
		<caption>페이징 목록</caption>

		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>조회수</th>
		</tr>

		<c:forEach var="list" items="${pList}">
			<tr>
				<td>${list.BNum}</td>
				<td><a href="boardView?bNum=${list.BNum}">${list.BTitle}</a></td>
				<td>${list.BWriter}</td>
				<td>${list.BDate}</td>
				<td>${list.BHit}</td>
			</tr>
		</c:forEach>


		<tr>
			<th colspan="5">
				<!-- 페이징 처리 --> <!-- [이전] --> 
				<c:if test="${paging.page <= 1}">[이전]</c:if>
				<c:if test="${paging.page > 1}">
					<a href="pagingList?page=${paging.page -1}">[이전]</a>
				</c:if> <!-- [페이지 번호] --> 
				<c:forEach var="i" begin="${paging.startPage}"
					end="${paging.endPage}">
					<c:if test="${paging.page == i}"> ${i} </c:if>
					<c:if test="${paging.page != i}">
						<a href="pagingList?page=${i}">${i}</a>
					</c:if>
				</c:forEach> <!-- [다음] --> 
				<c:if test="${paging.page >= paging.maxPage}">[다음]</c:if>
				<c:if test="${paging.page < paging.maxPage}">
					<a href="pagingList?page=${paging.page +1}">[다음]</a>
				</c:if>

			</th>
		</tr>
		
		<tr>
			<td colspan="5">
			
			<!-- 검색기능 -->
			<form action="boardSearch" method="GET">
				
				<!-- 카테고리 -->
				<select name="category">
					<option value="bTitle">제목</option>
					<option value="bWriter">작성자</option>
					<option value="bContent">내용</option>
				</select>
				
				<!-- 키워드 -->
				<input type="text" name="keyword"/>
				
				<!-- 검색버튼 -->
				<input type="submit" value="검색"/>
				
			</form>
				
			</td>
		</tr>

	</table>
</body>
</html>


각 필요한 DTO 생성!!!

// @Data 자동생성lombok 생성하고, 각각 생성자 지정..

 

[1] BoardDTO.java

package com.icia.board.dto;

import java.sql.Date;

import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

@Data
public class BoardDTO {
	
	// 데이터베이스에 있는 BOARDTO 테이블을 보고 클래스 완성
	// bd랑 같이 할 필요없다 따라서 bd형식만 맞쳐주면 된당!!
	
	private int bNum;
	private String bWriter;
	private String bPw;
	private String bTitle;
	private String bContent;
	private Date bDate;
	private int  bHit;	
	private MultipartFile bFile;
	private String bFileName;
	
	
	
}

[2] PageDTO.java

package com.icia.board.dto;

import lombok.Data;

@Data
public class PageDTO {
	
	private int page; 		// 현재페이지
	private int	maxPage;	// 최대페이지
	private int startPage;	//시작페이지
	private int endPage;	// 마지막페이지
	private int startRow;	// 시작 행
	private int endRow;		// 마지막행
	private int limit;		// 한 페이지에 표현될 게시글 수
}

[3] SearchDTO.java

package com.icia.board.dto;

import lombok.Data;

@Data
public class SearchDTO {
	private String category;
	private String keyword;
}

그다음 바로 mybatis-config.xml지정!!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

	<typeAliases>
		<typeAlias type="com.icia.board.dto.BoardDTO" alias="board"/>
		<typeAlias type="com.icia.board.dto.PageDTO" alias="paging"/>
		<typeAlias type="com.icia.board.dto.SearchDTO" alias="search"/>
	</typeAliases>

</configuration>

순서 기억하기!!!

Controller.java  >> Service.java >> DAO >> Mapper


Controller.java 

// [1] 프로젝트의 기본 화면 index화면을 나타내기 위한 기본코드

// [2] 게시글 페이지를 이동을 위해 BoardWrite로 이동하게 만든 코드

// [3] 게시글 작성!

// [4] 게시글 작성한걸 가지구 목록 페이지 이동 boardList

// [5] 페이징 목록 페이지 이동 코드 

//@RequestParam 
// value = 넘어오는 데이터 이름
// required = 필수 요소 확인
// defaultValue = 초기값

// [6] 게시글 상세보기 boardView

// [7 ~ 8] 게시글 수정 페이지 이동및 수정코드

// [9] 게시글 삭제!!

// [10] 게시글 검색!

package com.icia.board.controller;

import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.icia.board.dto.BoardDTO;
import com.icia.board.dto.SearchDTO;
import com.icia.board.service.BoardService;

@Controller   //주소를 넘길 수 있게 해주는 애노테이션
public class BoardController {
	
	private ModelAndView mav = new ModelAndView();
	
	@Autowired
	private BoardService bsvc;
	
	// 프로젝트 홈 화면
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String index() {
		
		return "index";
	}
	
	// writeForm : 게시글 작성페이지 이동		
	@RequestMapping(value = "/writeForm", method = RequestMethod.GET)
	public String writeForm() {
		
		return "BoardWrite";
	}
	
	
	// boardWrite : 게시글 작성	
	@RequestMapping(value = "/boardWrite", method = RequestMethod.POST)
	public ModelAndView boardWrite(@ModelAttribute BoardDTO board) throws IOException {
		System.out.println("[1] jsp > controller >> board : " +board);
		
		mav = bsvc.boardWrite(board);
		
		return mav;
	}
	
	
	// boardList : 게시글 목록페이지 이동		
	@RequestMapping(value = "/boardList", method = RequestMethod.GET)
	public ModelAndView boardList() {
		System.out.println("[1] jsp > controller >> board");
		
		mav = bsvc.boardList();
		
		return mav;
	}
	
	
	
	// pagingList : 페이징 목록페이지 이동		
	@RequestMapping(value = "/pagingList", method = RequestMethod.GET)
	public ModelAndView pagingList(@RequestParam(value="page", required = false, defaultValue="1") int page) {
		//@RequestParam 
		// value = 넘어오는 데이터 이름
		// required = 필수 요소 확인
		// defaultValue = 초기값		
		
		//pagingList?page = 3 : 넘어온 page값 적용
		// pagingList >> page = 1 : 초기값 1적용
		
		mav = bsvc.pagingList(page);
		
		return mav;
	}
	
	// boardView : 게시글 상세보기
	@RequestMapping(value = "/boardView", method = RequestMethod.GET)
	public ModelAndView boardView(@RequestParam("bNum") int bNum) {
		
		
		mav = bsvc.boardView(bNum);
		
		return mav;
	}
	
	
	//modiForm : 게시글 수정페이지 이동
	@RequestMapping(value="/modiForm", method = RequestMethod.GET)
	public ModelAndView modiForm(@RequestParam("bNum") int bNum) {
		mav = bsvc.modiForm(bNum);
		return mav;
	}
	
	
	// boardModify : 게시글 수정
	@RequestMapping(value="/boardModify", method = RequestMethod.POST)
	public ModelAndView boardModify(@ModelAttribute BoardDTO board) throws IllegalStateException, IOException {
		mav = bsvc.boardModify(board);
		return mav;
	}
	
	// boardDelete : 게시글 삭제
	@RequestMapping(value="/boardDelete", method = RequestMethod.GET)
	public ModelAndView boardDelete(@RequestParam("bNum") int bNum) {
		mav = bsvc.boardDelete(bNum);
		return mav;
	}
	
//	boardSearch : 게시글 검색
	@RequestMapping(value="/boardSearch", method = RequestMethod.GET)
	public ModelAndView boardSearch(@ModelAttribute SearchDTO search) {
		mav = bsvc.boardSearch(search);
		return mav;
	}
	
}

Service.java

// 리소스 안에 fileUploed를 생성해서 게시글에 제시한 첨부파일에 등록이된다.

// [1] 파일정보 가져와서 설정하기!

// [2]  게시물 작성한걸 controller에서 받아 dao 넘기는 작업

package com.icia.board.service;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.icia.board.dao.BoardDAO;
import com.icia.board.dto.BoardDTO;
import com.icia.board.dto.PageDTO;
import com.icia.board.dto.SearchDTO;

@Service
public class BoardService {

	private ModelAndView mav;

	@Autowired
	private BoardDAO bdao;

	public ModelAndView boardWrite(BoardDTO board) throws IOException {
		System.out.println("[2] controller > service >> board : " + board);
		mav = new ModelAndView();

		// 서비스에서 할일!!!
		// (1) 파일정보를 가져오기
		MultipartFile bFile = board.getBFile();

		// (2) 파일이름 설정하기
		UUID uuid = UUID.randomUUID();

		/* System.out.println("uuid 확인" + uuid.toString().substring(0,8)); */

		/* System.out.println("실제 파일 이름 : " + bFile.getOriginalFilename()); */

		// (3) 업로드한 파일이 존재한다면(!없다면)
		if (!bFile.getOriginalFilename().isEmpty()) {

			// (4) 랜덤한 식별문자 uuid + 실제파일 이름
			String fileName = uuid.toString().substring(0, 8) + "_" + bFile.getOriginalFilename();

			// (5) board 객체의 bfileName에 새로운 이름 저장한다.
			board.setBFileName(fileName);

			// (6) 저장경로 설정 : fileUpload 폴더 생성
			String savePath = "I:/springWorkspace/Board/src/main/webapp/resources/fileUpload/";

			System.out.println("저장 경로 확인 : " + savePath);

			bFile.transferTo(new File(savePath + fileName));

		} else {

			System.out.println("파일첨부 x");

		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////////// ↓
		//////////////////////////////////////////////////////////////////////////////////////////////////////////// 정보
		//////////////////////////////////////////////////////////////////////////////////////////////////////////// 입력할
		//////////////////////////////////////////////////////////////////////////////////////////////////////////// 내용

		int result = bdao.boardWrite(board);

		if (result > 0) {

			mav.setViewName("index");

		} else {

			mav.setViewName("BoardWrite");

		}

		return mav;
	}

	public ModelAndView boardList() {
		System.out.println("[2] controller >> serivce ");

		mav = new ModelAndView();

		List<BoardDTO> bList = bdao.boardList();

		mav.addObject("bList", bList);

		mav.setViewName("BoardList");

		return mav;
	}

	public ModelAndView boardView(int bNum) {
		mav = new ModelAndView();

		BoardDTO board = bdao.boardView(bNum);
//		DAO에서 불러온다 이제 mav를 넣어준다
		mav.setViewName("BoardView");
		mav.addObject("view", board);

		return mav;
	}

	public ModelAndView modiForm(int bNum) {

		mav = new ModelAndView();

		BoardDTO board = bdao.boardView(bNum);
//		DAO에서 불러온다 이제 mav를 넣어준다
		mav.setViewName("BoardModify");
		mav.addObject("modify", board);

		return mav;
	}

	public ModelAndView boardModify(BoardDTO board) throws IOException {

		System.out.println("[2] controller > service >> board : " + board);
		mav = new ModelAndView();

		// (0) 기존에 있던 파일 지우기
		String deleteFileName = board.getBFileName();

		// 저장경로 설정 : fileUpload 폴더 생성
		String savePath = "I:/springWorkspace/Board/src/main/webapp/resources/fileUpload/";

		// 기존 파일 설정
		File deleteFile = new File(savePath + deleteFileName);

		// 파일 존재여부 확인
		if (deleteFile.exists()) {

			System.out.println("파일존재");

			// 파일 존재시 삭제
			deleteFile.delete();

		} else {

			System.out.println("파일존재하지 않음");

		}

		// 서비스에서 할일!!!
		// (1) 파일정보를 가져오기
		MultipartFile bFile = board.getBFile();

		// (2) 파일이름 설정하기
		UUID uuid = UUID.randomUUID();

		/* System.out.println("uuid 확인" + uuid.toString().substring(0,8)); */

		/* System.out.println("실제 파일 이름 : " + bFile.getOriginalFilename()); */

		// (3) 업로드한 파일이 존재한다면(!없다면)
		if (!bFile.getOriginalFilename().isEmpty()) {

			// (4) 랜덤한 식별문자 uuid + 실제파일 이름
			String fileName = uuid.toString().substring(0, 8) + "_" + bFile.getOriginalFilename();

			// (5) board 객체의 bfileName에 새로운 이름 저장한다.
			board.setBFileName(fileName);

			/////////////////////////////////////////////////////////////////

			int result = bdao.boardModify(board);

			if (result > 0) {

				mav.setViewName("redirect:/boardView?bNum=" + board.getBNum());

			} else {

				mav.setViewName("redirect:/boardForm?bNum=" + board.getBNum());

			}

		}
		return mav;

	}

	public ModelAndView boardDelete(int bNum) {

		mav = new ModelAndView();

		BoardDTO board = bdao.boardView(bNum);

		int result = bdao.boardDelete(bNum);

		if (result > 0) {

			mav.setViewName("redirect:/boardList");

			if (fileDelete(board.getBFileName())) {
				System.out.println("파일삭제 성공!");
			} else {
				System.out.println("파일삭제 실패!");
			}

		} else {

			mav.setViewName("redirect:/boardView?bNum=" + bNum);

		}
		return mav;
	}

	private boolean fileDelete(String bFileName) {

		boolean result = false;

		// 저장경로 설정 : fileUpload 폴더 생성
		String savePath = "I:/springWorkspace/Board/src/main/webapp/resources/fileUpload/";

		// 기존 파일 설정
		File deleteFile = new File(savePath + bFileName);

		// 파일 존재여부 확인
		if (deleteFile.exists()) {
			System.out.println("파일존재o");

			// 파일 존재시 삭제
			if (deleteFile.delete()) {
				result = true;
			}

		} else {
			System.out.println("파일존재x");
		}

		return result;
	}

	public ModelAndView pagingList(int page) {
		mav = new ModelAndView();

		// 한 화면에 보여줄 페이지 갯수
		int block = 5;

		// 한 화면에 보여줄 게시글 갯수
		int limit = 5;

		// 전체 게시글 갯수
		int bCount = bdao.bCount();

		// 최대페이지 : 2
		int maxPage = (int) (Math.ceil((double) bCount / limit));

		if (page > maxPage) {
			page = maxPage;
		}

		// 시작 행
		int startRow = (page - 1) * limit + 1;

		// 끝난 행
		int endRow = page * limit;

		// 시작하는 페이지
		int startPage = (((int) (Math.ceil((double) page / block))) - 1) * block + 1;

		// 끝나는 페이지
		int endPage = startPage + block - 1;

		if (endPage > maxPage) {
			endPage = maxPage;
		}

		// 페이지 객체 생성
		PageDTO paging = new PageDTO();

		paging.setPage(page);
		paging.setStartPage(startRow);
		paging.setEndRow(endRow);
		paging.setMaxPage(maxPage);
		paging.setStartPage(startPage);
		paging.setEndPage(endPage);
		paging.setLimit(limit);

		// 페이징 목록 불러오기
		List<BoardDTO> pList = bdao.pagingList(paging);

		mav.addObject("paging", paging);
		mav.addObject("pList", pList);

		mav.setViewName("PagingList");

		return mav;
	}

	public ModelAndView boardSearch(SearchDTO search) {
		mav = new ModelAndView();

		List<BoardDTO> sList = bdao.boardSearch(search);

		mav.addObject("bList", sList);
		mav.setViewName("BoardList");

		return mav;
	}
}

DAO

package com.icia.board.dao;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.icia.board.dto.BoardDTO;
import com.icia.board.dto.PageDTO;
import com.icia.board.dto.SearchDTO;

@Repository
public class BoardDAO {

	
	@Autowired
	private SqlSessionTemplate sql;

	public int boardWrite(BoardDTO board) {
		System.out.println("[3] service >> dao : ");
		return sql.insert("Board.boardWrite", board);
		
	}

	public List<BoardDTO> boardList() {
		System.out.println("[3] service >> dao : ");
		return sql.selectList("Board.boardList");
	}

	public BoardDTO boardView(int bNum) {

		
		// 조회수 증가  <조회수를 할수 있는 업데이트문을 작성하고 불러 올 수 있다!!>
		sql.update("Board.boardHit", bNum);
		
		
		
		// 게시글 한개의 정보(리턴)
		return sql.selectOne("Board.boardView", bNum);
	}

	public int boardModify(BoardDTO board) {
		return sql.update("Board.boardModify", board);
	}

	public int boardDelete(int bNum) {
		return sql.delete("Board.boardDelete", bNum);
	}

	public int bCount() {
		return sql.selectOne("Board.bCount");
	}

	public List<BoardDTO> pagingList(PageDTO paging) {
		return sql.selectList("Board.pagingList", paging);
	}

	public List<BoardDTO> boardSearch(SearchDTO search) {
		return sql.selectList("Board.searchList", search);
	}


}

Mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Board">


	<!-- 검색목록  -->
	<select id="searchList" parameterType="search" resultType="board">
		SELECT * FROM BOARDTO WHERE ${category} LIKE '%${keyword}%'
	</select>

	<!-- 페이징 목록 -->
	<select id="pagingList" parameterType="paging" resultType="board">
		SELECT * FROM PAGINGLIST WHERE RN BETWEEN #{startRow} AND #{endRow}
	</select>

	<!-- 게시글 갯수 -->
	<select id="bCount" resultType="int">
		SELECT COUNT(*) FROM BOARDTO
	</select>

	<!-- 게시글 삭제 -->
	<delete id="boardDelete" parameterType="int">
		DELETE FROM BOARDTO WHERE
		BNUM = #{bNum}
	</delete>

	<!-- 게시글 수정 -->
	<update id="boardModify" parameterType="board">
		UPDATE BOARDTO SET
		BWRITER = #{bWriter}, BTITLE = #{bTitle}, BCONTENT =
		#{bContent},
		BFILENAME = #{bFileName} WHERE BNUM = #{bNum}
	</update>

	<!-- 게시글 상세보기 -->
	<select id="boardView" parameterType="int" resultType="board">
		SELECT *
		FROM BOARDTO WHERE BNUM = #{bNum}
	</select>

	<!-- 조회수 증가 -->
	<update id="boardHit" parameterType="int">
		UPDATE BOARDTO SET BHIT =
		BHIT + 1 WHERE BNUM = #{bNum}
	</update>

	<insert id="boardWrite" parameterType="board">
		INSERT INTO BOARDTO
		VALUES(BOARD_SEQ.NEXTVAL, #{bWriter}, #{bPw}, #{bTitle}, #{bContent},
		SYSDATE, 0, #{bFileName})
	</insert>

	<select id="boardList" resultType="board">
		SELECT * FROM BOARDTO ORDER BY
		BNUM DESC
	</select>

</mapper>

DB테이블 생성

--보드테이블 생성!!
dROP TABLE BOARDTO;

CREATE TABLE BOARDTO(
    BNUM       NUMBER PRIMARY KEY, --게시글 번호
    BWRITER    NVARCHAR2(20),      --게시글 작성자
    BPW        NVARCHAR2(20),      --게시글 비밀번호
    BTITLE     NVARCHAR2(50),      --게시글 제목
    BCONTENT   NVARCHAR2(500),     --게시글 내용
    BDATE      DATE,               --게시글 작성일
    BHIT       NUMBER,             --게시글 조회수
    BFILENAME  NVARCHAR2(60)       --게시글 첨부파일
);

-- SEQUENCE : 자동 순차 증가라는 뜻
--생성방법은? : CREATE SEQUENCE [SEQ_NAME] START WITH [시작값] INCREAMENT BY [증가값];
--수정했을때? : ALTER SEQUENCE [SEQ_NAME] START WITH [시작값] INCREAMENT BY [증가값];
--삭제는?     : DROP SEQUENCE[SEQ_NAME];

--하나씩 증가 : [SEQ_NAME].NEXTVAL;

--CREATE SEQUENCE TEST_SEQ START WITH 1;
--
--SELECT TEST_SEQ.NEXTVAL FROM DUAL;

CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
SELEcT * FROM BOARDTO;

--view : 임의의 테이블
--select : 가능, insertm update, delet불가!!!

create view PAGINGLIST AS SELECT
    ROW_NUMBER() OVER(ORDER BY BNUM DESC) AS RN,
    BOARDTO.*
FROM BOARDTO;

SELECT * FROM PAGINGLIST WHERE RN BETWEEN 1 AND 5;

SELECT * FROM BOARDTO WHERE BWRITER LIKE '%아저씨';
SELECT * FROM BOARDTO WHERE BTITLE LIKE '';
SELECT * FROM BOARDTO WHERE BCONTENT LIKE '%아저씨'
-- #{bWriter} >> ''
-- ${bTitle} >> ''없음