이전글 justBoard9에서 어제 몇 시간동안 왜 오류가 발생하는지에 대해서 이유를 찾지 못했다. 심지어 두 시간동안 고민해보고 gpt에도 물어보았다. 오류가 날 부분에 대해서만 코드를 보여주지 말고 이유만 알려달라고.. 그럼에도 내가 작성한 코드에서는 문제가 없다고 답을 해줬다.
문제를 해결하기 위해 명령 프롬프트에서 다음과 같이 데이터 삽입을 시도해보았다.
이 곳에서도 들어가지 않는 것을 발견할 수 있었다. 이걸보고 오늘에서야 문제를 발견할 수 있었다. 이유는 컬럼명 때문에 발생한 문제였다. no와 subject는 MySQL 예약어였기 때문에 board 테이블을 만들 때 백틱을 이용해서 만들었다. 때문에 컬럼을 찾을 수 없어서 데이터가 입력되지 않았다.
즉, 문제 원인은 컬럼명 입력을 예약어로 만들었고 당시 백틱을 이용했다. 따라서 컬럼명을 작성할 때 정확하게 백틱안에 컬럼명을 넣어줘야한다.
MySQL 예약어는 https://dev.mysql.com/doc/refman/5.0/en/reserved-words.html 여기서 사용하는 버전에 맞게 확인할 수 있다.(생각보다 예약어가 너무 많아서 정리하기 힘들다. 자바 라이브러리와 마찬가지로 필요할 때 수시로 확인하는 것이 좋은 방법인 것 같다.)
현재 내가 사용하고 있는 예약어들을 찾아보았다.
그렇다면 여기에 맞춰서 수정을 해보도록 하자. DAO는 건드릴 필요없이 mapper만 수정해주면 될 것 같다.
boardMapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mystory001.mappers.boardMapper">
<select id="getBoardList" resultType="com.mystory001.domain.BoardDTO">
select *
from board
</select>
<insert id="insertBoard">
insert into board(`no`, id, `subject`, content, writetime, readcount)
values(#{`no`}, #{id}, #{`subject`}, #{content}, #{writetime}, #{readcount})
</insert>
<select id="getMaxNo" resultType="java.lang.Integer">
select max(`no`) from board
</select>
</mapper>
이렇게 바꿨음에도
오류가 뜬다. SQL문이 잘못 된 것이 확실하다.
백틱을 사용한 테이블은 있었지만, 백틱을 이용한 컬럼 사용은 처음이기 때문에 MySQL Workbench를 이용해서 넣는 것을 시도해보았다.
values에 백틱을 사용하는 컬럼은 백틱으로 묶어줘야하나?, 아니면 리터럴인 부분은 백틱안에 또 작은 따옴표로 묶어줘야하나? 생각했는데 아무리 해도 안됨. 그래서 그냥 백틱은 빼고 시도해보았다.
컬럼에만 백틱을 사용하고 values에는 그냥 데이터 넣듯이 넣으면 된다.
boardMapper 수정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mystory001.mappers.boardMapper">
<select id="getBoardList" resultType="com.mystory001.domain.BoardDTO">
select *
from board
</select>
<insert id="insertBoard">
insert into board(`no`, id, `subject`, content, writetime, readcount)
values(#{no}, #{id}, #{subject}, #{content}, #{writetime}, #{readcount})
</insert>
<select id="getMaxNo" resultType="java.lang.Integer">
select max(`no`) from board
</select>
</mapper>
과연?
주소 매핑을 잘못해서 404가 뜬 것이지 데이터는 제대로 들어간 것을 확인할 수 있다. 제대로 했다고 생각했는데 안될 때 '이게 외않돼?'하면서 짜증나는데 막상 해결하고나면 뿌듯함.
이제 main에서 게시글 목록이 나타나게해보자
데이터는 들어가있는데 목록에서 나타나지 않음
main.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>
<%-- 반응형 웹 viewport → head태그 사이에 작성 --%>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.header{
float : right;
width: 1200px;
height: 0px;
}
.sidebar{
float : left;
width: 200px;
height: 500px;
}
.content{
width: 1000px;
height: 600px;
}
.footer{
float : right;
width: 1200px;
height: 0px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="inc/top.jsp" />
<jsp:include page="inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>게시물 목록</h1>
<table border="1">
<tr>
<th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회수</th>
</tr>
<c:forEach var="boardDTO" items="${boardList }">
<tr onclick="location.href='${pageContext.request.contextPath}/board?${boardDTO.no }'">
<td>${boardDTO.no }</td><td>${boardDTO.subject }</td><td>${boardDTO.id }</td><td>${boardDTO.writetime }</td><td>${boardDTO.readcount }</td>
</tr>
</c:forEach>
<%-- 게시글 목록 --%>
</table>
<%-- 로그인이 되어 있을 때만 버튼이 보이게--%>
<c:if test="${! empty sessionScope.id }">
<a href="${pageContext.request.contextPath }/board/insert"><button>글쓰기</button></a>
</c:if>
<%-- 페이지 목록 10개씩 10개의 페이지 --%>
<!-- <form method="get"> -->
<!-- <input type="text" name="search" value="검색"> -->
<!-- <input type="submit" value="검색하기"> -->
<!-- </form> -->
</div> <%-- content영역 div --%>
<jsp:include page="inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
BoardController
@GetMapping("/")
public String main(HttpServletRequest request, Model model) {
System.out.println("BoardController main()");
List<BoardDTO> boardList = boardService.getBoardList(); //게시물
model.addAttribute("boardList",boardList);
return "/";
}
메인 화면에서 모든 것을 해결하려고 했으나 조금 복잡해서 글 목록은 list.jsp를 만들어서 그곳에서 확인할 수 있게 변경
board/list.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>
<%-- 반응형 웹 viewport → head태그 사이에 작성 --%>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.header{
float : right;
width: 1200px;
height: 0px;
}
.sidebar{
float : left;
width: 200px;
height: 500px;
}
.content{
width: 1000px;
height: 600px;
}
.footer{
float : right;
width: 1200px;
height: 0px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>게시물 목록</h1>
<table border="1">
<tr>
<th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회수</th>
</tr>
<c:forEach var="boardDTO" items="${boardList}">
<tr onclick="location.href='${pageContext.request.contextPath}/board/content?no=${boardDTO.no }'">
<td>${boardDTO.no }</td><td>${boardDTO.subject }</td><td>${boardDTO.id }</td><td>${boardDTO.writetime }</td><td>${boardDTO.readcount }</td>
</tr>
</c:forEach>
<%-- 게시글 목록 --%>
</table>
<%-- 로그인이 되어 있을 때만 버튼이 보이게--%>
<c:if test="${! empty sessionScope.id }">
<a href="${pageContext.request.contextPath }/board/insert"><button>글쓰기</button></a>
</c:if>
<%-- 페이지 목록 10개씩 10개의 페이지 --%>
<!-- <form method="get"> -->
<!-- <input type="text" name="search" value="검색"> -->
<!-- <input type="submit" value="검색하기"> -->
<!-- </form> -->
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
Controller
@GetMapping("/list")
public String main(HttpServletRequest request, Model model) {
System.out.println("BoardController main()");
List<BoardDTO> boardList = boardService.getBoardList(); //게시물
model.addAttribute("boardList",boardList);
return "board/list";
}
Service, DAO, mapper는 동일. 주소만 바꿈 + 사이드바에 li태그를 이용해서 글 목록을 추가
이렇게 하니 잘 나옴. 번호가 오름차순이라 작성일이 오래된 것(번호가 낮은 것)이 아래로 가게 수정
mapper
<select id="getBoardList" resultType="com.mystory001.domain.BoardDTO">
select *
from board
order by `no` desc
</select>
이제 글 읽기와 관련된 작업
BoardController
@GetMapping("/content")
public String content(BoardDTO boardDTO, Model model) {
System.out.println("BoardController content()");
boardDTO = boardService.getBoard(boardDTO); //글에 대한 정보
boardService.readCount(boardDTO); //조회수
model.addAttribute("boardDTO",boardDTO);
return "board/content";
}
BoardSerivce
public BoardDTO getBoard(BoardDTO boardDTO) {
System.out.println("BoardService getBoard()");
return boardDAO.getBoard(boardDTO);
}
public void readCount(BoardDTO boardDTO) {
System.out.println("BoardService readCount()");
int readcount = boardDTO.getReadcount() + 1;
boardDTO.setReadcount(readcount);
boardDAO.readCount(boardDTO);
}
BoardDAO
public BoardDTO getBoard(BoardDTO boardDTO) {
System.out.println("BoardDAO getBoard()");
return sqlSession.selectOne(namespace+".getBoard",boardDTO);
}
public void readCount(BoardDTO boardDTO) {
System.out.println("BoardDAO readCount");
sqlSession.update(namespace+".readCount", boardDTO);
}
boardMapper
<select id="getBoard" resultType="com.mystory001.domain.BoardDTO">
select *
from board
where `no` = #{no}
</select>
<update id="readCount">
update board
set readcount = #{readcount}
where `no` = #{no}
</update>
http://localhost:8080/justboard/board/content?no=과 http://localhost:8080/justboard/board/content?의 차이에 대해 알아보자
http://localhost:8080/justboard/board/content?no= 는 no라는 쿼리 파라미터를 사용하여 값을 전달하고 있음. 서버 측에서 no라는 이름의 파라미터를 읽어 해당 게시물의 id를 참조하는 데 사용할 수 있다.
반면 http://localhost:8080/justboard/board/content? 는 일반적으로 서버 측에서 처리할 수 있는 유효한 쿼리 파라미터 형식이 아니기 때문에 해석하지 못함
board/content.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.content{
width: 1000px;
height: 600px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>글 읽기</h1>
<table>
<tr><td>글번호</td><td>${boardDTO.no}</td></tr>
<tr><td>글쓴이</td><td>${boardDTO.id}</td></tr>
<tr><td>조회수</td><td>${boardDTO.readcount}</td></tr>
<tr><td>작성일</td><td>${boardDTO.writetime}</td></tr>
<tr><td>글제목</td><td>${boardDTO.subject}</td></tr>
<tr><td>글내용</td><td>${boardDTO.content}</td></tr>
</table>
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
지금 같은 경우에는 글쓴이와 로그인된 아이디가 같을 경우 글 수정, 글 삭제, 목록보기 버튼이 생겨야하며, 글쓴이와 로그인 된 아이디가 같지 않을 경우나 로그인이 안된 경우에는 목록보기 버튼만 보이게 설정해주자.
어찌저찌 페이지가 생기고했지만 글 읽기까지 왔다. 이제 버튼, 페이징 처리, 검색까지만 하면 어느 정도의 게시판이 완료된다. 조금만 더 힘내서 해보자.
content.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>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.content{
width: 1000px;
height: 600px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>글 읽기</h1>
<table >
<tr><td>글번호</td><td>${boardDTO.no}</td></tr>
<tr><td>글쓴이</td><td>${boardDTO.id}</td></tr>
<tr><td>조회수</td><td>${boardDTO.readcount}</td></tr>
<tr><td>작성일</td><td>${boardDTO.writetime}</td></tr>
<tr><td>글제목</td><td>${boardDTO.subject}</td></tr>
<tr><td>글내용</td><td>${boardDTO.content}</td></tr>
</table>
<div style="display: center">
<c:if test="${!empty sessionScope.id }">
<c:if test="${sessionScope.id eq boardDTO.id}">
<input type="button" value="글 수정" onclick="${pageContext.request.contextPath}/board/update"> <input type="button" value="글 삭제" onclick="${pageContext.request.contextPath}/board/delete">
</c:if>
</c:if>
<input type="button" value="글 목록" onclick="${pageContext.request.contextPath}/board/content">
</div>
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
세션이 있고, 세션 아이디와 글쓴이가 같을 때 글 수정, 글 삭제 버튼이 보이게 만약 세션이 없으면 글 목록만 보이게 함
글 수정
update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.content{
width: 1000px;
height: 600px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>게시 글 수정</h1>
<form action="${pageContext.request.contextPath }/board/updatePro" method="post">
<input type="hidden" name="no" value="${boardDTO.no }">
<input type="text" name="id" value="${sessionScope.id }" readonly="readonly"><br>
<input type="text" name="subject" value="${boardDTO.subject }"><br>
<textarea rows="10" cols="50">${boardDTO.content }</textarea><br>
<input type="submit" value="수정하기"> <a href="${pageContext.request.contextPath }/board/content?no=${boardDTO.no}"><input type="button" value="뒤로가기"></a>
</form>
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
BoardController
@GetMapping("/update")
public String update(BoardDTO boardDTO, Model model) {
System.out.println("BoardController update()");
boardDTO = boardService.getBoard(boardDTO);
model.addAttribute("boardDTO", boardDTO);
return "board/update";
}
이렇게 했는데 글에 대한 정보가 들고오지 못하고 있다. 글 번호에 대한 정보가 없기 때문이라고 생각이 든다.
content.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>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.content{
width: 1000px;
height: 600px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>글 읽기</h1>
<table >
<tr><td>글번호</td><td>${boardDTO.no}</td></tr>
<tr><td>글쓴이</td><td>${boardDTO.id}</td></tr>
<tr><td>조회수</td><td>${boardDTO.readcount}</td></tr>
<tr><td>작성일</td><td>${boardDTO.writetime}</td></tr>
<tr><td>글제목</td><td>${boardDTO.subject}</td></tr>
<tr><td>글내용</td><td>${boardDTO.content}</td></tr>
</table>
<div style="display: center">
<c:if test="${!empty sessionScope.id }">
<c:if test="${sessionScope.id eq boardDTO.id}">
<a href="${pageContext.request.contextPath}/board/update?no=${boardDTO.no}"><input type="button" value="글 수정"></a> <a href="${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}"><input type="button" value="글 삭제"></a>
</c:if>
</c:if>
<a href="${pageContext.request.contextPath}/board/content"><input type="button" value="글 목록"></a>
</div>
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
그렇게하니까
잘된다...
글 수정과 글 삭제 처리
BoardController
@PostMapping("/updatePro")
public String updatePro(BoardDTO boardDTO) {
System.out.println("BoardController update()");
boardService.update(boardDTO);
return "board/content";
}
@GetMapping("delete")
public String delete(BoardDTO boardDTO) {
System.out.println("BoardController delete()");
boardService.delete(boardDTO);
return "redirect:/board/list";
}
BoardService
public void update(BoardDTO boardDTO) {
System.out.println("BoardService update()");
boardDAO.update(boardDTO);
}
public void delete(BoardDTO boardDTO) {
System.out.println("BoardService delete()");
boardDAO.delete(boardDTO);
}
BoardDAO
public void update(BoardDTO boardDTO) {
System.out.println("BoardDAO update()");
sqlSession.update(namespace+".update", boardDTO);
}
public void delete(BoardDTO boardDTO) {
System.out.println("BoardDAO delete()");
sqlSession.delete(namespace+".delete", boardDTO);
}
boardMapper
<update id="update">
update board
set `subject`=#{subject}, content=#{content}
where `no`=#{no}
</update>
<delete id="delete">
delete from board
where `no`=#{no}
</delete>
수정, 삭제도 깔끔하게 잘 된다.
글 작성 후 주소 매핑 변경
@PostMapping("/insertPro")
public String insertPro(BoardDTO boardDTO) {
System.out.println("BoardController insertPro()");
boardService.insert(boardDTO);
return "redirect:/board/list";
}
페이지 처리와 검색
board/list.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>
<%-- 반응형 웹 viewport → head태그 사이에 작성 --%>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.header{
float : right;
width: 1200px;
height: 0px;
}
.sidebar{
float : left;
width: 200px;
height: 500px;
}
.content{
width: 1000px;
height: 600px;
}
.footer{
float : right;
width: 1200px;
height: 0px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>게시물 목록</h1>
<table border="1">
<tr>
<th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회수</th>
</tr>
<c:forEach var="boardDTO" items="${boardList}">
<tr onclick="location.href='${pageContext.request.contextPath}/board/content?no=${boardDTO.no }'">
<td>${boardDTO.no }</td><td>${boardDTO.subject }</td><td>${boardDTO.id }</td><td>${boardDTO.writetime }</td><td>${boardDTO.readcount }</td>
</tr>
</c:forEach>
<%-- 게시글 목록 --%>
</table>
<%-- 로그인이 되어 있을 때만 버튼이 보이게--%>
<c:if test="${! empty sessionScope.id }">
<a href="${pageContext.request.contextPath }/board/insert"><button>글쓰기</button></a>
</c:if>
<%-- 페이지 목록 10개씩 10개의 페이지 --%>
<form method="get" action="${pageContext.request.contextPath}/board/list">
<input type="text" name="search" placeholder="검색">
<input type="submit" value="검색하기">
</form>
<c:if test="${pageDTO.startPage > pageDTO.pageBlock }">
<a href="${pageContext.request.contextPath}/board/list?pageNum=${pageDTO.startPage - pageDTO.pageBlock}&search=${pageDTO.search}">Prev</a>
</c:if>
<c:forEach var="i" begin="${pageDTO.startPage }" end="${pageDTO.endPage }" step="1">
<a href="${pageContext.request.contextPath}/board/list?pageNum=${i}&search=${pageDTO.search}">${i}</a>
</c:forEach>
<c:if test="${pageDTO.endPage < pageDTO.pageCount}">
<a href="${pageContext.request.contextPath}/board/list?pageNum=${pageDTO.startPage + pageDTO.pageBlock}&search=${pageDTO.search}">Next</a>
</c:if>
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
BoardController
@GetMapping("/list")
public String main(HttpServletRequest request, Model model, PageDTO pageDTO) {
System.out.println("BoardController main()");
String search = request.getParameter("search"); //검색어 가져오기
//페이지
int pageSize = 5; //화면에 보여줄 글의 개수
String pageNum = request.getParameter("pageNum");
if(pageNum ==null) {
pageNum = "1";
}
int currentPage =Integer.parseInt(pageNum); //int형 currentPage 변수명에 pageNum을 정수형으로 변경
//pageDTO에 저장
pageDTO.setPageSize(pageSize);
pageDTO.setPageNum(pageNum);
pageDTO.setCurrentPage(currentPage);
pageDTO.setSearch(search);
List<BoardDTO> boardList = boardService.getBoardList(pageDTO); //게시물
int count = boardService.getBoardCount(pageDTO); //전체 글의 개수 구하기
int pageBlock = 5; //한 화면에 보여 줄 페이지 개수 설정
int startPage = (currentPage - 1) / pageBlock * pageBlock + 1; //한 화면에 보여 줄 시작 페이지(1~10 -> 1, 11~20 -> 11,...)
int endPage = startPage + pageBlock - 1; //한 화면에 보여 줄 끝 페이지
int pageCount = count / pageSize + (count%pageSize==0? 0:1); //전체 페이지 개수
if(endPage>pageCount) {
endPage = pageCount;
}
pageDTO.setCount(count);
pageDTO.setPageBlock(pageBlock);
pageDTO.setStartPage(startPage);
pageDTO.setEndPage(endPage);
pageDTO.setPageCount(pageCount);
model.addAttribute("boardList",boardList);
model.addAttribute("pageDTO",pageDTO);
return "board/list";
}
BoardService
public List<BoardDTO> getBoardList(PageDTO pageDTO) {
System.out.println("BoardService getBoardList()");
//시작하는 행 번호 구하기(currentPage,pageSize)
int currentPage = pageDTO.getCurrentPage();
int pageSize = pageDTO.getPageSize();
int startRow = (currentPage - 1) * pageSize + 1;
int endRow = startRow + pageSize - 1;
pageDTO.setStartRow(startRow - 1);
pageDTO.setEndRow(endRow);
return boardDAO.getBoardList(pageDTO);
}
public int getBoardCount(PageDTO pageDTO) {
System.out.println("BoardService getBoardCount()");
return boardDAO.getBoardCount(pageDTO);
}
BoardDAO
public List<BoardDTO> getBoardList(PageDTO pageDTO) {
System.out.println("BoardDAO getBoardList()");
return sqlSession.selectList(namespace+".getBoardList", pageDTO);
}
public int getBoardCount(PageDTO pageDTO) {
System.out.println("BoardDAO getBoardCount()");
return sqlSession.selectOne(namespace+".getBoardCount", pageDTO);
}
boardMapper
<select id="getBoardList" resultType="com.mystory001.domain.BoardDTO">
select *
from board
<if test="search != null">
where subject like concat('%',#{search},'%')
</if>
order by num desc
limit #{startRow}, #{pageSize}
</select>
<select id="getBoardCount" resultType="java.lang.Integer">
select count(*)
from board
<if test="search != null">
where `subject` like concat('%',#{search},'%')
</if>
</select>
결과물
1) 로그인 안했을 때
여기서 글 목록 버튼을 클릭하면
오류가 발생하는데 이는 아무래도 content.jsp에서 글 목록 href를 잘 못 준 것 같다.
<%@ 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>그냥 게시판</title>
</head>
<style>
.container{
align-content : center;
width: 1200px;
height: 600px;
}
.content{
width: 1000px;
height: 600px;
}
</style>
<body>
<div class="container"> <%-- container 영역 div --%>
<jsp:include page="../inc/top.jsp" />
<jsp:include page="../inc/sidebar.jsp" />
<div class="content"> <%-- content영역 div --%>
<h1>글 읽기</h1>
<table >
<tr><td>글번호</td><td>${boardDTO.no}</td></tr>
<tr><td>글쓴이</td><td>${boardDTO.id}</td></tr>
<tr><td>조회수</td><td>${boardDTO.readcount}</td></tr>
<tr><td>작성일</td><td>${boardDTO.writetime}</td></tr>
<tr><td>글제목</td><td>${boardDTO.subject}</td></tr>
<tr><td>글내용</td><td>${boardDTO.content}</td></tr>
</table>
<div style="display: center">
<c:if test="${!empty sessionScope.id }">
<c:if test="${sessionScope.id eq boardDTO.id}">
<a href="${pageContext.request.contextPath}/board/update?no=${boardDTO.no}"><input type="button" value="글 수정"></a> <a href="${pageContext.request.contextPath}/board/delete?no=${boardDTO.no}"><input type="button" value="글 삭제"></a>
</c:if>
</c:if>
<a href="${pageContext.request.contextPath}/board/list"><input type="button" value="글 목록"></a>
</div>
</div> <%-- content영역 div --%>
<jsp:include page="../inc/footer.jsp" />
</div> <%-- container 영역 div --%>
</body>
</html>
글 목록으로 잘 돌아간다.
2) 로그인 했을 때
글 수정 후 주소줄에 http://localhost:8080/justboard/board/updatePro 이를 수정
BoardController에 return을 수정
@PostMapping("/updatePro")
public String updatePro(BoardDTO boardDTO) {
System.out.println("BoardController update()");
boardService.update(boardDTO);
return "redirect:/board/list";
}
3)회원가입
※
느낀점
확실히 많은 도움이 되었다. 여기서 조금조금씩 더 추가해서 유지보수하는 방향으로 나아가야겠다.
한 일주일 정도 작업했고 하루 3시간 정도 했으니 시간으로 24시간 소요되었는데 생각보다 빨리 끝난 것 같기도 하다.
전반적으로 많은 공부가 되었다...
내일부터는 이 프로젝트를 하면서 정리해놓은 것들을 더 보기 쉽게 정리하는 시간을 가져볼까한다.
'organize > 프로젝트' 카테고리의 다른 글
justBoard12 댓글 구현(2) 화면 (1) | 2024.10.12 |
---|---|
justBoard11 댓글 구현(1) DB (6) | 2024.10.10 |
justBoard9 (1) | 2024.09.29 |
justBoard8 게시판 클래스 작업 (0) | 2024.09.28 |
justBoard7 member 마무리, board 준비 (1) | 2024.09.26 |