[JPA] JPQL과 영속성 컨텍스트 1
JPQL (Java Persistence Query Language)
- JPQL은 JPA의 일부로 정의된 플랫폼으로 독립적인 객체지향 쿼리 언어다.
- JPQL은 관계형 데이터베이스의 엔티티에 대한 쿼리를 만드는데 사용된다.
- SQL에 크게 영향을 받아 SQL문과 비슷하지만 데이터베이스 테이블에 직접연결되는것이 아니라 JPA엔티티에 대해 동작한다.
- 그러므로, JPQL의 쿼리에는 테이블이 아닌 엔티티에서 표현하고 있는 칼럼의 이름을 써줘야한다.
EX) TypedQuery
query = em.createQuery("select m from Member m", Memeber.class); List memberList = query.getResultList();
- JPA에서 가장 중요한 2가지
-
- 객체와 관계형 데이터베이스 매핑하기
-
- 영속성 컨텍스트
영속성 컨텍스트

엔티티 매니저 팩토리와 엔티티 매니저
-
고객의 요청이 올때마다 엔티티 매니저를 생성하고 내부적으로 데이터베이스 커넥션을 사용해서 디비를 사용한다.
-
영속성 컨텍스트 : 엔티티를 영구 저장하는 환경이라는 뜻 , EntityManager 안에 영속성 컨텍스트가 존재한다.
-
EntityManager.persist(entity); - > 디비에 저장하는것이 아니라 엔티티를 영속성 컨텍스트에 저장하는것

EntityManagerFacory
- 데이터베이스를 하나만 사용하는 어플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다.
- 만드는 비용이 상당히 크고 한 개만 만들어서 어플리케이션 전체에서 공유하도록 설계되었다.
- 여러 스레드가 동시에 접근해도 안전하고, 서로 다른 스레드 간의 공유가 가능하다.
EntityManager 생성
- EntityManger em = emf.createEntityManager(); //엔티티 매니저 생성
- 여러 스레드가 동시에 접근하면 동시성 문제가 발생한다.
- 스레드간의 절대 공유를 하면 안된다.
- 데이터베이스 연결이 필요한 시점까지 커넥션을 얻지 않는다.
엔티티의 생명주기
비영속 상태
- 멤버객체를 생성하고 영속 컨텍스트(entityManager)에 넣지 않은 상태
Member member = new Member();
member.setId("멤버1");
member.setUserName("회원1");
영속 상태
- 맴버 객체를 생성하고 영속 컨텍스트에 넣은 상태
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("멤버1");
member.setUserName("회원1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);
준영속과 삭제 상태
//비영속
Member member = new Member();
member.setId(100L);
member.setName("HelloJPA");
//영속
System.out.println("=====BEFORE=====");
em.persist(member);
em.detach(member); // 영속성 컨텍스트에서 다시 지움
em.remove(member); // 실제 디비에서 삭제를 실행함
System.out.println("=====AFTER=====");
tx.commit();
다음 내용 : 영속성 컨텍스트의 이점
😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재 , 블로그 , 블로그
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
개인메모