๐Ÿ˜ฎN+1 ๋ฌธ์ œ

Heoยท2023๋…„ 10์›” 18์ผ

์ž๋ฐ” ์ง„์˜์˜ ์Šคํ”„๋ง์œผ๋กœ API๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ์˜ ํŠน์„ฑ์„ ๊ฐ–๋Š” ์ž๋ฐ” ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ํ…Œ์ด๋ธ”๋กœ ๊ตฌ์„ฑ๋˜๋Š” RDB ๋ชจ๋ธ ๊ฐ„์˜ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.



์ด๋Ÿฌํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ž๋ฐ” ์ง„์˜์—์„œ๋Š” ORM์„ ํ†ตํ•ด ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•ด์ฃผ์–ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์–ด ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ SQL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋ณธ์—ฐ(๊ฐ์ฒด ์ง€ํ–ฅ)์˜ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” JPA(Java Persistence API)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ORM์„ ์‚ฌ์šฉํ•˜๋Š” Application์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ N+1 ๋ฌธ์ œ์ด๋‹ค.


์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

@Entity
public class School {
    @Id
    private String id;

    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    //@OneToMany(fetch = FetchType.LAZY)
    private List<Student> students;
}

@Entity
public class Student{
    @Id
    private String id;

    private String name;
}

์œ„์˜ Entity์—์„œ School๊ณผ Student๋Š” 1:N ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋•Œ School Record๊ฐ€ 1000๊ฐœ์ด๊ณ , School Entity๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ School Record๋ฅผ ์กฐํšŒํ•œ๋‹ค๋ฉด(findAll()๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ), 1๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” School์— ์†Œ์†๋˜์–ด ์žˆ๋Š” Student ์กฐํšŒ๋ฅผ ์œ„ํ•ด ์ด 1001๋ฒˆ(N+1)์˜ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

1. Join Fetch

2. @EntityGraph


์œ„์˜ ๋‘ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ์นดํƒ€์‹œ์•ˆ ๊ณฑ์ด ๋ฐœ์ƒํ•˜์—ฌ, ๊ฒฐ๊ณผ๊ฐ€ ์ค‘๋ณต ๋ฐœ์ƒํ•˜์—ฌ ์—ฌ์ „ํžˆ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๋ฅผ ๋ณด์™„ํ•˜๋ ค๋ฉด

  • ์ผ๋Œ€๋‹ค ํ•„๋“œ์˜ ํƒ€์ž…์„ Set์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์ฟผ๋ฆฌ์— distinct๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.



์ถœ์ฒ˜ :
https://ssup2.github.io/theory_analysis/DB_N+1_Problem/
https://dar0m.tistory.com/213

profile
๊พธ์ค€ํ•˜๊ฒŒ ๋ฐœ์ „ํ•˜๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€