본 포스팅의 예제는 STS 또는 Eclipse를 사용하지 않고 Intellij를 통해 구현하고 있습니다.
그래서 기존의 STS(Spring Tool Studio)에서 생성된 Spring 프로젝트의 스프링 관련 설정 파일명과
프로젝트 구조가 약간 다를 수 있습니다.Intellij 스프링 mvc 프로젝트 생성 포스팅을 참고해주시면 감사하겠습니다.
Spring-MVC 기본 개념 및 테스트 예제 관련 포스팅 링크
순서 | 포스팅 제목 |
1 | Intellij에서 Spring MVC Project 생성하기 |
2 | Spring MVC - MariaDB 연결테스트 |
3 | Spring MVC - Mybatis 설정 및 테스트 |
4 | SpringMVC 구조 |
5 | SpringMVC + Mybatis |
6 | Spring MVC Controller 작성 연습 |
7 | Spring Interceptor |
Spring-MVC 게시판 예제 이전 포스팅 링크
1. 게시글 목록 출력 구현하기
1.1 게시판 테이블 작성
-- 게시판 테이블
drop table eden_board;
create table eden_board
(
board_no number primary key,
user_no number,
category_no number,
board_title varchar2(2000) not null,
board_content varchar2(4000) not null,
board_view_count number default 0,
board_write_date date default sysdate,
constraint board_user_no foreign key (user_no) references eden_user (user_no),
constraint board_category_no foreign key (category_no) references eden_board_category (category_no)
);
-- 게시판 시퀸스
drop sequence eden_board_seq;
create sequence eden_board_seq;
1.2 게시판 클래스 작성
public class BoardVo {
private int board_no; // 게시글 번호
private int user_no; // 유저 넘버
private int category_no; // 카테고리 번호
@NotNull
@Length(min = 1, max = 2000)
private String board_title; // 게시글 제목
@NotNull
@Length(min = 1, max = 4000)
private String board_content; // 게시글 내용
private int board_view_count; // 게시글 조회수
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date board_write_date;
public BoardVo() {
super();
}
public BoardVo(int board_no, int user_no, int category_no, String board_title, String board_content, int board_view_count, Date board_write_date) {
this.board_no = board_no;
this.user_no = user_no;
this.category_no = category_no;
this.board_title = board_title;
this.board_content = board_content;
this.board_view_count = board_view_count;
this.board_write_date = board_write_date;
}
public int getBoard_no() {
return board_no;
}
public void setBoard_no(int board_no) {
this.board_no = board_no;
}
public int getUser_no() {
return user_no;
}
public void setUser_no(int user_no) {
this.user_no = user_no;
}
public int getCategory_no() {
return category_no;
}
public void setCategory_no(int category_no) {
this.category_no = category_no;
}
public String getBoard_title() {
return board_title;
}
public void setBoard_title(String board_title) {
this.board_title = board_title;
}
public String getBoard_content() {
return board_content;
}
public void setBoard_content(String board_content) {
this.board_content = board_content;
}
public int getBoard_view_count() {
return board_view_count;
}
public void setBoard_view_count(int board_view_count) {
this.board_view_count = board_view_count;
}
public Date getBoard_write_date() {
return board_write_date;
}
public void setBoard_write_date(Date board_write_date) {
this.board_write_date = board_write_date;
}
@Override
public String toString() {
return "BoardVo{" +
"board_no=" + board_no +
", user_no=" + user_no +
", category_no=" + category_no +
", board_title='" + board_title + '\'' +
", board_content='" + board_content + '\'' +
", board_view_count=" + board_view_count +
", board_write_date=" + board_write_date +
'}';
}
1.3 게시판 영속 계층 (Persistence Tier) 구현
src/기본패키지/board/persistence 패키지 안에 BoardDAO 인터페이스와 BoardDAOImpl 클래스를 생성 후 내용을 작성 해주세요.
public interface BoardDAO {
// 게시글 목록
public List<BoardVo> getBoardList();
}
@Repository
public class BoardDAOImpl implements BoardDAO {
private static final String NAMESPACE = "mappers.board.BoardSQLMapper";
@Autowired
SqlSession sqlSession;
// 게시글 목록
@Override
@LogException
public List<BoardVo> getBoardList() {
return sqlSession.selectList(NAMESPACE + ".getBoardList");
}
}
resources/mappers/board 패키지 안에 BoardSQLMapepr.xml 생성 후 아래와 같이 내용을 작성 해주세요.
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mappers.board.BoardSQLMapper">
<!-- 게시글 목록 -->
<select id="getBoardList" resultType="BoardVo">
select * from eden_board
</select>
</mapper>
src/기본패키지/user/persistence 패키지 안에 UserDAO 인터페이스와 UserDAOImpl 클래스 안에 아래와 같이 내용을 추가 해주세요.
// 게시글 작성자 정보
public UserVo getUserByNo(int user_no);
// 게시글 작성자 정보 확인
public UserVo getUserByNo(int user_no) {
return sqlSession.selectOne(NAMESPACE + ".getUserByNo", user_no);
}
resources/mappers/user 패키지안에 UserSQLMapper.xml 안에 아래와 같이 내용을 추가 해주세요.
<!-- 게시글 작성자 정보 -->
<select id="getUserByNo" resultType="UserVo">
select * from eden_user where user_no = #{user_no}
</select>
1.4 게시판 비지니스 계층 (Business Tier) 구현
src/기본패키지/board/service 패키지안에 BoardService 인터페이스와 BoardServiceImpl 클래스 생성 후 아래와 같이 내용을 작성해주세요.
public interface BoardService {
// 게시글 목록
public ArrayList<HashMap<String, Object>> getBoardList();
}
@Service
public class BoardServiceImpl implements BoardService{
@Autowired
BoardDAO boardDAO;
@Autowired
UserDAO userDAO;
// 게시글 목록
@Override
@LogException
public ArrayList<HashMap<String, Object>> getBoardList(int category_no) {
ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
List<BoardVo> boardVoList = boardDAO.getBoardList();
for (BoardVo boardVo : boardVoList) {
int userNo = boardVo.getUser_no();
UserVo userVo = userDAO.getUserByNo(userNo);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("boardVo", boardVo);
map.put("userVo", userVo);
data.add(map);
}
return data;
}
}
1.5 게시판 컨트롤러 구현
src/기본패키지/board/controller 패키지 안에 BoardController 클래스 생성 후 아래와 같이 작성 해주세요.
@Controller
@RequestMapping("/board/*")
public class BoardController {
@Autowired
BoardService boardService;
@GetMapping(value = "postingList")
@LogException
public String postingList(Model model) {
ArrayList<HashMap<String, Object>> dataList = boardService.getBoardList();
model.addAttribute("dataList", dataList);
return "board/postingList";
}
}
1.6 게시판 목록 페이지 JSP 작성
web-inf/views/board 패키지 안에 postingList.jsp 파일 생성 후 아래와 같이 내용을 작성 해주세요.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="../include/head.jsp" %>
<%@ include file="../include/user_menu.jsp" %>
<html>
<body class="hold-transition skin-green-light sidebar-mini" oncopy="return false" oncut="return false"
onpaste="return false">
<div class="wrapper">
<%@ include file="../include/top_menu.jsp" %>
<%@ include file="../include/left_menu.jsp" %>
<div class="content-wrapper">
<section class="content container-fluid">
<div class="box-header with-border">
</div>
<div class="box-body">
<table class="table table-bordered">
<thead>
<tr>
<th class="col-xs-1">글 번호</th>
<th class="col-xs-2">제목</th>
<th class="col-xs-2">작성자</th>
<th class="col-xs-2">작성일</th>
<th class="col-xs-1">조회수</th>
</tr>
</thead>
<tbody>
<c:forEach items="${dataList }" var="data">
<tr>
<td>${data.boardVo.board_no}</td>
<td><a
href="javascript:goPage(${data.boardVo.board_no});">${data.boardVo.board_title }</a>
<span class="badge bg-teal"><i class="fa fa-comment-o"></i> + ${data.totalCommentCount}</span>
</td>
<td>${data.userVo.user_nickname}</td>
<td><fmt:formatDate value="${data.boardVo.board_write_date }" pattern="yyyy:MM:dd: HH:mm:ss" /></td>
<td><span class="badge bg-red">${data.boardVo.board_view_count}</span></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div class="box-footer">
<div class="pull-right">
<a class="btn btn-success btn-flat" href="javascript:writePage();">
<i class="fa fa-pencil"></i> 글쓰기
</a>
</div>
</div>
</section>
</div>
<%@ include file="../include/footer.jsp" %>
</div>
<%@ include file="../include/plugin_js.jsp" %>
</body>
</html>
1.7 게시글 목록 화면 확인
위와 같이 게시글 목록 페이지에 접속화면 목록이 출력 되는 것을 확인 할 수 있습니다.
2. 게시판 카테고리 구현
2.1 게시판 카테고리 테이블 작성
-- 게시판 카테고리
drop table eden_board_category;
create table eden_board_category
(
category_no number primary key,
category_name varchar2(200) not null
);
-- 게시판 카테고리 시퀸스
drop sequence eden_board_category_seq;
create sequence eden_board_category_seq;
-- 게시판 카테고리 생성
insert into eden_board_category (category_no, category_name) values (eden_board_category_seq.nextval, '자유게시판');
insert into eden_board_category (category_no, category_name) values (eden_board_category_seq.nextval, '사진게시판');
insert into eden_board_category (category_no, category_name) values (eden_board_category_seq.nextval, '동영상게시판');
2.2 게시판 카테고리 클래스 작성
src/기본패키지/board/domain 패키지 안에 CategoryVo 클래스 생성 후 아래와 같이 내용을 작성 해 주세요.
public class CategoryVo {
private int category_no; // 카테고리 번호
private String category_name; // 카테고리 이름
public CategoryVo() {
super();
}
public CategoryVo(int category_no, String category_name) {
this.category_no = category_no;
this.category_name = category_name;
}
public int getCategory_no() {
return category_no;
}
public void setCategory_no(int category_no) {
this.category_no = category_no;
}
public String getCategory_name() {
return category_name;
}
public void setCategory_name(String category_name) {
this.category_name = category_name;
}
@Override
public String toString() {
return "CategoryVo{" +
"category_no=" + category_no +
", category_name='" + category_name + '\'' +
'}';
}
}
2.3 게시판 카테고리 영속 계층(Persistence Tier) 구현
src/기본패키지/board/persistence 패키지 안에 BoardDAO 인터페이스와 BoardDAOImpl 클래스 안에 아래와 같이 코드를 추가해주세요.
// 게시글 목록 (카테고리별 정렬)
public List<BoardVo> getBoardByCategoryList(int category_no);
// 게시글 카테고리 정보
public CategoryVo getCategoryByNo(int category_no);
// 게시글 목록 (카테고리별 정렬)
@Override
@LogException
public List<BoardVo> getBoardByCategoryList(int category_no) {
return sqlSession.selectList(NAMESPACE + ".getBoardByCategoryList", category_no);
}
// 카테고리리 정보
@Override
@LogException
public CategoryVo getCategoryByNo(int category_no) {
return sqlSession.selectOne(NAMESPACE + ".getCategoryByNo", category_no);
}
2.4 게시판 카테고리 비지니스 계층(Business Tier) 구현
src/기본패키지/board/service 패키지 안에 BoardService 인터페이스와 BoardServiceImpl 클래스의 내용을 아래와 같이 수정 해주세요.
public interface BoardService {
// 게시글 목록
public ArrayList<HashMap<String, Object>> getBoardList(int category_no);
}
@Service
public class BoardServiceImpl implements BoardService{
@Autowired
BoardDAO boardDAO;
@Autowired
UserDAO userDAO;
// 게시글 목록
@Override
@LogException
public ArrayList<HashMap<String, Object>> getBoardList(int category_no) {
ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
List<BoardVo> boardVoList;
if (category_no != 0) {
boardVoList = boardDAO.getBoardByCategoryList(category_no);
} else {
boardVoList = boardDAO.getBoardList();
}
for (BoardVo boardVo : boardVoList) {
int userNo = boardVo.getUser_no();
UserVo userVo = userDAO.getUserByNo(userNo);
CategoryVo categoryVo = boardDAO.getCategoryByNo(boardVo.getCategory_no());
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("boardVo", boardVo);
map.put("userVo", userVo);
map.put("categoryVo", categoryVo);
data.add(map);
}
return data;
}
}
2.5 게시판 카테고리 컨트롤러 구현
src/기본패키지/board/controller 패키지 안에 BoardController 클래스 안에 내용을 아래와 같이 수정 해주세요.
@Controller
@RequestMapping("/board/*")
public class BoardController {
@Autowired
BoardService boardService;
@GetMapping(value = "postingList")
@LogException
public String postingList(@RequestParam(value = "category_no", defaultValue = "0") int category_no, Model model) {
ArrayList<HashMap<String, Object>> dataList = boardService.getBoardList(category_no);
model.addAttribute("dataList", dataList);
return "board/postingList";
}
}
2.6 게시판 카테고리 JSP 작성
web-inf/views/board 패키지 안에 postinList.jsp 파일의 내용을 아래와 같이 수정 해주세요.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="../include/head.jsp" %>
<%@ include file="../include/user_menu.jsp" %>
<html>
<body class="hold-transition skin-green-light sidebar-mini" oncopy="return false" oncut="return false"
onpaste="return false">
<div class="wrapper">
<%@ include file="../include/top_menu.jsp" %>
<%@ include file="../include/left_menu.jsp" %>
<div class="content-wrapper">
<section class="content container-fluid">
<div class="box-header with-border">
</div>
<div class="box-body">
<table class="table table-bordered">
<thead>
<tr>
<th class="col-xs-1">글 번호</th>
<th class="col-xs-1">카테고리</th>
<th class="col-xs-2">제목</th>
<th class="col-xs-2">작성자</th>
<th class="col-xs-2">작성일</th>
<th class="col-xs-1">조회수</th>
</tr>
</thead>
<tbody>
<c:forEach items="${dataList }" var="data">
<tr>
<td>${data.boardVo.board_no}</td>
<td>${data.categoryVo.category_name}</td>
<td><a
href="javascript:goPage(${data.boardVo.board_no});">${data.boardVo.board_title }</a>
<span class="badge bg-teal"><i class="fa fa-comment-o"></i> + ${data.totalCommentCount}</span>
</td>
<td>${data.userVo.user_nickname}</td>
<td><fmt:formatDate value="${data.boardVo.board_write_date }" pattern="yyyy:MM:dd: HH:mm:ss" /></td>
<td><span class="badge bg-red">${data.boardVo.board_view_count}</span></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div class="box-footer">
<div class="pull-right">
<a class="btn btn-success btn-flat" href="javascript:writePage(${category_no});">
<i class="fa fa-pencil"></i> 글쓰기
</a>
</div>
</div>
</section>
</div>
<%@ include file="../include/footer.jsp" %>
</div>
<%@ include file="../include/plugin_js.jsp" %>
</body>
</html>
2.7 게시판 카테고리 화면 확인
2. 정리
이번에는 게시판에 게시글 목록 출력과 게시판 카테고리 구현을 진행 해보았습니다. 다음에는 게시글 작성에 대해 진행 하도록 하겠습니다.
'스프링 프레임워크 > 스프링 MVC' 카테고리의 다른 글
# Spring MVC 게시판 예제 16 : 게시글 상세보기 (0) | 2023.03.10 |
---|---|
# Spring MVC 게시판 예제 15 : 게시글 작성 (0) | 2023.03.09 |
# Spring MVC 게시판 예제 13 : 자동 로그인 기능 구현 (0) | 2023.03.07 |
# Spring MVC 게시판 예제 12 : 계정 복구 (0) | 2023.03.05 |
# Spring MVC 게시판 예제 11 : 인터셉터를 활용한 권한체크 (0) | 2023.03.05 |
댓글