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

# Spring MVC 게시판 예제 15 : 게시글 작성

edenDev 2023. 3. 9.

본 포스팅의 예제는 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 자동로그인
14 게시글 목록 출력

1. 게시글 작성 구현

 

1.1 게시글 작성 영속 계층 (Persistence Tire) 구현

 

src/기본패키지/board/persistence 패키지 안에 BoardDAO 인터페이스와 BoardDAOImpl 클래스 안에 아래와 같이 내용을 추가 해주세요.


//  게시글 카테고리 목록
public List<CategoryVo> getCategoryList();

//  게시글 작성
public void insertPosting(BoardVo param);

//  카테고리 목록
@Override
@LogException
public List<CategoryVo> getCategoryList() {
    return sqlSession.selectList(NAMESPACE + ".getCategoryList");
}

//  게시글 작성
@Override
@LogException
public void insertPosting(BoardVo param) {
    sqlSession.insert(NAMESPACE + ".insertPosting", param);
}

resources/board/BoardSQLMapper.xml 파일에 아래와 같이 내용을 추가 해주세요.


<!-- 카테고리 목록 -->
<select id="getCategoryList" resultType="CategoryVo">
    select * from eden_board_category
</select>

<!-- 게시글 작성 -->
<insert id="insertPosting">
    insert into eden_board (board_no, user_no, category_no, board_title, board_content)
    values (
            eden_board_seq.nextval,
            #{user_no},
            #{category_no},
            #{board_title},
            #{board_content}
           )
</insert>

1.2 게시글 작성 비지니스 계층 (Business Tier) 구현

 

src/기본패키지/board/service 패키지 안에 BoardService 인터페이스와 BoardServiceImpl 클래스 파일에 아래와 같이 내용을 추가 작성해주세요.


//  게시글 카테고리 목록
public List<CategoryVo> getCategoryList();

//  게시글 작성
public void insertPosting(BoardVo param);

//  게시글 카테고리 목록
@Override
@LogException
public List<CategoryVo> getCategoryList() {
    return boardDAO.getCategoryList();
}

//  게시글 작성
@Override
@LogException
public void insertPosting(BoardVo param) {
    boardDAO.insertPosting(param);
}

1.3 게시글 작성 컨트롤러 구현

 

src/기본패키지/board/controller 패키지안에 BoardController 클래스와 RestBoardController 클래스 안에 아래와 같이 내용을 추가 작성해주세요.

@PostMapping(value = "writePosting")
@LogException
public String writePosting(@RequestParam(value = "category_no", defaultValue = "0") int category_no, @ModelAttribute("boardVo") BoardVo param, Model model) {
    model.addAttribute("category_no", category_no);
    model.addAttribute("list", boardService.getCategoryList());
    return "board/writePosting";
}

@RestController
@RequestMapping("/board/*")
public class RestBoardController {

    private static final HashMap<String, Object> data = new HashMap<String, Object>();

    @Autowired
    BoardService boardService;

    //  게시글 작성 프로시저
    @PostMapping(value = "writePostingProcess")
    @LogException
    public HashMap<String, Object> writePostingProcess(@Valid BoardVo param, BindingResult result, HttpSession session) {
        if (result.hasErrors()) {
            data.put("result", "error");
        }

        UserVo sessionUser = (UserVo) session.getAttribute("sessionUser");
        param.setUser_no(sessionUser.getUser_no());
        boardService.insertPosting(param);

        data.put("result", "success");

        return data;
    }
}

1.4 게시글 작성 JSP 페이지 작성

 

web-inf/views/board 패키지 안에 writePosting.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="col-lg-12">
                <form:form action="${path}/board/writePostingProcess" modelAttribute="boardVo" id="writeForm"
                           method="post">
                    <div class="box box-primary">
                        <div class="box-header with-border">
                            <h3 class="box-title">게시글 작성</h3>
                        </div>
                    </div>
                    <div class="box-body">

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <label for="categoryList">카테고리</label>
                            </div>
                        </div>

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <select path="category_no" class="form-control" id="categoryList">
                                    <c:forEach items="${list}" var="category">
                                        <c:choose>
                                            <c:when test="${category_no == category.category_no}">
                                                <option value="${category.category_no}" selected>
                                                        ${category.category_name}
                                                </option>
                                            </c:when>
                                            <c:otherwise>
                                                <option value="${category.category_no}">
                                                        ${category.category_name}
                                                </option>
                                            </c:otherwise>
                                        </c:choose>
                                    </c:forEach>
                                </select>
                            </div>
                        </div>

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <label for="board_title">게시글 제목</label>
                            </div>
                        </div>

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <form:input type="text" class="form-control" path="board_title" id="board_title"
                                            placeholder="제목을 입력해주세요"/>
                            </div>
                        </div>

                        <div class="row mt-1">
                            <div class="col my-auto"><form:errors path="board_title" id="error_message"/></div>
                        </div>

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <label for="board_content">게시글 내용</label>
                            </div>
                        </div>

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <form:textarea path="board_content" class="form-control" id="board_content" rows="30"
                                               placeholder="내용을 입력해주세요" style="resize: none;"/>
                            </div>
                        </div>

                        <div class="row mt-1">
                            <div class="col my-auto"><form:errors path="board_content" id="error_message"/></div>
                        </div>

                        <div class="row mt-1">
                            <div class="col-lg-5">
                                <label for="write">게시글 작성자</label>
                            </div>
                        </div>

                        <div class="row-mt-1">
                            <div class="col-lg-5">
                                <input type="text" id="write" class="form-control" value="${sessionUser.user_nickname}"
                                       disabled>
                            </div>
                        </div>
                    </div>

                    <div class="box-footer">
                        <div class="pull-right">
                            <a href="#" onclick="postingList(${data.category_no});" class="btn btn-primary"><i
                                    class="fa fa-list"></i> 목록</a>
                            <button type="reset" class="btn btn-warning"><i class="fa fa-reply"></i> 초기화</button>
                            <button type="button" id="writePostingButton" class="btn btn-success"><i
                                    class="fa fa-save"></i> 저장
                            </button>
                        </div>
                    </div>
                </form:form>
            </div>
        </section>
    </div>

    <%@ include file="../include/footer.jsp" %>

</div>

<%@ include file="../include/plugin_js.jsp" %>
</body>
</html>

1.5 게시글 작성 JavaScript 작성

 

webapp/resources/dist/js/board 패키지 안에 relatedBulletin.js 파일에 아래와 같이 내용을 추가 해주세요.


function writePosting(category_no) {
    const form = $("form[name='writeForm']");
    $("#category").attr("value", category_no);
    form.attr("action", "../board/writePosting");
    form.attr("method", "post");
    form.submit();
}

window.addEventListener("DOMContentLoaded", function () {

    /* 게시글 작성 */
    $("#writePostingButton").click(function () {
        $.ajax({
            type: "post",
            url: "../board/writePostingProcess",
            data: {
                category_no: $("#categoryList").val(),
                board_title: $("#board_title").val(),
                board_content: $("#board_content").val()
            },
            dataType: "json",
            success: function (data) {
                if (data.result == "error") {
                    location.reload();
                } else {
                    alert("게시글 작성에 성공 하였습니다.");
                    postingList($("#categoryList").val());
                }
            }
        });
    });
})

1.6 게시글 작성 페이지 확인


2. 정리

 

이번에는 게시글 작성 기능을 구현 해보았습니다. 다음에는 게시글 상세보기 기능을 구현 해보도록 하겠습니다.

댓글