ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA - JPA의 내부 동작과 Entity의 생명주기
    Spring/JPA 2022. 3. 7. 14:52
    728x90
    반응형

     

     

    JPA의 내부 동작과 Entity의 생명주기

    • JPA의 내부 동작
    • Entity의 생명주기

     


     

    JPA의 내부 동작

     

     

     요청이 들어올 때 JPA가 내부적 처리되는 과정은 아래의 그림과 같다. 요청이 들어오면 EntityManagerFactory가 각 요청마다 EntityManger를 생성해주고, EntityManager는 커넥션 풀을 이용해 DB에 접근한다. 

     

     

    JPA의 강점

     

    • JPA는 특정 데이터베이스에 종속되지 않는다.
    • 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 다르기 때문에
      JPA에서는 hibernate.dialect로 특정 데이터베이스를 지정할 수 있다.
           H2 : org.hibernate.dialect.H2Dialect
           Oracle 21g : org.hibernate.dialect.Oracle12cDialect
           MySQL : org.hibernate.dialect.MySQL5InnoDBDialect


     

    JPA 구동 방식

     

    • EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유한다.
    • EntityManager는 스레드 간에 공유하지 않는다. 즉, 각각의 스레드가 서로 다른 EntityManager
      사용하고 사용을 다 하면 반납해준다.
    • JPA의 모든 데이터 변경은 트랜젝션 안에서 실행되어야 한다.


     

    JPQL이란?

     

    • JPA를 사용하면 엔티티 객체를 중심으로 개발하는데 검색 쿼리가 문제가 된다.
    • JPQL은 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색할 수 있도록 도와준다.
    • 즉, 필요한 데이터를 DB에서 가져오려면 검색 조건이 포함된 SQL이 필요하는데 이때, JPQL을 사용한다.
    • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
    • SQL 문법과 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다,
    • SQL을 추상화하였기 때문에 특정 데이터베이스 SQL에 의존하지 않는다.

     

     


     

    Entity의 생명주기

     

    • 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
    • 영속 (managed) : 영속성 컨텍스트에 관리되는 상태
    • 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
    • 삭제 (removed) : 삭제된 상태


     

    비영속

     

    • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

     

    //객체를 생성한 상태(비영속) 
    Member member = new Member(); 
    member.setId("member1"); 
    member.setUsername("회원1");

     


     

    영속

     

    • 영속성 컨텍스트에 관리되는 상태
    • em.persist(member)은 DB에 쿼리가 전달되는 것이 아닌 영속성 컨텍스트에 저장된 상태
    • transaction이 끝나는 시점에 쿼리가 전달

     

    //객체를 생성한 상태(비영속) 
    Member member = new Member(); 
    member.setId("member1"); 
    member.setUsername(“회원1”);
    
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    
    //객체를 저장한 상태(영속)
    em.persist(member);

     


     

    준영속, 삭제

     

    • 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
    • 삭제 : 삭제된 상태

     

    //회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태 
    em.detach(member);
    
    //객체를 삭제한 상태(삭제) 
    em.remove(member);

    728x90
    반응형

    'Spring > JPA' 카테고리의 다른 글

    JPA - 연관관계 매핑  (0) 2022.03.08
    JPA - 엔티티 매핑  (0) 2022.03.08
    JPA - 영속성 컨텍스트  (0) 2022.03.07
    JPA - JPA(Java Persistence API)  (0) 2022.03.07
    JPA - JPA의 등장  (0) 2022.03.07

    댓글

Designed by Tistory.