8. Spring 게시판 무작정 따라하기

게시글 삭제 시 유효성 검사와 트랜잭션 관리
HootJem's avatar
Aug 20, 2024
8. Spring 게시판 무작정 따라하기
게시글 삭제를 구현할 때, 우선적으로 삭제할 게시글이 존재하는지, 현재 수정을 시도하고 있는 게시글이 맞는지를 확인해야 한다. 이를 위해 우리는 이전에 구현한 findById 메서드를 활용할 수 있다. 컨트롤러 → 레포지토리 로 update 요청을 하는데 이때 controller 에 트랜잭션을 걸게되면 DB에 데이터를 요청하고 받아오는 시간 이상으로 오랜 시간 트랜잭션상태를 유지하게 된다.
따라서, 보통 C → S → R 서비스 클래스를 만들어 그곳에서 트랜잭션을 관리한다.

1. 게시글 삭제

1.1 레포지토리 코드 작성

deleteById 메서드를 사용하여 게시글을 삭제하는 코드
public void deleteById(int id) { Query query = em.createNativeQuery("delete from board_tb where board_id=?"); query.setParameter(1, id); query.executeUpdate(); }

1.2 단위테스트 (deleteById)

  • 게시글 삭제 후 확인
@Test public void deleteById_test() { // given int id = 1; // when boardRepository.deleteById(id); // eye boardRepository.findById(id); }
notion image
→ 제대로 삭제되어 해당 pk 로는 조회가 안되는 것 확인
 
  • 삭제할 게시글 존재 여부 확인
@Test public void deleteById_test() { // given int id = 1; // when Board board = boardRepository.findById(id); // eye System.out.println(board.getId()); System.out.println(board.getTitle()); System.out.println(board.getContent()); // then (코드) Assertions.assertThat(board.getTitle()).isEqualTo("제목2"); }
notion image
→ 예상한 title 은 제목2 였으나 실제 리턴값은 제목1 이라 에러가 난다. id =2 로 바꾸거나 isEqualTo("제목1") 로 수정하면 에러 발생하지 않음.
 
@Test public void deleteById_test() { // given int id = 6; // when boardRepository.deleteById(id); // eye try { boardRepository.findById(id); } catch (Exception e) { Assertions.assertThat(e.getMessage()).isEqualTo("게시글 id를 찾을 수 없습니다"); } // then (코드) }
notion image
이전시간에 활용한 findById 에서 설정한 에러 메세지를 이용하여 설정한 예외가 발생하는지 확인
 

1.3 게시글 삭제 API 구현

@PostMapping("/board/{id}/delete") public String deltete(@PathVariable("id") int id) { boardRepository.deleteById(id); return "redirect:/board"; }
→ 게시글 삭제 후 목록 페이지로 리다이렉트
 

1.4 트랜잭션이 적용된 레포지토리 메서드

@Transactional public void deleteById(int id) { Query query = em.createNativeQuery("delete from board_tb where id=?"); query.setParameter(1, id); query.executeUpdate(); }
→ 트랜잭션 추가하지 않으면 에러가 발생한다. (원래라면 서비스 클래스를 만들어 처리해야 되지만 v2 에서 다루겠음)
 
 

Share article

[HootJem] 개발 기록 블로그