๐Ÿ’ธ [Redis] ๋ ˆ๋””์Šค ์†Œ๊ฐœ์™€ ํŠน์ง• ๋ฐ ์žฅ์  ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€

์ด์„œยท2023๋…„ 9์›” 28์ผ
0

๐Ÿ’ธ Redis ํŠธ๋ž™

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-custom-banner

๐ŸŽ๏ธ๐Ÿ’จย ์•ˆ๋…•ํ•˜์„ธ์š”, ์ด์„œ์ž…๋‹ˆ๋‹ค! ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Redis๋ž€ ๋ฌด์—‡์ด๊ณ  ํŠน์ง•๊ณผ ์žฅ์  ๊ทธ๋ฆฌ๊ณ  ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•ด์š”.

banner

๊ฐœ์š”

Redis(REmote DIctionary Server)๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๊ณ ์„ฑ๋Šฅ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•ด์š”. Redis๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ ํ•˜๋‚˜๋กœ, ์ฃผ๋กœ ์บ์‹ฑ, ์„ธ์…˜ ๊ด€๋ฆฌ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค, ๋Œ€๊ธฐ์—ด ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ํ™œ์šฉ๋ผ์š”.

Redis๋Š” ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ์ €์žฅ์œผ๋กœ ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๋ฌธ์ž์—ด, ๋ฆฌ์ŠคํŠธ, ํ•ด์‹œ, ์ง‘ํ•ฉ, ์ •๋ ฌ ์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•ด์š”.

Redis๋Š” Pub-Sub ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ๋„ ํ™œ์šฉ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. Redis์˜ ๊ณ ์„ฑ๋Šฅ๊ณผ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๊ฒŒ์ž„ ์„œ๋ฒ„, ์‹ค์‹œ๊ฐ„ ๋ถ„์„, ์บ์‹ฑ, ๋Œ€๊ธฐ์—ด ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด์š”.

DB-ENGINES์—์„œ ์ œ๊ณตํ•œ ๋žญํ‚น์— ๋”ฐ๋ฅด๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ๋Š” 2023๋…„ 9์›” ๊ธฐ์ค€ 6์œ„๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ‚ค-๋ฒจ๋ฅ˜ ์ €์žฅ์†Œ(Key-Value Store)์—์„œ๋Š” 1์œ„๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์„ ์ •๋„๋กœ ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ณ  ์žˆ์–ด์š”!

์ „์ฒด์ˆœ์œ„

DB-Engines Ranking - ์ „์ฒด ์ˆœ์œ„

ํ‚ค๋ฒจ๋ฅ˜์ˆœ์œ„

DB-Engines Ranking - ํ‚ค ๋ฒจ๋ฅ˜ ์ˆœ์œ„

ํŠน์ง• ๋ฐ ์žฅ์ 

  1. ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฏ€๋กœ ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ์ œ๊ณตํ•ด์š”.
  2. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…: Redis๋Š” ๋ฌธ์ž์—ด, ๋ฆฌ์ŠคํŠธ, ํ•ด์‹œ, ์ง‘ํ•ฉ, ์ •๋ ฌ ์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ˆ˜์›”ํ•ด์š”.
  3. ์˜์†์„ฑ: Redis๋Š” ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ €์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ง€์†์„ฑ์„ ์ œ๊ณตํ•ด์š”. ์ด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ์žฅ์•  ์‹œ์—๋„ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. Pub-Sub ๋ฉ”์‹œ์ง•: Redis๋Š” Publish-Subscribe ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  5. ํŠธ๋žœ์žญ์…˜ / ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ: Redis๋Š” ๋ฉ€ํ‹ฐ ๋ช…๋ น์–ด๋ฅผ ์›์ž์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•ด์š”. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Redis๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ๋”ฐ๋ผ์„œ Redis๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๊ฑฐ์˜ ์—†๋Š” ๋งค์šฐ ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  6. ํด๋Ÿฌ์Šคํ„ฐ๋ง: Redis๋Š” ๋ฐ์ดํ„ฐ ์ƒค๋”ฉ๊ณผ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ๊ณ ๊ฐ€์šฉ์„ฑ ๋ฐ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.
  7. LRU ์บ์‹œ ๋ฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„: Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด LRU (Least Recently Used) ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งŒ๋ฃŒ ์‹œ๊ฐ„(Time-to-Live)์„ ์ง€์›ํ•ด์š”.
  8. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: ๋งŽ์€ ์‚ฌ์šฉ์ž๋“ค์ด ์กด์žฌํ•˜์—ฌ ๋น„์Šทํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‚ฌ๋ก€๊ฐ€ ๋งŽ์œผ๋ฉฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ ๋„์›€ ๋ฐ›๊ธฐ ์ˆ˜์›”ํ•ด์š”.

์˜์†์„ฑ(Persistence)

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

RDB(Redis DataBase) ์Šค๋ƒ…์ƒท

RDB ์Šค๋ƒ…์ƒท์€ ์ฃผ๊ธฐ์ ์œผ๋กœ Redis ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šค๋ƒ…์ƒท์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ์ด๋Ÿฌํ•œ ์Šค๋ƒ…์ƒท์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์—ฌ, ํ•„์š” ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”.

AOF(Append Only File) ๋กœ๊ทธ

AOF ๋กœ๊ทธ๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. Redis ์„œ๋ฒ„๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ ์ด ๋กœ๊ทธ๋ฅผ ์žฌ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•ด์š”. AOF ๋กœ๊ทธ๋Š” ์Šค๋ƒ…์ƒท๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์œ„์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ RDB์™€ AOF ๋‘๊ฐ€์ง€ ์˜ต์…˜์„ ๊ฐ๊ฐ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์‚ฌ์šฉ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์— ๋งž์ถฐ ์กฐ์ ˆํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”..

์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€

  1. ์บ์‹ฑ(Cashing): ์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ(One-Time Password), ๋กœ๊ทธ์ธ ์„ธ์…˜(Session), JWT(JSON Web Token), ์ผ์ • ์ฃผ๊ธฐ๋กœ ๊ฐฑ์‹ ํ•ด๋„ ๊ดœ์ฐฎ์€ ๋ฐ์ดํ„ฐ, ๋™์ผํ•œ ์—ฐ์‚ฐ์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ
  2. ์‹ค์‹œ๊ฐ„ ๋ถ„์„: ์ˆœ์œ„(Rank), ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ ๋กœ๊ทธ ์ฒ˜๋ฆฌ, ๋ฐฉ๋ฌธ์ž ์ˆ˜ ๊ณ„์‚ฐ
  3. Pub/Sub ํŒจํ„ด: ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง• ์ฒ˜๋ฆฌ
  4. ํ(Queue): ์šฐ์„  ์ˆœ์œ„ ํ, ์ด๋ฉ”์ผ ์ „์†ก

๋งˆ๋ฌด๋ฆฌ

end

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

Redis๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด๋กœ์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ฐ ์กฐ์ž‘์— ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์บ์‹ฑ, ์„ธ์…˜ ์Šคํ† ์–ด, ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, Pub/Sub ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์™€ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์œผ๋กœ๋„ ํ™œ์šฉ๋ผ์š”.

๋ฐ์ดํ„ฐ์˜ ์˜์†์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ƒ…์ƒท๊ณผ AOF ๋กœ๊ทธ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”. Redis๋Š” ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

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

profile
๐ŸŽ๏ธ๐Ÿ’จ Beep Beep
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€