> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-basic/8./undefined-1.md).

# 즉시 로딩과 지연 로딩

Member를 조회할 때 Team도 함께 조회해야 할까?

그냥 Member를 조회했을 때 : Team의 모든 필드도 함께 조회된다!

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MedFj735kzCx5dPvZAH%2F-MedG6IzExpbmKjOu07W%2FScreen%20Shot%202021-07-15%20at%205.23.35%20PM.png?alt=media\&token=285ce8d0-40d6-445b-a799-01754a9cbce3)

지연 로딩 LAZY을 사용해서 프록시로 조회

```java
@Entity 
public class Member { 
 
 
private String name;   
@ManyToOne(fetch = FetchType.LAZY) //**  @JoinColumn(name = "TEAM_ID") 
private Team team; 
..
}
@Id  @GeneratedValue  private Long id; 
@Column(name = "USERNAME") 
```

![SQL 쿼리문](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-MedE75LeBnwNqqKhYIT%2F-MedFehL9SPVGk-oTgrj%2FScreen%20Shot%202021-07-15%20at%205.21.43%20PM.png?alt=media\&token=3fa00f61-42f8-432f-9f0d-8d290e5d48ae)

프록시 객체를 가져올 때가 아니라 프록시 객체의 찐 엔티티를 사용하는 시점에 초기화(DB 조회)\
proxy\_entity.getName(); 이렇게 엔티티 값을 조회하거나 사용하려고 접근할 때 초기화(DB조회)&#x20;

반대로, Member와 Team을 자주 함께 사용한다면?

즉시 로딩 EAGER를 사용해서 함께 조회

프록시와 즉시로딩 주의⭐️⭐️⭐️⭐️⭐️

* **가급적 지연 로딩만 사용**(특히 실무에서)
* 즉시 로딩을 적용하면 예상하지 못한 SQL이 발&#xC0DD;**(JPQL => N+1 문제 발생)**\
  Member를 조회할 때 즉시 로딩으로 인해 Team 객체(테이블)의 모든 필드(칼럼)을 조인해서 가져온 것처럼 즉시로딩은 하나의 객체만 조회하는 것이 아니라 그 객체와 연관관계가 있는 모든 필드들을 다 조인한다.\
  \=>즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.\
  **쿼리 1개 날렸는데 이로 인한 추가 쿼리가 N개 발생한다는 뜻.**
* **@ManyToOne, @OneToOne은 기본이 즉시 로딩 -> 수작업으로 모두 LAZY로 설정**\
  **(**@OneToMany, @ManyToMany(사용❌)는 기본이 지연 로딩)

**솔루션**

1. **fetchjoin : runtime에 원하는 테이블 조회 함께 함.(대부분 이 방법으로 해결)**\
   **ex) 어떤 화면에서는 회원과 팀 함께 조회하고, 다른 화면에서는 회원만 조회하는 경우**
2. **entity graph 애노테이션**
3. **batch size**
