웹/Spring

스프링부트3 블로그 만들기 - 블로그 글 수정 API 구현하기

놀이방사장님 2023. 10. 17. 22:40
728x90
반응형

안녕하세요 놀이방 사장입니다.

 

이번 포스팅은 스프링부트3 블로그 만들기입니다.

 

이번에는 글 수정 API를 구현해보겠습니다.

 

먼저 Article파일에

public void update(String title, String content){
    this.title = title;
    this.content = content;
}

값을 수정하는 메서드를 작성해준다.

 

그 후 글 수정 요청을 받을 DTO를 작성해줍니다.

UpdateArticleRequest.java

package me.joyeonggyu.springbootdeveloper.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

 

 

 

DTO를 만들었으니 이제 서비스파일에

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

리포지터리를 이용하여 글을 수정하는 update메소드를 만든다.

 

@Transactional

이 애너테이션은 매칭한 메서드를 하나의 트랜잭션으로 묶는 역할을 한다.

스프링에서는 트랜잭션을 적용하기 위해 다른 작업을 할 필요없이 이 애너테이션을 사용하면 된다.

이제 update() 메서드는 엔티티의 필드 값이 바뀌면 중간에 에러가 발생해도 제대로 된 값 수정을 보장할 수 있게 됨

 

컨트롤러 작성하기

@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/articles/{id}"

위에 PUT요청이 오면 Request Body정보가 request로 넘어온다.

다시 서비스클래스인 update메서드에 id와 request를 넘겨준다.

응답값은 body에 담아 전송

 

실행테스트 해보기

POST MAN이용하

 

테스트 코드 작성하기

given 블로그 글을 저장하고, 블로그 글 수정에 필요한 요청 객체를 만든다.
When Update API로 수정 요청을 보낸다. 요청타입은 JSON이며 given절에서 만든 객체를 요청 본문으로 함께 보낸다.
Then 응답코드가 200인지 확인

 

@DisplayName("Update API")
@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)));

    result.andExpect(status().isOk());

    Article article = blogRepository.findById(savedArticle.getId()).get();

    assertThat(article.getTitle()).isEqualTo(newTitle);
    assertThat(article.getContent()).isEqualTo(newContent);
}

이렇게 해주면 수정 API도 완성입니다!

 

 

반응형