JPA - 영속성

권영태·2023년 5월 8일
1

스프링

목록 보기
8/18

김영한 강사님의 '실전! 스프링부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 듣다 영속성이 무엇이고 @PersistenceContext이 어떤 역할을 하는지 궁금해져서 정리해본다.

Reference
1. https://velog.io/@jaeeunxo1/spring-singleton
2. https://velog.io/@seongwon97/Spring-Boot-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context
3. https://ppaksang.tistory.com/5
4. https://batory.tistory.com/497
5. https://melonicedlatte.com/2023/01/22/163300.html
6. https://kihoonkim.github.io/2017/01/27/JPA(Java%20ORM)/2.%20JPA-%EC%98%81%EC%86%8D%EC%84%B1%20%EA%B4%80%EB%A6%AC/
7. https://velog.io/@bey1548/JPAEntity-EntityManager-EntityManagerFactory


🌈 싱글톤(Singleton)

영속성을 이해하기 전 싱글톤을 먼저 알고가면 영속성을 더 깊게 이해할 수 있다.

  • 싱글톤(SIngleton) : 싱글톤은 소프트웨어 디자인 패턴 중 1개로 싱글톤 클래스는 생성자가 여러 번 호출 되더라도 실제로는 객체 1개만 생성된다. 최초 호출 생성자 이후 호출된 생성자들은 최초 호출 생성자가 만든 객체를 반환한다.
  • 스프링의 핵심 개념 중 1개인 DI(의존성 주입)을 요청할 때 새로운 객체를 생성하게 되면 메모리 낭비가 심해지기 때문에 싱글톤을 사용해 메모리 낭비를 막는다.

💡 영속성

  • 영속성(Persist) : 프로그램이 데이터를 생성하고 종료될 때 메모리에만 저장되지 않고 데이터가 사라지지 않는 특성(≒ 데이터 영구 저장)
    • 주로 파일, 관계ㆍ비관계형 데이터베이스 등에 저장해 영속성 유지!
  • 서비스 별로 하나의 EntityManager Factory가 존재하고,
    각 EntityManager Factory 안에는 EntityManager들이 존재한다.
  • EntityManager에 Entity를 저장 또는 조회하면
    EntityManager는 Persistence Context에 Entity를 보관 및 관리한다.
  • Spring Boot 적용 순서
    • 1) Spring Container가 시작될 때 EntityManager를 Bean으로 등록한다.
    • 2) @PersistenceContext를 통해 EntityManager Bean을 주입 받는다.
      이때 아래 두 가지 방법 중 한 가지 방법으로 주입한다.
      • ⅰ) EntityManager Factory를 통해 새로운 EntityManager를 생성 후 주입
      • ⅱ) Transaction에 의해 기존 생성된 EntityManager를 주입
  • 스프링은 싱글톤 패턴을 기본으로 동작하기 때문에 여러 쓰레드가 공유한다.
  • 하지만 EntityManager은 여러 쓰레드가 접근하면 동시성 문제가 발생하는데, @PersistenceContext를 통해 주입 받은 EntityManager는 Proxy로 감싸져 쓰레드가 동시 접근할 수 없다!

정리

  1. EntityManager : @Entity를 달고 있는 Entity 객체 관리
    -> Entity 객체들을 Persistence Context에서 관리
  2. @PersistenceContext는 EntityManager를 생성하는 클래스
  3. EntityManager 생성 방식은 2가지
    1) EntityManager Factory를 통해 새로운 EntityManager 생성 및 주입
    2) Transaction에 의해 기존 생성된 EntityManager를 주입

++ @PersistenceUnit을 이용하면 EntityManager Factory를 직접 등록할 수 있지만 잘 쓰지 않는다.

profile
GitHub : https://github.com/dudxo

0개의 댓글