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