쌓고 쌓다
[스프링 부트] 게시글 수정 - 7 본문
PosterRepository (interface)
public interface PosterRepository {
...
void edit(Long id, Poster newPoster);
}
리포지토리 인터페이스에 수정을 위한 edit 추상 메소드를 작성.
수정할 게시글의 id와 수정할 내용이 담긴 newPoster를 받는다.
JpaPosterRepository (구현체)
@Repository
public class JpaPosterRepository implements PosterRepository{
...
@Override
public void edit(Long id, Poster newPoster) {
Poster oldPoster = em.find(Poster.class, id);
oldPoster.setTitle(newPoster.getTitle());
oldPoster.setWriter(newPoster.getWriter());
oldPoster.setContent(newPoster.getContent());
oldPoster.setRegdate(LocalDateTime.now());
}
}
수정할 게시글의 id를 받아 해당 게시글을 찾아 oldPoster에 담는다.
oldPoster의 게시글의 내용을 newPoster의 내용으로 변경한다.
JPA에서 UPDATE 쿼리를 자동으로 날려준다.
PosterService
@Service
@Transactional
public class PosterService {
...
public void editPoster(Long id, Poster newPoster) {
posterRepository.edit(id, newPoster);
}
}
Service에 게시글 수정을 위한 editPoster를 작성한다.
posterRepository의 게시글 수정 메소드를 호출한다.
PosterController
게시글 수정을 위한 URL은 "/poster/edit"를 통해 이뤄진다.
1. GET
@Controller
public class PosterController {
@GetMapping("/poster/edit")
public String editForm(Model model, @RequestParam(value="id") Long id) {
Poster poster = posterService.findByOne(id).get();
model.addAttribute(poster);
return "posters/editPosterForm";
}
}
게시글 수정을 위한 GET 요청은 "/poster/edit?id=1" 형태로 한다.
id를 통해 요청이오면 해당 게시글의 정보를 담은 "editPosterForm.html"을 보인다.
2. POST
@Controller
public class PosterController {
@PostMapping("/poster/edit")
public String edit(@RequestParam(value="id") Long id, @Valid Poster poster, Errors errors) {
if(errors.hasErrors()) {
return "posters/editPosterForm";
}
posterService.editPoster(id, poster);
return "redirect:/posters";
}
}
Post 요청으로 수정을 원하는 게시글의 id와 수정 내용이 담긴 게시글이 넘어온다.
넘어온 정보로 posterService의 수정 메소드를 호출.
posterView.html
<button type="button" th:onclick="|location.href='@{/poster/edit(id=${poster.id})}'|">수정</button>
게시글 상세조회 html에 수정 버튼을 추가해주자.
이때 게시글의 id를 담아 버튼을 생성한다.
이 id를 이용해 GET 요청을 보내 수정할 게시글의 현재 내용을 보여주게 할 것이다.
editPosterForm.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form th:action="@{/poster/edit(id=${poster.id})}" method="post" th:object="${poster}">
<!-- createPosterForm.html과 동일 부분 -->
<button type="submit">수정</button>
</form>
</body>
</html>
타임리프에서 링크식의 형태는 "@{}"와 같다.
여기에 파라미터 전달을 위해 "@{/poster/edit(id=${poster.id})}" 형태로 사용한다.
여러 개의 파라미터는 @{/poster/edit(id=${poster.id}, title=${poster.title})} 형태로 "," 쉼표를 사용함.
그러면 아래의 Post 메소드에 URL을 통해 id를 받고 객체 poster도 받아 수정 로직을 수행한다.
@PostMapping("/poster/edit")
public String edit(@RequestParam(value="id") Long id, @Valid Poster poster, Errors errors) {
...
}
동작 결과
'프로그래밍 > spring' 카테고리의 다른 글
관심사의 분리 with DI? (0) | 2023.07.06 |
---|---|
[스프링 부트] 게시글 목록 페이징 - 8 (0) | 2023.07.03 |
[스프링 부트] 게시글 작성 유효성 검사 및 폼 데이터 유지 - 6 (0) | 2023.06.30 |
[스프링 부트] 게시글 삭제 - 5 (0) | 2023.06.28 |
[스프링 부트] 게시글 상세보기 with @RequestParam - 4 (0) | 2023.06.27 |