8일차
~8.2 데이터 삭제하기(종이책 p.229~248)
8장 게시글 삭제하기: Delete
8.1 데이터 삭제 과정
- 클라이언트가 HTTP 메서드로 특정 게시글의 삭제를 요청한다.
- 삭제 요청을 받은 컨트롤러는 리파지터리를 통해 DB에 저장된 데이터를 찾아 삭제한다. 이 작업은 기존 데이터가 있는 경우에만 수행된다.
- 삭제가 완료됐다면 클라이언트를 결과 페이지로 리다이렉트한다.
8.2 데이터 삭제하기
Delete 버튼 추가하기
- 상세 페이지에 Delete 버튼을 추가하기 위해 show.mustache 파일을 열고 Edit 버튼을 복사해 Delete 버튼을 만든다.
<a href=…>Edit</a> 부분을 복사해 다음 줄에 붙여 넣는다.
- 텍스트를 Delete로 수정하고 요청 URL을 “/articles/{{article.id}}/delete”로 수정한다.
- Edit 버튼과 구분하기 위해 class의 속성 값을 “btn btn-danger”로 수정해 빨간 색으로 수정한다.

Delete 요청을 받아 데이터 삭제하기
원래는 DELETE 요청으로 삭제해야 하지만 HTML에서는 POST와 GET만 제공하므로 GET 방식으로 삭제 요청을 받아 처리한다.
- delete() 메서드 기본 틀 만들기
- ArticleController에 delete()메서드 추가
- 기본 틀을 입력하고 return 값으로 null 반환
- @GetMapping(”/articles/{id}/delete”)로 작성한다.
- 삭제할 대상 가져오기
- articleRepository.findById(id) 메서드로 DB에 해당 id를 가진 데이터가 있는지 찾는다.
- 매개변수로 @PathVariable Long id를 써준다.
- 대상 엔티티 삭제하기
- if 조건문으로 target이 null이 아닌지 확인하고 참이면 내부 코드를 수행
- articleRepository.delete(target); 을 통하여 DB에서 target 삭제
- 결과 페이지로 리다이렉트하기
- 게시글을 삭제하면 목록 페이지로 돌아가도록 return “redirect:/articles”;를 입력한다.

여기까지 하면 삭제가 잘 되는 모습을 확인할 수 있지만 뭔가 아쉬우므로 삭제 완료 메시지를 남기도록 한다.
삭제 완료 메시지 남기지
RedirectAttributes 객체의 addFlashAttribute() 메서드를 사용하면 리다이렉트된 페이지에서 사용할 일회성 데이터를 등록할 수 있다. 형식은 다음과 같다.
객체명.addFlashAttribute(넘겨_주려는_키_문자열, 넘겨_주려는_값_객체);
if() 문 안에서 삭제를 수행 한 코드 다음 줄로 msg라는 키 문자열에 “삭제됐습니다!”라는 값을 메시지로 넣는다.
RedirectAttributes를 활용하려면 delete() 메서드의 매개변수로 받아 와야 한다. 객체 이름은 rttr로 정한다.
- msg 키 값에 담긴 메시지는 리다이렉트된 페이지 즉 /article에서 보여 줘야하므로, 해당 뷰 파일인 index.mustache를 열고 수정한다.
- 헤더 안에서 삭제 메시지를 출력하도록 resources/templates/layouts 디렉터리에서 header.mustache 파일을 연다.
- 코드 맨 아래에 {{#msg}}{{/msg}}를 써서 msg 키를 사용할 범위를 잡아 준다.
- 메시지 창으로 msg에 담긴 값을 출력하고, 닫기 버튼도 추가한다.
- 부트스트랩(getbootstrap.com) 사이트에 접속한 후 Docs 메뉴에서 alert를 검색해 마음에 드는 메시지 창의 코드를 복사해서 붙여넣는다.
- 닫기 버튼은 close button 으로 검색해 코드를 복사해서 붙여넣는다.

삭제 메시지 창이 잘 뜨는 것을 확인할 수 있다.

SQL 문으로 직접 DB 삭제하기
H2 콘솔 탭으로 가서 DELETE SQL문을 통해서 직접 삭제할 수 있다.
형식은 다음과 같고, FROM은 생략할 수 있다.
DELETE [FROM] 테이블명 WHERE 조건;