Contents
CRUD JPA를 사용하여 리팩토링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