jpa에서 권장하는 데이터 수정 방법

su dong·2023년 8월 12일
0

변경 감지와 병합(merge)

jpa에서는 entity의 값이 바껴있으면, dirty checking이라고 해서, 자동으로 flush?할 때 변경 쿼리를 작성해서 데이터베이스 값도 바꿔준다.

준영속 엔티티란?

영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.
(여기서는 itemService.saveItem(book) 에서 수정을 시도하는 Book 객체다. Book 객체는 이미 DB에 한번 저장되어서 식별자가 존재한다. 이렇게 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다.)

준영속 엔티티 수정 방법

1. 변경감지에 의해서 데이터를 변경하는 방법

@Transactional
    public void updateItem(Long itemId, Book param) {
        Item findItem = itemRepository.findOne(itemId);
        findItem.setPrice(param.getPrice());
        findItem.setName(param.getName());
        findItem.setStockQuantity(param.getStockQuantity());
    }

2. 병합 사용

준영속 상태의 엔티티를, 영속상태로 변경할 때 사용
merge하면 위의 코드를 jpa가 알아서 다 해줌.

병합 동작 방식

  1. merge() 를 실행한다.
  2. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다.
    2-1. 만약 1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고, 1차 캐시에 저장한다.
  3. 조회한 영속 엔티티( mergeMember )에 member 엔티티의 값을 채워 넣는다. (member 엔티티의 모든 값
    을 mergeMember에 밀어 넣는다. 이때 mergeMember의 “회원1”이라는 이름이 “회원명변경”으로 바
    뀐다.)
  4. 영속 상태인 mergeMember를 반환한다.

--> merge를 쓸 경우 할당되지 않은 값에 대해서는 null로 자동으로 넣어짐!!!
-> 그렇기 때문에 merge보다는 변경감지를 사용하는것이 좋음.

profile
사람들을 돕는 문제 해결사, 개발자 sudong입니다. 반갑습니다. tkddlsqkr21@gmail.com

0개의 댓글