-
Notifications
You must be signed in to change notification settings - Fork 0
JPA Section7
SH-Seol edited this page May 28, 2024
·
1 revision
- thymeleaf๋ฅผ ์ฌ๋ ์๊ฒ ์ฐ๋ ค๋ฉด Hierarchical-style์ layouts์ ์ฌ์ฉํด๋ผ.
- Intellij๊ฐ resource๋ฅผ ์ธ์งํ์ง ๋ชปํ๋ฉด synchronizeํ๊ณ rebuildํ์
public class MemberForm {
@NotEmpty(message = "ํ์ ์ด๋ฆ์ ํ์ ์
๋๋ค.")
private String name;
private String city;
private String street;
private String zipcode;
}
@PostMapping("/members/new")
public String create(@Valid MemberForm form, BindingResult result){
if(result.hasErrors()){
return "members/createMemberForm";
}
Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());
Member member = new Member();
member.setName(form.getName());
member.setAddress(address);
memberService.join(member);
return "redirect:/";
}
- @Valid๋ฅผ ํตํด ์ @NotEmpty๋ฅผ ์ ์ฉํ๊ณ , BindingResult๋ ์๋ฌ๋ฅผ ๋ด์๋๊ณ ์คํํ๋ค.
- Member๊ฐ ์๋๋ผ MemberForm์ parameter๋ก ๋ฐ๋ ์ด์ โ ์ฌํํ๋ฉด ๋ฐ๋ก entity๋ฅผ ๋ฐ์ผ๋ฉด ๋์ง๋ง ์ค๋ฌด์์๋ ๋จ์ํ์ง ์์. Form์ผ๋ก ๋ฐ๊ณ controller๋ก ์ ์ฌํ๋ ๊ฒ์ด ์ข๊ณ , Member๋ก ๋ฐ์ผ๋ฉด Member์ ํ์ํ ์์ ์ ํด์ผํด์ ์ ์ ์ง์ ๋ถํด์ง.
Form์ด๋ Entity๋?
์๊ตฌ์ฌํญ์ด ์ ๋ง ๋จ์ํ ๊ฒฝ์ฐ์๋ Entity๋ฅผ ์จ๋ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์๊ตฌ์ฌํญ์ด ์ค๋ฌด์์๋ ์ผ๋์ผ ๋งค์นญ์ธ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์๋ค. ๊ทธ๋ฐ ์ํฉ์์ Entity๋ฅผ ์ฐ๋ฉด ๊ฒฐ๊ตญ ํ๋ฉด ๊ธฐ๋ฅ ๋๋ฌธ์ Entity๊ฐ ์ง์ ๋ถํด์ง๊ณ ์ด๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์์ ์๋ฏธํ๋ค.
- API๋ฅผ ๋ฐํํ ๋์๋ ์ ๋ Entity๋ฅผ ์ธ๋ถ๋ก ๋ฐํํ๋ฉด ์๋๋ค.
- Member Entity๋ฅผ ๋ฐํํ๊ฒ ๋๋ฉด, API์คํฉ์ด ๋ณํํ๊ฒ ๋๊ณ , ํด๋น ์์๊ฐ ์ธ๋ถ๋ก ๋ ธ์ถ์ด ๋๋ค.
@PostMapping("items/{itemId}/edit")
public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form){
Book book = new Book();
book.setId(form.getId());
book.setIsbn(form.getIsbn());
book.setName(form.getName());
book.setStockQuantity(form.getStockQuantity());
book.setPrice(form.getPrice());
book.setAuthor(form.getAuthor());
itemService.saveItem(book);
return "redirect:items";
}
-
PathVariable๋ก itemId๋ฅผ ๋๊ธฐ๊ธฐ์ ๋ณด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
- Session, permission ๋ฑ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
-
Book์ ์๋ก์ด ๊ฐ์ฒด์ด์ง๋ง, ์ด๋ฏธ DB์ ์ ์ฅ๋ ๊ฒ์ ๊ฐ์ ธ์์ ์๋ณ์๊ฐ ์กด์ฌํ๋ค.
-
์๋ณ์๊ฐ ์ด๋ฏธ ์กด์ฌํ ๊ฒ์ ๋ฐ๋ก ์ค์์ ์ํฐํฐ๋ผ๊ณ ํ๋ค. JPA๊ฐ ๊ด๋ฆฌ๋ฅผ ์ ํ๋ค. โ ์๋ฌด๋ฆฌ ๋ฐ๊พธ๋๋ผ๋ DB๋ ๋ฐ๋์ง ์๋๋ค.
- ๋ณ๊ฒฝ ๊ฐ์ง (Dirty checking)
- ๋ณํฉ (Merge)
@Transactional
public void updateItem(Long itemId, Book param){
Item findItem = itemRepository.findOne(itemId);
findItem.setPrice(param.getPrice());
}
- ์ํฐํฐ ์กฐํ ํ ๋ณ๊ฒฝํ ๊ฐ ์ ํ, ์ดํ ํธ๋์ญ์ ์ปค๋ฐ ์์ ์ ๋ณ๊ฒฝ ๊ฐ์ง(Dirty checking)ํ๊ณ DB๋ณ๊ฒฝ
@Transactional
void update(Item itemParam) { //itemParam: ํ๋ฆฌ๋ฏธํฐ๋ก ๋์ด์จ ์ค์์ ์ํ์ ์ํฐํฐ
Item mergeItem = em.merge(itemParam);
}
- ๋์ ๋ฐฉ์์ ์๋์ ์ฝ๋์ ๊ฐ๋ค.
@Transactional
public Item updateItem(Long itemId, Book param){
Item findItem = itemRepository.findOne(itemId);
findItem.setPrice(param.getPrice());
return findItem;
}
- ๊ทธ๋ฐ๋ฐ ๋ง์ฝ setPrice()๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด findItem.price๋ null์ด ๋๋ค.
- ๋ฐ๋ผ์ ์ต๋ํ merge๋ฅผ ์ฐ์ง ์๊ณ DirtyChecking์ ์ฐ์.
@Transactional
public void updateItem(Long itemId, String name, int price, int stockQuantity){
Item findItem = itemRepository.findOne(itemId);
findItem.setName(name);
findItem.setPrice(price);
findItem.setStockQuantity(stockQuantity);
}
- ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ๋ฐ๊พธ๊ณ dirty checkingํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ง์ฝ ๋ฐ๊ฟ ๊ฒ์ด ๋๋ฌด ๋ง๋ค๋ฉด dto๋ฅผ ๋ง๋ค์ด์ ํ๋ ๊ฒ์ด ์ข๋ค.
- setter์์ด entity์์์ ๋ฐ๋ก ์ถ์ ํ ์ ์๋ ๊ฒ์ด ์ข๋ค.
@Transactional
public void updateItem(Long itemId, String name, int price, int stockQuantity){
Item findItem = itemRepository.findOne(itemId);
findItem.updateDetails(name, price, stockQuantity);
}