9.1 requestDTO

SaveDTOUpdateDTO는 현재 동일한 필드를 가지고 있으므로 하나의 DTO로 재사용할 수도 있습니다.

다만, 저장과 수정은 의미와 책임이 서로 다른 요청이기 때문에, 추후 필수 값 검증 규칙이 달라지거나(예: 저장 시 필수, 수정 시 선택), 수정 전용 필드가 추가되는 상황을 고려하면 DTO를 분리해 두는 것이 설계상 더 유연합니다. 따라서 현재는 구조가 동일하더라도, 역할을 명확히 하기 위해 SaveDTOUpdateDTO를 각각 정의하는 방식을 권장합니다.

BoardRequest.java

package com.metacoding.springv1.board;

import lombok.Data;

public class BoardRequest {
    @Data
    public static class SaveDTO {
        private String title;
        private String content;
    }

    // 추가하기
    @Data
    public static class UpdateDTO {
        private String title;
        private String content;
    }
}

9.2 Service

BoardService 에 게시글수정() 메서드를 구현합니다. 이 메서드는 URL에 포함된 게시글의 ID, 사용자의 입력값을 DTO를 통해 전달받습니다.

BoardService.java

@Transactional
public void 게시글수정(Integer id, BoardRequest.UpdateDTO requestDTO){
    Board board = boardRepository.findById(id);
    // 더티 체킹
    board.setTitle(requestDTO.getTitle());
    board.setContent(requestDTO.getContent());
} // 트랜잭션 종료시 flush()

게시글 ID로 엔티티를 조회하여 영속성 컨텍스트에 등록한 뒤, 더티 체킹을 통해 변경된 내용을 업데이트합니다.

9.3 Controller

BoardController 를 다음과 같이 구현합니다.

게시글 수정 후에는 로직 처리가 완료된 뒤, 수정된 게시글의 상세보기 페이지로 리다이렉트하는 것이 바람직합니다.

BoardController.java

@PostMapping("/boards/{id}/update")
public String updateById(@PathVariable("id") Integer id, BoardRequest.UpdateDTO requestDTO){
    boardService.게시글수정(id, requestDTO);
    return "redirect:/boards/" + id;
}

프로젝트 실행 후 2번 게시글을 수정합니다.

1.png

1.png