JPA(Java Persistence API)
에서 사용되는 가장 중요한 용어객체(Object)
로 취급하여 서로 연관된 엔티티를 조회(find) 해야될 때 FK를 통한 SELECT 쿼리를 2번 이상 발생시키거나 복잡한 JOIN 쿼리를 발생시키지 않고 객체(Object) 자체 끼리의 연관 관계를 맺어 보다 완벽한 객체 지향적인 프로그래밍을 할 수 있도록 지원한다.
==
비교 연산자가 true임을 뜻한다.Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
commit
할 때까지 엔티티의 변경 사항을 모아두고 한번에 데이터베이스에 반영한다.버퍼링 기능
이라고 할 수 있다. commit
직전까지 INSERT 쿼리를 모아서 한번에 처리한다.EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// 엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // 1. [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
// 2. memberA, memberB를 모두 1차 캐시에 저장한 후, INSERT SQL을 쓰기 지연 저장소에 쌓는다.
// 데이터베이스에 보내지 않은 상태
// 커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // 3. [트랜잭션] 커밋
update()
나 persist()
코드 필요 없이 트랜잭션을 commit
하면 알아서 변경을 감지하고 UPDATE SQL을 생성하여 DB에 업데이트 정보가 반영된다.Member
Team
가 있다고 가정해보자. 우리는 Member에 존재하는 하나의 대상을 조회하는 경우 Team 객체의 정보까지 항상 함께 조회해야 한다.Lazy
로 설정할 경우 엔티티 객체를 로딩하는 시점에 Team는 프록시 객체가 조회된다.대리
라는 뜻으로, 실제 객체와 동일한 인터페이스를 제공하지만, 필요할 때만 실제 객체를 생성하거나 로드하여 그 기능을 대신 수행하는 객체를 의미한다.왜?
즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
N+1 문제란 개발자가 의도한 쿼리는 1개인데, 실제는 의도와 상관 없이 추가로 N개의 쿼리가 발생한다는 의미이다.
이는 대규모의 데이터를 조회할 때 치명적인 성능 문제를 일으킨다.