본문 바로가기
Programming/Spring

[스프링 프레임워크]게시판 만들기 #6 : 게시글 수정, 게시글 삭제

by hyunipad 2021. 10. 23.
반응형
본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다.
기본적인 내용은 지난 포스팅을 참고해주시기 바랍니다.

2021.10.23 - [Java/Spring] - [스프링 프레임워크]게시판 만들기 #5 : 게시글 조회

 

[스프링 프레임워크]게시판 만들기 #5 : 게시글 조회

본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다. 기본적인 내용은 지난 포스팅을 참고해주시기 바랍니다. 2021.10.10 - [Java/Spring] - [스프링 프레임워크]

hyunipad.tistory.com

이번 포스팅에서는 스프링 프레임워크에서 게시글의 수정과 삭제를 구현해보도록 하겠습니다.

사실 회사 내에서도 스프링을 사용하지 않고는 있어서 게시판 연습을 하면서도 뭔가 스프링의 기능들을 다 사용하지 못하고 있다는 생각이 들긴 합니다.

 

view.jsp

수정과 삭제를 위해 view.jsp에 버튼 두개를 추가했습니다.

저는 데이터를 전달할 때 Javascript를 사용하고 있지만, 여러 가지의 구현 방식이 존재합니다.

기능이 정상적으로 작동된다면 틀린 방식은 없겠지만, 여러가지 보안 문제(취약점)에도 안전해야 합니다.

이걸 보시는분은 아마 대부분 저와 비슷한 경력을 가진 개발자이실 거 같습니다.

다음 포스팅에서는 이러한 데이터를 전달할 때, 어떻게 해야 안전하게 구현할 수 있는지에 대해 알아볼 예정입니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="${path}/resources/js/board.js"></script>
<title>Insert title here</title>
</head>
<body>
<form id="frm">
<input type="hidden" value="" name="seq" id="seq">
<div>제목 : ${view.subject} 조회수 : ${view.readCount}</div>
<div>작성자 : ${view.name}</div>
<div>내용 : ${view.content} </div>
<button type="button" onclick='location.href="/board/list"'>목록</button>
<button type="button" onclick='fn_goUpdateView(${view.seq})'>수정</button>
<button type="button" onclick='fn_boardDelete(${view.seq})'>삭제</button>
</form>
</body>
</html>

 

update.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="${path}/resources/js/board.js"></script>
<title>Insert title here</title>
</head>
<body>
<form id="frm">
	<input type="hidden" value="${view.seq}" name="seq" id="seq">
	제목 : <input type="text" placeholder="제목" id="subject" name="subject" value="${view.subject}">
	작성자 : <input type="text" placeholder="작성자" id="name" name="name" readonly="readonly" value="${view.name}">
	<div>내용 : <input type="text" placeholder="내용" id="content" name="content" value="${view.content}"></div> 
	<button type="button" onclick="fn_boardUpdate();">등록</button>
</form>
</body>
</html>

board.js

function fn_boardRegi(){
	var subject = $("#subject").val();
	var name = $("#name").val();
	var content = $("#content").val();
	
	$.ajax({
		type : "POST",
		url : "/board/regi",
		data : {subject : subject, name : name, content : content},
		success: function(data){
			if(data == "Y"){
				alert("글 등록이 완료되었습니다.");
				location.href = "/board/list";		
			}else{
				alert("글 등록이 실패되었습니다.");
			}
		},
		error: function(data){
			alert("실패");
			console.log(data);
		}
	});
};

function fn_boardUpdate(){
	var seq = $("#seq").val();
	var subject = $("#subject").val();
	var name = $("#name").val();
	var content = $("#content").val();

	$.ajax({
		type : "POST",
		url : "/board/update",
		data : {seq: seq, subject : subject, name : name, content : content},
		success: function(data){
			if(data == "Y"){
				alert("글 수정이 완료되었습니다.");
				fn_goView(seq);
			}else{
				alert("글 수정이 실패되었습니다.");
			}
		},
		error: function(data){
			alert("실패");
			console.log(data);
		}
	});
}

function fn_boardDelete(seq){
	$.ajax({
		type : "POST",
		url : "/board/delete",
		data : {seq: seq},
		success: function(data){
			if(data == "Y"){
				alert("글 삭제 완료되었습니다.");
				location.href = "/board/list";		
			}
		},
		error: function(data){
			alert("실패");
			console.log(data);
		}
	});
}

function fn_goView(seq){
	$("#seq").val(seq);

	var f = $("#frm");
	f.attr("action", "/board/view");
	f.attr("method", "POST");
	f.submit();
};

function fn_goUpdateView(seq){
	$("#seq").val(seq);

	var f = $("#frm");
	f.attr("action", "/board/goUpdateView");
	f.attr("method", "POST");
	f.submit();
};

 

BoardController.java

package com.board.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.board.domain.BoardDTO;
import com.board.service.BoardService;

@Controller
@RequestMapping(value="/board/*")
public class BoardController {
	
	 @Inject
	 private BoardService service;
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String list(Locale locale, Model model) throws Exception {
		  List list = service.list();
		  model.addAttribute("list", list);
		  
		  return "/board/list";
	}
	
	@RequestMapping(value = "/regiView", method = RequestMethod.GET)
	public String regiView(Locale locale, Model model) throws Exception {
		return "/board/regi";
	}
	
	@ResponseBody
	@RequestMapping(value = "/regi", method = RequestMethod.POST)
	public  String regi(Locale locale, Model model, BoardDTO dto) throws Exception {
		
		Date date = new Date(System.currentTimeMillis());
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
		
		dto.setReg_date(format.format(date));
		
		if(service.regi(dto) == 1) {
			return "Y";
		}else {
			return "N";
		}
	}
	
	@RequestMapping(value = "/view", method = RequestMethod.POST)
	public String view(Locale locale, Model model, HttpServletRequest request) throws Exception {
		BoardDTO dto = service.view(Integer.parseInt((String)request.getParameter("seq")));
		model.addAttribute("view", dto);
		return "/board/view";
	}
	
	@RequestMapping(value = "/goUpdateView", method = RequestMethod.POST)
	public String updateView(Locale locale, Model model, HttpServletRequest request) throws Exception {
		BoardDTO dto = service.view(Integer.parseInt((String)request.getParameter("seq")));
		model.addAttribute("view", dto);
		return "/board/update";
	}
	
	@ResponseBody
	@RequestMapping(value = "/update", method = RequestMethod.POST)
	public String update(Locale locale, Model model, BoardDTO dto) throws Exception {
		if(service.update(dto) == 1) {
			return "Y";
		}else {
			return "N";
		}
	}
	
	@ResponseBody
	@RequestMapping(value = "/delete", method = RequestMethod.POST)
	public String delete(Locale locale, Model model, HttpServletRequest request) throws Exception {
		if(service.delete(Integer.parseInt((String)request.getParameter("seq"))) == 1) {
			return "Y";
		}else {
			return "N";
		}
	}
}

 

BoardServiceImpl.java

package com.board.service;

import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.board.dao.BoardDAO;
import com.board.domain.BoardDTO;

@Service
public class BoardServiceImpl implements BoardService {

	@Inject
	private BoardDAO dao;

	@Override
	public List list() throws Exception {
		return dao.list();
	}
	
	@Override
	public int regi(BoardDTO dto) throws Exception {
		
		if (dao.getMaxSeq() == null) { // 게시글이 존재하지 않을 때
			dto.setSeq(1); // SEQ는 1
		} else { // 게시글이 존재할 때
			dto.setSeq(dao.getMaxSeq() + 1); // 최대값에 +1
		}
		
		return dao.regi(dto);
	}

	@Override
	public BoardDTO view(int seq) {
		dao.updateReadCount(seq);
		return dao.view(seq);
	}

	@Override
	public int update(BoardDTO dto) {
		return dao.update(dto);
	}

	@Override
	public int delete(int seq) {
		return dao.delete(seq);
	}

}

 

BoardDAOImpl.java

package com.board.dao;

import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.board.domain.BoardDTO;

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	@Inject
	private SqlSession sqlSession;
	
	private static String namespace = "com.board.mappers.board";

	@Override
	public List list() throws Exception {
		return sqlSession.selectList(namespace + ".list");
	}
	
	@Override
	public Integer getMaxSeq() {
		return sqlSession.selectOne(namespace+".maxSeq");
	}

	@Override
	public int regi(BoardDTO dto) {
		return sqlSession.insert(namespace+".regi", dto);
	}

	@Override
	public BoardDTO view(int seq) {
		return sqlSession.selectOne(namespace+".view", seq);
	}

	@Override
	public void updateReadCount(int seq) {
		sqlSession.update(namespace+".updateReadCount", seq);
	}

	@Override
	public int update(BoardDTO dto) {
		return sqlSession.update(namespace+".update", dto);
	}

	@Override
	public int delete(int seq) {
		return sqlSession.update(namespace+".delete", seq);
	}

}

 

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.board.mappers.board">

	<select id="list" resultType="com.board.domain.BoardDTO">
	 	SELECT 
 			SEQ,
 			SUBJECT,
 			CONTENT,
 			NAME,
 			REG_DATE,
 			READCOUNT
		FROM
 			BOARD
	</select>
	
	<select id="maxSeq" resultType="java.lang.Integer">
		select max(SEQ) from board
	</select>
	
	<insert id="regi">
	 	INSERT INTO 
	 	BOARD(
	 		SEQ,
	 		SUBJECT,
	 		CONTENT,
	 		NAME,
	 		REG_DATE,
	 		READCOUNT
	 	) 
	 	VALUES(
	 		#{seq},
	 		#{subject},
	 		#{content},
	 		#{name},
	 		#{reg_date},
	 		0
	 	) 
	</insert>
	
	<select id="view" resultType="com.board.domain.BoardDTO">
	 	SELECT 
 			SEQ,
 			SUBJECT,
 			CONTENT,
 			NAME,
 			REG_DATE,
 			READCOUNT
		FROM
 			BOARD
 		WHERE
 			SEQ = #{seq}
	</select>
	
	<update id="updateReadCount">
		UPDATE BOARD
		SET 
			READCOUNT = READCOUNT + 1
		WHERE
			SEQ = #{seq}	 
	</update>
	
	<update id="update">
		UPDATE BOARD
		SET
			SUBJECT = #{subject},
			CONTENT = #{content}
		WHERE
			SEQ = #{seq}
	</update>
	<delete id="delete">
		DELETE FROM BOARD
		WHERE 
			SEQ = #{seq}
	</delete>
</mapper>

 

 

 

반응형

댓글