-
[JPA] 변경 감지와 병합스프링부트 2022. 12. 27. 21:05반응형
** 개인 학습을 위해 적은 글이니 잘못된 정보 지적은 언제든 환영입니다 **
JPA 의 준영속 엔티티를 수정하기 위한 두가지 방법에 대해 알아보자
1. 변경 감지 기능 사용
2. 병합 사용
더보기준영속 엔티티란?
영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.영속성 컨텍스트란?
엔티티를 영구 저장하는 환경이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 역할을 한다.em.persist(member) 를 실행하게 되면 member 엔티티를 영속성 컨텍스트에 저장한다는 의미이다.저장된 영속성 컨텍스트는 플러시 되는 시점에 데이터베이스로 반영된다.변경감지
1. primary key를 이용해 영속성 컨텍스트에서 엔티티를 조회한다
2. 조회한 엔티티의 필드들을 변경하려는 필드로 바꿔준다.
위의 과정을 코드로 나타내면 아래와 같다.
@Transactional public void updateMember(Long MemberId, String name, String college) { Member findMember = MemberRepository.findOne(MemberId); findMember.setName(name); findItem.setcollege(college); }
Transactional 어노테이션을 붙이면 persist 하지 않아도 트랜잭션 커밋 시점에 변경을 감지해 데이터베이스에 updateSQL을 실행한다. 이를 Dirty Checking 이라 부른다.
병합 사용
@Transactional void update(Item MemberParam) { Member mergeMember = em.merge(MemberParam); }
병합을 이용하면 변경 감지에서 사용한 코드를 한줄로 간략화 할 수 있다는 장점이 있다.
** 그러면 전부 다 병합을 사용하면 되지 왜 변경 감지를 사용할까
이를 이해하려면 병합의 동작 방식에 대해 알아야한다.
1. 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다. (병합)
3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행된다.
자 그러면 만약 내가 쿠팡에 [인천닭가슴살] 을 파는사람이라 가정해보자
닭가슴살을 팔다 올해 닭가슴살 생산량이 높아져서 가격을 낮추려고 가격수정을 하려는데 실수로 가격수정은 공백으로 비우고 이름만 [서울닭가슴살] 로 잘못 수정해버렸다.
이렇게 되고 수정을 누르면 merge의 경우 가격값이 null 이 되어 난리가 나게 될것이다.
하지만 변경 감지 기능을 사용하면 원하는 필드만 선택해서 변경할 수 있기 때문에 위와같은 위험을 피할 수 있다.
그렇기에 merge는 코드가 간결해진다는 장점이 있지만 위험성이 높아 지양해야한다.
** 김영한님의 실전! 스프링부트와 JPA 활용 강의를 참고했습니다
728x90반응형'스프링부트' 카테고리의 다른 글
[Lombok] @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (0) 2023.05.08 [JPA] 관계형 데이터 베이스 매핑 (One To One) (0) 2023.03.30 롬복을 이용한 리팩토링 (2) 2022.07.25 JPA를 이용한 데이터 조회 (3) 2022.05.03 스프링 부트 ) JPA를 이용한 데이터 저장 (0) 2022.05.03