[스프링 부트] 18. 삭제 구현

lhs's avatar
Nov 18, 2024
[스프링 부트] 18. 삭제 구현
 

1. detail.mustache

{{> layout/header}} <section> <form action="/board/{{model.id}}/delete" method="post"> <button type="submit">삭제</button> </form> <div> 번호: {{model.id}}<br> 제목: {{model.title}}<br> 내용: {{model.content}}<br> 작성일: {{model.createdAt}}<br> </div> </section> </body> </html>
  • 삭제 버튼을 만들어 form 태그로 감싼다.
  • formaction 속성에 주소값을 설정하고, methodPOST로 설정한다.
    • 스프링을 연습하기 위해 JavaScript 없이 HTML 1.0 버전으로 상정하여 연습하며, GET과 POST만 사용할 수 있으므로 주소에 delete를 추가한다.

2. BoardRepository

@RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager entityManager; public void delete(int id) { Query q = entityManager.createNativeQuery("delete from board_tb where id = ?"); q.setParameter(1, id); q.executeUpdate(); } }
  • BoardRepositorydelete 메서드를 구현하여 게시글의 id를 기준으로 DB에서 해당 게시글을 삭제한다.

3. BoardRepositoryTest

@Import(BoardRepository.class) @DataJpaTest public class BoardRepositoryTest { @Autowired BoardRepository boardRepository; @Test public void delete_test() { // given int id = 1; // when boardRepository.delete(id); // then(eye) List<Board> boardList = boardRepository.findAll(); System.out.println("size: " + boardList.size()); } }
  • BoardRepository에서 구현한 delete 메서드를 테스트한다.
  • 테스트의 3가지 단계
    • given : 테스트를 위한 입력 값을 설정하는 단계
      • DB에서 삭제할 게시글의 id를 설정한다.
    • when : 테스트할 메서드를 실행하는 단계
      • boardRepository.delete() 메서드를 호출하여 DB에서 해당 게시글을 삭제한다.
    • then : 결과를 검증하는 단계
      • 출력으로 결과를 검증하는 방식으로 대체하였다.
      • 삭제 여부는 리스트의 사이즈로 확인한다.

4. BoardController

@RequiredArgsConstructor @Controller public class BoardController { private final BoardService boardService; @PostMapping("/board/{id}/delete") public String delete(@PathVariable("id") int id) { boardService.게시글삭제(id); return "redirect:/"; } }
  • @PostMapping을 통해 /board/{id}/delete 경로로 들어오는 POST 요청을 delete 메서드에서 처리한다.
  • @PathVariable("id") 어노테이션을 사용하여 삭제할 게시글의 id를 받아온다.
  • boardService에서 게시글삭제 메서드를 호출하여 해당 게시글을 삭제한다.
  • "redirect:/"를 반환하여 “/” 경로로 리다이렉트한다.

5. BoardService

@RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; @Transactional public void 게시글삭제(int id) { boardRepository.delete(id); } }
  • 게시글삭제 메서드를 구현하여, idboardRepositorydelete 메서드를 사용해 DB에서 해당 게시글을 삭제한다.
  • @Transactional 어노테이션을 사용해 DB 트랜잭션을 관리한다.

6. 구현 테스트

notion image
  • 삭제 버튼을 눌러 게시글 삭제를 요청한다.
notion image
  • 삭제 후, 게시판으로 리다이렉트되었는지 확인하고, 해당 게시글이 삭제되었는지 확인한다.
Share article

LHS's Study Space