1. 데이터 삭제 과정
클라이언트가 서버로 삭제 요청을 하면 서버는 DB에서 해당 데이터를 찾아 삭제하고, 클라이언트를 리다이렉트된 페이지로 보낸다.
2. RedirectAttribute
리다이렉트 페이지에서 사용할 일회성 데이터를 관리하는 객체이다. 이 객체의 addFlashAttribute() 라는 메서드로 리다이렉트된 페이지에서 사용할 일회성 데이터를 등록할 수 있다.
3. articleRopository.delete()
DB에 접근해 데이터를 삭제할 때 사용하는 메서드이다. articleRepository.delete(target) 이라고 작성하면 DB에서 target을 삭제한다.
4. DELETE 문
DB 테이블에 저장된 내용을 행 단위로 삭제할 때 사용하는 SQL 문으로, 형식은 다음과 같다.
형식
DELETE [FROM] 테이블명 WHERE 조건; --[]: 생략 가능
articleController
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.util.ArrayList;
@Slf4j // 로깅 기능을 위한 어노테이션 추가
@Controller
public class ArticleController {
@Autowired
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleController() {
return "/articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) {
// System.out.println(form.toString());
log.info(form.toString());
// 1. DTO를 엔티티로 변환
Article article = form.toEntity();
// System.out.println(article.toString());
log.info(article.toString());
// 2. 레파지토리로 엔티티를 DB에 저장
Article saved = articleRepository.save(article);
// System.out.println(saved.toString());
log.info(saved.toString());
return "redirect:/articles/" + saved.getId();
}
@GetMapping("/articles/{id}")
public String show(@PathVariable(name = "id") Long id, Model model) {
log.info("id : " + id);
// 1. id를 조회해 데이터 가져오기
Article articleEntity = articleRepository.findById(id).orElse(null);
// 2. 모델에 데이터 등록하기
model.addAttribute("article", articleEntity);
// 3. 뷰 페이지 반환하기
return "/articles/show";
}
@GetMapping("/articles")
public String index(Model model){
// 1. 모든 데이터 가져오기
ArrayList<Article> articleEntityList = articleRepository.findAll();
// 2. 모델에 데이터 등록하기
model.addAttribute("articleList", articleEntityList);
// 3. 뷰 페이지 설정
return "articles/index";
}
@GetMapping("/articles/{id}/edit")
public String edit(@PathVariable (name = "id") Long id, Model model){
// 1. 수정할 데이터 가져오기
Article articleEntity = articleRepository.findById(id).orElse(null);
// 2. 모델에 데이터 등록하기
model.addAttribute("article", articleEntity);
// 3. 뷰 페이지 설정
return "/articles/edit";
}
@PostMapping("/articles/update")
public String update(ArticleForm form){
log.info(form.toString());
// 1. DTO를 엔티티로 변환하기
Article articleEntity = form.toEntity();
log.info(articleEntity.toString());
// 2. 엔티티를 DB에 저장하기
// 2-1. DB에서 기존 기존 데이터 가져오기
Article target = articleRepository.findById(articleEntity.getId()).orElse(null);
// 2-2. 기존 데이터 값을 갱신하기
if(target != null){
articleRepository.save(articleEntity);
}
// 3. 수정 결과 페이지로 리다이렉트하기
return "redirect:/articles/" + articleEntity.getId();
}
@GetMapping("/articles/{id}/delete")
public String delete(@PathVariable (name = "id") Long id, RedirectAttributes rttr){
log.info("삭제 요청이 들어왔습니다.");
// 1. 삭제할 대상 가져오기
Article target = articleRepository.findById(id).orElse(null);
log.info(target.toString());
// 2. 대상 엔티티 삭제하기
if(target != null){
articleRepository.delete(target);
rttr.addFlashAttribute("msg", "삭제되었습니다.");
}
// 3. 결과 페이지로 라다이렉트하기
return "redirect:/articles";
}
}
header.mustache
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
</li>
</ul>
<form class="d-flex">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</div>
</div>
</nav>
{{#msg}}
<div class="alert alert-warning" role="alert">
{{msg}}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{{/msg}}
결과
728x90
'복습 및 이해 > 게시판CRUD 복습' 카테고리의 다른 글
CRUD와 SQL쿼리 종합 - (2) (2) | 2025.01.19 |
---|---|
CRUD와 SQL쿼리 종합 - (1) (0) | 2025.01.19 |
게시글 수정하기 : Update (1) | 2025.01.18 |
게시판 내 페이지 이동하기 (2) | 2025.01.17 |
게시글 읽기 : Read (0) | 2025.01.17 |