-
JPA - JPA의 내부 동작과 Entity의 생명주기Spring/JPA 2022. 3. 7. 14:52728x90반응형
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