
๐ ์๋ฐ(Java)
์๋ฐ๋ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ 'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด'์ ๋๋ค. ์ด์์ฒด์ ์ ๋ ๋ฆฝ์ ์ด๋ผ๋ ๊ฐ๋ ฅํ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ด, ํ ๋ฒ ์์ฑํ ์ฝ๋๋ก ๋ค์ํ ํ๊ฒฝ์์ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๋ช ๋ น์ ์์ฑํ ๋ ์ฌ์ฉํ๋ '๋๊ตฌ' ๊ทธ ์์ฒด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ผ์.
๐ธ ์คํ๋ง ํ๋ ์์ํฌ(Spring Framework)
์คํ๋ง ํ๋ ์์ํฌ๋ ์๋ฐ ์ธ์ด๋ก ๋ณต์กํ ๊ธฐ์ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์น ์๋น์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ๋๋ 'ํ'์ด์ '๋๊ตฌ ๋ชจ์'์ ๋๋ค. ์คํ๋ง์ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์งํฉ์ด ์๋๋ผ, ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์์น(SOLID)์ ์งํค๋ฉฐ ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋๋ก ๊ท์น๊ณผ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์.
์คํ๋ง ํ๋ ์์ํฌ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ค์ํ ๋ชจ๋ ์ ๊ณต: ์น ๊ฐ๋ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋, ๋ณด์ ๋ฑ ๋ค์ํ ๋ถ์ผ์ ํ์ํ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ ํํ๋ก ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ํ์ํ ๋ชจ๋์ ์ ํํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ฒฝ๋ํ ๋ฐ ํจ์จ์ฑ: ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๋์์ ์ํด ์ค๊ณ๋์ด ์์ผ๋ฉฐ, ๋ถํ์ํ ์ฝ๋๋ฅผ ์ค์ฌ ๊ฐ๋ฐ ์๋์ ํ์ง์ ๋์ฌ์ค๋๋ค.
- ์์กด์ฑ ์ฃผ์ (DI): ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ์ด ์ฝ๋์ ์ ์ฐ์ฑ์ ๋์ ๋๋ค.
- MVC ํจํด: Model-View-Controller ๋์์ธ ํจํด์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ์์๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ ํฅ์์ํต๋๋ค.
- ๋ฐฉ๋ํ ์ปค๋ฎค๋ํฐ: ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฝ๊ฒ ์ฐพ์ ์ ์๊ณ , ๊ฐ๋ฐ์ ๊ฐ ์ง์ ๊ณต์ ๊ฐ ํ๋ฐํฉ๋๋ค.
๐ ์คํ๋ง ๋ถํธ(Spring Boot)
์คํ๋ง ๋ถํธ๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ผ๋ก, '๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๋๊ตฌ'์ ๋๋ค. ๊ธฐ์กด ์คํ๋ง ํ๋ ์์ํฌ์์๋ ๊ฐ๋ฐ์ ํ์ํ ๋ชจ๋์ ์์กด์ฑ์ ์ง์ ์ค์ ํ๊ณ ๋ณต์กํ ์ค์ ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋๋ฐ, ์คํ๋ง ๋ถํธ๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ํ์ด์. '์๋ ์ค์ ' ๊ธฐ๋ฅ์ ํตํด ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ํด์ผ ํ ์ค์ ๋ค์ ๋๋ถ๋ถ ์๋์ผ๋ก ์ฒ๋ฆฌํด ์ฃผ๊ธฐ ๋๋ฌธ์, ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ์ ์์ํ ์ ์๋ต๋๋ค.
Node.js๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์น ๋ธ๋ผ์ฐ์ ๋ฐ์์๋ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐํ์ ํ๊ฒฝ์ด๊ณ , Next.js๋ React ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ์ ๋๋ค. ๊ฐ๋จํ ๋งํด, Node.js๊ฐ ๊ฑด๋ฌผ์ ๊ธฐ๋ฐ์ด ๋๋ ๋ ์ด๋ผ๋ฉด, Next.js๋ ๊ทธ ๋ ์์ ํจ์จ์ ์ธ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์ค๊ณ๋์ด์ ๊ฑด์ถ ๋๊ตฌ ์ธํธ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๐ Node.js (๋ ธ๋์ ์ด์์ค)
Node.js๋ ์๋ฐ์คํฌ๋ฆฝํธ(JavaScript)๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์์ด๋ ์ปดํจํฐ์์ ์ง์ ์คํํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ '๋ฐํ์ ํ๊ฒฝ'์ ๋๋ค. ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์น ๋ธ๋ผ์ฐ์ ์์์๋ง ๋์ํ๋๋ฐ, Node.js ๋๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ง๊ณ ์น ์๋ฒ๋ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ ๋ค์ํ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๊ฒ ๋์์ด์.
- ์ฃผ์ ์ญํ : ์๋ฒ ์ฌ์ด๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ์น ์๋ฒ ๊ตฌ์ถ, API ๊ฐ๋ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฅ์ : ๋น๋๊ธฐ I/O ์ฒ๋ฆฌ๊ฐ ๋ฐ์ด๋์ ํจ์จ์ ์ธ ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ (ํนํ ์น ์๋ฒ) ๊ตฌ์ถ์ ์ฉ์ดํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ ์์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ด ๋์์ง๋ ํจ๊ณผ๋ ์์ต๋๋ค.
- ๋จ์ : CPU ์ฌ์ฉ๋์ด ๋ง์ ์์ ์๋ ์๋์ ์ผ๋ก ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
โจ Next.js (๋ฅ์คํธ์ ์ด์์ค)
Next.js๋ React(๋ฆฌ์กํธ) ๊ธฐ๋ฐ์ ์น ํ๋ ์์ํฌ์ ๋๋ค. ํนํ '์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)' ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์น ํ์ด์ง์ ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํค๊ณ , ๊ฒ์ ์์ง ์ต์ ํ(SEO)์ ์ ๋ฆฌํ๊ฒ ๋ง๋ค์ด์ค๋๋ค. Next.js๋ Node.js ์์์ ๋์ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค ๋ ํ์ํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํตํฉ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
- ์ฃผ์ ์ญํ : React ๊ธฐ๋ฐ์ ๋น ๋ฅด๊ณ ์ต์ ํ๋ ํ๋ก ํธ์๋(ํด๋ผ์ด์ธํธ) ๋ฐ ํ์คํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฅ์ :
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง (SSR): ์น ํ์ด์ง๋ฅผ ์๋ฒ์์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ๋ก๋ฉ์ด ๋น ๋ฅด๊ณ SEO์ ์ ๋ฆฌํฉ๋๋ค.
- ์ ์ ์ฌ์ดํธ ์์ฑ (SSG): ๋น๋ ์์ ์ HTML ํ์ผ์ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ ์ ๊ณตํ๋ฏ๋ก ๋์ฑ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ํธ๋ฆฌํ ๊ฐ๋ฐ ํ๊ฒฝ: ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ผ์ฐํ , ์ด๋ฏธ์ง ์ต์ ํ ๋ฑ ์น ๊ฐ๋ฐ์ ํ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ด ๊ฐ๋ฐ ํธ์์ฑ์ ๋์ฌ์ค๋๋ค.
๐ก ํต์ฌ ์ฐจ์ด์
๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ ๋ฐ๋ก '์ญํ '์ ๋๋ค.
- Node.js: ์๋ฐ์คํฌ๋ฆฝํธ '์ฝ๋ ์คํ ํ๊ฒฝ'์ ๋๋ค. ์ฃผ๋ก ๋ฐฑ์๋(์๋ฒ) ๋ก์ง์ ๋ด๋นํฉ๋๋ค.
- Next.js: React๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ 'ํ๋ ์์ํฌ'์ ๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ด์ ์ ๋ง์ถ์ง๋ง, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๊ธฐ๋ฅ ๋๋ถ์ ํ์คํ ๊ฐ๋ฐ์๋ ํ์ฉ๋ฉ๋๋ค.
Next.js๋ Node.js ์์ด๋ ๋์ํ ์ ์์ต๋๋ค. ์ฆ, Next.js๋ Node.js ๋ฐํ์์ ํ์ฉํ์ฌ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ ๊ฒ์ด์ฃ .
๐บ๏ธ ๋ผ์ฐํฐ(Router)
๋ผ์ฐํฐ๋ ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ(Request)์ด ๋ค์ด์์ ๋, ์ด๋ค ๊ฒฝ๋ก(URL)๋ก ์๋์ง์ ๋ฐ๋ผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ตํ ์ง ์ ์ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฝ๊ฒ ๋งํด, ์น ์๋น์ค์ '๊ตํต ์ ๋ฆฌ๋ฐ'์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ผ์!
ํด๋ผ์ด์ธํธ๊ฐ ํน์ ์ฃผ์(URL)๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ฉด, ๋ผ์ฐํฐ๋ ์ด ์ฃผ์๋ฅผ ๋ณด๊ณ "์, ์ด ์์ฒญ์ ์ ๊ธฐ ์ ํจ์๊ฐ ์ฒ๋ฆฌํด์ผ๊ฒ ๋ค!" ํ๊ณ ํด๋น ์์ฒญ์ ์ ์ ํ ์ฒ๋ฆฌ ๋ก์ง(ํธ๋ค๋ฌ ํจ์)์ผ๋ก ์ฐ๊ฒฐํด ์ค๋๋ค. ์๋ฅผ ๋ค์ด, ์น์ฌ์ดํธ์์ /users ๊ฒฝ๋ก๋ก ์ฌ์ฉ์ ๋ชฉ๋ก์ ์์ฒญํ๋ฉด, ๋ผ์ฐํฐ๋ ์ด ์์ฒญ์ ๋ฐ์ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ฐํํ๋ ์ฝ๋๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ด์ฃ .
- ์ฃผ์ ์ญํ : ํน์ URL๊ณผ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)์ ๋ํ ์์ฒญ์ ๋ด๋นํ ํจ์(๋๋ ๋ฏธ๋ค์จ์ด)๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
- ์์:
- /api/users ๊ฒฝ๋ก๋ก GET ์์ฒญ์ด ์ค๋ฉด, getAllUsers ํจ์ ์คํ.
- /api/users/:id ๊ฒฝ๋ก๋ก POST ์์ฒญ์ด ์ค๋ฉด, createUser ํจ์ ์คํ.
โ๏ธ ๋ฏธ๋ค์จ์ด(Middleware)
๋ฏธ๋ค์จ์ด๋ ์น ์์ฒญ(Request)์ด ๋ค์ด์์ ์๋ต(Response)์ด ๋๊ฐ๊ธฐ ์ ๊น์ง์ ๊ณผ์ ์์ ์ค๊ฐ์ ๊ฐ์ ํ์ฌ ํน์ ์์ ์ ์ํํ๋ ํจ์์ ๋๋ค. ์น ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์์ ์คํ๋๋ '์ค๊ฐ ๋ค๋ฆฌ' ๋๋ '๊ฒ๋ฌธ์' ์ญํ ์ ํ๋ค๊ณ ๋ณด์๋ฉด ์ดํด๊ฐ ๋น ๋ฅผ ๊ฑฐ์์.
๋ฏธ๋ค์จ์ด๋ ์์ฒญ ๊ฐ์ฒด(req), ์๋ต ๊ฐ์ฒด(res), ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ํธ์ถํ๋ next() ํจ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด next() ํจ์๋ฅผ ํตํด ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์์ฒญ์ ์ ๋ฌํ๊ฑฐ๋, ๋๋ ์ค๊ฐ์ ์ง์ ์๋ต์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฐํํ ์๋ ์์ต๋๋ค.
- ์ฃผ์ ์ญํ :
- ์์ฒญ ๋ก๊น (์: ๋๊ฐ ์ด๋ค ์์ฒญ์ ํ๋์ง ๊ธฐ๋ก)
- ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ ํ์ธ (๋ก๊ทธ์ธํ๋์ง, ์ ๊ทผ ๊ถํ์ด ์๋์ง ๋ฑ)
- ์์ฒญ ๋ณธ๋ฌธ(Body) ํ์ฑ (ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ ํ์์ ์ฒ๋ฆฌ)
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ
- ์๋ฌ ์ฒ๋ฆฌ (์ค๋ฅ ๋ฐ์ ์ ์ ์ ํ ์๋ต ์ฒ๋ฆฌ)
- ์์:
- ๋ชจ๋ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฏธ๋ค์จ์ด.
- ์์ฒญ์ ํฌํจ๋ JSON ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํด ์ฃผ๋ ๋ฏธ๋ค์จ์ด.
๐ค ๋ผ์ฐํฐ์ ๋ฏธ๋ค์จ์ด์ ๊ด๊ณ
๋ผ์ฐํฐ์ ๋ฏธ๋ค์จ์ด๋ ์๋ก ๋ณด์์ ์ธ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ๊ธด๋ฐํ๊ฒ ๋์ํฉ๋๋ค.
- ๋ฏธ๋ค์จ์ด๊ฐ ๋จผ์ ์ฒ๋ฆฌ: ๋ณดํต ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ๊ฐ์ฅ ๋จผ์ ๊ธ๋ก๋ฒ ๋ฏธ๋ค์จ์ด๋ค์ด ์คํ๋ฉ๋๋ค. ์ด ๋ฏธ๋ค์จ์ด๋ค์ ๋ชจ๋ ์์ฒญ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ๋ก์ง(์: ๋ก๊น , ์ธ์ฆ)์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ผ์ฐํฐ๊ฐ ๊ฒฝ๋ก ๋งค์นญ: ๋ฏธ๋ค์จ์ด ์ฒด์ธ์ ๊ฑฐ์น ์์ฒญ์ ์ด์ ๋ผ์ฐํฐ์๊ฒ ์ ๋ฌ๋ฉ๋๋ค. ๋ผ์ฐํฐ๋ ์์ฒญ URL์ ๋ถ์ํ์ฌ ์ ์ ํ ํธ๋ค๋ฌ ํจ์(๋๋ ํน์ ๋ผ์ฐํธ์๋ง ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด)๋ฅผ ์ฐพ์ต๋๋ค.
- ๋ผ์ฐํธ๋ณ ๋ฏธ๋ค์จ์ด ์คํ: ํน์ ๋ผ์ฐํธ์ ๋งค์นญ๋๋ฉด, ํด๋น ๋ผ์ฐํธ์๋ง ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด๋ค์ด ์คํ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ด๋ฆฌ์ ํ์ด์ง๋ง ์ ๊ทผํ ์ ์๋ ๊ด๋ฆฌ์ ์ธ์ฆ ๋ฏธ๋ค์จ์ด ๊ฐ์ ๊ฒ์ด์ฃ .
- ์ต์ข ํธ๋ค๋ง: ๋ชจ๋ ๋ฏธ๋ค์จ์ด ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น ํ, ์ต์ข ์ ์ผ๋ก ๋ผ์ฐํธ์ ํธ๋ค๋ฌ ํจ์๊ฐ ์คํ๋์ด ํด๋ผ์ด์ธํธ์๊ฒ ์ต์ข ์๋ต์ ๋ณด๋ ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ๋ผ์ฐํฐ๋ ์์ฒญ์ "๋ชฉ์ ์ง"๋ฅผ ๊ฒฐ์ ํ๊ณ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๊ณ , ๋ฏธ๋ค์จ์ด๋ ๋ชฉ์ ์ง๋ก ๊ฐ๊ธฐ ์ ํ๋ ๊ฐ๋ ๋์ค์ "๋ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ"๋ฅผ ํ๋ ์ญํ ์ ํฉ๋๋ค.
## ์ปดํฌ๋ํธ, ์ฝ๊ฒ ๋งํด ๋ญ๋๋ฉด?
โ ์ด๋ค UI(ํ๋ฉด ์์)๋ฅผ “๋ถํ”์ฒ๋ผ ๋ง๋ค์ด๋์ ๊ฒ
์๋ฅผ ๋ค์ด ์น์ฌ์ดํธ์์
- ๋ฒํผ
- ๋ค๋น๊ฒ์ด์ ๋ฐ
- ๋๊ธ ๋ฐ์ค
- ์นด๋ ํํ์ ์ํ ์ ๋ณด
์ด๋ฐ ๊ฑธ ๊ฐ๊ฐ ํ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด ๋ก๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด
- ์ฌ๋ฌ ํ์ด์ง์์ ๊ณ์ ์ฌ์ฌ์ฉํ ์ ์๊ณ
- ์์ ํ ๋ ํ ๊ณณ๋ง ๊ณ ์น๋ฉด ์ ์ฒด๊ฐ ๋ฐ๋๊ณ
- ํ๋ฉด ๊ตฌ์กฐ๊ฐ ํจ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ ธ์.
## ํ๊ตญ์ ๋น์ ๋ก ๋ ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด
์ปดํฌ๋ํธ๋ **"๋ ๊ณ ๋ธ๋ก"**์ด์์.
- ๋ ๊ณ ๋ธ๋ก ํ๋(๋ฒํผ, ์นด๋, ๋ฉ๋ด)๊ฐ ์ปดํฌ๋ํธ
- ์ฌ๋ฌ ๋ธ๋ก์ ์กฐ๋ฆฝํด ํฐ ๊ฑด๋ฌผ์ ๋ง๋๋ ๊ฒ ์น ํ์ด์ง
- ๋ธ๋ก์ ์ด๋์๋ ์์ ๋กญ๊ฒ ๋ค์ ๋ผ์ ๋ฃ์ ์ ์์
๊ฒฐ๊ตญ ์ปดํฌ๋ํธ = ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ๋ ๊ณ ์กฐ๊ฐ
์๋ฐ ์คํ๋ง(Spring) ํ๋ ์์ํฌ ์์ฒด์ ์ฝ๋๊ฐ ์๋, ์น ์์ฒญ(Request)์ URL์์ ๋ฌผ์ํ($\text{?}$), ๋ฑํธ($\text{=}$), ๊ทธ๋ฆฌ๊ณ ์ธ๋ฏธ์ฝ๋ก ($\text{;}$)์ด ์ฌ์ฉ๋ ๋์ ์๋ฏธ๋ฅผ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ด ๊ธฐํธ๋ค์ ์๋ฐ๋ ์คํ๋ง ๋ฌธ๋ฒ์ด ์๋๋ผ ์น ํ์ค URL ํ์์ ๊ตฌ์ฑํ๋ ํต์ฌ ์์์ ๋๋ค.
1. ๐ค ๋ฌผ์ํ (?) : ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์์
URL์์ ๋ฌผ์ํ({?})๋ **๊ฒฝ๋ก(Path)**์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(Query Parameter) ์์ญ์ ๊ตฌ๋ถํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์ญํ : ์๋ฒ๊ฐ ํน์ ๋ฆฌ์์ค(๊ฒฝ๋ก)์ ์ ๊ทผํ ํ, ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๋ฐ์ดํฐ ๋ชฉ๋ก(ํ๋ผ๋ฏธํฐ)์ด ์์๋จ์ ์๋ฆฝ๋๋ค.
- ์์:
- /products/search**?**keyword=coffee
- ์ฌ๊ธฐ์ ๊ฒฝ๋ก(Path)๋ /products/search ์ด๊ณ , ๋ฌผ์ํ($\text{?}$) ๋ค์ keyword=coffee๊ฐ ์๋ฒ๋ก ์ ๋ฌํ ๋ฐ์ดํฐ์ ๋๋ค.
2. โ๏ธ ๋ฑํธ ({=}) : ๊ฐ ํ ๋น
๋ฑํธ($\text{=}$)๋ **์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ(Key)**๊ณผ ๊ทธ **๊ฐ(Value)**์ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์ญํ : ์ด๋ค ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ์ ์ด๋ค ๊ฐ์ ํ ๋นํ์ฌ ์๋ฒ๋ก ๋ณด๋ผ์ง ์ง์ ํฉ๋๋ค.
- ์์:
- keyword**=**coffee
- ์ฌ๊ธฐ์ ํ๋ผ๋ฏธํฐ์ **์ด๋ฆ(Key)**์ keyword์ด๊ณ , ์ด ํ๋ผ๋ฏธํฐ์ ํ ๋น๋ **๊ฐ(Value)**์ coffee์ ๋๋ค.
- ์คํ๋ง์์๋ ์ด ๊ฐ์ @RequestParam ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์์ ์ฝ๊ฒ ๋ฐ์ ์ ์์ต๋๋ค.
3. & ์ฐํผ์๋ ({\&}) : ํ๋ผ๋ฏธํฐ ๊ตฌ๋ถ์
์ถ๊ฐ๋ก, ์ฌ๋ฌ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ๊ฒฐํ ๋๋ ์ฐํผ์๋ ({\&}) ๊ธฐํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ญํ : ํ๋์ ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋ด์์ ์ฌ๋ฌ ๊ฐ์ ์ด๋ฆ=๊ฐ ์์ ๊ตฌ๋ถํฉ๋๋ค.
- ์์:
- /products/list?category=book**&**sort=price
- ์ด ์์ฒญ์ ๋ ๊ฐ์ง ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฒ์ ์ ๋ฌํฉ๋๋ค: category=book๊ณผ sort=price.
4. ๐ ์ธ๋ฏธ์ฝ๋ก ({;}) : ๋งคํธ๋ฆญ์ค ํ๋ผ๋ฏธํฐ (Path Variable์ ๋ถ๊ฐ ์ ๋ณด)
์ธ๋ฏธ์ฝ๋ก ({;})์ ํ๋ ์น ๊ฐ๋ฐ์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋งํผ ํํ๊ฒ ์ฌ์ฉ๋์ง๋ ์์ง๋ง, **๋งคํธ๋ฆญ์ค ํ๋ผ๋ฏธํฐ(Matrix Parameter)**๋ผ๋ ์ฉ๋๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ญํ : ๊ฒฝ๋ก(Path) ์์ฒด์ ํฌํจ๋ ๋ณ์(Path Variable)์ ๋ถ๊ฐ์ ์ธ ์์ฑ์ ์ ๋ฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ URI์ ํน์ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจ์ํค๋ ๋ฐฉ์์ ๋๋ค.
- ์์ (์คํ๋ง์์ ์ง์):
- /users/123**;**version=2
- ๊ฒฝ๋ก ๋ณ์๋ /users/123์ด์ง๋ง, ์ด **'123'**์ด๋ผ๋ ๋ฆฌ์์ค์ ๋ํ ๋ถ๊ฐ ์ ๋ณด๋ก version=2๋ฅผ ํจ๊ป ์ ๋ฌํฉ๋๋ค.
๐ก ์ ๋ฆฌ
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ํด๋ผ์ด์ธํธ์ ์น ์์ฒญ์ ๋ฌผ์ํ({?})์ ๋ฑํธ({=})๊ฐ ํฌํจ๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ ์ฌ์ฉํ๋ฉฐ, ์ธ๋ฏธ์ฝ๋ก ({;})์ ํน์ํ ๊ฒฝ์ฐ(๋งคํธ๋ฆญ์ค ํ๋ผ๋ฏธํฐ)์ ์ฌ์ฉ๋ฉ๋๋ค.
| ๊ธฐํธ | ์ฉ๋ | ์ค๋ช |
| ? | ์์ | ๊ฒฝ๋ก(Path)์ ์ฟผ๋ฆฌ ๋ฌธ์์ด(Query String)์ ๋ถ๋ฆฌํฉ๋๋ค. |
| = | ํ ๋น | ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ๊ฐ์ ์ฐ๊ฒฐํฉ๋๋ค. |
| & | ๊ตฌ๋ถ | ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋ด์์ ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. |
| ; | ๋ถ๊ฐ ์์ฑ | ๊ฒฝ๋ก ๋ณ์(Path Variable)์ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํฉ๋๋ค (๋งคํธ๋ฆญ์ค ํ๋ผ๋ฏธํฐ). |
null๊ณผ undefined๋ JavaScript(์๋ฐ์คํฌ๋ฆฝํธ)์์ **'๊ฐ์ด ์์'**์ ๋ํ๋ด๋ ๋ ๊ฐ์ง ์์ ํ์ (Primitive Types)์ด์ง๋ง, ๊ทธ ์๋ฏธ์ ์ฉ๋์ ๋ช ํํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๐ง null (๋)
null์ ์๋์ ์ผ๋ก ๊ฐ์ด ๋น์ด ์์์ ๋ํ๋ด๋ ๊ฐ์ ๋๋ค.
- ์๋ฏธ: ์ด๋ค ๋ณ์์ ๊ฐ์ด ์๋ค๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ์ง์ (ํ ๋น)ํ ์ํ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก **'๋น ๊ฐ'**์ ์ค์ ํ ๊ฒ์ ๋๋ค.
- ํ์ : object (โ ๏ธ ์ฃผ์: ์ด๋ JavaScript์ ์ญ์ฌ์ ์ธ ๋ฒ๊ทธ๋ก, ์ค์ ๋ก๋ ์์ ํ์ ์ ๋๋ค.)
- ์ฉ๋:
- ๋ณ์์ ๊ฐ์ฒด๋ ๊ฐ์ด ํ ๋น๋์ด ์์๋๋ฐ, ๋์ค์ ๋ช ์์ ์ผ๋ก ์ฐ๊ฒฐ์ ๋๊ฑฐ๋ ๋น์ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ํจ์๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๊ฒ์ผ๋ก ์์๋์ง๋ง, ํ์ฌ๋ ๋ฐํํ ๊ฐ์ฒด๊ฐ ์์์ ๋ํ๋ผ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์์:
-
JavaScript
let user = { name: "Alice" }; // ์ฌ์ฉ์๋ฅผ ์ญ์ ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋น์ธ ๋ ๋ช ์์ ์ผ๋ก null์ ํ ๋น user = null;
โ undefined (์ธ๋ํ์ธ๋)
undefined๋ ๊ฐ์ด ํ ๋น๋์ง ์์ ์ํ๋ฅผ ๋ํ๋ ๋๋ค.
- ์๋ฏธ: ๋ณ์๊ฐ ์ ์ธ๋์์ง๋ง, ์์ง ๊ฐ์ด ํ ๋น๋์ง ์์ ์ํ์ ๋๋ค. ์์คํ ๋๋ ์์ง์ ์ํด ์๋์ผ๋ก ์ค์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ํ์ : undefined
- ์ฉ๋:
- ์ ์ธ๋ง ํ๊ณ ๊ฐ์ ํ ๋นํ์ง ์์ ๋ณ์์ ์ด๊ธฐ๊ฐ.
- ์กด์ฌํ์ง ์๋ ๊ฐ์ฒด ์์ฑ์ ์ ๊ทผํ ๋.
- ํจ์๊ฐ ๊ฐ์ ๋ช ์์ ์ผ๋ก ๋ฐํํ์ง ์์์ ๋์ ๋ฐํ ๊ฐ.
- ํจ์์ ๋งค๊ฐ๋ณ์๊ฐ ์ ๋ฌ๋์ง ์์์ ๋์ ๋งค๊ฐ๋ณ์ ๊ฐ.
- ์์:
-
JavaScript
// 1. ์ ์ธ๋ง ํ๊ณ ๊ฐ์ ํ ๋นํ์ง ์์ ๋ณ์ let age; // age์ ๊ฐ์ undefined // 2. ํจ์๊ฐ ๊ฐ์ ๋ฐํํ์ง ์์ ๋ function doNothing() { // ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์ } const result = doNothing(); // result๋ undefined
๐ ์ฃผ์ ์ฐจ์ด์ ๋น๊ต
ํต์ฌ์ ๋๊ฐ ๊ฐ์ ์ค์ ํ๋๋์ ๋๋ค.
| ๊ตฌ๋ถ | null | undefined |
| ์๋ฏธ | ์๋์ ์ผ๋ก ๊ฐ์ด ์์์ ํ ๋นํจ (๊ฐ๋ฐ์) | ๊ฐ์ด ์์ง ํ ๋น๋์ง ์์ (์์คํ ) |
| ์ค์ ์ฃผ์ฒด | ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ํ ๋น | JavaScript ์์ง/์์คํ ์ด ์๋ ํ ๋น |
| ํ์ ํ์ธ | typeof null $\rightarrow$ "object" | typeof undefined $\rightarrow$ "undefined" |
1. ๋๋ฑ ๋น๊ต (Equality Comparison)
๊ฐ๋ง ๋น๊ตํ๋ **๋์จํ ๋น๊ต(==)**์์๋ ๋์ ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์ง๋ง, ํ์ ๊น์ง ๋น๊ตํ๋ **์๊ฒฉํ ๋น๊ต(===)**์์๋ ๋ค๋ฅด๊ฒ ๊ฐ์ฃผํฉ๋๋ค.
console.log(null == undefined); // true (๊ฐ๋ง ๊ฐ๋ค๊ณ ํ๋จ)
console.log(null === undefined); // false (๊ฐ๊ณผ ํ์
์ด ๋ชจ๋ ๋ค๋ฆ)
2. ํ์ (Type)
ํ์ ์ด ์๋ก ๋ค๋ฆ์ ๋ช ํํ ์ ์ ์์ต๋๋ค.
console.log(typeof null); // object (โ ๏ธ ์์ธ์ ์ธ ๊ฒฝ์ฐ)
console.log(typeof undefined); // undefined
์ด๋ฌํ ์ฐจ์ด ๋๋ฌธ์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ณ์์ ์ํ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ด ์์ด์ผ ํจ์ ์๋ํ ๋๋ null์ ์ฌ์ฉํ๊ณ , ๊ฐ์ด ์์ง ์ค๋น๋์ง ์์์ ํ์ธํ ๋๋ undefined๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ์ด์ฌ์์ def๋ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ ํค์๋์
๋๋ค.
์ฝ๊ฒ ๋งํด, **“๋ด๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ํ๋์ ๋ช
๋ น์ผ๋ก ๋ฌถ์ด๋๋ ๋ฐฉ๋ฒ”**์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
## def ํ ์ค ์ ์
def = ํจ์๋ฅผ ๋ง๋ ๋ค๋ ์ ํธ
ํ์ด์ฌ์ ์ด๋ ๊ฒ ์๋๋ค:
## ์ def๊ฐ ํ์ํ ๊น?
โ 1) ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด
๋น์ทํ ์ฝ๋๋ฅผ ๊ณ์ ๋ฐ๋ณตํด์ ์ฐ๋ฉด ๋นํจ์จ์ ์ด์์์?
ํจ์๋ก ๋ง๋ค๋ฉด ํ ๋ฒ ์ ์ํ๊ณ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ง ํ๋ฉด ๋ฉ๋๋ค.
โ 2) ์ฝ๋๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด
์ฝ๋๋ฅผ ๊ธฐ๋ฅ๋ณ๋ก ๋๋ ๋๋ฉด
- ๋ณด๊ธฐ ์ฝ๊ณ
- ์ ์ง ๋ณด์๋ ์ฝ๊ณ
- ๋ค๋ฅธ ์ฌ๋๋ ์ดํดํ๊ธฐ ์ฌ์์.
โ 3) ํ๋ผ๋ฏธํฐ(๊ฐ)๋ฅผ ๋ฐ์์ ๋ ์ ์ฐํ ๊ธฐ๋ฅ ์ํ
์:
## ํ๊ตญ์ ๋น์ ๋ก ์ฝ๊ฒ ์ค๋ช
def๋ **“์๋ฆฌ ๋ ์ํผ๋ฅผ ๋ง๋ค์ด ๋๋ ๊ฒ”**์ด์์.
- ๋ ์ํผ๋ฅผ ๋ง๋ค์ด ๋๋ฉด(def)
- ํ์ํ ๋๋ง๋ค ๋๊ฐ์ ์๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ๊ฒ ๋ง๋ค ์ ์์(ํจ์ ํธ์ถ)
๊ทธ๋ฌ๋๊น ๋ณต์กํ ๊ณผ์ (์ฝ๋)์ ์ด๋ฆ ํ๋๋ก ๋ฌถ์ด๋๋ ๊ธฐ๋ฅ์ ๋๋ค.
'??'๋ ์๋ฐ์คํฌ๋ฆฝํธ(JavaScript) ๋ฐ ํ์ ์คํฌ๋ฆฝํธ(TypeScript)์์ ์ฌ์ฉ๋๋ ์ดํญ ์ฐ์ฐ์์ด๋ฉฐ, **๋ ๋ณํฉ ์ฐ์ฐ์ (Nullish Coalescing Operator)**๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๐ก ๋ ๋ณํฉ ์ฐ์ฐ์ (??)์ ์ญํ
๋ ๋ณํฉ ์ฐ์ฐ์ (??)๋ ์ผ์ชฝ ํผ์ฐ์ฐ์์ ๊ฐ์ด **null์ด๊ฑฐ๋ undefined**์ผ ๋๋ง ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์์ ๊ฐ์ ๋ฐํํฉ๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ
- ์ผ์ชฝ ๊ฐ์ด null ๋๋ undefined์ผ ๋: ์ค๋ฅธ์ชฝ ๊ฐ์ **๊ธฐ๋ณธ๊ฐ(Default Value)**์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ์ผ์ชฝ ๊ฐ์ด null ๋๋ undefined๊ฐ ์๋ ๋: ์ผ์ชฝ ๊ฐ์ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
๊ตฌ๋ฌธ
์ผ์ชฝ_ํผ์ฐ์ฐ์ ?? ์ค๋ฅธ์ชฝ_ํผ์ฐ์ฐ์ (๊ธฐ๋ณธ๊ฐ)
๊ตฌ์กฐ ๋ถํด ํ ๋น(Destructuring Assignment)์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์์ ํ์ํ ๊ฐ๋ค์ ์ถ์ถํ์ฌ ์๋ก์ด ๋ณ์์ ์ฝ๊ฒ ํ ๋นํ ์ ์๋๋ก ํ๋ JavaScript์ ๋ฌธ๋ฒ์ ๋๋ค.
๊ธ์ ์์ง์ง๋, "๊ตฌ์กฐ ๋ถํด ํ ๋น"์ ๋ํด ๊ถ๊ธํ์ จ๊ตฐ์! ์ด ๊ฐ๋ ์ ์ฝ๋๋ฅผ ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์์ฃผ ์ ์ฉํ ๊ธฐ๋ฅ์ด๋๋๋ค. ํนํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์น ๊ฐ๋ฐ์ ํ์ค ๋ ์์ฃผ ๋ง์ฃผ์น์ค ๊ฑฐ์์. ๐
์ฝ๊ฒ ๋น์ ํ์๋ฉด, ํ๋์ ํฐ ์์(๋ฐฐ์ด ๋๋ ๊ฐ์ฒด) ์์ ์ฌ๋ฌ ๋ฌผ๊ฑด(๊ฐ๋ค)์ด ๋ค์ด์์ ๋, ์์๋ฅผ ์ด์ด์ ์ํ๋ ๋ฌผ๊ฑด๋ค๋ง ์์ ๊ณจ๋ผ ๋ด๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
โจ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ ์ฌ์ฉํ ๊น์?
- ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์: ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ์ถ์ถํ์ฌ ์ด๋ค ๊ฐ์ ์ฌ์ฉํ๋์ง ํ๋์ ์ ์ ์์ต๋๋ค.
- ์ฝ๋ ๊ฐ๊ฒฐํ: ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ ํ ๋นํ๋ ์์ ์ ํ ์ค๋ก ์ค์ผ ์ ์์ต๋๋ค.
- ์ ์ง๋ณด์ ์ฉ์ด: ํ์ํ ๊ฐ๋ง ๋ฝ์๋ด๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์ฝ๋ ์ค์ ์ค์ผ ์ ์์ต๋๋ค.
๐ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด ํ ๋น (Array Destructuring)
๋ฐฐ์ด์ ์๋ ์์๋ค์ ๊ทธ๋ค์ ์์น(์ธ๋ฑ์ค)์ ๋ฐ๋ผ ์ฝ๊ฒ ๋ณ์์ ํ ๋นํ ์ ์์ต๋๋ค.
javascript
// ๊ธฐ์กด ๋ฐฉ์
const fruits = ['์ฌ๊ณผ', '๋ฐ๋๋', '์ค๋ ์ง'];
const apple = fruits[0];
const banana = fruits[1];
// console.log(apple, banana); // ์ถ๋ ฅ: ์ฌ๊ณผ ๋ฐ๋๋
// ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฐฉ์
const [apple, banana, orange] = ['์ฌ๊ณผ', '๋ฐ๋๋', '์ค๋ ์ง'];
console.log(apple); // ์ถ๋ ฅ: ์ฌ๊ณผ
console.log(banana); // ์ถ๋ ฅ: ๋ฐ๋๋
// ํ์ํ ์์๋ง ์ถ์ถ
const [firstFruit, , thirdFruit] = ['์ฌ๊ณผ', '๋ฐ๋๋', '์ค๋ ์ง'];
console.log(firstFruit); // ์ถ๋ ฅ: ์ฌ๊ณผ
console.log(thirdFruit); // ์ถ๋ ฅ: ์ค๋ ์ง
๐ฆ ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด ํ ๋น (Object Destructuring)
๊ฐ์ฒด์ ์๋ ์์ฑ(property)๋ค์ ๊ทธ๋ค์ ํค(key)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๊ฒ ๋ณ์์ ํ ๋นํ ์ ์์ต๋๋ค.
javascript
// ๊ธฐ์กด ๋ฐฉ์
const user = {
name: '์ํฌํฐ',
age: 25,
job: 'AI'
};
const userName = user.name;
const userAge = user.age;
// console.log(userName, userAge); // ์ถ๋ ฅ: ์ํฌํฐ 25
// ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฐฉ์
const user = {
name: '๊ธ์ ์์ง์ง',
age: 25,
job: '๊ฐ๋ฐ์'
};
const { name, age } = user;
console.log(name); // ์ถ๋ ฅ: ๊ธ์ ์์ง์ง
console.log(age); // ์ถ๋ ฅ: 25
// ๋ณ์ ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ํ๊ณ ์ถ์ ๋
const { name: userName, job: userJob } = user;
console.log(userName); // ์ถ๋ ฅ: ๊ธ์ ์์ง์ง
console.log(userJob); // ์ถ๋ ฅ: ๊ฐ๋ฐ์
๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด ํ ๋น ์, ๋ง์ฝ ํด๋น ํ๋กํผํฐ๊ฐ ๊ฐ์ฒด์ ์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํ ์๋ ์์ต๋๋ค.
javascript
let options = {
title: "Menu"
};
let {width = 100, height = 200, title} = options;
console.log(title); // ์ถ๋ ฅ: Menu
console.log(width); // ์ถ๋ ฅ: 100 (options์ width๊ฐ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ)
console.log(height); // ์ถ๋ ฅ: 200 (options์ height๊ฐ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ)
๐ก ๋๋จธ์ง ํจํด (Rest Pattern)
๊ตฌ์กฐ ๋ถํด ํ ๋น ์ ... (์ ์ธ ๊ฐ)๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ ์์๋ค์ ์๋ก์ด ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ก ๋ชจ์ ์๋ ์์ต๋๋ค.
javascript
// ๋ฐฐ์ด ๋๋จธ์ง ํจํด
const [first, second, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // ์ถ๋ ฅ: 1
console.log(second); // ์ถ๋ ฅ: 2
console.log(rest); // ์ถ๋ ฅ: [3, 4, 5]
// ๊ฐ์ฒด ๋๋จธ์ง ํจํด
const options = {
title: "Menu",
height: 200,
width: 100
};
const { title, ...restOfOptions } = options;
console.log(title); // ์ถ๋ ฅ: Menu
console.log(restOfOptions); // ์ถ๋ ฅ: { height: 200, width: 100 }
๊ธ์ ์์ง์ง๋๊ป์ ์น ๊ฐ๋ฐ(Next.js, Node.js)์ ํ์๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ค ๋, ์ด ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ ๋ง ๋ง์ด ์ฌ์ฉํ๊ฒ ๋์ค ๊ฑฐ์์. ํนํ ์ปดํฌ๋ํธ์ props๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ API ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฝ๋ ํจ์จ์ ํฌ๊ฒ ๋์ฌ์ค ์ ์์ต๋๋ค.
'Project ESG+AI > Tech Basics' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 33์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (1) | 2025.11.24 |
|---|---|
| 32์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (1) | 2025.11.21 |
| 30์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.11.19 |
| 29์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.11.18 |
| 28์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.11.17 |