๐Ÿชช NAME

๐Ÿ™‹ SYNOPSIS

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

  • Long-running task management๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ MSA ์„ค๊ณ„, ๋ฐฐํฌ์— ๋Œ€ํ•ด์„œ ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•ด ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” AWS์˜ Serverless service, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” Redis์™€ Node.js๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Linux ์ธํ”„๋ผ๋ถ€ํ„ฐ ํด๋ผ์šฐ๋“œ ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ๊นŒ์ง€ ํญ๋„“์€ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฐฐํฌ์™€ ์„œ๋น„์Šค์˜ ์ทจ์ง€๋ฅผ ๊ณ ๋ คํ•ด front-, back-end์˜ ๊ฐœ๋ฐœ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๊ณ  ์„œ๋น„์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์—์„œ ์ง€ํ–ฅํ•˜๋Š” ๋ฐ”๊ฐ€ ๋šœ๋ ทํ•œ ํŽธ์ด๋ฉฐ, ์ด๋ฅผ ๊นŠ์ด ์‹ ๋ขฐํ•ด์ฃผ๋Š” ๋™๋ฃŒ๋“ค๊ณผ ํ•จ๊ป˜ ํ‰์•…ํ•˜์ง€๋งŒ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค.
  • ์ปดํ“จํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์ธ์œผ๋กœ์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ๋Œ€ํ•ด์„œ ์ฑ…์ž„๊ฐ์„ ๋А๋ผ๊ณ , ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž/๋น„๊ฐœ๋ฐœ์ž์™€์˜ ์˜์‚ฌ์†Œํ†ต์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๐ŸŒฎ Culture & Beliefs

โš–๏ธ Use of Design Principles

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

X-ray ์‹ํ’ˆ ๊ฒ€์‚ฌ ์‹œ์Šคํ…œ ์„ ์ „๋ฉด ์žฌ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๊ณ ์œ  ๊ทœ๊ฒฉ์„ ๊ฐ€์ง„ 3์ข…๋ฅ˜์˜ ํ•˜๋“œ์›จ์–ด์™€ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ ์€ ๊ฐœ๋ฐœ ์ธ๋ ฅ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์„ 1) ๊ฐ ์žฅ๋น„์— ๋ช…๋ น์„ ์ „๋‹ฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•œ Microservice์™€, ์ด๋“ค Microservice๋ฅผ ๋™์ž‘ ํ”„๋กœํŒŒ์ผ ๋‹จ์œ„๋กœ ์ถ”์ƒํ™”ํ•œ ํ•˜๋“œ์›จ์–ด ์Šคํƒ, 2) ๊ฒ€์‚ฌ ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ฒ€์‚ฌ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์œผ๋กœ ํฌ๊ฒŒ ๋‚˜๋ˆ„๊ณ  ๊ธฐ์ˆ  ์Šคํƒ์„ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์Šคํƒ์—์„œ๋Š” Stream interface์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ์— ๊ฐ•์ ์ด ์žˆ๋Š” Node.js๋ฅผ ์ด์šฉํ–ˆ์œผ๋ฉฐ, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ TypeScript type์„ Event Emitter์— ์ ์šฉํ•ด ํ•˜๋“œ์›จ์–ด ํ”„๋กœํ† ์ฝœ์„ ์ •๊ตํ•˜๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ์œผ๋ฉฐ, C++ SDK๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ์ง€ ํš๋“ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์—์„œ๋Š” ์ œ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ด๋ฏธ์ง€ ํš๋“๊ณผ ์ด๋ฌผ ๊ฒ€์‚ฌ ๊ณผ์ •์„ Postgre SQL์— ์ ์žฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Schema ์„ค๊ณ„์— ์ฐธ์—ฌํ–ˆ์œผ๋ฉฐ, ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ S3 compatible storage๋ฅผ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๋•์— ๊ฐœ๋ฐœ ์–‘์— ๋น„ํ•ด ์ธ๋ ฅ๊ณผ ์‹œ๊ฐ„์ด ๋งค์šฐ ๋ถ€์กฑํ•œ ์ƒํ™ฉ์—์„œ ์‹ค๋ฌผ ์žฅ๋น„๋ฅผ ์ด์šฉํ•œ ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

Worker ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์–‘ํ–ˆ๋˜ ์ด์œ ๋Š” ์ถ”๋ก  ๊ฐ€์†์„ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ Tensor RT framework์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•จ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Main thread์—์„œ๋Š” Redis stream ๋˜๋Š” mmap ์— ์ ์žฌ๋œ ๋ฉ”์‹œ์ง€๋ฅผ polling ํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ–ˆ์œผ๋ฉฐ, ํˆฌ์ž…ํ•œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์— ๋น„๋ก€ํ•ด Worker ๊ฐœ์ˆ˜๋งŒํผ ์„ ํ˜•์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒํ•จ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. Stateless๋ฅผ ์ง€ํ–ฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:

  • ์นด๋ฉ”๋ผ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ์‹ค์‹œ๊ฐ„๊ณผ request/response ์„œ๋น„์Šค ๋ชจ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฐ์—…์šฉ ์นด๋ฉ”๋ผ๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ํš๋“ ์„œ๋น„์Šค๋Š” 60 FPS ์ด์ƒ, AI ๋ชจ๋“ˆ์€ ์•ฝ 5 FPS์œผ๋กœ ๊ตฌ๋™๋˜๋Š” ์ƒํƒœ์—์„œ, ๊ณ ๊ฐ์‚ฌ๊ฐ€ ์›ํ•  ๋•Œ ์ถ”๋ก  ๊ฒฐ๊ณผ๋ฅผ ์•ฝ 1 FPS๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” 40๊ฐœ์˜ GPU worker๋ฅผ ์ด์šฉํ•ด 300 RPS๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์ •ํ™•๋„ ํ™•๋ณด๋ฅผ ์ตœ์šฐ์„  ๊ณผ์ œ๋กœ ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹ ๋‹ด๋‹น ํŒ€์›๊ณผ์˜ ํ˜‘๋ ฅ์—๋„ ๊ฐ•์ ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

๐ŸŽจ Creativity

์•ž์„œ ์„ค์ •ํ•œ ์„ค๊ณ„ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋…์ฐฝ์ ์ธ ๊ตฌํ˜„์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ œ๊ฐ€ ์ผํ–ˆ๋˜ ํŒ€์€ ์‹ค๋ ฅ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋‚˜ ์ธ์›์ด ์†Œ์ˆ˜์ธ ํƒ“์—, ์ฝ”๋“œ ์–‘์ด ๋งŽ๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณต์žกํ•˜๋‹ค๋ฉด ํ‘œ์ค€์ ์ธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ „์ฒด ์‹œ์Šคํ…œ์ด ์˜ˆ์ƒ ๋ฐ–์˜ ๋™์ž‘์„ ํ•˜์ง€ ์•Š๋„๋ก ์ธํ”„๋ผ์˜ ์ œ์•ฝ ์‚ฌํ•ญ, ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ Web API์™€ Linux system call๊นŒ์ง€ ๊ณ ๋ คํ•ด ๊ฐ ๋ชจ๋“ˆ์˜ ์—ญํ• ์„ ์ด์ƒ์ ์œผ๋กœ ์ง€์ •ํ•ด ๋ด…๋‹ˆ๋‹ค. (์ถ”ํ›„ ํƒ€ํ˜‘๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค.) ์ด๋•Œ ๋‹ค์–‘ํ•œ ์ด์œ ์—์„œ ๊ฒ€ํ† , ์‹คํ—˜, ์ฆ๋ช…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ณ„๋„๋กœ ๊ตฌ์ถ•ํ•ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ repl.it , CodePen , StackBlitz , TypeScript Playground , Google CoLab๊ณผ ๊ฐ™์€ Browser IDE ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์„ ์ด์šฉํ•ด ์‹คํ—˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์„ ๋†’์ด๊ณ  ์‹คํ—˜ ๊ฒฐ๊ณผ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹ ๊ฒฝ ์ผ์Šต๋‹ˆ๋‹ค.

๋ฒˆํ˜ธํŒ์„ ์ธ์‹ํ•˜๋Š” HTTP API๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์—์„œ๋Š” Web application server ์—†์ด Nginx + Redis๋งŒ์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„๋Š” ๊ต๊ณผ์„œ์ ์ธ Fan-out ํŒจํ„ด์ด์—ˆ์ง€๋งŒ, Python ๋ฒˆํ˜ธํŒ ์ธ์‹ ์ปจํ…Œ์ด๋„ˆ์—์„œ Fast API ๋“ฑ์˜ ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Nginx์—์„œ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์†๋„์™€ ์•ˆ์ •์„ฑ์„ ๋Œ์–ด์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€์ ์ธ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Nginx์—์„œ HTTP ๊ด€๋ จ ๋กœ์ง์ด ์ž‘๋™ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ OpenResty ์˜ Lua scripting์„ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ฝ”๋“œ์˜ ๋…ํ•ด๊ฐ€ ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Node.js๋ฅผ ์ด์šฉํ•ด ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ 100%์— ๊ฐ€๊นŒ์šด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์—†๋Š” ์„ค๊ณ„๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํŒ€์›๋“ค์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๊ณผ๋‹คํ•˜๊ฒŒ ์ฐฝ์˜์ ์ด์ง€ ์•Š๋„๋ก ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฐฐ๊ฒฝ์„ ๋ฌธ์„œ๋กœ ์ž‘์„ฑํ•ด ํŒ€์›๋“ค๊ณผ ํ•ฉ์˜๋ฅผ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿซ‚ Relational

Illustration by Scott Garrett

Illustration by Scott Garrett Source

์ €๋Š” ๊ฐœ์„ฑ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ชจ์ธ ๊ฐœ๋ฐœ ์กฐ์ง์—์„œ ์ผํ•ด์™”๊ณ  ์•ž์œผ๋กœ๋„ ๊ทธ๋Ÿฌํ•œ ์กฐ์ง์—์„œ ์ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจํ˜ธํ•œ ๋ฌธ์ œ๋ฅผ ๋งž๋‹ฅ๋œจ๋ ธ์„ ๋•Œ, ๋‹ค์–‘ํ•œ ํฌ๋ง๊ณผ ์šฐ๋ ค๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๋…ผ์˜๋˜๊ณ , ์ด๊ฒƒ์ด ์„ค๊ณ„์™€ ๊ฐœ๋ฐœ์— ๋ฐ˜์˜๋˜๋Š” ๊ณผ์ •์—์„œ ์ฆ๊ฑฐ์›€์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์„ธ์ƒ ์ „๋ฐ˜์— ๊ด€์‹ฌ์ด ๋งŽ๊ณ  ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ์ง์ ‘์„ ๊ฐ€์ง€๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ฐœ๋ฐœ ์—…๋ฌด๋„ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ œ๊ฐ€ ์ข‹์•„ํ•˜๊ณ  ์ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด๋ผ๊ณ  ํ™•์‹ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์„ ์„ ์ œ์ ์œผ๋กœ ํŒ€์— ์ œ๊ธฐํ•˜๊ณ , ๊ธฐ์ˆ  ์Šคํƒ๊ณผ AWS API๋“ค์„ ์ถ”์ฒœํ•ด ์ฃผ๋ฉด์„œ ํŒ€์›๋“ค์˜ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•˜๋Š” ์—…๋ฌด๋ฅผ ํ•ด์™”์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Linux OS์™€ C++์— ๋Œ€ํ•œ ์ง€์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€, AWS Lambda, ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ ๋“ฑ ํŠน์ˆ˜ํ•œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ Troubleshooter ์—ญํ• ์„ ํ–ˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿฑ Tech Lunchbox

๐Ÿ—๏ธ Architecture: Docker Compose, Nginx, Redis

  • OCI Specification, Docker API์™€ 1:1 ๋Œ€์‘์ด ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ๋ฉด์—์„œ Docker Compose๋ฅผ ๊ฐœ๋ฐœ, ๋ฐฐํฌ์— ๋ชจ๋‘ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • MSA์—์„œ ๊ฐ ์„œ๋น„์Šค์˜ ์˜์กด์„ฑ์„ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค๋ณ„ env/envfile๊ณผ volume, network ์„น์…˜์„ ์ฃผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์œ ์‹ฌํžˆ ์ฝ”๋“œ ๋ฆฌ๋ทฐํ•ฉ๋‹ˆ๋‹ค.
  • Nginx๋Š” ํ”„๋กœ์ ํŠธ ์™ธ๋ถ€์™€์˜ Gateway๋กœ์„œ, Redis๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์˜ Message broker๋กœ์„œ ํ™œ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค.
    • Nginx reverse proxy rule์„ ์ž‘์„ฑํ•˜๊ณ  Nginx push stream module ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ Nginx module์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Redis์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๋‚ด์žฅ ์ž๋ฃŒํ˜•์„ ์ ์žฌ์ ์†Œ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ปจํ…Œ์ด๋„ˆ๋ณ„ ์—ฐ๋™ ๋ฐฉ์‹์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒฉ๏ธ Serverless AWS

  • Python, Node.js ์–ธ์–ด๋กœ Lambda function์„ Production์—์„œ ๊พธ์ค€ํžˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
    • Container ํ˜•ํƒœ์˜ Lambda ๋กœ AI inference๋ฅผ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • SNS, SQS, EventsBridge ๋“ฑ์˜ AWS ์„œ๋น„์Šค๋“ค๋กœ Lambda์˜ Trigger/destination์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Step Functions๋กœ AWS ์„œ๋น„์Šค๋“ค์„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋”ฐ๋ผ์„œ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Step Functions์™€ API Gateway๋ฅผ ์—ฐ๋™ํ•ด ์ฝ”๋”ฉ ์—†์ด Microservice๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TypeScript AWS CDK๋กœ ๋ธŒ๋žœ์น˜๋ณ„๋กœ Serverless CI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸคŸ Languages: JavaScript, Python, Shell, C++โ€ฆ

  • Node.js ๋ฅผ ์ด์šฉํ•ด ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ด๊ด„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.
    • JavaScript์˜ ๋›ฐ์–ด๋‚œ ์œ ์—ฐ์„ฑ๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์—ญํ• ์„ ์ฃผ๋กœ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜๊ธฐ๋ณด๋‹ค๋Š” Frontend-, server-side์— ๊ด€๊ณ„ ์—†์ด JavaScript ๊ธฐ๋ณธ๊ธฐ์— ์ถฉ์‹คํ•œ Full stack ๊ฐœ๋ฐœ์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ์ œ๊ฐ€ ๊ฐ€์žฅ ์ „๋ฌธ์ ์ธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
  • Python ์€ ์ฃผ๋กœ AI์™€ ๊ด€๋ จ๋œ ์ž‘์—…์— ๋Œ€ํ•ด์„œ ๋ช…ํ™•ํ•œ ์—ญํ• ์„ ๋ฐฐ์ •ํ•ด์™”์Šต๋‹ˆ๋‹ค.
    • MSA ๊ตฌ์กฐ ์†์—์„œ ์ฃผ์–ด์ง„ ์—ญํ• ์„ ์ •ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๋Š”, ๋„ˆ๋ฌด ํฌ์ง€ ์•Š์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, Python ๊ฐœ๋ฐœ์ž์™€ ๊ฐ€์žฅ ๋งŽ์ด ํ˜‘์—…ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์€ ์ถฉ์‹คํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด๋‚˜, Python ๊ณ ์œ ์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ฆฌ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • Shell script ์™€ Makefile ์„ ์ด์šฉํ•ด Linux OS์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  DevOps ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์“ฐ์ด๋Š” ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด ์ˆ˜์ค€์œผ๋กœ Shell script์— ๋Šฅ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ Linux system call, Child process์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ Shell script ๋ฅผ ์ค‘์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • Dependency๊ฐ€ ๋ณต์žกํ•  ๊ฒฝ์šฐ๋‚˜, ๋‹ค์–‘ํ•œ ์–ธ์–ด๊ฐ€ ์“ฐ์ด๋Š” MSA ๊ตฌ์กฐ์—์„œ ํŠน์ • ์–ธ์–ด์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ Makefile ์„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜๋“œ์›จ์–ด ์—ฐ๋™ ๊ด€๋ จํ•ด์„œ C++ ๋ฅผ ์ด์šฉํ•ด ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‚ฐ์—…์šฉ ์นด๋ฉ”๋ผ, X-ray detector ๋“ฑ์„ C++ SDK๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•˜๊ณ  Linux IPC๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ Microservice์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • Modern C++ ๋ฌธ๋ฒ•๊ณผ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์„ ์ง€ํ–ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงช Projects