3층 1구역 - 개발의 장/Spring

spring - 회원제 게시판 구현하기 - 게시판(5) [조회수 증가] (2022-11-07)

상이태상 2022. 11. 8. 00:04

1. 서론

이번에 조회수 증가를 해보도록 하자.

 

2. 본론

많이 추가할 내용은 없다.

 

BoardController.java(전체)

package com.care.pra.board.controller;

import java.io.File;
import java.io.FileInputStream;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.care.pra.board.service.IBoardService;

@Controller
public class BoardController {
	
	//console창에 해당 로그가 찍힌다. 따라서 프로그램의 오류 발생 시 어디서 어떤 이유로 오류가 발생했는지
	//알 수 있어 이슈처리가 용이하다.
	final static Logger logger = LoggerFactory.getLogger(BoardController.class);
	
	@Autowired IBoardService service;
	
	@RequestMapping(value = "writeProc")
	public String writeProc(MultipartHttpServletRequest multi) {
		service.writeProc(multi);
		return "forward:boardProc";
	}
	
	@RequestMapping(value = "boardProc")
	public String boardProc(Model model) {
		service.boardProc(model, 0, null, null);
		return "forward:/index?formpath=board";
	}
	
	//제이쿼리를 통해 viewProc값을 받게 된다.
	@RequestMapping(value = "viewProc")
	public String viewProc(@RequestParam(value = "writeNo", required = false) String writeNo, Model model) {
		
		//만약 게시물 번호가 없거나 비어있다면
		if(writeNo == null || writeNo == "")
			return "forward:/index?formpath=board";
		
		//넘겨받은 게시물의 번호를 정수 자료형으로 변환한다.
		int no = Integer.parseInt(writeNo);
		service.viewProc(no, model);
		
		service.upHit(no);
		return "forward:/index?formpath=view";

	}
	
	@RequestMapping(value = "download")
	public void download(@RequestParam(value = "file") String fileName, HttpServletResponse res) throws Exception {
		if(fileName == "" || "파일 없음".equals(fileName))
			return;
		
		res.addHeader("Content-disposition", "attachment; filename="+fileName);
		File file = new File(IBoardService.FILE_LOCATION + "\\" + fileName);
		FileInputStream input = new FileInputStream(file);
		FileCopyUtils.copy(input, res.getOutputStream());
		input.close();
	}
}

 

BoardController.java(추가된 코드)

service.upHit(no);

 

BoardServiceImpl.java(전체)

package com.care.pra.board.service;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.care.pra.board.BoardDTO;
import com.care.pra.board.repository.IBoardDAO;

@Service
public class BoardServiceImpl implements IBoardService{
	@Autowired IBoardDAO mapper;
	@Autowired HttpSession session;

	@Override
	public void writeProc(MultipartHttpServletRequest multi) {
		String id = (String)session.getAttribute("id");
		String title = multi.getParameter("title");
		String content = multi.getParameter("content");
		
		MultipartFile file = multi.getFile("fileName");
		
		BoardDTO dto = new BoardDTO();
		dto.setId(id);
		dto.setTitle(title);
		dto.setContent(content);
		dto.setHit(0);
		
		SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd");
		Date date = new Date();
		String writeDate = writeFormat.format(date);
		dto.setWriteDate(writeDate);

		if(file.getSize() != 0) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss-");
			Calendar calen = Calendar.getInstance();
			
			String fileName = sdf.format(calen.getTime()) + file.getOriginalFilename();
			dto.setFileName(fileName);
			File save = new File(IBoardService.FILE_LOCATION + "\\" + fileName);
			System.out.println(file.getOriginalFilename());
			try {
				file.transferTo(save);
			} catch (Exception e) {
			e.printStackTrace();
		}
	}else
		dto.setFileName("파일 없음");
		
		mapper.writeProc(dto);
		}

	@Override
	public void viewProc(int no, Model model) {
		model.addAttribute("board", mapper.viewProc(no));
		
	}

	@Override
	public void boardProc(Model model, int currentPage, String search, String select) {
		ArrayList<BoardDTO> boardList = mapper.boardProc();
		model.addAttribute("boardList", boardList);
		
	}

	@Override
	public void upHit(int no) {
		mapper.upHit(no);
		
	}

}

 

BoardServiceImpl.java(추가된 코드)

@Override
	public void upHit(int no) {
		mapper.upHit(no);
		
	}

 

IBoardDAO.java(전체)

package com.care.pra.board.repository;

import java.util.ArrayList;

import org.springframework.stereotype.Repository;

import com.care.pra.board.BoardDTO;

@Repository
public interface IBoardDAO {
	
	void writeProc(BoardDTO dto);
	
	ArrayList<BoardDTO> boardProc();
	
	BoardDTO viewProc(int no);
	
	void upHit(int no);
}

 

boardMapper.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="com.care.pra.board.repository.IBoardDAO">

	<insert id="writeProc" parameterType="com.care.pra.board.BoardDTO">
			<selectKey keyProperty="no" resultType="int" order="BEFORE">
				SELECT nvl(max(no), 0)+1 FROM quiz_board
			</selectKey>
		INSERT INTO quiz_board VALUES(#{no}, #{id}, #{title}, #{content}, #{fileName}, #{writeDate}, #{hit} )
	</insert>
	
	<select id="boardProc" resultType="com.care.pra.board.BoardDTO">
		SELECT * FROM quiz_board
	</select>
	
	<select id="viewProc" resultType="com.care.pra.board.BoardDTO" parameterType="int">
		SELECT * FROM quiz_board WHERE no=#{no}
	</select>
	
	<update id="upHit" parameterType="int" >
		UPDATE quiz_board SET hit=hit+1 WHERE no=#{no}
	</update>

</mapper>

 

결과....결과를 보자.....

 

맨 아래에 있는 글을 클릭해보도록 하자 현재 조회수는 8이다.

 

조회수가 9가 되었다