์๋ฐ ์ง์์ ์คํ๋ง์ผ๋ก 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;
}
์ด ๋ School Record๊ฐ 1000๊ฐ์ด๊ณ , School Entity๋ฅผ ํธ์ถํ ํ School Record๋ฅผ ์กฐํํ๋ค๋ฉด(findAll()๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์), 1๋ฒ์ ์ฟผ๋ฆฌ๋ก ํด๋น ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ธ์ฌ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ์ค์ ๋ก๋ School์ ์์๋์ด ์๋ Student ์กฐํ๋ฅผ ์ํด ์ด 1001๋ฒ(N+1)์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ฒ ๋๋ฉด์ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์์ ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ฒฐ๊ตญ์๋ ์นดํ์์ ๊ณฑ์ด ๋ฐ์ํ์ฌ, ๊ฒฐ๊ณผ๊ฐ ์ค๋ณต ๋ฐ์ํ์ฌ ์ฌ์ ํ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฅผ ๋ณด์ํ๋ ค๋ฉด
์ถ์ฒ :
https://ssup2.github.io/theory_analysis/DB_N+1_Problem/
https://dar0m.tistory.com/213