๐ QueryDSL์์ Elasticsearch๋ก, ์ฑ์ฉ ๊ณต๊ณ ์กฐํ ์ฑ๋ฅ ๊ฐ์
๐ญ ๋ฌธ์ ์ธ์
์ฒ์์๋ MySQL + QueryDSL ๊ธฐ๋ฐ์ผ๋ก ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ์กฐํํ๊ณ ์์๋ค.
๋จ์ ์กฐํ ์ฑ๋ฅ ์์ฒด๋ ๋น๊ต์ ๋น ๋ฅธ ํธ์ด์๋ค.
ํ์ง๋ง ์๋น์ค๊ฐ ์ฑ์ฅํ๋ฉด์ ๋ถ๋ถ ๊ฒ์์ด๋ ์๋ ์์ฑ ๋ฑ ๊ฒ์ ํธ์ ๊ธฐ๋ฅ์ ํ์ฅํด์ผ ํ ํ์์ฑ์ด ์ปค์ก๊ณ , ์ด๋ฅผ QueryDSL๋ง์ผ๋ก ๊ตฌํํ๊ธฐ์ ๊ตฌ์กฐ์ ํ๊ณ๊ฐ ์์๋ค.
ํนํ ์ ์ฒด ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ๋์์ผ๋ก ํค์๋ ๊ธฐ๋ฐ ๊ฒ์์ด๋ ์ฌ์ฉ์ ์
๋ ฅ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ํ๋ ๊ธฐ๋ฅ์ Elastisearch๊ฐ ๋ ์ ํฉํ ๊ธฐ์ ์ด๋ผ๊ณ ํ๋จํ๋ค.
๐ Elasticsearch ๋์ ๋ฐฐ๊ฒฝ
์ฑ์ฉ ๊ณต๊ณ ๊ฒ์ ๊ธฐ๋ฅ์ ๋จ์ ํค์๋ ์กฐํ์ ๊ทธ์น์ง ์๊ณ ๋ถ๋ถ ๊ฒ์, ์๋ ์์ฑ ๋ฑ ๊ฒ์ ํธ์ ๊ธฐ๋ฅ์ ํ์ฅํ ํ์๊ฐ ์์๋ค.
ํ์ง๋ง MySQL + QueryDSL ๊ธฐ๋ฐ์์๋ LIKE, CONCAT, REDEXP ๋ฑ์ผ๋ก ๋ณต์กํ ์กฐ๊ฑด์ ๊ตฌ์ฑํด์ผ ํ๊ณ , ์ฑ๋ฅ ์ ํ๋ ์ธ๋ฑ์ค ํจ์จ์ฑ ๋ฌธ์ ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด๋ฐ ๊ตฌ์กฐ์์๋ ๊ฒ์ ์ ํ๋ ํฅ์, ๋น ๋ฅธ ์๋ต, ๊ฒ์์ด ๋จ์์ ์ ์ฐํ ํ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ์ ํ๊ณ๊ฐ ์์๋ค.
Elasticsearch๋ n-gram, edge n-gram ๋ฑ ๊ฐ๋ ฅํ ํ
์คํธ ๋ถ์ ๊ธฐ๋ฅ๊ณผ ๋ถ์ฐ ์ธ๋ฑ์ฑ ๊ตฌ์กฐ๋ฅผ ํตํด ๋น ๋ฅธ ๊ฒ์ ์๋ต ์๋๋ฅผ ์ ๊ณตํ๋ค.
๋ํ ์ ํ๋, ๊ฐ์ค์น, ์ ์ฌ๋ ๊ธฐ๋ฐ ๊ฒ์ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์,
๊ฒ์ ๊ธฐ๋ฅ์ ์ ์ฐ์ฑ๊ณผ ์ฑ๋ฅ ๋ชจ๋๋ฅผ ๋ง์กฑ์ํค๋ ๊ธฐ์ ๋ก ํ๋จ๋์ด ๋์
ํ๊ฒ ๋์๋ค.
๐ง ๊ฐ์ ์์ด๋์ด: ๊ฒ์์ ํนํ๋ Elasticsearch๋ก ์ ํํ์!
QueryDSL์ MySQL ๊ธฐ๋ฐ์ผ๋ก ๋ณต์กํ ์กฐ๊ฑด ๊ฒ์์ด๋ ์กฐ์ธ ์ฒ๋ฆฌ์๋ ๊ฐ์ ์ด ์์ง๋ง, ๊ฒ์ ์ ์ฉ ๊ธฐ๋ฅ์ด๋ ์ค์๊ฐ ์กฐํ ์ฑ๋ฅ์๋ ํ๊ณ๊ฐ ์์๋ค.
๋ฐ๋ฉด, Elasticsearch๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ฑํ์ฌ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ๊ณ ์๊ณ ๋ถ์ฐ ์ํคํ
์ฒ ๊ธฐ๋ฐ์ผ๋ก ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํนํ๋์ด ์์ด
๊ฒ์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ ๋ชจ๋์์ ๋ ์ ํฉํ ์ ํ์ด์๋ค.
โ ๋ฐ๋ผ์, ์ฑ์ฉ ๊ณต๊ณ ๊ฒ์ ๊ธฐ๋ฅ์ Elasticsearch ๊ธฐ๋ฐ์ผ๋ก ์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๐ง ํ ์คํธ ํ๊ฒฝ
- Elasticsearch ๋ฒ์ : 8.17.2
- ํ ์คํธ ๋๊ตฌ: Apache JMeter
- ์์ฒญ ๋ฐฉ์: HTTP GET
- ์์ฒญ ์: 200๊ฐ (100๊ฐ์ฉ 2ํ)
- ์๋ฒ ํ๊ฒฝ: ๋ก์ปฌ ์๋ฒ (localhost)
- ํด๋ผ์ด์ธํธ ํ๊ฒฝ: JMeter
๐ ์ฑ๋ฅ ๋น๊ต ๊ฒฐ๊ณผ
ํญ๋ชฉ | QueryDSL | Elasticsearch | ํฅ์๋ฅ |
ํ๊ท ์๋ต ์๊ฐ | 48ms | 14ms | 70.8% |
์ต์ ์๋ต ์๊ฐ | 39ms | 9ms | 77% |
์ต๋ ์๋ต ์๊ฐ | 117ms | 41ms | 65% |
ํ์ค ํธ์ฐจ | 9.37ms | 3.28ms | 64% |
์ด๋น ์ฒ๋ฆฌ๋ | 8.63 req/sec | 9.5 req/sec | + 10.1% |
์์ ๋ | 8.63KB | 65.01KB | + 653.5% |
์ ์ก ๋ฐ์ดํฐ | 0.57KB | 3.94KB | + 591.2% |
โ Elasticsearch ๋์ ํ ์ ๋ฐ์ ์ธ ์๋ต ์๋์ ์์ ์ฑ, ์ฒ๋ฆฌ๋์ด ๋ชจ๋ ๊ฐ์
๐ ๋ถ์ ๋ฐ ํด์
- ์๋ต ์๊ฐ
Elasticsearch ์ ์ฉ ํ, ํ๊ท ์๋ต ์๊ฐ์ ์ฝ 70.8%, ์ต๋ ์๋ต ์๊ฐ์ ์ฝ 65% ๊ฐ์ ๋๋ฉฐ
์ค์๊ฐ ๊ฒ์ ์๋น์ค์ ์ ํฉํ ์๋ต ์ฑ๋ฅ์ ํ๋ณดํ๋ค. - ํ์คํธ์ฐจ
์๋ต ์๊ฐ์ ๋ณ๋ ํญ์ด ์ค์ด๋ ๊ฒ๋ ์ฃผ๋ชฉํ ๋งํ๋ค.
Elasticsearch๋ QueryDSL์ ๋นํด ๋ณด๋ค ์์ ์ ์ด๊ณ ์ผ๊ด๋ ์ฑ๋ฅ์ ๋ณด์ฌ์คฌ๋ค. - ์ด๋น ์ฒ๋ฆฌ๋
์ด๋น ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ ์๊ฐ ์ฝ 10% ์ฆ๊ฐํ์ฌ,
ํธ๋ํฝ์ด ๋ง์ ์ํฉ์์๋ ๋ ๋ง์ ์์ฒญ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. - ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋
Elasticsearch๋ ๋ฐ์ดํฐ ์์ ๋ฐ ์ ์ก๋์ด ์๋์ ์ผ๋ก ๋์์ผ๋ฉฐ,
๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๋ฌํ ์ ์๋ ๊ตฌ์กฐ์์ ์๋ฏธํ๋ค.
Elasticsearch๋ ๋จ์ํ ๋น ๋ฅด๊ธฐ๋ง ํ ๊ฒ์ด ์๋๋ผ
๋ ์์ ์ ์ด๊ณ , ํ์ฅ์ฑ ์๋ ๊ฒ์ ํ๊ฒฝ์ ๋ง๋ค์ด์ฃผ๋ ๋ฐ ํจ๊ณผ์ ์ธ ๊ธฐ์ ์์ ํ์ธํ ์ ์์๋ค.
๐ ๊ธฐ์ ์ ์ฐจ์ด ์์ฝ
ํญ๋ชฉ | MySQL + QueryDSL | Elasticsearch |
์ฒ๋ฆฌ ๊ตฌ์กฐ | ๋์คํฌ ๊ธฐ๋ฐ RDB | ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ธ๋ฑ์ค |
๊ฐ์ | ๋ณต์กํ ์กฐ์ธ, ํธ๋์ญ์ | ๋น ๋ฅธ ๊ฒ์, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ |
์ฝ์ | ๋๋ ์กฐํ ์ ๋๋ฆผ | ๋ณต์กํ ๋ก์ง ์ฒ๋ฆฌ์ ๋ถ์ ํฉ |
์ ํฉํ ์ฉ๋ | ์์ธ ํํฐ๋ง, ๊ด๋ฆฌ | ๊ฒ์, ์ถ์ฒ, ํค์๋ ๊ธฐ๋ฐ ํ์ |
โ ์ ๋ฆฌ ๋ฐ ํ๊ณ
Elasticsearch ์ ํ์ผ๋ก ๋จ์ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ๋์ด์,
๊ฒ์ ๊ธฐ๋ฅ ์์ฒด๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ค์ฌ์ด ๋๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ ์ ์์๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋น ๋ฅธ ์๋ต ์๋, ๋์ ์ฒ๋ฆฌ๋, ์ผ๊ด๋ ์ฑ๋ฅ๊น์ง ๋ชจ๋ ํ๋ณดํ๋ฉฐ ๊ฒ์ ๊ธฐ๋ฅ์ ํ์ง์ ์ ๋ฐ์ ์ผ๋ก ํฅ์์ํฌ ์ ์์๋ค.
๐ MySQL ๊ธฐ๋ฐ QueryDSL ๊ฒ์์ ์ ๋ฐํ ์กฐ๊ฑด ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ์๋ ๊ฐ์ ์ด ์์์ง๋ง, ๊ฒ์ ์์ฒด๊ฐ ํต์ฌ์ธ ์๋น์ค์์๋ Elasticsearch๊ฐ ํจ์ฌ ๋ ์ ํฉํ๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ๊ฒ ๋์๋ค.