AWS ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

๋‰ด๋„ฅ์Šค์˜ AWS ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๊ตฌ์ถ•๊ณผ ์šด์˜ ์‚ฌ๋ก€

์†Œ๊ฐœ

๋‰ด๋„ฅ์Šค(NEWNEX)๋Š” 2014๋…„์— ์„ค๋ฆฝ๋œ ํŒจ์…˜ ์ด์ปค๋จธ์Šค ํ”Œ๋žซํผ ๊ธฐ์—…์œผ๋กœ, IT ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•ด ์ปค๋จธ์Šค์™€ ๋ฌผ๋ฅ˜ ์ธํ”„๋ผ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ โ€˜ํ•˜๋ฃจ๋ฐฐ์†กโ€™๊ณผ ๊ฐ™์€ ์ตœ์ ์˜ ์‡ผํ•‘ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ 1020 ์—ฌ์„ฑ ํŒจ์…˜ ํ”Œ๋žซํผ โ€˜๋ธŒ๋žœ๋””โ€™, ๋‚จ์„ฑ ์‡ผํ•‘ ํ”Œ๋žซํผ โ€˜ํ•˜์ด๋ฒ„โ€™, ์—ฌ์„ฑ ๋ธŒ๋žœ๋“œ ํŒจ์…˜ ํ”Œ๋žซํผ โ€˜์„œ์šธ์Šคํ† ์–ดโ€™๋ฅผ ์šด์˜ ์ค‘์ด๋ฉฐ, ํŒ๋งค์ž์—๊ฒŒ ๋ฌผ๋ฅ˜์™€ ์šด์˜์„ ์ง€์›ํ•˜๋Š” ํ†ตํ•ฉ ์„œ๋น„์Šค์ธ โ€˜ํ—ฌํ”ผโ€™๋„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‰ด๋„ฅ์Šค๋Š” 2024๋…„ ๊ธฐ์ค€ ๋ˆ„์  ๊ฑฐ๋ž˜์•ก 1.8์กฐ ์›, ํˆฌ์ž ์œ ์น˜ 1,530์–ต ์›์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋“ฑ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ โ€œNew Thinking Next Moving(์ƒˆ๋กœ์šด ์‚ฌ๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์›€์ง์ž„)โ€์ด๋ผ๋Š” ์‚ฌ๋ช… ์•„๋ž˜, โ€˜๋‹ค์Œ ์„ธ๋Œ€์˜ ์ปค๋จธ์Šคโ€™๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋Š์ž„์—†์ด ๋„์ „ํ•˜๊ณ  ํ˜์‹ ํ•˜๊ณ  ์žˆ๋Š” ๋Œ€ํ•œ๋ฏผ๊ตญ ๋Œ€ํ‘œ ์Šคํƒ€ํŠธ์—…์ž…๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐฐ๊ฒฝ

๋‰ด๋„ฅ์Šค์—์„œ ์šด์˜ํ•˜๋Š” ํŒจ์…˜ ํ”Œ๋žซํผ์ธ โ€˜๋ธŒ๋žœ๋””โ€™์™€ โ€˜ํ•˜์ด๋ฒ„โ€™๋Š” ๊ธฐ์กด์— SaaS ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๋Š” ํƒ€์‚ฌ์˜ ๊ฒ€์ƒ‰ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ JSON ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๊ฒ€์ƒ‰ ์†”๋ฃจ์…˜๊ณผ ์—ฐ๊ณ„ํ•˜๊ณ , REST API๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์งˆ์˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ๋ฒ•์€ ๋‹จ์ˆœํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ์ ์ด ์žˆ์—ˆ์œผ๋‚˜, ๋šœ๋ ทํ•œ ํ•œ๊ณ„์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž, ๋” ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‹œ์Šคํ…œ์„ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ์†”๋ฃจ์…˜ ๊ฐœ์š”

๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋กœ ๋…ธ์ถœ๋˜๊ธฐ๊นŒ์ง€๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ ์ถ”์ถœ โ†’ ๋ฐ์ดํ„ฐ ์ƒ‰์ธ โ†’ ๊ฒ€์ƒ‰ ์งˆ์˜ ๋ฐ ์‘๋‹ต 3๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ๊ณผ ๋ฐ์ดํ„ฐ ์ƒ‰์ธ ๊ณผ์ •์„ ํŽธ์˜์ƒ โ€˜๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธโ€™์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฒ€์ƒ‰ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์€ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค๊ณ„๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์šด์˜๋ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๊ตํ•˜๊ฒŒ ์ถ”์ถœ(Extract)ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ์ธํ…”๋ฆฌ์ „์Šค๋ฅผ ์ ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜(Transformation)ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์— ํšจ์œจ์ ์œผ๋กœ ์ƒ‰์ธ(Indexing)๋˜์–ด, ์ •ํ™•ํ•œ ์ •๋ณด ๊ฒ€์ƒ‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒ€์ƒ‰ ์ƒ‰์ธ ๊ณผ์ •์€ ์ „์ฒด ์ƒ‰์ธ๊ณผ ์ฆ๋ถ„ ์ƒ‰์ธ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ โ€˜์ „์ฒด ์ƒ‰์ธโ€™์ด๋ผ ํ•˜๊ณ , ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ๋œ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๊ณผ์ •์„ โ€˜์ฆ๋ถ„ ์ƒ‰์ธโ€™์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‰ด๋„ฅ์Šค์—์„œ๋Š” ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์„ ์ž์ฒด ๊ตฌ์ถ•ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ์ƒ‰์ธ ๋ฐฉ์‹ ๋ณ„๋กœ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1. ์ „์ฒด ์ƒ‰์ธ

๊ฒ€์ƒ‰์—”์ง„์˜ ์„ฑ๋Šฅ์€ ์ƒ‰์ธ ํšจ์œจ์„ฑ์— ํฌ๊ฒŒ ์ขŒ์šฐ๋˜๋ฏ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ํ™•์žฅ์ด๋‚˜ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ‰์ธ์˜ ์ „ ๋‹จ๊ณ„์ธ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๋ฐ ๋ณ€ํ™˜(ETL, Extract, Transform, Load) ๊ณผ์ •์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•ต์‹ฌ ๊ณผ์ œ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋žœ๋””์˜ ๊ฒฝ์šฐ, 200๋งŒ ๊ฑด ์ด์ƒ์˜ ๋Œ€์šฉ๋Ÿ‰ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถ”์ถœํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์  ๋ชฉํ‘œ๋ฅผ ์ˆ˜๋ฆฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ์œ ์—ฐํ•œ ์Šค์ผ€์ค„๋ง ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๊ด€๋ฆฌ
  • ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
  • ๊ฐ ETL ๋‹จ๊ณ„์˜ ๋ช…ํ™•ํ•œ ์ฑ…์ž„ ๋ถ„๋ฆฌ

2. ์ฆ๋ถ„ ์ƒ‰์ธ

์ดˆ๊ธฐ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹œ, ๊ธฐ์กด ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์˜ ์ฃผ๊ธฐ์™€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ „์ฒด ์ƒ‰์ธ๊ณผ ์ฆ๋ถ„ ์ƒ‰์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์ผํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•˜์˜€์œผ๋ฉฐ, ์ „์ฒด ์ƒ‰์ธ์€ ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ, ์ฆ๋ถ„ ์ƒ‰์ธ์€ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์ด ์•ˆ์ •ํ™”๋œ ํ›„, ์ฆ๋ถ„ ์ƒ‰์ธ์˜ ์ฃผ๊ธฐ๋ฅผ ๋”์šฑ ๋‹จ์ถ•ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์ด ๋Œ€๋‘๋˜์—ˆ๊ณ , ์™„์ „ํ•œ ์‹ค์‹œ๊ฐ„ ์ƒ‰์ธ์€ ์•„๋‹ˆ์ง€๋งŒ ์ดˆ ๋‹จ์œ„์˜ ์ค€ ์‹ค์‹œ๊ฐ„(Near real-time) ์ƒ‰์ธ ๊ตฌํ˜„์„ ์ค€๋น„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ๋ถ„ ์ƒ‰์ธ์€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ธฐ์ˆ ์  ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ด€๋ฆฌ ๋ณต์žก์„ฑ์„ ์ตœ์†Œํ™”
  • ๋ฐ์ดํ„ฐ ์ƒ‰์ธ ์†๋„ ๊ทน๋Œ€ํ™”

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

์ „์ฒด ์ƒ‰์ธ ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ

1. ์ „์ฒด ์ƒ‰์ธ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‹œํ€€์Šค

AWS ์„œ๋น„์Šค ์„ค๋ช…
Amazon Managed Workflows for Apache Airflow (MWAA) Amazon MWAA๋Š” Apache Airflow๋ฅผ ์œ„ํ•œ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋กœ, ์ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ์˜ ์ต์ˆ™ํ•œ Apache Airflow ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ฐ˜ ์ธํ”„๋ผ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์„œ ์˜ค๋Š” ์šด์˜ ๋ถ€๋‹ด ์—†์ด ํ™•์žฅ์„ฑ, ๊ฐ€์šฉ์„ฑ ๋ฐ ๋ณด์•ˆ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
AWS Glue AWS Glue๋Š” ๋ถ„์„, ๊ธฐ๊ณ„ ํ•™์Šต(ML) ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ํƒ์ƒ‰, ์ค€๋น„, ์ด๋™ ๋ฐ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
Amazon Simple Storage Service(Amazon S3) Amazon Simple Storage Service(Amazon S3)๋Š” ์—…๊ณ„ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ํ™•์žฅ์„ฑ, ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ, ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
Amazon Opensearch Service Amazon OpenSearch Service๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋กœ๊ทธ ๋ถ„์„, ๊ด€์ธก์„ฑ ๋ฐ ์›น ์‚ฌ์ดํŠธ ๊ฒ€์ƒ‰๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ ์šด์˜ ๋ฐ์ดํ„ฐ์˜ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ„์„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ๋„์— ๋”ฐ๋ผ ์Šค์ผ€์ค„๋ง ์‹คํ–‰๋ถ€ํ„ฐ ์ƒ‰์ธ ์™„๋ฃŒ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์ˆœ์„œ๋Œ€๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2. ๋ฐ์ดํ„ฐ ์ถ”์ถœ

  • MWAA: ์„ค์ •๋œ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์ถ”์ถœ์„ ์œ„ํ•œ AWS์˜ ETL ๋„๊ตฌ์ธ Glue Job์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Glue: ํ™œ์„ฑ ์ƒํ’ˆ ์ •๋ณด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Amazon Relational Database Service, RDS)์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฐ์ดํ„ฐ๋ฅผ Apache Spark๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

3. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜

  • Glue: ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ ์šฉํ•˜์—ฌ, JSON ํ˜•ํƒœ์˜ ์นผ๋Ÿผ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” Apache Parquet ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • S3: ๋ณ€ํ™˜๋œ Parquet ํฌ๋งท์˜ S3 ๋ฒ„ํ‚ท์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ ์ƒ‰์ธ

  • MWAA: ๋ฐ์ดํ„ฐ ์ถ”์ถœ Glue Job์ด ์ข…๋ฃŒ๋˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ๋ฐ์ดํ„ฐ ์ƒ‰์ธ์„ ์œ„ํ•œ Glue Job์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Glue: S3 ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด OpenSearch์˜ Bulk API๋ฅผ ํ†ตํ•ด ์ธ๋ฑ์‹ฑ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก์•ž์„œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ์˜ ๊ณ ๋ ค์‚ฌํ•ญ๋“ค์„ ๋ชจ๋‘ ์ถฉ์กฑ์‹œํ‚ฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ์ด์ ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

  1. ์Šค์ผ€์ค„๋ง ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๋ณ€๊ฒฝ ์šฉ์ด์„ฑ
    ์Šค์ผ€์ค„๋ง๊ณผ ์Šคํฌ๋ฆฝํŠธ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. MWAA๋Š” ์›Œํฌํ”Œ๋กœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ, ์Šคํฌ๋ฆฝํŠธ์—์„œ ์Šค์ผ€์ค„๋ง๊ณผ ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ํ™”๋ฉด์„ ํ†ตํ•ด ๋ชจ๋“  Directed Acyclic Graph (DAG) ์ž‘์—…์˜ ์ด๋ ฅ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด, ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ ๊ด€๋ฆฌ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์ˆ˜ํ–‰ ์ด๋ ฅ ๋ฐ ๋กœ๊ทธ ์ ์žฌ
    ์ˆ˜ํ–‰ ์ด๋ ฅ๊ณผ ๋กœ๊ทธ๋ฅผ ์ ์ ˆํžˆ ๊ธฐ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Glue๋Š” ์ˆ˜ํ–‰ ์ด๋ ฅ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ETL ์ž‘์—…์„ ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๊ทธ์™€ ์ด๋ ฅ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ž๋™ํ™”
    ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์ธ์  ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ , ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. MWAA์™€ Glue๋Š” ์•ž์„œ ์•„ํ‚คํ…์ฒ˜์—์„œ ํ™•์ธ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
    ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—์„œ๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ์ตœ๋Œ€ํ•œ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. Spark๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ์•ˆ์ •์„ฑ๋„ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์Šค์บ”ํ•  ๋•Œ ์ง๋ ฌ ์ฒ˜๋ฆฌ(serial processing)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๋„ ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ˆ˜๋ฐฑ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ(GB) ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, Glue์—์„œ Spark๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ฝ”์–ด ์ˆ˜์— ๋น„๋ก€ํ•ด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ํš๊ธฐ์ ์œผ๋กœ ๋‹จ์ถ•๋˜๋ฉฐ, ๋™์‹œ์— ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ๋„ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

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

5. ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์‹œ

์‹ค์ œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„๋žตํ™”ํ•˜์—ฌ MWAA์™€ Glue ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

with DAG(
        dag_id="dag_id",
        tags=["tag1", "tag2"],
        default_args={
            'owner': 'brandi',
            'start_date': datetime(2023, 9, 12, 13, 0, 0),
            'on_failure_callback': slack_alert_bot.alert_fail_message,
            'on_success_callback': slack_alert_bot.alert_success_message,
            'retries': 1
        },
        catchup=False,
        # cron ๋ฐฉ์‹์˜ ์Šค์ผ€์ค„๋ง ์„ค์ • 
        schedule_interval="0 20 * * SAT"
) as dag:

    task = trigger_glue_trigger_job(
        group_id='group_1',
        job_name="extract_job",
        # ํ˜„์žฌ ์ž‘์—… ์ข…๋ฃŒ ์‹œ ์‹คํ–‰๋˜๋Š” trigger job name 
        trigger_dag_id="trigger_indexing_job",
        script_args={
            '--arg_1': '1',  
            '--arg_2': '2',  
            '--arg_3': '3'
        },
        trigger_conf={
            'trigger_params_1': '1',
            'trigger_params_2': '2'
        }
    )

    task

MWAA DAG ์Šคํฌ๋ฆฝํŠธ: cron ๋ฐฉ์‹์˜ ์Šค์ผ€์ค„๋ง ์„ค์ •๊ณผ ํ•ด๋‹น ์ž‘์—… ์ข…๋ฃŒ ํ›„ ์‹คํ–‰๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

# ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ์‹œ ์ฝ์–ด์˜ฌ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ํŒŒํ‹ฐ์…”๋‹ ๋  ๋•Œ์˜ ๊ธฐ์ค€ ์—ด, ๋ฒ”์œ„ ์„ค์ •
_products = _reader.option("dbtable", "์Šคํ‚ค๋งˆ.ํ…Œ์ด๋ธ”๋ช…") \
    .option("numPartitions", 10) \
    .option("partitionColumn", "id") \
    .option("lowerBound", _lower_bound) \
    .option("upperBound", _upper_bound) \
    .load() \
    .select(
    col("ID"),
    col("NAME"),
    col("DISPLAY_TYPE")
)

# ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ 
_product_df = _products \
    .select(
        col("ID").cast(StringType()).alias("id"),
        col("NAME").alias("product_name"),
        when(col("DISPLAY_TYPE") == '1', True).otherwise(False).alias("is_display") \

# ํŒŒํ‹ฐ์…”๋‹ ์„ค์ • 
_product_df.repartition(128).write.mode('overwrite').parquet(_output_path)

์ถ”์ถœ(Extract) Glue ์Šคํฌ๋ฆฝํŠธ: ์›์ฒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ํŒŒํ‹ฐ์…˜์„ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ํ›„ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„(DataFrame)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ 128๊ฐœ๋กœ ํŒŒํ‹ฐ์…”๋‹ํ•˜์—ฌ S3 ์ถœ๋ ฅ ๊ฒฝ๋กœ(output path)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

_products.rdd.repartition(300)
    .mapPartitions(convert_to_json)
    .coalesce(1)
    .foreachPartition(partial(bulkApi_์ „์†ก_๋ฉ”์„œ๋“œ, host=๊ฒ€์ƒ‰์—”์ง„_ํ˜ธ์ŠคํŠธ, index=์ธ๋ฑ์Šค๋ช…))

์ƒ‰์ธ(Indexing) Glue ์Šคํฌ๋ฆฝํŠธ: ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ RDD (Resilient Distributed Dataset)๋กœ ๋ณ€ํ™˜ ํ›„ 300๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ OpenSearch์— ๋ฒŒํฌ๋กœ ์ธ๋ฑ์‹ฑ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด, MWAA DAG ์Šคํฌ๋ฆฝํŠธ์—์„œ ์Šค์ผ€์ค„๋Ÿฌ์™€ ์ž‘์—…(task)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ๋•Œ Glue์—์„œ Spark๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…”๋‹์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฒ€์ƒ‰์—”์ง„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‚ฌ์–‘์— ๋งž์ถฐ ๋ฆฌํŒŒํ‹ฐ์…”๋‹(repartitioning) ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋ฒŒํฌ ์ธ๋ฑ์‹ฑ ์ž‘์—…์˜ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ์ฝ˜์†” ํ™”๋ฉด ์˜ˆ์‹œ

Airflow ์ฝ˜์†” ํ™”๋ฉด โ€“ DAG๋“ค์ด ๊ฐ๊ฐ์˜ ์ž‘์—…์œผ๋กœ ๋‚˜์—ด๋˜์–ด ํ•œ๋ˆˆ์— ํŒŒ์•… ๊ฐ€๋Šฅ

Glue ์ฝ˜์†” ํ™”๋ฉด โ€“ ๊ฐ ์ž‘์—… ๋ณ„ ์ˆ˜ํ–‰์ด๋ ฅ๊ณผ ๋กœ๊ทธ ํ™•์ธ ๊ฐ€๋Šฅ

์ฆ๋ถ„ ์ƒ‰์ธ ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ

์ฆ๋ถ„ ์ƒ‰์ธ์˜ ํ•ต์‹ฌ ๊ณผ์ œ์ธ ์‹ค์‹œ๊ฐ„์„ฑ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•Œ๋ฆผ ์„œ๋น„์Šค์ธ Amazon Simple Notification Service (SNS)์™€ ๋ฉ”์‹œ์ง€ ํ ์„œ๋น„์Šค์ธ Amazon Simple Queue Service (SQS)๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋„์ž…๋œ ์‹œ์Šคํ…œ์ด์–ด์„œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๊ณ , ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ์ ์–ด ๋น„์šฉ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํฐ ์žฅ์ ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, SQS ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค AWS Lambda๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก ์„ค์ •ํ•ด ๋ฐ์ดํ„ฐ ์ถ”์ถœ๊ณผ ์ƒ‰์ธ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฆ๋ถ„ ์ƒ‰์ธ ์•„ํ‚คํ…์ฒ˜

AWS ์„œ๋น„์Šค ์„ค๋ช…
Amazon Simple Notification Service (SNS) Amazon Simple Notification Service (SNS)๋Š” A2A์™€ A2P์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์•Œ๋ฆผ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. A2A๋Š” ๋ถ„์‚ฐ๋œ ์‹œ์Šคํ…œ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐ ์ด๋ฒคํŠธ ์ค‘์‹ฌ์˜ ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งŽ์€ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜์˜ ๋‹ค๋Œ€๋‹ค ๋ฉ”์‹œ์ง•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. A2P ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด SMS ํ…์ŠคํŠธ, ํ‘ธ์‹œ ์•Œ๋ฆผ, ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ๊ณ ๊ฐ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Amazon Simple Queue Service (SQS) Amazon Simple Queue Service (SQS)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์‹œ์ง€ ์†์‹ค์„ ์šฐ๋ คํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ํ•„์š” ์—†์ด ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์— ์–ด๋–ค ๋ณผ๋ฅจ์˜ ๋ฉ”์‹œ์ง€๋“  ์ „์†ก, ์ €์žฅ ๋ฐ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
AWS Lambda AWS Lambda๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํ“จํŒ… ์„œ๋น„์Šค๋กœ, ์•„์ด๋””์–ด๋ฅผ ์ตœ์‹  ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด์ œ ๊ฐ ์‹œํ€€์Šค๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฆ๋ถ„ ์ƒ‰์ธ ์‹œํ€€์Šค: ์ƒํ’ˆ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ๋ฐœ์ƒ โ†’ SNS ์ด๋ฒคํŠธ ๊ฒŒ์‹œโ†’ SQS ํ ์ถ”๊ฐ€ โ†’ Lambda ์‹คํ–‰

๋ฐ์ดํ„ฐ ์ถ”์ถœ

  • SNS, SQS
    ๋ณ€๊ฒฝ๋œ ์ƒํ’ˆ ๋ฒˆํ˜ธ๊ฐ€ SQS์— ๋ฉ”์‹œ์ง€ ํ ์ด๋ฒคํŠธ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • Lambda
    ํ์— ์ถ”๊ฐ€๋œ ๋ณ€๊ฒฝ๋œ ์ƒํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Lambda ํ•จ์ˆ˜์—์„œ RDS์— ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด ํ•ด๋‹น ์ƒํ’ˆ ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. Python๊ณผ Pandas๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”์ถœ๋œ ์ •๋ณด๋กœ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ƒ‰์ธ

  • Lambda
    ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ OpenSearch์˜ Bulk API๋กœ ์ „๋‹ฌํ•ด ์ƒ‰์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ์„ฑ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ฒœ ๊ฑด ์ด์ƒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
  2. Lambda ํ•จ์ˆ˜์˜ ๋™์‹œ ์‹คํ–‰ ๋ฌธ์ œ

๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, Lambda ํ•จ์ˆ˜์˜ ๋™์‹œ ์‹คํ–‰ ์š”์ฒญ์ด ๊ณผ๋„ํ•˜๊ฒŒ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ณผ๋ถ€ํ•˜๋˜์–ด ๋Œ€๋Ÿ‰์˜ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒœ ๋‹จ์œ„ ์ด์ƒ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ์กด์˜ ๊ตฌ์กฐ๋ณด๋‹ค๋Š” CDC(Change Data Capture) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ์ƒ‰์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋žœ๋””๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Lambda ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฉ”์‹œ์ง€ํ ์ด๋ฒคํŠธ๋ฅผ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋ถ„ํ• (chunking)ํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ „์†กํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์œผ๋ฉฐ, ๋™์‹œ์— Lambda์˜ ๋™์‹œ ์‹คํ–‰ ์˜ต์…˜์„ ์กฐ์ •ํ•˜์—ฌ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ฆ๋ถ„ ์ƒ‰์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณ ๋„ํ™”ํ•˜๋ฉด์„œ, ๊ธฐ์กด 30๋ถ„์ด์—ˆ๋˜ ์ฃผ๊ธฐ๋ฅผ 1๋ถ„ ์ด๋‚ด๋กœ ์ค„์ด๋Š” ์„ฑ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ–ˆ๊ณ  Lambda ๋„์ž…์„ ํ†ตํ•ด ์„œ๋ฒ„๋ฆฌ์Šค(serverless) ๊ตฌ์กฐ์˜ ์žฅ์ ์„ ํ™œ์šฉํ•˜์—ฌ ์ธํ”„๋ผ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ , ๋น ๋ฅธ ์ฒ˜๋ฆฌ์™€ ์šด์˜ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ๊ฐ€ ๋‹จ์ถ•๋จ์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰์—”์ง„์˜ ํ™œ์šฉ ๋ฒ”์œ„๋„ ๋‹จ์ˆœํ•œ ๊ฒ€์ƒ‰ ๋ฉ”๋‰ด๋ฅผ ๋„˜์–ด ๋‹ค์–‘ํ•œ ์˜์—ญ์œผ๋กœ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์ „์—๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋˜ ๊ฒ€์ƒ‰์—”์ง„์ด ์ด์ œ๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„์„ฑ์„ ๊ฐ–์ถ”๊ฒŒ ๋˜๋ฉด์„œ ๋‹จ์ˆœํžˆ ๊ฒ€์ƒ‰ ๋ฉ”๋‰ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์นดํ…Œ๊ณ ๋ฆฌ ํŽ˜์ด์ง€์—๋„ ๊ฒ€์ƒ‰์—”์ง„์„ ๋„์ž…ํ•ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€๋‹ด์„ ์ค„์ด๋Š” ์ค‘์š”ํ•œ ๊ฐœ์„ ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ API

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ ์ถ”์ถœ๊ณผ ์ƒ‰์ธ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์•„ํ‚คํ…์ฒ˜๋งŒ ๊ธฐ์ˆ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์€ ์—ฌ๊ธฐ์„œ ๋๋‚˜์ง€ ์•Š๊ณ  ๊ฒ€์ƒ‰ ์งˆ์˜ ๋ฐ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๊ณผ์ •๊นŒ์ง€ ํฌํ•จํ•ด์•ผ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒ€์ƒ‰์—”์ง„(e.g., Opensearch)๋“ค์€ ์—”์ง„์— ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜๋ฉ๋‹ˆ๋‹ค.

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

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

๊ฒ€์ƒ‰์—”์ง„ ์ฟผ๋ฆฌ vs ์ถ”์ƒํ™”๋œ ๊ฒ€์ƒ‰ API

{
  "from": 0,
  "size": 10,
  "sort": [
    {
      "time": "desc"
    },
    "_score"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "์›ํ”ผ์Šค",
            "fields": [
              "index.text",
              "index.keyword"
            ],
            "operator": "and"
          }
        }
      ],
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "match": {
                      "category_id": "1"
                    }
                  },
                  {
                    "match": {
                      "category_id": "2"
                    }
                  }
                ],
                "minimum_should_match": 1
              }
            },
            {
                   "range" : {
                    "price": {
                            "gte": 1000,
                            "lt": 20000
                        }
                    }
            },
            {
              "match": {
                "id": "11111"
              }
            }
          ]
        }
      }
    }
  }
}

๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ โ€“ ๊นŠ์ด(depth)๊ฐ€ ๊นŠ๊ณ  ๋ณต์žก

{
    "from" : 0,
    "size" : 10,
    "query": "์›ํ”ผ์Šค",
    "filter" : {
        "category": {
            "id" : ["1", "2"]
        },
        "id" : "11111",
        "price" : {
            "min" : 1000,
            "max" : 20000
        }
    },
    "sort" : "time"
}

์ถ”์ƒํ™”๋œ ๊ฒ€์ƒ‰ API โ€“ ๊ฒ€์ƒ‰ API ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ถ”์ƒํ™”๋˜์–ด ์‚ฌ์šฉ์ž์˜ ํŽธ๋ฆฌ์„ฑ ์ฆ๋Œ€

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

๋ชจ๋‹ˆํ„ฐ๋ง

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

๊ฒ€์ƒ‰ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ

์ „์ฒด ์ƒ‰์ธ: MWAA๋Š” ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ ์„œ๋น„์Šค์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์— ์ด์ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, MWAA์˜ DAG ์Šคํฌ๋ฆฝํŠธ์— Slack์„ ์—ฐ๊ฒฐํ•ด ๋‘๋ฉด, ์ž‘์—…์ด ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ง€์ •ํ•œ ๋ฌธ๊ตฌ๋กœ ์•Œ๋ฆผ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ๋ถ„ ์ƒ‰์ธ: Lambda ํ•จ์ˆ˜์—์„œ๋„ Slack๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ ๋˜๋Š” ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ, ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง€์ •๋œ Slack์œผ๋กœ ์•Œ๋ฆผ์„ ์†ก์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Glue Job ์‹คํŒจ๋ฅผ ๊ฒฝ๊ณ ํ•˜๋Š” Slack ์•Œ๋ฆผ ๋ด‡

๊ฒ€์ƒ‰์—”์ง„ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ๋ฐ ๊ฒ€์ƒ‰ API

Datadog: Datadog์€ AWS ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค์˜ ์ƒํƒœ๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒ€์ƒ‰ ์งˆ์˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋“ค์–ด์˜ค๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •์„ ํ†ตํ•ด, ๋ฌธ์ œ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์ด์Šˆ ๋ฐœ์ƒ ์‹œ ๊ฐ์ง€ ๋ฐ ๋Œ€์‘์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์„ค์ •๋˜์–ด, Slack ๋ฉ”์‹ ์ €๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ธ์‹ํ•˜๊ณ  ์กฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ vs ์˜จํ”„๋ ˆ๋ฏธ์Šค

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

AWS ๊ธฐ๋ฐ˜์—์„œ์˜ ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ

์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ

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

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

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

Spring Batch

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

@Component
public class BatchScheduler {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job indexUserJob;

    // ๋งค์ผ ์ƒˆ๋ฒฝ 1์‹œ์— ์‹คํ–‰๋˜๋Š” ์Šค์ผ€์ค„๋ง ์„ค์ • (CRON ํ‘œํ˜„์‹)
    @Scheduled(cron = "0 0 1 * * ?")
    public void runBatchJob() throws Exception {
        JobParameters params = new JobParametersBuilder()
                .addLong("time", System.currentTimeMillis())
                .toJobParameters();
        
        jobLauncher.run(indexUserJob, params);
    }
}

cron ํ˜•์‹์œผ๋กœ ์Šค์ผ€์ค„๋ง์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

@Configuration
public class BatchConfig {

    @Bean
    public JdbcCursorItemReader<Product> reader(DataSource dataSource) {
        return new JdbcCursorItemReaderBuilder<Product>()
                .name("productItemReader")
                .dataSource(dataSource)
                .sql("SELECT id, name FROM products")
                .rowMapper((rs, rowNum) -> {
                    Product product = new Product();
                    product.setId(rs.getLong("id"));
                    product.setName(rs.getString("name"));
                    return product;
                })
                .build();
    }
}

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ƒํ’ˆ(Product) ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

public class ProductProcessor implements ItemProcessor<Product, Product> {

    @Override
    public Product process(Product product) throws Exception {
        // ์ถ”๊ฐ€์ ์ธ ํŒŒ์‹ฑ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์—ฌ๊ธฐ์— ์ž‘์„ฑ
        return product;
    }
}

๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

@Component
public class ElasticsearchItemWriter implements ItemWriter<Product> {

    @Autowired
    private RestHighLevelClient client;

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void write(List<? extends Product> items) throws Exception {
        for (Product product : items) {
            IndexRequest request = new IndexRequest("products_index")
                    .id(product.getId().toString())
                    .source(objectMapper.writeValueAsString(product), 
                            XContentType.JSON);

            client.index(request, RequestOptions.DEFAULT);
        }
    }
}

๋ณ€ํ™˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ elasticsearch์— ์ธ๋ฑ์‹ฑ ํ•ฉ๋‹ˆ๋‹ค.

@Configuration
@EnableBatchProcessing
public class BatchJobConfig {

    @Bean
    public Job indexProductJob(JobBuilderFactory jobs, Step step1) {
        return jobs.get("indexProductJob")
                .incrementer(new RunIdIncrementer())
                .flow(step1)
                .end()
                .build();
    }

    @Bean
    public Step step1(StepBuilderFactory stepBuilderFactory, 
                      JdbcCursorItemReader<Product> reader, 
                      ProductProcessor processor, 
                      ElasticsearchItemWriter writer) {
        return stepBuilderFactory.get("step1")
                .<Product, Product>chunk(10)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }
}

๋ฐฐ์น˜ ์ž‘์—…๊ณผ ์Šคํ…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์ •์˜ํ•œ ํด๋ž˜์Šค๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์ถ”์ถœ-๋ณ€ํ™˜-์ƒ‰์ธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

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

์˜จํ”„๋ ˆ๋ฏธ์Šค ๊ฒ€์ƒ‰์—”์ง„

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

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

๋งˆ๋ฌด๋ฆฌ

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

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

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

์ตœ์„ฑ์กฐ

์ตœ์„ฑ์กฐ

๋‰ด๋„ฅ์Šค AI๊ฒ€์ƒ‰ํŒ€์—์„œ Data Engineer๋กœ์„œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์—ญํ• ์€ ์ƒํ’ˆ ์ถ”์ฒœ์„ ์œ„ํ•œ ํ”ผ์ฒ˜ ์—”์ง€๋‹ˆ์–ด๋ง, ๊ด‘๊ณ  ์„ฑ๊ณผ ๋ฆฌํฌํŒ…์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์šด์˜, ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰ ์„œ๋น„์Šค์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค.

์‹ ๋ˆ„๋ฆฌ

์‹ ๋ˆ„๋ฆฌ

๋‰ด๋„ฅ์Šค์˜ AI๊ฒ€์ƒ‰ํŒ€์—์„œ ๊ฒ€์ƒ‰ ์—”์ง€๋‹ˆ์–ด๋กœ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์—…๋ฌด๋Š” ๋ธŒ๋žœ๋””, ํ•˜์ด๋ฒ„, ์„œ์šธ์Šคํ† ์–ด์˜ ๊ฒ€์ƒ‰ ์„œ๋น„์Šค๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๊ฒ€์ƒ‰ ์„œ๋น„์Šค์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋‰ด๋„ฅ์Šค์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์ธํ…”๋ฆฌ์ „์Šค์— ์ ํ•ฉํ•œ ๊ฒ€์ƒ‰ API๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ์ผ์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Jungseob Shin

Jungseob Shin

์‹ ์ •์„ญ Solutions Architect๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ Backend ์„œ๋ฒ„ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ Startup ๊ณ ๊ฐ์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋„๋ก AWS ์„œ๋น„์Šค์˜ ํšจ์œจ์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ฐ€์ด๋“œ์™€ ๊ธฐ์ˆ ์„ ์ง€์›ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์™€ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ์ˆ ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.