inblog logo
|
devleekangho
    스프링부트

    [스프링 부트] 15. 글 수정(Update) 구현 - 웹 게시판 v1.0 final

    KangHo Lee's avatar
    KangHo Lee
    Nov 18, 2024
    [스프링 부트] 15. 글 수정(Update) 구현 - 웹 게시판 v1.0 final
    Contents
    1. 수정 버튼 생성2. DTO (Data Transfer Object)3. Repository4. Repository Test5. Controller6. Service

    1. 수정 버튼 생성

    <form action="/board/{{model.id}}/update-form" method="get"> <button type="submit">수정</button> </form>

    2. DTO (Data Transfer Object)

    @Data // Response DTO public static class UpdateFormDTO { private int id; private String title; private String content; private String createdAt; public UpdateFormDTO(Board board) { this.id = board.getId(); this.title = board.getTitle(); this.content = board.getContent(); this.createdAt = DateToForm.dateToFrom(board); } } @Data // Request DTO public static class UpdateDTO { private String title; private String content; }
    💡
    UpdateFormDTO 는 이전에 만든 DetailDTO 와 내용이 같지만 재활용하지 않고 새로 만드는 게 개발, 유지 보수에 좋습니다.

    3. Repository

    public void update(int id, String title, String content) { Query q = em.createNativeQuery("update board_tb set title=?, content=? where id=?"); q.setParameter(1, title); q.setParameter(2, content); q.setParameter(3, id); q.executeUpdate(); }
    💡
    executeUpdate() 메서드는 insert, update, delete 쿼리문을 실행시킬 때 작성해야합니다.

    4. Repository Test

    @Test public void update_test() { // given int id = 1; String title = "testTitle"; String content = "testContent"; // when boardRepository.update(id, title, content); // eye Board board = boardRepository.findById(id); System.out.println(board.getId()); System.out.println(board.getTitle()); System.out.println(board.getContent()); System.out.println(board.getCreatedAt()); }

    5. Controller

    @GetMapping("/board/{id}/update-form") public String updateForm(@PathVariable("id") int id, Model model) { BoardResponse.UpdateFormDTO updateFormDTO = boardService.게시글수정화면보기(id); model.addAttribute("model", updateFormDTO); return "update-form"; } @PostMapping("/board/{id}/update-form") public String updateBoard(@PathVariable("id") int id, BoardRequest.UpdateDTO updateDTO) { boardService.게시글업데이트(id, updateDTO); return "redirect:/board/" + id; // 상세 글 보기로 이동 }

    6. Service

    @Transactional public void 게시글업데이트(int id, BoardRequest.UpdateDTO updateDTO) { boardRepository.update(id, updateDTO.getTitle(), updateDTO.getContent()); }
    💡
    • @Transactional 은 select제외 delete, insert, update에 필요합니다.
    • 제대로 실행되면 commit, 예외 발생 시 rollback
    • boardRepository.update(id, updateDTO) 로 만들지 않는 이유
      • update 메서드를 다른 곳에서 쓸 수 있기 때문입니다.
      • updateDTO에 종속되는 메서드가 되지 않도록 해야 합니다.
    • Service에서는 updateDTO 써도 되는데 Service 메서드와 Controller 메서드는 1:1로 매칭되기 때문에 괜찮습니다.
     
    Share article
    Contents
    1. 수정 버튼 생성2. DTO (Data Transfer Object)3. Repository4. Repository Test5. Controller6. Service

    devleekangho

    RSS·Powered by Inblog