๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
4. Backend & DB ๐Ÿ—„๏ธ

[BE] ๋ฐฑ์—”๋“œ ๊ธฐ์ดˆ ์ดํ•ดํ•˜๊ธฐ : ์›น ์„œ๋ฒ„, WAS, HTTP ํŒจํ‚ท, API, JSON,

by lxvxxu 2026. 1. 14.


์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์ดํ•ด๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์ดํ•ด๋Š” ๋ถˆ๊ฐ€ํ”ผํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ €๋Š” ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•ด ์ผ์ • ์ˆ˜์ค€ ์ด์ƒ์„ ์ธ์ง€ํ•˜๊ณ , ์ง์ ‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์Œ“์œผ๋ ค๊ณ  ํ•ด์š”.


 

https://youtu.be/M8E6vYAIuzQ?si=AAmfg5_vHCYVwPmu

 

๋ฐฑ์—”๋“œ์˜ ํ•ต์‹ฌ : ์œ ์ €์—๊ฒŒ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ „๋‹ฌํ•  ๊ฒƒ์ธ๊ฐ€

 

๋ฐฑ์—”๋“œ์˜ 3์š”์†Œ

1. ์›น ์„œ๋ฒ„

์ดˆ๊ธฐ ์›น ์„œ๋ฒ„๋Š” ํŠน์ • ์ปดํ“จํ„ฐ์— ์„ค์น˜๋˜์–ด ์–ด๋–ค ํŒŒ์ผ์„ ๋ณด์—ฌ๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ด ์˜ค๋ฉด ํ•ด๋‹น ํŒŒ์ผ์„ ๊ทธ๋‚ด๋กœ ๋ณด๋‚ด์คฌ์Œ.

์‚ฌ์šฉ์ž์™€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ์ •์ (Static) ์›น์ธ ๊ฒƒ.

๋Œ€ํ‘œ์ ์œผ๋กœ nginx, Apache, Microsoft์˜ IIS, Caddy๊ฐ€ ์žˆ๋‹ค.

์ด๋“ค์€ ์ •์  ํŒŒ์ผ์„ ์ œ๊ณต.

 

2. WAS

์›น์ด ๋Œ€์ค‘ํ™”๋˜๋ฉด์„œ ๋ฐฉ๋ฌธ์ž ์ˆ˜, ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์ •๋ณด, ๋ฐฉ๋ช…๋ก ๋“ฑ์„ ์›ํ•˜๊ธธ ๋ฐ”๋žŒ.

์š”์ฒญ์— ๋”ฐ๋ผ ์‹ค์‹œ๊ฐ„์œผ๋กœ HTML ์ƒ์„ฑ ๋ถˆ๊ฐ€.

๋™์ ์ธ(Dynamic) ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒ.

์ƒˆ๋กœ์šด HTML์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ.

ํŠน์ • ์š”์ฒญ -> ๋ฏธ๋ฆฌ ์•ฝ์†๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ -> ๊ฒฐ๊ณผ๋ฌผ์„ ์œ ์ €์—๊ฒŒ ์ „๋‹ฌ

์ฆ‰, ์š”์ฒญ์— ๋”ฐ๋ผ ์ฝ”๋“œ(ํ”„๋กœ๊ทธ๋žจ)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—”์ง„์ด WAS์˜ ์›ํ˜•!

์„œ๋ฒ„ : ๋‹จ์ˆœํ•œ ํŒŒ์ผ ์ „๋‹ฌ -> ์ƒ๊ฐ&์—ฐ์‚ฐ&๋กœ์ง ์ฒ˜๋ฆฌ (์ง„์ •ํ•œ ๋ฐฑ์—”๋“œ์˜ ์‹œ์ž‘)\

์›น ์„œ๋ฒ„ : ์ •์ ์ธ ํŒŒ์ผ ๋ฐ˜ํ™˜, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ : ์ธ์ž์— ๋”ฐ๋ผ ๋™์ ์ธ ํŽ˜์ด์ง€ ๋ฐ˜ํ™˜

WAS : ์ž๋™์ฐจ๊ฐ€ ์‹ค์ œ๋กœ ์›€์ง์ด๊ฒŒ ํ•˜๋Š” ์—”์ง„ != BE Framework : ์ž๋™์ฐจ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ •๊ตํ•œ ์„ค๊ณ„๋„์™€ ๋ถ€ํ’ˆ ์„ธํŠธ.

๊ฐœ๋ฐœ์ž๊ฐ€ BE Framework๋ฅผ ์ด์šฉํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ํ™˜๊ฒฝ ๊ทธ ์ž์ฒด

WAS ์—†์ด BE Framework๋Š” ๋™์ž‘ ๋ถˆ๊ฐ€๋Šฅ.

 

3. DB

 

 

 



๐Ÿ”
 HTTP ํŒจํ‚ท

HTTP ํŒจํ‚ท์€ ์šฐ๋ฆฌ๊ฐ€ ์ธํ„ฐ๋„ท์—์„œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” **'๋ฐ์ดํ„ฐ ๋ฐฐ๋‹ฌ ์ƒ์ž'**๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.
์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์— ๋”ฐ๋ผ '๋ฉ”์‹œ์ง€', '์„ธ๊ทธ๋จผํŠธ', 'ํŒจํ‚ท' ๋“ฑ์œผ๋กœ ์šฉ์–ด๊ฐ€ ๋‚˜๋‰˜์ง€๋งŒ, ๋ณดํ†ต ์›น ๊ฐœ๋ฐœ ๋งฅ๋ฝ์—์„œ HTTP ํŒจํ‚ท์ด๋ผ๊ณ  ํ•˜๋ฉด **HTTP ์š”์ฒญ(Request)**๊ณผ **์‘๋‹ต(Response)**์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

1. HTTP ํŒจํ‚ท์˜ ๊ตฌ์กฐ

์ด ๋ฐฐ๋‹ฌ ์ƒ์ž๋Š” ํฌ๊ฒŒ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  ์‹œ์ž‘ ์ค„ (Start Line)

์ƒ์ž์˜ ๋งจ ์œ—๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ์ƒ์ž๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋ ค๋Š” ๊ฑด์ง€ ์ •์ฒด๋ฅผ ๋ฐํž™๋‹ˆ๋‹ค.
  • ์š”์ฒญ ์‹œ: "์–ด๋–ค ๋ฐฉ์‹(GET/POST)์œผ๋กœ, ์–ด๋–ค ์ฃผ์†Œ(/index.html)์— ๋ณด๋‚ธ๋‹ค"๋ผ๋Š” ์ •๋ณด๊ฐ€ ๋‹ด๊น๋‹ˆ๋‹ค.
  • ์‘๋‹ต ์‹œ: "์„ฑ๊ณต(200 OK)ํ–ˆ๋‹ค" ํ˜น์€ "์ฐพ์„ ์ˆ˜ ์—†๋‹ค(404 Not Found)" ๊ฐ™์€ ๊ฒฐ๊ณผ ์ƒํƒœ๊ฐ€ ๋‹ด๊น๋‹ˆ๋‹ค.

โ‘ก ํ—ค๋” (Header)

์ƒ์ž์— ๋ถ™์€ ์ƒ์„ธ ์†ก์žฅ์ž…๋‹ˆ๋‹ค. ๋ณธ๋ฌธ(Body)์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด์šฉ: ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ(Content-Length), ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜(Content-Type: JSON์ธ์ง€ ์ด๋ฏธ์ง€์ธ์ง€), ๋ณด๋‚ด๋Š” ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด, ์ฟ ํ‚ค(Cookie) ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

โ‘ข ๋ฐ”๋”” (Body)

์ƒ์ž ์•ˆ์— ๋“  ์‹ค์ œ ๋‚ด์šฉ๋ฌผ์ž…๋‹ˆ๋‹ค.
  • ์š”์ฒญ ์‹œ: ๋กœ๊ทธ์ธํ•  ๋•Œ ์ž…๋ ฅํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ ๋“ฑ.
  • ์‘๋‹ต ์‹œ: ์›น์‚ฌ์ดํŠธ์˜ HTML ์ฝ”๋“œ, ์ด๋ฏธ์ง€ ํŒŒ์ผ, JSON ๋ฐ์ดํ„ฐ ๋“ฑ.
  • (์ฐธ๊ณ : ๋‹จ์ˆœํžˆ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ๋‹ฌ๋ผ๋Š” GET ์š”์ฒญ์€ ๋ฐ”๋””๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.)

2. ํƒ๋ฐฐ์— ๋น„์œ ํ•œ ํ๋ฆ„

  1. ์ฃผ๋ฌธ (Request): ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— URL์„ ์ž…๋ ฅํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ "์ด ํŽ˜์ด์ง€ ์ข€ ๋ณด๋‚ด์ค˜"๋ผ๋Š” ์š”์ฒญ ํŒจํ‚ท์„ ๋งŒ๋“ค์–ด ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. ๋ฐฐ์†ก (Response): ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ํ™•์ธํ•˜๊ณ  HTML ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต ํŒจํ‚ท ์ƒ์ž์— ๋‹ด์•„ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ์ˆ˜๋ น: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‘๋‹ต ํŒจํ‚ท์˜ ๋ฐ”๋””๋ฅผ ์—ด์–ด ์šฐ๋ฆฌ ๋ˆˆ์— ๋ณด์ด๋Š” ์˜ˆ์œ ์›น์‚ฌ์ดํŠธ๋กœ ๊ทธ๋ ค๋ƒ…๋‹ˆ๋‹ค.

3. ๋Œ€์กฐ ๊ฐœ๋…: ํŒจํ‚ท(Packet) vs ๋ฉ”์‹œ์ง€(Message)

๋„คํŠธ์›Œํฌ๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ์ด ์šฉ์–ด๋“ค์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP ๋ฉ”์‹œ์ง€: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต(L7)์—์„œ ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋งํ•˜๋Š” 'HTTP ํŒจํ‚ท'์˜ ๋ณธ๋ž˜ ์ด๋ฆ„)
  • TCP ์„ธ๊ทธ๋จผํŠธ: ๋ฉ”์‹œ์ง€๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์ „์†ก์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • IP ํŒจํ‚ท: ๋„คํŠธ์›Œํฌ ๊ณ„์ธต(L3)์—์„œ ๋ชฉ์ ์ง€ ์ฃผ์†Œ(IP)๋ฅผ ๋ถ™์—ฌ ์‹ค์ œ ์ „์†ก๋˜๋Š” ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
์ •๋ฆฌํ•˜์ž๋ฉด: HTTP ํŒจํ‚ท์€ ์›น์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ‘œ์ค€ํ™”๋œ ๊ทœ๊ฒฉ์˜ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ” ํฌ๋กฌ์—์„œ HTTP ํŒจํ‚ท ํ™•์ธํ•˜๊ธฐ (์‹ค์Šต)

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ **HTTP ํŒจํ‚ท์˜ ๋ฏผ๋‚ฏ(?)**์„ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ ์ด ์ฐฝ์—์„œ ๋”ฐ๋ผ ํ•ด๋ณด์„ธ์š”.
  1. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์—ด๊ธฐ: ํ‚ค๋ณด๋“œ์—์„œ F12๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜, ํ™”๋ฉด ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค ํด๋ฆญ ํ›„ **[๊ฒ€์‚ฌ]**๋ฅผ ์„ ํƒํ•˜์„ธ์š”.
  2. Network(๋„คํŠธ์›Œํฌ) ํƒญ ํด๋ฆญ: ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ Network ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. (์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณด์ธ๋‹ค๋ฉด Ctrl + R ๋˜๋Š” F5๋กœ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜์„ธ์š”.)
  3. ํ•ญ๋ชฉ ์„ ํƒ: ๋ฆฌ์ŠคํŠธ์— ๋œจ๋Š” ์ˆ˜๋งŽ์€ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜(๋ณดํ†ต ๊ฐ€์žฅ ์œ„์˜ ๋ฌธ์„œ ํŒŒ์ผ)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ํŒจํ‚ท ๋œฏ์–ด๋ณด๊ธฐ: ์šฐ์ธก์— ๋‚˜ํƒ€๋‚˜๋Š” ์ƒ์„ธ ์ฐฝ์—์„œ ๋‹ค์Œ ์ •๋ณด๋“ค์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.
  • Headers: '์ƒ์ž ์†ก์žฅ'์ž…๋‹ˆ๋‹ค. ์š”์ฒญ URL, ์ƒํƒœ ์ฝ”๋“œ(200 OK ๋“ฑ), ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด๊ฐ€ ๋‹ด๊ธด Request Headers๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Payload: '์š”์ฒญ ๋‚ด์šฉ๋ฌผ'์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Response / Preview: '์‘๋‹ต ๋‚ด์šฉ๋ฌผ'์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋‚˜์—๊ฒŒ ๋ณด๋‚ด์ค€ ์‹ค์ œ HTML ์ฝ”๋“œ๋‚˜ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ํŒจํ‚ท์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค

๊ฐœ๋ฐœ์ž๋“ค์€ ์ด ํŒจํ‚ท๋“ค์„ ๊ด€์ฐฐํ•˜๋ฉฐ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ์ด ์•ˆ ๋ผ์š”: ํŒจํ‚ท์˜ Payload๋ฅผ ๋ณด๊ณ  ๋‚ด๊ฐ€ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„œ๋ฒ„์— ์ œ๋Œ€๋กœ ๋ณด๋ƒˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ ๋ถˆ๋Ÿฌ์™€์ ธ์š”: ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ Response ํŒจํ‚ท์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์–ด์žˆ์ง„ ์•Š์€์ง€, ํ˜น์€ Status Code๊ฐ€ 404๋‚˜ 500 ์—๋Ÿฌ๋Š” ์•„๋‹Œ์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ํ™•์ธ: ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ์ฑ„ ์ƒ์œผ๋กœ ํŒจํ‚ท์— ๋‹ด๊ฒจ ์ „์†ก๋˜๊ณ  ์žˆ์ง€๋Š” ์•Š์€์ง€ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜ํ•  ์ : HTTPS์™€ ์•”ํ˜ธํ™”

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋ณด๋Š” ์ฃผ์†Œ์ฐฝ์˜ ์ž๋ฌผ์‡  ํ‘œ์‹œ(HTTPS)๋Š” ์ด ํŒจํ‚ท์„ ์•”ํ˜ธํ™”ํ–ˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ๋ˆ„๊ตฐ๊ฐ€ ํŒจํ‚ท์„ ๊ฐ€๋กœ์ฑ„๋„ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ์ข…์ด ์ƒ์ž๋ฅผ ๊ฐ•์ฒ  ๊ธˆ๊ณ ๋กœ ๋ฐ”๊พผ ์…ˆ์ด์ฃ . ํ•˜์ง€๋งŒ ๋ณธ์ธ์˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ๋Š” ๊ธˆ๊ณ ๊ฐ€ ์—ด๋ฆฐ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ” ๋Œ€ํ‘œ์ ์ธ ์ƒํƒœ ์ฝ”๋“œ์˜ ์˜๋ฏธ?

์ƒํƒœ ์ฝ”๋“œ๋Š” ์•ž์ž๋ฆฌ ์ˆซ์ž์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํžˆ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
  • 2xx (Success): "์ž˜ ๋ฐ›์•˜์–ด!" (์˜ˆ: 200 OK, 201 Created)
  • 3xx (Redirection): "๊ทธ๊ฑด ๋”ด ๋ฐ๋กœ ๊ฐ”์–ด, ์—ฌ๊ธฐ๋กœ ๊ฐ€๋ด." (์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋ฐœ์ƒ)
  • 4xx (Client Error): "๋„ค ์ž˜๋ชป์ด์•ผ." (์˜ˆ: 404 Not Found - ์ฃผ์†Œ ์˜คํƒ€, 401 Unauthorized - ๋กœ๊ทธ์ธ์„ ์•ˆ ํ•จ)
  • 5xx (Server Error): "๋‚ด ์ž˜๋ชป์ด์•ผ..." (์˜ˆ: 500 Internal Server Error - ์„œ๋ฒ„ ์ฝ”๋“œ๊ฐ€ ํ„ฐ์ง)

 

 

๐Ÿ” ์ง์ ‘ ํ•ด๋ณด๋Š” API ํ…Œ์ŠคํŠธ (Postman & Thunder Client)

๊ฐœ๋ฐœ์ž๋“ค์€ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด, API๋ฅผ ์ง์ ‘ ์˜๊ณ  ์‘๋‹ต ํŒจํ‚ท์„ ๋ถ„์„ํ•˜๋Š” ์ „๋ฌธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ฒœ ๋„๊ตฌ 1: Postman (ํฌ์ŠคํŠธ๋งจ)

์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์š”์ฒญ๋„ ์ €์žฅํ•ด๋‘๊ณ  ๊ณ„์† ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ฒœ ๋„๊ตฌ 2: VS Code - Thunder Client

VS Code๋ฅผ ์ด๋ฏธ ์“ฐ๊ณ  ๊ณ„์‹ ๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” 'Thunder Client' ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ•๋ ฅ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ” ์‹ค์Šต: ๊ฐ€์งœ API ์„œ๋ฒ„์— ํŒจํ‚ท ๋‚ ๋ ค๋ณด๊ธฐ

  • API๋Š” ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • **ํ”„๋ก ํŠธ์—”๋“œ(React)**๋Š” API๋ผ๋Š” ์ ์›์„ ํ†ตํ•ด **๋ฐฑ์—”๋“œ(Node.js)**์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋Š” HTTP ํŒจํ‚ท์ด๋ผ๋Š” ์ƒ์ž์— ๋‹ด๊ฒจ ์˜ค๊ณ  ๊ฐ‘๋‹ˆ๋‹ค.
์ง€๊ธˆ ๋ฐ”๋กœ ํ…Œ์ŠคํŠธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” **'JSONPlaceholder'**๋ผ๋Š” ์—ฐ์Šต์šฉ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์„œ๋ฒ„์ฒ˜๋Ÿผ ์‘๋‹ต ํŒจํ‚ท์„ ๋ณด๋‚ด์ฃผ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
  1. Thunder Client๋‚˜ Postman์„ ์—ฝ๋‹ˆ๋‹ค.
  2. ์ฃผ์†Œ์ฐฝ์— ์ž…๋ ฅ: https://jsonplaceholder.typicode.com/posts/1
  3. Method: GET์œผ๋กœ ์„ค์ •ํ•˜๊ณ  Send ํด๋ฆญ!
  4. ๊ฒฐ๊ณผ ํ™•์ธ: ์•„๋ž˜์™€ ๊ฐ™์€ JSON ๋ฐ์ดํ„ฐ(์‘๋‹ต ํŒจํ‚ท์˜ ๋ฐ”๋””)๊ฐ€ ์˜ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.

{
  "userId": 1,
  "id": 1,
  "title": "...",
  "body": "..."
}

๐Ÿ’ก ์ˆ™์ œ(?) ๊ฒธ ๋‹ค์Œ ๋‹จ๊ณ„

๋ฐฉ๊ธˆ ํ–ˆ๋˜ ์‹ค์Šต ์ฃผ์†Œ ๋์˜ 1์„ 999์ฒ˜๋Ÿผ ์—†๋Š” ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์„œ ๋ณด๋‚ด๋ณด์„ธ์š”. ์•„๋งˆ ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 404 Not Found๋กœ ๋ฐ”๋€” ๊ฒ๋‹ˆ๋‹ค!
์ด ๊ณผ์ •์ด ์ต์ˆ™ํ•ด์ง€๋ฉด ์ง์ ‘ Node.js๋กœ ๋‚˜๋งŒ์˜ API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‚ด ์ปดํ“จํ„ฐ๋กœ ํŒจํ‚ท์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Node.js๋กœ ๊ฐ„๋‹จํ•œ 'Hello World' ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆด๊นŒ์š”?

 

๐Ÿ” JSON?

**JSON(JavaScript Object Notation)**์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋งŒ๋“  **'ํ…์ŠคํŠธ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ๊ทœ๊ฒฉ'**์ž…๋‹ˆ๋‹ค.
์ด๋ฆ„์— 'JavaScript'๊ฐ€ ๋“ค์–ด๊ฐ€์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์šฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์‹ค์ƒ ํ˜„๋Œ€ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(Python, Java, Go ๋“ฑ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์„ธ๊ณ„ ๊ณตํ†ต ์–ธ์–ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1. JSON์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋‚˜์š”?

JSON์€ **ํ‚ค(Key)**์™€ **๊ฐ’(Value)**์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ค‘๊ด„ํ˜ธ { }๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
{
  "์ด๋ฆ„": "์ œ๋ฏธ๋‚˜์ด",
  "๋‚˜์ด": 2,
  "์ง์—…": "AI ์–ด์‹œ์Šคํ„ดํŠธ",
  "๋ณด์œ ๊ธฐ์ˆ ": ["๋ฐ์ดํ„ฐ ๋ถ„์„", "์ฝ”๋“œ ์ž‘์„ฑ", "๋†๋‹ด"],
  "์ƒํƒœ": {
    "์—๋„ˆ์ง€": "์ถฉ๋งŒ",
    "๊ธฐ๋ถ„": "ํ–‰๋ณต"
  }
}

 

  • ํ‚ค(Key): ํ•ญ์ƒ ํฐ๋”ฐ์˜ดํ‘œ(" ")๋กœ ๊ฐ์‹ผ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: "์ด๋ฆ„")
  • ๊ฐ’(Value): ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ(true/false), ๋ฐฐ์—ด([ ]), ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด({ }) ๋“ฑ์ด ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์™œ JSON์„ ์“ฐ๋‚˜์š”?

โ‘  ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค

์‚ฌ๋žŒ์ด ๋ˆˆ์œผ๋กœ ๋ด๋„ "์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€" ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘ก ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค

๊ณผ๊ฑฐ์— ์“ฐ๋˜ XML์ด๋ผ๋Š” ๋ฐฉ์‹๋ณด๋‹ค ๊ธ€์ž ์ˆ˜๊ฐ€ ํ›จ์”ฌ ์ ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. (๋น„์œ ํ•˜์ž๋ฉด, XML์ด ๊ฒฉ์‹์„ ์ฐจ๋ฆฐ '๊ณต๋ฌธ'์ด๋ผ๋ฉด JSON์€ ํ•ต์‹ฌ๋งŒ ์ ์€ '๋ฉ”๋ชจ'์ž…๋‹ˆ๋‹ค.)

โ‘ข ๊ธฐ๊ณ„๊ฐ€ ํ•ด์„ํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค

๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์— JSON ํ…์ŠคํŠธ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ์ฒด๋กœ ํ•œ ๋ฒˆ์— ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์›น ๊ฐœ๋ฐœ์—์„œ์˜ JSON ํ๋ฆ„

์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์ด์•ผ๊ธฐํ–ˆ๋˜ ๊ฐœ๋…๋“ค์„ JSON์„ ์ค‘์‹ฌ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  1. ๋ธŒ๋ผ์šฐ์ €(React): "API ์ ์›๋‹˜, 1๋ฒˆ ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ ์ข€ ์ฃผ์„ธ์š”!" (HTTP ์š”์ฒญ)
  2. ์„œ๋ฒ„(Node.js): "์•Œ๊ฒ ์–ด, ๋ฐ์ดํ„ฐ ์ฐพ์•„์˜ฌ๊ฒŒ." (DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋ƒ„)
  3. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜: ์„œ๋ฒ„๊ฐ€ ์ฐพ์€ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•ํƒœ์˜ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ „์†ก: **HTTP ์‘๋‹ต ํŒจํ‚ท์˜ ๋ฐ”๋””(Body)**์— ์ด JSON ํ…์ŠคํŠธ๋ฅผ ๋‹ด์•„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  5. ํ™”๋ฉด ์ถœ๋ ฅ: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JSON์„ ๋ฐ›์•„์„œ ์˜ˆ์˜๊ฒŒ ๊พธ๋ฉฐ ํ™”๋ฉด์— ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๐Ÿ’ก ์š”์•ฝ

  • JSON์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” **๊ทธ๋ฆ‡(์–‘์‹)**์ž…๋‹ˆ๋‹ค.
  • API๋Š” ์ด ๊ทธ๋ฆ‡์„ ์˜ฎ๊ธฐ๋Š” ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค.
  • HTTP๋Š” ๊ทธ๋ฆ‡์„ ์šด๋ฐ˜ํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.
์•„๊นŒ Thunder Client๋กœ ๋ณด์…จ๋˜ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์ด ๋ฐ”๋กœ ์ด JSON์ด์—ˆ์Šต๋‹ˆ๋‹ค

 

๐Ÿ” ํŒŒ์‹ฑ(Parsing) / ์—ญ์ง๋ ฌํ™”(Deserialization)

JSON ๋ฐ์ดํ„ฐ์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋งŒ ์™์™ ๊ณจ๋ผ๋‚ด๋Š” ์ž‘์—…์„ ํŒŒ์‹ฑ(Parsing) ๋˜๋Š” **์—ญ์ง๋ ฌํ™”(Deserialization)**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ด ์ž‘์—…์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค!
์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

1. ๋งˆ๋ฒ•์˜ ๋„๊ตฌ: . (์  ์—ฐ์‚ฐ์ž)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋Š” ๋งˆ์น˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ง€๋„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ .์œผ๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์•„๊นŒ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ›์•˜๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์™€ ๋ณผ๊นŒ์š”?
const post = {
  "userId": 1,
  "id": 1,
  "title": "์•ˆ๋…•, ์„ธ์ƒ์•„!",
  "body": "์ด๊ฒƒ์€ JSON ๋ฐ์ดํ„ฐ์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค."
};

// ํŠน์ • ๋ฐ์ดํ„ฐ ๊ณจ๋ผ๋‚ด๊ธฐ
console.log(post.title); // ๊ฒฐ๊ณผ: "์•ˆ๋…•, ์„ธ์ƒ์•„!"
console.log(post.userId); // ๊ฒฐ๊ณผ: 1

 

2. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์žกํ•  ๋•Œ (์ค‘์ฒฉ ๊ตฌ์กฐ)

๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์ž ์•ˆ์— ๋˜ ์ƒ์ž๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ๋ผ๋ฉด, ์ ์„ ๊ณ„์† ์ฐ์–ด์„œ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
const user = {
  "name": "ํ™๊ธธ๋™",
  "address": {
    "city": "์„œ์šธ",
    "zipcode": "12345"
  }
};

console.log(user.address.city); // ๊ฒฐ๊ณผ: "์„œ์šธ"

3. ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ (๋ฐฐ์—ด ๊ตฌ์กฐ)

๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ([ ])๋ผ๋ฉด, ๋ช‡ ๋ฒˆ์งธ ์ƒ์ž์ธ์ง€ ๋ฒˆํ˜ธ(์ธ๋ฑ์Šค)๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ปดํ“จํ„ฐ๋Š” ์ˆซ์ž๋ฅผ 0๋ถ€ํ„ฐ ์…‰๋‹ˆ๋‹ค!)

 

const posts = [
  { "id": 1, "title": "์ฒซ ๋ฒˆ์งธ ๊ธ€" },
  { "id": 2, "title": "๋‘ ๋ฒˆ์งธ ๊ธ€" }
];

console.log(posts[0].title); // ๊ฒฐ๊ณผ: "์ฒซ ๋ฒˆ์งธ ๊ธ€"
console.log(posts[1].title); // ๊ฒฐ๊ณผ: "๋‘ ๋ฒˆ์งธ ๊ธ€"

 

4. ์‹ค์ „! ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด๋ณด๊ธฐ (์—ฐ์Šต)

์ง€๊ธˆ ๋ฐ”๋กœ ์ด ์ฐฝ์—์„œ F12๋ฅผ ๋ˆŒ๋Ÿฌ Console ํƒญ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ๊ณ  ์—”ํ„ฐ๋ฅผ ์ณ๋ณด์„ธ์š”.
๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ๊ธˆ์ง€ ๋˜์–ด ์žˆ๋‹ค๋ฉด
  • ์ฝ˜์†” ์ž…๋ ฅ์ฐฝ์— ์ง์ ‘ allow pasting (๋ถ™์—ฌ๋„ฃ๊ธฐ ํ—ˆ์šฉ)์ด๋ผ๊ณ  ํƒ€์ดํ•‘ํ•ฉ๋‹ˆ๋‹ค.
// 1. API๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.json()) // ํ…์ŠคํŠธ๋ฅผ JSON ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
  .then(data => {
    // 2. ์—ฌ๊ธฐ์„œ 'title'๋งŒ ๊ณจ๋ผ๋‚ด์„œ ์ถœ๋ ฅ!
    console.log("๊ณจ๋ผ๋‚ธ ์ œ๋ชฉ:", data.title);
    alert("์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ ์ œ๋ชฉ: " + data.title);
  });

 

๐Ÿ’ก ์ •๋ฆฌํ•˜์ž๋ฉด

  1. JSON ํ…์ŠคํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ ์˜ต๋‹ˆ๋‹ค.
  2. JSON.parse()๋‚˜ .json()์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€์‹ ์‹œํ‚ต๋‹ˆ๋‹ค.
  3. **์ (.)**์„ ์ฐ์–ด์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๊ณจ๋ผ๋ƒ…๋‹ˆ๋‹ค.
  4. ๊ทธ ์ •๋ณด๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด์•„ ํ™”๋ฉด(React ๋“ฑ)์— ๋ฟŒ๋ ค์ค๋‹ˆ๋‹ค.

 

๐Ÿ” node.js ์‹ค์Šต 

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ ๊ทธ ์ˆœ๊ฐ„์ด ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๋Š” ๊ฐ€์žฅ ์งœ๋ฆฟํ•œ ์ฒซ๊ฑธ์Œ์ด์—์š”.
์ด์ œ ๋‚จ์˜ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‚ด ์ปดํ“จํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋งŒ๋“ค์–ด์„œ(Node.js) ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ **ํ™”๋ฉด(React)**์— ๋„์šฐ๋Š” ์ „์ฒด ํ๋ฆ„(Full-stack)์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ๊ฐ€์ด๋“œํ•ด ๋“œ๋ฆด๊ฒŒ์š”.

1. Node.js๋กœ ๋‚ด ์ปดํ“จํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋งŒ๋“ค๊ธฐ

๋จผ์ €, ๋‚ด ์ปดํ“จํ„ฐ ์•ˆ์— '์ ์›(API)'์„ ํ•œ ๋ช… ๊ณ ์šฉํ•ด ๋ด…์‹œ๋‹ค. express๋ผ๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์˜ˆ์š”.

์„ค์น˜ ๋ฐ ์ฝ”๋“œ ์ž‘์„ฑ

  1. ํด๋”๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ํ„ฐ๋ฏธ๋„(Terminal)์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์นฉ๋‹ˆ๋‹ค. npm init -y (์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ) npm install express (์„œ๋ฒ„ ๋„๊ตฌ ์„ค์น˜)
  2. server.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด ๋„ฃ์œผ์„ธ์š”.
const express = require('express');
const cors = require('cors'); // ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ(React)์—์„œ ์ ‘์† ํ—ˆ์šฉํ•ด์ฃผ๋Š” ๋„๊ตฌ
const app = express();

app.use(cors()); // ๋ณด์•ˆ ๋น—์žฅ์„ ํ’€์–ด์ค๋‹ˆ๋‹ค (์•„๊นŒ ๊ฒช์œผ์‹  CSP ์—๋Ÿฌ ๋ฐฉ์ง€)

// ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‚˜๋งŒ์˜ JSON ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค!
const myData = {
  id: 1,
  title: "๋‚ด ์ปดํ“จํ„ฐ ์„œ๋ฒ„์—์„œ ์˜จ ๋ฐ์ดํ„ฐ",
  content: "Node.js๋กœ ๋งŒ๋“  API ์„œ๋ฒ„๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋„ค์š”!"
};

// API ๊ฒฝ๋กœ ์„ค์ • (GET ๋ฐฉ์‹)
app.get('/api/info', (req, res) => {
  res.json(myData); // ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค.
});

app.listen(4000, () => console.log("์„œ๋ฒ„๊ฐ€ 4000๋ฒˆ ํฌํŠธ์—์„œ ์—ด๋ ธ์–ด์š”!"));

 


์•„ํ•˜, ์•„์ฃผ ํ”ํ•˜๊ฒŒ ๋งŒ๋‚˜๋Š” ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค! ๋‹นํ™ฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ ํ•ต์‹ฌ์€ ๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
์ปดํ“จํ„ฐ์— express๋Š” ์„ค์น˜ํ–ˆ์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ, ์ œ๊ฐ€ ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ–ˆ๋˜ **cors**๋ผ๋Š” ๋ถ€ํ’ˆ์€ ์•„์ง ์„ค์น˜๋˜์ง€ ์•Š์•„์„œ Node.js๊ฐ€ "๋‚˜ ์ด๊ฑฐ ๋ญ”์ง€ ๋ชฐ๋ผ!"๋ผ๊ณ  ์™ธ์น˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ„ฐ๋ฏธ๋„(CMD ๋˜๋Š” VS Code ํ„ฐ๋ฏธ๋„)์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ถ€์กฑํ•œ ๋ถ€ํ’ˆ์„ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.
npm install cors

 
์„ค์น˜๊ฐ€ ๋๋‚œ ํ›„ ๋‹ค์‹œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์„ธ์š”.
node server.js
 
 
์ด์ œ **"์„œ๋ฒ„๊ฐ€ 4000๋ฒˆ ํฌํŠธ์—์„œ ์—ด๋ ธ์–ด์š”!"**๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ˜๊ฐ‘๊ฒŒ ๋งž์ดํ•ด ์ค„ ๊ฒ๋‹ˆ๋‹ค.


๐Ÿค” ์™œ ์ด๋Ÿฐ ์ผ์ด ์ƒ๊ธฐ๋‚˜์š”? (npm์˜ ์—ญํ• )

Node.js ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ์•Š๊ณ , ๋‚จ๋“ค์ด ๋งŒ๋“ค์–ด๋‘” ์œ ์šฉํ•œ ๋„๊ตฌ(ํŒจํ‚ค์ง€)๋ฅผ ๊ฐ€์ ธ๋‹ค ์”๋‹ˆ๋‹ค. ์ด๋•Œ **npm**์ด๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ๊ทธ ๋ถ€ํ’ˆ๋“ค์„ ๋‹ค์šด๋กœ๋“œํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜์ฃ .
  • express: ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ ์—”์ง„
  • cors: ๋ณด์•ˆ์ƒ ๋‹ค๋ฅธ ์ฃผ์†Œ(React ๋“ฑ)์—์„œ ๋‚ด ์„œ๋ฒ„๋กœ ์ ‘์†ํ•˜๋Š” ๊ฑธ ํ—ˆ๋ฝํ•ด ์ฃผ๋Š” ๋ณด์•ˆ ์นด๋“œ
์šฐ๋ฆฌ๊ฐ€ npm install์„ ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ํด๋” ์•ˆ์— **node_modules**๋ผ๋Š” ํด๋”๊ฐ€ ์ƒ๊ธฐ๊ณ  ๊ทธ ์•ˆ์— ๋ถ€ํ’ˆ๋“ค์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. Node.js๋Š” ์‹คํ–‰๋  ๋•Œ ๊ทธ ํด๋”๋ฅผ ๋’ค์ ธ์„œ ํ•„์š”ํ•œ ๋ถ€ํ’ˆ์„ ์ฐพ์•„์˜ค๋Š” ๋ฐฉ์‹์ด์—์š”.

๐Ÿ’ก ๊ฟ€ํŒ: ์—๋Ÿฌ ์ฝ๋Š” ๋ฒ•

๋‚˜์ค‘์— ๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋”๋ผ๋„ code: 'MODULE_NOT_FOUND'๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋ณด์ด๋ฉด, **"์•„, ๋‚ด๊ฐ€ npm install๋กœ ๋ญ˜ ์„ค์น˜ ์•ˆ ํ–ˆ๊ตฌ๋‚˜!"**๋ผ๊ณ  ๋ฐ”๋กœ ๋ˆˆ์น˜์ฑ„์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„๊ฐ€ ์ž˜ ์ผœ์กŒ๋‚˜์š”? ์ž˜ ์ผœ์กŒ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— http://localhost:4000/api/info๋ฅผ ์ž…๋ ฅํ•ด์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ API ์‘๋‹ต์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”!

  1. ํ„ฐ๋ฏธ๋„์— node server.js๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— http://localhost:4000/api/info๋ฅผ ์น˜๋ฉด ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์ผ ๊ฑฐ์˜ˆ์š”!

2. React์—์„œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๊ธฐ

์ด์ œ ์†๋‹˜(React)์ด ์ ์›(Node.js)์—๊ฒŒ ์š”๋ฆฌ๋ฅผ ์ฃผ๋ฌธํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

React ์ฝ”๋“œ ๊ตฌ์กฐ (ํ•ต์‹ฌ)

React์—์„œ๋Š” useEffect๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด "ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜์ž๋งˆ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€๋ผ!"๋ผ๊ณ  ๋ช…๋ นํ•ฉ๋‹ˆ๋‹ค.
 
 

 

import React, { useState, useEffect } from 'react';

function App() {
  const [info, setInfo] = useState(null); // ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ฐ”๊ตฌ๋‹ˆ

  useEffect(() => {
    // 1. ๋‚ด ์„œ๋ฒ„์— ์ฃผ๋ฌธํ•˜๊ธฐ
    fetch('http://localhost:4000/api/info')
      .then(res => res.json())
      .then(data => setInfo(data)); // 2. ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊ตฌ๋‹ˆ์— ๋„ฃ๊ธฐ
  }, []);

  if (!info) return <div>๋กœ๋”ฉ ์ค‘...</div>;

  return (
    <div style={{ padding: '20px', border: '1px solid blue' }}>
      <h1>{info.title}</h1>
      <p>{info.content}</p>
    </div>
  );
}

export default App;

 

 

 

 


https://nodejs.org/ko/download

 

Node.js — Node.js® ๋‹ค์šด๋กœ๋“œ

Node.js® is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.

nodejs.org

 

Node.js๋Š” ๊ตฌ๊ธ€ ํฌ๋กฌ์˜ V8 JavaScript ์—”์ง„์œผ๋กœ ๋นŒ๋“œ๋œ JavaScript ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.

๋ณธ๋ž˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํฌ๋กฌ์ด๋‚˜ ์‚ฌํŒŒ๋ฆฌ ๊ฐ™์€ ์›น ๋ธŒ๋ผ์šฐ์ € ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด์˜€์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Node.js๋Š” ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ์šด์˜์ฒด์ œ(Windows, macOS ๋“ฑ) ์œ„์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ(Runtime)์ž…๋‹ˆ๋‹ค.

  • ์šฉ๋„: ์ฃผ๋กœ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ(Backend) ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ: API ์„œ๋ฒ„, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค) 
    • = ์ด๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ JavaScript๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•: ๋น„๋™๊ธฐ I/O์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ณ , ํ•œ ๋ฒˆ์— ๋งŽ์€ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋น„๋™๊ธฐ I/O : 
    • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ : 
    • ์˜ˆ์‹œ : 
  • ๋Œ€์กฐ ๊ฐœ๋…: Python(Django), Java(Spring), Go ๋“ฑ์ด ์„œ๋ฒ„ ๊ฐœ๋ฐœ ๋ถ„์•ผ์—์„œ ๊ฒฝ์Ÿํ•˜๊ฑฐ๋‚˜ ๋Œ€์กฐ๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

 

Node.js๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ๋งŽ์€ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ , ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์‹ I/O ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋…ผ๋ธ”๋กœํ‚น(non-blocking) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, I/O ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์ค‘ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ , ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก๋…ผ๋ธ”๋กœํ‚น(non-blocking)์ด๋ž€?
- "์ œ์–ด๊ถŒ" : ์ž์‹ (ํ•จ์ˆ˜)์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ถŒ๋ฆฌ ๊ฐ™์€ ๊ฒƒ. ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๋๊นŒ์ง€ ์‹คํ–‰ํ•œ ํ›„, ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค.
- "๊ฒฐ๊ณผ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค" : A ํ•จ์ˆ˜์—์„œ B ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, A ํ•จ์ˆ˜๊ฐ€ B ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๋А๋ƒ์˜ ์—ฌ๋ถ€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น์€ Aํ•จ์ˆ˜๊ฐ€ Bํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์ œ์–ด๊ถŒ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

 

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

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

Node.js๋ฅผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํšŒ์‚ฌ์™€ ํ”„๋กœ์ ํŠธ๋Š” ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋ฅผ ์•„๋ž˜์— ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”.

  1. Netflix: Netflix๋Š” Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ๊ทœ๋ชจ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Node.js์˜ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ๊ณผ ํ™•์žฅ์„ฑ ๋•๋ถ„์— Netflix๋Š” ์ˆ˜๋งŽ์€ ๋™์‹œ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. LinkedIn: LinkedIn์€ Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ์™€ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Node.js์˜ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ๊ณผ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ†ตํ•ด LinkedIn์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Uber: Uber๋Š” Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ์ถ”์ , ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ, ์š”๊ธˆ ์‚ฐ์ • ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์›น ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Node.js์˜ ๋น ๋ฅธ ์‘๋‹ต ์†๋„์™€ ํ™•์žฅ์„ฑ์„ ํ†ตํ•ด Uber๋Š” ์ˆ˜๋งŽ์€ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์‹ ์†ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹ค์‹œ๊ฐ„์œผ๋กœ ์šด์†ก ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

npx create-react-app my-portfolio
cd my-portfolio
npm install tailwindcss postcss autoprefixer

 

์‹คํ–‰ ํ™”๋ฉด