오늘 만들 것
지난 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()
로 전달합니다. 즉, 게시물을 조회하는 과정에서 게시물 조회수를 증가시킵니다.
테스트
먼저 기존 상태를 확인합니다.
이제 글 하나를 호출합니다.
DB를 다시 조회해보면 reads가 1로 저장되어 있습니다.
예제 코드
본 포스트의 예제 코드는 GitHub에 공개되어 있습니다.