728x90
지연 로딩
멤버 에서 팀 정보가 잘 사용되지 않을 경우
- 지연 로딩 (LAZY)을 사용해서 프록시 조회
- fetch = FetchType.LAZY
//Team을 프록시 객체에서 조회
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member1 = new Member();
member1.setUsername("member1");
member1.setTeam(team);
em.persist(member1);
em.flush();
em.clear();
Member m = em.find(Member.class, member1.getId());
System.out.println("m = " + m.getTeam().getClass());
System.out.println("=======================");
m.getTeam().getName();
System.out.println("=======================");

Team이 프록시 객체로 조회되고 실제 DB에 쿼리가 날라가는 시점은 team을 실제로 사용하는 시점에 나간다 (m.getTeam.getName())
- 프록시 초기화는 me.getTeam.getName()에서 일어난다.
즉시 로딩
멤버 에서 팀 정보가 자주 사용되지 않을 경우
- 즉시 로딩 (EAGER)을 사용해서 프록시 조회
- fetch = FetchType.EAGER
//Team을 프록시 객체에서 조회
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member1 = new Member();
member1.setUsername("member1");
member1.setTeam(team);
em.persist(member1);
em.flush();
em.clear();
Member m = em.find(Member.class, member1.getId());
System.out.pringln("m = " + m.getTeam().getClass());
System.out.println("==============");
m.getTeam().getName(); //초기화
System.out.println("====================");
tx.commit();

em.find(Member.class, member1.getId()) 조회할 때 member와 team을 조인 한다.
프록시와 즉시로딩 주의
- 가급적 지연 로딩만 사용 (특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 sql 발생
- 조인을 하지 않았다고 생각했는데 실제 DB에서는 조인을 해서 테이블을 가져오고 있다.
- 많은 테이블을 조인하면 성능 저하가 발생할 수 있다.
- 즉시 로딩은 jpql에서 N + 1 문제를 일으킨다
- select m from Member m 해서 jpql을 사용하면 member만 조회하다가 Member 엔티티에 Team 필드가 즉시 로딩으로 되어 있으면 member 만큼 team도 가져와야한다.
- 아래 쿼리처럼 team이 member 개수만큼 출
select * from Member
select t.* from Team t, Member m where t.team_id = m.team_id
- @ManyToOne, @OneToOne은 기본이 즉시 로딩 → lazy로 설정
- @OneToMany, @ManyToMany는 기본이 지연로딩
728x90
'JPA' 카테고리의 다른 글
갑 타입 (1) | 2023.11.10 |
---|---|
영속성 전이: CASCAED (0) | 2023.11.09 |
프록시 (1) | 2023.11.09 |
고급 매핑 (0) | 2023.11.09 |
양방향 연관관계와 연관관계의 주인 (0) | 2023.11.02 |
728x90
지연 로딩
멤버 에서 팀 정보가 잘 사용되지 않을 경우
- 지연 로딩 (LAZY)을 사용해서 프록시 조회
- fetch = FetchType.LAZY
//Team을 프록시 객체에서 조회 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team;
Team team = new Team(); team.setName("teamA"); em.persist(team); Member member1 = new Member(); member1.setUsername("member1"); member1.setTeam(team); em.persist(member1); em.flush(); em.clear(); Member m = em.find(Member.class, member1.getId()); System.out.println("m = " + m.getTeam().getClass()); System.out.println("======================="); m.getTeam().getName(); System.out.println("=======================");

Team이 프록시 객체로 조회되고 실제 DB에 쿼리가 날라가는 시점은 team을 실제로 사용하는 시점에 나간다 (m.getTeam.getName())
- 프록시 초기화는 me.getTeam.getName()에서 일어난다.
즉시 로딩
멤버 에서 팀 정보가 자주 사용되지 않을 경우
- 즉시 로딩 (EAGER)을 사용해서 프록시 조회
- fetch = FetchType.EAGER
//Team을 프록시 객체에서 조회 @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team;
Team team = new Team(); team.setName("teamA"); em.persist(team); Member member1 = new Member(); member1.setUsername("member1"); member1.setTeam(team); em.persist(member1); em.flush(); em.clear(); Member m = em.find(Member.class, member1.getId()); System.out.pringln("m = " + m.getTeam().getClass()); System.out.println("=============="); m.getTeam().getName(); //초기화 System.out.println("===================="); tx.commit();

em.find(Member.class, member1.getId()) 조회할 때 member와 team을 조인 한다.
프록시와 즉시로딩 주의
- 가급적 지연 로딩만 사용 (특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 sql 발생
- 조인을 하지 않았다고 생각했는데 실제 DB에서는 조인을 해서 테이블을 가져오고 있다.
- 많은 테이블을 조인하면 성능 저하가 발생할 수 있다.
- 즉시 로딩은 jpql에서 N + 1 문제를 일으킨다
- select m from Member m 해서 jpql을 사용하면 member만 조회하다가 Member 엔티티에 Team 필드가 즉시 로딩으로 되어 있으면 member 만큼 team도 가져와야한다.
- 아래 쿼리처럼 team이 member 개수만큼 출
select * from Member select t.* from Team t, Member m where t.team_id = m.team_id
- @ManyToOne, @OneToOne은 기본이 즉시 로딩 → lazy로 설정
- @OneToMany, @ManyToMany는 기본이 지연로딩
728x90
'JPA' 카테고리의 다른 글
갑 타입 (1) | 2023.11.10 |
---|---|
영속성 전이: CASCAED (0) | 2023.11.09 |
프록시 (1) | 2023.11.09 |
고급 매핑 (0) | 2023.11.09 |
양방향 연관관계와 연관관계의 주인 (0) | 2023.11.02 |