20211220 답글 작성

DUUUPPAAN·2021년 12월 20일
0

Spring_Framework

목록 보기
11/19

·오전 삭제 버튼

-오전에는 삭제버튼에 대한 부분을 복습하면서 삭제2 버튼을 만들고 구현해봤다. 복습할 겸 해보라고 하셨는데, 애초에 학원을 조금 일찍가서 삭제버튼2를 만들고 있어서 금방 끝내고 다른 부분을 더 공부할 수 있었다

·답글 버튼에 대한 처리

view.jsp의 답글 버튼에 대한 부분을 처리해줬었다

   <button type="button" id="btnReply" class="btn btn-secondary">댓글</button>

-쿼리부분

			$("#btnReply").on("click", function(){
				document.bbsForm.action = "/board/replyForm";
				document.bbsForm.submit();
			});

-이제, 해당 action에 대한 부분을 컨트롤러에 정의해준다.

	@RequestMapping(value="/board/replyForm", method=RequestMethod.POST)
	public String replyForm(ModelMap model, HttpServletRequest request, HttpServletResponse response) 
	{
		String cookieUserId = CookieUtil.getHexValue(request, AUTH_COOKIE_NAME);
		//쿠키 아이디 사실상 노필요
		long hiBbsSeq = HttpUtil.get(request, "hiBbsSeq", (long)0);
		String searchType = HttpUtil.get(request, "searchType", "");
		String searchValue = HttpUtil.get(request, "searchValue", "");
		long curPage = HttpUtil.get(request, "curPage", (long)1);
		
		HiBoard hiBoard = null;
		User user = null;
		if(hiBbsSeq > 0) 
		{
			hiBoard = hiBoardService.boardSelect(hiBbsSeq);
			
			if(hiBoard != null) 
			{
				//게시물이 존재.
				user = userService.userSelect(cookieUserId);
			}
		}
		
		//여기서 하이보드가 null인지 아닌지 판단은 .jsp에서 JSTL+EL문법으로 !empty 해주면 되니까 굳이 처리하지 않아도 되는 것 같음.
		model.addAttribute("searchType", searchType);
		model.addAttribute("searchValue", searchValue);
		model.addAttribute("curPage", curPage);
		// model.addAttribute("hiBbsSeq", hiBbsSeq); 차피 하이보드 객체에 남아있음.
		model.addAttribute("hiBoard", hiBoard);
		model.addAttribute("user", user);
		
		return "/board/replyForm";
	}

-여기서 유저 객체를 쿠키유저 아이디를 통해서 셀렉트해서 가져오는 이유는 게시글의 작성자가 답글을 다는 쿠기유저가 아니기 때문이다. 물론, 같을 수도 있으나, 다를 경우에는 hiBoard객체만으로는 답글 작성자의 이름과 이메일을 가져올 수가 없다. 그래서 쿠키와 유저객체를 이용해서 해당 값을 모델맵으로 저장해준다.

-replyForm.jsp에서 모델맵으로 받은 값들을 이용해서 답글 작성자의 이름 이메일을 넣어준다. 그리고 스크립트 부분에 제목과 내용이 제대로 입력되었는지를 확인해주고, ajax통신을 통해서 비동기 통신을 통해 답글을 db에 넣는 처리를 해주도록 한다.

<script>
	$(document).ready(function(){
		<c:choose>
			<c:when test="${empty hiBoard}">
				alert("답변할 게시물이 존재하지 않습니다.");
				location.hreg = "/board/list";
			</c:when>
			<c:otherwise>
				$("#hiBbsTitle").focus();
				
				//답변 버튼 시작
				$("#btnReply").on("click", function(){
					$("#btnReply").prop("disabled", true);
					
					if($.trim($("#hiBbsTitle").val()).length <=0 )
					{
						alert("제목을 입력해주세요.");
						$("#hiBbsTitle").val("");
						$("#hiBbsTitle").focus();
						$("#btnReply").prop("disabled", false);
						return;
					}
					if($.trim($("#hiBbsContent").val()).length <=0 )
					{
						alert("내용을 입력해주세요");
						$("#hiBbsContent").val("");
						$("#hiBbsContent").focus();
						$("#btnReply").prop("disabled", false);
						return;
					}
					
					var form = $("#replyForm")[0];
					var formData = new FormData(form);
					
					//ajax통신
					$.ajax({
						type:"POST",
						enctype:'multipart/form-data',
						url:"/board/replyProc",
						data:formData,
						processData:false,
						contentType:false,
						cache:false,
						timeout:6000000,
						beforeSend:function(xhr)
						{
							xhr.setRequestHeader("AJAX","true");
						},
						success:function(response)
						{
							if(response.code == 0)
							{
								alert("답변이 완료되었습니다.");
								document.bbsForm.action = "/board/list";
								document.bbsForm.submit();
							}
							else if(response.code == 400)
							{
								alert("파라미터 값이 올바르지 않습니다.");
								$("#btnReply").prop("disabled", false);
							}
							else if(response.code == 404)
							{
								alert("게시물이 존재하지 않습니다.")
								location.href = "/board/list";
							}
							else
							{
								alert("답변 작성 중 오류가 발생했습니다.");
								$("#btnReply").prop("disabled", false);
							}
						},
						error:function(error)
						{
							icia.common.error(error);
							alert("답변 작성 중 오류가 발생하였습니다.");
							$("#btnReply").prop("disabled", false);
						}
					});
					//ajax통신 종료
				});
				//답변 버튼 종료
				
				//리스트 버튼 시작
				$("#btnList").on("click", function(){
					document.bbsForm.action = "/board/list";
					document.bbsForm.submit();
				});
				//리스트 버튼 종료
				
			</c:otherwise>
		</c:choose>	
	});
</script>

-답글의 경우 order와 indent에 대한 부분을 미리 처리를 해줘야 하는 부분이 있다. 이건 로직에 따라 다르기 때문에 어떻게 처리하냐에 따라 다르지만, 우선 학원에서 배우는 과정에서는 해당 답글은 먼저 해당 오더 인덴트에 대한 처리를 먼저 해줘야 한다. 그래서 해당 부분에 대한 쿼리부터 작성해줘야 한다.

<!-- HIBBS_GROUP의 HIBBS_ORDER 수정 시작 -->
<update id="boardGroupOrderUpdate" parameterType="com.icia.web.model.HiBoard">
UPDATE TBL_HIBOARD
   SET HIBBS_ORDER = HIBBS_ORDER +1
 WHERE HIBBS_GROUP = #{hiBbsGroup}
   AND HIBBS_ORDER <![CDATA[>=]]> #{hiBbsOrder}
</update>
<!-- HIBBS_GROUP의 HIBBS_ORDER 수정 종료-->

-이건 오더와 인덴트에 대한 처리고 그 다음에는 실제로 답글을 입력하는 쿼리문을 돌려야 하기 때문에 해당 부분을 작성해준다.

<!-- 게시물 답글 등록 시작 -->
<!-- 넣는 값들은 이미 위의 쿼리로 오더가 계산되었음. 나머지 값들은 넘겨온 값에 이미 +1 해줬음-->
<insert id="boardReplyInsert" parameterType="com.icia.web.model.HiBoard">
<!-- 선행처리기(시퀀스번호 생성) 시작 -->
<selectKey resultType="long" keyProperty="hiBbsSeq" order="BEFORE">
	SELECT SEQ_HIBOARD_SEQ.NEXTVAL FROM DUAL	
</selectKey>
<!-- 선행처리기(시퀀스번호 생성) 종료 -->
INSERT INTO TBL_HIBOARD (
    HIBBS_SEQ,
    USER_ID,
    HIBBS_GROUP,
    HIBBS_ORDER,
    HIBBS_INDENT,
    HIBBS_TITLE,
    HIBBS_CONTENT,
    HIBBS_READ_CNT,
    REG_DATE,
    HIBBS_PARENT
) VALUES (
    #{hiBbsSeq},
    #{userId},
    #{hiBbsGroup},
    #{hiBbsOrder},
    #{hiBbsIndent},
    #{hiBbsTitle},
    #{hiBbsContent},
    0,
    SYSDATE,
    #{hiBbsParent}
)
</insert>
<!-- 게시물 답글 등록 종료 -->

물론 해당 id로 추상메소드를 작성했다.

	//게시물 그룹 순서 변경
	public int boardGroupOrderUpdate(HiBoard hiBoard);
	
	//게시물 답글 등록
	public int boardReplyInsert(HiBoard hiBoard);

-이제 동일 서비스에서 오더랑 인덴트를 처리하고 인서트하는 부분을 작성해준다. 물론 두개의 쿼리가 진행되는 것이기 때문에 Transactional로 어노테이션을 준다.

   //답글 등록
   @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
   public int boardReplyInsert(HiBoard hiBoard) throws Exception
   {
	   int count = 0;
	   
	   //우선 오더 그룹을 하나씩 높여줌.
	   hiBoardDao.boardGroupOrderUpdate(hiBoard);
	   
	   //처리 건수를 받을 것임.
	   count = hiBoardDao.boardReplyInsert(hiBoard);
	   
	   if(count > 0 && hiBoard.getHiBoardFile() != null) 
	   {
		   
		   HiBoardFile hiBoardFile = hiBoard.getHiBoardFile();
		   
		   hiBoardFile.setHiBbsSeq(hiBoard.getHiBbsSeq());
		   hiBoardFile.setFileSeq((short)1);
		   
		   //파일 넣어줌
		   hiBoardDao.boardFileInsert(hiBoardFile);
	   }
	   
	   return count;
   }

이제 게시물 답변에 대한 컨트롤러를 정의해준다.

//게시물 답변 시작
	@RequestMapping(value="/board/replyProc", method=RequestMethod.POST)
	@ResponseBody
	public Response<Object> replyProc(MultipartHttpServletRequest request, HttpServletResponse response)
	{
		Response<Object> ajaxResponse = new Response<Object>();
		
		String cookieUserId = CookieUtil.getHexValue(request, AUTH_COOKIE_NAME);
		
		long hiBbsSeq = HttpUtil.get(request, "hiBbsSeq", (long)0);
		
		String hiBbsTitle = HttpUtil.get(request, "hiBbsTitle", "");
		String hiBbsContent = HttpUtil.get(request, "hiBbsContent", "");
		FileData fileData = HttpUtil.getFile(request, "hiBbsFile", UPLOAD_SAVE_DIR);
		
		if(hiBbsSeq > 0 && !StringUtil.isEmpty(hiBbsTitle) && !StringUtil.isEmpty(hiBbsContent)) 
		{
			//게시글이 존재해야만 댓글을 작성할 수 있음.
			HiBoard parentHiBoard = hiBoardService.boardSelect(hiBbsSeq);
			
			if(parentHiBoard != null) 
			{
				HiBoard hiBoard = new HiBoard();
				
				hiBoard.setUserId(cookieUserId);
				hiBoard.setHiBbsTitle(hiBbsTitle);
				hiBoard.setHiBbsContent(hiBbsContent);
				
				//그룹 오더 인덴트 세팅해야 됨.
				hiBoard.setHiBbsGroup(parentHiBoard.getHiBbsGroup());
				//부모꺼 더하기 1하면 됨.
				hiBoard.setHiBbsOrder(parentHiBoard.getHiBbsOrder()+1);
				hiBoard.setHiBbsIndent(parentHiBoard.getHiBbsIndent()+1);
				
				hiBoard.setHiBbsParent(parentHiBoard.getHiBbsSeq());
				//hiBoard.setHiBbsParent(hiBbsSeq);이걸 바로 넣어도 됨.
				
				if(fileData != null && fileData.getFileSize() > 0) 
				{
					//첨부파일이 있는 경우
					HiBoardFile hiBoardFile = new HiBoardFile();
					
					//값담기
					hiBoardFile.setFileName(fileData.getFileName());
					hiBoardFile.setFileOrgName(fileData.getFileOrgName());
					hiBoardFile.setFileExt(fileData.getFileExt());
					hiBoardFile.setFileSize(fileData.getFileSize());
					
					//시작 주소 일치시키기
					hiBoard.setHiBoardFile(hiBoardFile);
				}
				
				//쿼리에 인서트 전에 오더랑 인덴트부터 처리해줘야 함. 서비스에서 처리해줄 것임
				try 
				{
					if(hiBoardService.boardReplyInsert(hiBoard) > 0 ) 
					{
						ajaxResponse.setResponse(0, "Success");
					}
					else 
					{
						ajaxResponse.setResponse(500, "Internal Server Error");
					}
				}
				catch(Exception e) 
				{
					logger.debug("[HiBoardController] replyProc Exception", e);
					ajaxResponse.setResponse(500, "Internal Server Error");
				}
			}
			else 
			{
				ajaxResponse.setResponse(404, "Not Found");
			}
		}
		else 
		{
			ajaxResponse.setResponse(400, "Bad Request");
		}
		
		return ajaxResponse;
	}
	//게시물 답변 종료

-게시물 등록에 대한 부분, 특히 첨부파일 등록에 대한 부분은 기존에 사용한 것과 다르지 않기 때문에 해당 메소드를 이용하면 된다.
또한 하이보드객체로 받은 값에 css스타일 시트를 적용해서 list.jsp에 적용한 부분이 있다 해당 부분은 다음과 같이 정의되어 있다.

			<c:if test="${hiBoard.hiBbsIndent > 0}">
				<img src="/resources/images/icon_reply.gif" style="margin-left: ${hiBoard.hiBbsIndent}em;" />
			</c:if>	

·오늘 팀 회의

-오늘은 팀원들이 수업이 끝나고 저녁에 모여서 테이블 컬럼에 대한 회의를 저녁늦게까지 진행했다. 그래서 공부를 많이는 못했고, 컬럼 명을 작성해야 하는 분담까지 했다. 내일은 더 열심히 수업을 듣고 팀플과제도 하고 복습도 열심히 해야지! 오늘은 너무 늦어서 빨리 운동하고 자야겠다.

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글