๐ŸŽฏ ์›น ๊ธฐ๋ฐ˜ ๋ฌธ์„œ ํŽธ์ง‘๊ธฐ ์ œ์ž‘ ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“— Today I Learned

์ „์ฒด ๊ตฌ์„ฑ ๊ฐœ์š”

  • Frontend

    • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์ œ๊ณตํ•˜๋Š” React ์•ฑ์ž…๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” JavaScript๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ API๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

    • https://notes.prgms-fullcycle.com/api


  • Backend

    • Express ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ Node.js ๊ธฐ๋ฐ˜ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

    • JWT (JSON Web Token)๋ฅผ ์ด์šฉํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.

    • CORS (Cross-Origin Resource Sharing) ์ •์ฑ…์„ ํ†ตํ•ด ์•…์˜์ ์ธ ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

    • notes.prgms-fullcycle.com:3306


  • Database

    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„ : prgms_notes

    • ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. (์ƒ์„ธ ์Šคํ‚ค๋งˆ๋Š” ํ›„์† ์ •๋ฆฌ ์˜ˆ์ •)




์„œ๋น„์Šค ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜


AWS EC2 ์ธ์Šคํ„ด์Šค ์œ„์— Minikube๋กœ ๊ตฌ์„ฑ๋œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์˜ฌ๋ฆฌ๊ณ , ๊ฑฐ๊ธฐ์— FE(Frontend), BE(Backend), DB๋ฅผ ๊ฐ๊ฐ Pod๋กœ ๋ฐฐํฌํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์‚ฌ์šฉ์ž(Web Browser)๋Š” Nginx Reverse Proxy๋ฅผ ํ†ตํ•ด FE์™€ BE์— ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Web Browser

  • ์‚ฌ์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

  • https://notes.prgms-fullcycle.com

  • ํฌํŠธ๋Š” HTTPS(443) ๋˜๋Š” HTTP(80)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


Nginx Web Server (Reverse Proxy)

  • EC2 ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์— ์œ„์น˜ํ•œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(Reverse Proxy) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

  • ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๊ฒฝ๋กœ(/, /api)์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•ด์„œ ๋‚ด๋ถ€ ์„œ๋น„์Šค(FE/BE)๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” Reverse Proxy๋Š” ๋ญ˜๊นŒ?

ํด๋ผ์ด์–ธํŠธ(์‚ฌ์šฉ์ž)์™€ ์„œ๋ฒ„(์‹ค์ œ ์„œ๋น„์Šค) ์‚ฌ์ด์—์„œ ์ค‘๊ฐ„์—์„œ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ ์ ˆํ•œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์ค‘๊ฐ„ ๊ด€๋ฆฌ์ž ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

notes.prgms-fullcycle.com์— ์ ‘์†ํ–ˆ์ง€๋งŒ, ์‚ฌ์ดํŠธ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค(FE, BE)๋กœ ๋‚˜๋‰˜์–ด์žˆ๊ณ  ํฌํŠธ๋„ ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ ๊ฒฝ๋กœ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์•Œ๋งž์€ ์„œ๋น„์Šค๋กœ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” Reverse Proxy๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • / ๊ฒฝ๋กœ ์š”์ฒญ โ†’ localhost:30030 โ†’ FE ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ
  • /api ์š”์ฒญ โ†’ localhost:30031 โ†’ BE ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ

๐Ÿ”™ ์™œ Reverse(์—ญ๋ฐฉํ–ฅ) Proxy์ผ๊นŒ?

์ „ํ†ต์ ์ธ Proxy๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์ด ์ค‘์‹ฌ์ด์—ˆ๋‹ค๋ฉด, Reverse Proxy๋Š” ์„œ๋ฒ„๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ๋Œ€์‹  ์‘๋‹ตํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์š”์ฒญ ์ฃผ์ œ๊ฐ€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ญ๋ฐฉํ–ฅ ํ”„๋ก์‹œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Proxy (์ •๋ฐฉํ–ฅ ํ”„๋ก์‹œ)

  • Reverse Proxy (์—ญ๋ฐฉํ–ฅ ํ”„๋ก์‹œ)
    ์ถœ์ฒ˜: cloudflare

Minikube k8s Cluster

  • EC2 ์ธ์Šคํ„ด์Šค ์•ˆ์— Minikube ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋„์šฐ๊ณ , ๊ทธ ์•ˆ์— FE, BE, DB ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„œ๋น„์Šค๋ฉ๋‹ˆ๋‹ค.

    • Frontend

      • ๋‚ด๋ถ€ ํฌํŠธ : 3000

      • ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋œ NodePort : 30030

      • Nginx โ†’ 30030์œผ๋กœ ์š”์ฒญ์„ ํฌ์›Œ๋”ฉ

    • Backend

      • ๋‚ด๋ถ€ ํฌํŠธ: 3031

      • ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋œ NodePort : 30031

      • Nginx โ†’ 30031์œผ๋กœ ์š”์ฒญ์„ ํฌ์›Œ๋”ฉ

    • Database (MariaDB)

      • ํฌํŠธ : 3306 (MariaDB ๊ธฐ๋ณธ ํฌํŠธ)

      • FE/BE๊ฐ€ ์ง์ ‘ DB์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด๋ถ€์—์„œ ์—ฐ๊ฒฐ




๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋‹จ๊ณ„๋ณ„ ๊ตฌ์„ฑ


๋‹จ๊ณ„ (ํ™˜๊ฒฝ)๋‚ด์šฉ
Dev (-)์ฝ”๋“œ ๊ฐœ๋ฐœ
๋‹จ์œ„ ํ…Œ์ŠคํŠธ
FE/BE ๊ฐœ๋ฐœ ํ…Œ์ŠคํŠธ
์ˆ˜๋™ ์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ
Dev docker (Docker)BE๋ถ€ํ„ฐ dockerize
docker compose
๋นŒ๋“œ๋œ ์ฝ”๋“œ ์ด์šฉ
์ปจํ…Œ์ด๋„ˆ ํ…Œ์ŠคํŠธ
Test (Local k8s)kubectl + yaml
ํด๋Ÿฌ์Šคํ„ฐ ์šด์šฉ ํ…Œ์ŠคํŠธ
Stage (AWS)Acceptance Test
ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ ํ›„ ํŒŒ๊ดด
Prod (AWS)Smoke Test
์„œ๋น„์Šค ์ œ๊ณต



๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ์šด์šฉ

  • ๋น ๋ฅด๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ฝ”๋“œ ์ˆ˜์ •์ด ์žฆ์€ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๋ˆˆ์œผ๋กœ ๋ฐ”๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

  • TDD๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด?

    • ํšจ์œจ์€ ๋†’์ง€๋งŒ, ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ๋งŽ์„ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

    • ํŠนํžˆ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ž๋™ํ™”์— ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. โ†’ UI๋‚˜ ๋ณ€๊ฒฝ์ด ๋งŽ์€ ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ๋กœ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.




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

  • DBMS : MariaDB v11.2.2

  • ๋ฐฐํฌ ์œ„์น˜ : ๋กœ์ปฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ

  • ์ดˆ๊ธฐ ์ƒํƒœ : ์Šคํ‚ค๋งˆ์™€ ํ…Œ์ŠคํŠธ์šฉ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์„ธํŒ… ์˜ˆ์ •

  • ์Šคํ† ๋ฆฌ์ง€ ๋ฐฉ์‹ : HostPath ๋ณผ๋ฅจ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณด์กด




โœ๏ธ ํšŒ๊ณ 

๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์—ผ๋‘์— ๋‘๊ธฐ๋ณด๋‹ค, ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๊ธธ์ด๋ผ๋Š” ๊ฒƒ์„ ๋А๊ผˆ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€