wongakim-99 / Spring-study

스프링 공부방 (백엔드 공부)
0 stars 0 forks source link

게시글 삭제하기: Delete #9

Closed wongakim-99 closed 3 months ago

wongakim-99 commented 3 months ago

CRUD의 마지막 단계인 데이터 삭제하기 실습

wongakim-99 commented 3 months ago

데이터 삭제 과정

  1. 클라이언트가 HTTP 메서드로 특정 게시글의 삭제 요청
  2. 삭제 요청을 받은 컨트롤러는 리파지터리를 통해 DB에 저장된 데이터를 찾아 삭제. 이 작업은 기존 데이터가 있는 경우에만 수행됨
  3. 삭제가 완료됐다면 클라이언트를 결과 페이지로 리다이렉트

Image

wongakim-99 commented 3 months ago

Delete 버튼 추가'

show.mustache가서 Edit 버튼 밑에

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

추가

wongakim-99 commented 3 months ago

Delete 요청을 받아 데이터 삭제하기

데이터를 삭제할때는 DELETE 메서드를 사용한다고 했다. 그런데 HTML에서는 POST와 GET을 제외한 다른 메서드를 제공하지 않는다. 그래서 여기에서는 GET방식으로 삭제 요청을 받아 처리하겠다. DELETE 메서드를 활용해 삭제 요청을 보내는 방법은 나중에 다시 알아보겠다.

  1. ArticleController의 update() 메서드 아래에 삭제 요청을 받아 처리할 delete() 메서드를 추가한다.
  2. delete() 메서드의 기본 틀을 입력하고 return 값으로 null을 반환한다.
  3. 원래 데이터 삭제 요청 어노테이션은 @DelteMapping("/articles/{id}/delete")로 작성하면 된다. 그런데 HTML에서 DELETE 메서드를 지원하지 않으니 @GetMapping("/articles/{id}/delete")로 작성한다.
@GetMapping("/articles/{id}/delete")  // 데이터 삭제 작업
 public String delete() {
     log.info("삭제 요청이 들어왔습니다.");
     return null;
 }
  1. 세 부분으로 나누어서 처리
    • 삭제할 대상 가져오기
    • 대상 엔티티 삭제하기
    • 결과 페이지로 리다이렉트하기
wongakim-99 commented 3 months ago

삭제할 대상 가져오기

  1. DB에 접근해 데이터를 처리할 때는 JPA의 리파지터리를 이용 articleRepository.findById(id)의 메서드로 DB에 해당 id를 가진 데이터가 있는지 찾는다. 만약 찾으면 Article 타입의 target 변수에 저장하고, 찾지 못하면 null을 반환한다.

  2. findById(id)를 호출할 때 사용한 id 변수는 delete() 메서드에 선언되지 않았음. 이 id는 @GetMapping("/articles/{id}/delete")의 URL 주소에서 가져오므로 delete() 메서드의 매개변수로 @PathVariable Long id를 써준다.

wongakim-99 commented 3 months ago

대상 엔티티 삭제

target에 무언가 저장됐다면 삭제 수행

if() 조건문으로 target이 null이 아닌지 확인하고 참이면 내부 코드 수행. 삭제는 articleRepository를 작성하고 점(.) 을 찍으면 활용할 수 있는 메서드가 뜨는데 당연히 delete()를 선택하면 됨.

중간점검하면 로그창에 삭제 잘 됬다고 로그뜨고, h2-console 들어가서 확인하면 DB에서도 데이터가 삭제된걸 볼 수 있을거임.

wongakim-99 commented 3 months ago

결과 페이지로 리다이렉트하기

  1. 리다이렉트는 return 문에 작성한다. 게시글을 삭제하면 목록 페이지로 돌아가야 한다. 따라서 null을 지우고 아래와 같이 작성
return "redirect:/articles";
wongakim-99 commented 3 months ago

SQL 문으로 직접 DB 삭제하기

H2 콘솔 탭으로 가서 현재 DB를 확인해 보자. 그런데 Run을 클릭하면 접속 화면으로 바뀐다. 서버를 재시작했으니 JDBC URL을 다시 입력한 후 접속한다.

데이터를 삭제할 때 사용하는 SQL 문은 DELETE 문이다. 형식은 다음과 같은데, FORM은 생략할 수 있다.

DELETE [FORM] 테이블명 WHERE 조건; 
wongakim-99 commented 3 months ago

최종 정리

클라이언트가 특정 게시글의 삭제 요청을 하면 컨트롤러의 delete() 메서드에서 @GetMapping으로 받는다. delete() 메서드가 삭제 대상을 찾으려면 대푯값인 id가 필요한데, 이때 @PathVariable 어노테이션을 사용한다. @PathVariable은 @GetMapping의 URL 에서 중괄호에 둘러싸인 값을 매개변수로 가져온다. 리파지터리는 이렇게 가져온 id로 DB에서 삭제 대상을 찾고 리파지터리가 제공하는 delete() 메서드로 데이터를 삭제한다. 이때 DB 내부에서는 DELETE라는 SQL 문이 자동으로 수행된다.

삭제 작업이 끝나면 결과 페이지로 리다이렉트한다. 삭제됐다는 메시지도 함께 출력하는데, 이를 위해 Redirect Attributes 객체의 addFlashAttribute() 메서드를 이용한다. addFlashAttribute() 메서드는 리다이렉트되는 시점에 사용할 휘발성 데이터를 등록한다.

Image

wongakim-99 commented 3 months ago

확인 췤

  1. 다음 중 옳지 않은 것은?

1) HTTP는 POST, GET, PATCH(PUT), DELETE 등의 다양한 메서드를 제공한다 2) 데이터 삭제 요청은 반드시 HTTP의 DELETE 메서드로만 할 수 있다. 3) @PathVariable은 클라이언트의 요청 중 특정 URL 값을 매개변수로 가져온다. 4) CrudRepository는 데이터 삭제를 위해 delete() 메서드를 제공한다. 5) RedirectAttributes 객체를 활용하면 리다이렉트 페이지에서 사용할 일회성 데이터를 등록할 수 있다.

답 : 2번

wongakim-99 commented 3 months ago

마무리

  1. 데이터 삭제 과정

    • 클라이언트가 서버로 삭제 요청을 하면 서버는 DB에서 해당 데이터를 찾아 삭제하고, 클라이언트를 리다이렉트된 페이지로 보낸다.
  2. RedirectAttributes

    • 리다이렉트 페이지에서 사용할 일회성 데이터를 관리하는 객체이다. 이 객체의 addFlashAttribute() 라는 메서드로 리다이렉트된 페이지에서 사용할 일회성 데이터를 등록할 수 있다.
  3. articleRepository.delete()

    • DB에 접근해 데이터를 삭제할 때 사용하는 메서드이다. articleRepository.delete(target) 이라고 작성하면 DB에서 target을 삭제한다.
  4. DELETE 문

    • DB 테이블에 저장된 내용을 행 단위로 삭제할 때 사용하는 SQL 문으로, 형식은 다음과 같다.
DELETE [FROM] 테이블명 WHERE 조건;