Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

게으른 완벽주의자의 개발자 도전기

Template 게시판, 회원관리, 댓글관리 나눠서 관리하기3(mapper, service, controller 게시글 상세페이지, 조회수 증가, 게시글 삭제(트랜잭션처리) 본문

Template

Template 게시판, 회원관리, 댓글관리 나눠서 관리하기3(mapper, service, controller 게시글 상세페이지, 조회수 증가, 게시글 삭제(트랜잭션처리)

머리방울 2022. 8. 9. 22:56

1. 게시글 상세페이지

1) mapper sql 작성

<select id="selectBoardDetail" resultMap="board">
SELECT BOARD_NUM
, TITLE
, CONTENT
, WRITER
, TO_CHAR(CREATE_DATE, 'YYYY-MM-DD') AS CREATE_DATE
, READ_CNT
, IS_PRIVATE
, BOARD_PW
FROM FINAL_BOARD
WHERE BOARD_NUM = #{BOARD_NUM}
</select>

2) 인터페이스 메소드 작성

BoardDTO selectBoardDetail (int boardNum);



@Override
public BoardDTO selectBoardDetail(int boardNum) {
BoardDTO result = sqlSession.selectOne("boardMapper.selectBoardDetail", boardNum);
sqlSession.commit();
return result;

3) controller

else if(command.equals("/boardDetail.bo")) {
int boardNum = Integer.parseInt(request.getParameter("boardNum"));

 BoardDTO board =boardService.selectBoardDetail(boardNum);
 
 request.setAttribute("board", board);



contentPage = "board_detail.jsp";

 

2. 조회수 증가

1) mapper sql 작성

<update id="updateReadCnt">
UPDATE FINAL_BOARD 
SET 
READ_CNT = READ_CNT+1
WHERE BOARD_NUM = #{boardNum}
</update>

2) 인터페이스 메소드 작성

int updateReadCnt(int boardNum);



@Override
public int updateReadCnt(int boardNum) {
int result = sqlSession.update("boardMapper.updateReadCnt",boardNum);
sqlSession.commit();
return result;
}

3) controller

게시글 상세페이지로 가는 else if문에 추가하면 된다.

else if(command.equals("/boardDetail.bo")) {

boardService.updateReadCnt(boardNum);

}

 

3. 게시글 삭제

1) mapper sql 작성

<delete id="deleteBoard">
DELETE FINAL_BOARD
WHERE BOARD_NUM = #{boardNum}
</delete>

2) 인터페이스 메소드 작성

int deleteBoard(int boardNum);

 

2022.08.10 수정

기존 삭제방법은 댓글이 있을때 댓글이 references 관계라서

그 게시글에 댓글이 모두 삭제되어야 게시글 삭제가 가능했다.

<쏭즈캠퍼스 유투브인강 발췌>

트랜잭션(Transaction) 처리 - 한단위로 묶어서 처리하는것

기존 쿼리 작성방식은 하나를 작성하고 커밋해주는 방식으로 처리를 했다.

트랜잭션 처리는 예를 들어 은행거래 시 내가 상대방쪽으로 돈 만원을 입금하면내 통장에는 만원이 빠져나가고 상대 통장에는 만원이 찍혀야 하나의 작업과정이 끝난다.나는 돈을 입금했는데 은행 전산상의 문제로 상대쪽에서는 돈 입금을 못받았다면?이러한 상황이 발생할 수 있기 때문에 

데이터의 변화(insert, delete, update)를 주는 쿼리가 두개 이상 실행될 때

try catch문 이용해서 처리 결과가 완벽히 끝나면 커밋해도록 구상하는 것이다. 

 

게시글이 삭제 시 댓글 먼저 삭제 ->게시글 삭제 순서대로 처리되도록 만들자!

혹시 댓글이 없는 글에서 오류나는거 아냐? -> 그저 삭제댓글이 0일 뿐 오류나지 않음

 

@Override
public void deleteBoard(int boardNum) {
	try {
		1) 댓글 삭제 
		sqlSession.delete("replyMapper.deleteReplyBoardNum", boardNum);

		2)게시글 삭제
		sqlSession.delete("boardMapper.deleteBoard", boardNum);

		sqlSession.commit();

		} catch (Exception e) {
		sqlSession.rollback();
		e.printStackTrace();
	}

}

3) controller

else if(command.equals("/deleteBoard.bo")) {
	int boardNum = Integer.parseInt(request.getParameter("boardNum"));
	boardService.deleteBoard(boardNum);

	page ="boardList.bo";
	isRedirect=true;
}

 

4) jsp화면에서 삭제 버튼 설정(자바스크립트 방식 사용)

타이틀태그 아래에 script 태그를 넣는다.

var가 문자열 숫자 상관없이 다 받는다고 한다. 

<script type="text/javascript">
function goDelete(boardNum){
	var result = confirm('정말 삭제하시겠습니까?'); (확인 true 취소 false)

	if(result){
	location.href ='deleteBoard.bo?boardNum=' + boardNum;
	}
}
</script>

 

 나는 게시글을 삭제할 때 관리자나 게시글 작성자일 때만

버튼이 보이도록 설정하였다.

<c:if test="${sessionScope.loginInfo.isAdmin eq 'Y' or sessionScope.loginInfo.memId eq board.writer }">
<input type="button" value="삭제하기" onclick="goDelete(${board.boardNum});">
</c:if>