15강 DTO ArticleForm 수정 후 새 데이터 입력 질문
ArticleController.javapackage 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 java.util.List; import java.util.Optional; @Controller @Slf4j //Logging을 위한 어노테이션 public class ArticleController { @Autowired // 스프링부트가 미리 생성해놓은 객체를 가져다가 자동 연결! private ArticleRepository articleRepository; @GetMapping("/articles/new") public String newArticleForm(){ return "articles/new"; } @PostMapping("/articles/create") public String createArticle(ArticleForm form){ log.info(form.toString()); // System.out.println(form.toString()); -> Logging 기능으로 대체 // 1. Dto(form)를 변환해서 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(); return ""; } @GetMapping("/articles/{id}") public String show(@PathVariable Long id, Model model){ log.info("id" + id); // 1. id로 데이터를 가져옴! Article articleEntity = articleRepository.findById(id).orElse(null); // 2. 가져온 데이터를 model에 등록! model.addAttribute("article", articleEntity); // 3. 보여줄 페이지를 설정! return "articles/show"; } @GetMapping("/articles") public String index(Model model){ // 1. 모든 article을 가져온다 // casting error 해결방법 1 - List articleEntityList = (List)articleRepository.findAll(); // casting error 해결방법 2 - Iterable articleEntityList = articleRepository.findAll(); Iterable articleEntityList = articleRepository.findAll(); // 2. 가져온 article 묶음을 뷰로 전달 - Model 사용해야죠 model.addAttribute("articleList", articleEntityList); // 3. 뷰 페이지를 설정 return "articles/index"; //articles/index.mustache } // go to editing page @GetMapping("/articles/{id}/edit") public String edit(@PathVariable Long id, Model model){ // 수정할 data 가져오기 Article articleEntity = articleRepository.findById(id).orElse(null); // model에 data 등록 model.addAttribute("article", articleEntity); // view page 설정 return "articles/edit"; } // fetching edited data - PatchMapping 은 Form태그에서 제공 안함 @PostMapping("/articles/update") public String update(ArticleForm form){ log.info(form.toString()); // 1. DTO를 entity로 변환 Article articleEntity = form.toEntity(); log.info(articleEntity.toString()); // 2. entity를 db로 저장 // 2-1. db에서 기존 data를 가져옴 Article target = articleRepository.findById(articleEntity.getId()).orElse(null); // 2-2. 기존 data가 있다면 값을 수정 갱신함 if(target !=null){ articleRepository.save(articleEntity); // entity가 db로 갱신 } // 3. 수정 결과 페이지로 redirect return "redirect:/articles/" +articleEntity.getId(); } }