스프링으로 게시판 만들기 - Controller

Estar·2024년 8월 11일

Spring

목록 보기
2/3

컨트롤러가 뭔데?

HTML이든 REST API를 통해 게시판을 만들든
GET, POST, UPDATE, DELETE를 할 수 있어야 한다.
이런 것들을 위해 필요한 것

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.List;

@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) {
        // System.out.println(form.toString()); -> 로깅으로 대체
        log.info(form.toString());

        // 1. Dto를 변환 entity로
        Article article = form.toEntity();
        log.info(article.toString());

        // 2. Repository 에게 Entity 를 db안에 저장하게 함.
        Article saved = articleRepository.save(article);
        log.info(saved.toString());

        return "redirect:/articles/" + saved.getID();
    }

    @GetMapping("/articles/{id}")
    public String show(@PathVariable Long id, Model model) {
        log.info("id =" + id);

        // 1. id로 DB에서 데이터를 가져옴!
        Article articleEntity = articleRepository.findById(id).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();
        // List는 리스트 형태로 받으려고 하는 것. findAll()은 레포지토리에 있는 거 모든 걸 가져오는 것
        // 2. 가져온 Article 묶음을 뷰로 전달한다.
        model.addAttribute("articleList", articleEntityList);
        // 3. 뷰 페이지를 설정한다.
        return "articles/index"; // articles/index.mustache
    }

    @GetMapping("/articles/{id}/edit")
    public String edit(@PathVariable Long id, Model model) {
        // 수정할 데이터를 가져오기
        Article articleEntity = articleRepository.findById(id).orElse(null);

        // 모델에 데이터를 등록!
        model.addAttribute("article", articleEntity);

        // 뷰 페이지 설정
        return "articles/edit";
    }

    @PostMapping("/articles/update")
    public String update(ArticleForm form) {
        //1. DTO를 엔티티로 변환
        Article articleEntity = form.toEntity();

        //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();
    }

    @GetMapping("/articles/{id}/delete")
    public String delete(@PathVariable Long id, RedirectAttributes rttr) {
        log.info("삭제요청이 들어왔습니다!");
        //1. 삭제 대상을 가져온다.
        Article target = articleRepository.findById(id).orElse(null);
        log.info(target.toString());

        if (target != null) {
            articleRepository.delete(target);
            rttr.addFlashAttribute("msg", "회원삭제가 완료되었습니다");
        }
        //2. 대상을 삭제한다.

        //3. 결과 페이지를 보여준다.
        return "redirect:/articles";

    }
}

일단은 이렇게 적어두고 이걸 나중에 하나씩 리뷰하면서 공부해야겠다.

profile
개발자를 꿈꿔요

0개의 댓글