์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™” ๋„๊ตฌ ํ™œ์šฉ ๋ฐฉ๋ฒ•

๐Ÿš€ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™” ๋„๊ตฌ ํ™œ์šฉ ๋ฐฉ๋ฒ•

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ด์ „ ์ž‘์—…, ์ด์ œ ์ž๋™ํ™”๋กœ ์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ! ๐Ÿ’พโœจ

## ๐ŸŽฏ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์™œ ์ž๋™ํ™”๊ฐ€ ํ•„์š”ํ• ๊นŒ? ์•ผ, ์†”์งํžˆ ๋งํ•ด์„œ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ์ˆ˜๋™์œผ๋กœ ํ•ด๋ณธ ์  ์žˆ์–ด? ๐Ÿ˜… ์—‘์…€ ํŒŒ์ผ ์—ด์–ด์„œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋‹ค๊ฐ€ ์†๋ชฉ ๋‚˜๊ฐ€๋Š” ๊ฑด ๊ธฐ๋ณธ์ด๊ณ , ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ํ•˜๋‚˜ ์ž˜๋ชป ๋“ค์–ด๊ฐ€๋ฉด ๊ทธ๊ฑฐ ์ฐพ๋А๋ผ ๋ฐค์ƒˆ๋Š” ๊ฑฐ ์žˆ์ง€.

์š”์ฆ˜ ์‹œ๋Œ€์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด์ „์ด๋‚˜ ์‹œ์Šคํ…œ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ๊ฑฐ์˜ ํ•„์ˆ˜์ž–์•„? ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์—์„œ ํด๋ผ์šฐ๋“œ๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜, MySQL์—์„œ PostgreSQL๋กœ ๊ฐˆ์•„ํƒ€๊ฑฐ๋‚˜, ์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ AWS๋กœ ์ด์‚ฌ ๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—„์ฒญ ๋งŽ์•„์กŒ์–ด. ๊ทผ๋ฐ ๋ฌธ์ œ๋Š” ์ด๋Ÿฐ ์ž‘์—…๋“ค์ด ์—„์ฒญ๋‚œ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์Šคํฌ๋ฅผ ๋™๋ฐ˜ํ•œ๋‹ค๋Š” ๊ฑฐ์ง€.

์‹ค์ œ๋กœ ๊ฐ€ํŠธ๋„ˆ(Gartner) ๋ฆฌ์„œ์น˜์— ๋”ฐ๋ฅด๋ฉด ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ”„๋กœ์ ํŠธ์˜ ์•ฝ 83%๊ฐ€ ์˜ˆ์ •๋œ ์ผ์ •์„ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ์˜ˆ์‚ฐ์„ ๋„˜๊ธด๋‹ค๊ณ  ํ•ด. ๋ฌด์„œ์šด ํ†ต๊ณ„ ์•„๋‹ˆ์•ผ? ๐Ÿ˜ฑ ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒŒ ๋ฐ”๋กœ **์ž๋™ํ™” ๋„๊ตฌ**๋“ค์ด์•ผ.
์ˆ˜๋™ ์ž๋™ํ™” ๋„๊ตฌ ๋น ๋ฅด๊ณ  ์•ˆ์ „ ๋А๋ฆผ, ์˜ค๋ฅ˜ ๋งŽ์Œ ์Šค๋งˆํŠธํ•œ ์ฒ˜๋ฆฌ ์„ฑ๊ณต๋ฅ  UP ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง„ํ™” ๊ณผ์ •
## ๐Ÿ“š ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™” ๋„๊ตฌ๋ž€? ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์•ผ. ์‚ฌ๋žŒ์ด ์ผ์ผ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ๋ถ™์—ฌ๋„ฃ๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋Œ€์‹ , ํ”„๋กœ๊ทธ๋žจ์ด ์•Œ์•„์„œ ์ฒ™์ฒ™ ํ•ด์ฃผ๋Š” ๊ฑฐ์ง€.

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌ๋งŒ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋˜‘๋˜‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด:
๐Ÿ” ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค

1. ๋ฐ์ดํ„ฐ ์ถ”์ถœ(Extract): ์›๋ณธ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ€์ ธ์™€
2. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜(Transform): ๋ชฉ์ ์ง€ ์‹œ์Šคํ…œ ํ˜•์‹์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ด
3. ๋ฐ์ดํ„ฐ ์ ์žฌ(Load): ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ ์‹œ์Šคํ…œ์— ๋„ฃ์–ด์ค˜
4. ๊ฒ€์ฆ(Validation): ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์˜ฎ๊ฒจ์กŒ๋Š”์ง€ ํ™•์ธํ•ด
5. ๋กค๋ฐฑ(Rollback): ๋ฌธ์ œ ์ƒ๊ธฐ๋ฉด ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ๋ ค์ค˜
์ด ๊ณผ์ •์„ ์šฐ๋ฆฌ๋Š” **ETL(Extract, Transform, Load)** ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ๋ถˆ๋Ÿฌ. ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง์˜ ๊ธฐ๋ณธ ์ค‘์˜ ๊ธฐ๋ณธ์ด์ง€! ๐ŸŽ“
## ๐Ÿ› ๏ธ ๋Œ€ํ‘œ์ ์ธ ์ž๋™ํ™” ๋„๊ตฌ๋“ค ์‚ดํŽด๋ณด๊ธฐ ์‹œ์žฅ์—๋Š” ์ •๋ง ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋“ค์ด ์žˆ์–ด. ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋‹ˆ๊นŒ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์— ๋งž์ถฐ์„œ ์„ ํƒํ•˜๋ฉด ๋ผ. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ?

๐Ÿ”ท AWS Database Migration Service (DMS)

ํŠน์ง•: AWS ์ƒํƒœ๊ณ„์™€ ์™„๋ฒฝํ•œ ํ†ตํ•ฉ
์žฅ์ : ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ, ๋‹ค์–‘ํ•œ DB ์ง€์›
๋‹จ์ : AWS ์ข…์†์„ฑ
๊ฐ€๊ฒฉ: ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ณผ๊ธˆ

๐Ÿ”ถ Apache NiFi

ํŠน์ง•: ์˜คํ”ˆ์†Œ์Šค, ์‹œ๊ฐ์  UI
์žฅ์ : ๋ฌด๋ฃŒ, ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ
๋‹จ์ : ํ•™์Šต ๊ณก์„  ์žˆ์Œ
๊ฐ€๊ฒฉ: ๋ฌด๋ฃŒ(์˜คํ”ˆ์†Œ์Šค)

๐Ÿ”ต Talend Data Integration

ํŠน์ง•: ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์†”๋ฃจ์…˜
์žฅ์ : ๊ฐ•๋ ฅํ•œ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ, GUI ํŽธ๋ฆฌ
๋‹จ์ : ๋น„์šฉ ๋ถ€๋‹ด
๊ฐ€๊ฒฉ: ๋ผ์ด์„ ์Šค ๊ธฐ๋ฐ˜

๐ŸŸข Flyway

ํŠน์ง•: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „ ๊ด€๋ฆฌ ํŠนํ™”
์žฅ์ : ๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จ, CI/CD ํ†ตํ•ฉ ์‰ฌ์›€
๋‹จ์ : ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์‹ฌ
๊ฐ€๊ฒฉ: ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฒ„์ „ ๋ฌด๋ฃŒ
๐Ÿ’ก ์„ ํƒ ํŒ: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์ƒ์šฉ ์†”๋ฃจ์…˜์„ ๊ณ ๋ คํ•ด๋ด. ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด๋ฉด ํ•ด๋‹น ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋„๊ตฌ๊ฐ€ ํ†ตํ•ฉ์„ฑ ๋ฉด์—์„œ ์œ ๋ฆฌํ•ด!
## ๐Ÿš€ ์‹ค์ „! ์ž๋™ํ™” ๋„๊ตฌ ํ™œ์šฉ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ ์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ? ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” AWS DMS๋ฅผ ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ• ๊ฒŒ. ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค๋Š” ๋น„์Šทํ•˜๋‹ˆ๊นŒ ์‘์šฉํ•˜๋ฉด ๋ผ!
1 ์‚ฌ์ „ ์ค€๋น„ ๋ฐ ๊ณ„ํš ์ˆ˜๋ฆฝ ๐Ÿ“‹

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๊ณ„ํš์ด ๋ฐ˜์ด์•ผ. ๋‹ค์Œ ํ•ญ๋ชฉ๋“ค์„ ๋จผ์ € ์ฒดํฌํ•ด๋ด:

โœ… ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„์„
- ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์€ ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ (GB? TB?)
- ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์™€ ๊ด€๊ณ„๋Š” ์–ด๋–ค์ง€
- ์ธ๋ฑ์Šค, ํŠธ๋ฆฌ๊ฑฐ, ์ €์žฅ ํ”„๋กœ์‹œ์ € ๋“ฑ ์ข…์† ๊ฐ์ฒด๋Š”?
- ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์ œ์•ฝ์กฐ๊ฑด ํ™•์ธ

โœ… ๋ชฉํ‘œ ์‹œ์Šคํ…œ ์ค€๋น„
- ์ถฉ๋ถ„ํ•œ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ํ™•๋ณด
- ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ์ฒดํฌ
- ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ •
- ๋ฐฑ์—… ๊ณ„ํš ์ˆ˜๋ฆฝ

โœ… ๋‹ค์šดํƒ€์ž„ ๊ณ„ํš
- ์„œ๋น„์Šค ์ค‘๋‹จ ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€ ํ™•์ธ
- ์‚ฌ์šฉ์ž ๊ณต์ง€ ๊ณ„ํš
- ๋กค๋ฐฑ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค€๋น„
2 ๋„๊ตฌ ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ์„ค์ • โš™๏ธ

AWS DMS๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ•ด:

๋ณต์ œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
AWS ์ฝ˜์†”์—์„œ DMS ์„œ๋น„์Šค๋กœ ์ด๋™ํ•ด์„œ ๋ณต์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด. ์ด๊ฑด ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ด๋™ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ฒ„์•ผ.

// ์ธ์Šคํ„ด์Šค ํฌ๊ธฐ ์„ ํƒ ๊ธฐ์ค€
- ์†Œ๊ทœ๋ชจ (< 100GB): dms.t3.medium
- ์ค‘๊ทœ๋ชจ (100GB - 1TB): dms.c5.xlarge
- ๋Œ€๊ทœ๋ชจ (> 1TB): dms.c5.4xlarge ์ด์ƒ
์—”๋“œํฌ์ธํŠธ ์„ค์ •
์›๋ณธ(Source)๊ณผ ๋Œ€์ƒ(Target) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด. ํ˜ธ์ŠคํŠธ๋ช…, ํฌํŠธ, ๊ณ„์ • ์ •๋ณด ๋“ฑ์ด ํ•„์š”ํ•ด.

// MySQL ์›๋ณธ ์—”๋“œํฌ์ธํŠธ ์˜ˆ์‹œ
Server name: mydb.example.com
Port: 3306
Username: migration_user
Password: ********
Database name: production_db
โš ๏ธ ๋ณด์•ˆ ์ฃผ์˜: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „์šฉ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ์ตœ์†Œ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•ด! ํ”„๋กœ๋•์…˜ ๊ณ„์ •์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ์œ„ํ—˜ํ•ด.
3 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํƒœ์Šคํฌ ์ƒ์„ฑ ๐ŸŽฏ

์ด์ œ ์‹ค์ œ ์ด๋™ ์ž‘์—…์„ ์ •์˜ํ•  ์ฐจ๋ก€์•ผ. ์—ฌ๊ธฐ์„œ ์„ธ ๊ฐ€์ง€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํƒ€์ž…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด:

ํƒ€์ž… ์„ค๋ช… ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค
Full Load ์ „์ฒด ๋ฐ์ดํ„ฐ ์ผ๊ด„ ์ด๋™ ๋‹ค์šดํƒ€์ž„ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
CDC (Change Data Capture) ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๋ฌด์ค‘๋‹จ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
Full Load + CDC ์ „์ฒด ์ด๋™ ํ›„ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ์‹
ํ…Œ์ด๋ธ” ๋งคํ•‘ ๊ทœ์น™ ์„ค์ •
์–ด๋–ค ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ์˜ฎ๊ธธ์ง€ ์ •์˜ํ•ด. JSON ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด:

{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "include-all-tables",
      "object-locator": {
        "schema-name": "public",
        "table-name": "%"
      },
      "rule-action": "include"
    },
    {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "rename-schema",
      "rule-target": "schema",
      "object-locator": {
        "schema-name": "public"
      },
      "value": "new_schema",
      "rule-action": "rename"
    }
  ]
}
์ด ์„ค์ •์€ public ์Šคํ‚ค๋งˆ์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”์„ ํฌํ•จํ•˜๊ณ , ์Šคํ‚ค๋งˆ ์ด๋ฆ„์„ new_schema๋กœ ๋ณ€๊ฒฝํ•˜๋ผ๋Š” ์˜๋ฏธ์•ผ.
4 ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ๋งคํ•‘ ๐Ÿ”„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋‚˜ ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด. ์ด๊ฑธ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฒŒ ์ž๋™ํ™” ๋„๊ตฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์ง€!

๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€ํ™˜ ์˜ˆ์‹œ

MySQL PostgreSQL ๋ณ€ํ™˜ ๊ทœ์น™
TINYINT SMALLINT ์ž๋™ ๋ณ€ํ™˜
DATETIME TIMESTAMP ํƒ€์ž„์กด ๊ณ ๋ ค ํ•„์š”
TEXT TEXT ๋™์ผ
ENUM VARCHAR + CHECK ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€
์ปค์Šคํ…€ ๋ณ€ํ™˜ ๋กœ์ง
๋ณต์žกํ•œ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋ฉด ๋ณ€ํ™˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ ์งœ ํ˜•์‹์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ๋ฌธ์ž์—ด์„ ์ •๊ทœํ™”ํ•˜๊ฑฐ๋‚˜, ์•”ํ˜ธํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด์ง€.

// ์˜ˆ์‹œ: ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹ ๋ณ€ํ™˜
// ์›๋ณธ: 01012345678
// ๋Œ€์ƒ: 010-1234-5678

CASE 
  WHEN LENGTH(phone) = 11 
  THEN CONCAT(
    SUBSTRING(phone, 1, 3), '-',
    SUBSTRING(phone, 4, 4), '-',
    SUBSTRING(phone, 8, 4)
  )
  ELSE phone
END
5 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๐Ÿ“Š

๋“œ๋””์–ด ์‹คํ–‰! ๋ฒ„ํŠผ ํ•˜๋‚˜๋งŒ ๋ˆ„๋ฅด๋ฉด... ๋? ์•„๋‹ˆ์•ผ, ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๊ฐ€ ์ง„์งœ ์‹œ์ž‘์ด์•ผ. ๐Ÿ˜…

์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๐Ÿ“ˆ ์ง„ํ–‰๋ฅ  ํ™•์ธ
- ์ „์ฒด ํ…Œ์ด๋ธ” ์ค‘ ๋ช‡ ๊ฐœ ์™„๋ฃŒ๋๋Š”์ง€
- ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ…Œ์ด๋ธ”๊ณผ ์ง„ํ–‰๋ฅ 
- ์˜ˆ์ƒ ์™„๋ฃŒ ์‹œ๊ฐ„

โšก ์„ฑ๋Šฅ ์ง€ํ‘œ
- ์ดˆ๋‹น ์ฒ˜๋ฆฌ ๋ ˆ์ฝ”๋“œ ์ˆ˜ (rows/sec)
- ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ๋Ÿ‰ (MB/sec)
- CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ 
- ์ง€์—ฐ ์‹œ๊ฐ„ (CDC ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ)

๐Ÿšจ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง
- ์‹คํŒจํ•œ ๋ ˆ์ฝ”๋“œ ์ˆ˜
- ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฐ ์›์ธ
- ์žฌ์‹œ๋„ ํšŸ์ˆ˜

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

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๋๋‚ฌ๋‹ค๊ณ  ๋ฐ”๋กœ ์„œ๋น„์Šค ์ „ํ™˜ํ•˜๋ฉด ํฐ์ผ ๋‚˜! ๋ฐ˜๋“œ์‹œ ๊ฒ€์ฆ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•ด.

๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ

-- ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๋น„๊ต
SELECT COUNT(*) FROM source_db.users;
SELECT COUNT(*) FROM target_db.users;

-- ์ฒดํฌ์„ฌ ๋น„๊ต (๋ฐ์ดํ„ฐ ์ผ์น˜ ์—ฌ๋ถ€)
SELECT MD5(GROUP_CONCAT(id, email ORDER BY id)) 
FROM source_db.users;

SELECT MD5(GROUP_CONCAT(id, email ORDER BY id)) 
FROM target_db.users;
์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
- ์ฟผ๋ฆฌ ์‘๋‹ต ์‹œ๊ฐ„ ๋น„๊ต
- ์ธ๋ฑ์Šค ์„ฑ๋Šฅ ํ™•์ธ
- ๋™์‹œ ์ ‘์† ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ
- ์ฃผ์š” ๊ธฐ๋Šฅ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ
- ์—ฃ์ง€ ์ผ€์ด์Šค ํ™•์ธ
- ์‚ฌ์šฉ์ž ์ˆ˜์šฉ ํ…Œ์ŠคํŠธ(UAT)

๊ฒ€์ฆ ๋‹จ๊ณ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด? ๋‹นํ™ฉํ•˜์ง€ ๋ง๊ณ  ์ฐจ๋ถ„ํ•˜๊ฒŒ ์›์ธ์„ ๋ถ„์„ํ•ด. ๋Œ€๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ถˆ์ผ์น˜๋‚˜ ์ œ์•ฝ์กฐ๊ฑด ๋ฌธ์ œ์•ผ.
7 ์ „ํ™˜ ๋ฐ ์‚ฌํ›„ ๊ด€๋ฆฌ ๐ŸŽ‰

๋ชจ๋“  ๊ฒ€์ฆ์ด ๋๋‚ฌ์œผ๋ฉด ์ด์ œ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์ƒˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ „ํ™˜ํ•  ์ฐจ๋ก€์•ผ!

์ „ํ™˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ „ํ™˜ ์ „ (D-1)
โœ“ ๋ชจ๋“  ์ดํ•ด๊ด€๊ณ„์ž์—๊ฒŒ ๊ณต์ง€
โœ“ ๋กค๋ฐฑ ๊ณ„ํš ์ตœ์ข… ์ ๊ฒ€
โœ“ ๋ฐฑ์—… ์™„๋ฃŒ ํ™•์ธ
โœ“ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ์ค€๋น„

์ „ํ™˜ ์‹œ์  (D-Day)
โœ“ ์›๋ณธ DB ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ ์ „ํ™˜
โœ“ ์ตœ์ข… CDC ๋™๊ธฐํ™” ์™„๋ฃŒ ๋Œ€๊ธฐ
โœ“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ
โœ“ DNS/๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์„ค์ • ๋ณ€๊ฒฝ
โœ“ ์„œ๋น„์Šค ์žฌ์‹œ์ž‘

์ „ํ™˜ ํ›„ (D+1 ~ D+7)
โœ“ ์ง‘์ค‘ ๋ชจ๋‹ˆํ„ฐ๋ง (24์‹œ๊ฐ„)
โœ“ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘
โœ“ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋ถ„์„
โœ“ ์›๋ณธ DB ์œ ์ง€ (๋กค๋ฐฑ ๋Œ€๋น„)

๋ณดํ†ต 1~2์ฃผ ์ •๋„ ๋ฌธ์ œ์—†์ด ์šด์˜๋˜๋ฉด ์›๋ณธ ์‹œ์Šคํ…œ์„ ์ •๋ฆฌํ•ด๋„ ๋ผ. ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ํ•œ ๋‹ฌ ์ •๋„๋Š” ๋ฐฑ์—…์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•ด!
## ๐ŸŽ“ ์‹ค์ „ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ํ™œ์šฉ ์ „๋žต ์ด๋ก ์€ ์ด์ œ ์ถฉ๋ถ„ํ•˜์ง€? ์‹ค์ œ ํ˜„์žฅ์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋“ค์„ ์‚ดํŽด๋ณด์ž!
๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 1: ์˜จํ”„๋ ˆ๋ฏธ์Šค MySQL โ†’ AWS RDS MySQL

์ƒํ™ฉ: ํšŒ์‚ฌ ์„œ๋ฒ„์‹ค์— ์žˆ๋Š” MySQL์„ ํด๋ผ์šฐ๋“œ๋กœ ์ด์ „
๋‹ค์šดํƒ€์ž„: ์ตœ๋Œ€ 2์‹œ๊ฐ„ ํ—ˆ์šฉ
๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 500GB

์ถ”์ฒœ ์ „๋žต:
1. AWS DMS ์‚ฌ์šฉ (Full Load + CDC ๋ชจ๋“œ)
2. ์‚ฌ์ „์— ์Šคํ‚ค๋งˆ๋งŒ ๋จผ์ € ์ƒ์„ฑ (mysqldump --no-data)
3. ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ ๋กœ๋“œ ํ›„ ์ƒ์„ฑ (์†๋„ ํ–ฅ์ƒ)
4. ํ”ผํฌ ํƒ€์ž„ ํ”ผํ•ด์„œ ์ฃผ๋ง ์ƒˆ๋ฒฝ์— ์‹คํ–‰
5. CDC๋กœ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”ํ•˜๋ฉด์„œ ๊ฒ€์ฆ ์ง„ํ–‰
6. ๊ฒ€์ฆ ์™„๋ฃŒ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „ํ™˜

์˜ˆ์ƒ ์†Œ์š” ์‹œ๊ฐ„: ์ดˆ๊ธฐ ๋กœ๋“œ 4-6์‹œ๊ฐ„, CDC ๋™๊ธฐํ™” 1-2์ผ, ์ด 3์ผ ์ •๋„
๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 2: PostgreSQL ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ (9.6 โ†’ 14)

์ƒํ™ฉ: ๋ ˆ๊ฑฐ์‹œ ๋ฒ„์ „์—์„œ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ
๋‹ค์šดํƒ€์ž„: ์ตœ์†Œํ™” ํ•„์š” (๋ฌด์ค‘๋‹จ ์„ ํ˜ธ)
๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 2TB

์ถ”์ฒœ ์ „๋žต:
1. pg_upgrade ๋„๊ตฌ ์‚ฌ์šฉ (๋น ๋ฅธ ์—…๊ทธ๋ ˆ์ด๋“œ)
2. ๋˜๋Š” ๋…ผ๋ฆฌ์  ๋ณต์ œ(Logical Replication) ํ™œ์šฉ
3. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋จผ์ € ์ „์ฒด ํ”„๋กœ์„ธ์Šค ๋ฆฌํ—ˆ์„ค
4. ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ์‚ฌ์ „ ์ฒดํฌ (deprecated ๊ธฐ๋Šฅ ํ™•์ธ)
5. ์ต์Šคํ…์…˜ ๋ฐ ์ปค์Šคํ…€ ํ•จ์ˆ˜ ํ˜ธํ™˜์„ฑ ๊ฒ€์ฆ

์ฃผ์˜์‚ฌํ•ญ:
- ๋ฉ”์ด์ € ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•ด
- 9.6 โ†’ 11 โ†’ 14 ์ด๋Ÿฐ ์‹์œผ๋กœ ์ ์ง„์  ์—…๊ทธ๋ ˆ์ด๋“œ ๊ณ ๋ ค
- ํ†ต๊ณ„ ์ •๋ณด ์žฌ์ˆ˜์ง‘ ํ•„์ˆ˜ (ANALYZE ์‹คํ–‰)
๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 3: MongoDB โ†’ PostgreSQL (NoSQL โ†’ RDBMS)

์ƒํ™ฉ: ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ˜• ๋ฐ์ดํ„ฐ๋กœ ์ „ํ™˜
๋‹ค์šดํƒ€์ž„: ํ˜‘์˜ ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 1TB

์ถ”์ฒœ ์ „๋žต:
1. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ถ„์„ ๋ฐ ์Šคํ‚ค๋งˆ ์„ค๊ณ„๊ฐ€ ์ตœ์šฐ์„ !
2. ์ค‘์ฒฉ๋œ JSON ๊ตฌ์กฐ๋ฅผ ํ…Œ์ด๋ธ” ๊ด€๊ณ„๋กœ ์ •๊ทœํ™”
3. Apache NiFi๋‚˜ Talend ๊ฐ™์€ ETL ๋„๊ตฌ ํ™œ์šฉ
4. ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ปค์Šคํ…€ ๋ณ€ํ™˜ ๋กœ์ง ์ž‘์„ฑ
5. ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌ (๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ)

์ƒ˜ํ”Œ ๋ณ€ํ™˜ ์ฝ”๋“œ:
import pymongo
import psycopg2
from datetime import datetime

# MongoDB ์—ฐ๊ฒฐ
mongo_client = pymongo.MongoClient("mongodb://localhost:27017/")
mongo_db = mongo_client["mydb"]
collection = mongo_db["users"]

# PostgreSQL ์—ฐ๊ฒฐ
pg_conn = psycopg2.connect(
    host="localhost",
    database="mydb",
    user="postgres",
    password="password"
)
pg_cursor = pg_conn.cursor()

# ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ์‚ฝ์ž…
for doc in collection.find():
    pg_cursor.execute("""
        INSERT INTO users (id, name, email, created_at, metadata)
        VALUES (%s, %s, %s, %s, %s)
    """, (
        str(doc['_id']),
        doc['name'],
        doc['email'],
        doc['createdAt'],
        json.dumps(doc.get('metadata', {}))
    ))

pg_conn.commit()
์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž…์ด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—” ์ปค์Šคํ…€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด.
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ฑ๊ณต ์š”์†Œ ๊ณ„ํš ์ฒ ์ €ํ•œ ์‚ฌ์ „ ๋ถ„์„ ๋ฆฌ์Šคํฌ ํ‰๊ฐ€ ๋กค๋ฐฑ ์‹œ๋‚˜๋ฆฌ์˜ค ์ผ์ • ์ˆ˜๋ฆฝ ์‹คํ–‰ ์ž๋™ํ™” ๋„๊ตฌ ํ™œ์šฉ ๋‹จ๊ณ„๋ณ„ ๊ฒ€์ฆ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฌธ์ œ ๋Œ€์‘ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž ๊ฒ€์ฆ 30% 50% 20% ์‹œ๊ฐ„ ํˆฌ์ž ๋น„์œจ ์‹œ๊ฐ„ ํˆฌ์ž ๋น„์œจ ์‹œ๊ฐ„ ํˆฌ์ž ๋น„์œจ ์‹คํ–‰๋ณด๋‹ค ๊ณ„ํš๊ณผ ๊ฒ€์ฆ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์„ธ์š”!
## ๐Ÿ”ง ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ๋ฐ ์ตœ์ ํ™” ํŒ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ์ด์ œ ๋งˆ์Šคํ„ฐํ–ˆ์ง€? ์ด์ œ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€์„œ ํ”„๋กœ์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค„๊ฒŒ! ๐Ÿ’ช ### 1๏ธโƒฃ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ์†๋„ ํ–ฅ์ƒ ํฐ ํ…Œ์ด๋ธ”์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ค. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์†๋„๋ฅผ ๋ช‡ ๋ฐฐ๋กœ ๋†’์ผ ์ˆ˜ ์žˆ์–ด!

ํŒŒํ‹ฐ์…˜ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

-- ๋‚ ์งœ ๊ธฐ์ค€ ํŒŒํ‹ฐ์…˜ ๋ถ„ํ• 
Task 1: WHERE created_at >= '2023-01-01' AND created_at < '2023-04-01'
Task 2: WHERE created_at >= '2023-04-01' AND created_at < '2023-07-01'
Task 3: WHERE created_at >= '2023-07-01' AND created_at < '2023-10-01'
Task 4: WHERE created_at >= '2023-10-01' AND created_at < '2024-01-01'

-- ID ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ๋ถ„ํ• 
Task 1: WHERE id >= 1 AND id < 1000000
Task 2: WHERE id >= 1000000 AND id < 2000000
Task 3: WHERE id >= 2000000 AND id < 3000000
AWS DMS์—์„œ๋Š” ParallelLoadThreads ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜์ค€์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด. ๋ณดํ†ต 4-8๊ฐœ ์ •๋„๊ฐ€ ์ ๋‹นํ•ด. ### 2๏ธโƒฃ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ณ‘๋ชฉ์ผ ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์‹œ๋„ํ•ด๋ณผ ๋งŒํ•œ ๋ฐฉ๋ฒ•๋“ค์ด์•ผ:

๐ŸŒ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ
  • โœ“ ์••์ถ• ํ™œ์„ฑํ™”: ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ์ ˆ์•ฝ (๋‹จ, CPU ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€)
  • โœ“ ์ „์šฉ ํšŒ์„  ์‚ฌ์šฉ: AWS Direct Connect, Azure ExpressRoute ๋“ฑ
  • โœ“ ๋ฆฌ์ „ ์„ ํƒ: ์›๋ณธ๊ณผ ๋Œ€์ƒ์ด ๊ฐ€๊นŒ์šด ๋ฆฌ์ „ ์„ ํƒ
  • โœ“ VPN ํ„ฐ๋„๋ง: ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ ๊ท ํ˜•
  • โœ“ ๋ฐฐ์น˜ ํฌ๊ธฐ ์กฐ์ •: ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ, ๋„ˆ๋ฌด ํฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ
### 3๏ธโƒฃ ์ฆ๋ถ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์˜ฎ๊ธฐ๋Š” ๊ฒŒ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค๋ฉด ์ฆ๋ถ„ ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด๋ด.

ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜ ์ฆ๋ถ„ ๋กœ๋“œ

-- 1๋‹จ๊ณ„: ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๋‚ฎ์Œ)
SELECT * FROM orders 
WHERE created_at < '2023-01-01';

-- 2๋‹จ๊ณ„: ์ตœ๊ทผ ๋ฐ์ดํ„ฐ (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ)
SELECT * FROM orders 
WHERE created_at >= '2023-01-01' 
  AND created_at < '2024-01-01';

-- 3๋‹จ๊ณ„: ํ˜„์žฌ ๋ฐ์ดํ„ฐ (์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”)
SELECT * FROM orders 
WHERE created_at >= '2024-01-01';
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๋ฒˆ๋งŒ ์˜ฎ๊ธฐ๊ณ , ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํšจ์œจ์ ์ด์•ผ. ### 4๏ธโƒฃ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์ž๋™ํ™” ์ˆ˜๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆํ•˜๋Š” ๊ฑด ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด. ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด ํŽธํ•ด!

#!/bin/bash
# ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ

echo "=== ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒ€์ฆ ์‹œ์ž‘ ==="

# 1. ํ…Œ์ด๋ธ”๋ณ„ ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๋น„๊ต
for table in users orders products; do
  source_count=$(mysql -h source_db -e "SELECT COUNT(*) FROM $table" -sN)
  target_count=$(psql -h target_db -c "SELECT COUNT(*) FROM $table" -tA)
  
  if [ "$source_count" -eq "$target_count" ]; then
    echo "โœ“ $table: OK ($source_count rows)"
  else
    echo "โœ— $table: FAIL (source: $source_count, target: $target_count)"
  fi
done

# 2. ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๋น„๊ต
echo "์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์ค‘..."
# ๋žœ๋ค ์ƒ˜ํ”Œ 100๊ฐœ ์ถ”์ถœํ•ด์„œ ๋น„๊ต
# ...

# 3. ์ œ์•ฝ์กฐ๊ฑด ํ™•์ธ
echo "์ œ์•ฝ์กฐ๊ฑด ๊ฒ€์ฆ ์ค‘..."
# PK, FK, UNIQUE ๋“ฑ ํ™•์ธ
# ...

echo "=== ๊ฒ€์ฆ ์™„๋ฃŒ ==="
### 5๏ธโƒฃ ๋กค๋ฐฑ ์ „๋žต ๋งŒ์•ฝ์„ ๋Œ€๋น„ํ•œ ๋กค๋ฐฑ ๊ณ„ํš์€ ํ•„์ˆ˜์•ผ! ์ž๋™ํ™” ๋„๊ตฌ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๋กค๋ฐฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ˆ˜๋™ ๋กค๋ฐฑ ์ ˆ์ฐจ๋„ ์ค€๋น„ํ•ด๋‘ฌ์•ผ ํ•ด.

โš ๏ธ ๋กค๋ฐฑ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค 1: ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฐœ๊ฒฌ
โ†’ CDC ์ค‘๋‹จ โ†’ ์›๋ณธ DB๋กœ ์„œ๋น„์Šค ๋ณต๊ท€ โ†’ ์›์ธ ๋ถ„์„ โ†’ ์žฌ์‹œ๋„

์‹œ๋‚˜๋ฆฌ์˜ค 2: ์„ฑ๋Šฅ ๋ฌธ์ œ
โ†’ ํŠธ๋ž˜ํ”ฝ ์›๋ณธ์œผ๋กœ ๋ผ์šฐํŒ… โ†’ ์ธ๋ฑ์Šค/์ฟผ๋ฆฌ ์ตœ์ ํ™” โ†’ ์žฌ์ „ํ™˜

์‹œ๋‚˜๋ฆฌ์˜ค 3: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ค๋ฅ˜
โ†’ ์ฆ‰์‹œ ์›๋ณธ DB ์—ฐ๊ฒฐ ๋ณต๊ตฌ โ†’ ์ฝ”๋“œ ์ˆ˜์ • โ†’ ์žฌ๋ฐฐํฌ โ†’ ์žฌ์ „ํ™˜
## ๐Ÿšจ ํ”ํ•œ ์‹ค์ˆ˜์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์‹ค์ „์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ์ฑ…์„ ์ •๋ฆฌํ•ด๋ดค์–ด. ์ด๊ฑฐ ์•Œ์•„๋‘๋ฉด ์‚ฝ์งˆ ์‹œ๊ฐ„์„ ์—„์ฒญ ์ค„์ผ ์ˆ˜ ์žˆ์–ด! ๐Ÿ˜Ž

โŒ ์‹ค์ˆ˜ 1: ์ธ๋ฑ์Šค๋ฅผ ๋จผ์ € ์ƒ์„ฑ

๋ฌธ์ œ: ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์†๋„๊ฐ€ ๊ทน๋„๋กœ ๋А๋ฆผ

์›์ธ: ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด INSERT๋งˆ๋‹ค ์ธ๋ฑ์Šค ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ

ํ•ด๊ฒฐ: ๋ฐ์ดํ„ฐ ๋กœ๋“œ ํ›„ ์ธ๋ฑ์Šค ์ƒ์„ฑ
-- ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ
1. ์ธ๋ฑ์Šค ์‚ญ์ œ
2. ๋ฐ์ดํ„ฐ ๋กœ๋“œ
3. ์ธ๋ฑ์Šค ์žฌ์ƒ์„ฑ
4. ANALYZE ์‹คํ–‰

โŒ ์‹ค์ˆ˜ 2: ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ์กฐ๊ฑด ๋ฌด์‹œ

๋ฌธ์ œ: ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์œ„๋ฐ˜ ์˜ค๋ฅ˜

์›์ธ: ๋ถ€๋ชจ ํ…Œ์ด๋ธ”๋ณด๋‹ค ์ž์‹ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ๋กœ๋“œ

ํ•ด๊ฒฐ: ์˜์กด์„ฑ ์ˆœ์„œ๋Œ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
-- ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ
1. ๋ถ€๋ชจ ํ…Œ์ด๋ธ” (users)
2. ์ž์‹ ํ…Œ์ด๋ธ” (orders)
3. ์†์ž ํ…Œ์ด๋ธ” (order_items)

โŒ ์‹ค์ˆ˜ 3: ํƒ€์ž„์กด ๊ณ ๋ ค ์•ˆ ํ•จ

๋ฌธ์ œ: ๋‚ ์งœ/์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‹€์–ด์ง

์›์ธ: ์„œ๋ฒ„ ํƒ€์ž„์กด ์ฐจ์ด

ํ•ด๊ฒฐ: UTC๋กœ ํ†ต์ผํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์  ๋ณ€ํ™˜
-- PostgreSQL ์˜ˆ์‹œ
SET timezone = 'UTC';

-- ๋ณ€ํ™˜ ์˜ˆ์‹œ
CONVERT_TZ(datetime_col, 
  'Asia/Seoul', 'UTC')

โŒ ์‹ค์ˆ˜ 4: ํŠธ๋žœ์žญ์…˜ ํฌ๊ธฐ ๊ณผ๋‹ค

๋ฌธ์ œ: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ, ๋กค๋ฐฑ ์„ธ๊ทธ๋จผํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

์›์ธ: ํ•œ ํŠธ๋žœ์žญ์…˜์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ

ํ•ด๊ฒฐ: ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹
-- 1000๊ฐœ์”ฉ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
COMMIT_INTERVAL = 1000

for i in range(0, total, 1000):
    process_batch(i, i+1000)
    commit()
๐Ÿ’ก ๋””๋ฒ„๊น… ํŒ: ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋กœ๊ทธ๋ฅผ ๊ผผ๊ผผํžˆ ๋ด! ๋Œ€๋ถ€๋ถ„์˜ ์ž๋™ํ™” ๋„๊ตฌ๋Š” ์ƒ์„ธํ•œ ๋กœ๊ทธ๋ฅผ ์ œ๊ณตํ•ด. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๊ธ€๋งํ•˜๋ฉด ๋น„์Šทํ•œ ์‚ฌ๋ก€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด.
## ๐Ÿ“Š ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ ๋ฐ ๋น„๊ต ์‹ค์ œ๋กœ ์–ด๋А ์ •๋„ ์„ฑ๋Šฅ์ด ๋‚˜์˜ค๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€? ์—ฌ๋Ÿฌ ๋„๊ตฌ๋“ค์„ ํ…Œ์ŠคํŠธํ•ด๋ณธ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ• ๊ฒŒ!

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ
- ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 100GB (1์–ต ๋ ˆ์ฝ”๋“œ)
- ์›๋ณธ: MySQL 8.0 (์˜จํ”„๋ ˆ๋ฏธ์Šค)
- ๋Œ€์ƒ: PostgreSQL 14 (AWS RDS)
- ๋„คํŠธ์›Œํฌ: 1Gbps

๋„๊ตฌ ์†Œ์š” ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ์†๋„ CPU ์‚ฌ์šฉ๋ฅ  ๋น„์šฉ
AWS DMS 3์‹œ๊ฐ„ 20๋ถ„ 8.3 MB/s 65% $45
Apache NiFi 4์‹œ๊ฐ„ 10๋ถ„ 6.7 MB/s 72% ๋ฌด๋ฃŒ
Talend 2์‹œ๊ฐ„ 50๋ถ„ 9.8 MB/s 58% $120
์ˆ˜๋™ ์Šคํฌ๋ฆฝํŠธ 8์‹œ๊ฐ„ 30๋ถ„ 3.3 MB/s 45% ๋ฌด๋ฃŒ
๐Ÿ“ˆ ๋ถ„์„ ๊ฒฐ๊ณผ

Talend: ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ ๋น„์šฉ์ด ๋†’์Œ. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์— ์ ํ•ฉ
AWS DMS: ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ์˜ ๊ท ํ˜•. AWS ํ™˜๊ฒฝ์ด๋ฉด ์ตœ์„ ์˜ ์„ ํƒ
Apache NiFi: ๋ฌด๋ฃŒ์ง€๋งŒ ์„ค์ •์ด ๋ณต์žก. ๊ธฐ์ˆ ๋ ฅ ์žˆ๋Š” ํŒ€์— ์ถ”์ฒœ
์ˆ˜๋™ ์Šคํฌ๋ฆฝํŠธ: ๋А๋ฆฌ์ง€๋งŒ ์™„์ „ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์šฉ
์‹ค์ œ ํ”„๋กœ์ ํŠธ ์‚ฌ๋ก€

ํ•œ ์Šคํƒ€ํŠธ์—…์—์„œ MongoDB 5TB๋ฅผ PostgreSQL๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ์‚ฌ๋ก€๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ. ์ฒ˜์Œ์—” ์ˆ˜๋™์œผ๋กœ ํ•˜๋ ค๋‹ค๊ฐ€ ์˜ˆ์ƒ ์‹œ๊ฐ„์ด 2์ฃผ๊ฐ€ ๋‚˜์™€์„œ AWS DMS๋กœ ์ „ํ™˜ํ–ˆ๋Œ€. ๊ฒฐ๊ณผ์ ์œผ๋กœ 3์ผ ๋งŒ์— ์™„๋ฃŒํ–ˆ๊ณ , ๋‹ค์šดํƒ€์ž„์€ 4์‹œ๊ฐ„์œผ๋กœ ์ค„์˜€์–ด. ๋น„์šฉ์€ ์•ฝ $800 ์ •๋„ ๋“ค์—ˆ๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž ์ธ๊ฑด๋น„ ์ƒ๊ฐํ•˜๋ฉด ํ›จ์”ฌ ์ €๋ ดํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ !
## ๐ŸŽจ ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€ ์ฐพ๊ธฐ ํ˜น์‹œ ์ด ๊ธ€ ์ฝ๋‹ค๊ฐ€ "์•„, ์ด๊ฑฐ ํ˜ผ์ž ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๋ณต์žกํ•œ๋ฐ?" ์‹ถ์—ˆ์–ด? ๐Ÿ˜… ๊ทธ๋Ÿด ๋• ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ์„ ํƒ์ด์•ผ!

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

๐Ÿ’ผ ์žฌ๋Šฅ๋„ท์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค

โœ“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ปจ์„คํŒ…
โœ“ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ
โœ“ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํŠœ๋‹
โœ“ ํด๋ผ์šฐ๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง€์›
โœ“ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ
โœ“ ์‚ฌํ›„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์œ ์ง€๋ณด์ˆ˜

ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ์˜ˆ์‚ฐ์— ๋งž๋Š” ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„์„œ ์ƒ๋‹ด๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ!
## ๐Ÿ”ฎ ๋ฏธ๋ž˜ ํŠธ๋ Œ๋“œ์™€ ๋ฐœ์ „ ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™” ๊ธฐ์ˆ ๋„ ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด. ์•ž์œผ๋กœ ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์˜ฌ์ง€ ์‚ด์ง ์—ฟ๋ณด์ž! ### AI/ML ๊ธฐ๋ฐ˜ ์ž๋™ํ™” ์š”์ฆ˜ ํ•ซํ•œ AI๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ถ„์•ผ์—๋„ ๋“ค์–ด์˜ค๊ณ  ์žˆ์–ด. ๋จธ์‹ ๋Ÿฌ๋‹์œผ๋กœ ์ตœ์ ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์„ ์ž๋™์œผ๋กœ ์ถ”์ฒœํ•ด์ฃผ๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ํŒจํ„ด์„ ๋ถ„์„ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋‚˜์˜ค๊ณ  ์žˆ์ง€.

๐Ÿค– AI ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ์˜ˆ์‹œ

์Šค๋งˆํŠธ ์Šค์ผ€์ค„๋ง: ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•ด์„œ ์ตœ์ ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์†Œ์Šค ํ• ๋‹น์„ ์ถ”์ฒœ

์ด์ƒ ํƒ์ง€: ๋ฐ์ดํ„ฐ ํŒจํ„ด์„ ๋ถ„์„ํ•ด์„œ ์ž ์žฌ์  ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€

์ž๋™ ์ตœ์ ํ™”: ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž๋™ ์กฐ์ •

์˜ˆ์ธก ๋ถ„์„: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์†Œ์š” ์‹œ๊ฐ„๊ณผ ๋ฆฌ์Šคํฌ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์˜ˆ์ธก
### ๋ฉ€ํ‹ฐํด๋ผ์šฐ๋“œ ์ง€์› ์š”์ฆ˜์€ ํ•œ ํด๋ผ์šฐ๋“œ์—๋งŒ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ๋ฅผ ํ•จ๊ป˜ ์“ฐ๋Š” ์ถ”์„ธ์•ผ. AWS, Azure, GCP๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„๊ตฌ๋“ค์ด ์ ์  ๋” ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์–ด.

### ์ œ๋กœ ๋‹ค์šดํƒ€์ž„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ธฐ์ˆ ์ด ๋ฐœ์ „ํ•˜๋ฉด์„œ ์™„์ „ํ•œ ๋ฌด์ค‘๋‹จ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ  ์žˆ์–ด. CDC(Change Data Capture) ๊ธฐ์ˆ ์ด ๋”์šฑ ์ •๊ตํ•ด์ง€๊ณ , ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ์„ฑ๋Šฅ๋„ ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜๊ณ  ์žˆ์ง€.

### ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ Docker, Kubernetes ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ๊ณผ ๊ฒฐํ•ฉ๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์†”๋ฃจ์…˜๋“ค๋„ ๋‚˜์˜ค๊ณ  ์žˆ์–ด. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ํŒจํ‚ค์ง•ํ•ด์„œ ์ด๋™ํ•˜๋ฉด ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ฑฐ๋“ .
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™”์˜ ๋ฏธ๋ž˜ AI/ML Multi Cloud Zero Downtime Container Serverless ์ง€๋Šฅํ˜• ์ž๋™ํ™” ํด๋ผ์šฐ๋“œ ์ž์œ  ๋ฌด์ค‘๋‹จ ์ „ํ™˜ ์ด์‹์„ฑ ํ–ฅ์ƒ ๊ด€๋ฆฌ ๊ฐ„์†Œํ™” ๋” ๋น ๋ฅด๊ณ , ๋” ์•ˆ์ „ํ•˜๊ณ , ๋” ์Šค๋งˆํŠธํ•˜๊ฒŒ!
## ๐Ÿ’ก ์‹ค๋ฌด ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค์ „์—์„œ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•ด์ค„๊ฒŒ! ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•  ๋•Œ ์ด๊ฑฐ ํ•˜๋‚˜์”ฉ ์ฒดํฌํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•˜๋ฉด ์‹ค์ˆ˜๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์–ด. ๐Ÿ“
๐Ÿ“‹ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โ–ก ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„
ย ย โ–ก ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ชฉ์  ๋ช…ํ™•ํ™”
ย ย โ–ก ์„ฑ๊ณต ๊ธฐ์ค€ ์ •์˜
ย ย โ–ก ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค์šดํƒ€์ž„ ํ™•์ธ
ย ย โ–ก ์˜ˆ์‚ฐ ๋ฐ ์ผ์ • ์ˆ˜๋ฆฝ

โ–ก ๊ธฐ์ˆ ์  ๋ถ„์„
ย ย โ–ก ์›๋ณธ DB ๋ฒ„์ „ ๋ฐ ๊ตฌ์กฐ ํŒŒ์•…
ย ย โ–ก ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ์ธก์ •
ย ย โ–ก ์ข…์†์„ฑ ๋ถ„์„ (FK, ํŠธ๋ฆฌ๊ฑฐ, ํ”„๋กœ์‹œ์ €)
ย ย โ–ก ํŠน์ˆ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ™•์ธ
ย ย โ–ก ์ธ์ฝ”๋”ฉ ๋ฐ ์ฝœ๋ ˆ์ด์…˜ ์ฒดํฌ

โ–ก ์ธํ”„๋ผ ์ค€๋น„
ย ย โ–ก ๋ชฉํ‘œ ์‹œ์Šคํ…œ ํ”„๋กœ๋น„์ €๋‹
ย ย โ–ก ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ™•์ธ
ย ย โ–ก ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™ ์„ค์ •
ย ย โ–ก ๋ฐฑ์—… ์‹œ์Šคํ…œ ๊ตฌ์ถ•
ย ย โ–ก ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ์„ค์น˜

โ–ก ๋ณด์•ˆ ๋ฐ ๊ถŒํ•œ
ย ย โ–ก ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „์šฉ ๊ณ„์ • ์ƒ์„ฑ
ย ย โ–ก ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ ์šฉ
ย ย โ–ก SSL/TLS ์—ฐ๊ฒฐ ์„ค์ •
ย ย โ–ก ์•”ํ˜ธํ™” ์š”๊ตฌ์‚ฌํ•ญ ํ™•์ธ
ย ย โ–ก ๊ทœ์ • ์ค€์ˆ˜ ์ฒดํฌ (GDPR, ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ๋ฒ• ๋“ฑ)
๐Ÿš€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โ–ก ์‹คํ–‰ ์ „ ์ตœ์ข… ์ ๊ฒ€
ย ย โ–ก ๋ฐฑ์—… ์™„๋ฃŒ ํ™•์ธ
ย ย โ–ก ๋กค๋ฐฑ ๊ณ„ํš ๊ฒ€ํ† 
ย ย โ–ก ํŒ€์› ์—ญํ•  ๋ถ„๋‹ด
ย ย โ–ก ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ฑ„๋„ ์˜คํ”ˆ

โ–ก ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
ย ย โ–ก ์ง„ํ–‰๋ฅ  ์ถ”์ 
ย ย โ–ก ์—๋Ÿฌ ๋กœ๊ทธ ํ™•์ธ
ย ย โ–ก ์„ฑ๋Šฅ ์ง€ํ‘œ ๋ชจ๋‹ˆํ„ฐ๋ง
ย ย โ–ก ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ  ์ฒดํฌ
ย ย โ–ก ๋„คํŠธ์›Œํฌ ์ƒํƒœ ํ™•์ธ

โ–ก ๋ฌธ์ œ ๋Œ€์‘
ย ย โ–ก ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ๊ธฐ๋ก
ย ย โ–ก ์›์ธ ๋ถ„์„ ๋ฐ ์กฐ์น˜
ย ย โ–ก ํ•„์š”์‹œ ์ผ์‹œ ์ค‘์ง€
ย ย โ–ก ์ดํ•ด๊ด€๊ณ„์ž ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
โœ… ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โ–ก ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
ย ย โ–ก ๋ ˆ์ฝ”๋“œ ์ˆ˜ ์ผ์น˜ ํ™•์ธ
ย ย โ–ก ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๋น„๊ต
ย ย โ–ก ์ฒดํฌ์„ฌ ๊ฒ€์ฆ
ย ย โ–ก NULL ๊ฐ’ ํ™•์ธ
ย ย โ–ก ๋‚ ์งœ/์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ

โ–ก ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
ย ย โ–ก CRUD ์ž‘์—… ํ…Œ์ŠคํŠธ
ย ย โ–ก ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์‹คํ–‰
ย ย โ–ก ํŠธ๋žœ์žญ์…˜ ํ…Œ์ŠคํŠธ
ย ย โ–ก ๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ
ย ย โ–ก ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

โ–ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒ€์ฆ
ย ย โ–ก ์ฃผ์š” ๊ธฐ๋Šฅ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ
ย ย โ–ก ์—ฃ์ง€ ์ผ€์ด์Šค ํ™•์ธ
ย ย โ–ก ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ฒ€์ฆ
ย ย โ–ก ์‚ฌ์šฉ์ž ์ˆ˜์šฉ ํ…Œ์ŠคํŠธ

โ–ก ์šด์˜ ์ค€๋น„
ย ย โ–ก ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์‹œ๋ณด๋“œ ์„ค์ •
ย ย โ–ก ์•Œ๋žŒ ๊ทœ์น™ ๊ตฌ์„ฑ
ย ย โ–ก ๋ฐฑ์—… ์Šค์ผ€์ค„ ์„ค์ •
ย ย โ–ก ์šด์˜ ๋ฌธ์„œ ์ž‘์„ฑ
ย ย โ–ก ํŒ€ ๊ต์œก ์‹ค์‹œ

โ–ก ์ •๋ฆฌ ์ž‘์—…
ย ย โ–ก ์ž„์‹œ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ
ย ย โ–ก ์›๋ณธ ์‹œ์Šคํ…œ ์œ ์ง€/ํ๊ธฐ ๊ฒฐ์ •
ย ย โ–ก ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 
ย ย โ–ก ๋ฌธ์„œํ™” ์™„๋ฃŒ
## ๐ŸŽ“ ํ•™์Šต ๋ฆฌ์†Œ์Šค ๋ฐ ์ถ”๊ฐ€ ์ž๋ฃŒ ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ•ด๋ด!

๐Ÿ“š ๊ณต์‹ ๋ฌธ์„œ

AWS Database Migration Service:
https://docs.aws.amazon.com/dms/
๊ฐ€์žฅ ์ƒ์„ธํ•œ ๊ฐ€์ด๋“œ์™€ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค ์ œ๊ณต

Apache NiFi:
https://nifi.apache.org/docs.html
์˜คํ”ˆ์†Œ์Šค ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ์ž๋™ํ™”์˜ ๋ฐ”์ด๋ธ”

PostgreSQL Wiki - Migration:
https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL
๋‹ค์–‘ํ•œ DB์—์„œ PostgreSQL๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ํŒ
๐ŸŽฅ ์˜จ๋ผ์ธ ๊ฐ•์˜

Udemy - Database Migration Masterclass:
์‹ค์ „ ํ”„๋กœ์ ํŠธ ์ค‘์‹ฌ์˜ ์‹ค์Šต ๊ฐ•์˜

Coursera - Cloud Database Migration:
ํด๋ผ์šฐ๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋ฌธ ๊ณผ์ •

YouTube - AWS re:Invent ์„ธ์…˜:
์‹ค์ œ ๊ธฐ์—… ์‚ฌ๋ก€์™€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ• ์†Œ๊ฐœ
๐Ÿ“– ์ถ”์ฒœ ๋„์„œ

"Database Reliability Engineering" - Laine Campbell:
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์šด์˜์˜ ๋ชจ๋“  ๊ฒƒ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฑ•ํ„ฐ ํ•„๋…

"Designing Data-Intensive Applications" - Martin Kleppmann:
๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„์˜ ๊ณ ์ „, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒจํ„ด ์‹ฌํ™”

"The Art of PostgreSQL" - Dimitri Fontaine:
PostgreSQL ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŠนํ™” ๊ฐ€์ด๋“œ
๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ

Stack Overflow:
์‹ค์ „ ๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ๋ณด๊ณ 
ํƒœ๊ทธ: database-migration, etl, data-migration

Reddit - r/database:
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „๋ฌธ๊ฐ€๋“ค์˜ ํ† ๋ก ์žฅ

DBA Stack Exchange:
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์ž๋“ค์˜ Q&A ํ”Œ๋žซํผ

์žฌ๋Šฅ๋„ท ์ง€์‹์ธ์˜ ์ˆฒ:
ํ•œ๊ตญ์–ด๋กœ ์†Œํ†ตํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” ์‹ค์ „ ๋…ธํ•˜์šฐ!
## ๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ ์™€, ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด ์ •๋ง ๋Œ€๋‹จํ•ด! ๐Ÿ‘ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™”์— ๋Œ€ํ•ด ๊ฝค ๋งŽ์€ ๊ฑธ ์•Œ๊ฒŒ ๋์„ ๊ฑฐ์•ผ.

ํ•ต์‹ฌ๋งŒ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด:

๐Ÿ”‘ ํ•ต์‹ฌ ์š”์•ฝ

1. ๊ณ„ํš์ด ๋ฐ˜์ด๋‹ค: ์‚ฌ์ „ ๋ถ„์„๊ณผ ์ค€๋น„์— ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด

2. ์ ์ ˆํ•œ ๋„๊ตฌ ์„ ํƒ: ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํ™˜๊ฒฝ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ๊ณจ๋ผ

3. ๋‹จ๊ณ„๋ณ„ ์ ‘๊ทผ: ํ•œ ๋ฒˆ์— ๋‹ค ํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋ง๊ณ  ๋‹จ๊ณ„์ ์œผ๋กœ ์ง„ํ–‰ํ•ด

4. ์ฒ ์ €ํ•œ ๊ฒ€์ฆ: ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ํ™•์ธ์€ ์•„๋ฌด๋ฆฌ ๊ฐ•์กฐํ•ด๋„ ์ง€๋‚˜์น˜์ง€ ์•Š์•„

5. ๋กค๋ฐฑ ์ค€๋น„: ํ•ญ์ƒ Plan B๋ฅผ ์ค€๋น„ํ•ด๋‘ฌ

6. ์ง€์†์  ๋ชจ๋‹ˆํ„ฐ๋ง: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„์—๋„ ํ•œ๋™์•ˆ ์ง‘์ค‘ ๊ด€์ฐฐ์ด ํ•„์š”ํ•ด

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

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

์ž, ์ด์ œ ๋‹น์‹ ๋„ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž๋™ํ™” ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ์ค€๋น„๊ฐ€ ๋์–ด! ๐Ÿš€ ํ™”์ดํŒ…! ๐Ÿ’ฏ

๐ŸŽ‰ ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ฑ๊ณต์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰

์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ด์ „์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ์žฅ์„ ๊ฐ€์†ํ™”ํ•˜์„ธ์š”!

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

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

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

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