티스토리 뷰

 

기존에 merge를 이용해서 데이터를 update 하도록 만들었다. 하지만 merge에는 큰 주의점이 존재한다.

 

update를 하는 방법에는 2가지의 방법이 있다.

 

1. merge

2. 변경감지 이용

 

 

merge

    @Transactional
    public void saveItem(Item item){
        itemRepository.save(item);
    }
    public void save(Item item){
        if(item.getId() == null){
            em.persist(item);
        }else{
            em.merge(item);
        }
    }

 

이렇게 기존에 존재하던 id가 있으면 EntityManager(em)을 사용해 merge를 날린다. 다른 데이터가 있을 경우 데이터를 변경해준다.

 

변경감지

    @Transactional
    public void updateItem(Long itemId, String name, int price, int stockQuantity){

        //db에서 꺼낸 객체를 set을 해주면 자동으로 jpa에서 관리하기 때문에 db에서 변경이 된다.@Transactional로 인해 커밋돤다.
        Item findItem = itemRepository.findOne(itemId);

        //findItem.change(price,name,stockQuantity); 실무에서는 아래처럼 set을 사용하지 않고 의미있는 메서드를 사용해서 변경해야한다.
        findItem.setPrice(price);
        findItem.setName(name);
        findItem.setStockQuantity(stockQuantity);
    }

 

변경 감지의 경우에는 db에서 불러온 객체에 데이터를 바꿔주면 JPA에서 @Transactional 어노테이션을 감지하고 이상이 없을 경우 commit하게 된다.

 

 

둘다 업데이트 되는 것으로 어느것을 사용해도 괜찮아 보이긴한다. merge방식은 이렇게 되어있다.

 

김영한의 jpa 강의 중

 

merge는 이렇게 결국

1.db에서 데이터를 불러온 뒤에

2.불러온 객체에 값을 채우고

3.반환하여 값이 바뀐다.

 

변경감지와 비슷하게 흘러가지만 한가지 차이점이 존재한다.

 

그것은 필드의 값이 null일 경우에도 값을 바꿔버린다. 바꿀필요가 없어 parameter를 vo로 받을 때에 비어있는 값을 null로 바꾼다면 이건 실무에서 큰 결함이 될 가능성이 매우 높아지므로 위험하다.

 

따라서 변경감지를 이용하여 필요한 데이터만 바꾸는 방식으로 진행하는 것이 컨트롤하기에 훨씬 좋으며 안전한 방식이다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함