본문 바로가기

🌱JAVA/시나리오 개발

<SpringBoot> 댓글이 있는 게시글 삭제 시 오류 메세지 출력 및 게시글 삭제하기

# 문제점 해결하기

일단 게시글 삭제 시 댓글이 있으면 오류를 내뿜는 문제가 있었다.

그도 그럴것이 게시글 DELETE를 하는데 아래의 정보만 가져온다.

Article target = articleRepository.findById(id).orElse(null);

위 코드를 보면 id를 SELECT해서 가져오는 정보를 target에 담아둔다.

SELECT * FROM ARTICLE WHERE ID = 1;

ID  CONTENT  TITLE  
1   may9noy  email_name

근데 이게 뭐가 문제냐면 댓글이 달리면 해당 페이지를 삭제를 할때 댓글 내용까지 함께 삭제를 하던지, 아니면 오류 메시지를 보여주던지 해야하는 문제가 있었다.

나는 여기서 후자를 선택했다. 게시글에 댓글이 있으면 댓글을 삭제 후 게시글을 삭제하라는 코멘트를 화면에 표시 하는것으로 개발을 진행했다.

일단 구성된 화면을 보면 아래와 같다.

MP4 버전

코드는 아래와 같다.

    @Description("게시글 삭제시 댓글 있으면 메세지 띄우기(댓글 삭제 후 게시글 삭제해 주세요!)")
    @GetMapping("/articles/{id}/delete/homework")
    public String delete(@PathVariable Long id, String nickname, RedirectAttributes rttr) {

        // 1. 삭제 대상을 가져온다. Delete 하려는 페이지 id 값을 가져온다.
        Article target = articleRepository.findById(id).orElse(null);

        // 2. 대상을 식별하기 위해서 서브쿼리로 테이블 JOIN을 해서 
        // 해당 ID가 COMMENT테이블에 있는지 있는지부터 확인해야 한다.
        // 있다면 오류 메세지를 화면에 뿌리고, 없으면 바로 삭제한다.
        
        // 대상 페이지의 Id값을 가져온다.
        Long get_id = target.getId();
        // 위의 대성 페이지의 값을 파라미터로 넘겨서 서브쿼리를 수행한다.
        // 서브 쿼리의 내용은 대상 페이지의 Id값이 댓글 테이블에 존재하는지 여부를 체크한다.
        Long get_id_value = articleRepository.delete_of_keep(get_id);
		
        // 만약 대상 페이지를 조회한 값과 서브쿼리 결과 값이 같다면, 오류 메세지를 출력한다.
        if (get_id_value == get_id) {
            rttr.addFlashAttribute("msg", "등록된 댓글을 먼저 삭제해 주세요.");
        } else {
        // 대상 페이지의 Id값이 서브쿼리 조회 결과 나오지 않으면 아래의 코드를 실행한다.
            articleRepository.delete(target);
            rttr.addFlashAttribute("msg", "게시글 삭제가 완료 되었습니다.");
            // 게시글 리스트 화면으로 리턴한다.
            return "redirect:/articles";
        }
        // 대상 페이지에서 오류값을 표시하고 대상 페이지로 리턴한다.
        return "redirect:/articles/{id}";
    }

Repository

- 네이티브 쿼리에 서브 쿼리를 활용하여 값을 추출하는 방식을 사용했다.

    @Query(value = "select id from article where id in (select article_id from comment where article_id = :get_id);", nativeQuery = true)
    Long delete_of_keep(@Param("get_id") Long get_id);

- 어쨌든 동작은 한다...

- 끝 -