JPA는 개발자가 연관된 엔티티의 조회 시점을 선택할 수 있도록 두 가지 방법을 제공한다.
즉시 로딩과 지연 로딩이다.
즉시 로딩은 엔티티를 조회할 때 연관된 Entity도 동시 조회하는데, 연관된 엔티티를 사용하던 사용하지 않던 영속성 콘텍스트에 존재하지 않으면 데이터베이스에 접근한다.
설정 방법은 다음과 같다
@ManyToOne(fetch = FetchType.EAGER)
이 방법은 만약 회원과 팀 엔티티가 존재할 때 회원 클래스에서 팀을 설정할 때 사용하는 코드의 예시이다.
즉시 로딩시 회원과 팀 두 테이블을 조회해야 하므로 쿼리를 2번 실행한 것 같지만 실제로는 즉시 로딩 최적화를 위해 조인 쿼리를 사용한다. 여기서 회원과 팀 테이블을 조회할 때 OUTER JOIN을 사용하는데 팀에 소속되지 않은 회원도 조회하기 위해서이다. 만약 내부 조인을 사용하기 위해서는 외래 키에 NOT NULL 제약 조건을 걸고 JPA에게 알려줘야 한다.
@JoinColumn(name = "Team_ID", nullable = false) 설정을 해당 필드에 해주어야 한다.
지연 로딩은 연관된 엔티티를 실제 사용할 때 조회한다. 이 말은 회원이 팀 객체를 가져온 다음. 해당 팀의 메서드를 사용하는 시점에 JPA가 SQL을 호출해 팀 엔티티를 조회하는 것이다.
설정 방법은 다음과 같다.
@ManyToOne(fetch =FetchType.LAZY)
지연 로딩은 Member 엔티티가 Team객체를 객체 그래프 탐색으로 가져올 때 JPA는 우선적으로 Team의 프락시 객체를 가져온다. 이때 프록시 객체는 실제 객체를 참조하는 필드가 존재하며, 식별자 또한 가지고 있어야 한다.
Member member = em.find(Member.class,"id1");
Team team1 = memeber.getTeam();
team1.getName(); //이 시점에 데이터베이스와 연결해 가지고 온다.
하지만 조회 대상이 영속성 콘텍스트에 존재하면 프락시 객체를 사용할 의미가 없기 때문에 실제 객체를 사용한다.
만약 비즈니스 로직상에서 회원이 팀과 같이 사용하는 일이 많다면 즉시 로딩이 유리할 것이고, 그렇지 않다면 지연 로딩이 최적화 측면에서 좋을 것이다.
'데이터 접근 기술 > JPA' 카테고리의 다른 글
[JPA] JPQL 기본 문법과 SELECT 절 (0) | 2021.01.31 |
---|---|
[JPA] JPQL 소개 (0) | 2021.01.30 |
[JPA] 상속 관계 매핑 (0) | 2021.01.27 |
Entity 매핑 (0) | 2020.09.03 |
JPA 영속성 (0) | 2020.09.02 |
댓글