TypeScript์ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ํตํฉ์ ๋ํ ์ฌ์ธต ๋ถ์. ํ์ ์์ ์ฑ์ ํ์ฉํ์ฌ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์์ ํ๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ค๋งํธ ๊ณ์ฝ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
TypeScript ๋ธ๋ก์ฒด์ธ ํตํฉ: ๋ถ์ฐ ์์ฅ ํ์ ์์ ์ฑ์ ์๋ก์ด ์๋
๋ธ๋ก์ฒด์ธ์ ์ธ๊ณ๋ ๋ถ๋ณ์ฑ, ํฌ๋ช ์ฑ, ์ ๋ขฐ ๋ถํ์์ฑ์ ์์น์ ๊ธฐ๋ฐ์ ๋๊ณ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ฝ๋๋ ์ค๋งํธ ๊ณ์ฝ์ด๋ผ๊ณ ๋ ํ๋ฉฐ ๋์งํธ, ์๋ ์คํ ๊ณ์ฝ ์ญํ ์ ํฉ๋๋ค. ๋ถ์ฐ ์์ฅ์ ๋ฐฐํฌ๋๋ฉด ์ด ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด ์๊ตฌ์ฑ์ ๊ธฐ์ ์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ด์ ๊ฐ์ฅ ์ค์ํ ๊ณผ์ ์ ๋๋ค. ๋จ์ผ ๋ฒ๊ทธ, ๋ ผ๋ฆฌ์์ ์ฌ์ํ ์ค์๋ก ์ธํด ์น๋ช ์ ์ด๊ณ ๋๋๋ฆด ์ ์๋ ์ฌ์ ์ ์์ค๊ณผ ์๊ตฌ์ ์ธ ์ ๋ขฐ ์์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ญ์ฌ์ ์ผ๋ก ์ด๋ฌํ ์ค๋งํธ ๊ณ์ฝ์ ๋ํ ๋๋ถ๋ถ์ ํด๋ง ๋ฐ ์ํธ ์์ฉ ๊ณ์ธต์ ํนํ ์ด๋๋ฆฌ์ ์ํ๊ณ์์ ์ผ๋ฐ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋์์ต๋๋ค. JavaScript์ ์ ์ฐ์ฑ๊ณผ ๋ณดํธ์ฑ์ Web3 ํ๋ช ์ ๋ถํธ์คํธ๋ฉํ๋ ๋ฐ ๋์์ด ๋์์ง๋ง ๋์ ์ด๊ณ ๋์จํ๊ฒ ํ์ ํ๋ ํน์ฑ์ ์ ๋ฐ์ฑ์ด ์ค์ํ ๊ณ ์ํ ํ๊ฒฝ์์ ์ํํ ์ฑ ์์ ๋๋ค. ๊ธฐ์กด ์น ๊ฐ๋ฐ์์ ์ฌ์ํ ์ฑ๊ฐ์ฌ์ ์ ๋ฐํ๋ ๋ฐํ์ ์ค๋ฅ, ์์์น ๋ชปํ ํ์ ๊ฐ์ ๋ณํ ๋ฐ ์๋ ์คํจ๋ ๋ธ๋ก์ฒด์ธ์์ ์๋ฐฑ๋ง ๋ฌ๋ฌ ๊ท๋ชจ์ ์ต์คํ๋ก์์ด ๋ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ TypeScript๊ฐ ๋ฑ์ฅํฉ๋๋ค. ์ ์ ํ์ ์ ์ถ๊ฐํ๋ JavaScript์ ์์ ์งํฉ์ธ TypeScript๋ ์ ์ฒด ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ ์คํ์ ์๋ก์ด ์์ค์ ๊ท์จ, ์์ธก ๊ฐ๋ฅ์ฑ ๋ฐ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋จ์ํ ๊ฐ๋ฐ์ ํธ์ ์์ค์ด ์๋๋ผ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์์ ํ๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ํ์ค์ํ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ทผ๋ณธ์ ์ธ ๋ณํ์ ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ TypeScript ํตํฉ์ด ์ค๋งํธ ๊ณ์ฝ ์ํธ ์์ฉ ๊ณ์ธต์์ ์ฌ์ฉ์ ๋๋ฉด ํ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ (dApp)์ ์ด๋ฅด๊ธฐ๊น์ง ํ์ ์์ ์ฑ์ ๊ฐํํ์ฌ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ์ด๋ป๊ฒ ๋ณํํ๋์ง ํฌ๊ด์ ์ผ๋ก ํ๊ตฌํฉ๋๋ค.
ํ์ค์ํ๋ ์ธ์์์ ํ์ ์์ ์ฑ์ด ์ค์ํ ์ด์
TypeScript์ ์ํฅ์ ์์ ํ ์ดํดํ๋ ค๋ฉด ๋จผ์ ๋ถ์ฐ ์์ฅ ๊ฐ๋ฐ์ ๋ด์ฌ๋ ๊ณ ์ ํ ์ํ์ ์ดํดํด์ผ ํฉ๋๋ค. ๋ฒ๊ทธ๋ฅผ ํจ์นํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ ์ ์๋ ์ค์ ์ง์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฌ๋ฆฌ ํผ๋ธ๋ฆญ ๋ธ๋ก์ฒด์ธ์ ๊ฒฐํจ ์๋ ์ค๋งํธ ๊ณ์ฝ์ ์๊ตฌ์ ์ธ ์ทจ์ฝ์ ์ ๋๋ค.
์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ์ ๋์ ์ํ
"์ฝ๋๊ฐ ๋ฒ์ด๋ค"๋ผ๋ ๋ฌธ๊ตฌ๋ ๋ธ๋ก์ฒด์ธ ๊ณต๊ฐ์์ ๋จ์ํ ์บ์นํ๋ ์ด์ฆ๊ฐ ์๋๋ผ ์ด์ ํ์ค์ ๋๋ค. ์ค๋งํธ ๊ณ์ฝ์ ์คํ์ ์ต์ข ์ ์ ๋๋ค. ์ ํํ ๊ณ ๊ฐ ์ง์ ๋ผ์ธ๋ ์๊ณ ํธ๋์ญ์ ์ ๋๋๋ฆด ๊ด๋ฆฌ์๋ ์์ต๋๋ค. ์ด ๊ฐํนํ ํ๊ฒฝ์ ๋ ๋์ ์์ค์ ์ฝ๋ ํ์ง ๋ฐ ๊ฒ์ฆ์ ์๊ตฌํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ทจ์ฝ์ ์ผ๋ก ์ธํด ์๋ ์ ๊ฑธ์ณ ์์ต ๋ฌ๋ฌ์ ์์ค์ด ๋ฐ์ํ์ผ๋ฉฐ, ์ด๋ ์ ํต์ ์ธ ์ํํธ์จ์ด ํ๊ฒฝ์์ ํจ์ฌ ๋ ์ฌ๊ฐํ์ ๋ฏธ๋ฌํ ๋ ผ๋ฆฌ์ ์ค๋ฅ์์ ๋น๋กฏ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ๋ถ๋ณ์ฑ ์ํ: ๋ฐฐํฌ๋๋ฉด ๋ ผ๋ฆฌ๊ฐ ํ์ ๋ฉ๋๋ค. ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ค๋ฉด ์๋ก์ด ๊ณ์ฝ์ ๋ฐฐํฌํ๊ณ ๋ชจ๋ ์ํ์ ์ฌ์ฉ์๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ณต์กํ๊ณ ์ข ์ข ๋ ผ์์ ์ฌ์ง๊ฐ ์๋ ํ๋ก์ธ์ค๊ฐ ํ์ํฉ๋๋ค.
- ์ฌ์ ์ ์ํ: ์ค๋งํธ ๊ณ์ฝ์ ์ข ์ข ๊ท์คํ ๋์งํธ ์์ฐ์ ๊ด๋ฆฌํฉ๋๋ค. ์ค๋ฅ๋ก ์ธํด ์ฑ์ด ์ถฉ๋ํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ฌด๋ถ๋ฅผ ๊ณ ๊ฐ์ํค๊ฑฐ๋ ์๊ธ์ ์์ํ ์ ๊ธ ์ ์์ต๋๋ค.
- ๊ตฌ์ฑ ์ํ: dApp์ ์ข ์ข ์ฌ๋ฌ ๋ค๋ฅธ ์ค๋งํธ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํฉ๋๋ค("๋จธ๋ ๋ ๊ณ " ๊ฐ๋ ). ์ธ๋ถ ๊ณ์ฝ์ ํธ์ถํ ๋ ํ์ ๋ถ์ผ์น ๋๋ ๋ ผ๋ฆฌ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด ์ํ๊ณ์ ๊ฑธ์ณ ์ฐ์์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋์ ์ผ๋ก ํ์ ํ๋ ์ธ์ด์ ์ฝ์
JavaScript์ ๋์์ธ์ ์ ์ฐ์ฑ์ ์ฐ์ ์ํ๋ฉฐ ์ข ์ข ์์ ์ฑ๋ณด๋ค ์ฐ์ ํฉ๋๋ค. ๋์ ํ์ดํ ์์คํ ์ ๋ฐํ์์ ํ์ ์ ํ์ธํฉ๋๋ค. ์ฆ, ํ์ ๊ด๋ จ ๋ฒ๊ทธ๊ฐ ํฌํจ๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์คํํ ๋๊น์ง๋ ํด๋น ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ธ๋ก์ฒด์ธ ์ปจํ ์คํธ์์๋ ๋๋ฌด ๋ฆ์์ต๋๋ค.
๋ค์์ ์ผ๋ฐ์ ์ธ JavaScript ๋ฌธ์ ์ ๋ธ๋ก์ฒด์ธ์ ๋ฏธ์น๋ ์ํฅ์ ๋๋ค.
- ํ์
๊ฐ์ ๋ณํ ์ค๋ฅ: ์๋์ผ๋ก ํ์
์ ๋ณํํ์ฌ ๋์์ด ๋๋ ค๋ JavaScript์ ์๋๋ ๊ธฐ๊ดดํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค(์:
'5' - 1 = 4์ด์ง๋ง'5' + 1 = '51'). ์ค๋งํธ ๊ณ์ฝ์ ํจ์๊ฐ ์ ํํ ๋ถํธ ์๋ ์ ์(uint256)๋ฅผ ์์ํ๊ณ JavaScript ์ฝ๋๊ฐ ์ค์๋ก ๋ฌธ์์ด์ ์ ๋ฌํ๋ฉด ๊ฒฐ๊ณผ๋ ์๋์ผ๋ก ์คํจํ๊ฑฐ๋ ์ต์ ์ ๊ฒฝ์ฐ ์์๋ ๋ฐ์ดํฐ๋ก ์ฑ๊ณตํ๋ ์์ธกํ ์ ์๋ ํธ๋์ญ์ ์ด ๋ ์ ์์ต๋๋ค. - ์ ์๋์ง ์์ ๋ฐ Null ์ค๋ฅ: ์
๋ช
๋์
"์ ์๋์ง ์์ ์์ฑ์ ์ฝ์ ์ ์์ต๋๋ค"์ค๋ฅ๋ JavaScript ๋๋ฒ๊น ์ ์ฃผ์ ์์์ ๋๋ค. dApp์์ ์ด ์ค๋ฅ๋ ๊ณ์ฝ ํธ์ถ์์ ์์๋๋ ๊ฐ์ด ๋ฐํ๋์ง ์์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ์ถฉ๋ํ๊ฑฐ๋ ๋ ์ํํ๊ฒ๋ ์ ํจํ์ง ์์ ์ํ๋ก ์งํ๋ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. - ์๊ธฐ ๋ฌธ์ํ ๋ถ์กฑ: ๋ช ์์ ํ์ ์ด ์์ผ๋ฉด ํจ์๊ฐ ์ด๋ค ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ์์ํ๋์ง ๋๋ ๋ฌด์์ ๋ฐํํ๋์ง ์ ํํ ์๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ด๋ฌํ ๋ชจํธ์ฑ์ ๊ฐ๋ฐ ์๋๋ฅผ ๋ฆ์ถ๊ณ ํนํ ๊ท๋ชจ๊ฐ ํฌ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์์ ํตํฉ ์ค๋ฅ์ ๊ฐ๋ฅ์ฑ์ ๋์ ๋๋ค.
TypeScript๊ฐ ์ด๋ฌํ ์ํ์ ์ํํ๋ ๋ฐฉ๋ฒ
TypeScript๋ ๊ฐ๋ฐ ์ค(์ปดํ์ผ ์) ์๋ํ๋ ์ ์ ํ์ ์์คํ ์ ์ถ๊ฐํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ ์ฝ๋๊ฐ ๋ผ์ด๋ธ ๋คํธ์ํฌ์ ๋ฟ๊ธฐ ์ ์ ๊ฐ๋ฐ์๋ฅผ ์ํ ์์ ๋ง์ ๊ตฌ์ถํ๋ ์๋ฐฉ์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- ์ปดํ์ผ ์๊ฐ ์ค๋ฅ ๊ฒ์ฌ: ๊ฐ์ฅ ์ค์ํ ์ด์ ์
๋๋ค. ์ค๋งํธ ๊ณ์ฝ ํจ์๊ฐ
BigNumber๋ฅผ ์์ํ๊ณstring์ ์ ๋ฌํ๋ ค๊ณ ํ๋ฉด TypeScript ์ปดํ์ผ๋ฌ๋ ์ฆ์ ์ด๋ฅผ ์ฝ๋ ํธ์ง๊ธฐ์์ ์ค๋ฅ๋ก ํ์ํฉ๋๋ค. ์ด ๊ฐ๋จํ ๊ฒ์ฌ๋ ์ผ๋ฐ์ ์ธ ๋ฐํ์ ๋ฒ๊ทธ์ ์ ์ฒด ํด๋์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค. - ํฅ์๋ ์ฝ๋ ๋ช ํ์ฑ ๋ฐ IntelliSense: ํ์ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ์๊ธฐ ๋ฌธ์ํ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ, ํจ์ ์๋ช ๋ฐ ๋ฐํ ๊ฐ์ ์ ํํ ํํ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ์๋ ์์ฑ ๋ฐ ์ธ๋ผ์ธ ๋ฌธ์์ ๊ฐ์ ๊ฐ๋ ฅํ ํด๋ง์ ๊ฐํํ์ฌ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ์ ์ ์ ์ค๋ฒํค๋๋ฅผ ์ค์ ๋๋ค.
- ๋ ์์ ํ ๋ฆฌํฉํ ๋ง: ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ํจ์ ์๋ช ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋์ฐํ ์์ ์ด ๋ ์ ์์ต๋๋ค. TypeScript ์ปดํ์ผ๋ฌ๋ ๊ฐ์ด๋ ์ญํ ์ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฉํ๊ธฐ ์ํด ์ ๋ฐ์ดํธํด์ผ ํ๋ ์ฝ๋๋ฒ ์ด์ค์ ๋ชจ๋ ๋ถ๋ถ์ ์ฆ์ ๋ณด์ฌ์ฃผ์ด ๋๋ฝ๋ ๊ฒ์ด ์๋์ง ํ์ธํฉ๋๋ค.
- Web2 ๊ฐ๋ฐ์๋ฅผ ์ํ ๋ธ๋ฆฌ์ง ๊ตฌ์ถ: Java, C# ๋๋ Swift์ ๊ฐ์ ํ์ ํ๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ์๋ฐฑ๋ง ๋ช ์ ๊ฐ๋ฐ์์๊ฒ TypeScript๋ Web3 ์ธ๊ณ์ ๋ํ ์น์ํ๊ณ ํธ์ํ ์ง์ ์ ์ ์ ๊ณตํ์ฌ ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ถ๊ณ ์ธ์ฌ ํ์ ํ์ฅํฉ๋๋ค.
TypeScript๋ฅผ ์ฌ์ฉํ ์ต์ Web3 ์คํ
TypeScript์ ์ํฅ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํ ๋ถ๋ถ์ ๊ตญํ๋์ง ์๊ณ ๋ฐฑ์๋ ๋ ผ๋ฆฌ์์ ํ๋ฐํธ์๋ ์ธํฐํ์ด์ค๊น์ง ์์ง๋ ฅ ์๋ ํ์ ์์ ํ์ดํ๋ผ์ธ์ ์์ฑํ์ฌ ์ ์ฒด ์ต์ Web3 ์คํ์ ์ค๋ฉฐ๋ญ๋๋ค.
์ค๋งํธ ๊ณ์ฝ(๋ฐฑ์๋ ๋ ผ๋ฆฌ)
์ค๋งํธ ๊ณ์ฝ ์์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก Solidity(EVM์ ๊ฒฝ์ฐ), Vyper ๋๋ Rust(Solana์ ๊ฒฝ์ฐ)์ ๊ฐ์ ์ธ์ด๋ก ์์ฑ๋์ง๋ง ์ํธ ์์ฉ ๊ณ์ธต์์ ๋ง๋ฒ์ด ๋ฐ์ํฉ๋๋ค. ํต์ฌ์ ๊ณ์ฝ์ ABI(Application Binary Interface)์ ๋๋ค. ABI๋ ๊ณ์ฝ์ ํผ๋ธ๋ฆญ ํจ์, ์ด๋ฒคํธ ๋ฐ ๋ณ์๋ฅผ ์ค๋ช ํ๋ JSON ํ์ผ์ ๋๋ค. ์ด๋ ์จ์ฒด์ธ ํ๋ก๊ทธ๋จ์ ๋ํ API ์ฌ์์ ๋๋ค. TypeChain๊ณผ ๊ฐ์ ๋๊ตฌ๋ ์ด ABI๋ฅผ ์ฝ๊ณ ๊ณ์ฝ์ ๋ํ ์์ ํ ํ์ ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ TypeScript ํ์ผ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. ์ฆ, Solidity ๊ณ์ฝ์ ๋ฏธ๋ฌ๋งํ๋ TypeScript ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ชจ๋ ํจ์์ ์ด๋ฒคํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ ํ๋ฉ๋๋ค.
๋ธ๋ก์ฒด์ธ ์ํธ ์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ฏธ๋ค์จ์ด)
JavaScript/TypeScript ํ๊ฒฝ์์ ๋ธ๋ก์ฒด์ธ๊ณผ ํต์ ํ๋ ค๋ฉด ๋ธ๋ก์ฒด์ธ ๋ ธ๋์ ์ฐ๊ฒฐํ๊ณ ์์ฒญ ํ์์ ์ง์ ํ๊ณ ์๋ต์ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ๋ถ์ผ์ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ TypeScript๋ฅผ ์ ์ ์ผ๋ก ์ฑํํ์ต๋๋ค.
- Ethers.js: ์ด๋๋ฆฌ์๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํ ์ค๋ซ๋์ ์ฌ์ฉ๋์ด ์จ ํฌ๊ด์ ์ด๊ณ ์์ ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. TypeScript๋ก ์์ฑ๋์์ผ๋ฉฐ ํนํ TypeChain์์ ์๋ ์์ฑ๋ ํ์ ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ํ์ ์์ ์ฑ์ ํฌ๊ฒ ์ด์งํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- viem: Ethers.js์ ์ต์ , ๊ฒฝ๋ ๋ฐ ๊ณ ๋๋ก ๋ชจ๋ํ๋ ๋์์ ๋๋ค. ์ฒ์๋ถํฐ TypeScript์ ์ฑ๋ฅ์ ์ผ๋์ ๋๊ณ ๊ตฌ์ถ๋ `viem`์ ์ต์ TypeScript ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋๋ผ์ด ์๋ ์์ฑ ๋ฐ ํ์ ์ถ๋ก ์ ์ ๊ณตํ์ฌ ์ข ์ข ๋ง๋ฒ์ฒ๋ผ ๋๊ปด์ง๋ ๊ทน๋์ ํ์ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด ํค๋ก ํธ๋์ญ์ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํ ํ์๊ฐ ์์ต๋๋ค. ๋์ ํ์ ํ๋ ๋ฉ์๋์ ์ํธ ์์ฉํ๊ณ ํ์ ํ๋ ์๋ต์ ๋ฐ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
ํ๋ฐํธ์๋ ํ๋ ์์ํฌ(์ฌ์ฉ์ ์ธํฐํ์ด์ค)
์ต์ ํ๋ฐํธ์๋ ๊ฐ๋ฐ์ React, Vue ๋ฐ Angular์ ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ์ฃผ๋ํ๋ฉฐ ๋ชจ๋ ์ต๊ณ ์์ค์ TypeScript ์ง์์ ์ ๊ณตํฉ๋๋ค. dApp์ ๊ตฌ์ถํ ๋ ์ด๋ฅผ ํตํด ํ์ ์์ ์ฑ์ ์ฌ์ฉ์์๊ฒ๊น์ง ํ์ฅํ ์ ์์ต๋๋ค. ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Redux ๋๋ Zustand) ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ํํฌ(์: `viem`์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ `wagmi`์ ํํฌ)๋ ๊ฐ๋ ฅํ๊ฒ ํ์ ํ๋ ์ ์์ต๋๋ค. ์ฆ, ์ค๋งํธ ๊ณ์ฝ์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ๋ ๊ตฌ์ฑ ์์ ํธ๋ฆฌ๋ฅผ ํตํด ํ๋ฅด๋ฉด์ ํ์ ์์ ์ฑ์ ์ ์งํ์ฌ UI ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฌ์ฉ์๊ฐ ๋ณด๋ ๊ฒ์ด ์จ์ฒด์ธ ์ํ์ ์ฌ๋ฐ๋ฅธ ํํ์ธ์ง ํ์ธํฉ๋๋ค.
๊ฐ๋ฐ ๋ฐ ํ ์คํธ ํ๊ฒฝ(ํด๋ง)
๊ฐ๋ ฅํ ํ๋ก์ ํธ์ ๊ธฐ์ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋๋ค. EVM ๊ฐ๋ฐ์ ์ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํ๊ฒฝ์ธ Hardhat์ TypeScript๋ฅผ ํต์ฌ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค. `hardhat.config.ts` ํ์ผ์์ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๊ณ TypeScript์์ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ์ ์๋ํ๋ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์ ๊ฐ์ฅ ์ค์ํ ๋จ๊ณ์ธ ๋ฐฐํฌ ๋ฐ ํ ์คํธ ์ค์ ํ์ ์์ ์ฑ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ๊ฐ์ด๋: ํ์ ์์ dApp ์ํธ ์์ฉ ๊ณ์ธต ๊ตฌ์ถ
์ด๋ฌํ ์กฐ๊ฐ์ด ์ด๋ป๊ฒ ํจ๊ป ๋ง๋ฌผ๋ฆฌ๋์ง์ ๋ํ ๊ฐ๋จํ์ง๋ง ์ค์ฉ์ ์ธ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. Hardhat์ ์ฌ์ฉํ์ฌ ์ค๋งํธ ๊ณ์ฝ์ ์ปดํ์ผํ๊ณ TypeChain์ผ๋ก TypeScript ํ์ ์ ์์ฑํ๊ณ ํ์ ์์ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
1๋จ๊ณ: TypeScript๋ก Hardhat ํ๋ก์ ํธ ์ค์
๋จผ์ Node.js๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
ํฐ๋ฏธ๋์์ ๋ค์์ ์คํํฉ๋๋ค.
mkdir my-typed-project && cd my-typed-project
npm init -y
npm install --save-dev hardhat
์ด์ Hardhat ์ค์ ๋ง๋ฒ์ฌ๋ฅผ ์คํํฉ๋๋ค.
npx hardhat
ํ๋กฌํํธ๊ฐ ํ์๋๋ฉด "TypeScript ํ๋ก์ ํธ ๋ง๋ค๊ธฐ" ์ต์ ์ ์ ํํฉ๋๋ค. Hardhat์ `ethers`, `hardhat-ethers`, `typechain` ๋ฐ ๊ด๋ จ ํจํค์ง๋ฅผ ํฌํจํ์ฌ ํ์ํ ๋ชจ๋ ์ข ์์ฑ์ ์๋์ผ๋ก ์ค์นํฉ๋๋ค. ๋ํ `tsconfig.json` ๋ฐ `hardhat.config.ts` ํ์ผ์ ์์ฑํ์ฌ ์ฒ์๋ถํฐ ํ์ ์์ ์ํฌํ๋ก๋ฅผ ์ค์ ํฉ๋๋ค.
2๋จ๊ณ: ๊ฐ๋จํ Solidity ์ค๋งํธ ๊ณ์ฝ ์์ฑ
`contracts/` ๋๋ ํฐ๋ฆฌ์ ๊ธฐ๋ณธ ๊ณ์ฝ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฆ์ `Storage.sol`๋ก ์ง์ ํฉ๋๋ค.
// contracts/Storage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Storage {
uint256 private number;
address public lastChanger;
event NumberChanged(address indexed changer, uint256 newNumber);
function store(uint256 newNumber) public {
number = newNumber;
lastChanger = msg.sender;
emit NumberChanged(msg.sender, newNumber);
}
function retrieve() public view returns (uint256) {
return number;
}
}
์ด๊ฒ์ ๋๊ตฌ๋ ์ง ๋ถํธ ์๋ ์ ์๋ฅผ ์ ์ฅํ๊ณ ๋ณผ ์ ์๋ ๊ฐ๋จํ ๊ณ์ฝ์ ๋๋ค.
3๋จ๊ณ: TypeChain์ผ๋ก TypeScript ํ์ดํ ์์ฑ
์ด์ ๊ณ์ฝ์ ์ปดํ์ผํฉ๋๋ค. TypeScript Hardhat ์์ ํ๋ก์ ํธ๋ ์ปดํ์ผ ํ TypeChain์ ์๋์ผ๋ก ์คํํ๋๋ก ์ด๋ฏธ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
์ปดํ์ผ ๋ช ๋ น์ ์คํํฉ๋๋ค.
npx hardhat compile
์ด ๋ช
๋ น์ด ์๋ฃ๋๋ฉด ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ฅผ ํ์ธํฉ๋๋ค. `typechain-types`๋ผ๋ ์ ํด๋๊ฐ ํ์๋ฉ๋๋ค. ๋ด๋ถ์ `Storage.ts`๋ฅผ ํฌํจํ TypeScript ํ์ผ์ด ์์ต๋๋ค. ์ด ํ์ผ์๋ ๊ณ์ฝ์ ๋ํ TypeScript ์ธํฐํ์ด์ค๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. `store` ํจ์, `retrieve` ํจ์, `NumberChanged` ์ด๋ฒคํธ ๋ฐ ๋ชจ๋๊ฐ ์์ํ๋ ํ์
(์: `store`๋ `BigNumberish`๋ฅผ ์์ํ๊ณ `retrieve`๋ `Promise
4๋จ๊ณ: ํ์ ์์ ํ ์คํธ ์์ฑ
`test/` ๋๋ ํฐ๋ฆฌ์์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ์ด๋ฌํ ์์ฑ๋ ํ์ ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. `Storage.test.ts`๋ผ๋ ํ์ผ์ ๋ง๋ญ๋๋ค.
// test/Storage.test.ts
import { ethers } from "hardhat";
import { expect } from "chai";
import { Storage } from "../typechain-types"; // <-- ์์ฑ๋ ํ์
์ ๊ฐ์ ธ์ต๋๋ค!
import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers";
describe("Storage Contract", function () {
let storage: Storage; // <-- ๊ณ์ฝ ํ์
์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
let owner: HardhatEthersSigner;
beforeEach(async function () {
[owner] = await ethers.getSigners();
const storageFactory = await ethers.getContractFactory("Storage");
storage = await storageFactory.deploy();
});
it("Should store and retrieve a value correctly", async function () {
const testValue = 42;
// ์ด ํธ๋์ญ์
ํธ์ถ์ ์์ ํ ํ์
ํ๋์์ต๋๋ค.
const storeTx = await storage.store(testValue);
await storeTx.wait();
// ์ด์ ์ปดํ์ผ ์๊ฐ์ ์คํจํด์ผ ํ๋ ๊ฒ์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
// IDE์์ ์๋ ์ค์ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค.
// await storage.store("this is not a number");
// ^ TypeScript ์ค๋ฅ: ํ์
'string'์ ์ธ์๋ฅผ ํ์
'BigNumberish'์ ๋งค๊ฐ๋ณ์์ ํ ๋นํ ์ ์์ต๋๋ค.
// retrieve()์ ๋ฐํ ๊ฐ๋ Promise
const retrievedValue = await storage.retrieve();
expect(retrievedValue).to.equal(testValue);
});
it("Should emit a NumberChanged event with typed arguments", async function () {
const testValue = 100;
await expect(storage.store(testValue))
.to.emit(storage, "NumberChanged")
.withArgs(owner.address, testValue); // .withArgs๋ ํ์
๊ฒ์ฌ๋ฉ๋๋ค!
});
});
์ด ํ ์คํธ์์ `storage` ๋ณ์๋ ์ผ๋ฐ ๊ณ์ฝ ๊ฐ์ฒด๊ฐ ์๋๋ผ `Storage`๋ก ํน๋ณํ ํ์ ํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋น ๋ฉ์๋(`.store()`, `.retrieve()`)์ ๋ํ ์๋ ์์ฑ์ ์ ๊ณตํ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ ๋ฌํ๋ ์ธ์์ ๋ํ ์ปดํ์ผ ์๊ฐ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฃผ์ ์ฒ๋ฆฌ๋ ์ค์ TypeScript๊ฐ ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ๊ฐ๋จํ์ง๋ง ์ค์ํ ์ค์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
5๋จ๊ณ: ๊ฐ๋ ์ ํ๋ฐํธ์๋ ํตํฉ
React ๋ฐ `wagmi`๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฐํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ํ์ฅํ๋ ๊ฒ์ ๋์ผํ ์์น์ ๋ฐ๋ฆ ๋๋ค. `typechain-types` ๋๋ ํฐ๋ฆฌ๋ฅผ ํ๋ฐํธ์๋ ํ๋ก์ ํธ์ ๊ณต์ ํฉ๋๋ค. ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํด ํํฌ๋ฅผ ์ด๊ธฐํํ ๋ ์์ฑ๋ ABI ๋ฐ ํ์ ์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ ์ฒด ํ๋ฐํธ์๋๊ฐ ์ค๋งํธ ๊ณ์ฝ์ API๋ฅผ ์ธ์ํ์ฌ ์ข ๋จ ๊ฐ ํ์ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ๊ณ ๊ธ ํ์ ์์ ํจํด
๊ธฐ๋ณธ ํจ์ ํธ์ถ ์ธ์๋ TypeScript๋ ํ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋์ฑ ์ ๊ตํ๊ณ ๊ฐ๋ ฅํ ํจํด์ ์ง์ํฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ๊ณ์ฝ ์ค๋ฅ ํ์ดํ
์ต์ ๋ฒ์ ์ Solidity๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ฌธ์์ด ๊ธฐ๋ฐ `require` ๋ฉ์์ง๋ณด๋ค ํจ์ฌ ๋ ๊ฐ์ค ํจ์จ์ ์ธ ์ฌ์ฉ์ ์ง์ ์ค๋ฅ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๊ณ์ฝ์๋ `error InsufficientBalance(uint256 required, uint256 available);`๊ฐ ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค๋ฅ๋ ์จ์ฒด์ธ์์ ํ๋ฅญํ์ง๋ง ์คํ์ฒด์ธ์์ ๋์ฝ๋ฉํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต์ ํด๋ง์ ์ด๋ฌํ ์ฌ์ฉ์ ์ง์ ์ค๋ฅ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ผ๋ฉฐ TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋์์ ํด๋น ํ์ ํ๋ ์ค๋ฅ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊น๋ํ๊ณ ํ์ ์์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ ผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
try {
await contract.withdraw(amount);
} catch (error) {
if (error instanceof InsufficientBalanceError) {
// ์ด์ ํ์
ํ๋ ์์ฑ์ ์์ ํ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค.
console.log(`You need ${error.required} but only have ${error.available}`);
}
}
๋ฐํ์ ๊ฒ์ฆ์ ์ํด Zod ํ์ฉ
TypeScript์ ์์ ๋ง์ ์ปดํ์ผ ์๊ฐ์ ์กด์ฌํฉ๋๋ค. ํผ์ ์ฌ์ฉ์ ์ ๋ ฅ ๋๋ ํ์ฌ API์ ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ฐํ์์ ์ธ๋ถ ์์ค์์ ๋ค์ด์ค๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๋ก๋ถํฐ๋ ๋ณดํธํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก Zod์ ๊ฐ์ ๋ฐํ์ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ TypeScript์ ํ์ ํํธ๋๊ฐ ๋๋ ์ด์ ์ ๋๋ค.
๊ณ์ฝ ํจ์์ ์์๋๋ ์ ๋ ฅ์ ๋ฏธ๋ฌ๋งํ๋ Zod ์คํค๋ง๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ํธ๋์ญ์ ์ ๋ณด๋ด๊ธฐ ์ ์ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ด ์คํค๋ง์ ๋ํด ๊ฒ์ฆํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅธ ํ์ ์ผ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ(์: ๋ฌธ์์ด์ ์ ํจํ ์ฃผ์์ฌ์ผ ํ๊ณ ์ซ์๋ ํน์ ๋ฒ์ ๋ด์ ์์ด์ผ ํจ)๋ฅผ ์ค์ํ๋์ง ํ์ธํฉ๋๋ค. ์ด๋ฅผ ํตํด Zod๋ ๋ฐํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ TypeScript๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ ผ๋ฆฌ ๋ด์์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํ๋ ๋ ๊ณ์ธต ๋ฐฉ์ด๋ฅผ ๋ง๋ญ๋๋ค.
ํ์ ์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
๋ฐ์ํ dApp์ ๊ตฌ์ถํ๋ ค๋ฉด ์ค๋งํธ ๊ณ์ฝ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ๋๋ค. ์์ฑ๋ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ํจ์ฌ ๋ ์์ ํด์ง๋๋ค. TypeChain์ ์ด๋ฒคํธ ํํฐ๋ฅผ ๋ง๋ค๊ณ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ธฐ ์ํ ํ์ ํ๋ ๋์ฐ๋ฏธ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ฉด ํด๋น ์ธ์๊ฐ ์ด๋ฏธ ๊ตฌ๋ฌธ ๋ถ์๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์ ํ๋ฉ๋๋ค. `Storage` ๊ณ์ฝ์ `NumberChanged` ์ด๋ฒคํธ์ ๊ฒฝ์ฐ `changer`๊ฐ `string`(์ฃผ์)์ผ๋ก ํ์ ํ๋๊ณ `newNumber`๊ฐ `bigint`๋ก ํ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์์ ํ์ฌ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ผ๋ก ์ธํ ์ถ์ธก๊ณผ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: ํ์ ์์ ์ฑ์ด ์ ๋ขฐ์ ์ฑํ์ ์ด์งํ๋ ๋ฐฉ๋ฒ
๋ธ๋ก์ฒด์ธ์์ TypeScript์ ์ด์ ์ ๊ฐ๋ณ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ๋์ด ํ์ฅ๋ฉ๋๋ค. ์ด๋ ์ ์ฒด ์ํ๊ณ์ ๊ฑด๊ฐ, ๋ณด์ ๋ฐ ์ฑ์ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ทจ์ฝ์ ๊ฐ์ ๋ฐ ๋ณด์ ๊ฐํ
๋ฐฐํฌ ์ ์ ๊ด๋ฒ์ํ ๋ฒ๊ทธ ๋ฒ์ฃผ๋ฅผ ํฌ์ฐฉํจ์ผ๋ก์จ TypeScript๋ ๋์ฑ ์์ ํ ํ์ค์ํ ์น์ ์ง์ ์ ์ผ๋ก ๊ธฐ์ฌํฉ๋๋ค. ๋ฒ๊ทธ๊ฐ ์ ๋ค๋ ๊ฒ์ ์ต์คํ๋ก์์ด ์ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ ๊ฒฐ๊ตญ ์ฌ์ฉ์์ ๊ธฐ๊ด ํฌ์์ ๊ฐ์ ์ ๋ขฐ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. TypeScript์ ๊ฐ์ ๋๊ตฌ๋ก ๊ฐ๋ฅํด์ง ๊ฐ๋ ฅํ ์์ง๋์ด๋ง์ ๋ํ ๋ช ์ฑ์ ๋ชจ๋ ๋ธ๋ก์ฒด์ธ ํ๋ก์ ํธ์ ์ฅ๊ธฐ์ ์ธ ์์กด ๊ฐ๋ฅ์ฑ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ฐ๋ฐ์์ ์ง์ ์ฅ๋ฒฝ ๋ฎ์ถ๊ธฐ
Web3 ๊ณต๊ฐ์ ์ฃผ๋ฅ ์ฑํ์ ๋ฌ์ฑํ๊ธฐ ์ํด ํจ์ฌ ๋ ํฐ Web2 ๊ฐ๋ฐ์ ํ์์ ์ธ์ฌ๋ฅผ ์ ์นํด์ผ ํฉ๋๋ค. JavaScript ๊ธฐ๋ฐ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ํผ๋์ค๋ฝ๊ณ ์ข ์ข ๊ฐํนํ ํน์ฑ์ ์๋นํ ์ต์ ์์ธ์ด ๋ ์ ์์ต๋๋ค. TypeScript๋ ๊ตฌ์กฐํ๋ ํน์ฑ๊ณผ ๊ฐ๋ ฅํ ํด๋ง์ ํตํด ์น์ํ๊ณ ๋ ์ํ์ ์ธ ์จ๋ณด๋ฉ ๊ฒฝํ์ ์ ๊ณตํ์ฌ ์ ์ธ๊ณ์ ์๋ จ๋ ์์ง๋์ด๊ฐ ํ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ผ๋ก ์ ํํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
๊ธ๋ก๋ฒ ํ์ค์ํ ํ์ ํ์ ๊ฐํ
๋ธ๋ก์ฒด์ธ๊ณผ ์คํ ์์ค ๊ฐ๋ฐ์ ๋ถ๊ฐ๋ถ์ ๊ด๊ณ์ ๋๋ค. ํ๋ก์ ํธ๋ ์ข ์ข ๋ค๋ฅธ ์๊ฐ๋์ ๊ฑธ์ณ ์์ ํ๋ ๊ธฐ์ฌ์๋ค์ ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์ ์ํด ์ ์ง ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด๋ฌํ ๋น๋๊ธฐ ํ๊ฒฝ์์ ๋ช ํํ๊ณ ์๊ธฐ ๋ฌธ์ํ๋ ์ฝ๋๋ ์ฌ์น๊ฐ ์๋๋ผ ํ์ ์ฌํญ์ ๋๋ค. ๋ช ์์ ํ์ ๊ณผ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ถ TypeScript ์ฝ๋๋ฒ ์ด์ค๋ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ๋ค๋ฅธ ๊ฐ๋ฐ์ ๊ฐ์ ์ ๋ขฐํ ์ ์๋ ๊ณ์ฝ ์ญํ ์ ํ์ฌ ์ํํ ํ์ ์ ์ด์งํ๊ณ ํตํฉ ๋ง์ฐฐ์ ์ค์ ๋๋ค.
๊ฒฐ๋ก : TypeScript์ ๋ธ๋ก์ฒด์ธ์ ๋ถ๊ฐํผํ ์ตํฉ
๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ ์ํ๊ณ์ ๊ถค์ ์ ๋ถ๋ช ํฉ๋๋ค. ์ํธ ์์ฉ ๊ณ์ธต์ ๋์จํ JavaScript ์คํฌ๋ฆฝํธ ๋ชจ์์ผ๋ก ์ทจ๊ธํ๋ ์๋๋ ๋๋ฌ์ต๋๋ค. ๋ณด์, ์์ ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅ์ฑ์ ๋ํ ์๊ตฌ๋ TypeScript๋ฅผ "์์ผ๋ฉด ์ข์ ๊ฒ"์์ ์ ๊ณ ํ์ค ๋ชจ๋ฒ ์ฌ๋ก๋ก ๊ฒฉ์์์ผฐ์ต๋๋ค. `viem` ๋ฐ `wagmi`์ ๊ฐ์ ์๋ก์ด ์ธ๋์ ํด๋ง์ TypeScript ์ฐ์ ํ๋ก์ ํธ๋ก ๊ตฌ์ถ๋๊ณ ์์ผ๋ฉฐ ์ด๋ TypeScript์ ๊ทผ๋ณธ์ ์ธ ์ค์์ฑ์ ๋ํ ์ฆ๊ฑฐ์ ๋๋ค.
๋ธ๋ก์ฒด์ธ ์ํฌํ๋ก์ TypeScript๋ฅผ ํตํฉํ๋ ๊ฒ์ ์์ ์ฑ์ ๋ํ ํฌ์์ ๋๋ค. ์ด๋ ๊ท์จ์ ๊ฐ์ ํ๊ณ ์๋๋ฅผ ๋ช ํํ ํ๋ฉฐ ๊ด๋ฒ์ํ ์ผ๋ฐ์ ์ธ ์ค๋ฅ์ ๋ํ ๊ฐ๋ ฅํ ์๋ ์์ ๋ง์ ์ ๊ณตํฉ๋๋ค. ์ค์๊ฐ ์๊ตฌ์ ์ด๊ณ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ถ๋ณ์ ์ธ๊ณ์์ ์ด๋ฌํ ์๋ฐฉ์ ์ ๊ทผ ๋ฐฉ์์ ์ ์คํ ๋ฟ๋ง ์๋๋ผ ํ์์ ์ ๋๋ค. ํ์ค์ํ๋ ๋ฏธ๋๋ฅผ ์ํด ์ฅ๊ธฐ์ ์ผ๋ก ๊ตฌ์ถํ๋ ๋ฐ ์ง์งํ ๊ฐ์ธ, ํ ๋๋ ์กฐ์ง์ ๊ฒฝ์ฐ TypeScript๋ฅผ ์ฑํํ๋ ๊ฒ์ด ์ฑ๊ณต์ ์ํ ์ค์ํ ์ ๋ต์ ๋๋ค.