티스토리 뷰

반응형

✏️ 게시물 삭제 로직

  1. 유저가 삭제하기 버튼을 누른다
  2. 컨트롤러는 로그인 상태를 확인하고 로그인이 되어 있다면 boardService를 통해 게시물을 삭제한다.
  3. 로그인이 되어 있지 않다면 로그인 화면으로 리턴시킨다.
  4. boardService는 전달받은 idx를 통해 게시글이 존재하는지 확인하고 존재한다면 게시물을 삭제한다.

✏️ Api Controller 클래스

@PostMapping("/delete") // 글 삭제하기
public String delete(HttpServletRequest httpServletRequest, @RequestParam("idx") Long idx) {

    HttpSession session = httpServletRequest.getSession(true);
    Optional<Object> idOptional = Optional.ofNullable(session.getAttribute("userId"));
    if (idOptional.isEmpty()) {
        log.error("로그인을 하지 않으면 글을 삭제할 수 없습니다.");
        return "redirect:/login";
    }
    boardService.delete(idx);
    log.info("게시물 삭제");
    return "redirect:/member/list";
}

로그인을 하지 않았다면 권한이 없으므로 로그인 화면으로 이동시키고 그게 아니라면

boardService를 통해 게시물을 삭제한다.


✏️ BoardService 인터페이스

void delete(Long idx);

✏️ BoardServiceImp 클래스

@Transactional
@Override
public void delete(Long idx) {
    Optional<Board> board = boardRepository.findById(idx);
    if (board.isPresent()) {
        Board boardEntity = board.get();
        log.error(board.get().toString());
        likesRepository.deleteByBoardIdx(boardEntity);
        commentRepository.deleteByBoardIdx(boardEntity);
        boardRepository.deleteById(idx);
    }
}

단순히 Board에 있는 게시글만 삭제한다고 생각할 수 있는데 그렇게 하게 되면 오류가 발생한다.

먼저 org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint 이 발생한다. 맨 첫장에서 보면 Board와 Comment, Like는 1 : N의 연관 관계를 가지고 있다. 그러므로 연관 관계에 있는 DB들도 delete를 해 주어야 하는데 여기서도 순서가 있다. Board가 Comment, Likes보다는 상위 개념이기 때문에 하위 개념에 있는 것들부터 삭제를 해주어야 한다.

위 처럼만 하고 진행을 하면 삭제가 될 것 같지만 아래와 같은 오류가 발생한다.

no entitymanager with actual transaction available for current thread - cannot reliably process 'remove' call 이 오류는 @Transactional를 붙이면 해결할 수 있다. 아직 이 개념에 대해서는 공부 중이여서 궁금하다면 이 오류를 그대로 구글에 검색하면 될 것 같다.


✏️ LikesRepository 인터페이스

public interface LikesRepository extends JpaRepository<Likes, Long> {
		void deleteByBoardIdx(Board board);
}

쿼리문 추가


✏️ CommentRepository 인터페이스

public interface CommentRepository extends JpaRepository<Comment, Integer> {
	 void deleteByBoardIdx(Board board);
 }

쿼리문 추가

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함