Spring | SpringBoot

[Spring Boot] 수정기능

dbfl9911 2024. 8. 16. 17:54

 


 

 

1. 글마다 수정버튼이 있는데 누르면 글수정 페이지로 이동

2. 그 페이지엔 폼이 있고 글의 내용이 이미 채워져있음

3. 전송누르면 그걸로 DB의 기존 글 수정

 

 

 

1. 버튼누르면 수정페이지로 이동

(list.html)

<div class="card" th:each="i : ${items}">
    <img src="https://placehold.co/300">
    (생략)
    <a th:href="/???">✏️</a>
</div>

 

 

 

@GetMapping("/edit")
String edit() {
  return "edit.html";
}

수정페이지 보내줄 API 

 

 

 

(edit.html)

<form action="/???" method="POST">
  <input name="title">
  <input name="content">
  <button type="submit">전송</button>
</form>

수정페이지 html 파일

 

 

 

edit/1로 접속하면 1번글 내용이 채워진 수정페이지 

/edit/2로 접속하면 2번글 내용이 채워진 수정페이지

... 이런식으로 만들고 싶으면

==> URL 파라미터 문법 사용

 

 

 

@GetMapping("/edit/{id}")
String edit() {
  return "edit.html";
}

 

 

 

2. 그 페이지엔 폼이 있고 글 내용이 이미 채워져있음

/edit/1로 접속하면 1번 글의 내용이 채워져있어야한다

 DB에서 1번 글 가져와서 여기다가 넣어주면 된다

 // 상품 수정 기능 - 수정 페이지로 이동
    @GetMapping("/edit/{id}")
    String edit(@PathVariable Long id, Model model) {
// /edit/1로 접속하면 1번 글의 내용이 채워져있어야 하므로 db에서 1번글 가져와서 여기에 넣기
        Optional<Item> result = itemRepository.findById(id);
        if(result.isPresent()) {
            model.addAttribute("data", result.get());
            return "edit.html";
        }else{
            return "redirect:/list";
        }
    }

 

 

 

 

가져와서 아래 html에 넣기

(edit.html)

<form>
  <input name="title" th:value = "${data.title}">
  <input name="price" th:value = "${data.price}">
  <button type="submit">전송</button>
</form>

 

 

 

3. 전송누르면 그걸로 DB의 기존 글 수정

(edit.html)

<!--수정요청은 PUT이 깔끔하지만 form은 GET, POST만 가능-->
<form action="/edit" method="POST">
  <input name="id" th:value = "${data.id}">
  <input name="title" th:value = "${data.title}">
  <input name="price" th:value = "${data.price}">
  <button type="submit">전송</button>
</form>

전송누르면 /edit으로 POST 요청 날림

 

 

 

- JPA 사용해서 수정

    // 상품 수정 기능 - 수정 페이지에서 수정 완료 후 원래 페이지에 반영
    @PostMapping("/edit")
    String editItem(Long id, String title, Integer price) {
        // * JPA 사용해서 수정하려면
        // 1. object 뽑고
        // 2. object에 변수값 집어넣고
        // 3. 그 다음에 save 안에 object 넣으면 됌
        // (=> 원래 행 추가하는 문법이지만 id값이 같은 행이 이미 있으면 그 행 덮어쓰기 해줌)
        Item item = new Item();
        item.setId(id);
        item.setTitle(title);
        item.setPrice(price);
        itemRepository.save(item);

        return "redirect:/list";
    }

 

save는 행 하나 추가하는 문법이지만 id값이 같은 행이 이미 있으면 그 행을 덮어쓰기해준다

 


 

* 이글은 아래 강의를 참고해 작성했습니다. 

https://codingapple.com/course/spring-boot-jpa/

 

쉽게 배우는 Spring Boot & JPA - 코딩애플 온라인 강좌

  Next.js는 프론트엔드부터 서버까지 만들 수 있는 React기반 프레임워크입니다. 이것만 사용해도 풀스택 웹개발이 가능합니다.    Next.js 사용시 서버사이드 렌더링이 쉽기 때문에  React, Vue만 사

codingapple.com