엔티티에 요청 받은 내용으로 값을 수정하는 도메인 작성
기존의 코드에 아래 코드를 추가합니다.
// 블로그 글 수정 메서드
public void update(String title, String content) {
this.title = title;
this.content = content;
}
블로그 글 수정 요청을 받을
DTO
를dto
디렉터리에 생성합니다.
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class UpdateArticleRequest {
private String title;
private String content;
}
@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;
}
@Transactional
→ 매칭한 메서드를 하나의 트랜잭션으로 묶는 역할트랜잭션이란, 여러 개의 작업 단위를 하나의 논리적인 작업 단위로 묶어서 처리하는 것을 말합니다. 이러한 작업은 모두 성공적으로 완료되거나, 아무것도 완료되지 않은 상태로 유지되어야 합니다.
기존의 코드에 아래 코드를 추가합니다.
@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);
}
1번 게시글의 내용을 수정
수정된 내용을 확인
기존의 코드에 아래 코드를 추가합니다.
@DisplayName("글 수정 성공")
@Test
public void updateArticle() throws Exception {
// given
final String url = "/api/articles/{id}";
final String title = "title_example";
final String content = "content_example";
Article savedArticle = blogRepository.save(Article.builder()
.title(title)
.content(content)
.build());
final String newTitle = "title_update";
final String newContent = "content_update";
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);
}
@ExtendWith(SpringExtension.class)
@DataJpaTest
@Import(BlogService.class)
class BlogServiceTest {
@Autowired
private BlogService blogService;
@MockBean
private BlogRepository blogRepository;
@Test
void findById() {
// Given
long articleId = 1;
Article mockArticle = new Article("Mock Title", "Mock Content");
when(blogRepository.findById(articleId)).thenReturn(java.util.Optional.of(mockArticle));
// When
Article result = blogService.findById(articleId);
// Then
assertThat(result).isEqualTo(mockArticle);
}
@Test
void findAll() {
// Given
List<Article> mockArticles = List.of(
new Article("제목 1", "내용 1"),
new Article("제목 2", "내용 2")
);
when(blogRepository.findAll()).thenReturn(mockArticles);
// When
List<Article> result = blogService.findAll();
// Then
assertThat(result).isEqualTo(mockArticles);
}
@Test
void save() {
// Given
AddArticleRequest addArticleRequest = new AddArticleRequest("제목", "내용");
Article mockArticle = addArticleRequest.toEntity();
when(blogRepository.save(any(Article.class))).thenReturn(mockArticle);
// When
Article result = blogService.save(addArticleRequest);
// Then
assertThat(result).isEqualTo(mockArticle);
}
@Test
void delete() {
// Given
long articleId = 1;
// When
blogService.delete(articleId);
// Then
List<Article> articlesAfterDeletion = blogRepository.findAll();
assertThat(articlesAfterDeletion).hasSize(0);
}
@Test
void update() {
// Given
long articleId = 1;
UpdateArticleRequest updateArticleRequest = new UpdateArticleRequest("수정 제목", "수정 내용");
Article mockArticle = new Article("원본 제목", "원본 내용");
when(blogRepository.findById(articleId)).thenReturn(java.util.Optional.of(mockArticle));
// When
Article result = blogService.update(articleId, updateArticleRequest);
// Then
assertThat(result.getTitle()).isEqualTo(updateArticleRequest.getTitle());
assertThat(result.getContent()).isEqualTo(updateArticleRequest.getContent());
}
}