1. 게시물 총 개수 구하기 (boardMapper.xml)
<?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="com.board.mappers.board">
<!-- 게시물 목록
resultType은 쿼리를 실행한 뒤 결과가 있을 경우에 사용하며,
반대로 데이터를 넣을 때는 parameterType을 사용
-->
<select id="list" resultType="com.board.domain.BoardVO">
select
bno, title, content, writer, regDate, viewCnt
from tbl_board
</select>
<!-- 게시물 작성
데이터를 넣을 때는 parameterType을 사용
-->
<insert id="write" parameterType="com.board.domain.BoardVO">
insert into
tbl_board(title, content, writer)
values(#{title}, #{content}, #{writer})
</insert>
<!-- 게시물 조회
파라미터 타입은 매퍼에 들어오는 데이터, 리설트 타입은 매퍼가 내보내는 데이터입니다.-->
<select id="view" parameterType="int" resultType="com.board.domain.BoardVO">
select
bno, title, content, regDate, viewCnt
from
tbl_board
where
bno = #{bno}
</select>
<!-- 게시물 수정 -->
<update id="modify" parameterType="com.board.domain.BoardVO">
update tbl_board
set
title = #{title},
content = #{content},
writer = #{writer}
where bno = #{bno}
</update>
<!-- 게시물 삭제 -->
<delete id="delete" parameterType="int">
delete
from tbl_board
where bno = #{bno}
</delete>
<!-- 게시물 총 개수 -->
<select id="count" resultType="int">
select count(bno) from tbl_board
</select>
</mapper>
2. DAO와 DAOImpl에 코드 추가
package com.board.dao;
import java.util.List;
import com.board.domain.BoardVO;
public interface BoardDAO {
//게시물 목록
public List<BoardVO> list() throws Exception;
//게시물 작성
public void write(BoardVO vo) throws Exception;
//게시물 조회
public BoardVO view(int bno) throws Exception;
//게시물 수정
public void modify(BoardVO vo) throws Exception;
//게시물 삭제
public void delete(int bno) throws Exception;
//게시물 총 개수
public int count() throws Exception;
}
package com.board.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.board.domain.BoardVO;
// DAO에 특화된 어노테이션. @Component 어노테이션을 써도 상관 없지만, DAO 클래스들에 @Repository 어노테이션을 사용함으로써
// @Component 어노테이션이 가진 특성과 함께, DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로
// 처리할 수 있는 장점 또한 갖는다.
@Repository
public class BoardDAOImpl implements BoardDAO {
// name으로 DI를 가능케 한다. 자바에서 지원하는 어노테이션이며 프레임워크에 종속적이지 않아 상사용해도 좋다.
// 타입으로 연결한다.
@Inject
private SqlSession sql;
private static String namespace = "com.board.mappers.board";
//게시물 목록
@Override
public List<BoardVO> list() throws Exception {
// TODO Auto-generated method stub
return sql.selectList(namespace + ".list");
}
//게시물 작성
@Override
public void write(BoardVO vo) throws Exception {
sql.insert(namespace + ".write", vo);
}
//게시물 조회
@Override
public BoardVO view(int bno) throws Exception {
return sql.selectOne(namespace + ".view", bno);
}
//게시물 수정
@Override
public void modify(BoardVO vo) throws Exception {
sql.update(namespace + ".modify", vo);
}
//게시물 삭제
@Override
public void delete(int bno) throws Exception {
sql.delete(namespace + ".delete", bno);
}
//게시물 총 개수
@Override
public int count() throws Exception {
return sql.selectOne(namespace + ".count");
}
}
3. Service와 ServiceImpl에 코드 추가
package com.board.service;
import java.util.List;
import com.board.domain.BoardVO;
public interface BoardService {
//게시물 목록
public List<BoardVO> list() throws Exception;
//게시물 작성
public void write(BoardVO vo) throws Exception;
//게시물 조회
public BoardVO view(int bno) throws Exception;
//게시물 수정
public void modify(BoardVO vo) throws Exception;
//게시물 삭제
public void delete(int bno) throws Exception;
//게시물 총 개수
public int count() throws Exception;
}
package com.board.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
@Service
public class BoardServiceImpl implements BoardService {
@Inject
private BoardDAO dao;
//게시물 리스트
@Override
public List<BoardVO> list() throws Exception {
// TODO Auto-generated method stub
return dao.list();
}
//게시물 작성
@Override
public void write(BoardVO vo) throws Exception {
dao.write(vo);
}
//게시물 조회
@Override
public BoardVO view(int bno) throws Exception {
return dao.view(bno);
}
//게시물 수정
@Override
public void modify(BoardVO vo) throws Exception {
dao.modify(vo);
}
//게시물 삭제
@Override
public void delete(int bno) throws Exception {
dao.delete(bno);
}
@Override
public int count() throws Exception {
return dao.count();
}
}
4. BoardController 코드 추가
package com.board.controller;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.board.domain.BoardVO;
import com.board.service.BoardService;
@Controller
@RequestMapping("/board/*")
public class BoardController {
@Inject
BoardService service;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void getList(Model model) throws Exception {
List<BoardVO> list = null;
list = service.list();
model.addAttribute("list", list);
}
// 게시물 작성 (서버에서 사용자로 데이터 이동 GET메서드)
@RequestMapping(value = "/write", method = RequestMethod.GET)
public void getWrite() throws Exception{
}
//게시물 작성 (사용자에서 서버로 데이터 이동 POST메서드
@RequestMapping(value = "/write", method = RequestMethod.POST)
public String postWrite(BoardVO vo) throws Exception{
service.write(vo);
return "redirect:/board/list";
}
//게시물 조회
@RequestMapping(value= "/view", method = RequestMethod.GET)
public void getView(@RequestParam("bno") int bno, Model model) throws Exception{
BoardVO vo = service.view(bno);
model.addAttribute("view", vo);
}
//게시물 수정
@RequestMapping(value = "/modify", method = RequestMethod.GET)
public void getModify(@RequestParam("bno") int bno, Model model) throws Exception {
BoardVO vo = service.view(bno);
model.addAttribute("view", vo);
System.out.println("view" + bno);
}
//게시물 수정
@RequestMapping(value ="/modify", method = RequestMethod.POST)
public String postModify(BoardVO vo) throws Exception{
service.modify(vo);
return "redirect:/board/view?bno=" + vo.getBno();
}
//게시물 삭제
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String getDelete(@RequestParam("bno") int bno) throws Exception{
service.delete(bno);
return "redirect:/board/list";
}
// 게시물 목록 + 페이징 추가
@RequestMapping(value = "/listpage", method = RequestMethod.GET)
public void getListPage(Model model) throws Exception {
List<BoardVO> list = null; list = service.list();
model.addAttribute("list", list);
}
}
5. 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="com.board.mappers.board">
<!-- 게시물 목록
resultType은 쿼리를 실행한 뒤 결과가 있을 경우에 사용하며,
반대로 데이터를 넣을 때는 parameterType을 사용
-->
<select id="list" resultType="com.board.domain.BoardVO">
select
bno, title, content, writer, regDate, viewCnt
from tbl_board
</select>
<!-- 게시물 작성
데이터를 넣을 때는 parameterType을 사용
-->
<insert id="write" parameterType="com.board.domain.BoardVO">
insert into
tbl_board(title, content, writer)
values(#{title}, #{content}, #{writer})
</insert>
<!-- 게시물 조회
파라미터 타입은 매퍼에 들어오는 데이터, 리설트 타입은 매퍼가 내보내는 데이터입니다.-->
<select id="view" parameterType="int" resultType="com.board.domain.BoardVO">
select
bno, title, content, regDate, viewCnt
from
tbl_board
where
bno = #{bno}
</select>
<!-- 게시물 수정 -->
<update id="modify" parameterType="com.board.domain.BoardVO">
update tbl_board
set
title = #{title},
content = #{content},
writer = #{writer}
where bno = #{bno}
</update>
<!-- 게시물 삭제 -->
<delete id="delete" parameterType="int">
delete
from tbl_board
where bno = #{bno}
</delete>
<!-- 게시물 총 개수 -->
<select id="count" resultType="int">
select count(bno) from tbl_board
</select>
<!-- 게시물 목록 + 페이징 -->
<select id="listPage" parameterType="hashMap" resultType="com.board.domain.BoardVO">
select
bno, title, writer, regDate, viewCnt
from tbl_board
order by bno desc
limit #{displayPost}, #{postNum}
</select>
</mapper>
6. DAO와 DAOImpl 코드 추가
package com.board.dao;
import java.util.List;
import com.board.domain.BoardVO;
public interface BoardDAO {
//게시물 목록
public List<BoardVO> list() throws Exception;
//게시물 작성
public void write(BoardVO vo) throws Exception;
//게시물 조회
public BoardVO view(int bno) throws Exception;
//게시물 수정
public void modify(BoardVO vo) throws Exception;
//게시물 삭제
public void delete(int bno) throws Exception;
//게시물 총 개수
public int count() throws Exception;
//게시물 목록 + 페이징
public List listPage(int displayPost, int postNum) throws Exception;
}
package com.board.dao;
import java.util.HashMap;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.board.domain.BoardVO;
// DAO에 특화된 어노테이션. @Component 어노테이션을 써도 상관 없지만, DAO 클래스들에 @Repository 어노테이션을 사용함으로써
// @Component 어노테이션이 가진 특성과 함께, DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로
// 처리할 수 있는 장점 또한 갖는다.
@Repository
public class BoardDAOImpl implements BoardDAO {
// name으로 DI를 가능케 한다. 자바에서 지원하는 어노테이션이며 프레임워크에 종속적이지 않아 상사용해도 좋다.
// 타입으로 연결한다.
@Inject
private SqlSession sql;
private static String namespace = "com.board.mappers.board";
//게시물 목록
@Override
public List<BoardVO> list() throws Exception {
// TODO Auto-generated method stub
return sql.selectList(namespace + ".list");
}
//게시물 작성
@Override
public void write(BoardVO vo) throws Exception {
sql.insert(namespace + ".write", vo);
}
//게시물 조회
@Override
public BoardVO view(int bno) throws Exception {
return sql.selectOne(namespace + ".view", bno);
}
//게시물 수정
@Override
public void modify(BoardVO vo) throws Exception {
sql.update(namespace + ".modify", vo);
}
//게시물 삭제
@Override
public void delete(int bno) throws Exception {
sql.delete(namespace + ".delete", bno);
}
//게시물 총 개수
@Override
public int count() throws Exception {
return sql.selectOne(namespace + ".count");
}
// 게시물 목록 + 페이징
// 매개변수인 displayPost, postNum을 해시맵을 이용하여 하나로 그룹지어주고 매퍼로 전송합니다.
@Override
public List listPage(int displayPost, int postNum) throws Exception {
HashMap data = new HashMap();
data.put("displayPost", displayPost);
data.put("postNum", postNum);
return sql.selectList(namespace + ".listPage", data);
}
}
7. Service와 ServiceImpl 코드 추가
package com.board.service;
import java.util.List;
import com.board.domain.BoardVO;
public interface BoardService {
//게시물 목록
public List<BoardVO> list() throws Exception;
//게시물 작성
public void write(BoardVO vo) throws Exception;
//게시물 조회
public BoardVO view(int bno) throws Exception;
//게시물 수정
public void modify(BoardVO vo) throws Exception;
//게시물 삭제
public void delete(int bno) throws Exception;
//게시물 총 개수
public int count() throws Exception;
//게시물 목록 + 페이징
public List listPage(int displayPost, int postNum) throws Exception;
}
package com.board.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
@Service
public class BoardServiceImpl implements BoardService {
@Inject
private BoardDAO dao;
//게시물 리스트
@Override
public List<BoardVO> list() throws Exception {
// TODO Auto-generated method stub
return dao.list();
}
//게시물 작성
@Override
public void write(BoardVO vo) throws Exception {
dao.write(vo);
}
//게시물 조회
@Override
public BoardVO view(int bno) throws Exception {
return dao.view(bno);
}
//게시물 수정
@Override
public void modify(BoardVO vo) throws Exception {
dao.modify(vo);
}
//게시물 삭제
@Override
public void delete(int bno) throws Exception {
dao.delete(bno);
}
//게시물 총 개수
@Override
public int count() throws Exception {
return dao.count();
}
//게시물 목록 + 페이징
@Override
public List listPage(int displayPost, int postNum) throws Exception {
return dao.listPage(displayPost, postNum);
}
}
8. BoardController 코드 추가
package com.board.controller;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.board.domain.BoardVO;
import com.board.service.BoardService;
@Controller
@RequestMapping("/board/*")
public class BoardController {
@Inject
BoardService service;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void getList(Model model) throws Exception {
List<BoardVO> list = null;
list = service.list();
model.addAttribute("list", list);
}
// 게시물 작성 (서버에서 사용자로 데이터 이동 GET메서드)
@RequestMapping(value = "/write", method = RequestMethod.GET)
public void getWrite() throws Exception{
}
//게시물 작성 (사용자에서 서버로 데이터 이동 POST메서드
@RequestMapping(value = "/write", method = RequestMethod.POST)
public String postWrite(BoardVO vo) throws Exception{
service.write(vo);
return "redirect:/board/list";
}
//게시물 조회
@RequestMapping(value= "/view", method = RequestMethod.GET)
public void getView(@RequestParam("bno") int bno, Model model) throws Exception{
BoardVO vo = service.view(bno);
model.addAttribute("view", vo);
}
//게시물 수정
@RequestMapping(value = "/modify", method = RequestMethod.GET)
public void getModify(@RequestParam("bno") int bno, Model model) throws Exception {
BoardVO vo = service.view(bno);
model.addAttribute("view", vo);
System.out.println("view" + bno);
}
//게시물 수정
@RequestMapping(value ="/modify", method = RequestMethod.POST)
public String postModify(BoardVO vo) throws Exception{
service.modify(vo);
return "redirect:/board/view?bno=" + vo.getBno();
}
//게시물 삭제
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String getDelete(@RequestParam("bno") int bno) throws Exception{
service.delete(bno);
return "redirect:/board/list";
}
// 게시물 목록 + 페이징 추가
@RequestMapping(value = "/listpage", method = RequestMethod.GET)
public void getListPage(Model model, @RequestParam("name") int num) throws Exception {
//게시물 총 개수
int count = service.count();
// 한페이지에 출력할 게시물의 개수
int postNum = 5;
// 하단 페이징 번호 ([게시물 총 개수 / 한 페이지에 출력할 개수]의 올림)
int pageNum = (int)Math.ceil((double)count/postNum);
//출력할 게시물
int displayPost = (num - 1) * postNum;
List list = null;
list = service.listPage(displayPost, postNum);
model.addAttribute("list", list);
model.addAttribute("pageNum", pageNum);
}
}
9. listPage.jsp 생성 후 코드 추가
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시물 목록</title>
</head>
<body>
<div id="nav">
<%@ include file="../include/nav.jsp" %>
</div>
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성일</th>
<th>작성자</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="list">
<tr>
<td>${list.bno}</td>
<td>
<a href="/board/view?bno=${list.bno}">${list.title}</a>
</td>
<td>${list.regDate}</td>
<td>${list.writer}</td>
<td>${list.viewCnt}</td>
</tr>
</c:forEach>
</tbody>
</table>
<div>
<c:forEach begin="1" end="${pageNum}" var="num">
<span>
<a href="/board/listPage?num=${num}">${num}</a>
</span>
</c:forEach>
</div>
</body>
</html>
10 nav.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<ul>
<li><a href="/board/listPage?num=1">글 목록(페이징)</a></li>
<li><a href="/board/list">글 목록</a></li>
<li><a href="/board/write">글 작성</a></li>
</ul>
출처는 쿠주로님입니다.
다시한번 감사드립니다.
'2020 > Basic Spring board' 카테고리의 다른 글
#12 스프링 게시판 만들기 (페이지 처리 분리 ) (0) | 2020.06.12 |
---|---|
#11 스프링 게시판 만들기 (너무 많은 페이지 줄이기 페이징 처리 2) (0) | 2020.06.12 |
#9 스프링 게시판 만들기 ( 게시물 삭제) (0) | 2020.06.11 |
#8 스프링 게시판 만들기 ( nav) (0) | 2020.06.11 |
#7 스프링 게시판 만들기 (게시물 수정) (0) | 2020.06.11 |