본문 바로가기

Spring Data5

페치 조인(fetch join)이란? 페치 조인(fetch join)이란? SQL 조인 종류 X JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 페치 조인 ::= [ LEFT[OUTER] | INNER] JOIN FETCH 조인경로 예시 코드를 통해 fetch join에 대해 더 자세히 알아보겠습니다. fetch join을 사용하지 않을때 위의 Member, Team 예시로 설명해보자면 위처럼 fetch join을 사용하지 않고 Member를 조회하여 Team의 정보까지 확인한다면, 이처럼, 기존에 @ManyToOne 을 LAZY로 걸어놨기 때문에 Team은 프록시 객체로 불러오게 되고 그로인해 member.getTeam().getName() 메서드를.. 2021. 12. 3.
즉시 로딩과 지연 로딩 위와 같은 Member, Team 엔티티로 즉시로딩과 지연로딩을 알아보겠습니다. 지연로딩(LAZY) 단순히 그림으로만 알아본다면 Member 엔티티에서 Team 엔티티는 프록시로 걸리게되어 실제 Team 엔티티를 사용하는 시점에 DB를 조회하게 됩니다. 코드로 살펴보자면 Member 엔티티의 Team 연관관계에 LAZY를 걸어주고 위의 코드를 통해 결과를 확인하려 합니다. 결과를 먼저 예상해보자면 다음과 같습니다. Team 엔티티는 프록시 일것이고, 쿼리문에 Team을 조회하는 쿼리문은 나오지 않을것이고 ======안에 실제 Team을 사용하는 메소드가 있으므로 그 안에 Team을 조회하는 쿼리문이 나올것이다. 결과를 살펴보면, Team은 프록시 엔티티로, Member만 조회하는 쿼리문이 나오고, Tea.. 2021. 11. 27.
프록시란? 프록시 기초 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시란? 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체의 초기화 다음과 같은 코드에서 초기화를 설명하자면, Member member = em.getReference(Member.class, "id1"); member.getName(); getName(.. 2021. 11. 26.
엔티티의 생명주기 엔티티의 생명주기 1. 비영속: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 //객체를 생성한 상태 Member member = new Member(); member.setId("member1"); member.setName("회원1"); 2. 영속: 영속성 컨텍스트에 관리되는 상태 //객체를 생성한 상태 Member member = new Member(); member.setId("member1"); member.setName("회원1"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //객체를 저장한 상태(영속) em.persist(member); 3. 준영속, 삭제 - 준영속 //회원 엔티티를 영속성 컨텍스.. 2021. 11. 24.
영속성 컨텍스트 영속성 컨텍스트란? JPA를 이해하는데 가장 중요한 용어 "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity) 영속성 컨텍스트는 논리적인 개념 눈에 보이지 않는다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 영속성 컨텍스트의 이점 1. 엔티티 조회, 1차 캐시 Member member = new Member(); member.setId("member1"); member.setName("회원1"); //1차 캐시에 저장됨 em.persist(member); //1차 캐시에서 조회 Member findMember = em.find(Member.class, "member1"); - 한 트랜잭션 안에서만 1차 캐시가 작동하므로 큰 이점은 없다. 2. 영속 엔티티의 동.. 2021. 11. 24.