반응형
- 데이터 삭제 (DELETE)
삭제버튼을 show.mustache (상세게시글)에 추가해준다.
수정때와 마찬가지로 id를 url 파라메터로 전송해준다.
{{>layouts/header}}
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">title</th>
<th scope="col">content</th>
</tr>
</thead>
<tbody>
{{#article}}
<!-- 이 간격안에서 article모델 가져올 수 있다.-->
<tr>
<td>{{id}}</td>
<td>{{title}}</td>
<td>{{content}}</td>
</tr>
{{/article}}
</tbody>
</table>
<a href="/articles/{{article.id}}/edit" class="btn btn-primary">Edit</a>
<!--POST, GET ,UPDATE, DELETE 가 원래 있지만 여기선 GET, a태그 링크를 사용해서 요청해보자-->
<a href="/articles/{{article.id}}/delete" class="btn btn-danger">Delete</a>
<a href="/articles">Go To Article List</a>
{{>layouts/footer}}
그리고 컨트롤러에서 삭제 요청을 받는다.
1) 주소를 매핑하고
2)삭제 대상을 아이디 값으로 가져온다.
3)삭제한뒤 최종 게시글목록 페이지로 리다이렉트 시킨다.
// @DeleteMapping("articles/{id}/delete")
@GetMapping("articles/{id}/delete")
public String delete(@PathVariable Long id, RedirectAttributes rttr){
log.info("Delete Request!!");
// 1:삭제 대상을 가져온다!
Article target = articleRepository.findById(id).orElse(null);
log.info(target.toString());
// 2:대상을 삭제한다!
if (target != null){
articleRepository.delete(target);
rttr.addAttribute("msg","Delete Finish!");
// 뜨고 사라지는 휘발성 메세지
}
// 3: 결과 페이지로 리다이렉트 한다!
return "redirect:/articles";
}
결과적으로 짧게 CRUD를 완성 시켜봤지만 일부 코드들이 비슷하게 반복됨을 볼 수 있었다.
제작 과정에 있어서는 Django를 쓸때와 큰 차이를 느끼지는 못했고 그래도 SpringBoot로 한번 구현해 봤다는데 의미가
있는것 같다.
Spring Boot를 좀더 공부해보고 어노테이션활용과 JPA에 대해서 좀더 이해해야 쉽게 쓸 수 있다는 생각이 든다.
마지막으로 CRUD 전체코드 소스로 로직을 다시한번 참고해보자.
-Create
1.DTO를 Entity로 변화한다.
2.Repository에게 Entity를 DB에 저장하게한다.
-Read
1.id로 데이터를 가져온다 이때 Repository가 주체다
2.가져온 데이터를 모델에 등록한다.
3.보여줄 페이지를 설정한다.
-Update
1.DTO를 Entity로변환한다.
2.Entity를 DB로저장한다. (DB에서 기존데이터 가져오고 -> 기존 데이터의 값을 갱신한다)
3.수정결과를 리다이렉트한다.
-Delete
1.삭제 대상을 id값으로 가져온다.
2.대상을 삭제한다.
3.결과 페이지로 리 다이렉트한다.
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.DeleteMapping;
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.List;
import java.util.Optional;
@Controller
@Slf4j //로깅을 위한 어노테이션
public class ArticleController {
@Autowired // 스프링 부트가 미리 생성해놓은 객체를 가져다가 자동 연결!
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleForm(){
return "articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form){
// dto에 있는거냐 물음표 나오면 알트 엔터 무슨 문제였을까?
// System.out.println(form.toString()); -> 로깅기능으로 대체하기
log.info(form.toString());
// 1.Dto를 변환 Entity로!
Article article = form.toEntity();
// System.out.println(article.toString());
log.info(article.toString());
// 2. Repository에게 Entity를 DB에 저장하게 한다.
Article saved = articleRepository.save(article);
// System.out.println(saved.toString());
log.info(saved.toString());
//Crud 리포지토리 기능 가져와서 사용할 수 있다.
// return "redirect:/articles";
return "redirect:/articles/" + saved.getId();
// 이곳에 리다레익트 적용시켜주기
}
@GetMapping("/articles/{id}") //변하는 수에 따라 게시글 받아오기
public String show(@PathVariable Long id, Model model){
log.info("id = " + id);
// 1: id로 데이터를 가져옴 Repository가주체이다.
Article articleEntity = articleRepository.findById(id).orElse(null);
// orElse부분 : 해당 아이디 값이 없으면 null을 반환해라
// 2: 가져온 데이터를 모델에 등록!
model.addAttribute("article",articleEntity);
// 3: 보여줄 페이지를 설정!
return "articles/show";
}
@GetMapping("/articles")
public String index(Model model){
// 1:모든 Article 가져온다
List<Article> articleEntityList = articleRepository.findAll();
// 2:가져온 Article 묶음을 뷰로 전달한다.
model.addAttribute("articleList",articleEntityList);
// 3: 뷰 페이지를 설정!
return "articles/index"; // articles/index.mustache
}
@GetMapping("/articles/{id}/edit")
///articles/{article.id}/edit 이건 오류!
public String edit(@PathVariable Long id,Model model){
// 수정할 데이터를 가져오기!
Article articleEntity = articleRepository.findById(id).orElse(null);
// id는 url파라미터로 가져오고싶다. 패쓰 배리어블
//모델에 데이터 등록
model.addAttribute("article",articleEntity);
// 뷰 페이지 설정!
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); // 엔티티가 db로 갱신!
}
// 3: 수정 결과 페이지로 리다이렉트한다.
return "redirect:/articles/" + articleEntity.getId();
}
// @DeleteMapping("articles/{id}/delete")
@GetMapping("articles/{id}/delete")
public String delete(@PathVariable Long id, RedirectAttributes rttr){
log.info("Delete Request!!");
// 1:삭제 대상을 가져온다!
Article target = articleRepository.findById(id).orElse(null);
log.info(target.toString());
// 2:대상을 삭제한다!
if (target != null){
articleRepository.delete(target);
rttr.addAttribute("msg","Delete Finish!");
// 뜨고 사라지는 휘발성 메세지
}
// 3: 결과 페이지로 리다이렉트 한다!
return "redirect:/articles";
}
}
반응형
'JAVA, Spring' 카테고리의 다른 글
Multiple annotations found at this line 에러 (이클립스) (0) | 2023.05.24 |
---|---|
elipse에서 tomcat 서버실행 오류 날 때 (0) | 2023.05.24 |
Spring Boot 수정 폼 만들기 (Update), 데이터 수정하기 (0) | 2023.04.05 |
Spring Boot 링크, 리다이렉트 (0) | 2023.04.04 |
Spring Boot 데이터 조회하기 (웹에서) (0) | 2023.04.04 |