본문 바로가기

TIL

2022.12.12 입문 주차 복습, 영속성

JPA 내부동작, 구현 원리

라이브러리, 프레임워크등을 잘 배우려면 “이게 왜 우리를 편하게 해주는지”에 대해서 고민해보면 좋고, 잘 사용하려면”어떻게 우리를 편하게 해주는지” 고민해보면 좋습니다. 그래서 많은 좋은 수업들이, 해당하는 기술이 없음을 가정하고 프로젝트를 진행한 후에, 해당 기술을 적용해서 얼마나 편해지는지 체감시키는 방향으로 구성되어 있습니다. 하지만 그렇게 특정 기술을 학습하고 더이상 공부하지 않는다면 해당 기술을 사용하다가 다양한 부작용을 마주하게 됩니다. 이러한 상황은 주로 내부 동작 원리나 한계등을 잘 이해하지 않고 사용하다보면 마주치게 됩니다.

 

나중에는 다 알고 사용할 수 있어야 합니다.” 여기서 가장 중요한 포인트는 “나중에”입니다. 상대적으로 심오한 내용이기도 하고, 처음 접하는 여러분들이 이해 할 수 있도록 최대한 풀어서 설명을 드리려고 노력했지만, 보면서 이해가 가지 않으신다면, 나중에 돌아와서 볼 때 강의를 다시 듣지 않아도이해가 가는데 도움이 되도록, 풀어서 작성하려 노력했습니다. 이후의 개념을 배우면서 이해가 가지않는다면 그 때 다시 돌아와서 봐주시면 좋을 것 같습니다.

 

 

영속성 컨텍스트

우리가 Spring Data JPA로 해오던 방식

1
2
3
4
5
6
7
8
// Entity를 생성!
Member minsook = new Member();
member.setId("abcd1234"); 
member.setUsername("민숙");
 
// 이렇게 간단하게 해오셨던것 기억나시죠? 아래의 내용은 똑같은 과정입니다!
memberRepository.save(minsook);
memberRepository.find();
cs

JPA를 사용하지 않았다면?

1
2
3
4
5
6
7
// Entity를 생성!
Member minsook = new Member();
member.setId("abcd1234"); 
member.setUsername("민숙");
 
// EntityManager를 생성해줄 EntityManagerFactory를 만들어야합니다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa심화주차");
cs

EntityManager가 Entity를 관리해준다는 것은 이름에서 짐작이 가능한데,

왜 굳이 저걸 EntityManagerFactory에서 또 생성하게 만들게끔 구현하나요?

멀티 스레딩에서 동시성 문제를 방지하기 위해 특정 리소스나 정보는 공유하지 못하게 하는 등의

처리가 필요함. 엔티티매니저에는 공유하면 안되는 특정 리소스나 정보가 있고,

여러 스레드가 하나의 에닡티 매니저를 이용할 수 없도록 처리해야 함.

그래서 엔티티 매니저 팩토리에서 필요 할 때 마다 여러개의 엔티티매니저를 생성하는 구조로 설계한 것

 

 

이해가 어려우시면, 모종의 이유로 여러개의 엔티티 매니저가 필요하고, 매번 모든과정을 다시하기에는 비용이 많이 들어 대부분 비용이 많이 드는 일을 엔티티 매니저 팩토리를 생성하면서 하고, 엔티티 매니저를 여러개 생성하는 일의 비용을 줄였다고 이해하시면 좋을 것 같습니다.

출처 자바 ORM 표준 JPA - https://product.kyobobook.co.kr/detail/S000000935744

01. 영속성 컨텍스트란?

영속성 컨텍스트란 엔티티를 영구 저장 하는 환경 이라는 뜻

어플리케이션(지금은 여러분의 자바 코드 그 자체라고 생각)이 데이터베이스에서 꺼내온 데이터 객체를 보관하는 역할을 합니다. 영속성 컨텍스트는 엔티티 매니저를 통해 엔티티를 조회하거나 저장할때 엔티티를 보관하고 관리합니다.

 

엔티티 매니저마다 개별적으로 부여되는, 어떠한 논리적 공간같은 개념으로 비유적으로 이해하셔도 좋을 것 같습니다. 자바의 엔티티 객체를 엔티티 매니저마다 가지고 있는 영속성 컨텍스트라는 공간에다 넣고 빼고 하면서 사용하는거죠, “영속화 한다” 라는 말을 “엔티티 매니저가 자기의 영속성 컨텍스트에 넣어준다”로 이해하는 것 처럼 말이죠

 

 

JPA 엔티티의 상태

비영속(New) : 영속성 컨택스트와 관계가 없는 새로운 상태입니다. 해당 객체의 데이터가 변경되거나 말거나 실제 DB의 데이터와는 관련없고, 그냥 Java 객체인 상태

1
2
3
4
// 엔티티를 생성
Member minsook = new Member();
member.setId("minsook");
member.setUsername("민숙");
cs

영속(Managed) : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태입니다. 이와 같은 경우 데이터의 생성, 변경등을 JPA가 추적하면서 필요하면 DB에 반영합니다.

1
2
// 엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장
em.persist(minsook);
cs

준영속(Detached) : 영속성 컨택스트에서 관리되다가 분리된 상태

1
2
3
4
5
6
// 엔티티를 영속성 컨택스트에서 분리
em.detach(minsook);
// 영속성 컨텍스트를 비우기
em.clear();
// 영속성 컨택스트를 종료
em.close();
cs

삭제(Removed) : 영속성 컨택스트에서 삭제된 상태

1
em.remove(minsook)
cs

출처 자바 ORM 표준 JPA - https://product.kyobobook.co.kr/detail/S000000935744

 

'TIL' 카테고리의 다른 글

2022.12.14 JPA심화 (3)  (0) 2022.12.14
2022.12.13 JPA 심화 (2)  (0) 2022.12.13
[WIL] 2022.12.05 ~ 12.09 스프링 입문  (1) 2022.12.12
2022.12.09 DB 개요  (0) 2022.12.12
[WIL] 2022.11.28 ~ 12.02 미니 프로젝트 발표와 자바 심화  (0) 2022.12.04