데이터 삭제 과정

이제 CRUD의 마지막 단계인 삭제 과정에 대해 살펴볼 것이다.

게시판에서 글을 삭제하는 과정은 특정 글의 삭제를 요청하면 컨트롤러에서 레파지토리를 통해 데이터를 찾고,

찾은 데이터를 삭제하는데 기존 데이터가 있을 경우만 삭제 후 결과 페이지로 리다이렉트한다.

리다이렉트 시 삭제 완료 메시지도 같이 띄워주면 좋을 테니 이것은 RedirectAttributes 객체의 메서드를 활용한다.


데이터 삭제하기

삭제 버튼을 추가하기 위해 show.mustache 파일을 열어 아래 코드를 edit 버튼을 만든 a태그 아래 줄에 추가해준다.

<a class="btn btn-outline-danger m-2" href="/articles/{{article.id}}/delete">Delete</a>

delete 버튼을 클릭해보면 에러 페이지가 나올텐데 아직 컨트롤러를 만들지 않았기 때문이다.

ArticleController에다가 delete 메서드를 아래와 같이 추가해준다.

위의 과정까지 해 주었다면 예시로 아래와 같은 로그가 찍히면서 데이터가 정상적으로 삭제되는 것을 볼 수 있다.

이제 RedirectAttributes 객체를 활용해서 삭제 완료 메시지 남기기를 해야하니 먼저 컨트롤러를 아래와 같이 수정해준다.

public String delete(@PathVariable Long id, RedirectAttributes rttr) {
	...
	...
	...
}

RedirectAttributes 객체의 addFlashAttribute() 메서드를 활용하면,

리다이렉트 시점에 한 번만 사용할 휘발성 데이터를 등록할 수 있으니 아래와 같이 수정해준다.

 @GetMapping("/articles/{id}/delete")
public String delete(@PathVariable Long id, RedirectAttributes rttr) {
    ...
    ...
    // 대상 엔티티 삭제하기
    if (target != null) {
    	articleRepository.delete(target);
        rttr.addFlashAttribute("msg", "삭제됐습니다!");
	}
    ...
}

msg 키 값에 담긴 메시지는 리다이렉트 된 페이지가 있는 /articles 즉 index.mustache 파일을 보니,

헤더 안에 삭제 메시지를 출력하는 것이 좋을 것 같으니 header.mustache 파일을 열어 아래 코드를 추가해준다.

{{#msg}}
<div class="alert alert-success alert-dismissible fade show m-2">
    {{msg}}
    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>

</div>
{{/msg}}

위와 같이 수정 후 서버 재시작 이후 실행 결과가 아래와 같이 잘 나오는 것을 볼 수 있다.