Testing

์ˆ™๋ฐ• ์กฐํšŒ ๊ธฐ๋Šฅ - ์ธ๋ฑ์Šค ์ ์šฉ ๋ฐ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…, ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2024. 1. 11.

๐Ÿ“๊ฐœ์š”

ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ์ˆ™๋ฐ• ์˜ˆ์•ฝ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์ „ ๋‹ด๋‹น ๋„๋ฉ”์ธ์„ ํ•ต์‹ฌ ๋„๋ฉ”์ธ์ธ ์ˆ™๋ฐ• ๋„๋ฉ”์ธ์„ ๋งก๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ˆ™๋ฐ•์—”ํ‹ฐํ‹ฐ์—๋Š” ์—ฌ๋Ÿฌ ํ•„๋“œ ๊ฐ’๋“ค์„ ๊ฐ–๊ณ ์žˆ๋Š”๋ฐ ๊ทธ์ค‘ ๋Œ€ํ‘œ์ ์ธ ํ•„๋“œ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ง€์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฒค๋” ์‚ฌ์ดํŠธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ˆ™๋ฐ• ๋ฐ์ดํ„ฐ๋“ค์€ ๊ณต๊ณต๊ธฐ๊ด€ API ์—์„œ ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„, ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋กœ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ชจ๋‘ ๋งˆ์น˜๊ณ  ๋‚˜์„œ, ๊ธฐ๋Šฅ๋“ค์„ ๋Œ์•„ ๋ณด์•˜์„ ๋•Œ ์ˆ™๋ฐ• ์กฐํšŒ์‹œ ๋งŽ์€ WHERE ์ ˆ ์กฐ๊ฑด์„ ๋”ฐ์ง„๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ์ด๊ฑด ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์กฐํšŒ์‹œ ์„ฑ๋Šฅ์„ ๋” ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์—์„œ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํˆด์€ ์•„ํŒŒ์น˜ ์ œ์ด๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , ํ…Œ์ŠคํŠธ ์„œ๋ฒ„๋Š” ํ…Œ์ŠคํŠธ RDS์—์„œ ์‹ค์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”– ์ธ๋ฑ์Šค

์ธ๋ฑ์Šค ์Šค์บ”์€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋Œ€์‹ , ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์„ ์ƒ๋‹นํžˆ ์ค„์—ฌ ์ฃผ์–ด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ต๋‹ˆ๋‹ค.

Table์˜ Column์„ ์ƒ‰์ธํ™” ํ•˜์—ฌ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น Table์˜ ์ธ๋ฑ์Šค ์กฐํšŒ๊ฐ€ ์ผ์–ด๋‚  ์‹œ Record๋ฅผ Table Full scan ํ•˜์ง€ ์•Š์ง€์•Š๊ณ , ์ƒ‰์ธํ™” ๋œ  Index ํŒŒ์ผ ๊ฒ€์ƒ‰์œผ๋กœ ๊ฒ€์ƒ‰ ์†๋„ ํ–ฅ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๊ธฐ๋ณธ ์กฐํšŒ ๋ฐฉ๋ฒ•์ธ  Table Full scan์„ ํ•œ๋‹ค๋ฉด ๊ธฐ๋ณธํ‚ค๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ์—์„œ WHERE ์ ˆ์˜ ์กฐ๊ฑด์„ ํ•˜๋‚˜ ๊ฑฐ๋ฅด๊ณ  ๊ทธ๋‹ค์Œ ๊ฑฐ๋ฅด๊ณ  ๋˜ ๊ทธ๋‹ค์Œ ๊ฑธ๋Ÿฌ์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, Index range scan ์€ WHERE ์ ˆ์˜ ์กฐ๊ฑด์ด ์ธ๋ฑ์Šคํ™” ๋˜์–ด ์žˆ์œผ๋ฉด, ๊ทธ ์ธ๋ฑ์Šค๋กœ ์ƒ‰์ธํ™” ๋˜์–ด ๊ตฌ์กฐํ™” ๋œ ํŒŒ์ผ์—์„œ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
์ €๋Š” RDBMS๋กœ MySQL์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— B-Tree ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ƒ‰์ธํ™” ๋œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ–๊ฒŒ ๋˜๊ณ , ๋‹ค๋ฅธ ์ธ๋ฑ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ•ด์‹œ ์ธ๋ฑ์Šค ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์žฅ์ 

  • ๊ฒ€์ƒ‰ ์†๋„ ํ–ฅ์ƒ: ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ ์ œ๊ณต: ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ์ •๋ ฌ ์ž‘์—…์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๊ณต๊ฐ„ ๋น„์šฉ: ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋””์Šคํฌ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜: ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฐฑ์‹  ์‹œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ์— ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ข‹์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ , ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ƒ ์ข‹์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํšจ์œจ์ ์ธ ์ธ๋ฑ์Šค ์„ค๊ณ„ ํ”ผํ•ด์•ผํ•  ์ธ๋ฑ์Šค ์„ค๊ณ„
WHERE ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์—ด (WHERE ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์—ด์ด๋ผ๋„ ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Œ) DML์ด ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” Column
SELECT ์ ˆ์— ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์ปฌ๋Ÿผ๋“ค์„ ์ž˜ ์กฐํ•ฉํ•ด์„œ INDEX๋กœ ๋งŒ๋“ค์–ด๋‘๋ฉด INDEX ์กฐํšŒ ํ›„ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ์—์„œ ์กฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Data ์ค‘๋ณต๋„๊ฐ€ ๋†’์€ Column(์—ด์€ ์ต๋ฑ์Šค ํšจ๊ณผ๊ฐ€ ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„ฑ๋ณ„ ์—ด์— M, F๋งŒ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์•ˆ์“ฐ๋Š” ๊ฒŒ ๋‚ซ๋‹ค.๋”ฐ๋ผ์„œ ์ผ๋ฐ˜ ๋ณด์กฐ ์ธ๋ฑ์Šค๋ณด๋‹ค unique ๋ณด์กฐ ์ธ๋ฑ์Šค๊ฐ€ ๋น ๋ฅธ ์ด์œ ๊ฐ€ ์ด๊ฒƒ์ด๋‹ค.)
JOIN์ ˆ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์—ด์—๋Š” ์ธ๋ฑ์Šค์˜ ํšจ์œจ์ด ์ข‹์Œ. ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Œ. (INSERT๋งŒ ์ฃผ๊ตฌ์žฅ์ฐฝ ํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋ผ๋ฉด, ์‚ฌ์šฉํ•ด๋ณด์ง€๋„ ๋ชปํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์— ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…๋Ÿ‰๋งŒ ๋งŽ์•„์ง. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค๋Š” ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•จ.)
์™ธ๋ž˜ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” Column (๋‹จ, ์™ธ๋ž˜ํ‚ค๋Š” ์ž๋™์œผ๋กœ ์™ธ๋ž˜ํ‚ค ์ธ๋ฑ์Šค ๋งŒ๋“ฆ. ๋”ฐ๋ผ์„œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฌถ์ง€ ์•Š์•˜์„ ์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.)  
INDEX ์†์ต๋ถ„๊ธฐ์ 
ํ…Œ์ด๋ธ”์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์–‘์˜ 10% ~ 15%์ด๋‚ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ ๋  ๋•Œ๋งŒ INDEX๋ฅผ ํƒ€๋Š”๊ฒŒ ํšจ์œจ์ ์ด๊ณ , ๊ทธ ์ด์ƒ์ด ๋  ๋•Œ์—๋Š” ์˜คํžˆ๋ ค ํ’€์Šค์บ”์ด ๋” ๋น ๋ฅด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ป ํ”„๋กœ์ ํŠธ ์ผ€์ด์Šค

์ œ ์ˆ™๋ฐ• ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„์™€ ์ธ๋ฑ์Šค ์„ค๊ณ„๋ฅผ ์ ‘๋ชฉ ์‹œ์ผœ ๋ดค์„ ๋•Œ ํ•ฉ๋‹นํ•˜๋Š” ํŒ๋‹จ์ด ๋‚ด๋ ค์กŒ์Šต๋‹ˆ๋‹ค.
1. ์ˆ™๋ฐ• ๋ฐ์ดํ„ฐ๋Š” ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ €์žฅํ•œ ๊ฐ’์œผ๋กœ(์ด๋ฏธ ์ˆ™๋ฐ• ์ œ๊ณต์ž๊ฐ€ ๋“ฑ๋ก์„ ๋‹ค ํ–ˆ๋‹ค๋Š” ์ „์ œ ํ•˜์—) ์ถ”๊ฐ€, ์‚ญ์ œ, ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๋งŒ ์žฆ์€ ์ˆ˜์ •, ์ถ”๊ฐ€, ์‚ญ์ œ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
2. ์ˆ™๋ฐ• ๋ฐ์ดํ„ฐ ์กฐํšŒ์‹œ, ๋งค๋ฒˆ WHERE ์ ˆ์— ENUM ๊ฐ’์œผ๋กœ ์ง€์—ญ๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. 
3. ์ง€์—ญ๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ ๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค(๋ณตํ•ฉ ์ธ๋ฑ์Šค)๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •์„ ํ•˜์˜€๊ณ , Cardinality ๋ฅผ ๋”ฐ์ ธ ์ง€์—ญ์„ ๋” ์•ž์„œ์„œ ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

์นด๋””๋„๋ฆฌํ‹ฐ

์นด๋””๋„๋ฆฌํ‹ฐ(Cardinality)๊ฐ€ ๋†’๋‹ค๋Š” ๊ฒƒ์€ ํŠน์ • ์ปฌ๋Ÿผ์˜ ๊ฐ’๋“ค์ด ๊ณ ์œ ํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ํ•ด๋‹น ์ปฌ๋Ÿผ์— ์ €์žฅ๋œ ๊ฐ’๋“ค์ด ์ค‘๋ณต์ด ์ ๊ณ  ๋‹ค์–‘ํ•œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์นด๋””๋„๋ฆฌํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ์ตœ์ ํ™”์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์œผ๋กœ, ์ธ๋ฑ์Šค์˜ ํšจ์œจ์„ฑ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค

๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋Š” ๋‘๊ฐœ ์ด์ƒ์˜ ํ•„๋“œ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์ƒ์„ฑํ•œ INDEX ์ž…๋‹ˆ๋‹ค. (MySQL์€ INDEX์— ์ตœ๋Œ€ 15๊ฐœ ์ปฌ๋Ÿผ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ)
1๋ฒˆ์งธ ์กฐ๊ฑด๊ณผ ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” 2๋ฒˆ์งธ ์กฐ๊ฑด์„ ํ•จ๊ป˜ INDEXํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋Š” ๋‹จ์ผ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค ๋ณด๋‹ค ๋” ๋น„ํšจ์œจ์ ์œผ๋กœ INDEX/UPDATE/DELETE๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ ์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋•Œ๋ฌธ์— ๊ฐ€๊ธ‰์  UPDATE๊ฐ€ ์•ˆ๋˜๋Š” ๊ฐ’์„ ์„ ์ • ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


 

๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 1

๐Ÿšจ ์ƒํ™ฉ

์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ์ง€๋งŒ, ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
EXPAIN ๋ฌธ์„ ์จ์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์™ธ๋ž˜ํ‚ค๋Š” ์™ธ๋ž˜ํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜ ์กฐํšŒํ•˜์ง€๋งŒ ๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ • ํ•ด์ค€ ๊ฐ’์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

EXPLAIN ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ์—์„œ type์ด ALL๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์€ MySQL์ด ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”(Full Table Scan)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

โš ๏ธ ์›์ธ

 

์งˆ์˜๋ฌธ์— COALESCE ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ์˜€์Šต๋‹ˆ๋‹ค.

 

์ดˆ๊ธฐ ์ˆ™๋ฐ• ์กฐํšŒ ๋ฉ”์†Œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ˆ™๋ฐ• ์ธ์›์„ ํ•„์ˆ˜๋กœ ๊ฐ–๊ณ , ์ง€์—ญ๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ์ „์ฒด(ALL) ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์ง€์—ญ ๋˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ „์ฒด๋กœ ์กฐํšŒ ํ• ๋• ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์กฐํšŒํ•˜๊ฒŒ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ด๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ•œ ๊ธฐ๋Šฅ(API) ์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค ์ „์šฉ ์ „ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    @Query("SELECT a FROM Accommodation a "
        + "WHERE a.category = :category "
        + "AND a.region = :region "
        + "AND a.maximumCapacity >= :headCount")
    Page<Accommodation> findAccommodationsByCategoryAndRegionAndHeadCount(
        @Param("category") Category category,
        @Param("region") Region region,
        @Param("headCount") Integer headCount,
        Pageable pageable
    );
 
    @Query("SELECT a FROM Accommodation a "
        + "WHERE a.category = :category "
        + "AND a.maximumCapacity >= :headCount")
    Page<Accommodation> findAccommodationsByCategoryAndHeadCount(
        @Param("category") Category category,
        @Param("headCount") Integer headCount,
        Pageable pageable
    );
 
    @Query("SELECT a FROM Accommodation a "
        + "WHERE a.region = :region "
        + "AND a.maximumCapacity >= :headCount")
    Page<Accommodation> findAccommodationsByRegionAndHeadCount(
        @Param("region") Region region,
        @Param("headCount") Integer headCount,
        Pageable pageable
    );
 
    @Query("SELECT a FROM Accommodation a "
        + "WHERE a.maximumCapacity >= :headCount ")
    Page<Accommodation> findAccommodationsByHeadCount(
        @Param("headCount") Integer headCount,
        Pageable pageable
    ); 
cs

 

๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•˜์—ฌ OR ์—ฐ์‚ฐ์ด ๋˜๊ฒŒ ํ•˜๋ คํ–ˆ์ง€๋งŒ COALESCE ํ•จ์ˆ˜๊ฐ€ ๊ทธ ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ค„ ์ž˜๋ชป ์ฐฉ๊ฐํ•˜๊ณ , ํ‹€๋ฆฌ๊ฒŒ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜์—ฌ์„œ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

COALESCE ํ•จ์ˆ˜๋Š” SQL์—์„œ ์—ฌ๋Ÿฌ ์ธ์ˆ˜ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋กœ NULL์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ A, B๋ผ๋Š” ์ปฌ๋Ÿผ์„ ์ธ์ž๋กœ COALSESC ํ•จ์ˆ˜๋กœ ์ฃผ๊ฒŒ ๋˜๋ฉด A ์ปฌ๋Ÿผ ๊ฐ’์ด NULL ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ A ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ณ  A๊ฐ€ NULL์ด๊ณ  B๊ฐ€ NULL์ด ์•„๋‹Œ ๊ฒฝ์šฐ B ๊ฐ’์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ NULL์ด๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 

 

+ ์ถ”๊ฐ€๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ ๋˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ

โœ”๏ธ์ธ๋ฑ์Šค ์ž…ํžŒ ์ปฌ๋Ÿผ์„ ๊ฐ€๊ณต
WHERE SUBSTR(์ปฌ๋Ÿผ๋ช…, 1,4) = ‘2019’ 
ํ•ด๊ฒฐ → WHERE ์ปฌ๋Ÿผ๋ช… LIKE ‘2019%’

โœ”๏ธ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ์—ด ์ด๋ฆ„์—๋Š” ํ•จ์ˆ˜๋‚˜ ์—ฐ์‚ฐ์„ ๊ฐ€ํ•จ
WHERE count*10=100
ํ•ด๊ฒฐ →  WHERE count=100/10

โœ”๏ธ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์˜ ๋ฌต์‹œ์  ํ˜•๋ณ€ํ™˜(๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ๋น„๊ตํ•ด์•ผํ•จ)
WHERE ์ปฌ๋Ÿผ๋ช… = ‘20190730’ 
ํ•ด๊ฒฐ → WHERE ์ปฌ๋Ÿผ๋ช… = TO_DATE(‘20190730’, ‘YYYYMMDD’)

โœ”๏ธ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ๋ถ€์ •ํ˜• ๋น„๊ต.
WHERE ์ปฌ๋Ÿผ๋ช… != ‘10’ 
ํ•ด๊ฒฐ → WHERE ์ปฌ๋Ÿผ๋ช… IN(‘20’, ‘30’)

โœ”๏ธ LIKE %๊ฐ€ ์•ž์— ์œ„์น˜.
WHERE ์ปฌ๋Ÿผ๋ช… LIKE ‘%2019’
ํ•ด๊ฒฐ → OR ์กฐ๊ฑด ์‚ฌ์šฉ WHERE ์ปฌ๋Ÿผ๋ช… IN(‘102019’,‘202019’,‘302019’)

 

๐Ÿง‘‍๐Ÿ’ป ์•ก์…˜

OR ์—ฐ์‚ฐ์ž๋ฅผ ์จ์„œ ์ œ๋Œ€๋กœ ๋œ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿช„ ๊ฒฐ๊ณผ

 

์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฑธ EXPAIN ๋ฌธ์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ๋Œ€๋กœ๋œ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ   ์ž˜๋ชป ์‚ฌ์šฉํ•œ COALESCE ํ•จ์ˆ˜๋ฅผ ์ œ๋Œ€๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ ์˜ˆ์‹œ๋„ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 2

๐Ÿšจ์ƒํ™ฉ

์ธ๋ฑ์Šค ์„ค์ • ์ „ ์ˆ™๋ฐ• ์กฐํšŒ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

โš ๏ธ ์›์ธ

Thread Group ์„ค์ •์„ ๋„ˆ๋ฌด ์˜ค๋ฒ„ํ•ด์„œ ์„ค์ •์ด ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. 

 

์‘๋‹ต ๋ฉ”์‹œ์ง€์—์„œ๋„ ๋„ˆ๋ฌด ๋งŽ์€ ์ปค๋„ฅ์…˜์ด ์žˆ๋‹ค๊ณ  ๋‚˜ํƒ€๋‚˜๋Š” ๊ฑธ ๋ดค์Šต๋‹ˆ๋‹ค.

์ปค๋„ฅ์…˜ ์ˆ˜๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด AWS Cloud Watch๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์— ์ตœ๋Œ€ 60์ด ๋„˜๋Š” ์ปค๋„ฅ์…˜์ˆ˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿง‘‍๐Ÿ’ป ์•ก์…˜

๋„ˆ๋ฌด ๋†’์€ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ฃผ์—ˆ๊ธฐ์— Thread Group ์„ค์ •์„ ๋‚ฎ์ท„์Šต๋‹ˆ๋‹ค.

  ๊ธฐ์กด ๋ณ€๊ฒฝ
Number of Threads (users) 1000 100
Ramp-Up Period (in seconds) 100 300
Loop Count 1 1

 

๐Ÿช„ ๊ฒฐ๊ณผ

 

 

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ๋๋งˆ์นœ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ์„œ๋น„์Šค๊ฐ€ ์–ผ๋งˆ๋งŒํผ์˜ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒช๊ฒŒ ๋˜์ง€ ์ œ๋Œ€๋กœ ์˜ˆ์ธกํ•ด๋ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ฐฐ์› ๊ณ , ์•„์ง ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์งœ๋Š” ๋ถ€๋ถ„์—์„  ๋ฏธํกํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ์ œ ์„œ๋น„์Šค๊ฐ€ ์–ด๋А ์ •๋„์˜ ์œ ์ €๋ฅผ ๋งž์ดํ•˜๊ฒŒ ๋ ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ์ •๋„์˜ ํŠธ๋ž˜ํ”ฝ์ด๋ฉด ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์„œ, Thread Group ์„ค์ •์„ ํ• ์ง€๋Š” ์กฐ๊ธˆ ๋” ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”ถ ์ธ๋ฑ์Šค ์ ์šฉ ์ „ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ VS ์ธ๋ฑ์Šค ์ ์šฉ ํ›„ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

์ธ๋ฑ์Šค ์ „์šฉ ์ „๊ณผ ํ›„ Thread Group ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

Number of Threads (users) : 100

Ramp-Up Period (in seconds) : 300

Loop Count : 1

์ธ๋ฑ์Šค ์ ์šฉ ์ „ ์ดํ•ฉ๋ณด๊ณ ์„œ

 

 

์ธ๋ฑ์Šค ์ ์šฉ ํ›„ ์ดํ•ฉ ๋ณด๊ณ ์„œ

 

 

๊ฒฐ๊ณผ

 

 

์—ฃ์ง€ ์ผ€์ด์Šค๊นŒ์ง€ ํฌํ•จํ•˜๊ธฐ์— 99% ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ์ค€์€ ์ง€ํ‘œ๋กœ์„œ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , 95% ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ์ค€์„ ์ง€ํ‘œ๋กœ์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

95% ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ์ค€์—์„œ ์ ์šฉ ์ „ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋Š” ํ‰๊ท  481ms ๊ฐ€ ๊ฑธ๋ ธ๊ณ , ์ ์šฉ ํ›„ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ์—์„œ๋Š” ํ‰๊ท  242ms ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด๋Š” 98.76%์˜ ๊ฐœ์„ ์œจ์„ ๋ณด์ธ ๊ฒƒ์ด๋ฉฐ, 2๋ฐฐ ๊ฐ€๊นŒ์ด ๋น ๋ฅธ ์‘๋‹ต์†๋„๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

JMeter ์ž์ฒด๋Š” ์„œ๋ฒ„์˜ CPU ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๋””์Šคํฌ I/O ๋“ฑ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ง์ ‘ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊ณผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ์— AWS CloudWatch ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RDS ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. RDS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ์ˆ˜์™€ CPU ์‚ฌ์šฉ๋ฅ , ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์€ ํฐ ์ฐจ์ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

๋งˆ๋ฌด๋ฆฌ

๐Ÿ˜ ์ข‹์•˜๋˜ ๊ฒƒ(Liked)

์‹ค์ œ๋กœ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์•˜์„ ๋•Œ, 95% ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ์ค€์—์„œ 98.76%์˜ ๊ฐœ์„ ์œจ์„ ๋ณด์ด๋ฉฐ, 2๋ฐฐ ๊ฐ€๊นŒ์ด ๋น ๋ฅธ ์‘๋‹ต์†๋„๋ฅผ ๊ฒฝํ—˜ํ–ˆ์„ ๋•Œ, '์ด๋ž˜์„œ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ตฌ๋‚˜' ํ•˜๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์„ ๋•Œ ๋งค์šฐ ๋ฟŒ๋“ฏํ•จ๊ณผ ๋ณด๋žŒ์„ ๋А๊ผˆ๊ณ , ๋งŒ์•ฝ ์‹ค์ œ ์šด์˜ ์„œ๋น„์Šค์˜€๋‹ค๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋น ๋ฅธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ, ์ด ์ผ์— ์žˆ์–ด์„œ ๋งŒ์กฑ๊ฐ์„ ํฌ๊ฒŒ ๋А๊ผˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ๋ฐฐ์šด ๊ฒƒ(Learned)

์ธ๋ฑ์Šค ์ ์šฉ๊ณผ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งŽ์€ ๊ฒƒ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์ธ๋ฑ์Šค ์„ค์ • ์œ ์˜์‚ฌํ•ญ, ์žฅ๋‹จ์ ์„ ์•Œ๊ฒŒ ๋๊ณ , ์กฐํšŒ ๊ธฐ๋Šฅ์— ์žˆ์–ด์„œ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์ด ์–ผ๋งˆ๋‚˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž˜๋ชป๋œ ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ SQL ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋๊ณ , ์ด ๊ณผ์ •์—์„œ ๋”์šฑ ์ธ๋ฑ์Šค๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ฆ ๋ถ€์กฑํ–ˆ๋˜ ๊ฒƒ(Lacked)

์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ๋Š”, ์•„์ง ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋‚˜, ํ…Œ์ŠคํŠธ ๊ณ„ํš์„ ์งœ๋Š” ๋ฐ์— ๋ฏธ์ˆ™ํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งŒ๋“  ์„œ๋น„์Šค๊ฐ€ ์–ด๋А ์ •๋„ ํŠธ๋ž˜ํ”ฝ์„ ๋งž์ดํ•  ๊ป€์ง€ ์œ ์ถ”ํ•˜๋Š” ๋Šฅ๋ ฅ๊ณผ ์œ ์ถ”ํ•œ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์งค๊ฒƒ์ธ์ง€๋Š” ๋ณด๋‹ค ๋งŽ์€ ํ•™์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ™ ๋ฐ”๋ผ๋Š” ๊ฒƒ(Longed for)

ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฒฝํ—˜ํ•˜๊ธฐ ์œ„ํ•ด์„  ์—ญ์‹œ ์‹ค๋ฌด์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฒช์œผ๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ์ข‹์€ ์‚ฌ์ˆ˜ ๋ถ„์„ ๋งŒ๋‚˜์„œ ์–ด๋–ค ์ผ€์ด์Šค์—” ์–ด๋–ป๊ฒŒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์งœ๋Š” ๊ฒŒ ์ข‹์€์ง€ ๋ฐฐ์›Œ ๋ณด๊ณ  ์‹ถ๊ณ , ๋‚˜์•„๊ฐ€ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ๋งž์ดํ•˜๊ฒŒ ๋˜๋ฉด ์ง€๊ธˆ ๋งŒ๋“  ์„œ๋น„์Šค์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ”์•ผํ•˜๋Š” ์ง€๋„ ๋ฐฐ์›Œ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€