FRAMEWORK/Spring

[SpringBoot] 게시판 구현하기 4 (게시글 등록 기능 생성하기)

EARTH_ROOPRETELCHAM 2020. 12. 21. 21:37
728x90
반응형

들어가기 전에

하기 포스팅은 "스프링부트 시작하기(김인우 저)" 책을 공부하며 적은 포스팅입니다.

이번 시간에는 앞서 게시글 목록 만들 때, 직접 쿼리로 날렸던 게시글 등록 기능을 GUI로 표현할 수 있도록 구성해보도록 하겠습니다.

게시글 등록 화면 만들기

게시글 등록은 사용자가 입력한 내용이 서버에 저장되는 순서로 진행되므로, 게시글 목록을 만들 때와는 다르게 화면 먼저 만들어보도록 하겠습니다. templates/board 폴더 내에 boardWrite.html 파일을 생성하고 다음과 같이 작성합니다.

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>board</title>
    <link rel="stylesheet" th:href="@{/css/style.css}" href="../../css/style.css"></link>
</head>
<body>
    <div class="container">
        <h2>게시판 등록</h2>
        <form id="frm" name="frm" method="post" action="/board/insertBoard.do">
            <table class="board_detail">
                <tr>
                    <td>제목</td>
                    <td><input type="text" id="title" name="title"></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <textarea id="contents" name="contents"></textarea>
                    </td>
                </tr>
            </table>
            <input type="submit" id="submit" value="저장" class="btn">
        </form>
    </div>
</body>
</html>
  • <form id="frm" name="frm" method="post" action="/board/insertBoard.do">: 사용자로부터 입력된 값을 서버로 전달하기 위해
  • 을 이용합니다. action 속성에는 요청을 수행할 서버의 주소를 입력합니다. 이 단계에서는 아직 /board/insertBoard.do라는 주소가 없지만, 이후 controller에 해당 주소 역시 넣어주어야 합니다.
  • <td><input type="text" id="title" name="title"></td>: 사용자로부터 게시글의 제목을 입력 받습니다. 입력된 값은 각 태그의 name을 키로 사용하여 서버에 전송됩니다.
  • <input type="submit" id="submit" value="저장" class="btn">: <input>의 타입을 submit으로 하여 폼에 있는 데이터를 지정된 주소로 전달합니다.

컨트롤러 영역

컨트롤러에는 두 개의 메소드가 추가됩니다. 한 가지는 게시글 등록 화면을 호출하는 것이고, 나머지 하나는 게시글을 등록하는 기능을 합니다. BoardController 클래스에 하기 내용을 추가합니다.

...
    @RequestMapping("/board/openBoardWrite.do")
    public String openBoardWrite() throws Exception {
        return "/board/boardWrite";
    }

    @RequestMapping("/board/insertBoard.do")
    public String insertBoard(BoardDto board) throws Exception {
        boardService.insertBoard(board);
        return "redirect:/board/openBoardList.do";
    }
...
  • @RequestMapping("/board/openBoardWrite.do"): 게시글 작성 화면을 호출하는 주소입니다.
  • @RequestMapping("/board/insertBoard.do"): 작성된 게시글을 등록하는 주소입니다. boardWrite.html
  • 의 action 속성에 지정된 insertBoard.do가 여기 들어갑니다.
  • boardService.insertBoard(board): 사용자가 작성한 게시글을 저장하는 service 영역의 메소드를 호출합니다.
  • return "redirect:/board/openBoardList.do": 앞에서 특정 뷰를 호출하기 위해 return "/board/boardList"와 같이 뷰 이름을 지정했습니다. 여기서는 이와 다르게 게시글 목록을 조회하는 /board/openBoardList.do라는 주소를 호출합니다. 일반적으로 게시글을 작성하면, 작성된 게시글 상세 화면이나 게시글 목록으로 이동합니다. 여기서는 게시글 목록 화면의 주소를 호출해서 게시글이 등록된 후 게시글 목록 화면으로 이동하도록 하였습니다.

서비스 및 매퍼 영역

BoardService 인터페이스에 다음 내용을 추가합니다.

// BoardService.java
...
void insertBoard(BoardDto board) throws Exception;
...

BoardServiceImpl 클래스에 하기 메소드를 추가합니다.

// BoardServiceImpl.java
...
    @Override
    public void insertBoard(BoardDto board) throws Exception {
        boardMapper.insertBoard(board);
    }
...

BoardMapper 인터페이스에 다음 코드를 추가합니다.

// BoardMapper.java
...
void insertBoard(BoardDto board) throws Exception;
...

SQL 작성하기

sql-board.xml의 안에 하기 쿼리를 추가합니다.

// sql-board.xml
...
    <insert id="insertBoard" parameterType="board.board.dto.BoardDto">
        <![CDATA[
            INSERT INTO t_board
            (
                title,
                contents,
                created_datetime,
                creator_id
            )
            VALUE
            (
                #{title},
                #{contents},
                NOW(),
                'admin'
            )
        ]]>
    </insert>
...
  • #{title}, #{contents}: 화면에서 전달된 데이터입니다. myBatis에서는 #{변수명}의 형식으로 전달된 데이터를 이용합니다. 이 쿼리의 파라미터는 앞에서 만든 BoardDto 클래스입니다. #{변수}를 사용하면 DTO의 get 변수 메소드로 해당하는 변수값을 가져옵니다.
  • 'admin': 일반적으로 작성자의 아이디는 사용자의 아이디이기 때문에 변수로 처리해야 합니다. 하지만, 아직 로그인 기능이 없기 때문에 임시로 admin을 작성자 아이디로 사용합니다.

실행 결과 확인하기

localhost:8080/board/openBoardWrite.do에 접속하여 게시글 등록을 해볼 수 있습니다.

게시판 등록 화면
게시글 등록

728x90
반응형