게시글 목록
•
기능 설명
•
작업 순서
•
실습 코드
•
테스트
•
결과 화면
기능 설명
작업 순서
1.
게시글 ERD 작성
2.
게시글 테이블 생성
3.
Posts.java - 데이터 전송 객체 작성
4.
Category.java - 데이터 전송 객체 작성
5.
6.
7.
8.
9.
10.
11.
list.jsp - 게시글 목록 화면 작성
실습 코드
게시글 ERD 작성
게시글 테이블 생성
•
posts 테이블
•
category 테이블
posts 테이블
CREATE TABLE posts (
id VARCHAR2(255) NOT NULL PRIMARY KEY,
users_id VARCHAR2(255) NOT NULL,
cate_id VARCHAR2(255) NOT NULL,
post_no NUMBER NULL,
title VARCHAR2(200) NULL,
username VARCHAR2(100) DEFAULT 'NOUSER' NULL,
name VARCHAR2(100) NULL,
password VARCHAR2(100) NULL,
content CLOB NULL,
reg_date DATE DEFAULT sysdate NULL,
upd_date DATE DEFAULT sysdate NULL
);
ALTER TABLE posts ADD CONSTRAINT FK_users_TO_posts_1 FOREIGN KEY (
users_id
)
REFERENCES users (
id
);
SQL
복사
category 테이블
CREATE TABLE category (
id VARCHAR2(255) NOT NULL PRIMARY KEY,
category_id VARCHAR2(100) NULL,
name VARCHAR2(100) NULL,
post_no NUMBER NULL,
type VARCHAR2(100) NULL,
seq NUMBER DEFAULT 0 NOT NULL,
reg_date DATE DEFAULT sysdate NULL,
upd_date DATE DEFAULT sysdate NULL
);
ALTER TABLE posts ADD CONSTRAINT FK_category_TO_posts_1 FOREIGN KEY (
cate_id
)
REFERENCES category (
id
);
SQL
복사
카테고리 관리는 관리자 페이지에서 구현한다. 여기서는 샘플 데이터를 넣어본다.Insert into ALOHA.CATEGORY (ID,CATEGORY_ID,NAME,POST_NO,TYPE,SEQ,REG_DATE,UPD_DATE) values ('F35F1FC3C7AE44CA8A335748EC5199FB','B-0002','회원 게시판',1,'board',2,to_date('24/04/12','RR/MM/DD'),to_date('24/04/12','RR/MM/DD'));
Insert into ALOHA.CATEGORY (ID,CATEGORY_ID,NAME,POST_NO,TYPE,SEQ,REG_DATE,UPD_DATE) values ('75773CF72205485E9A75CF67627686DC','B-0001','자유 게시판',1,'board',1,to_date('24/04/12','RR/MM/DD'),to_date('24/04/12','RR/MM/DD'));
SQL
복사
Posts.java - 데이터 전송 객체 작성
package posts.model;
import java.util.Date;
import lombok.Data;
@Data
public class Posts {
private String id;
private String usersId;
private String cateId;
private int postNo;
private String title;
private String username;
private String name;
private String password;
private String content;
private Date regDate;
private Date updDate;
public Posts() {
}
public Posts(String title, String username, String content) {
this.title = title;
this.username = username;
this.content = content;
}
}
Java
복사
Category.java - 데이터 전송 객체 작성
package posts.model;
import java.util.Date;
import lombok.Data;
@Data
public class Category {
private String id;
private String strId;
private String categoryId;
private String name;
private int postNo;
private String type;
private int seq;
private Date regDate;
private Date updDate;
public Category() {
}
public Category(String categoryId, String name, String type) {
this.categoryId = categoryId;
this.name = name;
this.type = type;
this.postNo = 1;
}
}
Java
복사
PostDAO.java - 데이터 접근 객체 작성
package posts.data;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import common.jdbc.JDBConnection;
import posts.model.Posts;
/**
* 데이터 접근 객체
* - 게시글 데이터 접근
*/
public class PostDAO extends JDBConnection {
// 데이터 목록
public List<Posts> list() {
List<Posts> postList = new ArrayList<Posts>();
String sql = " SELECT * "
+ " FROM posts ";
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while( rs.next() ) {
Posts post = new Posts();
post.setId( rs.getString("id") );
post.setUsersId( rs.getString("users_id") );
post.setCateId( rs.getString("cate_id") );
post.setPostNo( rs.getInt("post_no") );
post.setTitle( rs.getString("title") );
post.setUsername( rs.getString("username") );
post.setName( rs.getString("name") );
post.setContent( rs.getString("password") );
post.setContent( rs.getString("content") );
post.setRegDate( rs.getTimestamp("reg_date") );
post.setUpdDate( rs.getTimestamp("upd_date") );
postList.add(post);
}
} catch(SQLException e) {
System.err.println("게시글 목록 조회 시, 예외 발생");
e.printStackTrace();
}
return postList;
}
}
Java
복사
PostService.java - 서비스 인터페이스 작성
package posts.service;
import java.util.List;
import posts.model.Posts;
/**
* 게시판 프로그램의 인터페이스
* * 게시판의 기능 메소드
* - 게시글 목록
* - 게시글 조회
* - 게시글 등록
* - 게시글 수정
* - 게시글 삭제
*
*/
public interface PostService {
// 게시글 목록
List<Posts> list();
}
Java
복사
PostServiceImpl.java - 서비스 구현 클래스 작성
package posts.service;
import java.util.List;
import posts.data.PostDAO;
import posts.model.Posts;
/**
* 게시판 기능 - 비즈니스 로직 클래스
*/
public class PostServiceImpl implements PostService {
private PostDAO postDAO = new PostDAO();
@Override
public List<Posts> list() {
List<Posts> postList = postDAO.list();
return postList;
}
}
Java
복사
CateDAO.java - 데이터 접근 객체 작성
package posts.data;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import common.jdbc.JDBConnection;
import posts.model.Category;
/**
* 데이터 접근 객체
* - 카테고리 데이터 접근
*/
public class CateDAO extends JDBConnection {
// 데이터 목록
public List<Category> list() {
List<Category> categoryList = new ArrayList<Category>();
String sql = " SELECT * "
+ " FROM category"
+ " ORDER BY seq ASC ";
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while( rs.next() ) { // next() : 실행 결과의 다음 데이터로 이동
Category category = new Category();
category.setId( rs.getString("id") );
category.setCategoryId( rs.getString("category_id") );
category.setName( rs.getString("name") );
category.setPostNo( rs.getInt("post_no") );
category.setType( rs.getString("type") );
category.setSeq( rs.getInt("seq") );
category.setRegDate( rs.getTimestamp("reg_date") );
category.setUpdDate( rs.getTimestamp("upd_date") );
categoryList.add(category);
}
} catch(SQLException e) {
System.err.println("카테고리 목록 조회 시, 예외 발생");
e.printStackTrace();
}
return categoryList;
}
}
Java
복사
CateService.java - 서비스 인터페이스 작성
package posts.service;
import java.util.List;
import posts.model.Category;
/**
* 카테고리 인터페이스
* * 카테고리의 기능 메소드
* - 카테고리 목록
* - 카테고리 조회
* - 카테고리 등록
* - 카테고리 수정
* - 카테고리 삭제
*
*/
public interface CateService {
// 카테고리 목록
List<Category> list();
}
Java
복사
CateServiceImpl.java - 서비스 구현 클래스 작성
package posts.service;
import java.util.List;
import posts.data.CateDAO;
import posts.model.Category;
/**
* 카테고리 기능 - 비즈니스 로직 클래스
*/
public class CateServiceImpl implements CateService {
private CateDAO cateDAO = new CateDAO();
@Override
public List<Category> list() {
List<Category> categoryList = cateDAO.list();
return categoryList;
}
}
Java
복사
list.jsp - 게시글 목록 화면 작성
<%@page import="posts.service.PostServiceImpl"%>
<%@page import="posts.model.Posts"%>
<%@page import="posts.service.PostService"%>
<%@page import="posts.model.Category"%>
<%@page import="java.util.List"%>
<%@page import="posts.service.CateServiceImpl"%>
<%@page import="posts.service.CateService"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//카테고리
CateService cateService = new CateServiceImpl();
List<Category> categoryList = cateService.list();
pageContext.setAttribute("categoryList", categoryList);
// 게시글 목록
PostService postService = new PostServiceImpl();
List<Posts> postList;
String cateId = request.getParameter("cateId");
// 게시글 목록 조회
// 카테고리별 조회
if( cateId != null && !cateId.equals("") ) {
postList = postService.listByCateId(cateId);
Category category = cateService.select(cateId);
pageContext.setAttribute("category", category);
}
// 전체 조회
else {
postList = postService.list();
}
pageContext.setAttribute("postList", postList);
%>
<!DOCTYPE html>
<html data-bs-theme="light">
<head>
<meta charset="UTF-8">
<jsp:include page="/layout/main/import/common.jsp" />
<jsp:include page="/layout/main/import/meta.jsp" />
<jsp:include page="/layout/main/import/link.jsp" />
</head>
<body>
<jsp:include page="/layout/main/UI/header.jsp" />
<div class="container">
<div class="px-4 pt-5 my-5 text-center border-bottom">
<h1 class="display-4 fw-bold">게시글 목록</h1>
<div class="col-lg-6 mx-auto">
<p class="lead mb-4">JSP 게시판 프로젝트 입니다.</p>
</div>
</div>
<!-- 게시판 테이블 -->
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center mb-5">
<a href="<%= request.getContextPath() %>/posts/insert.jsp" class="btn btn-success btn-lg px-4 me-sm-3">글쓰기</a>
</div>
<table class="table table-hover">
<thead class="table-dark">
<tr class="text-center">
<th scope="col">#</th>
<th class="text-left w-50" scope="col">제목</th>
<th scope="col">작성자</th>
<th scope="col">날짜</th>
<th scope="col">조회수</th>
</tr>
</thead>
<tbody>
<c:if test="${ postList.isEmpty() }">
<tr>
<td align="center" colspan="5">조회된 데이터가 없습니다.</td>
</tr>
</c:if>
<c:forEach var="post" items="${postList}">
<tr class="text-center">
<td>${post.postNo}</td>
<td class="text-start">
<a href="${ root }/posts/read.jsp?id=${ post.id }">
${post.title}
</a>
</td>
<td>${post.username}</td>
<td>
<fmt:formatDate value="${post.updDate}" pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>0</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<jsp:include page="/layout/main/UI/footer.jsp" />
<jsp:include page="/layout/main/import/script.jsp" />
</body>
</html>
HTML
복사











