JPA

SpringBoot JPA 게시판 CRUD 구현(Delete-TDD)

빈코 2022. 7. 25. 09:07

오늘은 지난번에 포스팅한 게시글 수정에 이어 CRUD의 마지막 Delete 기능WAS 단 로직을 포스팅하려 합니다. 패키지성 포스팅이기 때문에 이전 포스팅을 보지 않으셨다면 이해되지 않는 부분이 있을 수 있습니다. 글 맨 하단 링크를 통해 확인해주세요 :) Gradle 빌드나 폴더 구조는 깃허브 Bincolog를 참고해주세요.

 

로고
Delete 기능

 

게시글 삭제 로직은 따로 DTO 클래스를 분류할 필요가 없어서 이전에 만든 Create, Read, Update 기능보다는 훨씬 간단하게 로직이 구현됩니다. Controller 클래스와 Service 클래스만 구현하면 되고, 각각에 해당하는 Test 코드를 구현해보겠습니다.

 

Controller 생성📘

@DeleteMapping("/posts/{postId}")
public void delete(@PathVariable Long postId){
    postService.delete(postId);
}

Controller 코드는 언제나 간단하게 구현됩니다. @DeleteMapping 어노테이션을 사용해주고, 파라미터로 넘어온 게시글의 Id 값인 postId 값을 PostService의 delete() 메서드로 넘겨주면 됩니다.

 

Service 생성📗

public void delete(Long id) {
    Post post = postRepository.findById(id)
            .orElseThrow(RuntimeException::new);

    postRepository.delete(post);
}

Service 코드도 이번에는 간단하게 구현이 됩니다. 넘겨 받은 Id 값으로 기존 DB에 해당 글이 존재하는지 findById() 메서드를 통해 찾아줍니다. 만약 ID 값에 해당하는 글이 없다면 예외처리를 해줍니다.

 

예외처리가 일어나지 않고 정상적으로 게시글을 찾아왔다면, JpaRepository에서 기본적으로 제공하는 delete() 메서드를 이용하여 해당 게시글을 삭제해주면 글 삭제 기능은 끝이 납니다.

 


Controller Test 생성📒

WAS 단 로직이 다 구현되었으니 테스트 코드를 작성해볼까요?

@Test
@DisplayName("글 삭제")
void test8() throws Exception {
    //given
    Post post = Post.builder()
            .title("빈코 제목")
            .content("빈코 내용")
            .build();

    postRepository.save(post);

    //expected
    mockMvc.perform(MockMvcRequestBuilders.delete("/posts/{postId}", post.getId())
            .contentType(APPLICATION_JSON))
            .andExpect(status().isOk())
            .andDo(print());
}

given section

given 단계에서는 게시글을 하나 저장해줍니다. 이전 포스팅에서와 마찬가지로 Builder 패턴을 이용하여 Post(Entity) 객체를 하나 생성해주고, JpaRepository에서 기본적으로 제공하는 save() 메서드를 이용하여 저장해주었습니다.

 

expected section

expected 단계에서는 MockMvc를 이용하여 아까 위에서 만든 Controller의 delete() 메서드와 매핑을 시켜줍니다. 그리고 파라미터 값으로 given 단계에서 생성한 게시글의 Id값을 함께 넘겨줍니다.

 

이미 글이 삭제 된 후이기 때문에 비교할 값이 없으므로 해당 로직에서 오류가 나왔는지 200 코드가 내려오는지 체크만 해주었습니다. 

 

성공
성공!

 

Service Test 생성📙

Service Test는 게시글 삭제 테스트와, 존재하지 않는 게시글 삭제 테스트로 총 2가지의 유형으로 나누었습니다. 위에서 작성한 PostService 클래스에서 첫 번째로 게시글을 찾아오는데 만약 없다면 RuntimeException 처리를 해주었습니다.

 

존재하지 않는 게시글일 때 예외처리를 진행한 것인데, 존재 하지 않는 글일 때 예외처리를 잘 진행하는지 확인하기 위해 2가지의 유형으로 테스트를 나누었습니다.

 

@Test
@DisplayName("게시글 삭제")
void test7() {
    //given
    Post post = Post.builder()
            .title("빈코 제목")
            .content("빈코 내용")
            .build();
    postRepository.save(post);

    //when
    postService.delete(post.getId());

    //then
    Assertions.assertEquals(0, postRepository.count());
}

첫 번째로 게시글 삭제 테스트는 Controller 테스트와 매우 유사합니다. given 단계에서 임의의 게시글을 하나 저장해주고 when 단계에서 저장한 게시글을 삭제해줍니다. 마지막으로 then 단계에서 assertEquals() 메서드를 이용하여 해당 DB에 아무 값이 없는지 체크해줍니다.

 

테스트 결과
성공!

 

@Test
@DisplayName("게시글 삭제 - 존재하지 않는 글")
void test8() {
    //given
    Post post = Post.builder()
            .title("제목")
            .content("내용")
            .build();
    postRepository.save(post);

    //expected
    Assertions.assertThrows(RuntimeException.class, () -> {
       postService.delete(post.getId() + 1L);
    });
}

 

두 번째로 존재하지 않는 글을 삭제하려 했을 경우의 테스트입니다. given 단계는 위와 동일하게 임의의 글 하나를 저장해줍니다.

 

expected 단계에서는 assertThorws() 메서드를 이용하여 두 번째 인자값(postService.delete())을 실행하였을 때 첫 번째 인자인 예외 타입과 같은지 검사합니다.

 

postService.delete() 메서드에 파라미터 값으로는 given 단계에서 저장한 ID보다 예외를 발생하기 위해서 일부러 +1을 해준 값을 넣어주었습니다. 

 

테스트 결과
성공!

 


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

마치며

지금까지 게시판 CRUD의 기본 로직은 다 구현을 하였습니다. 이제는 예외처리와 추가적으로 검색 기능 등 게시판에 추가할 수 있는 많은 기능들이 남았네요. 추가적인 기능들은 8월부터 시작되는 제 개인 토이 프로젝트에서 로직을 구현하고 포스팅할 예정입니다😄

 

이전 포스팅

* [ SpringBoot JPA 게시판 CRUD(Create) ]

* [ SpringBoot JPA 게시판 CRUD(Create-TDD) ]

* [ SpringBoot JPA 게시판 CRUD(Read 단건 조회 및 TDD) ]

* [ SpringBoot JPA 게시판 CRUD(Read 다중 조회 및 페이징 처리 / TDD) ]

* [ SpringBoot JPA 게시판 CRUD(Update-TDD) ]

 

다음 포스팅

* [ SpringBoot JPA 게시판 CRUD(예외처리) ]

반응형