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

KangHo Lee's avatar
Nov 18, 2024
[스프링 부트] 15. 글 수정(Update) 구현 - 웹 게시판 v1.0 final

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

devleekangho