스프링 프레임워크/스프링 MVC

# Spring MVC 게시판 예제 14 : 게시글 목록 출력

edenDev 2023. 3. 7.

본 포스팅의 예제는 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 IntelliJ를 이용한 Spring MVC Project 생성 하기
2 Bootstrap AdminLTE Template 적용하기
3 ExceptionResovler : 예외페이지 처리
4 Spring AOP 적용하기
5 회원가입 구현하기
6 회원 유효성 검사 (Feat. JavaScript)
7 회원 유효성 검사 (Feat. Validation)
8 HttpSession을 이용한 로그인 구현하기
9 아이디 찾기 및 패스워드 찾기
10 내 프로필 페이지 및 회원정보 변경 및 탈퇴 구현
11 인터셉터 권한 체크
12 계정 복구 페이지 구현
13 자동로그인

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. 정리

 

이번에는 게시판에 게시글 목록 출력과 게시판 카테고리 구현을 진행 해보았습니다. 다음에는 게시글 작성에 대해 진행 하도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 

 

댓글