[스프링부트] 익명블로그 만들어보기 V2

송송승현's avatar
Nov 27, 2024
[스프링부트] 익명블로그 만들어보기 V2

CRUD JPA를 사용하여 리팩토링

Controller

import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; @Controller @RequiredArgsConstructor public class BoardController { private final BoardService boardService; @GetMapping("/") public String list(Model model) { List<BoardResponse.DTO> boardList = boardService.게시글목록보기(); model.addAttribute("models", boardList); return "list"; } @GetMapping("/save-form") public String saveForm() { return "save-form"; } @GetMapping("/board/{id}/update") public String updateForm(@PathVariable int id, Model model) { model.addAttribute("model",boardService.게시글수정화면보기(id)); return "update-form"; } @GetMapping("/board/{id}") public String detail(@PathVariable("id") int id, Model model) { model.addAttribute("model",boardService.게시글상세보기(id)); return "detail"; } @PostMapping("/board/save") public String saveV2(BoardRequest.SaveDTO saveDTO) { boardService.게시글쓰기(saveDTO); return "redirect:/"; } @PostMapping("/board/{id}/delete") public String delete(@PathVariable("id") int id) { boardService.게시글삭제(id); return "redirect:/"; } @PostMapping("/board/{id}/update") public String update(@PathVariable("id") int id, BoardRequest.updateDTO updateDTO) { boardService.게시글수정(id,updateDTO); return "redirect:/"; } }

Service

  • Stream을 이용한 게시글 목록보기 리팩토링
import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Optional; // Service의 책임 : 비지니스 로직 처리(트렌젝션 관리), DTO @Service @RequiredArgsConstructor public class BoardService { private final BoartRepository boardRepository; public List<BoardResponse.DTO> 게시글목록보기(){ return boardRepository.findAll().stream() .map(BoardResponse.DTO::new) .toList(); }; public BoardResponse.updateFormDTO 게시글수정화면보기(int id) { return new BoardResponse.updateFormDTO(boardRepository.findById(id).orElseThrow(() ->new RuntimeException("해당 ID의 게시글이 없습니다." + id))); } public BoardResponse.DetailDTO 게시글상세보기(int id) { return new BoardResponse.DetailDTO(boardRepository.findById(id).orElseThrow(() ->new RuntimeException("해당 ID의 게시글이 없습니다." + id))); } @Transactional public void 게시글쓰기(BoardRequest.SaveDTO saveDTO) { boardRepository.save(saveDTO.toEntity()); } @Transactional public void 게시글삭제(int id) { boardRepository.delete(id); } @Transactional public void 게시글수정(int id, BoardRequest.updateDTO updateDTO) { Board board =boardRepository.findById(id).orElseThrow(() ->new RuntimeException("해당 ID의 게시글이 없습니다." + id)); board.update(updateDTO.getTitle(), updateDTO.getContent()); } // 영속화된 객체 상태 변화 - update+commit => 더티체킹 }

Repository

  • JPQL을 활용한 Repository 리팩토링
import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; @Repository @RequiredArgsConstructor public class BoartRepository { private final EntityManager em; public List<Board> findAll() { return em.createQuery("select b from Board b order by b.id desc",Board.class).getResultList(); } public Optional<Board> findById(int id) { return Optional.ofNullable(em.find(Board.class, id)); } public void save(Board board) { // 비영속 em.persist(board); // 객체를 던지면 insert함 // 동기화(영속화) } public void delete(int id){ em.createQuery("delete from Board b where b.id=:id").setParameter("id", id).executeUpdate(); } }
 
Share article

송승현의 블로그