6.6 블로그 글 삭제 API 구현

SummerToday·2024년 2월 11일
1
post-thumbnail
post-custom-banner

서비스 메서드 구현

// service - BlogService.java

@RequiredArgsConstructor 
@Service 
public class BlogService {
    private final BlogRepository blogRepository;

      ~ 생략 ~  

    public void delete(long id) {
        blogRepository.deleteById(id);
    }
}
  • 블로그 글의 ID를 받은 뒤 JPA에서 제공하는 deleteById() 메서드를 사용해 데이터베이스에서 데이터를 삭제.

컨트롤러 메서드 구현하기

// controller - BlogApiController.java

@RequiredArgsConstructor
@RestController // HTTP Response Body에 객체 데이터를 JSON 형식으로 반환하는 컨트롤러
public class BlogApiController {

    private final BlogService blogService;

      ~ 생략 ~

    @DeleteMapping("/api/articles/{id}")
    public ResponseEntity<Void> deleteArticle(@PathVariable long id){
        blogService.delete(id);

        return ResponseEntity.ok().build();
    }
}
  • build();
    해당 객체를 빌드하여 완전한 HTTP 응답을 생성하는 한다. 별도의 헤더나 본문이 필요하지 않고, 단순히 상태 코드가 200(OK)인 응답을 클라이언트에게 반환하고자 할 때 주로 사용된다.
    여기서는 HTTP 상태 코드가 200(OK)인 응답을 나타내는 ResponseEntity 객체를 생성한다.

테스트 코드 작성

Given : 블로그 글을 저장한다.
When : 저장한 블로그 글의 id 값으로 삭제 API를 호출한다.
Then : 해당 id의 블로그 글이 남아있는 지를 확인한다.

// test - BlogApiControllerTest

@SpringBootTest // 테스트용 애플리케이션 컨텍스트
@AutoConfigureMockMvc // MockMvc 생성
class BlogApiControllerTest {

    @DisplayName("deleteArticle: 블로그 글 삭제에 성공한다.")
    @Test
    public void deleteArticle() throws Exception {
        
        // given
        final String url = "/api/articles/{id}";
        final String title = "title";
        final String content = "content";

        Article savedArticle = blogRepository.save(Article.builder()
                .title(title)
                .content(content)
                .build());

        // when
        mockMvc.perform(delete(url, savedArticle.getId()))
                .andExpect(status().isOk());

        // then
       assertThat(blogRepository.findById(savedArticle.getId())).isEmpty();
    
    }
    
}
  • assertThat(blogRepository.findById(savedArticle.getId())).isEmpty();
    : 해당 id에 해당하는 블로그 글의 객체가 존재하는 지를 확인한다.

    • blogRepository.findById(savedArticle.getId())의 반환 값은 Optional<Article> 타입이다.

    • Optional<T>는 Java 8에서 도입된 클래스로, null이 올 수 있는 값을 감싸는 Wrapper 클래스이다.



해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽
profile
IT, 개발 관련 정보들을 기록하는 장소입니다.
post-custom-banner

0개의 댓글