게시물을 등록한 게 없어서 게시물을 작성하는 것 먼저 만들어보려고 했는데
글쓰기를 board 안에서 기능이 되게 하고 싶어서
DB에 임의로 데이터를 300개 정도 집어넣어 두고 게시판 리스트를 먼저 만들어야겠다고 생각했다.
그러기 위해선 DB에 board table를 먼저 생성해야 한다.
그리고 관련 내용을 webapp > resources > sql.sql에 기재했다.
sql.sql
/* ... (기존 코드) */
-- 2023-12-10
CREATE TABLE board (
bno INT NOT NULL auto_increment,
title VARCHAR(200) NOT NULL,
writer VARCHAR(100) NOT NULL,
content text,
regdate datetime DEFAULT current_timestamp,
moddate datetime DEFAULT current_timestamp,
readcount INT DEFAULT 0,
PRIMARY KEY (bno));
# 게시판에 300개 정도 채우기
INSERT INTO board (title, writer, content)
VALUES("titleTest","tester","contentTest");
DB의 board table을 참고해 domain package에 BoardVO class를 생성한다.
생성자는 본인이 무엇을 사용할지 생각하며 만들어 준다.
BoardVO.java
package domain;
public class BoardVO {
private int bno;
private String title;
private String writer;
private String content;
private String regdate;
private String moddate;
private int readcount;
public BoardVO() {}
//insert : title, writer, content
public BoardVO(String title, String writer, String content) {
this.title = title;
this.writer = writer;
this.content = content;
}
// list : bno, title, writer, regdate, readcount
public BoardVO(int bno, String title, String writer, String content, String regdate, int readcount) {
this.bno = bno;
this.title = title;
this.writer = writer;
this.content = content;
this.regdate = regdate;
this.readcount = readcount;
}
// update : bno, title, content
public BoardVO(int bno, String title, String content) {
this.bno = bno;
this.title = title;
this.content = content;
}
// detail : 전부 다
public BoardVO(int bno, String title, String writer, String content,
String regdate, String moddate, int readcount) {
this.bno = bno;
this.title = title;
this.writer = writer;
this.content = content;
this.regdate = regdate;
this.moddate = moddate;
this.readcount = readcount;
}
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public String getModdate() {
return moddate;
}
public void setModdate(String moddate) {
this.moddate = moddate;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
@Override
public String toString() {
return "BoardVO [bno=" + bno + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regdate="
+ regdate + ", moddate=" + moddate + ", readcount=" + readcount + "]";
}
}
orm > MybatisConfig.xml 에서 bvo로 alias도 지정해주고 boardMapper도 먼저 선언했다.
Mybatis.Config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases> <!-- 여러개 생성 가능 / 없는 것을 만들 순 없음 -->
<typeAlias type="domain.MemberVO" alias="mvo"/>
<typeAlias type="domain.BoardVO" alias="bvo"/>
</typeAliases>
// ... (기존 코드)
<mappers>
<mapper resource="mapper/memberMapper.xml"/>
<mapper resource="mapper/boardMapper.xml"/>
</mappers>
</configuration>
mapper package에 boardMapper.xml도 뒤이어 바로 생성해주었다.
memberMapper와 마찬가지로 https://mybatis.org/mybatis-3/ko/getting-started.html 를 참고해서 작성했다.
boardMapper.xml
<?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="BoardMapper">
</mapper>
BoardController를 controller package에 servlet으로 생성하되 URL Mappings은 /brd/*로 설정하고
method stubs는 service에도 체크해준다.
이번 게시물은 board의 controller / service / DAO들을 생성하는 것부터 다시 시작하는거라
기본 틀은 앞서 설명했던 member의 controller / service / DAO와 다를바가 없다.
그러므로 중복되는 설명은 생략하고 기본 틀이 이해가 되지 않는다면
https://rlog0918.tistory.com/177를 참고하여 member부터 제대로 이해하고 오는 것을 추천한다.
기본 틀 작성이 끝나면 case list 코드를 작성한다.
일단 화면에 리스트를 뿌리는게 목적이라, 화면에 모든 데이터가 뿌려지는 것을 확인하고 나면
페이지네이션을 할 예정이다.
BoardController.java
package controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.BoardVO;
import service.BoardService;
import service.BoardServiceImpl;
@WebServlet("/brd/*")
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(BoardController.class);
private RequestDispatcher rdp;
private String destPage;
private int isOk;
private BoardService bsv;
public BoardController() {
bsv = new BoardServiceImpl();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
String uri = request.getRequestURI();
String path = uri.substring(uri.lastIndexOf("/")+1);
log.info(">>> path >>> {}", path);
switch(path) {
case "list":
try {
List<BoardVO> list = bsv.getList();
log.info(">>> list >>> {} ", list);
// 가져온 list를 "list"라는 이름으로 list.jsp에 뿌림
request.setAttribute("list", list);
destPage = "/board/list.jsp";
} catch (Exception e) {
log.info("list error");
e.printStackTrace();
}
break;
}
rdp = request.getRequestDispatcher(destPage);
rdp.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
service(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
service(request, response);
}
}
BoardService.interface
package service;
import java.util.List;
import domain.BoardVO;
public interface BoardService {
List<BoardVO> getList();
}
BoardServiceImpl.java
package service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.BoardVO;
import repository.BoardDAO;
import repository.BoardDAOImpl;
public class BoardServiceImpl implements BoardService {
private static final Logger log = LoggerFactory.getLogger(BoardServiceImpl.class);
private BoardDAO bdao;
public BoardServiceImpl() {
bdao = new BoardDAOImpl();
}
@Override
public List<BoardVO> getList() {
log.info(">>> list check 2");
return bdao.selectList();
}
}
BoardDAO.interface
package repository;
import java.util.List;
import domain.BoardVO;
public interface BoardDAO {
List<BoardVO> selectList();
}
BoardDAOImpl.java
package repository;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.BoardVO;
import orm.DatabaseBuilder;
public class BoardDAOImpl implements BoardDAO {
private static final Logger log = LoggerFactory.getLogger(BoardDAOImpl.class);
private SqlSession sql;
public BoardDAOImpl() {
new DatabaseBuilder();
this.sql = DatabaseBuilder.getFactory().openSession();
}
@Override
public List<BoardVO> selectList() {
log.info(">>> list check 3");
return sql.selectList("BoardMapper.list");
}
}
boardMapper.xml
<?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="BoardMapper">
<select id="list" resultType="bvo">
select * from order by bno desc
</select>
</mapper>
index.jsp에서 게시판 리스트를 보여줄 곳에 a태그를 설정해준다.
index.jsp
// ... (기존 코드)
<body>
<header>
<div>Logo</div>
<div>
<ul>
<li><a href="/index.jsp">HOME</a></li>
<c:if test="${ses.id eq null }">
<li><a href="/member/login.jsp">LOGIN</a></li>
<li><a href="/memb/join">SIGNUP</a></li>
</c:if>
<c:if test="${ses.id ne null }">
<li><a href="/brd/list">BOARD</a></li>
<li><a href="/memb/mypage">MYPAGE</a></li>
<li><a href="/memb/logout">LOGOUT</a></li>
</c:if>
</ul>
</div>
</header>
// ... (기존 코드)
</body>
</html>
게시판 리스트에 데이터를 뿌릴 준비는 끝났다.
이제 게시판 리스트 화면을 만들기 위해 webapp에 board 폴더를 만들고 거기에 list.jsp 파일을 생성한다.
<c:forEach>를 사용하여 데이터를 뿌릴 것이기 때문에 상단에 taglib도 선언한다.
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>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
<h1>정보 게시판</h1>
<table>
<tr>
<th>No</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
<!-- DB에서 가져온 리스트를 c:forEach를 통해 반복
var="bvo"는 BoardVO 객체를 참조한다. -->
<c:forEach items="${list}" var="bvo">
<tr>
<td>${bvo.bno }</td>
<td><a href="#"></a>${bvo.bno }</td>
<td>${bvo.writer }</td>
<td>${bvo.regdate }</td>
<td>${bvo.readcount }</td>
</tr>
</c:forEach>
</table>
<a href ="#"><button>글쓰기</button></a>
</body>
</html>
여기까지하면 게시판에 들어갔을 때 데이터들이 모두 한꺼번에 쏟아져 있는 것을 확인할 수 있다.
게시판 화면
회원탈퇴 성공 시
[JSP/Servlet] 7. 게시판 리스트 - 화면에 뿌리기
(다음 게시물 예고편)
[JSP/Servlet] 8. 게시판 리스트 - 검색과 페이지네이션
얼렁뚱땅 주니어 개발자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!