์šฐ๋ฆฌ ์›น์„œ๋น„์Šค๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋ ๊นŒ? (Frontend ๊ฐ€ ๋ณด๋Š” ์ธํ”„๋ผ)

ALB, Ingress, Node.js, Kubernetes ๊ตฌ์กฐ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

์ตœ๊ทผ ์ž…์‚ฌํ•˜์‹  ๋™๋ฃŒ๋ถ„์˜ ์งˆ๋ฌธ์— ์„ž์—ฌ์žˆ๋Š” "ALB", "Ingress", "ECR", "Kubernetes" ๊ฐ™์€ ๋‹จ์–ด๋“ค์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ซ๊ณ  ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์›น ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„๋‹ฌํ•˜๋Š” ํ๋ฆ„์„ ์ดํ•ดํ•˜๋ฉด ์ด ๋‹จ์–ด๋“ค์˜ ์˜๋ฏธ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.


์ด ๊ธ€์€ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐฐํฌ๋˜๊ณ  ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌ๋˜๋Š”์ง€ ์ „์ฒด ํ๋ฆ„์„ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.


์ „์ฒด ํ๋ฆ„ ์š”์•ฝ

ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋Š” Docker๋กœ ๋นŒ๋“œ๋˜์–ด AWS์˜ Kubernetes์— ๋ฐฐํฌ๋˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ALB → Ingress → Node.js ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ ์„œ๋น„์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

 

์‚ฌ์šฉ์ž → ์„œ๋ฒ„๊นŒ์ง€ ์š”์ฒญ ํ๋ฆ„

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

 

1. ALB๋ฅผ ์ง€๋‚˜ Kubernetes๋กœ ์ง„์ž…

  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ ๋จผ์ € AWS ALB (Application Load Balancer) ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ALB๋Š” ๋„๋ฉ”์ธ ๋ฐ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ผ์šฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, HTTPS ์ธ์ฆ์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์ˆ˜์˜ ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐ์‹œํ‚ค๊ณ , ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

 

2. Ingress (Kubernetes ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ)

์„œ๋น„์Šค๊ฐ€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ์šด์˜๋œ๋‹ค๋ฉด, ALB๋Š” ์™ธ๋ถ€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ด€๋ฌธ ์—ญํ• ์„ ํ•˜๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—๋Š” ๋˜ ๋‹ค๋ฅธ ๋ผ์šฐํ„ฐ์ธ Ingress๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • Ingress๋Š” Kubernetes ๋‚ด๋ถ€์—์„œ ์š”์ฒญ์„ ์–ด๋–ค ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • /api ์š”์ฒญ์€ backend-service๋กœ, / ์š”์ฒญ์€ frontend-service๋กœ ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค. 

ALB์™€ Ingress๋Š” ๋ชจ๋‘ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„๊ธฐํ•˜๋Š” ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ALB๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€, Ingress๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋ฉฐ ์—ญํ• ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ALB๋Š” Kubernetes ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Ingress์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

3. Node.js ์„œ๋ฒ„

  • Ingress๊ฐ€ / ์š”์ฒญ์„ frontend-service๋กœ ์ „๋‹ฌํ•˜๋ฉด, ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ๋ฐฐํฌ๋œ Pod(์‹คํ–‰ ๋‹จ์œ„) ์ค‘ ํ•˜๋‚˜์ธ Node.js ์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ๋œ Pod ์€ Github Actions๋ฅผ ํ†ตํ•ด ์ž๋™ ๋นŒ๋“œ๋˜๋Š” Docker ์ด๋ฏธ์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์–ด์ง€๋Š” ์งˆ๋ฌธ๋“ค

๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ํ๋ฆ„

์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. GitHub์— ์ฝ”๋“œ Push
  2. GitHub Actions ์‹คํ–‰
    1. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
    2. AWS ECR์— ์ด๋ฏธ์ง€ ์ €์žฅ
  3. Kubernetes์— ๋ฐฐํฌ
  4. ์ƒˆ๋กœ์šด Node.js ์„œ๋ฒ„ Pod๊ฐ€ ์‹คํ–‰๋จ

 

์ •์  ํŒŒ์ผ ์„œ๋น™๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด?

1. Nginx

  • Nginx๋Š” ์ „ํ†ต์ ์œผ๋กœ ์ •์  ํŒŒ์ผ ์„œ๋น™๊ณผ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์—ญํ• ์— ํŠนํ™”๋œ ์›น ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
  • ์ •์  ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜๋ฉฐ, ์š”์ฒญ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„œ๋ฒ„(์˜ˆ: Node.js)๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŽ์€ ์„œ๋น„์Šค์—์„œ Node.js ์•ž๋‹จ์— Nginx๋ฅผ ๋‘์–ด
    • ์ •์  ์ž์‚ฐ์€ Nginx๊ฐ€ ์ง์ ‘ ์„œ๋น™ํ•˜๊ณ ,
    • API ์š”์ฒญ ๋“ฑ ๋™์  ์ฒ˜๋ฆฌ๋Š” Node.js๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Node.js ์„œ๋ฒ„๊ฐ€ ์ง์ ‘ SSR๊ณผ ์ •์  ํŒŒ์ผ ์„œ๋น™๊นŒ์ง€ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด, Nginx๋ฅผ ๋ณ„๋„๋กœ ๋‘์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. S3 + CloudFront

  • S3๋Š” AWS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ €๋ ดํ•˜๊ณ  ์•ˆ์ •์ ์ธ ํŒŒ์ผ ์ €์žฅ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
    • ๋นŒ๋“œ๋œ ํ”„๋ก ํŠธ์—”๋“œ ์ •์  ํŒŒ์ผ(HTML, JS, CSS, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • CloudFront๋Š” AWS์˜ ๊ธ€๋กœ๋ฒŒ CDN(์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ) ์„œ๋น„์Šค๋กœ,
    • S3์— ์ €์žฅ๋œ ์ •์  ํŒŒ์ผ์„ ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ๋œ ์—ฃ์ง€ ์„œ๋ฒ„์— ์บ์‹ฑํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์กฐํ•ฉ์€ ์„œ๋ฒ„ ์šด์˜ ๋ถ€๋‹ด ์—†์ด, ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ์ •์  ํŒŒ์ผ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ๋ณดํ†ต SPA(Single Page Application)๋‚˜ ์ •์  ์‚ฌ์ดํŠธ์— ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐฉ์‹ ์žฅ์  ๋‹จ์  ํ™œ์šฉ ์˜ˆ์‹œ
Nginx + Node.js ์ •์  ํŒŒ์ผ๊ณผ API ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ.
์œ ์—ฐํ•œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •
์„œ๋ฒ„ ์šด์˜๊ณผ ๊ด€๋ฆฌ ํ•„์š” SSR ์•ฑ + ์ •์  ํŒŒ์ผ ๋น ๋ฅธ ์„œ๋น™์ด ํ•„์š”ํ•  ๋•Œ
Node.js ๋‹จ๋… ์„œ๋ฒ„ ๊ตฌ์กฐ ๋‹จ์ˆœํ™”, SSR๊ณผ ์ •์  ํŒŒ์ผ ๋ชจ๋‘ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ๊ณ ๋ถ€ํ•˜ ์‹œ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ๋ถ€๋‹ด ๊ฐ€๋Šฅ SSR ์ค‘์‹ฌ ์•ฑ, ๋‹จ์ผ ์„œ๋ฒ„๋กœ ๊ฐ„๋‹จํžˆ ์šด์˜ํ•  ๋•Œ
S3 + CloudFront ๋น„์šฉ ํšจ์œจ์ , ๊ธ€๋กœ๋ฒŒ CDN์œผ๋กœ ๋น ๋ฅธ ์‘๋‹ต
์„œ๋ฒ„๋ฆฌ์Šค ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ ์šฉ์ด
SSR ๋ถˆ๊ฐ€, ์ •์  ํŒŒ์ผ๋งŒ ์„œ๋น™ ๊ฐ€๋Šฅ ์ •์  SPA, ๋ธ”๋กœ๊ทธ, ๋งˆ์ผ€ํŒ… ์‚ฌ์ดํŠธ ๋“ฑ

 

์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ ์ •๋ฆฌ

ALB ์™ธ๋ถ€ ์š”์ฒญ์˜ ๊ด€๋ฌธ. HTTPS ์ฒ˜๋ฆฌ ๋ฐ ์„œ๋น„์Šค ๋ผ์šฐํŒ…
Ingress Kubernetes ๋‚ด๋ถ€ ์š”์ฒญ ๋ผ์šฐํŒ… ๋‹ด๋‹น
Pod (Frontend ๊ด€์ ์—์„œ) Docker ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰๋˜๋Š” Node.js ์„œ๋ฒ„
Node.js SSR ๋ Œ๋”๋ง ๋˜๋Š” HTML/JS ์‘๋‹ต ์ƒ์„ฑ
GitHub Actions CI/CD ์ž๋™ํ™” ๋„๊ตฌ
ECR AWS Docker ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ
Docker Node.js ์•ฑ์„ ํŒจํ‚ค์ง•ํ•˜์—ฌ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“œ๋Š” ๋„๊ตฌ
 

๋งˆ์น˜๋ฉฐ

์ด ๊ธ€์€ ์ธํ”„๋ผ ์ง€์‹์ด ๋งŽ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๊ฐœ๋…์„ ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•˜๋ฉฐ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์ œ๋ณด์ฃผ์„ธ์š”!

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 
๋ฐ˜์‘ํ˜•