:: Dev/Spring

[Sp-re-ing] 09 - 게시판 구현하기 (5) - 게시물 호출 API 확장

jETA 2020. 5. 19. 10:00
반응형

오늘 만들 것

지난 Lab05에서 우리는 게시물 호출 API를 작성했었습니다.

그 때 게시물 호출 API 작성하며 게시물 조회수 카운트는 나중에 구현하기 위해 주석만 남겨두었습니다.

 

오늘은 그 때 미뤄둔 게시물 조회수 카운트를 구현합니다.

 

시작

이번 글은 Lab08의 코드에 기능을 추가하는 방식으로 진행합니다.
Lab08은 이전 글에서 확인할 수 있습니다.

별도의 프로젝트에서 진행하고자 하면, Lab08과 동일하게 프로젝트를 생성한 뒤 코드를 복사해서 준비합니다.
Lab08의 코드를 그대로 사용한다면 아래 예제 코드의 패키지명에 유의합니다.

아래 예제 코드는 별도의 프로젝트를 생성하는 방식으로 진행합니다.

 

DAO 수정

다음 경로의 파일을 아래와 같이 편집합니다: /src/main/java/YOUR/DOMAIN/ARTIFACT/dao/BoardDAO.java

package net.jetalab.spreinglab09.dao;

import net.jetalab.spreinglab09.dto.BoardDTO;

public interface BoardDAO {
    int newBoard(BoardDTO param) throws Exception;
    BoardDTO getBoard(BoardDTO param) throws Exception;
    int editBoard(BoardDTO param) throws Exception;
    int addBoardReadCount(BoardDTO param) throws Exception;
}

9번째 줄: 게시물 번호를 받아서 조회수를 증가시키는 addBoardReadCount() 메소드가 추가되었습니다.

 

SQL Mapper 수정

다음 경로의 파일을 아래와 같이 편집합니다: /src/main/resources/mappers/UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="net.jetalab.spreinglab09.dao.BoardDAO">

    <insert id="newBoard" parameterType="net.jetalab.spreinglab09.dto.BoardDTO" useGeneratedKeys="true" keyProperty="seq">
        INSERT INTO lab09(`title`, `contents`, `author`, `password`)
        VALUES (#{title}, #{contents}, #{author}, #{password})
    </insert>

    <select id="getBoard" parameterType="net.jetalab.spreinglab09.dto.BoardDTO" resultType="net.jetalab.spreinglab09.dto.BoardDTO">
        SELECT `seq`, `title`, `contents`, `author`, `reads`
          FROM lab09
         WHERE `seq` = #{seq}
           <if test="password != null">
           AND `password` = #{password}
           </if>
           AND `deleted` = 'N'
    </select>

    <update id="editBoard" parameterType="net.jetalab.spreinglab09.dto.BoardDTO">
        UPDATE lab09
           SET `password` = `password`
           <if test="title != null">
             , `title` = #{title}
           </if>
           <if test="contents != null">
             , `contents` = #{contents}
           </if>
           <if test="author != null">
             , `author` = #{author}
           </if>
           <if test="deleted != null">
             , `deleted` = #{deleted}
           </if>
         WHERE `seq` = #{seq}
    </update>

    <update id="addBoardReadCount" parameterType="net.jetalab.spreinglab09.dto.BoardDTO">
        UPDATE lab09
           SET `reads` = `reads` + 1
         WHERE `seq` = #{seq}
           AND `deleted` = 'N'
    </update>

</mapper>

 

39번째 줄 ~ 44번째 줄: 지정한 seq에 해당하는 글의 reads값을 증가시킵니다.

 

Controller 수정

다음 경로에 아래 코드를 작성하여 저장합니다: /src/main/java/YOUR/DOMAIN/ARTIFACT/controller/BoardController.java

package net.jetalab.spreinglab09.controller;

import net.jetalab.spreinglab09.dao.BoardDAO;
import net.jetalab.spreinglab09.dto.BoardDTO;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableAutoConfiguration
@MapperScan(basePackages = "net.jetalab.spreinglab09.dao")
public class BoardController {

    @Autowired
    private BoardDAO boardDAO;

    @RequestMapping(value = "/board", method = RequestMethod.POST)
    public ResponseEntity<BoardDTO> postBoard(BoardDTO board) throws Exception {
        if ((board.getAuthor() == null) || (board.getContents() == null) || (board.getPassword() == null) || (board.getTitle() == null)) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }

        boardDAO.newBoard(board);
        return new ResponseEntity<>(board, HttpStatus.OK);
    }

    @RequestMapping(value = "/board/{seq}", method = RequestMethod.GET)
    public ResponseEntity<BoardDTO> getBoard(@PathVariable("seq") final int seq) throws Exception {
        BoardDTO param = new BoardDTO();
        param.setSeq(seq);

        boardDAO.addBoardReadCount(param);
        BoardDTO board = boardDAO.getBoard(param);

        if (board == null) return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        else return new ResponseEntity<>(board, HttpStatus.OK);
    }

    @RequestMapping(value = "/board/{seq}", method = RequestMethod.PUT)
    public ResponseEntity<BoardDTO> putBoard(@PathVariable("seq") final int seq, BoardDTO param) throws Exception {
        if ((param.getAuthor() == null) || (param.getContents() == null) || (param.getPassword() == null) || (param.getTitle() == null)) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }

        param.setSeq(seq); // 조회할 게시물 번호 지정
        BoardDTO board = boardDAO.getBoard(param);
        if (board == null) return new ResponseEntity<>(HttpStatus.NOT_FOUND);

        board.setTitle(param.getTitle());
        board.setContents(param.getContents());
        board.setAuthor(param.getAuthor());
        boardDAO.editBoard(board);

        return new ResponseEntity<>(board, HttpStatus.OK);
    }

    @RequestMapping(value = "/board/{seq}", method = RequestMethod.DELETE)
    public ResponseEntity<BoardDTO> deleteBoard(@PathVariable("seq") final int seq, BoardDTO param) throws Exception {
        if (param.getPassword() == null) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }

        param.setSeq(seq); // 조회할 게시물 번호 지정
        BoardDTO board = boardDAO.getBoard(param);
        if (board == null) return new ResponseEntity<>(HttpStatus.NOT_FOUND);

        board.setDeleted("Y");
        boardDAO.editBoard(board);

        return new ResponseEntity<>(HttpStatus.OK);
    }

}

 

38번째 줄: 게시물 조회에 쓰이는 파라미터를 addBoardReadCount()로 전달합니다. 즉, 게시물을 조회하는 과정에서 게시물 조회수를 증가시킵니다.

 

테스트

먼저 기존 상태를 확인합니다.

현재 조회수는 0입니다.

 

이제 글 하나를 호출합니다.

reads가 1로 올라 있습니다.

 

DB를 다시 조회해보면 reads가 1로 저장되어 있습니다.

여러번 조회하면 그만큼 올라가 있습니다.

 

 

예제 코드

본 포스트의 예제 코드는 GitHub에 공개되어 있습니다.

https://github.com/jETA-Kor/sp-re-ing/tree/master/lab09

반응형