organize/프로젝트

justBoard9

001cloudid 2024. 9. 29. 15:25
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값이 들어갔기 때문이다. 일단 다시 점검해 보았는데 딱히 문제 될만한 상황은 찾아보지 못했다.

콘솔창을 확인해보았는데

 

예외가 발생하면 진행 중이던 것이 종료되고 예외처리가 진행되기 때문에 문제가 될만한 것을 생각해 보자면

  1. BoardDAO의 getMaxNo() 메소드에서 문제가 있다.
  2. 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