Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1주차 - JPA 시작 #3

Open
3 tasks done
toychip opened this issue Sep 12, 2023 · 7 comments
Open
3 tasks done

1주차 - JPA 시작 #3

toychip opened this issue Sep 12, 2023 · 7 comments

Comments

@toychip
Copy link
Member

toychip commented Sep 12, 2023

📌JPA 시작

JPA가 무엇인지 알아보고, JPA가 발전된 과정을 학습하고
JPA의 기본 동작 원리와 실습해보는 시간을 갖는다.

  • CHAPTER 1. JPA 소개
  • CHAPTER 2. JPA 시작하기
  • CHAPTER 3. 영속성 관리 - 내부 동작 방식
@jaepyo-Lee
Copy link
Contributor

jaepyo-Lee commented Sep 16, 2023

1번 문제

  • 엔티티의 값을 수정하는 것만으로도 update쿼리가 자동으로 작성이 되는 이유는(더티체킹의 원리는)?

@dionisos198
Copy link
Contributor

dionisos198 commented Sep 16, 2023

2.----1----과 -----2-----,-----3------,------4------- 사이에 어떤 쿼리가 나가는가?

public class JpaMain {
    public static void main(String[] args){
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("hello");
        EntityManager em=emf.createEntityManager();
        EntityTransaction tx=em.getTransaction();
        tx.begin();
        try{
           Member member=new Member(373737L,"jinujinu");
           em.persist(member);
           System.out.println("-----------------------------1---------------------------");
            List<Member> selectMFromMemberM = em.createQuery("select m from Member m").getResultList();
           System.out.println("-----------------------------2----------------------------");
            em.detach(member);
            member.setName("kkkk");
            System.out.println("----------------------------3----------------------------");
            tx.commit();
            System.out.println("----------------------------4-----------------------------");

        }catch (Exception e){
            tx.rollback();
        }
        finally {
            em.close();
        }

        emf.close();
    }
}

@jyjyjy25
Copy link
Member

3번 문제. 영속 상태에 해당하는 member 객체를 모두 고르시오.

  1. em.persist(member);
  2. em.remove(member);
  3. Member member = em.find(Member.class, 1L);
  4. Member member = new Member(1L, "memberA");

@songhee1
Copy link
Member

4번 문. JPQL을 사용하게 되면 영속성 컨텍스트의 데이터는 갱신되는지? 그렇다면 그 시점은?

@toychip
Copy link
Member Author

toychip commented Sep 16, 2023

5번 문제.
Q. 준영속 상태가 되는 경우는 em.detacher(Entity);, em.clear();, em.close(); 가 있는데 이 셋의 차이는?

@ankisile
Copy link
Member

  1. EntityManagerFactory와 EntityManager의 특징은?

@songhee1
Copy link
Member

songhee1 commented Sep 16, 2023

1번 문제

  • 1차 캐시 안에 아이디, 엔티티(영속성 컨테스트와 비교), 스냅샷(최초의 값) 이 세 개의 값을 비교해서, 커밋이나 수정하는 시점에 비교해서 UPDATE 쿼리가 자동으로 진행된다. 영속성컨텍스트는 논리적 개념이며 캐시 자체가 미리 저장해놓고 꺼낼 수 있으므로, 그 개념에 따라 1차 캐시라고 보면된다.
  • 운영체제의 캐시와는 무관하다.

2번 문제

  • 1번~ 2번 사이에만 INSERT, SELECT 문이 나가게 된다.

3번 문제

  • 1번과 3번이 해당됩니다.

4번 문제

  • 자동 Update : 영속성 상태의 객체는 객체의 데이터가 변경이 되면, 자동 update 된다.
  • EntityManager에서 flush 되고, commit 된다. flush가 되는 시점은 EntityManager.flush()를 통해서 강제 flush가 일어나는 경우/트랜잭션 종료시/JPQL 쿼리문이 실행하기 전에 flush되어 Database side에서 데이터를 가져오게 된다. 이는 동일성을 보장하는 내용과도 관계가 깊다. 새로운 객체가 나오는 것이 아니라 동일 객체를 이용해서 상태를 1차, 2차 캐시에 저장하므로 그렇다.

5번 문제
// 특정 엔티티 준영속 상태로 이전
em.detacher(Entity)

// 모든 영속성 컨텍스트 준영속 상태로 이전
em.clear();

// 영속성 종료이므로 준영속 상태가 됨
em.close();


6번 문제

  • EntityManagerFactory

  • 애플리케이션에서 사용하는 DB 종류 하나 당 하나만 생성하는데, 이 한 개를 가지고 애플리케이션 전체에서 공유되도록 설계되어있다. (싱글톤 방식)

  • EntityManager를 생성하는 역할이 주 업무

  • EntityManagerFactory는 thread-safe해서 동시성이 보장되지만, 생성 비용이 상당히 크다.

  • JPA는 DB접근 요청이 들어올 때마다 EntityManagerFactory에서는 EntityManager를 생성하여 DB연결 요청을 처리

EntityManager

  • Mapping한 Entity를 가지고 DB연결 요청을 처리하고 Entity 상태를 관리하는 클래스
  • EntityManager는 생성 비용이 거의 없다.
  • EntityManager는 not thread-safe해서 동시성이 보장되지 않기 때문에, 요청 별로 쓰레드가 하나씩 담당하고, 각 쓰레드 별 EntityManager를 생성해 처리한다.
  • DB 연결이 필요한 시점까지는 Connection Pool에서 Connection을 얻지 못하다가 필요하게되면 Connection을 사용해서 DB와 연동한다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants