[TIL] 영속성 관리

이형석·2024년 10월 6일

영속화

영속화의 사전적 의미는 '사라지지 않고 지속되게 한다'
JPA에서는, 영속성 컨텍스트에 올라와 있는 상태를 영속화되었다고 한다. (이후 트랜잭션이 끝나 commit 될 때 DB에 반영된다)

영속화시키는 메서드
em.persist(), em.find(), jpql 쿼리
영속성 컨텍스트에서 삭제하는 메서드
em.remove()

flush()

em.find()는 즉시 flush()된다.
em.persist(), em.update(), em.remove() 쿼리는 쓰기지연 SQL 저장소에 저장된다.
그리고 트랜잭션이 끝나 커밋될 때 flush()된다.
참고로 변경감지의 update()는 트랜잭션이 끝나 커밋하여 flush()될때 스냅샷과 비교하여 update쿼리를 발생시킨다. 다시 트랜잭션이 커밋된다.

중요 이슈

영속화 된 엔터티에 대해선, 영속화 이후에도 수정이 가능하다
(영속화라는 말 자체가 영속성 컨텍스트에 올라와 있다는 의미)
(다시 말해, 트랜잭션이 끝나 영속성 컨텍스트가 사라지기 전까지 모든 변경사항이 관리되고 있는 상태라는 것)

변경감지 : 최초 영속화된 시점에, 영속성 컨텍스트를 복사&저장(스냅샷)
이후 flush()시점에 현재 엔터티 상태와 스냅샷을 비교해, update쿼리를 보내고 커밋

teamRepository.save(team);	//영속화
team.setName("red team");	//이후 수정
//DB에 반영 됨

이때 Cascade옵션이 걸려있다면 연관관계 필드에 대한 추가나 삭제도 가능하다.
(연관관계 엔터티를 DB에서 저장, 수정, 삭제가 가능하다)

1. 저장할 때

Team team = new Team();
Member member1 = new Member();
teamRepository.save(team);	//team 영속화
member.setTeam(team);	//이후에 양방향 연관관계 설정 (연관관계 편의 메서드)
//DB의 Member table에도 member1이 저장됨

2. 수정할 때

Team team = teamRepository.find(teamId);	//team 영속화
Member member1 = new Member();
member1.setTeam(team);	//이후에 양방향 연관관계 설정 (연관관계 편의 메서드)
//DB의 Member table에 member1이 저장됨

Cascade 옵션 참고
[TIL] 양방향 연관관계 다루기 feat.JPA or 김영한 JPA 책 307p 영속성 전이: CASCADE


김영한 JPA 책 90p 3장 영속성 관리 참고
위 이슈 내용은 직접 테스트 해본 것. 이것 때문에 찾아봄

profile
금융IT 개발자

0개의 댓글