๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/Tech Basics

23์ผ์ฐจ. IT ๊ฐœ๋… ์ •๋ฆฌ

by GreenJin_S2 2025. 11. 10.


๐Ÿงฑ ์Šคํƒ(Stack)

1๏ธโƒฃ ๊ฐœ๋…

์Šคํƒ์€ "๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š”" ๊ตฌ์กฐ๋กœ,
LIFO (Last In, First Out) — “ํ›„์ž…์„ ์ถœ” ๊ตฌ์กฐ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ ‘์‹œ๋ฅผ ์Œ“๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.
๋งจ ์œ„์— ์Œ“์€ ์ ‘์‹œ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ๊บผ๋‚ผ ์ˆ˜ ์žˆ์ฃ .
→ ๋‚˜์ค‘์— ๋„ฃ์€ ๊ฒƒ์ด ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ฃผ์š” ์—ฐ์‚ฐ

์—ฐ์‚ฐ์„ค๋ช…
push(item) ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํƒ์˜ ๋งจ ์œ„์— ๋„ฃ๊ธฐ
pop() ๋งจ ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ธฐ
peek() ๋งจ ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์ง€ ์•Š๊ณ  ํ™•์ธ
isEmpty() ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ

3๏ธโƒฃ ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๋’ค๋กœ ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ (์›น ๋ธŒ๋ผ์šฐ์ €)
  • ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ด€๋ฆฌ (ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ)
  • ๊ด„ํ˜ธ ์ง ๊ฒ€์‚ฌ, ๋ฌธ์ž์—ด ๋’ค์ง‘๊ธฐ

๐Ÿšƒ ํ(Queue)

1๏ธโƒฃ ๊ฐœ๋…

ํ๋Š” "๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š”" ๊ตฌ์กฐ๋กœ,
FIFO (First In, First Out) — “์„ ์ž…์„ ์ถœ” ๊ตฌ์กฐ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋ฒ„์Šค ์ •๋ฅ˜์žฅ์—์„œ ์ค„ ์„œ์„œ ํƒ‘์Šนํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋จผ์ € ์˜จ ์‚ฌ๋žŒ์ด ๋จผ์ € ํƒ€๊ณ , ๋‚˜์ค‘์— ์˜จ ์‚ฌ๋žŒ์€ ๋‚˜์ค‘์— ํƒ‘๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ฃผ์š” ์—ฐ์‚ฐ

์—ฐ์‚ฐ์„ค๋ช…
enqueue(item) ๋ฐ์ดํ„ฐ๋ฅผ ํ์˜ ๋’ค์ชฝ(rear)์— ์ถ”๊ฐ€
dequeue() ํ์˜ ์•ž์ชฝ(front)์—์„œ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
peek() ๋งจ ์•ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ
isEmpty() ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ

3๏ธโƒฃ ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ํ”„๋ฆฐํ„ฐ ๋Œ€๊ธฐ์—ด (๋จผ์ € ์š”์ฒญ๋œ ๋ฌธ์„œ๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ)
  • ์šด์˜์ฒด์ œ์˜ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ
  • ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ํŒจํ‚ท ์ฒ˜๋ฆฌ

๐Ÿ” ์Šคํƒ vs ํ ๋น„๊ต

๊ตฌ๋ถ„ ์Šคํƒ(Stack) ํ(Queue)
๊ตฌ์กฐ LIFO (ํ›„์ž…์„ ์ถœ) FIFO (์„ ์ž…์„ ์ถœ)
์‚ฝ์ž… ์œ„์น˜ ๋งจ ์œ„(top) ๋’ค(rear)
์‚ญ์ œ ์œ„์น˜ ๋งจ ์œ„(top) ์•ž(front)
์˜ˆ์‹œ ์›น ๋ธŒ๋ผ์šฐ์ € ๋’ค๋กœ ๊ฐ€๊ธฐ ํ”„๋ฆฐํ„ฐ ๋Œ€๊ธฐ์—ด

๐Ÿ’ก๋น„์œ ๋กœ ์ •๋ฆฌ

์ƒํ™ฉํ•ด๋‹น ๊ตฌ์กฐ
์ ‘์‹œ ์Œ“๊ธฐ ์Šคํƒ
์ค„ ์„œ๊ธฐ ํ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ GraphQL ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด **์Šคํ‚ค๋งˆ(Schema)**์™€ **์Šค์นผ๋ผ(Scalar)**๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ž์ฃผ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด ๋‘ ๊ฐœ๋…์€ ๋ฐ์ดํ„ฐ์˜ “ํ˜•ํƒœ”์™€ “๊ธฐ๋ณธ ๋‹จ์œ„”๋ฅผ ์ •์˜ํ•  ๋•Œ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜์—์„œ ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š” ๐Ÿ‘‡


๐Ÿงฉ ์Šคํ‚ค๋งˆ(Schema)

1๏ธโƒฃ ๊ฐœ๋…

**์Šคํ‚ค๋งˆ(Schema)**๋ž€ **๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ(Structure)๋‚˜ ์„ค๊ณ„๋„(blueprint)**๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ณ  ์—ฐ๊ฒฐ๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ์˜ˆ์‹œ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ค€)

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•™์ƒ(Student) ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”.

ํ•„๋“œ๋ช…๋ฐ์ดํ„ฐ ํƒ€์ž…์„ค๋ช…
id INTEGER ํ•™์ƒ ๊ณ ์œ  ๋ฒˆํ˜ธ
name VARCHAR ํ•™์ƒ ์ด๋ฆ„
age INTEGER ๋‚˜์ด
major VARCHAR ์ „๊ณต

์ด ํ‘œ ์ž์ฒด๊ฐ€ ๋ฐ”๋กœ ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.
์ฆ‰, “๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์นผ๋Ÿผ(์†์„ฑ)์„ ๊ฐ€์ง€๊ณ  ์–ด๋–ค ํƒ€์ž…์ธ์ง€”๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด: ‘๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ํ‹€’์ด ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.


3๏ธโƒฃ GraphQL ๊ธฐ์ค€์—์„œ์˜ ์Šคํ‚ค๋งˆ

GraphQL์—์„œ๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ API์˜ ๊ตฌ์กฐ์™€ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

 
type Student { id: ID! name: String! age: Int major: String }

์ด ์ •์˜ ์ž์ฒด๊ฐ€ GraphQL์˜ ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๊ฐ ํ•„๋“œ์˜ ํƒ€์ž…์ด ๋ฐ”๋กœ “์Šค์นผ๋ผ(Scalar)” ํƒ€์ž…์ด์—์š” ๐Ÿ‘‡


โš™๏ธ ์Šค์นผ๋ผ(Scalar)

1๏ธโƒฃ ๊ฐœ๋…

**์Šค์นผ๋ผ(Scalar)**๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” ๋‹จ์ผ ๊ฐ’์ด์—์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, “๋ฌธ์ž์—ด(String)”์ด๋‚˜ “์ˆซ์ž(Int)”์ฒ˜๋Ÿผ ํ•œ ๊ฐ€์ง€ ๊ฐ’๋งŒ ๊ฐ€์ง€๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.


2๏ธโƒฃ GraphQL์—์„œ์˜ ๊ธฐ๋ณธ ์Šค์นผ๋ผ ํƒ€์ž…

ํƒ€์ž…๋ช…์„ค๋ช…์˜ˆ์‹œ
Int ์ •์ˆ˜ 123
Float ์‹ค์ˆ˜ 3.14
String ๋ฌธ์ž์—ด "ํ™๊ธธ๋™"
Boolean ์ฐธ/๊ฑฐ์ง“ true
ID ๊ณ ์œ  ์‹๋ณ„์ž (๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ๋‹ค๋ฃธ) "stu_001"

๐Ÿ’ก “์Šคํ‚ค๋งˆ”๋Š” ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ ,
“์Šค์นผ๋ผ”๋Š” ๊ทธ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ดˆ ํƒ€์ž…์ด์—์š”.


๐Ÿง  ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

๊ฐœ๋…๋น„์œ ์„ค๋ช…
์Šคํ‚ค๋งˆ ์•„ํŒŒํŠธ ์„ค๊ณ„๋„ ๊ฑด๋ฌผ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์ •์˜
์Šค์นผ๋ผ ๋ฒฝ๋Œ, ์œ ๋ฆฌ, ์ฒ ๊ทผ ์„ค๊ณ„๋„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ์žฌ๋ฃŒ

์š”์•ฝ

  • ์Šคํ‚ค๋งˆ(Schema): ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ, ์„ค๊ณ„๋„
  • ์Šค์นผ๋ผ(Scalar): ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„ (์ˆซ์ž, ๋ฌธ์ž์—ด ๋“ฑ)

์˜ˆ์ „์— JQUERY ์“ธ ๋•Œ๋Š” npm์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ด์ œ ๋ฆฌ์•กํŠธ๋กœ ๊ธฐ๋Šฅ์ด ํ–ฅ์ƒ๋œ ์‹œ์ ์—์„œ yarn ๊ณผ pnpm์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด ์–ด๋А๊ฒƒ์„ ์ถ”์ฒœํ•ด?

 

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


โš™๏ธ Yarn vs PNPM ๋น„๊ต ์š”์•ฝ

ํ•ญ๋ชฉYarnPNPM
์†๋„ ๋น ๋ฆ„ ๐Ÿš€ ๋งค์šฐ ๋น ๋ฆ„ (Yarn๋ณด๋‹ค ์ตœ๋Œ€ 2~3๋ฐฐ)
๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ ๋งŽ์Œ ๊ณต์œ  ์บ์‹œ ๊ตฌ์กฐ๋กœ ๋งค์šฐ ์ ˆ์•ฝ์ 
Node Modules ๊ตฌ์กฐ ํ‰๋ฉด์  ์„ค์น˜ (hoisting) ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๊ธฐ๋ฐ˜ (isolation ๊ตฌ์กฐ)
ํ˜ธํ™˜์„ฑ ๋†’์Œ (npm๊ณผ ๊ฑฐ์˜ ๋™์ผ) ๋Œ€๋ถ€๋ถ„ ํ˜ธํ™˜๋จ (๋‹จ, ์ผ๋ถ€ ์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€ ์ฃผ์˜)
Monorepo ์ง€์› Yarn Berry(3.x)๋ถ€ํ„ฐ ๊ฐœ์„  ๊ธฐ๋ณธ ๋‚ด์žฅ (workspace ๊ธฐ๋Šฅ ๊ฐ•๋ ฅ)
์„ค์ • ๋‚œ์ด๋„ ๋น„๊ต์  ์‰ฌ์›€ ์•ฝ๊ฐ„ ๋ณต์žกํ•˜์ง€๋งŒ ๋ฌธ์„œํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์Œ
์ปค๋ฎค๋‹ˆํ‹ฐ/์ง€์› ์•ˆ์ •์ , ๋„๋ฆฌ ์‚ฌ์šฉ๋จ ๐Ÿ”ฅ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅ ์ค‘ (Vite, Next.js ๊ณต์‹ ์ถ”์ฒœ ๊ฒฝํ–ฅ)

๐Ÿง  ์ •๋ฆฌํ•˜๋ฉด

โœ… Yarn์„ ์„ ํƒํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ

  • ํŒ€ ์ „์ฒด๊ฐ€ ๊ธฐ์กด Yarn ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์„ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ
  • ๋ณ„๋„์˜ ์„ค์ • ์—†์ด npm๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
  • ๊ธฐ์กด CRA(Create React App) ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ

๐Ÿš€ pnpm์„ ์„ ํƒํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ

  • React + Vite / Next.js / Monorepo ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ
  • ์†๋„์™€ ๋””์Šคํฌ ํšจ์œจ์„ฑ์„ ์ค‘์‹œํ•  ๋•Œ (ํŒจํ‚ค์ง€๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ฒด๊ฐ ํผ)
  • ํŒ€ ๋‚ด์—์„œ ์ตœ์‹  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋„๊ตฌ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ๋„์ž…ํ•  ๋•Œ

๐Ÿ’ก ์‹ค์ œ ์ฒด๊ฐ ์˜ˆ์‹œ

  • Yarn ์„ค์น˜ ์‹œ๊ฐ„: 30์ดˆ
  • pnpm ์„ค์น˜ ์‹œ๊ฐ„: 10~15์ดˆ
  • ๋””์Šคํฌ ์šฉ๋Ÿ‰: Yarn 2GB → pnpm 300MB ์ˆ˜์ค€

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์ผ์ˆ˜๋ก pnpm์˜ ์†๋„ + ์šฉ๋Ÿ‰ ์ ˆ์•ฝ ํšจ๊ณผ๊ฐ€ ํ™•์‹คํžˆ ๋А๊ปด์ง‘๋‹ˆ๋‹ค.


๐Ÿ”ง ๊ฐœ์ธ ์ถ”์ฒœ

๐Ÿ‘‰ ์ƒˆ๋กœ React ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด pnpm์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด์œ :

  • Vite, Next.js, Turborepo ๋“ฑ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜ธํ™˜
  • ์บ์‹œ, ๋งํฌ ๊ตฌ์กฐ ๋•๋ถ„์— ๋นŒ๋“œ์™€ ์„ค์น˜ ์†๋„ ๊ทน๋Œ€ํ™”
  • ๊ด€๋ฆฌ ํšจ์œจ์ด ๋†’๊ณ , ์žฅ๊ธฐ์ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•จ

์„ค์น˜๋„ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘‡

 
# ์ „์—ญ ์„ค์น˜ npm install -g pnpm # ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ pnpm create vite my-app --template react

๐Ÿ—๏ธ ๊ฐ์ฒด ๋ชจ๋ธ(Object Model)์ด๋ž€?

1๏ธโƒฃ ๊ฐœ๋…

**๊ฐ์ฒด ๋ชจ๋ธ(Object Model)**์€

“ํ”„๋กœ๊ทธ๋žจ ๋‚ด์˜ ๊ฐ์ฒด๋“ค์ด ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์กด์žฌํ•˜๊ณ , ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ ๊ฐœ๋…์  ๋ชจ๋ธ”

์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋‹จ์ˆœํžˆ ๊ฐ์ฒด ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ,
๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„, ๊ณ„์ธต, ์ƒ์†, ์†์„ฑ ๊ณต์œ  ๊ตฌ์กฐ๊นŒ์ง€ ์ •์˜ํ•œ “์ „์ฒด ํ‹€”์ด์—์š”.


2๏ธโƒฃ ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

๐ŸŽจ ๋น„์œ :

๊ฐ์ฒด๊ฐ€ ‘์‚ฌ๋žŒ ํ•œ ๋ช…’์ด๋ผ๋ฉด,
๊ฐ์ฒด ๋ชจ๋ธ์€ ‘์ธ๊ฐ„ ์‚ฌํšŒ์˜ ๊ตฌ์กฐ(๊ฐ€์กฑ, ์กฐ์ง, ์—ญํ• )’๋ฅผ ์ •์˜ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.

 

 

 


 

๊ฐ์ฒด ๋ชจ๋ธ(Object Model)”๊ณผ “DOM(Document Object Model)”์€ ์ด๋ฆ„์ด ๋น„์Šทํ•ด์„œ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด๋ฐ์š”,
๋‘˜์€ ์ ์šฉ ๋ฒ”์œ„์™€ ์—ญํ• ์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜๋ฉด์„œ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š” ๐Ÿ‘‡


๐Ÿงฑ 1๏ธโƒฃ ๊ฐ์ฒด ๋ชจ๋ธ(Object Model)

โœ… ๊ฐœ๋…

**๊ฐ์ฒด ๋ชจ๋ธ(Object Model)**์€

“๊ฐ์ฒด๋“ค์ด ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์กด์žฌํ•˜๊ณ  ์„œ๋กœ ์–ด๋–ค ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”์ง€๋ฅผ ํ‘œํ˜„ํ•œ ์„ค๊ณ„ ๊ฐœ๋…”์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํ”„๋กœ๊ทธ๋žจ ์ „๋ฐ˜์˜ ๊ฐ์ฒด ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ด๋ก ์  ๊ฐœ๋…์ด์—์š”.


๐Ÿ“˜ ์˜ˆ์‹œ (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ OOP ๊ธฐ์ค€)

 
class Car { constructor(color) { this.color = color; } drive() { console.log(`${this.color} ์ž๋™์ฐจ๊ฐ€ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.`); } } const redCar = new Car("๋นจ๊ฐ•"); redCar.drive(); // ๋นจ๊ฐ• ์ž๋™์ฐจ๊ฐ€ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ

  • Car ํด๋ž˜์Šค, redCar ์ธ์Šคํ„ด์Šค, drive() ๋ฉ”์„œ๋“œ
    ์ด๋Ÿฐ ๊ตฌ์„ฑ ๊ด€๊ณ„ ์ „์ฒด๊ฐ€ **๊ฐ์ฒด ๋ชจ๋ธ(Object Model)**์ด์—์š”.

์ฆ‰,

๊ฐ์ฒด ๋ชจ๋ธ = ๊ฐ์ฒด์˜ ์„ค๊ณ„ ๊ตฌ์กฐ + ๊ด€๊ณ„ ๊ทœ์น™


๐ŸŒ 2๏ธโƒฃ DOM(Document Object Model)

โœ… ๊ฐœ๋…

DOM์€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML, XML ๋ฌธ์„œ๋ฅผ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ฆ‰, **์›น ๋ฌธ์„œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ๊ตฌ์ฒด์ ์ธ “๊ฐ์ฒด ๋ชจ๋ธ์˜ ํ•œ ๊ตฌํ˜„์ฒด”**์˜ˆ์š”.


๐Ÿ“„ ์˜ˆ์‹œ (HTML + JavaScript)  

 
<body> <h1 id="title">์•ˆ๋…•ํ•˜์„ธ์š”!</h1> <button onclick="changeText()">ํด๋ฆญ</button> <script> function changeText() { document.getElementById("title").innerText = "๋ฐ˜๊ฐ€์›Œ์š”!"; } </script> </body>

์œ„ ์ฝ”๋“œ์—์„œ
document → HTML ์ „์ฒด ๋ฌธ์„œ ๊ฐ์ฒด
getElementById("title") → DOM ํŠธ๋ฆฌ์—์„œ <h1> ์š”์†Œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ

์ฆ‰, HTML ์š”์†Œ๊ฐ€ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋˜์–ด JS๋กœ ์ œ์–ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ,
์ด๊ฒŒ ๋ฐ”๋กœ **DOM(Document Object Model)**์ž…๋‹ˆ๋‹ค.


โš™๏ธ 3๏ธโƒฃ ๊ฐ์ฒด ๋ชจ๋ธ vs DOM ๋น„๊ตํ‘œ

๊ตฌ๋ถ„๊ฐ์ฒด ๋ชจ๋ธ(Object Model)DOM(Document Object Model)

 

์ •์˜ ๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐœ๋…์  ๋ชจ๋ธ HTML/XML ๋ฌธ์„œ๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•œ ๋ชจ๋ธ
๋ฒ”์œ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ „๋ฐ˜ (Java, JS, Python ๋“ฑ) ์›น ๋ฌธ์„œ(HTML, XML) ์ „์šฉ
ํ˜•ํƒœ ์ถ”์ƒ์  ์„ค๊ณ„ (ํด๋ž˜์Šค, ์ƒ์†, ๋ฉ”์„œ๋“œ ๋“ฑ) ๊ตฌ์ฒด์  ๊ตฌ์กฐ (Node, Element, Text ๋“ฑ)
์˜ˆ์‹œ class User {} / extends / instance document.getElementById(), innerHTML
๊ฒฐ๊ณผ๋ฌผ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ •์˜ ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ œ์–ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
์ข…๋ฅ˜ ์—ฌ๋Ÿฌ ๋ถ„์•ผ์— ์กด์žฌ (DB, SW ์„ค๊ณ„ ๋“ฑ) ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ ๋ชจ๋ธ (W3C ํ‘œ์ค€)

๐Ÿ’ก ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ •๋ฆฌ

**๊ฐ์ฒด ๋ชจ๋ธ(Object Model)**์€ “๊ฐ์ฒด์˜ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ”๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ด๋ก ์  ํ‹€,
**DOM(Document Object Model)์€ “HTML ๋ฌธ์„œ๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค.

์ฆ‰, DOM์€ ๊ฐ์ฒด ๋ชจ๋ธ์˜ ํŠน์ •ํ•œ ํ•œ ์‚ฌ๋ก€๋ผ๊ณ  ๋ณด๋ฉด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

๋น„์œ ๊ฐ์ฒด ๋ชจ๋ธDOM
๊ฐœ๋… “๋ชจ๋“  ์ƒ๋ฌผ์˜ ๋ถ„๋ฅ˜ ์ฒด๊ณ„” “ํŠน์ • ์‹๋ฌผ์˜ ๊ณ„ํ†ต๋„”
์˜๋ฏธ ์ด๋ก ์  ์„ค๊ณ„ ์›๋ฆฌ ํŠน์ • ๊ตฌํ˜„ ๊ตฌ์กฐ
์˜ˆ์‹œ ์‚ฌ๋žŒ, ๋™๋ฌผ, ์ž๋™์ฐจ ๋“ฑ ๊ด€๊ณ„ ์ •์˜ HTML ๋ฌธ์„œ์˜ ์‹ค์ œ ๊ตฌ์กฐ ํ‘œํ˜„


ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ **“ํ•จ์ˆ˜(Function)”**๋Š” ๊ธฐ๋ณธ์ด์ง€๋งŒ,
์ด๋ฆ„์ด ์žˆ๋А๋ƒ ์—†๋А๋ƒ์— ๋”ฐ๋ผ ์—ญํ• ๊ณผ ์‚ฌ์šฉ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

ํŠนํžˆ **์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(React ํฌํ•จ)**์—์„œ๋Š” ์ด ๊ตฌ๋ถ„์ด ์ค‘์š”ํ•ด์š”.
์•„๋ž˜์—์„œ ์ด๋ฆ„ ์œ ๋ฌด์— ๋”ฐ๋ฅธ ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š” ๐Ÿ‘‡

 

โš™๏ธ ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

๊ตฌ๋ถ„์„ค๋ช…์˜ˆ์‹œ
1๏ธโƒฃ ์„ ์–ธํ˜• ํ•จ์ˆ˜ (Named Function / Function Declaration) ํ•จ์ˆ˜์— ์ด๋ฆ„์ด ์žˆ๋Š” ํ˜•ํƒœ function sayHello() { ... }
2๏ธโƒฃ ์ต๋ช… ํ•จ์ˆ˜ (Anonymous Function / Function Expression) ์ด๋ฆ„ ์—†์ด ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ํ•จ์ˆ˜ const greet = function() { ... }
3๏ธโƒฃ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (Arrow Function) ์ต๋ช… ํ•จ์ˆ˜์˜ ๊ฐ„๊ฒฐํ•œ ํ‘œํ˜„์‹ const add = () => { ... }

๐Ÿงฉ 1๏ธโƒฃ ์„ ์–ธํ˜• ํ•จ์ˆ˜ (Named Function)

โœ… ๊ฐœ๋…

  • ํ•จ์ˆ˜์— ์ด๋ฆ„์ด ๋ถ™์–ด ์žˆ๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • function ํ‚ค์›Œ๋“œ๋กœ ์ง์ ‘ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • **ํ˜ธ์ด์ŠคํŒ…(hoisting)**์ด ์ ์šฉ๋˜์–ด, ์„ ์–ธ ์ „์— ํ˜ธ์ถœ ๊ฐ€๋Šฅ!

๐Ÿ“˜ ์˜ˆ์‹œ

 
function sayHello() { console.log("์•ˆ๋…•ํ•˜์„ธ์š”!"); } sayHello(); // โœ… ์ •์ƒ ์‹คํ–‰

๐Ÿ’ก ํŠน์ง•

ํ•ญ๋ชฉ์„ค๋ช…
์ด๋ฆ„ ์กด์žฌ ์žˆ์Œ
์„ ์–ธ ์œ„์น˜ ์–ด๋””๋“  ๊ฐ€๋Šฅ
ํ˜ธ์ถœ ์‹œ์  ์„ ์–ธ ์ด์ „์—๋„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ (ํ˜ธ์ด์ŠคํŒ…)
์žฅ์  ๋””๋ฒ„๊น… ์‹œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์—์„œ ์ด๋ฆ„ ํ‘œ์‹œ
๋‹จ์  ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง (์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ์‹œ ํ•จ์ˆ˜ ์ด๋ฆ„ ๊ณ ์ •)

๐Ÿง  2๏ธโƒฃ ์ต๋ช… ํ•จ์ˆ˜ (Anonymous Function)

โœ… ๊ฐœ๋…

  • ์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜๋กœ,
    ๋ณ€์ˆ˜๋‚˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(Function Expression) ํ˜•ํƒœ๋กœ ์”๋‹ˆ๋‹ค.

๐Ÿ“˜ ์˜ˆ์‹œ

 
const greet = function() { console.log("Hello, World!"); }; greet(); // โœ… ์ •์ƒ ์‹คํ–‰

๐Ÿ’ก ํŠน์ง•

ํ•ญ๋ชฉ์„ค๋ช…
์ด๋ฆ„ ์กด์žฌ โŒ ์—†์Œ
์„ ์–ธ ์œ„์น˜ ๋ณ€์ˆ˜๋‚˜ ์ธ์ž ์•ˆ
ํ˜ธ์ถœ ์‹œ์  ์„ ์–ธ ์ดํ›„์—๋งŒ ๊ฐ€๋Šฅ
์žฅ์  ๋™์ ์œผ๋กœ ํ•จ์ˆ˜ ์ •์˜ ๊ฐ€๋Šฅ
๋‹จ์  ๋””๋ฒ„๊น… ์‹œ ์ด๋ฆ„์ด ์—†์œผ๋ฉด ์ถ”์  ์–ด๋ ค์›€

โšก 3๏ธโƒฃ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (Arrow Function)

โœ… ๊ฐœ๋…

  • ์ต๋ช… ํ•จ์ˆ˜์˜ ์ถ•์•ฝ ๋ฌธ๋ฒ•์œผ๋กœ,
    ES6(ECMAScript 2015) ์ดํ›„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • function ๋Œ€์‹  => ์‚ฌ์šฉ
  • ๋‚ด๋ถ€์ ์œผ๋กœ this ๋ฐ”์ธ๋”ฉ์ด ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ (๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„)

๐Ÿ“˜ ์˜ˆ์‹œ

 
const add = (a, b) => a + b; console.log(add(3, 5)); // 8

๐Ÿ’ก ํŠน์ง•

ํ•ญ๋ชฉ์„ค๋ช…
์ด๋ฆ„ ์กด์žฌ โŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—†์Œ (๋ณ€์ˆ˜๋ช…์œผ๋กœ ์‹๋ณ„)
์„ ์–ธ ์œ„์น˜ ํ‘œํ˜„์‹ ๋‚ด๋ถ€
ํ˜ธ์ถœ ์‹œ์  ์„ ์–ธ ์ดํ›„
์žฅ์  ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ ํ•ฉ
๋‹จ์  this, arguments๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

๐Ÿ” 3๊ฐ€์ง€ ๋ฐฉ์‹ ๋น„๊ต ์š”์•ฝํ‘œ

๊ตฌ๋ถ„์„ ์–ธ ๋ฐฉ์‹์ด๋ฆ„ ์œ ๋ฌดํ˜ธ์ถœ ์‹œ์ ๋Œ€ํ‘œ ์‚ฌ์šฉ ์˜ˆ
์„ ์–ธํ˜• ํ•จ์ˆ˜ function name() {} โœ… ์žˆ์Œ ์„ ์–ธ ์ „ ํ˜ธ์ถœ ๊ฐ€๋Šฅ ์ „์—ญ ์œ ํ‹ธ ํ•จ์ˆ˜
์ต๋ช… ํ•จ์ˆ˜ const f = function() {} โŒ ์—†์Œ ์„ ์–ธ ํ›„ ํ˜ธ์ถœ๋งŒ ๊ฐ€๋Šฅ ์ฝœ๋ฐฑ, ๋ณ€์ˆ˜์— ์ €์žฅ
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ const f = () => {} โŒ ์—†์Œ ์„ ์–ธ ํ›„ ํ˜ธ์ถœ๋งŒ ๊ฐ€๋Šฅ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๊ฐ„๋‹จํ•œ ๋กœ์ง

๐Ÿง  ์š”์•ฝ

  • ์ด๋ฆ„์ด ์žˆ์œผ๋ฉด → ์„ ์–ธํ˜• ํ•จ์ˆ˜ (๋””๋ฒ„๊น…·ํ˜ธ์ด์ŠคํŒ…์— ์œ ๋ฆฌ)
  • ์ด๋ฆ„์ด ์—†์œผ๋ฉด → ์ต๋ช… ํ•จ์ˆ˜ or ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (๊ฐ„๊ฒฐํ•˜๊ณ  ์œ ์—ฐ)

 

 

 

 


๐Ÿ” 3๏ธโƒฃ SPA vs MPA ๋น„๊ต ์š”์•ฝ

๊ตฌ๋ถ„ SPA MPA
ํŽ˜์ด์ง€ ๊ตฌ์กฐ ํ•˜๋‚˜์˜ HTML ํŒŒ์ผ ํŽ˜์ด์ง€๋งˆ๋‹ค HTML ํŒŒ์ผ ์กด์žฌ
ํŽ˜์ด์ง€ ์ „ํ™˜ JS๋กœ ํ™”๋ฉด ์ผ๋ถ€ ๊ฐฑ์‹  ์„œ๋ฒ„๊ฐ€ ์ƒˆ ํŽ˜์ด์ง€ ์ „์†ก
์†๋„ ์ดˆ๊ธฐ ๋А๋ฆผ, ์ดํ›„ ๋น ๋ฆ„ ์ดˆ๊ธฐ ๋น ๋ฆ„, ์ดํ›„ ๋А๋ฆผ
SEO ๋ถˆ๋ฆฌ (SSR ํ•„์š”) ์œ ๋ฆฌ
๋Œ€ํ‘œ ๊ธฐ์ˆ  React, Vue, Angular JSP, PHP, Django ๋“ฑ
์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์•ฑ์ฒ˜๋Ÿผ ๋ถ€๋“œ๋Ÿฌ์›€ ์ „ํ†ต์ ์ธ ํŽ˜์ด์ง€ ์ด๋™ ๋А๋‚Œ

๐Ÿ’ก ๊ฒฐ๋ก  ์š”์•ฝ

SPA = ์•ฑ์ฒ˜๋Ÿผ ๋ถ€๋“œ๋Ÿฌ์šด UX, ํ”„๋ก ํŠธ ์ค‘์‹ฌ
MPA = ๊ฒ€์ƒ‰์—”์ง„ ์นœํ™”์ , ์„œ๋ฒ„ ์ค‘์‹ฌ

์š”์ฆ˜์€ ๋‘˜์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•œ SSR(Server-Side Rendering) ๋ฐฉ์‹
๐Ÿ‘‰ ์˜ˆ: Next.js (React ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ)๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.