[Spring] 변경감지와 병합

DevHwan·2022년 12월 7일
0

준영속 엔티티를 수정하는 2가지 방법

  • 변경 감지 ( Dirty Check )

    @Transactional
    void update(Item itemParam){
    	Item findItem = em.find(Item.class, itemParam.getId());
    
    	findItem.setPrice(itemParam.getPrice());
    }
    • 영속성 컨텍스트에서 엔티티를 조회한 후에 데이터를 수정하는 방법
    • 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법이다. 트랜잭션 안에서 엔티티를 조회한 후, 값을 변경한다. → 트랜잭션이 커밋되는 시점에 변경 감지가 동작해서 데이터베이스에 Update Query가 동작하게 된다.
  • 병합 사용 ( Merge )

    @Transactional
    void update(Item itemParam){
    	Item mergeItem = em.merge(item);
    }
    • 병합 사용의 내부적인 로직은 변경 감지 기능과 크게 다르지 않지만 변경 감지 기능은 내가 원하는 속성만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다. 값이 전달되지 않는 경우에는 null로 업데이트 될 수 있다.
    • 따라서 병합 사용은 실무에서 X
    • 사실 실무에서는 setter 또한 사용하지 않는 편이기 때문에 별도의 수정 로직을 가져야 함.
  • 주의 사항 네 가지

    • 컨트롤러에서 어설프게 엔티티를 생성하지 말 것.
    • 서비스 계층에 식별자와 변경할 데이터(DTO , 파라미터)를 명확하게 전달할 것.
    • 트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고 엔티티의 데이터를 변경할 것.
    • 트랜잭션 커밋 시점에 변경 감지가 실행된다.
profile
달리기 시작한 치타

0개의 댓글