๐CS/DB
[DB] N + 1 ๋ฌธ์
dar0m!
2021. 4. 11. 16:54
๊ฐ๋
ORM์์ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ฅ ํํ ์์ธ์ผ๋ก N+1 Problem์ด ์ธ๊ธ๋๋ค.
N+1 Problem์ ์ฟผ๋ฆฌ 1๋ฒ์ผ๋ก N๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋๋ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด ์ด N๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ์ ๋งํผ ๋ฐ๋ณตํด์ 2์ฐจ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฌธ์ ์ ๋๋ค.
- ORM : (Object Relational Mapping) ๊ฐ์ฒด-๊ด๊ณ ๋งคํ
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํ(์ฐ๊ฒฐ)ํด์ฃผ๋ ๊ฒ์ ๋งํ๋ค.
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ชจ๋ธ ๊ฐ์ ๋ถ์ผ์น๊ฐ ์กด์ฌํ๋ค.
- ORM์ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ค.
- Persistence API๋ผ๊ณ ๋ ํ ์ ์๋ค.
- JPA : (Java Persistence API)
- ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค
- ์ธํฐํ์ด์ค์ ๋ชจ์
- JPA ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ์คํ์์ค๊ฐ Hibernate
- ์ฅ์
- ๊ฐ์ฒด ์ค์ฌ ๊ฐ๋ฐ
- ์์ฐ์ฑ(๊ฐ๋จํ CRUD)
- ์ ์ง๋ณด์
- object์ RDB๊ฐ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ํด๊ฒฐ
ํด๊ฒฐ๋ฐฉ๋ฒ
- Join Fetch
- @EntityGraph
์์ ๋ ๋ฐฉ๋ฒ์ ๊ณตํต์ ์ผ๋ก ์นดํ์์ ๊ณฑ์ด ๋ฐ์ํ์ฌ ๊ฒฐ๊ณผ๊ฐ ์ค๋ณต ๋ฐ์ํ๊ฒ ๋๋ค.
- ์ด๋๋ ์ผ๋๋ค ํ๋์ ํ์ ์ Set์ผ๋ก ์ ์ธํ๋ค.
- List๊ฐ ๋ ์ ํฉํ๋ค๋ฉด, Query์ distinct๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
์ฐธ๊ณ
- joosjuliet.github.io/n+1/
- jojoldu.tistory.com/165
- gmlwjd9405.github.io/2019/02/01/orm.html
- gmlwjd9405.github.io/2019/08/04/what-is-jpa.html
JPA N+1 ๋ฌธ์ ๋ฐ ํด๊ฒฐ๋ฐฉ์
์๋ ํ์ธ์? ์ด๋ฒ ์๊ฐ์ JPA์ N+1 ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋ชจ๋ ์ฝ๋๋ Github์ ์๊ธฐ ๋๋ฌธ์ ํจ๊ป ๋ณด์๋ฉด ๋ ์ดํดํ๊ธฐ ์ฌ์ฐ์ค ๊ฒ ๊ฐ์ต๋๋ค. (๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ๋ Github์ ์ธ๋ฏธ
jojoldu.tistory.com