๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ๏ธ Today I Learned(TIL)/์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[ TIL ] ์ตœ์ข… ํ”„๋กœ์ ํŠธ_Day 9

by carrot0911 2025. 2. 19.

์˜ค๋Š˜ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ๋“ค ๐Ÿง 

์ตœ๊ทผ ๊ฒ€์ƒ‰ ๊ธฐ๋ก ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„ 

์˜ค๋Š˜์€ ์ตœ๊ทผ ๊ฒ€์ƒ‰ ๊ธฐ๋ก ์กฐํšŒ์— ์ธ๋ฑ์Šค๋„ ์ ์šฉํ•ด ๋ณด๊ณ  ๋ ˆ๋””์Šค๋„ ์ ์šฉํ•ด ๋ณด๋ฉฐ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ™•์ธํ•ด ๋ดค๋‹ค.
๋จผ์ € ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•ด์„œ (userId, createdAt DESC)๋กœ ์„ค์ •ํ•ด ์ฃผ์—ˆ๊ณ , ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค. ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ userId๋ฅผ ํ†ตํ•ด ์ฐพ์•„์˜ค๊ณ  ์ตœ๊ทผ ์ €์žฅ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„ 10๊ฐœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— createdAt DESC๋ฅผ ํ•จ๊ป˜ ์„ค์ •ํ•˜๋ฉด ์ •๋ ฌ ํ•„์š” ์—†์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
์„ฑ๋Šฅ์„ ํ™•์ธํ•œ ๊ฒฐ๊ณผ type์ด ALL์—์„œ ref๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , Using where; Using filesort์—์„œ Using index๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์‹ค์ œ ์‹คํ–‰ ์‹œ๊ฐ„๋„ ์•ฝ 23% ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

์ธ๋ฑ์Šค ์ ์šฉ ์ „ EXPLAIN ๊ฒฐ๊ณผ
์ธ๋ฑ์Šค ์ ์šฉ ์ „ EXPLAIN ๊ฒฐ๊ณผ
์ธ๋ฑ์Šค ์ ์šฉ ํ›„ EXPLAIN ๊ฒฐ๊ณผ
์ธ๋ฑ์Šค ์ ์šฉ ํ›„ EXPLAIN ๊ฒฐ๊ณผ

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋˜ ๋ถ€๋ถ„์ด... ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ํ†ตํ•ด ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒ€์ƒ‰์–ด๊ฐ€ History ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋  ํ…๋ฐ ์ด๋ ‡๊ฒŒ ์ž์ฃผ Insert๊ฐ€ ์ผ์–ด๋‚˜๋Š” ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ๋งž์„๊นŒ..? ํ•˜๋Š” ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.
์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์— ์‚ฝ์ž…ํ•œ ํ›„, ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์—๋„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ํ‚ค๋ฅผ ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๊ณ  B-Tree ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค๋Š” ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ ๋ถ„ํ• (Split)๊ณผ ์žฌ์กฐ์ •(Rebalancing)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋” ๋งŽ์€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Redis๋ฅผ ์ ์šฉํ•ด์„œ Redis์— ๊ฒ€์ƒ‰์–ด๋ฅผ ์ €์žฅํ•ด ๋†“๊ณ  ์กฐํšŒํ•  ๋•Œ Redis์—์„œ ์กฐํšŒํ•œ๋‹ค๋ฉด ๋น ๋ฅธ ์†๋„๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋ฐ”๋กœ Redis๋ฅผ ์ ์šฉํ•ด ๋ดค๋‹ค. ์ ์šฉํ•˜๊ณ  DB์—์„œ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๊ณผ Redis์—์„œ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์˜ ์†๋„ ์ฐจ์ด๋ฅผ ํ™•์ธํ–ˆ๋‹ค.

DB์—์„œ ์ตœ๊ทผ ๊ฒ€์ƒ‰ ๊ธฐ๋ก ์กฐํšŒ ์†๋„
Redis์—์„œ ์ตœ๊ทผ ๊ฒ€์ƒ‰ ๊ธฐ๋ก ์กฐํšŒ ์†๋„

Redis๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „๊ณผ ํ›„๊ฐ€ ํ™•์‹คํ•˜๊ฒŒ ์†๋„ ์ฐจ์ด๋ฅผ ๋ณด์˜€๋‹ค. ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋กœ Redis๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฒ€์ƒ‰์–ด๋ฅผ Redis์— ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด DB์—๋Š” ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— @Scheduler๋ฅผ ํ™œ์šฉํ•ด์„œ 30๋ถ„๋งˆ๋‹ค DB์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™๊ธฐํ™”ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ DB์—๋„ ๊ฐ’์ด ์ตœ์‹ ํ™”๋˜๊ณ  Redis์—์„œ๋„ ๊ฐ’์ด ์ตœ์‹ ํ™”๋˜์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค!

Redis๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํŒ€์›๋“ค๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์ด ๋‹ฌ๋ž๋Š”๋ฐ, ์ด ๋ถ€๋ถ„๋„ ์ฐพ์•„๋ณด๋ฉด์„œ ๋ญ๊ฐ€ ๋” ํšจ์œจ์ ์ธ์ง€ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ 

  • RedissonClinet๋Š” ๋ถ„์‚ฐ ๋ฝ, ๋™๊ธฐํ™”, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๊ด€๋ฆฌ์— ๊ฐ•์ ์ด ์žˆ๋‹ค.
  • RedisTemplate์€ Spring Boot์™€์˜ ์—ฐ๋™, ๊ฐ„๋‹จํ•œ ์บ์‹ฑ, ๊ธฐ๋ณธ์ ์ธ Redis ๋ฐ์ดํ„ฐ ์กฐ์ž‘์— ๋” ์ ํ•ฉํ•˜๋‹ค.
  • ๊ทธ๋ž˜์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์žฅ์ ์„ ์ตœ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ตœ๊ทผ ๊ฒ€์ƒ‰ ์กฐํšŒ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  Elasticsearch๋กœ ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

์˜ค๋Š˜ ํ•˜๋ฃจ ์ •๋ฆฌ โœ๏ธ

๊ณ„์† ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ง„ํ–‰ํ•˜๋Š” ์—ฐ์Šต์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•ด๋‹น ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์™œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๊ณ  ๊ณ ๋ฏผํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์—ˆ๊ณ  ์•„์ง ๋ถ€์กฑํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

ElasticSearch๊นŒ์ง€ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋ฉด ์–ด๋Š ์ •๋„ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋งˆ๋ฌด๋ฆฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๋‚ด์ผ ๊ณ„ํš โฐ

  • Elasticsearch ์„ค์น˜ ๋ฐ ์„ค์ •
  • Elasticsearch ๊ณต๋ถ€
  • ์ „์ฒด ํŽ˜์ด์ง€ ์กฐํšŒ์— ์ ์šฉํ•ด ๋ณด๊ธฐ

+ ์ถ”๊ฐ€ ๊ณ„ํš์€ ์–ธ์ œ๋‚˜ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค~_~