본 프로젝트는 “스프링부트 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
복사