스프링 부트 3 - 블로그 글 수정 API와 전체 코드

김동헌·2023년 11월 19일
0

SpringBoot

목록 보기
9/19
post-thumbnail

서비스 구성

Articles.java

엔티티에 요청 받은 내용으로 값을 수정하는 도메인 작성
기존의 코드에 아래 코드를 추가합니다.

    // 블로그 글 수정 메서드
    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
    

DTO 구성 - UpdateArticleRequest.java

블로그 글 수정 요청을 받을 DTOdto 디렉터리에 생성합니다.

@NoArgsConstructor
@AllArgsConstructor
@Getter
public class UpdateArticleRequest {
    private String title;
    private String content;
}

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;
}
    

@Transactional → 매칭한 메서드를 하나의 트랜잭션으로 묶는 역할

트랜잭션이란, 여러 개의 작업 단위를 하나의 논리적인 작업 단위로 묶어서 처리하는 것을 말합니다. 이러한 작업은 모두 성공적으로 완료되거나, 아무것도 완료되지 않은 상태로 유지되어야 합니다.


컨트롤러 구성

BlogApiController.java

기존의 코드에 아래 코드를 추가합니다.

@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);
}

API 실행 테스트

Postman

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);
}
    

BlogServiceTest 코드


@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());
    }
}

전체 코드 Github

전체 코드 주소입니다 : >

profile
백엔드 기록 공간😁

0개의 댓글