본 글은 인프런의 김영한님 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편
을 수강하며 기록한 필기 내용을 정리한 글입니다.
-> 인프런
-> 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의
(GETTER, SETTER 생략)
< Member >
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "MEMBER_NAME")
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
< Team >
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
@Column(name = "TEAM_NAME")
private String name;
}
@ManyToOne
어노테이션에 fetch
속성을 설정하여 구현할 수 있다.@ManyToOne(fetch = FetchType.LAZY)
< Member >
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "MEMBER_NAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
Team team1 = new Team();
team1.setName("team1");
entityManager.persist(team1);
Member member1 = new Member();
member1.setName("member1");
member1.setTeam(team1);
entityManager.persist(member1);
entityManager.flush();
entityManager.clear();
Member findMember1 = entityManager.find(Member.class, member1.getId());
Member findMember1 = entityManager.find(Member.class, member1.getId());
System.out.println("team Class : " + findMember1.getTeam().getClass());
Member findMember1 = entityManager.find(Member.class, member1.getId());
System.out.println("team Name : " + findMember1.getTeam().getName());
fetch
속성을 FetchType.LAZY
로 설정하면, 해당 객체 필드를 프록시 객체로 설정하여 지연 로딩이 가능해 진다.fetch
속성으로 다음과 같이 구현될 수 있다.@ManyToOne(fetch = FetchType.EAGER)
< Member >
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "MEMBER_NAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
(1) 즉시 로딩을 활용하면 DB와의 소통이 무거워진다.
(2) 즉시 로딩은 JPQL에서 N + 1 문제를 일으킨다.
List<Member> members = entityManager.createQuery("select m from Member m", Member.class).getResultList();
SELECT * FROM MEMBER
(3) 지연 로딩으로 적용해도 즉시 로딩을 구현할 수 있는 방법이 있다.
List<Member> members = entityManager.createQuery("select m from Member m join fetch m.team", Member.class).getResultList();
@EntityGraph
어노테이션을 활용한다.@ManyToOne
@OneToOne
@OneToMany
@ManyToMany