[Diary] N+1 검증 (1)

Shaun.the.sheep·2025년 7월 24일

[Dairy] S.C.C TIL

목록 보기
13/22

들어가기 전...

이번 과제는 좀 공을 들여야 하는 문제가 있는 거 같다.
N+1은 말 그대로 한번 더 실행을 하는 문제이다.
쿼리의 의도치 않은 발생으로 인한 성능 저하라고 정의를 하면 될거 같다.
(차라리 그냥 쿼리를 직접 쓰고 실행 시키는 게 나을 듯 싶다...)

Structure of Code

테이블 구성

  • TBL_TEAM

    • ID INT
    • NAME VARCHAR(20)

  • TBL_MEMBERS

    • MEMBER_ID INT
    • TEAM_ID INT
    • MEMBERAGE INT
    • MEMBERNAME VARCHAR(10)


      정말 N+1을 구분할 수 있게 끔만 구성을 해놨다

    모든 코드를 다 보여주고 싶지만 ... 구조만 보고 넘어가자
    (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

요건 다음 시간에~

0개의 댓글