게시판 9 - 수정, 삭제 기능

JIWOO YUN·2024년 4월 24일
0

게시판만들기

목록 보기
9/21
post-custom-banner

현재 까지 질문 및 답변 등록에 대해서만 진행했었고, 여기서 추가적으로 질문 및 답변 수정 및 삭제 부분을 추가로 진행

  • 수정 및 삭제를 할려면 기본적으로 작성한 본인 또는 admin 관리자 권한으로 수정 또는 삭제가 가능하게 하는 게 맞기 때문에 게시물 작성자와 현재 사용자가 동일 사용자인지 확인이 필요하다.
    • 또는 관리자인 경우 수정 및 삭제 가능하게 진행.

이전에 만든 QuestionForm을 이용해서 수정 폼으로도 재활용하는 방식 사용.

질문 수정 메서드

@PreAuthorize("isAuthenticated()")
@GetMapping("/modify/{id}")
public String questionModify(QuestionForm questionForm,@PathVariable("id") Integer id,Principal principal){
    Question question = questionService.getQuestion(id);

    if(!question.getAuthor().getUsername().equals(principal.getName())){
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST,"수정권한이 없습니다.");
    }
    questionForm.setSubject(question.getSubject());
    questionForm.setContent(question.getContent());
    return "question_form";
}

question_form 수정(추가되는 것만)

<form th:object="${questionForm}" method="post">
        <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
  • form 태그의 th:action 속성 삭제해주기
    • 이 속성을 삭제하면 자동으로 csrf 값을 생성하지 않기 때문에 위와같이 추가해주기
  • form 태그의 action 속성 없이 sumit을 하면 자동으로 현재 URL을 기준으로 전송되는 규칙이 있기 때문에 가능함.
    • 수정하는 경우 -> 현재 URL이 /question/modify/2 와같은 URL일 때 post로 action 없이 보내게되면 동일 한 URL로 post형식으로 보내지게 된다.
      • 그렇기 때문에 postmapping의 modifyQuestion이 추가로 필요하다.

질문 서비스 - 수정하기

    @Transactional
    public void modify(Question question,String subject,String content){
        question.update(subject,content);
    }
  • 수정이기 때문에 Transaction안에서 데이터를 관리하기 위해서 @Transacational 애너테이션을 추가
  • update를 하게 되면 자동적으로 JPA가 상태 변화를 체크하여 update 쿼리문을 날려준다.

질문 서비스 - 삭제하기

  • 삭제를 할때에는 삭제 버튼을 누른다음 바로 삭제가 되는게 아니라 '정말 삭제하시겠습니다?' 라는 문구가 나오는 경우가 많다.
  • 그부분을 넣어주기 위해서 자바스크립트를 조금 넣어서 삭제버튼을 누르면 저 문구가 뜨게 해주게 추가
const delete_elements = document.getElementsByClassName("delete");
Array.from(delete_elements).forEach(function(element) {
    element.addEventListener('click', function() {
        if(confirm("정말로 삭제하시겠습니까?")) {
            location.href = this.dataset.uri;
        };
    });
});
  • delete 라는 클래스를 포함하는 컴포넌트를 클릭하면 '정말로 삭제하겠습니까?' 라는 질문을 하게 되고 확인을 클리하면 해당 컴포넌트에 속성으로 지정된 data-uri값으로 URL을 호출하라는 의미.

질문 삭제 추가

@PreAuthorize("isAuthenticated()")
@GetMapping("/delete/{id}")
public String questionDelete(Principal principal, @PathVariable("id") Integer id) {
    Question question = questionService.getQuestion(id);

    if (!question.getAuthor().getUsername().equals(principal.getName())) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
    }

    questionService.delete(question);
    return "redirect:/";
}
  • id 값을 이용해서 질문을 조회해서 이 질문 작성자와 현재 사용자가 본인 인지 확인 후 본인이면 삭제가 가능하고 아닌 경우 불가능하게(아직 admin에 대해서 처리하지않음)

questionService에 delete 추가

@Transactional
public void delete(Question question) {
    questionRepository.delete(question);
}
  • JPA에 이미 있는 delete함수를 사용해서 객체를 삭제

답변 수정과 삭제의 경우에도 질문을 수정하거나 삭제하는 매커니즘은 같다.

profile
열심히하자
post-custom-banner

0개의 댓글