Closed wongakim-99 closed 3 months ago
show.mustache가서 Edit 버튼 밑에
<a href="/articles/{{article.id}}/delete" class="btn btn-danger">Delete</a>
추가
데이터를 삭제할때는 DELETE 메서드를 사용한다고 했다. 그런데 HTML에서는 POST와 GET을 제외한 다른 메서드를 제공하지 않는다. 그래서 여기에서는 GET방식으로 삭제 요청을 받아 처리하겠다. DELETE 메서드를 활용해 삭제 요청을 보내는 방법은 나중에 다시 알아보겠다.
@GetMapping("/articles/{id}/delete") // 데이터 삭제 작업
public String delete() {
log.info("삭제 요청이 들어왔습니다.");
return null;
}
DB에 접근해 데이터를 처리할 때는 JPA의 리파지터리를 이용 articleRepository.findById(id)의 메서드로 DB에 해당 id를 가진 데이터가 있는지 찾는다. 만약 찾으면 Article 타입의 target 변수에 저장하고, 찾지 못하면 null을 반환한다.
findById(id)를 호출할 때 사용한 id 변수는 delete() 메서드에 선언되지 않았음. 이 id는 @GetMapping("/articles/{id}/delete")의 URL 주소에서 가져오므로 delete() 메서드의 매개변수로 @PathVariable Long id를 써준다.
target에 무언가 저장됐다면 삭제 수행
if() 조건문으로 target이 null이 아닌지 확인하고 참이면 내부 코드 수행. 삭제는 articleRepository를 작성하고 점(.) 을 찍으면 활용할 수 있는 메서드가 뜨는데 당연히 delete()를 선택하면 됨.
중간점검하면 로그창에 삭제 잘 됬다고 로그뜨고, h2-console 들어가서 확인하면 DB에서도 데이터가 삭제된걸 볼 수 있을거임.
return "redirect:/articles";
H2 콘솔 탭으로 가서 현재 DB를 확인해 보자. 그런데 Run을 클릭하면 접속 화면으로 바뀐다. 서버를 재시작했으니 JDBC URL을 다시 입력한 후 접속한다.
데이터를 삭제할 때 사용하는 SQL 문은 DELETE 문이다. 형식은 다음과 같은데, FORM은 생략할 수 있다.
DELETE [FORM] 테이블명 WHERE 조건;
클라이언트가 특정 게시글의 삭제 요청을 하면 컨트롤러의 delete() 메서드에서 @GetMapping으로 받는다. delete() 메서드가 삭제 대상을 찾으려면 대푯값인 id가 필요한데, 이때 @PathVariable 어노테이션을 사용한다. @PathVariable은 @GetMapping의 URL 에서 중괄호에 둘러싸인 값을 매개변수로 가져온다. 리파지터리는 이렇게 가져온 id로 DB에서 삭제 대상을 찾고 리파지터리가 제공하는 delete() 메서드로 데이터를 삭제한다. 이때 DB 내부에서는 DELETE라는 SQL 문이 자동으로 수행된다.
삭제 작업이 끝나면 결과 페이지로 리다이렉트한다. 삭제됐다는 메시지도 함께 출력하는데, 이를 위해 Redirect Attributes 객체의 addFlashAttribute() 메서드를 이용한다. addFlashAttribute() 메서드는 리다이렉트되는 시점에 사용할 휘발성 데이터를 등록한다.
확인 췤
1) HTTP는 POST, GET, PATCH(PUT), DELETE 등의 다양한 메서드를 제공한다 2) 데이터 삭제 요청은 반드시 HTTP의 DELETE 메서드로만 할 수 있다. 3) @PathVariable은 클라이언트의 요청 중 특정 URL 값을 매개변수로 가져온다. 4) CrudRepository는 데이터 삭제를 위해 delete() 메서드를 제공한다. 5) RedirectAttributes 객체를 활용하면 리다이렉트 페이지에서 사용할 일회성 데이터를 등록할 수 있다.
답 : 2번
데이터 삭제 과정
RedirectAttributes
articleRepository.delete()
DELETE 문
DELETE [FROM] 테이블명 WHERE 조건;
CRUD의 마지막 단계인 데이터 삭제하기 실습