본문 바로가기
Side Project/spring 기반으로 웹 게시판 개발하기

Spring 공지사항 게시판 만들기 - (1) 공지사항 등록하기

by 잇서니 2020. 12. 30.
반응형

 

 

혼자 이해한 내용이니 혹시 잘못된 부분이 있을시 댓글 남겨주시면 감사하겠습니다 :)

 

Controller 역할

사용자가 웹사이트에 접속하여 정보를 요청하면 Controller가 해당 요청을 받습니다.

요청 작업을 수행한 이후, 데이터를 View에 전달합니다.

 

Controller 구현

Spring 실행 흐름대로 코드를 정리해보겠습니다. 이전 글을 참고해주세요.

 

 

Controller 코드 (src/main/java/net/admins/controller/BoardNoticeAdminsController.java)

@Controller
public class BoardNoticeAdminsController {

	@Resource(name = "boardNoticeAdminsService")
	private BoardNoticeAdminsService BoardNoticeAdminsService;
    
	@RequestMapping(value = "/admins/promoter/boardmgr/PmtNoticeForm.mwav")
	public ModelAndView insertPmtNtmForm(CommandMap commandMap, 
    		HttpServletRequest request, , HttpServletResponse response) throws Exception {

		//ModelAndView 생성
		ModelAndView mv = new ModelAndView("/Admins/Promoter/BoardMgr/PmtNoticeForm");
        
		//Service를 호출하여 insertPmtNtmForm() 실행
		BoardNoticeAdminsService.insertPmtNtmForm(commandMap.getMap());
		
		 // 공지사항 등록 후 리스트 화면으로 이동
		response.sendRedirect("/admins/promoter/boardmgr/PmtNoticeList.mwav?pageNum=1");
		
		// view에 결과 넘김
		return mv;
	}
}

 

1) RequestMapping

사용자는 URL로 요청을 합니다. RequestMapping 에 따라 해당 요청 URL을 어떤 함수에서 처리할 지 결정합니다.

사용자가 공지사항 등록 버튼을 누르면 /admins/promoter/boardmgr/PmtNoticeForm.mwav 을 요청하게 됩니다. 그러면 RequestMapping에 해당 경로가 적힌 insertPmtNtmForm() 함수가 실행되는 구조인 것입니다.

 

 

PmtNoticeLists.jsp 의 일부

<button type="button" class="pull-right btn btn-default"><a href="/Admins/Promoter/BoardMgr/PmtNoticeForm.mwav?mm=site">공지사항 등록</a></button>

 

 

2) ModelAndView

View에 데이터를 보낼 때 사용하는 객체입니다. 데이터와 View 페이지를 둘 다 설정할 수 있습니다. 

jsp 내에 script를 넣어줄 수도 있습니다. 공지사항 등록에서는 공지사항 제목의 빈칸 여부를 체크하는 스크립트를 추가하여 빈칸일 경우 경고 메세지가 팝업되도록 하였습니다.

 

src/main/webapp/Admins/Promoter/BoardMgr/PmtNoticeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE html>
<html>
<head>
<!-- /////////// -->
<jsp:include page="/PartsOfContent/Head_Import.jsp" flush="false" />
<!-- FullPackage -->
<script src="//cdn.ckeditor.com/4.5.11/full/ckeditor.js"></script>
</head>

<body>
	<jsp:include page="/Admins/AdminsHeader.jsp" flush="false" />
	<!--  //////////////////////////////////// -->
	<!-- Page Content -->
	<div class="container">
		<!-- Page Heading/Breadcrumbs -->
		<div class="row">
			<div class="col-lg-12">
				<h1 class="page-header">
					Admins <small> PromoterNoticeForm</small>
				</h1>
				<ol class="breadcrumb">
					<li><a href="index.html">Home</a></li>
					<li>Admins</li>
					<li>Promoter</li>
					<li>BoardMgr</li>
					<li class="active">PmtNtmForm</li>
				</ol>
			</div>
		</div>

		<!-- Content Row -->
		<div class="row">
			<div class="col-md-3">
				<c:choose>
					<c:when test="${param.mm eq null}">
						<c:set value="${mm}" var="mm" />
					</c:when>
					<c:otherwise>
						<c:set value="${param.mm}" var="mm" />
					</c:otherwise>
				</c:choose>
				<jsp:include page="/admins/LeftMenu.mwav" flush="false">
					<jsp:param name="mm" value="${mm}" />
				</jsp:include>
			</div>

			<div class="col-md-9">
				<!-- 소제목 -->
				<div class="col-lg-12">
					<h2 class="page-header">PmtNtmForm</h2>
				</div>

				<!-- Content Column -->
				<div class="col-lg-12">

					<div class="row">

						<%--================================================시작========================================================== --%>

						<script>
							function check(msg) {
								// msg : 공지등록 / 수정 
								
								if (confirm("정말 " + msg + " 하시겠습니까?") == true){    //확인
									
									// 제목 빈값 체크
									if (document.bpForm.bpTitle.value == "") {
										alert("제목을 입력하십시요.");
										document.bpForm.bpTitle.focus();
										return false;
									}
								
									// contents 빈값 체크기능 추가 (textarea 값의 길이 체크하자!)
									
									
									alert(msg + " 되었습니다.");
									
									location.href = "/admins/promoter/boardmgr/PmtNoticeList.mwav?pageNum=1";
									document.bpForm.submit();

									
									return true;
									
								}else{   //취소
								    return false;
								}
							
							}
						</script>
						
						<!-- Content Column -->
						<div class="table-responsive">
									<form role="form" method="post" name="bpForm"
										action="/admins/promoter/boardmgr/PmtNoticeForm.mwav">
										
										<table class="table table-striped">

											<thead>
												<tr>

													<div class="pull-right">
														<%--기본값 --%>
														<input type="hidden" name="boardPromoter_id" /> <input
															type="hidden" name="bpHighLight" value="0" /> <input
															type="hidden" name="bpViewCount" value="0" MaxLength="10" />

														<%--높을수록 TOP (추후 반영)_15.08.01 --%>
														<input type="hidden" name="bpOrder" value="0" />
														<%--직원담당자 staff_id 추후 반영예정 --%>
														<input type="hidden" name="staff_id" value="0" /> 
														<%-- 최초 공지 등록시, 공지 비노출 처리 --%>
														<%-- (추후반영) 공지 등록시 노출여부를 받아 bpStatus 값 입력하기 --%>
														<input type="hidden" name="bpStatus" value="1" />
													</div>
												</tr>
												<tr class="active">
													<th>NO.</th>
													<th>Group</th>
													<th>ViewCount</th>
													<th>InsertDt</th>
													<th>staff_id</th>
													<th>Order</th>
												</tr>
											</thead>
											<tbody>
												<tr>
													<td></td>
													<td><select name="bpGroup">
															<option value="전체">전체</option>
															<option value="휴대폰">휴대폰</option>
															<option value="인터넷">인터넷</option>
															<option value="영어">영어</option>
															<option value="유통">유통</option>
															<option value="SI개발">SI개발</option>
													</select></td>
													<td></td>
													<td></td>
													<td></td>
													<td></td>
												</tr>
											</tbody>
										</table>

										<table class="table table-striped">

											<tr>
												<th class="active">Title</th>
												<td><input type="text" class="form-control"
													placeholder="Text input" name="bpTitle"></td>
											</tr>



											<tr>
												<th class="active">SubTitle</th>
												<td><input type="text" class="form-control"
													placeholder="Text input" name="bpSubTitle"></td>
											</tr>

											<tr>
												<th class="active">Reference</th>
												<td><input type="text" class="form-control"
													placeholder="Text input" name="bpRelatedLink"></td>
											</tr>

											<tr>
												<th class="active">Image Link</th>
												<td><input type="text" class="form-control"
													placeholder="Text input" name="bpTitleImageLink"
													value="${updatePmtNtmForm.bpTitleImageLink}"></td>
											</tr>
																						
											<tr>
												<th class="active">Keywords</th>
												<td><input type="text" class="form-control"
													placeholder="Text input" name="bpKeyword"></td>
											</tr>
											
											<tr>
												<th class="active">Content</th>
												<td><textarea name="bpContent"
														class="form-control input-sm ckeditor" id="message"
														placeholder="Message" style="width: 100%; height: 200px;"></textarea>
													<span class="help-block"></span></td>
											</tr>

										</table>
										<br style="clear: both">
										<p class="pull-right">
											<button type="button" class="btn btn"
												onClick="javascript:window.location.href='/admins/promoter/boardmgr/PmtNoticeList.mwav?pageNum=1'">All List</button>
											<!--  <button type="button" class="btn btn-warning" onClick="javascript:history.go(-1)">BACK</button> -->
											<button type="button" class="btn btn-danger" onclick="check('공지등록')">Insert</button>
										</p>
									</form>
						</div>
						<%--================================================끝========================================================== --%>
					</div>
				</div>
			</div>
		</div>
	</div>
	<!-- /.container -->
	<!-- Footer -->
	<footer>
		<!--/////////////////////////////////////////////////// -->
		<jsp:include page="/Admins/AdminsFooter.jsp" flush="false" />
		<!--/////////////////////////////////////////////////// -->
	</footer>
</body>
</html>

 

 

 

 


 

참고용으로 Service 및 DAO 코드도 남겨두겠습니다.

 

Service 코드 (src/main/java/net/admins/controller/BoardNoticeAdminsServiceImpl.java)

@Service("boardNoticeAdminsService")
public class BoardNoticeAdminsServiceImpl implements BoardNoticeAdminsService {

	@Resource(name = "boardNoticeAdminsDAO")
	@Autowired(required = true)
	private BoardNoticeAdminsDAO boardNoticeAdminsDAO;
    
    
    @Override
	public void insertPmtNtmForm(Map<String, Object> map) throws Exception {
		// TODO Auto-generated method stub

		map.put("bpStatus", 1);
		
		boardNoticeAdminsDAO.insertPmtNtmForm(map);
	}
}

위 Contoller에서 insertPmtNtmForm 서비스가 호출되었습니다. 이 서비스는 DAO를 호출합니다.

 

DAO 코드 (src/main/java/net/admins/dao/BoardNoticeAdminsDAO.java)

@Repository("boardNoticeAdminsDAO")
public class BoardNoticeAdminsDAO extends AbstractDAO {
	public void insertPmtNtmForm(Map<String, Object> map) {
		// TODO Auto-generated method stub

		insert("boardNoticeAdminsDAO.insertPmtNtmForm", map);
	}
}

MyBatis의 insert 함수를 호출합니다.

MyBatis는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점이 있습니다. 반면에 모든 쿼리들을 작성해야 하기 때문에 비슷한 쿼리일지라도 남발할 수밖에 없습니다.

 

mapper (src/main/resources/mapper/board/admins/BoardNoticeAdmins_SQL.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="boardNoticeAdminsDAO">
	<insert id="insertPmtNtmForm" parameterType="hashmap">
		<![CDATA[
				INSERT INTO BoardPromoter_tbl
				SELECT IFNULL(max(boardPromoter_id)+1,100001), #{bpGroup}, #{bpHighLight}, #{bpTitle}, #{bpSubTitle}, #{bpKeyword}, #{bpTitleImageLink}, #{bpRelatedLink}, #{bpContent}, #{bpViewCount}, #{bpOrder}, #{bpStatus}, #{staff_id}, NOW(), NOW(), null, 'bpIpAddress_temp' FROM BoardPromoter_tbl
		]]>
	</insert>
</mapper>

mapper에서 어떤 insert 쿼리를 사용할 지 적어줍니다. 공지사항 등록 화면에서 사용자가 입력한 값이 #{bpGroup} 같은 변수에 들어가게 됩니다.

 

 

참고링크

 

SpringMVC :: 컨트롤러(Controller), Model, ModelAndView 사용법

스프링 MVC 컨트롤러 (Controller) 기본적인 흐름은 client가 요청을 하면, @Controller에 진입한다. 컨트롤러는 요청에 대한 작업을 수행하고, 뷰쪽으로 데이터를 전달한다. 컨트롤러 클래스 제작 순서 @C

hongku.tistory.com

 

 

[MyBatis] MyBatis란? 개념 및 데이터구조

MyBatis란? 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 S

khj93.tistory.com

 

반응형

댓글