[클론 코딩] 네이버 카페 - (통합게시판) 게시글 수정

2024. 5. 31. 22:00Project/Naver Cafe

  이번에는 게시글 수정 기능을 추가하도록 하겠다. 게시글의 수정양식은 작성양식과 다르지 않으며 사용자에게 제공되는 정보만 다르다, 작성양식의 경우 기본 정보가 제공, 수정양식은 수정하려는 게시글의 정보가 제공될 것이다. 네이버 카페 게시글의 경우 수정해도 작성일이 바뀌지 않는 걸로 봐서 수정일에 대한 정보는 필요 없을거라 판단했다.


Normal

package CloneCoding.NaverCafe.domain.article.normal;

@Entity
@Table(name = "NORMAL_ARTICLE")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Normal {

    public void update(RequestPostNormal request) {
        this.menuId = request.getMenuId();
        this.titleHeader = request.getTitleHeader();
        this.title = request.getTitle();
        this.body = request.getBody();
        this.notice = request.isNotice();
        this.allowComment = request.isAllowComment();
    }

}

 

  • update() : 요청 정보로 Normal 객체를 수정

NormalController

package CloneCoding.NaverCafe.domain.article.normal.controller;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/cafe/{cafe_url}")
public class NormalController {

    private final NormalService normalService;

    @GetMapping("/update/{normal_id}")
    public ResponseNormalForm getUpdateForm(@PathVariable("cafe_url") String url,
                                            @PathVariable("normal_id") Long id,
                                            @RequestHeader("Authorization") String token) {
        log.info("게시글 수정양식 가져오기 요청");
        return normalService.createUpdateForm(url, id, token);
    }

    @PutMapping("/update/{normal_id}")
    public String updateArticle(@PathVariable("cafe_url") String url,
                                @PathVariable("normal_id") Long id,
                                @RequestBody @Valid RequestPostNormal request,
                                @RequestHeader("Authorization") String token) {
        log.info("게시글 수정 요청");
        return normalService.updateNormal(url, id, request, token);
    }

}

 

  • getUpdateForm() : 카페 url, 게시글 id, 토큰 정보를 통해 NormalService의 createUpdateForm()을 호출 후 결과 값을 반환
  • updateArticle() : 카페 url, 게시글 id, 요청 정보, 토큰 정보를 통해 NormalService의 updateNormal()을 호출, 결과 메시지를 반환

NormalServiceImpl

package CloneCoding.NaverCafe.domain.article.normal.service;

import static CloneCoding.NaverCafe.message.SystemMessage.WRITE_COMPLETE;

@Service
@RequiredArgsConstructor
public class NormalServiceImpl implements NormalService {

    private final NormalRepository normalRepository;
    private final CafeRepository cafeRepository;
    private final CafeMemberRepository cafeMemberRepository;
    private final IntegrateRepository integrateRepository;
    private final AesUtil aesUtil;

    @Override
    public ResponseNormalForm createUpdateForm(String url, Long id, String token) {

        checkAuth(url, token);

        Normal article = normalRepository.findById(id)
                .orElseThrow(() -> new NoSuchElementException("게시글 정보를 찾을 수 없습니다."));

        Integrate menu = integrateRepository.findById(article.getMenuId())
                .orElseThrow(() -> new NoSuchElementException("통합게시판 정보를 찾을 수 없습니다."));

        return ResponseNormalForm.builder()
                .menu(menu.getName())
                .titleHeader(article.getTitleHeader())
                .title(article.getTitle())
                .body(article.getBody())
                .tag("")
                .notice(article.isNotice())
                .allowComment(article.isAllowComment())
                .build();
    }

    @Override
    public String updateNormal(String url, Long id, RequestPostNormal request, String token) {

        checkAuth(url, token);

        Normal article = normalRepository.findById(id)
                .orElseThrow(() -> new NoSuchElementException("게시글 정보를 찾을 수 없습니다."));

        article.update(request);

        normalRepository.save(article);

        return WRITE_COMPLETE.getMessage();

    }

    private CafeMember checkAuth(String url, String token) {
        Cafe cafe = cafeRepository.findByUrl(url);
        String accountId = aesUtil.aesDecode(token);

        return cafeMemberRepository.findByAccountId(cafe, accountId);
    }

}

 

  • createUpdateForm() : 수정할 게시글의 정보로 ResponseNormalForm 객체를 생성해 반환
  • updateNormal() : 요청 정보로 게시글의 정보를 수정 후 엔티티 저장, 결과 메시지를 반환

API TEST

DB - 게시글 수정 전

 

  수정 전 게시글의 정보이다. 다양한 정보들 중에 일부 정보를 바꾸는 테스트를 진행했다.

 

API TEST - 일반 게시글 수정양식 가져오기

 

  사용자가 게시글을 수정하길 요청한다면 기존 게시글의 정보를 사용자에게 제공할 필요가 있다. 해당 테스트는 기존 게시글의 정보를 제대로 반환하는지에 대한 테스트이다.

 

API TEST - 일반 게시글 수정

 

DB - 게시글 수정 후

 

  사용자가 수정 정보를 담아 게시글 등록을 요청하면 기존 게시글의 정보를 요청 정보로 바꾸어 DB에 반영해야 한다. 해당 테스트는 사용자가 수정하길 원하는 정보로 기존 게시글 정보가 바뀌었는지를 확인하는 테스트로 정상완료 메시지를 확인했으며, DB에서도 게시글의 정보가 요청정보로 바뀐 것을 확인 할 수 있었다.