728x90
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>
<%-- 게시글 목록 --%>
</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>
DBMS에는 조회수 컬럼이 없음. 추가하기
BoardDTO에도 int형 readcount 및 getter, setter 추가
package com.mystory001.domain;
import java.sql.Timestamp;
public class BoardDTO {
private int no;
private String id;
private String subject;
private String content;
private Timestamp writetime;
private int readcount;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Timestamp getWritetime() {
return writetime;
}
public void setWritetime(Timestamp writetime) {
this.writetime = writetime;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
}
글 쓰기 작업
BoardController
(...생략...)
/* 글쓰기 */
@GetMapping("/insert")
public String insert() {
System.out.println("BoardController insert()");
return "board/insert";
}
@PostMapping("/insertPro")
public String insertPro(BoardDTO boardDTO, Model model) {
System.out.println("BoardController insertPro()");
boardService.insert(boardDTO);
return "redirect:/";
}
Controller는 화면과 관련된 작업이므로 글 번호, 작성 시간, 조회수는 로직을 처리하는 Service에서 메소드를 호출하고 처리하게 한다.
BoardService
public void insert(BoardDTO boardDTO) {
System.out.println("BoardService insert()");
//글번호, 날짜, 조회수 작업
boardDTO.setNo(boardDAO.getMaxNo()+1); //글 번호 -> 기본 글 번호 메소드 생성 후 호출 -> 글 번호 + 1로 처리
boardDTO.setWritetime(new Timestamp(System.currentTimeMillis()));
boardDTO.setReadcount(0);
boardDAO.insert(boardDTO);
}
BoardDAO
public void insert(BoardDTO boardDTO) {
System.out.println("BoardDAO insert()");
sqlSession.insert(namespace+".insert", boardDTO);
}
public int getMaxNo() {
System.out.println("BoardDAO getMaxNo()");
return sqlSession.selectOne(namespace+".getMaxNo");
}
boardMapper
<insert id="insert">
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>
글 제목과 내용을 작성하고 작성하기를 눌러보았다.
오류 발생. 일단 이 오류가 왜 발생하는지에 대해 이유를 알아보았다. 이 경우(NullPointerException)는 쿼리 조건 중에 Null값이 들어갔기 때문이다. 일단 다시 점검해 보았는데 딱히 문제 될만한 상황은 찾아보지 못했다.
콘솔창을 확인해보았는데
예외가 발생하면 진행 중이던 것이 종료되고 예외처리가 진행되기 때문에 문제가 될만한 것을 생각해 보자면
- BoardDAO의 getMaxNo() 메소드에서 문제가 있다.
- BoardDAO insert() 메서드가 문제가 있다.
두 가지로 생각해 볼 수 있다. BoardDAO에 문제가 있다고 생각해 보자면, 어노테이션이 붙었는가? namespace에 오타가 있는가? 가 가장 먼저 생각해 볼 만한 사항이다.
package com.mystory001.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.mystory001.domain.BoardDTO;
@Repository
public class BoardDAO {
@Inject
private SqlSession sqlSession;
private static final String namespace = "com.mystory001.mappers.boardMapper";
public List<BoardDTO> getBoardList() {
System.out.println("BoardDAO getBoardList()");
return sqlSession.selectList(namespace+".getBoardList");
}
public void insert(BoardDTO boardDTO) {
System.out.println("BoardDAO insert()");
sqlSession.insert(namespace+".insertBoard", boardDTO);
}
public int getMaxNo() {
System.out.println("BoardDAO getMaxNo()");
return sqlSession.selectOne(namespace+".getMaxNo");
}
}
spring 폴더 안에 있는 root-context.xml, servlet-context.xml을 확인해 봐도 문제 될 만한 사항이 없다.
728x90
'organize > 프로젝트' 카테고리의 다른 글
justBoard11 댓글 구현(1) DB (6) | 2024.10.10 |
---|---|
justBoard10 마무리 (5) | 2024.09.30 |
justBoard8 게시판 클래스 작업 (0) | 2024.09.28 |
justBoard7 member 마무리, board 준비 (1) | 2024.09.26 |
justBoard6 member (2) | 2024.09.25 |