Backend
home
🖋️

3일차

생성일
2024/07/10 15:09
태그
본 프로젝트는 “스프링부트 3 백엔드 개발자 되기” 서적을 참고하여 진행하였음

블로그 글 삭제 API 구현

BlogService.java
// 삭제 메서드 추가 public void delete(long id) { blogRepository.deleteById(id); }
Java
복사
BlogApiController.java
@DeleteMapping("/api/articles/{id}") public ResponseEntity<Void> deleteArticle(@PathVariable long id) { blogService.delete(id); return ResponseEntity.ok().build(); }
Java
복사
삭제 결과 확인
postman 테스트 (왼쪽 - DELETE 요청 보냄, 오른쪽 - DELETE 요청 보낸 후)
결과 확인 (왼쪽 - 변경 전, 오른쪽 - 변경 후)
테스트 코드 작성 - BlogApiControllerTest.java
@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 List<Article> articles = blogRepository.findAll(); assertThat(articles).isEmpty();
Java
복사

블로그 글 수정 API 구현

Article.java - 서비스 메서드 코드 작성
// 요청받은 내용으로 값을 수정 public void update(String title, String content) { this.title = title; this.content = content; }
Java
복사
DTO 생성 - UpdateArticleRequest.java
package com.example.msblog.dto; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Getter public class UpdateArticleRequest { private String title; private String content; }
Java
복사
업데이트 메서드 추가 - BlogService.java
// 업데이트 메서드 추가 @Transactional // 트랜잭션 메서드 public Article update(long id, UpdateArticleRequest request) { Article article = blogRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("not found: " + id)); article.update(request.getTitle(), request.getContent()); return article; }
Java
복사
@Transactional
매칭한 메서드를 하나의 트랜잭션으로 묶는 역할을 한다.
update() 메서드는 엔티티의 필드 값이 바뀌면 중간에 에러가 발생하여도 제대로 된 값 수정을 보장할 수 있게 되었다.
컨트롤러 쪽 작성 - BlogApiController.java
/api/articles/{id} PUT 요청이 오면 Request Body 정보가 request 로 넘어온다. 서비스 클래스의 update() 메서드에 id와 request를 넘겨주고 응답 값은 body에 담아 전송한다.
// 업데이트 메서드 작성 @PutMapping("/api/articles/{id}") public ResponseEntity<Article> updateArticle(@PathVariable long id, @RequestBody UpdateArticleRequest request) { Article updatedArticle = blogService.update(id, request); return ResponseEntity.ok().body(updatedArticle); }
Java
복사
업데이트 결과 확인 (왼쪽 - 변경 전, 오른쪽 - 변경 후)
테스트 코드 작성 - BlogApiControllerTest.java
@DisplayName("updateArticle: 블로그 글 수정에 성공한다.") @Test public void updateArticle() 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()); final String newTitle = "new title"; final String newContent = "new content"; UpdateArticleRequest request = new UpdateArticleRequest(newTitle, newContent); // when ResultActions result = mockMvc.perform(put(url, savedArticle.getId()) .contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(request))); // then result.andExpect(status().isOk()); Article article = blogRepository.findById(savedArticle.getId()).get(); assertThat(article.getTitle()).isEqualTo(newTitle); assertThat(article.getContent()).isEqualTo(newContent); }
Java
복사