영속성 컨텍스트
가 관리하지 않는엔티티
임의로 만든 엔티티
: 수정된 값을 저장하기 위해식별자
는 있지만관리되지 않는 엔티티
영속화가 취소된 엔티티
: 강제로영속화
를취소
한 엔티티
준영속 엔티티
는수정
이 일어나도변경 감지(Dirty Checking)
이 일어나지않음
[ 방법 ]
변경감지(Dirty Checking)
기능 사용병합(merge)
사용
[ 변경 감지 기능 사용 ]
- 설명 :
Item을 수정
하는 상황- 로직
Item 수정
을 하기 위해수정된 값
을 통해임의로 만든 객체
는준영속 엔티티
이다Item
의식별자인 Id
를 이용해서 한번조회
를 하면영속 엔티티
가 된다영속 엔티티
가 된 상태에서데이터
를수정
-->변경감지(Dirty Checking)
기능이사용됨
[ 병합(merge) 사용 ]
- 설명 : Item을 수정하는 상황
- 로직
merge()
실행준영속 엔티티
의식별자 값
으로1차 캐시
에서엔티티를 조회
(1차 캐시
에 없으면DB에서 조회
함)- 조회한 객체인
mergeMember
에member
값을복사
mergeMember
가반환
(반환값
이영속 엔티티
이고,파라미터로 넣은 엔티티
는 여전히준영속 상태
)
- 주의
:변경감지
와 달리모든 속성
을복사
하기 때문에없으면 null
이 들어간다
(모든 필드
를교체
하므로비효율
&위험성
이 있음
-->실무
에서는변경감지를 사용
하자)
[ 정리 ]
변경감지
를 사용한 수정
-->변경하기 원하는 데이터 값
만 가지고수정
할 수 있음merge
를 사용한 수정
-->변경을 원하지 않는 값
들도 모두 가지고 있어야 하니까 자칫 잘못하면null값이 들어갈수 있다 (위험성)
- 정리
엔티티 수정
을 할 때에는변경감지
를사용하도록 로직을 설계!
- 1)
트랜잭션
이 있는서비스 계층
에식별자
와변경할 데이터
를 전달- 2)
트랜잭션
이 있는서비스 계층
에서영속상태의 엔티티
를조회
하고,엔티티
의데이터
를직접 변경
하자