(spring)영속성. 궁금했습니다. feat. entity 4가지 상태

전성영·2022년 5월 26일
0

spring

목록 보기
9/31

강의를 다 듣고 코드를 맨지면서 내가 놓쳤던 부분이 뭐였는지, 코드의 흐름은 어떻게 흘러가는지 복기?? 하는 편이다.

그러다 코린이인 내가 궁금한 게 갑자기 생겼다. 응애
진짜 초보자니깐 코드 30줄 이상 짜보신 분들은 뒤로가기 추천😢

위에 친구는 왜 memoRepository에 .save() 를 해주지 않아도 값이 들어가고
아래 친구는 생성자로 값을 넣어줬는데 memoRepository에.save()를 한번 더 해주지?? 내가 잘못 이해하고 있는걸까?

조원분들 중 되게 잘하시는 분이 있어서 여쭤봤다. 그 분 말고도 다들 잘하시지만..
그 분의 답변은 영속성, 비영속성, 1차캐시 등 내가 들어본 적이 없는 단어들을 포함시켜 설명해주셨다. 이해가 어느정도 됐지만 완벽히 내 꺼를 만들기 위해서는 따로 찾아보고 포스팅 해야겠다고 결정! 정홎우!

그림은 태진이가 구해줬다! 태진 안녕,,,

비영속(new)

persistence context와 관련이 없는 상태.
즉 JPA와 전혀 관계없이 객체만 생성한 상태이다.

Member member = new Member();

영속(managed)

영속성 컨텍스트(엔티티를 영구 저장하는 환경)에 의해서 관리되어지는 상태이다.
persistence context에 엔티티가 저장된 상태를 의미한다.
"생성한 객체를 persist(), find() 또는 JPQLQueryDSL 통해 DB에서 엔티티를 조회하면 영속성 컨텍스트에 저장되어 관리되어지므로 이때 영속 상태가 된다.
즉 아까 사진에서 위에 친구는 .findById()를 한 시점부터 영속성 컨텍스트에 저장이 됐다 라고 생각하면 된다.
추가로 정리한 글이 있으니 볼 것.

준영속(detached)

persistence context에 저장되었다가 분리된 상태이다.
따라서 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.

삭제(removed)

1차캐시와 데이터베이스에서 모두 삭제된 상태이다.
persistence context에서 엔티티를 제거하며, DB에서도 해당 객체를 삭제한다.

그럼 준영속 상태의 엔티티는 언제 사용할까?
영속성 상태의 엔티티 값을 DB에 반영하지 않고 값을 변경할 때
영속상태의 엔티티는 변경하면 변경사항이 감지가 돼서 데이터베이스에 반영이 될 수 있다.
이런 경우일 때 비영속상태로 변경 후 작업을 한다고 한다!!

영속성 컨텍스트 특징

- 1차 캐시

영속성 컨택스트에는 1차캐시가 있다.
영속상태의 엔티티는 모두 1차 캐시에 저장되고, 1차 캐시는 Key를 @Id로 지정한 식별자이고, value는 엔티티 인스턴스인 일종의 Map 이라고 생각하면 된다.

1차 캐시를 이용하면 데이터의 결과를 빠르게 얻을 수 있는 장점을 가지고 있다. Member 엔티티를 조회할 때, 바로 데이터베이스에서 직접조회하는 것이 아니고, 우선적으로 1차 캐시에 Member 엔티티가 있는지 @Id값으로 확인을 한다.

1차캐시를 우선으로 확인하고, 해당 Id가 없다면 데이터베이스를 조회한다.

- 동일성 보장
영속성 컨텍스트는 엔티티의 동일성을 보장한다.(모든 엔티티는 최종적으로 1차 캐시에서 가져오기 때문에)

Member a = em.find("Member.class", "yoon");
Member b = em.find("Member.class", "yoon");
System.out.print(a==b) // true

- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
저장을 해도 DB에 바로 보내지는 것이 아니다.
트랜잭션을 커밋할 때 그동안 모아둔 쿼리를 DB에 전송한다.

- 변경 감지
엔티티의 수정이 일어남녀 영속성 컨텍스트 형님이 알아서 변경사항을 체크한다.

다음주 쯤 영속성과 연관관계를 공부할 거 같다.
연관관계가 어렵다는데 파이팅 해보자!!!!

profile
Slow and Steady

0개의 댓글