organize/프로젝트

justBoard10 마무리

001cloudid 2024. 9. 30. 14:55
728x90

 

이전글 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시간 소요되었는데 생각보다 빨리 끝난 것 같기도 하다.

전반적으로 많은 공부가 되었다...

 

내일부터는 이 프로젝트를 하면서 정리해놓은 것들을 더 보기 쉽게 정리하는 시간을 가져볼까한다.

728x90

'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