[Spring Boot/JPA] 게시판을 통해 MVC, CRUD 연습하기 5 - 삭제
본문 바로가기

Web 개발/게시판 만들기

[Spring Boot/JPA] 게시판을 통해 MVC, CRUD 연습하기 5 - 삭제

728x90
반응형

Spring Boot + H2 Database + JPA + Thymeleaf 을 활용해
간단한 게시판을 작성해보고자 합니다.

오늘 다룰 내용은 게시판 글 수정 기능입니다.

* 개발환경

Spring Boot : 2.4.3
Java 11
Thymeleaf 
Maven
War
Lombok

 

1. 상세보기 화면에 삭제 버튼 추가

게시글 내용 아래에 삭제버튼 추가

이때, 삭제 버튼은 화면으로 이동하는 것이 아니기 때문에

form으로 감싸서 POST 방식으로 전달한다.

id값은 사용자가 보이지 않게, hidden 으로 함께 전달한다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2 th:text="${boardDto.title}"></h2>
<p th:text="${boardDto.content}"></p>

<!-- 수정 or 삭제 -->
<div>
    <a th:href="@{'/board/edit/' + ${boardDto.id}}">
        <button>수정</button>
    </a>
    <form th:action="@{'/board/delete/'}" method="post">
        <input type="hidden" name="id" th:value="${boardDto.id}"/>
        <button>삭제</button>
    </form>
</div>

<script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
</script>

</body>
</html>

 

2. 삭제 기능 추가

Controller를 통해 받아서 서비스에 넘긴다.

삭제 후에는 목록화면으로 이동한다.

@PostMapping("/board/delete")
    public String delete(Long id){
        boardService.deletePost(id);
        return "redirect:/board";
    }

 

이때, 삭제기능은 두가지로 나뉠수 있는데

첫번째는 db상에서 해당 데이터를 없애는 것이고

두번째는 db상에는 남아있지만 사용자에게 보이지 않게 하는 방법이다.

 

2-1. 우선 첫번째 방식의 코드는 다음과 같다.

@Transactional
    public void deletePost(Long id){
        Optional<Board> optBoard = boardRepository.findById(id);
        if(optBoard.isPresent()){
            Board board = optBoard.get();
            boardRepository.deleteById(id);
        }
    }

 

2-2. 두번째 방식은 엔티티에 사용유무를 추가하고, 사용유무를 False로 하는 것이다.

package com.example.board.domain.entity;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Getter
@NoArgsConstructor
@Entity
public class Board {

    @Id
    @GeneratedValue
    private Long id;

    @Column(length = 100, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    @ColumnDefault("1")
    private Boolean isUse;

    @Builder
    public Board(Long id, String title, String content){
        this.id = id;
        this.title = title;
        this.content = content;
    }

    public void setUse(Boolean use) {
        isUse = use;
    }
}
@Transactional
    public void deletePost(Long id){
        Optional<Board> optBoard = boardRepository.findById(id);
        if(optBoard.isPresent()){
            Board board = optBoard.get();
            board.setUse(false);
        }
    }

 

따라서 목록화면에서도 IsUse가 TRUE인 게시글만 보여준다.

@Transactional
    public List<Board> getBoardList(){
        List<Board> boards = boardRepository.findAllByIsUseTrue();
        return boards;
    }
728x90
반응형