์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ CAP ์ •๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ „๋žต: ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๐ŸŒ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ CAP ์ •๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ „๋žต: ์™„๋ฒฝ ๊ฐ€์ด๋“œ

ํ˜„๋Œ€ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ, CAP ์ด๋ก ๋ถ€ํ„ฐ ์‹ค์ „ ์ „๋žต๊นŒ์ง€ ์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ํ’€์–ด๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿš€

๐ŸŽฏ ์™œ CAP ์ •๋ฆฌ๋ฅผ ์•Œ์•„์•ผ ํ• ๊นŒ?

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

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์ด ๋ฐ”๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๋ณธ์งˆ์ ์ธ ๋”œ๋ ˆ๋งˆ์—์„œ ๋‚˜์˜ค๋Š” ๊ฑฐ์•ผ. ๊ทธ๋ฆฌ๊ณ  ์ด ๋”œ๋ ˆ๋งˆ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ๊ฒŒ ๋ฐ”๋กœ CAP ์ •๋ฆฌ๋ผ๋Š” ๊ฑฐ์ง€. 2000๋…„์— ์—๋ฆญ ๋ธŒ๋ฃจ์–ด(Eric Brewer) ๊ต์ˆ˜๊ฐ€ ์ œ์•ˆํ•˜๊ณ , 2002๋…„์— ์„ธ์Šค ๊ธธ๋ฒ„ํŠธ(Seth Gilbert)์™€ ๋‚ธ์‹œ ๋ฆฐ์น˜(Nancy Lynch)๊ฐ€ ์ˆ˜ํ•™์ ์œผ๋กœ ์ฆ๋ช…ํ•œ ์ด ์ด๋ก ์€ ์ง€๊ธˆ๋„ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„์˜ ๊ธฐ๋ณธ ์›์น™์œผ๋กœ ์ž๋ฆฌ์žก๊ณ  ์žˆ์–ด.

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

Consistency ์ผ๊ด€์„ฑ Availability ๊ฐ€์šฉ์„ฑ Partition Tolerance CA CP AP CAP ์ •๋ฆฌ: 3๊ฐ€์ง€ ์ค‘ 2๊ฐ€์ง€๋งŒ ์„ ํƒ ๊ฐ€๋Šฅ! ๋„คํŠธ์›Œํฌ ๋ถ„ํ• ์ด ๋ฐœ์ƒํ•˜๋ฉด C ๋˜๋Š” A ์ค‘ ํ•˜๋‚˜๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•จ

๐Ÿ“š CAP ์ •๋ฆฌ์˜ ์„ธ ๊ฐ€์ง€ ์š”์†Œ ์™„์ „ ์ •๋ณต

1๏ธโƒฃ Consistency (์ผ๊ด€์„ฑ) - ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณธ๋‹ค

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

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ๋„ค๊ฐ€ ์€ํ–‰ ์•ฑ์—์„œ ๊ณ„์ขŒ ์ž”์•ก์„ ํ™•์ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. ์„œ์šธ ๋ฐ์ดํ„ฐ์„ผํ„ฐ์—์„œ 10๋งŒ์›์„ ์ถœ๊ธˆํ–ˆ๋Š”๋ฐ, ๋ถ€์‚ฐ ๋ฐ์ดํ„ฐ์„ผํ„ฐ์—์„œ๋Š” ์•„์ง๋„ ์ถœ๊ธˆ ์ „ ์ž”์•ก์ด ๋ณด์ธ๋‹ค๋ฉด? ์ด๊ฑด ํฐ ๋ฌธ์ œ์•ผ! ๐Ÿ˜จ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ์ผ๊ด€์„ฑ์ด์•ผ.

์ผ๊ด€์„ฑ์˜ ํ•ต์‹ฌ ํŠน์ง•:
โ€ข ๋ชจ๋“  ์ฝ๊ธฐ ์š”์ฒญ์€ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์“ฐ์—ฌ์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ
โ€ข ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์— ์ „ํŒŒ๋  ๋•Œ๊นŒ์ง€ ์ฝ๊ธฐ ์š”์ฒญ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Œ
โ€ข ํŠธ๋žœ์žญ์…˜์˜ ACID ์†์„ฑ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Œ
โ€ข ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ๊ฐ€์žฅ ์–ด๋ ค์šด ์†์„ฑ ์ค‘ ํ•˜๋‚˜

๐Ÿ’ก ์‹ค์ „ ์˜ˆ์‹œ: ์ „ํ†ต์ ์ธ RDBMS

MySQL์ด๋‚˜ PostgreSQL ๊ฐ™์€ ์ „ํ†ต์ ์ธ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ด. ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๋ณต์ œ ๊ตฌ์กฐ์—์„œ ๋งˆ์Šคํ„ฐ์— ์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋ชจ๋“  ์Šฌ๋ ˆ์ด๋ธŒ์— ๋ณต์ œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ฝ๊ธฐ ์š”์ฒญ์„ ๋งˆ์Šคํ„ฐ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ธฐ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ฒŒ ๋ผ!

2๏ธโƒฃ Availability (๊ฐ€์šฉ์„ฑ) - ์–ธ์ œ๋‚˜ ์‘๋‹ตํ•œ๋‹ค

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

์ƒ๊ฐํ•ด๋ด. ๋„ทํ”Œ๋ฆญ์Šค์—์„œ ์˜ํ™”๋ฅผ ๋ณด๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ "์„œ๋ฒ„ ์ ๊ฒ€ ์ค‘์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋ฉด ์–ผ๋งˆ๋‚˜ ์งœ์ฆ๋‚ ๊นŒ? ๊ฐ€์šฉ์„ฑ์ด ๋†’์€ ์‹œ์Šคํ…œ์€ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด. ์ผ๋ถ€ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ๋‹ค๋ฅธ ์„œ๋ฒ„๊ฐ€ ๋Œ€์‹  ์‘๋‹ตํ•˜๋Š” ๊ฑฐ์ง€.

๊ฐ€์šฉ์„ฑ์˜ ํ•ต์‹ฌ ํŠน์ง•:
โ€ข ๋ชจ๋“  ์š”์ฒญ์€ ์‹คํŒจํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ํ•จ
โ€ข ์‘๋‹ต ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๋ณด์žฅ์€ ์—†์ง€๋งŒ, ๊ฒฐ๊ตญ ์‘๋‹ต์€ ๋ฐ›์Œ
โ€ข ๋ถ€๋ถ„์ ์ธ ์žฅ์• ๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ ๋‹ค์šด์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Œ
โ€ข ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ์ธก๋ฉด์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ

๐ŸŽฎ ๊ฒŒ์ž„ ์„œ๋ฒ„์˜ ๊ฐ€์šฉ์„ฑ ์ „๋žต

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

3๏ธโƒฃ Partition Tolerance (๋ถ„ํ•  ๋‚ด์„ฑ) - ๋„คํŠธ์›Œํฌ ์žฅ์• ๋ฅผ ๊ฒฌ๋”˜๋‹ค

๋ถ„ํ•  ๋‚ด์„ฑ์€ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถ„ํ• ๋˜์–ด๋„ ์‹œ์Šคํ…œ์ด ๊ณ„์† ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด. ์—ฌ๊ธฐ์„œ '๋ถ„ํ• '์ด๋ž€ ๋„คํŠธ์›Œํฌ ์žฅ์• ๋กœ ์ธํ•ด ๋…ธ๋“œ๋“ค ๊ฐ„์˜ ํ†ต์‹ ์ด ๋Š์–ด์ง€๋Š” ์ƒํ™ฉ์„ ๋งํ•ด. ๐Ÿ”Œ

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

๋ถ„ํ•  ๋‚ด์„ฑ์˜ ํ•ต์‹ฌ ํŠน์ง•:
โ€ข ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹  ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์‹œ์Šคํ…œ์€ ๊ณ„์† ์ž‘๋™
โ€ข ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ์ƒํ™ฉ์—์„œ ๊ฐ ํŒŒํ‹ฐ์…˜์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ ๊ฐ€๋Šฅ
โ€ข ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜์ ์ธ ์š”์†Œ
โ€ข ํŒŒํ‹ฐ์…˜์ด ๋ณต๊ตฌ๋˜๋ฉด ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”

โš ๏ธ ์ค‘์š”ํ•œ ํ˜„์‹ค: P๋Š” ์„ ํƒ์ด ์•„๋‹ˆ๋‹ค!

๋งŽ์€ ์ „๋ฌธ๊ฐ€๋“ค์ด ์ง€์ ํ•˜๋“ฏ์ด, ํ˜„๋Œ€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋„คํŠธ์›Œํฌ ๋ถ„ํ• ์€ '๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”' ๊ฒŒ ์•„๋‹ˆ๋ผ '๋ฐ˜๋“œ์‹œ ๋ฐœ์ƒํ•˜๋Š”' ๋ฌธ์ œ์•ผ. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ๋Š” CAP ์ค‘์—์„œ P๋ฅผ ํฌ๊ธฐํ•  ์ˆ˜ ์—†์–ด. ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” C์™€ A ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ์ง€!

โš–๏ธ CAP ์ •๋ฆฌ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ๋ฌด์—‡์„ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€?

์ž, ์ด์ œ ํ•ต์‹ฌ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณด์ž. CAP ์ •๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ๊ฑด ๊ฐ„๋‹จํ•ด: ์„ธ ๊ฐ€์ง€ ์†์„ฑ ์ค‘ ๋™์‹œ์— ๋‘ ๊ฐ€์ง€๋งŒ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์•ผ. ์™„๋ฒฝํ•œ ์‹œ์Šคํ…œ์€ ์—†์–ด. ํ•ญ์ƒ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์กด์žฌํ•˜์ง€! ๐Ÿค”

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๊ฐ€ ์žˆ์–ด. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋„คํŠธ์›Œํฌ ๋ถ„ํ• (P)์€ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ํ˜„์‹ค์ด์•ผ. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ๋Š” CP ์‹œ์Šคํ…œ๊ณผ AP ์‹œ์Šคํ…œ ์ค‘์—์„œ ์„ ํƒํ•˜๊ฒŒ ๋ผ. CA ์‹œ์Šคํ…œ์€ ์ด๋ก ์ ์œผ๋กœ๋งŒ ์กด์žฌํ•˜๊ณ , ์‹ค์ œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•ด.

๐Ÿ”’ CP ์‹œ์Šคํ…œ: ์ผ๊ด€์„ฑ์„ ์„ ํƒํ•˜๋‹ค

CP ์‹œ์Šคํ…œ์€ ์ผ๊ด€์„ฑ๊ณผ ๋ถ„ํ•  ๋‚ด์„ฑ์„ ๋ณด์žฅํ•˜๋˜, ๊ฐ€์šฉ์„ฑ์„ ํฌ์ƒํ•˜๋Š” ์„ ํƒ์ด์•ผ. ๋„คํŠธ์›Œํฌ ๋ถ„ํ• ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ผ๋ถ€ ๋…ธ๋“œ๋Š” ์‘๋‹ต์„ ๊ฑฐ๋ถ€ํ•˜๊ฑฐ๋‚˜ ํƒ€์ž„์•„์›ƒ๋  ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค๋ฉด, ๊ทธ ๋ฐ์ดํ„ฐ๋Š” 100% ์ •ํ™•ํ•ด! ๐Ÿ’ฏ

CP ์‹œ์Šคํ…œ์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ:
โ€ข ๊ธˆ์œต ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ (์ž˜๋ชป๋œ ์ž”์•ก ์ •๋ณด๋Š” ์น˜๋ช…์ !)
โ€ข ์žฌ๊ณ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ (์ค‘๋ณต ํŒ๋งค ๋ฐฉ์ง€๊ฐ€ ์ค‘์š”)
โ€ข ์˜๋ฃŒ ๊ธฐ๋ก ์‹œ์Šคํ…œ (ํ™˜์ž ์ •๋ณด์˜ ์ •ํ™•์„ฑ์ด ์ƒ๋ช…๊ณผ ์ง๊ฒฐ)
โ€ข ์˜ˆ์•ฝ ์‹œ์Šคํ…œ (๋”๋ธ” ๋ถ€ํ‚น์„ ์ ˆ๋Œ€ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†์Œ)

๋Œ€ํ‘œ์ ์ธ CP ์‹œ์Šคํ…œ:
โ€ข MongoDB (๊ฐ•ํ•œ ์ผ๊ด€์„ฑ ๋ชจ๋“œ)
โ€ข HBase
โ€ข Redis (ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ)
โ€ข Zookeeper
โ€ข Consul

๐Ÿ’ณ ์‹ค์ „ ์‚ฌ๋ก€: ์€ํ–‰ ์‹œ์Šคํ…œ

์€ํ–‰ ์‹œ์Šคํ…œ์„ ์ƒ๊ฐํ•ด๋ด. ๋„ค๊ฐ€ ATM์—์„œ ๋ˆ์„ ์ธ์ถœํ•˜๋ ค๋Š”๋ฐ, ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ ์ค‘์•™ ์„œ๋ฒ„์™€ ํ†ต์‹ ์ด ์•ˆ ๋œ๋‹ค๋ฉด? CP ์‹œ์Šคํ…œ์€ "์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์‘๋‹ตํ•ด. ๋ถˆํŽธํ•˜์ง€๋งŒ, ์ž”์•ก์ด ๋ถ€์กฑํ•œ๋ฐ ๋ˆ์ด ๋‚˜๊ฐ€๊ฑฐ๋‚˜, ์ด์ค‘ ์ถœ๊ธˆ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ์•ˆ์ „ํ•˜์ง€!

์ด๊ฒŒ ๋ฐ”๋กœ ๊ฐ€์šฉ์„ฑ์„ ํฌ์ƒํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์„ ํƒํ•œ ๊ฑฐ์•ผ. ์‚ฌ์šฉ์ž๋Š” ์ž ์‹œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ์€ ๋ณด์žฅ๋˜๋Š” ๊ฑฐ์ง€.

๐ŸŒ AP ์‹œ์Šคํ…œ: ๊ฐ€์šฉ์„ฑ์„ ์„ ํƒํ•˜๋‹ค

AP ์‹œ์Šคํ…œ์€ ๊ฐ€์šฉ์„ฑ๊ณผ ๋ถ„ํ•  ๋‚ด์„ฑ์„ ๋ณด์žฅํ•˜๋˜, ์ผ๊ด€์„ฑ์„ ํฌ์ƒํ•˜๋Š” ์„ ํƒ์ด์•ผ. ๋„คํŠธ์›Œํฌ ๋ถ„ํ• ์ด ๋ฐœ์ƒํ•ด๋„ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๊ณ„์† ์‘๋‹ตํ•ด. ๋‹ค๋งŒ, ๊ฐ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด. ์ด๋ฅผ '์ตœ์ข… ์ผ๊ด€์„ฑ(Eventual Consistency)'์ด๋ผ๊ณ  ๋ถ€๋ฅด์ง€! ๐Ÿ”„

AP ์‹œ์Šคํ…œ์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ:
โ€ข ์†Œ์…œ ๋ฏธ๋””์–ด (์ข‹์•„์š” ์ˆ˜๊ฐ€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ๋„ ๊ดœ์ฐฎ์Œ)
โ€ข ์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ(CDN)
โ€ข ์‡ผํ•‘๋ชฐ์˜ ์ƒํ’ˆ ์กฐํšŒ (์‹ค์‹œ๊ฐ„ ์žฌ๊ณ ๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋จ)
โ€ข ๋กœ๊ทธ ์ˆ˜์ง‘ ์‹œ์Šคํ…œ
โ€ข ์บ์‹ฑ ์‹œ์Šคํ…œ

๋Œ€ํ‘œ์ ์ธ AP ์‹œ์Šคํ…œ:
โ€ข Cassandra
โ€ข DynamoDB
โ€ข Riak
โ€ข CouchDB
โ€ข Voldemort

๐Ÿ“ฑ ์‹ค์ „ ์‚ฌ๋ก€: ์†Œ์…œ ๋ฏธ๋””์–ด

์ธ์Šคํƒ€๊ทธ๋žจ์—์„œ ์นœ๊ตฌ๊ฐ€ ์‚ฌ์ง„์„ ์˜ฌ๋ ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. ๋„ˆ๋Š” ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋ €๋Š”๋ฐ, ์นœ๊ตฌ๊ฐ€ ์ž๊ธฐ ํ™”๋ฉด์—์„œ ๋ณด๋‹ˆ ์•„์ง ์ข‹์•„์š”๊ฐ€ ์•ˆ ๋ณด์ผ ์ˆ˜ ์žˆ์–ด. ๋ช‡ ์ดˆ ํ›„์— ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋ณด์ด๊ฒ ์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ AP ์‹œ์Šคํ…œ์ด์•ผ!

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

๐Ÿ›๏ธ CA ์‹œ์Šคํ…œ: ์ด๋ก ์ƒ์œผ๋กœ๋งŒ ์กด์žฌ

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

์ „ํ†ต์ ์ธ ๋‹จ์ผ ์„œ๋ฒ„ RDBMS๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•ด. ๋„คํŠธ์›Œํฌ ๋ถ„ํ• ์ด ์—†์œผ๋‹ˆ๊นŒ ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๋ชจ๋‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€. ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์œผ๋ฉด? ์ „์ฒด ์‹œ์Šคํ…œ์ด ๋‹ค์šด๋˜๋Š” ๊ฑฐ์•ผ. ๊ทธ๋ž˜์„œ ํ˜„๋Œ€์˜ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค์—์„œ๋Š” CA ์‹œ์Šคํ…œ์„ ์„ ํƒํ•˜๊ธฐ ์–ด๋ ค์›Œ. ๐Ÿšซ

๐ŸŽจ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์˜ ์ŠคํŽ™ํŠธ๋Ÿผ

์ž, ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฑธ ํ•˜๋‚˜ ๋” ์•Œ๋ ค์ค„๊ฒŒ. ์ผ๊ด€์„ฑ์ด๋ผ๋Š” ๊ฒŒ ์‚ฌ์‹ค 0 ์•„๋‹ˆ๋ฉด 1์˜ ์ด๋ถ„๋ฒ•์  ๊ฐœ๋…์ด ์•„๋‹ˆ์•ผ. ์™„์ „ํ•œ ์ผ๊ด€์„ฑ๊ณผ ์™„์ „ํ•œ ๋น„์ผ๊ด€์„ฑ ์‚ฌ์ด์—๋Š” ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์ด ์กด์žฌํ•ด! ์ด๊ฑธ ์ดํ•ดํ•˜๋ฉด ํ›จ์”ฌ ์œ ์—ฐํ•œ ์‹œ์Šคํ…œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€. ๐ŸŽฏ

๐Ÿ’ช ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ (Strong Consistency)

๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์€ CAP์˜ C์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋…์ด์•ผ. ๋ชจ๋“  ์ฝ๊ธฐ ์š”์ฒญ์ด ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์“ฐ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑฐ์ง€. ๋ฐ์ดํ„ฐ๋ฅผ ์“ด ์ฆ‰์‹œ, ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•:
โ€ข 2๋‹จ๊ณ„ ์ปค๋ฐ‹(Two-Phase Commit, 2PC)
โ€ข Paxos ์•Œ๊ณ ๋ฆฌ์ฆ˜
โ€ข Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜
โ€ข ๋™๊ธฐ์‹ ๋ณต์ œ(Synchronous Replication)

์žฅ์ :
โ€ข ๋ฐ์ดํ„ฐ ์ •ํ™•์„ฑ ๋ณด์žฅ
โ€ข ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์ด ๋‹จ์ˆœํ•จ
โ€ข ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ๋‚ฎ์Œ

๋‹จ์ :
โ€ข ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํผ
โ€ข ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์— ๋ฏผ๊ฐ
โ€ข ๊ฐ€์šฉ์„ฑ์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ์Œ

๐Ÿ”ง ๊ธฐ์ˆ  ์ƒ์„ธ: 2๋‹จ๊ณ„ ์ปค๋ฐ‹ ํ”„๋กœํ† ์ฝœ

2๋‹จ๊ณ„ ์ปค๋ฐ‹์€ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด์•ผ:

1๋‹จ๊ณ„ (Prepare):
์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ๋ชจ๋“  ์ฐธ์—ฌ์ž์—๊ฒŒ "์ปค๋ฐ‹ ์ค€๋น„๋์–ด?"๋ผ๊ณ  ๋ฌผ์–ด๋ด. ๊ฐ ์ฐธ์—ฌ์ž๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ๋กœ๊ทธ์— ๊ธฐ๋กํ•œ ๋’ค "์ค€๋น„ ์™„๋ฃŒ!" ๋˜๋Š” "์‹คํŒจ!"๋ผ๊ณ  ์‘๋‹ตํ•ด.

2๋‹จ๊ณ„ (Commit):
๋ชจ๋“  ์ฐธ์—ฌ์ž๊ฐ€ "์ค€๋น„ ์™„๋ฃŒ!"๋ผ๊ณ  ํ•˜๋ฉด ์ฝ”๋””๋„ค์ดํ„ฐ๋Š” "์ปค๋ฐ‹ํ•ด!"๋ผ๊ณ  ๋ช…๋ นํ•ด. ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด "๋กค๋ฐฑํ•ด!"๋ผ๊ณ  ๋ช…๋ นํ•˜์ง€.

์ด ๋ฐฉ์‹์€ ํ™•์‹คํ•˜์ง€๋งŒ, ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ์ฃฝ์œผ๋ฉด ๋ชจ๋“  ์ฐธ์—ฌ์ž๊ฐ€ ๋ธ”๋กœํ‚น๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด. ๊ทธ๋ž˜์„œ 3๋‹จ๊ณ„ ์ปค๋ฐ‹์ด๋‚˜ Paxos ๊ฐ™์€ ๊ฐœ์„ ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ๋‚˜์˜จ ๊ฑฐ์•ผ!

๐ŸŒŠ ์ตœ์ข… ์ผ๊ด€์„ฑ (Eventual Consistency)

์ตœ์ข… ์ผ๊ด€์„ฑ์€ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด. ์ฆ‰์‹œ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๊ฒฐ๊ตญ์—๋Š” ์ผ๊ด€์„ฑ์ด ๋‹ฌ์„ฑ๋˜๋Š” ๊ฑฐ์ง€! ์ด๊ฒŒ ๋ฐ”๋กœ AP ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ด์•ผ. โฐ

ํŠน์ง•:
โ€ข ์“ฐ๊ธฐ ์ž‘์—…์ด ์ฆ‰์‹œ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
โ€ข ์ฝ๊ธฐ ์š”์ฒญ์€ ํ•ญ์ƒ ์‘๋‹ต์„ ๋ฐ›์ง€๋งŒ, ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ
โ€ข ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”
โ€ข ๋†’์€ ๊ฐ€์šฉ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์ œ๊ณต

๊ตฌํ˜„ ์ „๋žต:
โ€ข ๋น„๋™๊ธฐ ๋ณต์ œ(Asynchronous Replication)
โ€ข Gossip ํ”„๋กœํ† ์ฝœ
โ€ข Vector Clock
โ€ข CRDT (Conflict-free Replicated Data Types)

๐Ÿ“ง ์‹ค์ƒํ™œ ๋น„์œ : ์ด๋ฉ”์ผ ์‹œ์Šคํ…œ

์ด๋ฉ”์ผ์„ ์ƒ๊ฐํ•ด๋ด. ๋„ค๊ฐ€ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋ฉด ์ƒ๋Œ€๋ฐฉ์ด ์ฆ‰์‹œ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์–ด. ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ช‡ ์ดˆ์—์„œ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€. ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ๋„์ฐฉํ•ด! ์ด๊ฒŒ ๋ฐ”๋กœ ์ตœ์ข… ์ผ๊ด€์„ฑ์ด์•ผ.

๋งŒ์•ฝ ์ด๋ฉ”์ผ ์‹œ์Šคํ…œ์ด ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์„ ์š”๊ตฌํ–ˆ๋‹ค๋ฉด? ์ƒ๋Œ€๋ฐฉ์˜ ๋ฉ”์ผ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜์–ด ์žˆ์œผ๋ฉด ๋„ค ์ด๋ฉ”์ผ ์ „์†ก์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋ฌดํ•œ์ • ๋Œ€๊ธฐํ•ด์•ผ ํ•  ๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ ์ตœ์ข… ์ผ๊ด€์„ฑ ๋•๋ถ„์— ์ผ๋‹จ ์ „์†ก์€ ์„ฑ๊ณตํ•˜๊ณ , ๋‚˜์ค‘์— ๋ฐฐ๋‹ฌ๋˜๋Š” ๊ฑฐ์ง€!

๐ŸŽš๏ธ ์ธ๊ณผ์  ์ผ๊ด€์„ฑ (Causal Consistency)

์ธ๊ณผ์  ์ผ๊ด€์„ฑ์€ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ๊ณผ ์ตœ์ข… ์ผ๊ด€์„ฑ์˜ ์ค‘๊ฐ„ ์ง€์ ์ด์•ผ. ์ธ๊ณผ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์ž‘์—…๋“ค์€ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€๋งŒ, ์ธ๊ณผ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ž‘์—…๋“ค์€ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์•„.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ:
โ€ข A๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•จ โ†’ B๊ฐ€ ๊ทธ ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€์„ ๋‹ฌ์Œ
์ด ๊ฒฝ์šฐ ๋Œ“๊ธ€์€ ๋ฐ˜๋“œ์‹œ ๊ฒŒ์‹œ๊ธ€ ์ดํ›„์— ๋ณด์—ฌ์•ผ ํ•ด. ์ด๊ฒŒ ์ธ๊ณผ ๊ด€๊ณ„์•ผ!

ํ•˜์ง€๋งŒ:
โ€ข A๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•จ + C๊ฐ€ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•จ
์ด ๋‘ ์ž‘์—…์€ ์ธ๊ณผ ๊ด€๊ณ„๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ƒ๊ด€์—†์–ด.

์žฅ์ :
โ€ข ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์Œ
โ€ข ์ตœ์ข… ์ผ๊ด€์„ฑ๋ณด๋‹ค ์ง๊ด€์ 
โ€ข ๋งŽ์€ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ

๊ตฌํ˜„ ๊ธฐ์ˆ :
โ€ข Lamport Timestamp
โ€ข Vector Clock
โ€ข Causal Broadcast

๐Ÿ“– ์ฝ๊ธฐ ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ

๋งŽ์€ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฝ๊ธฐ ์š”์ฒญ๋งˆ๋‹ค ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ์ด๊ฒŒ ์ •๋ง ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด์•ผ! ๐ŸŽ›๏ธ

์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ ์„ค๋ช… ์„ฑ๋Šฅ ์‚ฌ์šฉ ์‚ฌ๋ก€
ONE ํ•˜๋‚˜์˜ ๋…ธ๋“œ์—์„œ๋งŒ ์‘๋‹ต ๋ฐ›์Œ โšก ๋งค์šฐ ๋น ๋ฆ„ ๋กœ๊ทธ ์กฐํšŒ, ์บ์‹œ
QUORUM ๊ณผ๋ฐ˜์ˆ˜ ๋…ธ๋“œ์—์„œ ์‘๋‹ต ๋ฐ›์Œ โšก ๋ณดํ†ต ์ผ๋ฐ˜์ ์ธ ์ฝ๊ธฐ ์ž‘์—…
ALL ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‘๋‹ต ๋ฐ›์Œ ๐ŸŒ ๋А๋ฆผ ์ค‘์š”ํ•œ ๊ธˆ์œต ๋ฐ์ดํ„ฐ
LOCAL_QUORUM ๊ฐ™์€ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๋‚ด ๊ณผ๋ฐ˜์ˆ˜ โšก ๋น ๋ฆ„ ์ง€์—ญ๋ณ„ ์„œ๋น„์Šค
๐Ÿ’ก Cassandra์˜ ํŠœ๋‹ ๊ฐ€๋Šฅํ•œ ์ผ๊ด€์„ฑ

Cassandra๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ž‘์—…๋งˆ๋‹ค ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด:

// ๋น ๋ฅธ ์ฝ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
SELECT * FROM users WHERE id = 123 
USING CONSISTENCY ONE;

// ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
SELECT * FROM transactions WHERE id = 456 
USING CONSISTENCY QUORUM;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ™์€ ์‹œ์Šคํ…œ์—์„œ๋„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ๊ณผ ์ผ๊ด€์„ฑ์˜ ๊ท ํ˜•์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์–ด! ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ๋Š” ONE์œผ๋กœ, ๊ฒฐ์ œ ์ •๋ณด ์กฐํšŒ๋Š” QUORUM์œผ๋กœ ์„ค์ •ํ•˜๋Š” ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ง€.

๐Ÿ› ๏ธ ์‹ค์ „ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ „๋žต

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž! ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๊ฐ€ ์ง„์งœ ์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์ด์•ผ. ๐Ÿ˜Ž

1๏ธโƒฃ ๋ณต์ œ ์ „๋žต (Replication Strategies)

๐Ÿ”„ ๋™๊ธฐ์‹ ๋ณต์ œ (Synchronous Replication)

๋™๊ธฐ์‹ ๋ณต์ œ๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ, ๋ชจ๋“  ๋ณต์ œ๋ณธ์—๋„ ๋™์‹œ์— ์“ฐ๊ณ  ํ™•์ธ์„ ๋ฐ›๋Š” ๋ฐฉ์‹์ด์•ผ. ๋ชจ๋“  ๋ณต์ œ๋ณธ์ด "์“ฐ๊ธฐ ์™„๋ฃŒ!"๋ผ๊ณ  ์‘๋‹ตํ•ด์•ผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„ฑ๊ณต์„ ์•Œ๋ ค์ค˜.

์žฅ์ :
โ€ข ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ ๋ณด์žฅ
โ€ข ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜ ์ตœ์†Œํ™”
โ€ข ํŽ˜์ผ์˜ค๋ฒ„ ์‹œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ณด์žฅ

๋‹จ์ :
โ€ข ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ๋А๋ฆผ (๊ฐ€์žฅ ๋А๋ฆฐ ๋…ธ๋“œ์— ์˜์กด)
โ€ข ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์— ๋ฏผ๊ฐ
โ€ข ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ์ด๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด ์“ฐ๊ธฐ ์‹คํŒจ

์ ์šฉ ์‚ฌ๋ก€:
MySQL์˜ Semi-Synchronous Replication, PostgreSQL์˜ Synchronous Standby

โšก ๋น„๋™๊ธฐ์‹ ๋ณต์ œ (Asynchronous Replication)

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

์žฅ์ :
โ€ข ๋น ๋ฅธ ์“ฐ๊ธฐ ์„ฑ๋Šฅ
โ€ข ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์— ๋œ ๋ฏผ๊ฐ
โ€ข ๋ณต์ œ๋ณธ ์žฅ์• ๊ฐ€ ๋งˆ์Šคํ„ฐ์— ์˜ํ–ฅ ์—†์Œ

๋‹จ์ :
โ€ข ๋ณต์ œ ์ง€์—ฐ(Replication Lag) ๋ฐœ์ƒ
โ€ข ๋งˆ์Šคํ„ฐ ์žฅ์•  ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค ๊ฐ€๋Šฅ
โ€ข ์ฝ๊ธฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ ์–ด๋ ค์›€

์ ์šฉ ์‚ฌ๋ก€:
MySQL์˜ ๊ธฐ๋ณธ ๋ณต์ œ ๋ฐฉ์‹, MongoDB์˜ Secondary ๋ณต์ œ

โš ๏ธ ๋ณต์ œ ์ง€์—ฐ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

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

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
โ€ข Read-Your-Writes ์ผ๊ด€์„ฑ: ์ž์‹ ์ด ์“ด ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๋งˆ์Šคํ„ฐ์—์„œ ์ฝ๊ธฐ
โ€ข Session Consistency: ๊ฐ™์€ ์„ธ์…˜ ๋‚ด์—์„œ๋Š” ์ผ๊ด€์„ฑ ๋ณด์žฅ
โ€ข Monotonic Reads: ํ•œ ๋ฒˆ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ฉด, ์ดํ›„๋กœ๋Š” ์ ˆ๋Œ€ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ ์ฝ์Œ
โ€ข Sticky Session: ํŠน์ • ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๋ณต์ œ๋ณธ์—์„œ ์ฝ๊ธฐ

2๏ธโƒฃ ์ƒค๋”ฉ ์ „๋žต (Sharding Strategies)

์ƒค๋”ฉ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•์ด์•ผ. ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์šธ ์ •๋„๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ ์‚ฌ์šฉํ•˜์ง€. ๊ฐ ์ƒค๋“œ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋งŒ ๋‹ด๋‹นํ•ด! ๐Ÿ—‚๏ธ

๐Ÿ”‘ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ

ํ‚ค ๊ฐ’์„ ํ•ด์‹œ ํ•จ์ˆ˜์— ๋„ฃ์–ด์„œ ์–ด๋А ์ƒค๋“œ์— ์ €์žฅํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.

shard_id = hash(user_id) % number_of_shards

์žฅ์ :
โ€ข ๋ฐ์ดํ„ฐ๊ฐ€ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐ๋จ
โ€ข ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•จ
โ€ข ํ•ซ์ŠคํŒŸ ๋ฌธ์ œ๊ฐ€ ์ ์Œ

๋‹จ์ :
โ€ข ์ƒค๋“œ ์ถ”๊ฐ€/์ œ๊ฑฐ ์‹œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ด๋™ ํ•„์š”
โ€ข ๋ฒ”์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋ ค์›€
โ€ข ๊ด€๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ํฉ์–ด์งˆ ์ˆ˜ ์žˆ์Œ

๐Ÿ“Š ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ

ํ‚ค ๊ฐ’์˜ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ƒค๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ด์•ผ.

์˜ˆ์‹œ:
โ€ข Shard 1: user_id 1 ~ 1,000,000
โ€ข Shard 2: user_id 1,000,001 ~ 2,000,000
โ€ข Shard 3: user_id 2,000,001 ~ 3,000,000

์žฅ์ :
โ€ข ๋ฒ”์œ„ ์ฟผ๋ฆฌ๊ฐ€ ํšจ์œจ์ 
โ€ข ์ƒค๋“œ ์ถ”๊ฐ€๊ฐ€ ๋น„๊ต์  ์‰ฌ์›€
โ€ข ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ์ƒค๋“œ์— ๋ฐฐ์น˜ ๊ฐ€๋Šฅ

๋‹จ์ :
โ€ข ํ•ซ์ŠคํŒŸ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
โ€ข ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๊ฐ€ ๋ถˆ๊ท ๋“ฑํ•  ์ˆ˜ ์žˆ์Œ
โ€ข ๋ฒ”์œ„ ์„ค์ •์ด ์–ด๋ ค์›€

๐Ÿ—‚๏ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ

๋ณ„๋„์˜ ๋ฃฉ์—… ํ…Œ์ด๋ธ”์„ ๋‘๊ณ , ๊ฐ ํ‚ค๊ฐ€ ์–ด๋А ์ƒค๋“œ์— ์žˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.

์žฅ์ :
โ€ข ์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ๋ฐฐ์น˜
โ€ข ์ƒค๋“œ ์ถ”๊ฐ€/์ œ๊ฑฐ๊ฐ€ ์‰ฌ์›€
โ€ข ๋ณต์žกํ•œ ์ƒค๋”ฉ ๋กœ์ง ๊ตฌํ˜„ ๊ฐ€๋Šฅ

๋‹จ์ :
โ€ข ๋ฃฉ์—… ํ…Œ์ด๋ธ”์ด ๋‹จ์ผ ์žฅ์• ์ (SPOF)์ด ๋  ์ˆ˜ ์žˆ์Œ
โ€ข ์ถ”๊ฐ€์ ์ธ ์กฐํšŒ ์˜ค๋ฒ„ํ—ค๋“œ
โ€ข ๋ฃฉ์—… ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ ๋ณต์žก๋„

๐ŸŽฏ ์‹ค์ „ ํŒ: ์ผ๊ด€๋œ ํ•ด์‹ฑ (Consistent Hashing)

์ผ๋ฐ˜ ํ•ด์‹œ ์ƒค๋”ฉ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•œ ๊ฒŒ ์ผ๊ด€๋œ ํ•ด์‹ฑ์ด์•ผ! ์ƒค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ๋•Œ ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์•ฝ 1/N๋งŒ ์ด๋™ํ•˜๋ฉด ๋ผ. (N์€ ์ƒค๋“œ ๊ฐœ์ˆ˜)

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

Amazon DynamoDB, Cassandra, Memcached ๋“ฑ์ด ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด! ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฑฐ์˜ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ด์•ผ.

3๏ธโƒฃ ์ถฉ๋Œ ํ•ด๊ฒฐ ์ „๋žต (Conflict Resolution)

์ตœ์ข… ์ผ๊ด€์„ฑ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋™์‹œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋•Œ ์ถฉ๋Œ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ์ •ํ•ด์•ผ ํ•ด! ๐ŸฅŠ

โฐ ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜ (Last-Write-Wins)

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด์•ผ. ๊ฐ€์žฅ ์ตœ๊ทผ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ฐ€์ง„ ์“ฐ๊ธฐ๊ฐ€ ์ด๊ธด๋‹ค๋Š” ๊ฑฐ์ง€!

์žฅ์ :
โ€ข ๊ตฌํ˜„์ด ๋งค์šฐ ๊ฐ„๋‹จ
โ€ข ๊ฒฐ์ •๋ก ์  (ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ)
โ€ข ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ ์Œ

๋‹จ์ :
โ€ข ๋ฐ์ดํ„ฐ ์†์‹ค ๊ฐ€๋Šฅ (๋จผ์ € ์“ด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง)
โ€ข ์‹œ๊ณ„ ๋™๊ธฐํ™” ๋ฌธ์ œ
โ€ข ๋™์‹œ ์“ฐ๊ธฐ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌด์‹œ๋จ

์ ์šฉ ์‚ฌ๋ก€:
Cassandra์˜ ๊ธฐ๋ณธ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐฉ์‹

๐Ÿ”ข ๋ฒ„์ „ ๋ฒกํ„ฐ (Version Vectors)

๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์˜ ๋ฒ„์ „ ์นด์šดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ. ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ง์ ‘ ํ•ด๊ฒฐํ•˜๊ฒŒ ํ•ด.

๋™์ž‘ ๋ฐฉ์‹:
โ€ข ๊ฐ ๋ฐ์ดํ„ฐ๋Š” [Node1: v1, Node2: v2, Node3: v3] ๊ฐ™์€ ๋ฒ„์ „ ๋ฒกํ„ฐ๋ฅผ ๊ฐ€์ง
โ€ข ์“ฐ๊ธฐ ์ž‘์—… ์‹œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฒ„์ „์„ ์ฆ๊ฐ€
โ€ข ๋‘ ๋ฒ„์ „์„ ๋น„๊ตํ•ด์„œ ์ธ๊ณผ ๊ด€๊ณ„ ํŒŒ์•…
โ€ข ์ธ๊ณผ ๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฉด ์ถฉ๋Œ๋กœ ํŒ๋‹จ

์žฅ์ :
โ€ข ๋ฐ์ดํ„ฐ ์†์‹ค ์—†์Œ
โ€ข ์ •ํ™•ํ•œ ์ธ๊ณผ ๊ด€๊ณ„ ์ถ”์ 
โ€ข ์‹œ๊ณ„ ๋™๊ธฐํ™” ๋ถˆํ•„์š”

๋‹จ์ :
โ€ข ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ค๋ฒ„ํ—ค๋“œ
โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ถฉ๋Œ ํ•ด๊ฒฐ ๋กœ์ง ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
โ€ข ๋ณต์žก๋„ ์ฆ๊ฐ€

์ ์šฉ ์‚ฌ๋ก€:
Amazon DynamoDB, Riak

๐Ÿ”€ CRDT (Conflict-free Replicated Data Types)

CRDT๋Š” ์ˆ˜ํ•™์ ์œผ๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด์•ผ. ์ •๋ง ๋ฉ‹์ง„ ๊ฐœ๋…์ด์ง€! ๐ŸŽ“

CRDT์˜ ์ข…๋ฅ˜:

G-Counter (Grow-only Counter):
์ฆ๊ฐ€๋งŒ ๊ฐ€๋Šฅํ•œ ์นด์šดํ„ฐ. ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์˜ ์นด์šดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์ „์ฒด ๊ฐ’์€ ๋ชจ๋“  ๋…ธ๋“œ์˜ ํ•ฉ.

PN-Counter (Positive-Negative Counter):
์ฆ๊ฐ€์™€ ๊ฐ์†Œ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ์นด์šดํ„ฐ. ์ฆ๊ฐ€ ์นด์šดํ„ฐ์™€ ๊ฐ์†Œ ์นด์šดํ„ฐ๋ฅผ ๋”ฐ๋กœ ์œ ์ง€.

LWW-Element-Set:
Last-Write-Wins ๋ฐฉ์‹์˜ ์ง‘ํ•ฉ. ๊ฐ ์›์†Œ์— ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ถ™์—ฌ์„œ ๊ด€๋ฆฌ.

OR-Set (Observed-Remove Set):
์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ์ง‘ํ•ฉ. ๊ฐ ์›์†Œ์— ๊ณ ์œ  ID๋ฅผ ๋ถ€์—ฌํ•ด์„œ ์ถฉ๋Œ ๋ฐฉ์ง€.

์žฅ์ :
โ€ข ์ž๋™์œผ๋กœ ์ถฉ๋Œ ํ•ด๊ฒฐ
โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์ด ๋‹จ์ˆœ
โ€ข ์ˆ˜ํ•™์ ์œผ๋กœ ์ฆ๋ช…๋œ ์ •ํ™•์„ฑ

๋‹จ์ :
โ€ข ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํด ์ˆ˜ ์žˆ์Œ
โ€ข ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ์ ์šฉ ๋ถˆ๊ฐ€
โ€ข ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฆ„

์ ์šฉ ์‚ฌ๋ก€:
Redis Enterprise, Riak, Akka Distributed Data

๐ŸŽฎ ์‹ค์ „ ์˜ˆ์‹œ: ํ˜‘์—… ๋ฌธ์„œ ํŽธ์ง‘

Google Docs ๊ฐ™์€ ํ˜‘์—… ๋„๊ตฌ๋ฅผ ์ƒ๊ฐํ•ด๋ด. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ํŽธ์ง‘ํ•˜๋Š”๋ฐ, ์ถฉ๋Œ์ด ๊ฑฐ์˜ ์•ˆ ์ƒ๊ธฐ์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ CRDT ๋•๋ถ„์ด์•ผ!

๋ฌธ์„œ๋ฅผ ๋ฌธ์ž ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ณ , ๊ฐ ๋ฌธ์ž์— ๊ณ ์œ  ID๋ฅผ ๋ถ€์—ฌํ•ด. ๋ˆ„๊ตฐ๊ฐ€ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ์œ„์น˜์— ์ƒˆ ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ID๋ฅผ ์ œ๊ฑฐ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑฐ์•ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์˜ ํŽธ์ง‘์ด ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ๋ผ!

4๏ธโƒฃ ์ฟผ๋Ÿผ ๊ธฐ๋ฐ˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ

์ฟผ๋Ÿผ(Quorum)์€ ๊ณผ๋ฐ˜์ˆ˜ ๋…ธ๋“œ์˜ ๋™์˜๋ฅผ ์–ป์–ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ. ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ํ›Œ๋ฅญํ•œ ์ „๋žต์ด์ง€! โš–๏ธ

๊ธฐ๋ณธ ๊ฐœ๋…:
โ€ข N: ์ „์ฒด ๋ณต์ œ๋ณธ ์ˆ˜
โ€ข W: ์“ฐ๊ธฐ ์„ฑ๊ณต์— ํ•„์š”ํ•œ ๋…ธ๋“œ ์ˆ˜
โ€ข R: ์ฝ๊ธฐ ์„ฑ๊ณต์— ํ•„์š”ํ•œ ๋…ธ๋“œ ์ˆ˜

์ผ๊ด€์„ฑ ๋ณด์žฅ ์กฐ๊ฑด:
W + R > N ์ด๋ฉด ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ ๋ณด์žฅ!

์˜ˆ๋ฅผ ๋“ค์–ด N=3์ผ ๋•Œ:
โ€ข W=2, R=2 โ†’ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ (2+2 > 3)
โ€ข W=1, R=3 โ†’ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ (1+3 > 3)
โ€ข W=1, R=1 โ†’ ์ตœ์ข… ์ผ๊ด€์„ฑ (1+1 < 3)

์‹ค์ „ ์„ค์ • ์˜ˆ์‹œ:

์„ค์ • W R ํŠน์ง• ์‚ฌ์šฉ ์‚ฌ๋ก€
์ฝ๊ธฐ ์ตœ์ ํ™” N 1 ๋น ๋ฅธ ์ฝ๊ธฐ, ๋А๋ฆฐ ์“ฐ๊ธฐ ๋กœ๊ทธ ์‹œ์Šคํ…œ
์“ฐ๊ธฐ ์ตœ์ ํ™” 1 N ๋น ๋ฅธ ์“ฐ๊ธฐ, ๋А๋ฆฐ ์ฝ๊ธฐ ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
๊ท ํ˜• Q Q ์ค‘๊ฐ„ ์„ฑ๋Šฅ, ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ ์ผ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
์ตœ์ข… ์ผ๊ด€์„ฑ 1 1 ์ตœ๊ณ  ์„ฑ๋Šฅ, ์•ฝํ•œ ์ผ๊ด€์„ฑ ์บ์‹œ, ์„ธ์…˜ ์ €์žฅ์†Œ
๐Ÿ’ก Dynamo ์Šคํƒ€์ผ ์‹œ์Šคํ…œ์˜ ์ฟผ๋Ÿผ

Amazon DynamoDB, Cassandra ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ์ฟผ๋Ÿผ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์„ ์‚ฌ์šฉํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด N=3, W=2, R=2๋กœ ์„ค์ •ํ•˜๋ฉด:

์“ฐ๊ธฐ ๊ณผ์ •:
1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์“ฐ๊ธฐ ์š”์ฒญ
2. ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ 3๊ฐœ ๋…ธ๋“œ์— ์“ฐ๊ธฐ ์‹œ๋„
3. 2๊ฐœ ๋…ธ๋“œ์—์„œ ์„ฑ๊ณต ์‘๋‹ต ๋ฐ›์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„ฑ๊ณต ๋ฐ˜ํ™˜
4. ๋‚˜๋จธ์ง€ 1๊ฐœ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌ

์ฝ๊ธฐ ๊ณผ์ •:
1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ๊ธฐ ์š”์ฒญ
2. ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ 3๊ฐœ ๋…ธ๋“œ์—์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ
3. 2๊ฐœ ๋…ธ๋“œ์—์„œ ์‘๋‹ต ๋ฐ›์œผ๋ฉด ๋ฒ„์ „ ๋น„๊ต
4. ์ตœ์‹  ๋ฒ„์ „์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜
5. ์˜ค๋ž˜๋œ ๋ฒ„์ „์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜๋ฆฌ(Read Repair)

5๏ธโƒฃ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ํŒจํ„ด

๐ŸŽญ Saga ํŒจํ„ด

Saga๋Š” ๊ธด ํŠธ๋žœ์žญ์…˜์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋กœ์ปฌ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํŒจํ„ด์ด์•ผ. ๊ฐ ๋กœ์ปฌ ํŠธ๋žœ์žญ์…˜์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ปค๋ฐ‹๋˜๊ณ , ์‹คํŒจ ์‹œ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋กค๋ฐฑํ•ด! ๐Ÿ”„

์˜ˆ์‹œ: ์˜จ๋ผ์ธ ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ
1. ์ฃผ๋ฌธ ์ƒ์„ฑ (Order Service)
2. ๊ฒฐ์ œ ์ฒ˜๋ฆฌ (Payment Service)
3. ์žฌ๊ณ  ์ฐจ๊ฐ (Inventory Service)
4. ๋ฐฐ์†ก ์ค€๋น„ (Shipping Service)

๋งŒ์•ฝ 3๋‹จ๊ณ„์—์„œ ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด?
โ€ข ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜: ๊ฒฐ์ œ ์ทจ์†Œ โ†’ ์ฃผ๋ฌธ ์ทจ์†Œ

๊ตฌํ˜„ ๋ฐฉ์‹:

Choreography (์•ˆ๋ฌด ๋ฐฉ์‹):
๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ๋ฐฉ์‹. ์ค‘์•™ ์กฐ์ •์ž ์—†์ด ์„œ๋น„์Šค๋“ค์ด ํ˜‘๋ ฅ.

Orchestration (์˜ค์ผ€์ŠคํŠธ๋ผ ๋ฐฉ์‹):
์ค‘์•™ ์กฐ์ •์ž(Orchestrator)๊ฐ€ ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ช…๋ นํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹.

์žฅ์ :
โ€ข ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์— ์ ํ•ฉ
โ€ข ๊ฐ ์„œ๋น„์Šค์˜ ๋…๋ฆฝ์„ฑ ์œ ์ง€
โ€ข 2PC๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์Œ

๋‹จ์ :
โ€ข ๊ตฌํ˜„ ๋ณต์žก๋„๊ฐ€ ๋†’์Œ
โ€ข ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์„ค๊ณ„๊ฐ€ ์–ด๋ ค์›€
โ€ข ์ผ์‹œ์  ๋ถˆ์ผ์น˜ ์ƒํƒœ ์กด์žฌ

๐Ÿ“ฆ Event Sourcing

Event Sourcing์€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ด๋ฒคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ํŒจํ„ด์ด์•ผ. ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ƒํƒœ๋ฅผ ๋งŒ๋“  ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฑฐ์ง€!

์˜ˆ์‹œ: ์€ํ–‰ ๊ณ„์ขŒ
์ „ํ†ต์  ๋ฐฉ์‹: ์ž”์•ก = 100,000์› (ํ˜„์žฌ ์ƒํƒœ๋งŒ ์ €์žฅ)

Event Sourcing ๋ฐฉ์‹:
โ€ข ๊ณ„์ขŒ ๊ฐœ์„ค: +100,000์›
โ€ข ์ž…๊ธˆ: +50,000์›
โ€ข ์ถœ๊ธˆ: -30,000์›
โ€ข ์ถœ๊ธˆ: -20,000์›
โ†’ ํ˜„์žฌ ์ž”์•ก = 100,000์› (์ด๋ฒคํŠธ๋ฅผ ์žฌ์ƒํ•ด์„œ ๊ณ„์‚ฐ)

์žฅ์ :
โ€ข ์™„๋ฒฝํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ
โ€ข ์‹œ๊ฐ„ ์—ฌํ–‰ ๊ฐ€๋Šฅ (๊ณผ๊ฑฐ ์ƒํƒœ ์žฌ๊ตฌ์„ฑ)
โ€ข ์ด๋ฒคํŠธ ์žฌ์ƒ์œผ๋กœ ๋ฒ„๊ทธ ๋””๋ฒ„๊น…
โ€ข ์—ฌ๋Ÿฌ ์ฝ๊ธฐ ๋ชจ๋ธ ์ƒ์„ฑ ๊ฐ€๋Šฅ

๋‹จ์ :
โ€ข ์ด๋ฒคํŠธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์–ด๋ ค์›€
โ€ข ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ (์ด๋ฒคํŠธ ์žฌ์ƒ ํ•„์š”)
โ€ข ์ €์žฅ ๊ณต๊ฐ„ ์ฆ๊ฐ€
โ€ข ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฆ„

๐ŸŽฏ CQRS์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

Event Sourcing์€ ๋ณดํ†ต CQRS(Command Query Responsibility Segregation)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด. ์“ฐ๊ธฐ๋Š” ์ด๋ฒคํŠธ๋กœ ์ €์žฅํ•˜๊ณ , ์ฝ๊ธฐ๋Š” ๋ณ„๋„์˜ ์ตœ์ ํ™”๋œ ๋ทฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์•ผ!

์˜ˆ๋ฅผ ๋“ค์–ด:
โ€ข Write Model: ์ด๋ฒคํŠธ ์Šคํ† ์–ด์— ์ด๋ฒคํŠธ ์ €์žฅ
โ€ข Read Model: ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•ด์„œ MongoDB์— ์ตœ์ ํ™”๋œ ๋ฌธ์„œ ์ƒ์„ฑ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด!
๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ „๋žต ์„ ํƒ ๊ฐ€์ด๋“œ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ Strong Consistency โœ“ ๊ธˆ์œต ๊ฑฐ๋ž˜ โœ“ ์žฌ๊ณ  ๊ด€๋ฆฌ โœ“ ์˜ˆ์•ฝ ์‹œ์Šคํ…œ โœ“ ์˜๋ฃŒ ๊ธฐ๋ก ์ •ํ™•์„ฑ ์ตœ์šฐ์„  ์ตœ์ข… ์ผ๊ด€์„ฑ Eventual Consistency โœ“ ์†Œ์…œ ๋ฏธ๋””์–ด โœ“ ์ฝ˜ํ…์ธ  ์ „์†ก โœ“ ๋กœ๊ทธ ์ˆ˜์ง‘ โœ“ ์บ์‹ฑ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ตœ์šฐ์„  ์ธ๊ณผ์  ์ผ๊ด€์„ฑ Causal Consistency โœ“ ํ˜‘์—… ๋„๊ตฌ โœ“ ๋ฉ”์‹œ์ง• ์•ฑ โœ“ ๋Œ“๊ธ€ ์‹œ์Šคํ…œ โœ“ ๊ฒŒ์‹œํŒ ๊ท ํ˜•์žกํžŒ ์„ ํƒ ์„ ํƒ ๊ธฐ์ค€ 1 ๋ฐ์ดํ„ฐ ์ •ํ™•์„ฑ์ด ๋น„์ฆˆ๋‹ˆ์Šค์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ 2 ์˜ˆ์ƒ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ ๊ทœ๋ชจ 3 ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์š”๊ตฌ์‚ฌํ•ญ 4 ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„ 5 ๊ฐœ๋ฐœํŒ€์˜ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰ 6 ์šด์˜ ๋ณต์žก๋„ ํ—ˆ์šฉ ๋ฒ”์œ„

๐Ÿ—๏ธ ์‹ค์ œ ์‹œ์Šคํ…œ ์‚ฌ๋ก€ ์—ฐ๊ตฌ

์ด๋ก ๋งŒ ๋ฐฐ์šฐ๋ฉด ์žฌ๋ฏธ์—†์ง€! ์‹ค์ œ ์œ ๋ช…ํ•œ ์‹œ์Šคํ…œ๋“ค์ด ์–ด๋–ป๊ฒŒ CAP ์ •๋ฆฌ๋ฅผ ์ ์šฉํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž. ๐Ÿ˜Š

๐Ÿ›’ Amazon DynamoDB - AP ์‹œ์Šคํ…œ์˜ ๋Œ€ํ‘œ์ฃผ์ž

DynamoDB๋Š” Amazon์ด ๋งŒ๋“  ์™„์ „ ๊ด€๋ฆฌํ˜• NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์•ผ. 2007๋…„ ๋…ผ๋ฌธ์œผ๋กœ ๋ฐœํ‘œ๋œ Dynamo์˜ ์›๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€.

ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™:
โ€ข ๊ฐ€์šฉ์„ฑ ์ตœ์šฐ์„ : "ํ•ญ์ƒ ์“ธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"
โ€ข ์ตœ์ข… ์ผ๊ด€์„ฑ: ๋ฐ์ดํ„ฐ๋Š” ๊ฒฐ๊ตญ ์ผ์น˜ํ•œ๋‹ค
โ€ข ์ผ๊ด€๋œ ํ•ด์‹ฑ: ๋…ธ๋“œ ์ถ”๊ฐ€/์ œ๊ฑฐ๊ฐ€ ์‰ฌ์›€
โ€ข Vector Clock: ์ถฉ๋Œ ๊ฐ์ง€ ๋ฐ ํ•ด๊ฒฐ
โ€ข Gossip ํ”„๋กœํ† ์ฝœ: ๋…ธ๋“œ ๊ฐ„ ์ •๋ณด ๊ณต์œ 

์™œ AP๋ฅผ ์„ ํƒํ–ˆ์„๊นŒ?
Amazon์˜ ์‡ผํ•‘ ์นดํŠธ๋ฅผ ์ƒ๊ฐํ•ด๋ด. ์‚ฌ์šฉ์ž๊ฐ€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š”๋ฐ "์„œ๋ฒ„ ์ ๊ฒ€ ์ค‘"์ด๋ผ๊ณ  ๋œจ๋ฉด? ๊ทธ๊ฑด ๊ณง ๋งค์ถœ ์†์‹ค์ด์•ผ! ๐Ÿ’ธ

์ฐจ๋ผ๋ฆฌ ์ผ์‹œ์ ์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด์šฉ์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋”๋ผ๋„, ํ•ญ์ƒ ์„œ๋น„์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•ด. ๋‚˜์ค‘์— ๋™๊ธฐํ™”ํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ!

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค:
์ดˆ๊ธฐ Dynamo๋Š” ์ถฉ๋Œ ํ•ด๊ฒฐ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ๋งก๊ฒผ์–ด. ํ•˜์ง€๋งŒ DynamoDB๋Š” Last-Write-Wins๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋” ์‰ฌ์›Œ์กŒ์ง€!

๐Ÿ”ง DynamoDB์˜ ์ผ๊ด€์„ฑ ์˜ต์…˜

DynamoDB๋Š” ์ฝ๊ธฐ ์š”์ฒญ๋งˆ๋‹ค ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด:

Eventually Consistent Read (๊ธฐ๋ณธ):
โ€ข ๊ฐ€์žฅ ๋น ๋ฆ„
โ€ข ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ
โ€ข ๋น„์šฉ์ด ์ €๋ ด (์ฝ๊ธฐ ์šฉ๋Ÿ‰ ๋‹จ์œ„ 0.5 ์†Œ๋น„)

Strongly Consistent Read:
โ€ข ํ•ญ์ƒ ์ตœ์‹  ๋ฐ์ดํ„ฐ
โ€ข ์•ฝ๊ฐ„ ๋А๋ฆผ
โ€ข ๋น„์šฉ์ด ๋น„์Œˆ (์ฝ๊ธฐ ์šฉ๋Ÿ‰ ๋‹จ์œ„ 1 ์†Œ๋น„)

์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ์ •๋ง ์œ ์—ฐํ•˜์ง€!

๐Ÿ’พ Google Spanner - CA๋ฅผ ํ–ฅํ•œ ๋„์ „

Spanner๋Š” Google์ด ๋งŒ๋“  ๊ธ€๋กœ๋ฒŒ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์•ผ. ๋†€๋ž๊ฒŒ๋„ ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ์œผ๋ฉด์„œ๋„ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•ด! ๐ŸŒ

ํ•ต์‹ฌ ๊ธฐ์ˆ :
โ€ข TrueTime API: GPS์™€ ์›์ž์‹œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ ์ •ํ™•ํ•œ ์‹œ๊ฐ„ ๋™๊ธฐํ™”
โ€ข 2๋‹จ๊ณ„ ์ปค๋ฐ‹: ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ง€์›
โ€ข Paxos: ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜
โ€ข ์™ธ๋ถ€ ์ผ๊ด€์„ฑ: ํŠธ๋žœ์žญ์…˜ ์ˆœ์„œ๊ฐ€ ์‹ค์ œ ์‹œ๊ฐ„ ์ˆœ์„œ์™€ ์ผ์น˜

TrueTime์˜ ๋งˆ๋ฒ•:
TrueTime์€ ํ˜„์žฌ ์‹œ๊ฐ„์„ [earliest, latest] ๊ตฌ๊ฐ„์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด [10:00:00.000, 10:00:00.007] ์ด๋Ÿฐ ์‹์ด์ง€. ์ด ๋ถˆํ™•์‹ค์„ฑ ๊ตฌ๊ฐ„์ด 7ms๋ผ๋Š” ๊ฑฐ์•ผ.

Spanner๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ ์ด ๋ถˆํ™•์‹ค์„ฑ ๊ตฌ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ํŠธ๋žœ์žญ์…˜ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜๊ฒŒ ๋ผ! ๐ŸŽฏ

ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:
โ€ข ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์„ ์–ป์—ˆ์ง€๋งŒ, ์“ฐ๊ธฐ ์ง€์—ฐ์ด ์ฆ๊ฐ€ํ•ด (๋ถˆํ™•์‹ค์„ฑ ๊ตฌ๊ฐ„๋งŒํผ ๋Œ€๊ธฐ)
โ€ข ํŠน์ˆ˜ํ•œ ํ•˜๋“œ์›จ์–ด ํ•„์š” (GPS, ์›์ž์‹œ๊ณ„)
โ€ข ์šด์˜ ๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ๋†’์Œ

์‚ฌ์šฉ ์‚ฌ๋ก€:
Google์˜ AdWords, Play Store, Gmail ๋“ฑ์ด Spanner๋ฅผ ์‚ฌ์šฉํ•ด. ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค์ธ๋ฐ๋„ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์ง€!

๐Ÿ“Š Apache Cassandra - ํŠœ๋‹ ๊ฐ€๋Šฅํ•œ ์ผ๊ด€์„ฑ

Cassandra๋Š” Facebook์ด ๊ฐœ๋ฐœํ•˜๊ณ  Apache ์žฌ๋‹จ์ด ๊ด€๋ฆฌํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์•ผ. DynamoDB์™€ Google BigTable์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ–ˆ์ง€!

ํ•ต์‹ฌ ํŠน์ง•:
โ€ข ๋งˆ์Šคํ„ฐ ์—†๋Š” ์•„ํ‚คํ…์ฒ˜: ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™๋“ฑ
โ€ข ํŠœ๋‹ ๊ฐ€๋Šฅํ•œ ์ผ๊ด€์„ฑ: ์š”์ฒญ๋งˆ๋‹ค ๋ ˆ๋ฒจ ์„ ํƒ ๊ฐ€๋Šฅ
โ€ข ์„ ํ˜• ํ™•์žฅ์„ฑ: ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€
โ€ข ๋ฉ€ํ‹ฐ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ์ง€์›

์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ ์˜ˆ์‹œ:

๋ ˆ๋ฒจ ์„ค๋ช… ์ผ๊ด€์„ฑ ์„ฑ๋Šฅ
ANY ํžŒํŠธ ํ•ธ๋“œ์˜คํ”„๋„ ํ—ˆ์šฉ โญ โญโญโญโญโญ
ONE 1๊ฐœ ๋…ธ๋“œ ์‘๋‹ต โญโญ โญโญโญโญ
QUORUM ๊ณผ๋ฐ˜์ˆ˜ ๋…ธ๋“œ ์‘๋‹ต โญโญโญโญ โญโญโญ
ALL ๋ชจ๋“  ๋…ธ๋“œ ์‘๋‹ต โญโญโญโญโญ โญ
๐ŸŽฏ Netflix์˜ Cassandra ํ™œ์šฉ

Netflix๋Š” Cassandra๋ฅผ ๋Œ€๊ทœ๋ชจ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํšŒ์‚ฌ์•ผ. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜์ง€!

โ€ข ์‚ฌ์šฉ์ž ์‹œ์ฒญ ๊ธฐ๋ก: QUORUM ์ผ๊ด€์„ฑ
โ€ข ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ์ดํ„ฐ: ONE ์ผ๊ด€์„ฑ
โ€ข ๊ฒฐ์ œ ์ •๋ณด: ALL ์ผ๊ด€์„ฑ

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ์ค‘์š”๋„์— ๋”ฐ๋ผ ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์„œ ์„ฑ๋Šฅ๊ณผ ์ •ํ™•์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถฐ!

๐Ÿ”„ MongoDB - CP ์‹œ์Šคํ…œ์˜ ์ง„ํ™”

MongoDB๋Š” ๋ฌธ์„œ ์ง€ํ–ฅ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์•ผ. ์ดˆ๊ธฐ์—๋Š” ์ผ๊ด€์„ฑ์ด ์•ฝํ–ˆ์ง€๋งŒ, ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ ์  ๊ฐ•ํ•ด์กŒ์–ด!

๋ณต์ œ ์„ธํŠธ ์•„ํ‚คํ…์ฒ˜:
โ€ข Primary: ๋ชจ๋“  ์“ฐ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌ
โ€ข Secondary: Primary๋กœ๋ถ€ํ„ฐ ๋ณต์ œ
โ€ข Arbiter: ์„ ๊ฑฐ์—๋งŒ ์ฐธ์—ฌ (๋ฐ์ดํ„ฐ ์—†์Œ)

์ผ๊ด€์„ฑ ๋ณด์žฅ:
โ€ข Write Concern: ์“ฐ๊ธฐ ํ™•์ธ ๋ ˆ๋ฒจ ์„ค์ •
โ€ข Read Concern: ์ฝ๊ธฐ ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ ์„ค์ •
โ€ข Read Preference: ์ฝ๊ธฐ ๋Œ€์ƒ ๋…ธ๋“œ ์„ ํƒ

Write Concern ์˜ˆ์‹œ:

// ๊ธฐ๋ณธ (Primary๋งŒ ํ™•์ธ)
db.users.insertOne({name: "Alice"})

// ๊ณผ๋ฐ˜์ˆ˜ ํ™•์ธ
db.users.insertOne(
  {name: "Bob"},
  {writeConcern: {w: "majority"}}
)

// ๋ชจ๋“  ๋…ธ๋“œ ํ™•์ธ
db.users.insertOne(
  {name: "Charlie"},
  {writeConcern: {w: 3}}
)

ํŠธ๋žœ์žญ์…˜ ์ง€์›:
MongoDB 4.0๋ถ€ํ„ฐ๋Š” ๋ฉ€ํ‹ฐ ๋„ํ๋จผํŠธ ACID ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•ด! ์ด์ œ ์ง„์งœ CP ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€. ๐Ÿ’ช

๐Ÿ” Redis - ๋‹ค์–‘ํ•œ ๋ชจ๋“œ ์ง€์›

Redis๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ €์žฅ์†Œ์•ผ. ์บ์‹œ๋กœ ๋งŽ์ด ์“ฐ์ด์ง€๋งŒ, ์˜์†์„ฑ ์˜ต์…˜๋„ ์ œ๊ณตํ•ด!

๋ณต์ œ ๋ชจ๋“œ:
โ€ข ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๋ณต์ œ: ๋น„๋™๊ธฐ์‹ (AP)
โ€ข Sentinel: ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„
โ€ข Cluster: ์ƒค๋”ฉ + ๋ณต์ œ

์˜์†์„ฑ ์˜ต์…˜:
โ€ข RDB: ์Šค๋ƒ…์ƒท ๋ฐฉ์‹
โ€ข AOF: Append-Only File (๋กœ๊ทธ ๋ฐฉ์‹)
โ€ข ๋‘˜ ๋‹ค ์‚ฌ์šฉ ๊ฐ€๋Šฅ

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

ํ•˜์ง€๋งŒ WAIT ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™๊ธฐ์‹ ๋ณต์ œ๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด:

SET key value
WAIT 2 1000  // 2๊ฐœ ์Šฌ๋ ˆ์ด๋ธŒ๊ฐ€ ๋ณต์ œํ•  ๋•Œ๊นŒ์ง€ ์ตœ๋Œ€ 1์ดˆ ๋Œ€๊ธฐ

๐ŸŽ“ ์‹ค์ „ ์„ค๊ณ„ ๊ฐ€์ด๋“œ๋ผ์ธ

์ž, ์ด์ œ ์‹ค์ œ๋กœ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ• ์ง€ ์ •๋ฆฌํ•ด๋ณด์ž! ๐Ÿš€

1๏ธโƒฃ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ํ•˜๊ธฐ

๐Ÿ“‹ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ:
โ–ก ๋ฐ์ดํ„ฐ ์ •ํ™•์„ฑ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ๊ฐ€?
โ–ก ์ผ์‹œ์ ์ธ ๋ถˆ์ผ์น˜๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”๊ฐ€?
โ–ก ์„œ๋น„์Šค ๋‹ค์šดํƒ€์ž„์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์˜ํ–ฅ์€?
โ–ก ๊ทœ์ œ ์ค€์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋Š”๊ฐ€?

๊ธฐ์ˆ ์  ์š”๊ตฌ์‚ฌํ•ญ:
โ–ก ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ ๊ทœ๋ชจ๋Š”?
โ–ก ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ๋‚˜ ๋˜๋Š”๊ฐ€?
โ–ก ์ง€๋ฆฌ์  ๋ถ„์‚ฐ์ด ํ•„์š”ํ•œ๊ฐ€?
โ–ก ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋น„์œจ์€?

์šด์˜ ์š”๊ตฌ์‚ฌํ•ญ:
โ–ก ํŒ€์˜ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰์€?
โ–ก ์šด์˜ ๋ณต์žก๋„ ํ—ˆ์šฉ ๋ฒ”์œ„๋Š”?
โ–ก ์˜ˆ์‚ฐ ์ œ์•ฝ์€?
โ–ก ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ”„๋ผ๋Š”?

2๏ธโƒฃ ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ํ•˜๊ธฐ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€ ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ์•ผ! ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•ด์„œ ๊ฐ๊ฐ์— ๋งž๋Š” ์ „๋žต์„ ์ ์šฉํ•˜์ž. ๐Ÿ—‚๏ธ

๋ฐ์ดํ„ฐ ์œ ํ˜• ์ผ๊ด€์„ฑ ์š”๊ตฌ ๊ถŒ์žฅ ์ „๋žต ์˜ˆ์‹œ
Critical ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ CP ์‹œ์Šคํ…œ, ๋™๊ธฐ ๋ณต์ œ ๊ฒฐ์ œ, ์žฌ๊ณ , ์˜ˆ์•ฝ
Important ์ธ๊ณผ์  ์ผ๊ด€์„ฑ QUORUM, ๋ฒ„์ „ ๋ฒกํ„ฐ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„, ๋Œ“๊ธ€
Normal ์ตœ์ข… ์ผ๊ด€์„ฑ AP ์‹œ์Šคํ…œ, ๋น„๋™๊ธฐ ๋ณต์ œ ์กฐํšŒ์ˆ˜, ์ข‹์•„์š”
Cacheable ์ผ๊ด€์„ฑ ๋ถˆํ•„์š” ์บ์‹œ, TTL ์„ค์ • ์ถ”์ฒœ ๋ชฉ๋ก, ์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ

3๏ธโƒฃ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ์„ ํƒํ•˜๊ธฐ

๐Ÿ›๏ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ํŒจํ„ด์ด์•ผ. ์„œ๋น„์Šค ๊ฐ„ ์ผ๊ด€์„ฑ์€ ์ด๋ฒคํŠธ๋‚˜ API๋กœ ๊ด€๋ฆฌํ•˜์ง€.

์žฅ์ :
โ€ข ์„œ๋น„์Šค ๋…๋ฆฝ์„ฑ
โ€ข ๊ธฐ์ˆ  ์Šคํƒ ์ž์œ ๋„
โ€ข ํ™•์žฅ์„ฑ

๋‹จ์ :
โ€ข ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋ณต์žก
โ€ข ๋ฐ์ดํ„ฐ ์ค‘๋ณต
โ€ข ์šด์˜ ๋ณต์žก๋„

์ผ๊ด€์„ฑ ์ „๋žต:
โ€ข Saga ํŒจํ„ด์œผ๋กœ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ
โ€ข Event Sourcing์œผ๋กœ ๊ฐ์‚ฌ ๋กœ๊ทธ
โ€ข CQRS๋กœ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ถ„๋ฆฌ

๐ŸŽฏ ํด๋ฆฌ๊ธ€๋ž ํผ์‹œ์Šคํ„ด์Šค

๊ฐ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด์•ผ.

์˜ˆ์‹œ ์กฐํ•ฉ:
โ€ข ์‚ฌ์šฉ์ž ์ธ์ฆ: PostgreSQL (ACID ํŠธ๋žœ์žญ์…˜)
โ€ข ์„ธ์…˜ ์ €์žฅ: Redis (๋น ๋ฅธ ์ฝ๊ธฐ/์“ฐ๊ธฐ)
โ€ข ๋กœ๊ทธ ์ €์žฅ: Elasticsearch (๊ฒ€์ƒ‰ ์ตœ์ ํ™”)
โ€ข ํŒŒ์ผ ์ €์žฅ: S3 (๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€)
โ€ข ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ: Kafka (์ŠคํŠธ๋ฆฌ๋ฐ)

์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ๋„ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:
โ€ข ํšŒ์› ์ •๋ณด: MySQL (๊ฐ•ํ•œ ์ผ๊ด€์„ฑ)
โ€ข ์žฌ๋Šฅ ๊ฒ€์ƒ‰: Elasticsearch (๊ฒ€์ƒ‰ ์„ฑ๋Šฅ)
โ€ข ์ฑ„ํŒ…: Redis (์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ)
โ€ข ๋ฆฌ๋ทฐ: MongoDB (์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ)

4๏ธโƒฃ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์•Œ๋ฆผ ์„ค์ •ํ•˜๊ธฐ

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์ •๋ง ์ค‘์š”ํ•ด! ๋ฌธ์ œ๋ฅผ ๋นจ๋ฆฌ ๋ฐœ๊ฒฌํ•ด์•ผ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ. ๐Ÿ“Š

๐Ÿ” ํ•ต์‹ฌ ๋ฉ”ํŠธ๋ฆญ

์ผ๊ด€์„ฑ ๊ด€๋ จ:
โ€ข ๋ณต์ œ ์ง€์—ฐ(Replication Lag): ๋งˆ์Šคํ„ฐ์™€ ์Šฌ๋ ˆ์ด๋ธŒ ๊ฐ„ ์‹œ๊ฐ„ ์ฐจ์ด
โ€ข ์ถฉ๋Œ ๋ฐœ์ƒ ๋นˆ๋„: ๋™์‹œ ์“ฐ๊ธฐ๋กœ ์ธํ•œ ์ถฉ๋Œ ํšŸ์ˆ˜
โ€ข ์ฝ๊ธฐ ์ˆ˜๋ฆฌ(Read Repair) ๋นˆ๋„: ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ ๋ฐœ๊ฒฌ ํšŸ์ˆ˜

๊ฐ€์šฉ์„ฑ ๊ด€๋ จ:
โ€ข ์—…ํƒ€์ž„(Uptime): ์„œ๋น„์Šค ๊ฐ€๋™ ์‹œ๊ฐ„
โ€ข ์—๋Ÿฌ์œจ: ์‹คํŒจํ•œ ์š”์ฒญ ๋น„์œจ
โ€ข ์‘๋‹ต ์‹œ๊ฐ„: P50, P95, P99 ๋ ˆ์ดํ„ด์‹œ

ํŒŒํ‹ฐ์…˜ ๊ด€๋ จ:
โ€ข ๋„คํŠธ์›Œํฌ ๋ถ„ํ•  ๊ฐ์ง€: ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹  ์‹คํŒจ
โ€ข ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ: ์ •์ƒ/๋น„์ •์ƒ ๋…ธ๋“œ ์ˆ˜
โ€ข ํŽ˜์ผ์˜ค๋ฒ„ ํšŸ์ˆ˜: ์ž๋™ ๋ณต๊ตฌ ๋ฐœ์ƒ ๋นˆ๋„

์•Œ๋ฆผ ์„ค์ • ์˜ˆ์‹œ:
โ€ข ๋ณต์ œ ์ง€์—ฐ > 10์ดˆ: Warning
โ€ข ๋ณต์ œ ์ง€์—ฐ > 60์ดˆ: Critical
โ€ข ์—๋Ÿฌ์œจ > 1%: Warning
โ€ข ์—๋Ÿฌ์œจ > 5%: Critical
โ€ข ๋…ธ๋“œ ๋‹ค์šด: Immediate Alert

5๏ธโƒฃ ํ…Œ์ŠคํŠธ ์ „๋žต

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์›Œ. ํ•˜์ง€๋งŒ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๋•์…˜์—์„œ ํฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด! ๐Ÿงช

๐Ÿ”ฌ ์นด์˜ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง

์˜๋„์ ์œผ๋กœ ์žฅ์• ๋ฅผ ์ผ์œผ์ผœ์„œ ์‹œ์Šคํ…œ์˜ ๋ณต์›๋ ฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. Netflix๊ฐ€ ์œ ๋ช…ํ•˜์ง€!

ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค:
โ€ข ๋…ธ๋“œ ๋žœ๋ค ์ข…๋ฃŒ
โ€ข ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์ฃผ์ž…
โ€ข ๋„คํŠธ์›Œํฌ ๋ถ„ํ•  ์‹œ๋ฎฌ๋ ˆ์ด์…˜
โ€ข ๋””์Šคํฌ ๊ฐ€๋“ ์ฐธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
โ€ข CPU/๋ฉ”๋ชจ๋ฆฌ ๋ถ€ํ•˜ ์ƒ์„ฑ

๋„๊ตฌ:
โ€ข Chaos Monkey: ๋žœ๋คํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค ์ข…๋ฃŒ
โ€ข Chaos Kong: ์ „์ฒด ๋ฆฌ์ „ ๋‹ค์šด
โ€ข Latency Monkey: ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์ฃผ์ž…
โ€ข Jepsen: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ผ๊ด€์„ฑ ํ…Œ์ŠคํŠธ

๐ŸŽญ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ

์‹ค์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด๋ณด์ž:

Split-Brain ํ…Œ์ŠคํŠธ:
๋„คํŠธ์›Œํฌ ๋ถ„ํ• ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋‘ ๊ฐœ๋กœ ๋‚˜๋‰˜์—ˆ์„ ๋•Œ, ๊ฐ ํŒŒํ‹ฐ์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ.

Thundering Herd ํ…Œ์ŠคํŠธ:
์บ์‹œ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋™์‹œ์— ์ˆ˜์ฒœ ๊ฐœ์˜ ์š”์ฒญ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ชฐ๋ฆฌ๋Š” ์ƒํ™ฉ.

Cascading Failure ํ…Œ์ŠคํŠธ:
ํ•˜๋‚˜์˜ ๋…ธ๋“œ ์žฅ์• ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์—๊ฒŒ ์—ฐ์‡„์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ƒํ™ฉ.

Data Corruption ํ…Œ์ŠคํŠธ:
๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋˜์—ˆ์„ ๋•Œ ๊ฐ์ง€ํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ™•์ธ.

โš ๏ธ ํ”„๋กœ๋•์…˜์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์นด์˜ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ํ•ด์•ผ ์ง„์งœ ํšจ๊ณผ๊ฐ€ ์žˆ์–ด! ํ•˜์ง€๋งŒ ์กฐ์‹ฌํ•ด์•ผ ํ•ด:

โ€ข ์ž‘์€ ๊ทœ๋ชจ๋กœ ์‹œ์ž‘ (ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ)
โ€ข ์—…๋ฌด ์‹œ๊ฐ„ ์™ธ์— ์‹คํ–‰
โ€ข ๋กค๋ฐฑ ๊ณ„ํš ์ค€๋น„
โ€ข ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ•ํ™”
โ€ข ํŒ€์›๋“ค์—๊ฒŒ ์‚ฌ์ „ ๊ณต์ง€

Netflix๋Š” ๋งค์ผ ํ”„๋กœ๋•์…˜์—์„œ ์นด์˜ค์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด. ๊ทธ๋ž˜์„œ ์‹ค์ œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์นจ์ฐฉํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์•ผ!

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ณด์ž! โšก

1๏ธโƒฃ ์บ์‹ฑ ์ „๋žต

๐Ÿ“ฆ Cache-Aside ํŒจํ„ด

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์บ์‹œ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.

์ฝ๊ธฐ ํ๋ฆ„:
1. ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ
2. ์บ์‹œ ํžˆํŠธ: ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
3. ์บ์‹œ ๋ฏธ์Šค: DB์—์„œ ์กฐํšŒ โ†’ ์บ์‹œ์— ์ €์žฅ โ†’ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜

์“ฐ๊ธฐ ํ๋ฆ„:
1. DB์— ๋ฐ์ดํ„ฐ ์ €์žฅ
2. ์บ์‹œ ๋ฌดํšจํ™” (๋˜๋Š” ์—…๋ฐ์ดํŠธ)

์žฅ์ :
โ€ข ๊ตฌํ˜„์ด ๊ฐ„๋‹จ
โ€ข ์บ์‹œ ์žฅ์• ๊ฐ€ ์„œ๋น„์Šค์— ์˜ํ–ฅ ์—†์Œ
โ€ข ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์บ์‹ฑ

๋‹จ์ :
โ€ข ์บ์‹œ ๋ฏธ์Šค ์‹œ ์ง€์—ฐ
โ€ข ์บ์‹œ์™€ DB ๋ถˆ์ผ์น˜ ๊ฐ€๋Šฅ

๐Ÿ”„ Write-Through ํŒจํ„ด

์“ฐ๊ธฐ ์ž‘์—… ์‹œ ์บ์‹œ์™€ DB๋ฅผ ๋™์‹œ์— ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.

์žฅ์ :
โ€ข ์บ์‹œ์™€ DB๊ฐ€ ํ•ญ์ƒ ์ผ์น˜
โ€ข ์ฝ๊ธฐ ์„ฑ๋Šฅ ์šฐ์ˆ˜

๋‹จ์ :
โ€ข ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์ €ํ•˜
โ€ข ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋„ ์บ์‹ฑ๋  ์ˆ˜ ์žˆ์Œ

โšก Write-Behind ํŒจํ„ด

์บ์‹œ์—๋งŒ ๋จผ์ € ์“ฐ๊ณ , ๋‚˜์ค‘์— ๋ฐฐ์น˜๋กœ DB์— ์“ฐ๋Š” ๋ฐฉ์‹์ด์•ผ.

์žฅ์ :
โ€ข ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์ตœ๊ณ 
โ€ข DB ๋ถ€ํ•˜ ๊ฐ์†Œ

๋‹จ์ :
โ€ข ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜
โ€ข ๊ตฌํ˜„ ๋ณต์žก๋„ ๋†’์Œ

๐Ÿ’ก ์บ์‹œ ๋ฌดํšจํ™” ์ „๋žต

์บ์‹œ ๋ฌดํšจํ™”๋Š” ์ •๋ง ์–ด๋ ค์šด ๋ฌธ์ œ์•ผ. Phil Karlton์ด ๋งํ–ˆ๋“ฏ์ด "์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ์–ด๋ ค์šด ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€๋ฟ์ด๋‹ค: ์บ์‹œ ๋ฌดํšจํ™”์™€ ์ด๋ฆ„ ์ง“๊ธฐ"

์ „๋žต๋“ค:
โ€ข TTL (Time To Live): ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ž๋™ ๋งŒ๋ฃŒ
โ€ข ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜: ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์บ์‹œ ๋ฌดํšจํ™”
โ€ข ๋ฒ„์ „ ๊ด€๋ฆฌ: ํ‚ค์— ๋ฒ„์ „ ๋ฒˆํ˜ธ ํฌํ•จ
โ€ข ํƒœ๊ทธ ๊ธฐ๋ฐ˜: ๊ด€๋ จ ์บ์‹œ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌดํšจํ™”

์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„!

2๏ธโƒฃ ์—ฐ๊ฒฐ ํ’€๋ง

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด์•ผ. ๋งค๋ฒˆ ์ƒˆ ์—ฐ๊ฒฐ์„ ๋งŒ๋“œ๋Š” ๊ฑด ๋น„์šฉ์ด ํฌ๊ฑฐ๋“ ! ๐Ÿ”Œ

์„ค์ • ์˜ˆ์‹œ (HikariCP):

// ์ตœ์†Œ ์œ ํœด ์—ฐ๊ฒฐ ์ˆ˜
minimumIdle: 10

// ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜
maximumPoolSize: 50

// ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ
connectionTimeout: 30000

// ์œ ํœด ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ
idleTimeout: 600000

// ์ตœ๋Œ€ ์ƒ์กด ์‹œ๊ฐ„
maxLifetime: 1800000

ํŠœ๋‹ ํŒ:
โ€ข CPU ์ฝ”์–ด ์ˆ˜์˜ 2~3๋ฐฐ๋กœ ์‹œ์ž‘
โ€ข ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉด์„œ ์กฐ์ •
โ€ข ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜
โ€ข DB ์„œ๋ฒ„์˜ max_connections ๊ณ ๋ ค

3๏ธโƒฃ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ

์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋ฉด ํšจ์œจ์ ์ด์•ผ!

๋ฐฐ์น˜ ์“ฐ๊ธฐ:

// ๋น„ํšจ์œจ์ 
for (User user : users) {
    db.insert(user);  // 1000๋ฒˆ์˜ ๋„คํŠธ์›Œํฌ ์™•๋ณต
}

// ํšจ์œจ์ 
db.batchInsert(users);  // 1๋ฒˆ์˜ ๋„คํŠธ์›Œํฌ ์™•๋ณต

๋ฐฐ์น˜ ์ฝ๊ธฐ:
// ๋น„ํšจ์œจ์ 
for (String id : ids) {
    User user = db.get(id);  // N๋ฒˆ์˜ ์ฟผ๋ฆฌ
}

// ํšจ์œจ์ 
List<User> users = db.multiGet(ids);  // 1๋ฒˆ์˜ ์ฟผ๋ฆฌ

์ฃผ์˜์‚ฌํ•ญ:
โ€ข ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ํ•˜์ง€ ๋ง ๊ฒƒ (๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ)
โ€ข ํƒ€์ž„์•„์›ƒ ์„ค์ • ์ ์ ˆํžˆ
โ€ข ๋ถ€๋ถ„ ์‹คํŒจ ์ฒ˜๋ฆฌ ๋กœ์ง ํ•„์š”

4๏ธโƒฃ ์ฝ๊ธฐ ๋ณต์ œ๋ณธ ํ™œ์šฉ

์ฝ๊ธฐ ์ „์šฉ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ์ฝ๊ธฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ค์ž!

์ „๋žต:
โ€ข ๋งˆ์Šคํ„ฐ: ๋ชจ๋“  ์“ฐ๊ธฐ + ์ค‘์š”ํ•œ ์ฝ๊ธฐ
โ€ข ์Šฌ๋ ˆ์ด๋ธŒ: ์ผ๋ฐ˜์ ์ธ ์ฝ๊ธฐ
โ€ข ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ์ฝ๊ธฐ ์š”์ฒญ ๋ถ„์‚ฐ

์ฃผ์˜์‚ฌํ•ญ:
โ€ข ๋ณต์ œ ์ง€์—ฐ ๊ณ ๋ ค
โ€ข Read-Your-Writes ์ผ๊ด€์„ฑ ํ•„์š” ์‹œ ๋งˆ์Šคํ„ฐ์—์„œ ์ฝ๊ธฐ
โ€ข ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์•  ์‹œ ์ž๋™ ์ œ์™ธ

๐ŸŽฏ ์‹ค์ „ ์˜ˆ์‹œ: ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ถ„๋ฆฌ

// Spring Boot ์˜ˆ์‹œ
@Transactional(readOnly = true)
public User getUser(String id) {
    // ์ž๋™์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ๋ผ์šฐํŒ…
    return userRepository.findById(id);
}

@Transactional
public void updateUser(User user) {
    // ๋งˆ์Šคํ„ฐ๋กœ ๋ผ์šฐํŒ…
    userRepository.save(user);
}

์ด๋ ‡๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜๋งŒ์œผ๋กœ๋„ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด!

5๏ธโƒฃ ์ธ๋ฑ์‹ฑ ์ „๋žต

์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋Š” ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์ˆ˜๋ฐฑ ๋ฐฐ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด! ๐Ÿ“ˆ

์ธ๋ฑ์Šค ์ข…๋ฅ˜:
โ€ข B-Tree: ๋ฒ”์œ„ ์ฟผ๋ฆฌ์— ์ ํ•ฉ
โ€ข Hash: ์ •ํ™•ํ•œ ๋งค์นญ์— ์ ํ•ฉ
โ€ข Full-Text: ํ…์ŠคํŠธ ๊ฒ€์ƒ‰
โ€ข Geospatial: ์œ„์น˜ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ

๋ณตํ•ฉ ์ธ๋ฑ์Šค ์„ค๊ณ„:
โ€ข ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ์„ ์•ž์—
โ€ข WHERE ์ ˆ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ
โ€ข ์ •๋ ฌ์— ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ ๊ณ ๋ ค

์ฃผ์˜์‚ฌํ•ญ:
โ€ข ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์ €ํ•˜
โ€ข ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค๋Š” ์ œ๊ฑฐ
โ€ข ์ •๊ธฐ์ ์œผ๋กœ ์ธ๋ฑ์Šค ์žฌ๊ตฌ์„ฑ

๐Ÿ”ฎ ๋ฏธ๋ž˜ ํŠธ๋ Œ๋“œ์™€ ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฒ•

๋ถ„์‚ฐ ์‹œ์Šคํ…œ๊ณผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ถ„์•ผ๋Š” ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด. ์ตœ์‹  ํŠธ๋ Œ๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž! ๐ŸŒŸ

๐Ÿง  ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”

์ตœ๊ทผ์—๋Š” ML์„ ํ™œ์šฉํ•ด์„œ ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ์„ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ์—ฐ๊ตฌ๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ์–ด.

์•„์ด๋””์–ด:
โ€ข ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด ํ•™์Šต
โ€ข ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํŒจํ„ด ๋ถ„์„
โ€ข ์ž๋™์œผ๋กœ ์ตœ์ ์˜ ์ผ๊ด€์„ฑ ๋ ˆ๋ฒจ ์„ ํƒ
โ€ข ์˜ˆ์ธก ๊ธฐ๋ฐ˜ ํ”„๋ฆฌํŽ˜์นญ

์˜ˆ๋ฅผ ๋“ค์–ด, ํ‰์†Œ์—๋Š” ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ค‘์š”ํ•œ ์ด๋ฒคํŠธ ์‹œ๊ฐ„์—๋Š” ์ž๋™์œผ๋กœ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ์‹์ด์ง€!

๐ŸŒ ์—ฃ์ง€ ์ปดํ“จํŒ…๊ณผ ์ผ๊ด€์„ฑ

5G์™€ IoT์˜ ๋ฐœ์ „์œผ๋กœ ์—ฃ์ง€ ์ปดํ“จํŒ…์ด ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์–ด. ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ๊ณณ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฑฐ์ง€.

๋„์ „ ๊ณผ์ œ:
โ€ข ์ˆ˜์ฒœ ๊ฐœ์˜ ์—ฃ์ง€ ๋…ธ๋“œ ๊ฐ„ ์ผ๊ด€์„ฑ
โ€ข ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ
โ€ข ๊ฐ„ํ—์ ์ธ ์—ฐ๊ฒฐ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
โ€ข ๊ณ„์ธต์  ์ผ๊ด€์„ฑ ๋ชจ๋ธ
โ€ข ์ง€์—ญ ์šฐ์„  ์ฒ˜๋ฆฌ
โ€ข ์˜คํ”„๋ผ์ธ ์šฐ์„  ์„ค๊ณ„

๐Ÿ” ๋ธ”๋ก์ฒด์ธ๊ณผ ๋ถ„์‚ฐ ํ•ฉ์˜

๋ธ”๋ก์ฒด์ธ์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ํ•ฉ์˜๋ฅผ ์ด๋ฃจ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ–ˆ์–ด.

ํ•ต์‹ฌ ๊ฐœ๋…:
โ€ข ์ž‘์—… ์ฆ๋ช…(Proof of Work)
โ€ข ์ง€๋ถ„ ์ฆ๋ช…(Proof of Stake)
โ€ข ๋น„์ž”ํ‹ด ์žฅ์•  ํ—ˆ์šฉ(Byzantine Fault Tolerance)

์ „ํ†ต์ ์ธ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ค๋ฅธ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฐ€์ง€์ง€. ๋†’์€ ์ผ๊ด€์„ฑ๊ณผ ๋ณด์•ˆ์„ ์–ป์ง€๋งŒ, ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ์ƒํ•˜๋Š” ๊ฑฐ์•ผ.

๐ŸŽฎ ๊ฒŒ์ž„ ์„œ๋ฒ„์˜ ์ผ๊ด€์„ฑ

์˜จ๋ผ์ธ ๊ฒŒ์ž„์€ ๋…ํŠนํ•œ ์ผ๊ด€์„ฑ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ ธ. ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•˜์ง€๋งŒ, ์™„๋ฒฝํ•œ ์ผ๊ด€์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅํ•ด!

์ „๋žต:
โ€ข ํด๋ผ์ด์–ธํŠธ ์˜ˆ์ธก(Client-side Prediction)
โ€ข ์„œ๋ฒ„ ์กฐ์ •(Server Reconciliation)
โ€ข ์ง€์—ฐ ๋ณด์ƒ(Lag Compensation)
โ€ข ์ด๋ฒคํŠธ ์ˆœ์„œ ๋ณด์žฅ

๊ฒŒ์ž„์—์„œ๋Š” "๋А๋‚Œ"์ด ์ค‘์š”ํ•ด. ์•ฝ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋Š” ํ—ˆ์šฉํ•˜๋˜, ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด์•ผ! ๐ŸŽฏ

๐ŸŽฎ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ๋ก€: ๋ฆฌ๊ทธ ์˜ค๋ธŒ ๋ ˆ์ „๋“œ

LOL์€ ์ „ ์„ธ๊ณ„ ์ˆ˜๋ฐฑ๋งŒ ๋ช…์ด ๋™์‹œ์— ํ”Œ๋ ˆ์ดํ•˜๋Š” ๊ฒŒ์ž„์ด์•ผ. ๊ฐ ์ง€์—ญ๋งˆ๋‹ค ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ , ๊ฒŒ์ž„ ๋‚ด์—์„œ๋Š” ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•ด.

ํ•˜์ง€๋งŒ ์ง€์—ญ ๊ฐ„ ๋ฐ์ดํ„ฐ(๋žญํ‚น, ํ†ต๊ณ„ ๋“ฑ)๋Š” ์ตœ์ข… ์ผ๊ด€์„ฑ์„ ์‚ฌ์šฉํ•ด. ํ•œ๊ตญ ์„œ๋ฒ„์˜ ๋žญํ‚น์ด ๋ถ๋ฏธ ์„œ๋ฒ„์— ์ฆ‰์‹œ ๋ฐ˜์˜๋  ํ•„์š”๋Š” ์—†์œผ๋‹ˆ๊นŒ!

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ผ๊ด€์„ฑ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ˜„๋ช…ํ•œ ์ ‘๊ทผ์ด์•ผ.

๐ŸŒŠ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ์—์„œ๋Š” ์ „ํ†ต์ ์ธ ์ผ๊ด€์„ฑ ๊ฐœ๋…์ด ์ž˜ ๋งž์ง€ ์•Š์•„.

์ƒˆ๋กœ์šด ๊ฐœ๋…:
โ€ข ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ vs ์ด๋ฒคํŠธ ์‹œ๊ฐ„
โ€ข ์›Œํ„ฐ๋งˆํฌ(Watermark)
โ€ข ์œˆ๋„์šฐ ์—ฐ์‚ฐ
โ€ข ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌ(Exactly-Once Semantics)

๋„๊ตฌ:
โ€ข Apache Kafka
โ€ข Apache Flink
โ€ข Apache Spark Streaming
โ€ข AWS Kinesis

๐Ÿ“š ํ•™์Šต ๋ฆฌ์†Œ์Šค์™€ ๋‹ค์Œ ๋‹จ๊ณ„

์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด ์ •๋ง ๋Œ€๋‹จํ•ด! ๐ŸŽ‰ ์ด์ œ ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๐Ÿ“– ์ถ”์ฒœ ๋„์„œ

1. "Designing Data-Intensive Applications" - Martin Kleppmann
๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๋ฐ”์ด๋ธ”์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด. CAP ์ •๋ฆฌ๋ถ€ํ„ฐ ์‹ค์ „ ์•„ํ‚คํ…์ฒ˜๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค๋ค„.

2. "Database Internals" - Alex Petrov
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€ ๋™์ž‘์„ ๊นŠ์ด ์žˆ๊ฒŒ ์„ค๋ช…ํ•ด. ๋ณต์ œ, ํŒŒํ‹ฐ์…”๋‹, ํŠธ๋žœ์žญ์…˜ ๋“ฑ์„ ๋‹ค๋ค„.

3. "Building Microservices" - Sam Newman
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ค„.

4. "Release It!" - Michael Nygard
ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๋ณต์›๋ ฅ์— ๋Œ€ํ•ด ๋‹ค๋ค„. ์‹ค์ „ ๊ฒฝํ—˜์ด ๊ฐ€๋“ํ•ด!

๐ŸŽ“ ์˜จ๋ผ์ธ ๊ฐ•์˜

โ€ข MIT 6.824: Distributed Systems (๋ฌด๋ฃŒ, ์ตœ๊ณ  ์ˆ˜์ค€)
โ€ข Coursera: Cloud Computing Specialization
โ€ข Udemy: Microservices Architecture
โ€ข YouTube: Martin Kleppmann์˜ ๊ฐ•์—ฐ๋“ค

๐Ÿ”ฌ ์‹ค์Šต ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด

์ด๋ก ๋งŒ ๋ฐฐ์šฐ๋ฉด ๊ธˆ๋ฐฉ ์žŠ์–ด๋ฒ„๋ ค. ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด์ž! ๐Ÿ’ช

์ดˆ๊ธ‰:
โ€ข ๊ฐ„๋‹จํ•œ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ ๊ตฌํ˜„
โ€ข ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๋ณต์ œ ๊ตฌํ˜„
โ€ข ์บ์‹œ ์‹œ์Šคํ…œ ๋งŒ๋“ค๊ธฐ

์ค‘๊ธ‰:
โ€ข Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„
โ€ข ๋ถ„์‚ฐ ๋ฝ ์‹œ์Šคํ…œ
โ€ข ์ด๋ฒคํŠธ ์†Œ์‹ฑ ํ”„๋ ˆ์ž„์›Œํฌ

๊ณ ๊ธ‰:
โ€ข ๋ฏธ๋‹ˆ Cassandra ๋งŒ๋“ค๊ธฐ
โ€ข ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ฝ”๋””๋„ค์ดํ„ฐ
โ€ข CRDT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„

๐ŸŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ปจํผ๋Ÿฐ์Šค

โ€ข Papers We Love: ๋…ผ๋ฌธ ์ฝ๊ธฐ ๋ชจ์ž„
โ€ข QCon: ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์ปจํผ๋Ÿฐ์Šค
โ€ข Strange Loop: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ
โ€ข VLDB: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•™ํšŒ
โ€ข Reddit r/distributed: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ปค๋ฎค๋‹ˆํ‹ฐ

๐Ÿ’ก ํ•™์Šต ํŒ

1. ๋…ผ๋ฌธ ์ฝ๊ธฐ: ์œ ๋ช…ํ•œ ์‹œ์Šคํ…œ์˜ ์›๋ณธ ๋…ผ๋ฌธ์„ ์ฝ์–ด๋ด. Google์˜ Bigtable, Amazon์˜ Dynamo, Facebook์˜ Cassandra ๋…ผ๋ฌธ ๋“ฑ.

2. ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ: Redis, MongoDB, Cassandra ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋ฉด์„œ ๋ฐฐ์›Œ.

3. ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ: ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ ค. ๊ฐ€๋ฅด์น˜๋Š” ๊ฒŒ ์ตœ๊ณ ์˜ ํ•™์Šต์ด์•ผ!

4. ์‹คํŒจ ์‚ฌ๋ก€ ์—ฐ๊ตฌ: AWS ์žฅ์•  ๋ณด๊ณ ์„œ, ๊ตฌ๊ธ€ ํฌ์ŠคํŠธ๋ชจํ…œ ๋“ฑ์„ ์ฝ์–ด๋ด. ์‹คํŒจ์—์„œ ๋ฐฐ์šฐ๋Š” ๊ฒŒ ๋งŽ์•„.

5. ์žฌ๋Šฅ๋„ท ํ™œ์šฉ: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„์„œ ๋ฉ˜ํ† ๋ง์„ ๋ฐ›๊ฑฐ๋‚˜, ๋„ค๊ฐ€ ๋ฐฐ์šด ๊ฑธ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ€๋ฅด์ณ์ค„ ์ˆ˜๋„ ์žˆ์–ด!

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€, ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ง€? ๐Ÿ˜… CAP ์ •๋ฆฌ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์‹ค์ „ ์ „๋žต, ์ตœ์‹  ํŠธ๋ Œ๋“œ๊นŒ์ง€ ์ •๋ง ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜์–ด!

ํ•ต์‹ฌ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด:

1. CAP ์ •๋ฆฌ์˜ ๋ณธ์งˆ:
๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ผ๊ด€์„ฑ(C), ๊ฐ€์šฉ์„ฑ(A), ๋ถ„ํ•  ๋‚ด์„ฑ(P) ์ค‘ ๋‘ ๊ฐ€์ง€๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ๋Š” P๊ฐ€ ํ•„์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— C์™€ A ์ค‘์—์„œ ์„ ํƒํ•˜๊ฒŒ ๋ผ.

2. ์ผ๊ด€์„ฑ์˜ ์ŠคํŽ™ํŠธ๋Ÿผ:
๊ฐ•ํ•œ ์ผ๊ด€์„ฑ๋ถ€ํ„ฐ ์ตœ์ข… ์ผ๊ด€์„ฑ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์ด ์žˆ์–ด. ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!

3. ์‹ค์ „ ์ „๋žต:
๋ณต์ œ, ์ƒค๋”ฉ, ์ฟผ๋Ÿผ, ์ถฉ๋Œ ํ•ด๊ฒฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ์€ํƒ„ํ™˜์€ ์—†์–ด!

4. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ดํ•ด:
๋ชจ๋“  ์„ ํƒ์—๋Š” ์žฅ๋‹จ์ ์ด ์žˆ์–ด. ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ , ์ ์ ˆํ•œ ๊ท ํ˜•์ ์„ ์ฐพ๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด์•ผ.

5. ์ง€์†์ ์ธ ํ•™์Šต:
๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋ถ„์•ผ๋Š” ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด. ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๊ณผ ํŒจํ„ด์„ ๊พธ์ค€ํžˆ ํ•™์Šตํ•ด์•ผ ํ•ด!

๊ธฐ์–ตํ•ด! ์™„๋ฒฝํ•œ ์‹œ์Šคํ…œ์€ ์—†์–ด. ์ค‘์š”ํ•œ ๊ฑด ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ๊ฒƒ์ด์•ผ. ๐ŸŽฏ

๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„๋Š” ์–ด๋ ต์ง€๋งŒ, ๊ทธ๋งŒํผ ์žฌ๋ฏธ์žˆ๊ณ  ๋ณด๋žŒ์ฐฌ ์ผ์ด์•ผ. ๋„ค๊ฐ€ ๋งŒ๋“  ์‹œ์Šคํ…œ์ด ์ˆ˜๋ฐฑ๋งŒ ๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์„œ๋น„์Šคํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์•„? ๐Ÿ˜Š

์ด ๊ธ€์ด ๋„ค ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์—ฌ์ •์— ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์–ด. ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๊ฑฐ๋‚˜ ๋” ๊นŠ์ด ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€๋“ค๊ณผ ์†Œํ†ตํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ!

์ž, ์ด์ œ ๋‚˜๊ฐ€์„œ ๋ฉ‹์ง„ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด์ž! ํ™”์ดํŒ…! ๐Ÿš€๐Ÿ’ช

๐ŸŒŸ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์„ธ๊ณ„๋Š” ๋ฌด๊ถ๋ฌด์ง„ํ•ด์š”!
๊ณ„์† ํƒํ—˜ํ•˜๊ณ , ์‹คํ—˜ํ•˜๊ณ , ๋ฐฐ์›Œ๋‚˜๊ฐ€์„ธ์š”! ๐Ÿš€

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.