변경감지

타마타마·2022년 7월 31일
0

JPA

목록 보기
6/10

JPA에서 수정하는 방법은 두가지로 나뉜다.
1. 변경감지
2. merge
merge방법은 사용하지 않는 것이 좋기 때문에 밑줄을 그었다.

merge는 해당 엔티티 전체가 변경된다.
값이 안들어가 있다면 null로 변경된다.

예를들어 수량만 변경을 했는데 다른 데이터들의 값이 null로 변경될 수 있다.
실무에서는 엔티티의 모든 값을 변경하는 것이 아닌 일부만 변경하는데,, null이 되며 서비스가 중단되버리면 큰일 나는거지 ..

그래서 우리는 변경감지로 수정하기로 하자
merge는 머리에서 지우는 걸로..ㅎㅎ

================================================================

//Controller
@PostMapping("/items/{itemId}/edit")
public String updateItem(@PathVariable("itemId") Long itemId, @ModelAttribute("form") BookForm form) {
        //@ModelAttribute >> form이라는 이름이 default로 설정됨.
        //itemRepository에있는 merge를 사용하지 않고 변경하자

        itemService.updateItem(itemId, form.getName(), form.getPrice(), form.getStockQuantity());

        return "redirect:/items";
}
//Service
@Transactional
public void updateItem(Long itemId, String name, int price, int stockQuantity){
        Item findItem = itemRepository.findOne(itemId);
        findItem.change(name,price,stockQuantity);
}
//Entity
public void change(String name, int price, int stockQuantity){
        this.name = name;
        this.price= price;
        this.stockQuantity = stockQuantity;
}
  1. Controller에서 form으로부터 받은 데이터 중 수정할 데이터만 Service단으로 넘긴다.
  2. Service단에서 Controller로부터 받은 엔티티 Id로 find하여 해당 값들을 영속으로 만들어준다. >> 그래야 변경감지로 인한 수정이 발생할 수 있다.
  3. Entity에 있는 change메서드를 통하여 값을 수정한다.

================================================================

여기서 의문 !

우리는 항상 특정 값만 수정하는 것이 아닌데,, 그렇다면 항상 모든 수정 메서드를 만들어야 하는걸까?

DTO를 만들어서 사용하면 된다.

0개의 댓글