쌓고 쌓다

[스프링 부트] 게시글 수정 - 7 본문

프로그래밍/spring

[스프링 부트] 게시글 수정 - 7

승민아 2023. 7. 1. 11:58

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) {
       ...
    }

 

동작 결과

 

 

Comments