날아라김지원
article thumbnail

- 데이터 삭제 (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";
    }

}
profile

날아라김지원

@flykimjiwon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!