이번 과제는 좀 공을 들여야 하는 문제가 있는 거 같다.
N+1은 말 그대로 한번 더 실행을 하는 문제이다.
쿼리의 의도치 않은 발생으로 인한 성능 저하라고 정의를 하면 될거 같다.
(차라리 그냥 쿼리를 직접 쓰고 실행 시키는 게 나을 듯 싶다...)
TBL_TEAM
TBL_MEMBERS
모든 코드를 다 보여주고 싶지만 ... 구조만 보고 넘어가자
(gpt한테 트리 보여주고 테이블 보여주면 다 짜주기는 함...)

엔티티 구성까지만 이번에 보여주고 N+1의 오류를 직접 보고 해결해보는 시간은 다음에 가져보자
@Getter
@Setter
@Entity
@Table(name = "TBL_TEAM")
@NoArgsConstructor
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "team", fetch = FetchType.EAGER)
private List<Member> members = new ArrayList<>();
public Team(int id, String name) {
this.id = id;
this.name = name;
}
}
@Getter
@Setter
@Entity
@Table(name = "TBL_MEMEBER")
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int memberid;
@Column
private String membername;
private String memberage;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "team_id")
private Team team;
public Member(int memberid, String membername, String memberage) {
this.memberid = memberid;
this.membername = membername;
this.memberage = memberage;
}
}
위의 테이블로 정말 단순히 다음 쿼리로 데이터를 받아온다
@Query("select m from Team m where m.name = :name ")
public List<Team> findTeamByName(String name);
결과를 봅시다...
Hibernate:
/* select
m
from
Team m */
select t1_0.id, t1_0.name
from tbl_team t1_0
Hibernate:
select m1_0.team_id, m1_0.memberid, m1_0.memberage, m1_0.membername
from tbl_memeber m1_0 where m1_0.team_id=?
Hibernate:
select m1_0.team_id, m1_0.memberid, m1_0.memberage, m1_0.membername
from tbl_memeber m1_0 where m1_0.team_id=?
Hibernate:
select m1_0.team_id, m1_0.memberid, m1_0.memberage, m1_0.membername
from tbl_memeber m1_0 where m1_0.team_id=?
Hibernate:
select m1_0.team_id, m1_0.memberid, m1_0.memberage, m1_0.membername
from tbl_memeber m1_0 where m1_0.team_id=?
Hibernate:
select m1_0.team_id, m1_0.memberid, m1_0.memberage, m1_0.membername
from tbl_memeber m1_0 where m1_0.team_id=?
이게 바로 N+1 지연을 사용해도 이 문제는 계속 발생하게 된다.
그래서 사용하는게 @EntityGraph
요건 다음 시간에~