๐ค ์๋ก
์งํ์ค์ธ ์ ๋ฝ์ ํ๋ก์ ํธ๊ฐ ์ด์ ์ง์ ๋จ๊ณ๊น์ง ์ง์ ํ๋๋ฐ์, ์ ๋ง ์ฌ์ฉ์๋ค์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ ์ ์ฌ๊ฐํ๊ฒ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ๋ถ๋ถ๋ค์ ๋ํด์๋ ์์ ์ด ๋์ด์ผ ์์ ํ๊ฒ ๋ฐฐํฌํ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฌ๋ฌ ๋ฌธ์ ๋ค ์ค ๊ฐ์ฅ ๋จผ์ ๋์ ๋ค์ด์จ ๋ฌธ์ ๋ ๋ฐ๋ก ์ฟผ๋ฆฌ์์ต๋๋ค.
์ ํฌ๋ ์ฟผ๋ฆฌ์ ๋ฐ์ ํ์๋ฅผ ๋ก๊น ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์๊ณ , ์ด๋ฅผ ํตํด ์ฟผ๋ฆฌ๊ฐ ํน์ ํ์ ์ด์์ผ๋ก ๋ฐ์ํ๋ฉด ๊ฒฝ๋ก ๋ก๊ทธ๋ฅผ ์ฐ์ด์ฃผ๋๋ก ํ์์ต๋๋ค.
4์ฐจ ๋ฐ๋ชจ๋ฐ์ด ๋, ๊ทธ๋ฌ๋๊น ์ฐํ ์ฝ ํฌ๋ฃจ๋ค์ ๋์์ผ๋ก ์๋น์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๊ณต๊ฐํ์ ๋น์ ์๋ฒ์ ๋ก๊ทธ๋ฅผ ํ์ธํด๋ณด๋ ์ฟผ๋ฆฌ๊ฐ 130๋ฒ๊น์ง ์ฐํ์๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
(์ง์ง ์๊ฐ ์๋ชป๋ณธ๊ฑด๊ฐ ์ถ์...)
๊ธฐ๋ณธ 20~30๋ฒ์ ์ฐ์ต๊ณ 90๋ฒ, 100๋ฒ์ด ๋์ด๊ฐ๋ ์ฟผ๋ฆฌ๋ค์ด ๋ฐฅ๋จน๋ฏ์ด ๋ฐ์ํ๋๋ฐ์, ๊ทธ๋ ๋น์์๋ ์ฌ์ฉ์๊ฐ ๋ง์ง ์๊ธฐ๋ ํ๊ณ ๋ฐ์ดํฐ๋ ๋ง์ด ์์๊ธฐ์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋์ง๋ ์์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ฐฐํฌ๋ฅผ ํ๊ฒ ๋๋ค๋ฉด ๋ง์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ๊ฒ์ด๊ณ , ํ ๋ช ์ ์ฌ์ฉ์๊ฐ ํ ๋ฒ ์์ฒญํ ๋๋ง๋ค ์ฟผ๋ฆฌ๊ฐ 100๋ฒ์ด ๋๊ฒ ๋ฐ์ํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด ํ๋ฆผ์์ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
๋ํ ๋ฐ์ดํฐ๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ์์ข์์ง ๊ฒ์ด๋ผ ํ๋จํ์ฌ, ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค ํฉ๋๋ค.
๐ค ํ ์คํธ ์ํฉ ๊ฐ์
ํ ์คํธ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
- ์๋น์ค์ 1์ฐจ์ ์ต์ข ๋ชฉํ์ธ ๋ชจ๋ ์ ๋ฝ ์์์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ์ํฉ
๋ชจ๋ ์ ๋ฝ ์์์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ๋ฝ: 50๋ช
์์์ ์: 20000๊ฐ
๋์์ ์: 20000๊ฐ
์์์ ๋น ์ด๋ฏธ์ง ์: 5๊ฐ
ํ๋์ ํ์์ด ํ๊ท 100๊ฐ ์ ๋์ ์์์ ์ ๋ํด ์ข์์ ๋๋ฆ
(2๋ง๊ฐ์ธ๊ฑฐ ์ด๋ป๊ฒ ์์์๊น์? ใ ใ ....๐ฅฒ)
ํ ์คํธ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค: EC2์ ์ค์น, Mysql ์ฌ์ฉ
์ ํ๋ฆฌ์ผ์ด์ : ๋ก์ปฌ์์ ์คํ (Mac m1 pro)
๐ค ํ์ฌ ์ฝ๋์ ์ฑ๋ฅ
์ด์ ์ฃผ์ API๋ณ๋ก ์ฟผ๋ฆฌ์ ๋ฐ์ ํ์๋ฅผ ์ ๋ฆฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ณ ์์์ ์ ์ฒด ์กฐํ api
(ํด๋น API์ ๊ธฐ๋ณธ ํ์ด์ง ์ฌ์ด์ฆ๋ 18๊ฐ์ ๋๋ค.)
๐ณ ์์์ ์์ธ ์กฐํ api
๐ณ ์์์ ์ ์ฃผ๋ณ ์์์ ์กฐํ api
(ํด๋น API์ ๊ธฐ๋ณธ ํ์ด์ง ์ฌ์ด์ฆ๋ 4๊ฐ์ ๋๋ค.)
API | ์ฟผ๋ฆฌ ๊ฐ์ | ์์์๊ฐ(๋จ์: ms) |
์์์ ์ ์ฒด ์กฐํ (๋น์ธ์ฆ) |
36๋ฒ | 1160ms |
์์์ ์ ์ฒด ์กฐํ (์ธ์ฆ) |
137๋ฒ (์ข์์ 100๊ฐ) | 2946ms |
์์์ ์์ธ ์กฐํ (๋น์ธ์ฆ) |
6๋ฒ | 231ms |
์์์ ์์ธ ์กฐํ (์ธ์ฆ) |
7๋ฒ | 235ms |
์์์ ์ ์ฃผ๋ณ ์์์ ์กฐํ (๋น์ธ์ฆ) |
11๋ฒ | 462ms |
์์์ ์ ์ฃผ๋ณ ์์์ ์กฐํ (์ธ์ฆ) |
112๋ฒ (์ข์์ 100๊ฐ) | 2328ms |
๐ค ๋ฐ์ํ๋ ์ฟผ๋ฆฌ ๋ถ์
๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ์์์ ์ ์ฒด ์กฐํ API์ ๊ฐ์ ๊ณผ์ ๋ง์ ๊ธฐ๋กํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ ์ด๋ ํ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋์ง ๋ณด๊ธฐ ์ํ์ฌ, ์ฟผ๋ฆฌ ๋ก๊ทธ ์ต์ ์ ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
logging:
level:
org.hibernate.orm.jdbc.bind: TRACE
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
use_sql_comments: true
highlight_sql: true
๊ฐ์ฅ ๋จผ์ ์์์ ์ ์กฐํํ๋ ์ฟผ๋ฆฌ์ ์์์ ์ ์ ์ฒด ์๋ฅผ ์ธ๊ธฐ ์ํ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
์ดํ Video๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
ํด๋น ์ฟผ๋ฆฌ๋ ์๋ ์ฝ๋์์ ๋ฐ์ํฉ๋๋ค.
์ ์ฟผ๋ฆฌ๊ฐ ์ด 18๋ฒ ๋์ํ ๊ฒ์ ํ์ธํ ์ ์์๋๋ฐ์, ์์ธ์ ์๋ ์ฝ๋์์ต๋๋ค.
DAO์์๋ ํ๋ก์ ์ ์ ํตํด DTO๋ก ๋ฐ๋ก ์กฐํํ์๊ธฐ์, ์์์ฑ ์ปจํ ์คํธ์ restaurant์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์์ง ์์๊ณ , ๋ฐ๋ผ์ ์ด๋ก ์ธํด video.restaurant().id() ํธ์ถ ์ ์ง์ฐ ๋ก๋ฉ์ผ๋ก Restaurant์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค.
(๋น๋์ค ์กฐํ ์ฟผ๋ฆฌ 1 ๋ฒ + ์กฐํ๋ ๋น๋์ค์ ์ ๋งํผ ์ฐ๊ด๋ ์์์ ์กฐํ ์ฟผ๋ฆฌ ๋ฐ์(N ๋ฒ))
๐ก ์ ์ฝ๋์์ Restaurant์ ID(PK, ์๋ณ์)๋ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์๋๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ํฌ๋ getId()๊ฐ ์๋ id()๋ผ๋ ๋ค์ด๋ฐ์ผ๋ก getter()๋ฅผ ์ฌ์ฉํ์๊ธฐ์, ์ด๋ ์ผ๋ฐ ๋ฉ์๋์ ๋์ผํ๊ฒ ๋์ํ์ฌ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
getId()๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ค๋ฉด ์ ๋ถ๋ถ์์๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ด์ด์ ์์์ ์ฌ์ง๋ค์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
์ด๋ ์๋ ์ฝ๋์์ ๋ฐ์ํฉ๋๋ค.
์ดํ ํ์ id๋ก ์ข์์๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด๋น ๋ถ๋ถ์ ์๋ ์ฝ๋์์ ๋ฐ์ํฉ๋๋ค.
์ดํ ์ ์ฟผ๋ฆฌ๊ฐ ์ ๋ง ๋ง์ด ๋ฐ์ํฉ๋๋ค.
๋ช์ญ๊ฐ๊ฐ ๋์ด์ ์ธ๋๊ฑด ํฌ๊ธฐํ์ต๋๋ค..๐ฅฒ
์ด๋์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํด๋ณด๋ ์๋ ์ฝ๋์์ต๋๋ค.
์ ์ฟผ๋ฆฌ๋ ์๋ ์ฝ๋์์ ๋ฐ์ํ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ๋ฝ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ 11๋ฒ ๋ฐ์ํ์์ต๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด๋ ๋ค์ ๋ถ๋ถ์ด์์ต๋๋ค.
์ด์ ์ด๋ค์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ ์ ์, ์ฐธ๊ณ ์ฉ์ผ๋ก getId()์ id()๋ฅผ ๋น๊ตํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ณ ์ฐธ๊ณ - id() ๋์ getId()๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ ์ค์ด๊ธฐ
์์์ ์ ๋ํ ์ ๋ณด๋ dto๋ก ํ๋ก์ ์ ํ์ฌ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์, ์ดํ ์ฝ๋๋ค์์๋ ์์์ ์ ๋ํ ์ ๋ณด๋ ํ์๊ฐ ์๊ณ ๋จ์ง Id๋ง์ ์ฌ์ฉํ ๋ฟ์ ๋๋ค.
๋ฐ๋ผ์ ์กฐํ๋ ์์์ ๋ค์ ๋ชจ๋ ์ง์ฐ๋ก๋ฉ ์ํค์ง ์๋๋ค๋ฉด ์ฟผ๋ฆฌ ์๋ฅผ ์ค์ผ ์ ์๋๋ฐ์, ์ค์ ๋ก id()๋ง getId()๋ก ๋ฐ๊ฟ์ฃผ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ์ ๊ฐ์๊ฐ 36๊ฐ์์ 19๋ฒ์ผ๋ก ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ ํ ์ฟผ๋ฆฌ์ ์๊ฐ ๋ง์ด ๋ฐ์ํ๋ฉฐ, ์ด์ ๋ถํฐ ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ค N + 1 ๋ฌธ์ ํด๊ฒฐ
๊ฐ์ฅ ๋จผ์ ํด๊ฒฐํด์ผ ํ ๋ถ๋ถ์, ์ด 18๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ์ ์ฝ๋์ ๋๋ค.
์ด๋ videoQueryDaoSupport.findAllByRestaurantIdIn()์ ๋ฉ์๋์ ๊ฒฐ๊ณผ๋ก ์กฐํ๋ 18๊ฐ์ ๋น๋์ค์ ๋ํ์ฌ, ์ด๋ค์ ์ํํ์ฌ ๊ฐ๊ฐ ์ด๋ค๊ณผ ์ฐ๊ด๋ ์์์ ๋ค์ ์กฐํํ ๋ ๋ฐ์ํฉ๋๋ค.
์ N + 1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, Video๋ฅผ ์กฐํํ๋ ๋์์ Restaurant๋ ์กฐํํ๊ฒ ํด์ผ ํฉ๋๋ค.
(ํน์ id() ๋์ getId()๋ฅผ ์ฌ์ฉํ๊ฒ ํ ์ ์์ผ๋, getter์ ๋ํ ๋ค์ด๋ฐ์ ๋ฐ๊พธ์ง ์๊ณ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.)
JPQL์ ์ง์ ์์ฑํ์ฌ fetch join์ ์ ์ฉํ ์๋ ์๊ฒ ์ง๋ง, ์ ๋ @EntityGraph๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
@EntityGraph๋ฅผ ์ ์ฉํ ์ํ์์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ํ์ธํด๋ณด๋, ์ฟผ๋ฆฌ๊ฐ ํ๋๋ ์ค์ด๋ค์ง ์์ ๊ฒ์ ํ์ธํ์ต๋๋ค.
์์ธ์ ์ดํด๋ณด๋ ์ ๋ถ๋ถ์์ N+1 ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์์์ง๋ง, ์ดํ ์งํ๋๋ ์ฝ๋ ์ค ์๋ ์ฝ๋์์ ์์์ ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ง์ด ๋ฐ์ํ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
์ด๋ ์์์ ์ ์ฒด ์กฐํ API ๋ด๋ถ์์ ์กฐํ(์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ)๋์ด์ผ๋ ์์์ ์ ๊ฐ์๋ ๋์ผํ๋ฏ๋ก, ์์์ ์ ์กฐํํ๋ ์ฟผ๋ฆฌ์ ๊ฐ์๊ฐ ๋ฌ๋ผ์ง์ง ์์ ๋ฐ์ํ ์ผ์ ๋๋ค.
์ ์ฝ๋์๋ @EntityGraph๋ฅผ ์ ์ฉํ์ฌ N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด์ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฟผ๋ฆฌ๊ฐ ๋งค์ฐ ๋ง์ด(์ข์์์ ๊ฐ์ ๋งํผ) ๊ฐ์ํ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ง๋ ์ฟผ๋ฆฌ๋ 19๋ฒ์ด๋ ๋ฐ์ํ๋๋ฐ์, ๊ณ์ํด์ ํด๊ฒฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํด๊ฒฐํด์ผ ํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ธ์ ์กฐํ๋ ์์(Video)๊ณผ ์ฐ๊ด๋ ์ ๋ฝ(Celeb)๋ค์ด ์ง์ฐ๋ก๋ฉ ๋๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
์ด๋ ๋น๋์ค๋ฅผ ์กฐํํ ๋ ์ ๋ฝ๋ค๋ ํจ๊ป ์กฐํํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ๋ ๊ธฐ์กด @EntityGraph์ attributePaths์ celeb์ ์ถ๊ฐํด ์ค์ผ๋ก์จ ํด๊ฒฐํ์์ต๋๋ค.
์ต์ข ์ ์ผ๋ก, ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ๋์์ต๋๋ค.
๐ค ๊ฐ์ ๊ฒฐ๊ณผ
๐ณ ์์์ ์ ์ฒด ์กฐํ api
(ํด๋น API์ ๊ธฐ๋ณธ ํ์ด์ง ์ฌ์ด์ฆ๋ 18๊ฐ์ ๋๋ค.)
๐ณ ์์์ ์์ธ ์กฐํ api
๐ณ ์์์ ์ ์ฃผ๋ณ ์์์ ์กฐํ api
(ํด๋น API์ ๊ธฐ๋ณธ ํ์ด์ง ์ฌ์ด์ฆ๋ 4๊ฐ์ ๋๋ค.)
API | ์ฟผ๋ฆฌ ๊ฐ์ | ์์์๊ฐ(๋จ์: ms) | ||
๊ฐ์ ์ | ๊ฐ์ ํ | ๊ฐ์ ์ | ๊ฐ์ ํ | |
์์์ ์ ์ฒด ์กฐํ (๋น์ธ์ฆ) |
36๋ฒ | 5๋ฒ | 1160ms | 533ms |
์์์ ์ ์ฒด ์กฐํ (์ธ์ฆ) |
137๋ฒ | 6๋ฒ | 2946ms | 589ms |
์์์ ์์ธ ์กฐํ (๋น์ธ์ฆ) |
6๋ฒ | 5๋ฒ | 231ms | 200ms |
์์์ ์์ธ ์กฐํ (์ธ์ฆ) |
7๋ฒ | 6๋ฒ | 235ms | 200ms |
์์์ ์ ์ฃผ๋ณ ์์์ ์กฐํ (๋น์ธ์ฆ) |
11๋ฒ | 5๋ฒ | 462ms | 267ms |
์์์ ์ ์ฃผ๋ณ ์์์ ์กฐํ (์ธ์ฆ) |
112๋ฒ | 6๋ฒ | 2328ms | 298ms |
์ด๋์ ๋์ ๋น์ฝ(์์์ ๊ฐ์๊ฐ 2๋ง๊ฐ๋ผ๋)์ด ์์์ผ๋, ์ฑ๋ฅ์ด ๋ง์ด ์ข์์ง ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.