인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
코드 추가
@Controller
@RequiredArgsConstructor
public class ItemController {
/**
* 상품 수정 폼
*/
@GetMapping(value = "/items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
//item은 Book 만 가져온다고 가정
Book item = (Book) itemService.findOne(itemId);
//form을 update 할 때 Book 엔티티가 아니라 BookForm을 보낼 것
BookForm form = new BookForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
form.setAuthor(item.getAuthor());
form.setIsbn(item.getIsbn());
model.addAttribute("form", form);
return "items/updateItemForm";
}
/**
* 상품 수정
*/
@PostMapping(value = "/items/{itemId}/edit")
public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) {
Book book = new Book();
book.setId(form.getId());
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
itemService.saveItem(book);
return "redirect:/items";
}
}
📍 설명
@PathVariable
: URL 변수
Controller는 URL에서 { } 에 parameter를 넣는 URI 템플릿을 사용할 수 있고
Controller method parameter에는 해당 어노테이션(@PathVariable
)을 이용해
URL에 {}로 들어가는 변수(path Variable)를 파라미터로 지정할 수 있다
http: //localhost:8080/items/1/edit
위의 URL에서 볼드체 부분을 처리해준다
@GetMapping(value = "/items/{itemId}/edit")
에서 사용한
{itemId} 의 변수명을 @PathVariable("itemId") 의 변수명으로 사용한다
@GetMapping(value = "/items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {}
@ModelAttribute("form")
은 뷰(items/updateItemForm
)에서th:object="${form}"
의 form 이 넘어 온다itemService.saveItem(book);
return "redirect:/items"; 호출
public class ItemService {
@Transactional
public void saveItem(Item item){
itemRepository.save(item);
}
}
public class ItemRepository {
public void save(Item item){
//em.persist - 신규 등록
if (item.getId() == null){
em.persist(item);
} else{
// update
em.merge(item);
}
}
}
변경 감지와 병합(merge) 에 대한 부분은 다음 게시물에 포스팅 하겠다.
코드는 일부만 나타내도록 하겠다
<body>
<div class="container">
<div th:replace="fragments/bodyHeader :: bodyHeader"/>
<form th:object="${form}" method="post">
<!-- id -->
<input type="hidden" th:field="*{id}" />
<div class="form-group">
<label th:for="name">상품명</label>
<input type="text" th:field="*{name}" class="form-control"
placeholder="이름을 입력하세요" />
</div>
📍 설명
상품 수정 폼 이동
/items/{itemId}/edit
URL을 GET 방식으로 요청updateItemForm()
메서드 실행,itemService.findOne(itemId)
를 호출하여 수정할 상품 조회items/updateItemForm
)에 전달상품 수정 실행
상품 수정 폼(HTML) - 상품의 id(hidden), 상품명, 가격, 수량, 저자, ISBN
/items/{itemId}/edit
URL을 POST 방식으로 요청updateItem()
메서드 실행,: action 속성은 데이터를 서버로 보낼 때 데이터를 받을 URL을 지정한다
상품 등록 | 상품 목록 - 상품 등록 확인 |
---|---|
상품 수정 | 상품 목록 - 상품 수정 확인 |
---|---|