๐๏ธ 06. ์ ์ธ ํ์ผ๊ณผ ์ค์ : ๋ ๊ฑฐ์ JS๋ฅผ ์ฐ์ํ๊ฒ ํ์ด๋ผ
๐ ๊ฐ์
tsconfig.json์ ๋ผ๋์ .d.ts๋ฅผ ํ์ฉํ ์ ์ญ ์ค์ฝํ ํ์ ํ์ฅ ๊ธฐ๋ฒ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 6๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[tsconfig.json์ ๋ ๊ฐ์ง ํต์ฌ ์ถ] โ [.d.ts์ ์กด์ฌ ์ด์ ] โ [๊ธ๋ก๋ฒ ๊ณต๊ฐ ์นจํฌํ๊ธฐ(declare global)]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
strict๋ชจ๋์ ์ง์ ํ ์๋ฏธ๋ฅผ ์ดํดํ๊ณ ํ๋ก์ ํธ ์ค์ ์ ์ด์ ๋ฅผ ์ค๋ช ํ ์ ์๋ค. - ํ๊ฒ(Target)๊ณผ ๋ชจ๋(Module) ์ค์ ์ด ์ ํ๋ก ํธ์๋ ํ๊ฒฝ์์ ๋๋ ์ง๋์ง ์ดํดํ๋ค.
- ํ์ ์ง์์ด ์๋ ์ฌ๋ด ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ฐ(Window) ๊ฐ์ฒด๋ฅผ ์์ ์์ฌ๋ก ํ์ ํ์ฅํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "๋ฆฌ๋ ๋! ํ์ฌ์ ์์ ๋ถํฐ ๋ด๋ ค์ค๋ jQuery ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์คํฌ๋ฆฝํธ(
youngsoo-magic.js)๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ค๋๋ฐ,importํ์๋ง์ VScode๊ฐ ์๋ป๊ฒ๊ฒ ๋ฌผ๋ค๋ฉด์Could not find a declaration file for module์๋ฌ๋ฅผ ๋ฟ์ด๋ ๋๋ค! ์ด๋กํ์ฃ ?!" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ํ์
์คํฌ๋ฆฝํธ์ ์ธ๊ณ์์๋ ์ฌ๊ถ(ํ์
์ ์ธ)์ด ์๋ JS ํ์ผ์ ์
๊ตญ ๊ธ์ง์
๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ง์ ๊ฐ์ง ์ฌ๊ถ(
d.ts)์ ๋ฐ๊ธํด ์ค ์ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ๊ธ ๊ท์น์ ์ ํ๋ ๋๋ฒ์์ด ๋ฐ๋กtsconfig.json์ ๋๋ค. ์ค๋ ๊ทธ ๋ ๊ฐ์ง ํต์ ๊ถ์ ์ฅ์ด๋ณด์ฃ ."
๐ค ์ ์์์ผ ํ๋๊ฐ: '์ค์ '์ ๋๋ ค์ํ์ง ๋ง๋ผ
๋ณดํต ์ฃผ๋์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ npx create-next-app์ด๋ vite๊ฐ ๋ง๋ค์ด ์ฃผ๋ tsconfig.json์ ๋จ ํ ๋ฒ๋ ์ด์ด๋ณด์ง ์๊ณ ์ด์ด ํผํด ๋ค๋๋๋ค. ๋ฌด์ธ๊ฐ ๊ฑด๋๋ฆฌ๋ฉด ํฐ์ผ ๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ด์ฃ .
ํ์ง๋ง ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ํ์ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์๊ธฐ์ ๋ด์ฐฉํฉ๋๋ค.
- "์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊น์๋๋ฐ ํ์
์ ์๊ฐ ์๋..." (
npm i @types/xxx๋ ์ ํตํจ) - "์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ก ๋ฃ์ด๋ ๊ตฌ๊ธ ์ ๋๋ฆฌํฑ์ค ์ ์ญ ๊ฐ์ฒด
window.ga๋ฅผ ์ฐ๊ณ ์ถ์๋ฐ TS๊ฐ ํ๋ด..."
์ด๋ ์ค์ ๊ณผ ์ ์ธ ํ์ผ์ ๊ฐ๋
์ ๋ชจ๋ฅด๋ฉด, ์ด์ฉ ์ ์์ด ์ง์ฅ์ // @ts-ignore ๋ as any๋ฅผ ๋ง๊ตฌ ๊ฐ๊ธฐ๋ฉด์ ํ์
์คํฌ๋ฆฝํธ์ ๋ฐฉ์ด๋ง์ ์ค์์ค ์น์ฆ์ฒ๋ผ ๊ตฌ๋ฉ ๋ซ๊ฒ ๋ฉ๋๋ค. 5๋
์ฐจ์ ์ํคํ
์ฒ๋ ์ด๋ฐ ๊ตฌ๋ฉ์ ์ฐ์ํ๊ฒ ๋ง๋ ๊ฒ์์ ์์ํฉ๋๋ค.
โ๏ธ 1. tsconfig.json์ ๋ผ๋ ์ดํดํ๊ธฐ
tsconfig.json ์ต์
์ ์์ญ ๊ฐ๊ฐ ๋์ง๋ง, ํ์
์์ ์ฐ๋ฆฌ๊ฐ ์ปจํธ๋กคํด์ผ ํ ํต์ฌ ์ถ์ ํฌ๊ฒ ๋ ๊ฐ์ง์
๋๋ค.
์ถ A: ์ปดํ์ผ ํ๋ฆฌํฐ (์๊ฒฉํจ์ ์ ๋)
{
"compilerOptions": {
"strict": true, // ๋ฌด์กฐ๊ฑด ์ผ๊ธฐ. ์ด๊ฑฐ ๋ ๊ฑฐ๋ฉด TS ์ฐ์ง ๋ง์ธ์.
"noImplicitAny": true, // "๊ท์ฐฎ์์ any๋ก ๋๋ ๊ฑฐ ๋ค ์ก์๋ผ ๊ฑฐ์ผ!"
"strictNullChecks": true // "null ์ด๋ undefined๊ฐ ๋ค์ด์ฌ ์ ์๋ ๊ฐ๋ฅ์ฑ ์ ๋ถ ์ฐจ๋จํด!"
}
}๐ฆ ์ํธ์ ์์๋ฆฌ: "
strict: true๋ ์ ์ต์ ๋ค์ ๋ค ์ผ์ฃผ๋ ์ค์์น์ ๋๋ค. ๊ตฌํ JS ํ๋ก์ ํธ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ํน์ํ ์ํฉ์ด ์๋๋ผ๋ฉด ์ ๋ ๋์ง ๋ง์ธ์. ๋ฌด๋ ์นผ์ด ๋ ๋ฒ ์ด๊ธฐ ์ฌ์ด ๋ฒ์ ๋๋ค."
์ถ B: ํ๊ฒ๊ณผ ํ๊ฒฝ ์ค์ (์ด๋์ ๋๋ฆด ๊ฒ์ธ๊ฐ)
์ด ๋ถ๋ถ์ด ๋ง์ ์ฌ๋๋ค์ ํท๊ฐ๋ฆฌ๊ฒ ํฉ๋๋ค.
{
"compilerOptions": {
// 1. ๋ด๊ฐ ๋ณํํ ์ต์ข
JS ๋ฌธ๋ฒ ์์ค
"target": "ES6",
// 2. ๋ชจ๋ ์์คํ
์ ๋ญ ์ธ ๊ฑด๊ฐ? (CommonJS vs ESNext)
"module": "ESNext",
// 3. ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆด ๊ฑฐ์ผ? ๋
ธ๋์์ ๋๋ฆด ๊ฑฐ์ผ? (์ฌ์ฉ ๊ฐ๋ฅํ ๋ด์ฅ ๊ฐ์ฒด๋ค)
"lib": ["DOM", "DOM.Iterable", "ESNext"],
// ๋ฒ๋ค๋ฌ(Webpack, Webpack, Vite, Next.js ๋ฑ)๋ฅผ ์ธ ๋ ํ์ ์ต์
"moduleResolution": "bundler",
}
}ํ๋ก ํธ์๋(React, Next.js)์์๋ ์ฌ์ค์ TS ์ปดํ์ผ๋ฌ(tsc)๊ฐ ์ค์ ๋ก JS๋ฅผ ๋ณํํ์ฌ ๋จ๊ตฌ๋(emit) ์ญํ ์ ํ์ง ์์ต๋๋ค. ๋ณํ์ Babel์ด๋ SWC, ์์ค๋น๋(esbuild)๊ฐ ํจ์ฌ ๋นจ๋ฆฌ ํด์น์๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ tsconfig.json์ "VScode์ ๋นจ๊ฐ ์ค ๊ฒ์ฌ๊ธฐ ๊ธฐ์คํ" ์ ๋๋ก ์๊ฐํ๋ฉด ๋ง์ด ํธํฉ๋๋ค.
๐ 2. .d.ts ์ ์ธ ํ์ผ: ํ์
์ ์ฉ ์ฌ๊ถ ๋ฐ๊ธ์
์์ฒ ์ด์ ๋๋ ๋ง๋ก ๋์๊ฐ ๋ด
์๋ค. ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ด ์์ต๋๋ค.
ํ์
์คํฌ๋ฆฝํธ๋ ์ํฌํธ๋๋ ๋ชจ๋์ ๋ณผ ๋ ํญ์ ๊ทธ ์์ ์ง๊ฟ์ธ .d.ts (Declaration) ํ์ผ์ด ์๋์ง๋ฅผ ์ฐพ์ต๋๋ค.
.d.ts ํ์ผ์๋ ์ค์ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(๋ก์ง)๊ฐ ๋จ ํ ์ค๋ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. ์ค๋ก์ง "์ฌ๊ธฐ ์ด๋ฐ ํจ์๋ ํด๋์ค๊ฐ ์์ด~" ํ๊ณ ๊ป๋ฐ๊ธฐ๋ง ์ ์ธ(Declare)ํด ์ฃผ๋ ํ์ผ์
๋๋ค.
์์ฒ ์ด์ ๋ง์ ๊ฐ์ ํ์ผ: youngsoo-magic.d.ts
ํ๋ก์ ํธ ์ต์๋จ types ํด๋(๋ณดํต tsconfig.json์ include์ ๋ฑ๋ก๋จ)์ ๋น ํ์ผ์ ๋ง๋ค๊ณ ์๋์ฒ๋ผ ์จ์ฃผ๋ฉด ์ด๋ฆฌ๋ฅ์ ํ๋ TS๊ฐ ๊ฐ์๊ธฐ ์์ ํด์ง๋๋ค.
// types/youngsoo-magic.d.ts
// ๐ฆ ์ํธ: "์ผ๋จ ๊ธํ๋๊น ์ ๋ชจ๋์ด ์กด์ฌํ๋ค๋ ๊ฒ๋ง TSํํ
์ ๊ณ ํฉ์๋ค."
declare module 'youngsoo-magic' {
// ๋ชจ๋ ๋ด๋ถ์ ํจ์๋ ๊ฐ์ฒด ๋ผ๋๋ฅผ ์ฌ๊ธฐ์ ๋์ถฉ์ด๋ผ๋ ๋ฌ์ฌํด์ค๋ค.
export function doMagic(target: string): void;
export const version: string;
}์ด์ import { doMagic } from 'youngsoo-magic' ์ ์จ๋ ์๋ฌด ์๋ฌ๊ฐ ๋์ง ์์ต๋๋ค. ํ์
์คํฌ๋ฆฝํธ๋ ์ด์ ํด๋น ํ์ผ์ ์ ๋ฐ ํจ์๊ฐ ์๋ค๋ ๊ฑธ "์ ์ธ"๋ฐ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๐ 3. ๊ธ๋ก๋ฒ ์ฐจ์ ์นจํฌ: declare global
๊ฐ์ฅ ์ฐ์ํ๊ณ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ ์คํฌ์
๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ window ๊ฐ์ฒด์ ์์๋ค ํ์ฌ๊ฐ ๋ง๋ ์ ์ญ ํจ์ window.KakaoLogin()์ ๋ถ์ด๊ณ ์ถ์ต๋๋ค.
// ์ผ๋ฐ TS ํ์ผ
window.KakaoLogin = () => { /* ... */ };
// โ ์๋ฌ: Property 'KakaoLogin' does not exist on type 'Window & typeof globalThis'.์ ์ธ ๋ณํฉ(Declaration Merging)์ ๋ถํ
์ฐ๋ฆฌ๋ 2์ฅ(Interface vs Type)์์ interface๋ ๋๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ ๋ฒ ์ ์ธํ๋ฉด ํฉ์ณ์ง๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ์ด๋ฅผ window ๊ฐ์ฒด์ ์ ์ฉํฉ๋๋ค.
// types/global.d.ts
export {}; // ์ด ํ์ผ์ ๋จ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ '๋ชจ๋'๋ก ์ธ์์ํค๊ธฐ ์ํ ๋ง๋ฒ์ ๋น ์ต์คํฌํธ
declare global {
// Window ์ธํฐํ์ด์ค๋ฅผ ์ด๊ณ ๋ด ๋ง๋๋ก ํ์ฅ!
interface Window {
KakaoLogin: () => void;
// ์ฌ๋ด ํ๊ฒฝ ๋ณ์ ๊ฐ์ ๊ฒ๋ ์ ์ญ์ผ๋ก ๋ฐ์๋ ์ ์๋ค.
YOUNGSOO_ENV: string;
}
}์ด๋ ๊ฒ ํ๋ฉด ํ๋ก์ ํธ ์ด๋์์๋ window.KakaoLogin()์ ํธ์ถํ ๋ ์๋ ์์ฑ์ด ๋จ๊ณ , ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. tsconfig.json์ strict: true ์ต์
์ ๋ฌด์์ ์๋ฏธํ๋์?
โ
์ ๋ต: ํ์
์คํฌ๋ฆฝํธ์ ๊ฐ์ฅ ์๊ฒฉํ ํ์
๊ฒ์ฌ๊ธฐ ์ต์
๋ค(noImplicitAny, strictNullChecks ๋ฑ)์ ํ๊บผ๋ฒ์ ์ผ์ฃผ๋ ๋ง์คํฐ ์ค์์น์
๋๋ค.
๐ก ์์ธ ํด์ค:
- ์ด ์ต์ ์ ์ผ์ง ์์ผ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๋ ์ฌ์ค์ "ํ์ดํ๋ ํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ" ์์ค์ ๋์จํ ์ธ์ด๋ก ์ ๋ฝํฉ๋๋ค.
- ์๊ธฐ์น ๋ชปํ ๋ฐํ์ Null ์๋ฌ๋ฅผ ๋ง๋
strictNullChecks์ ๋ฐฉํจ๋ฅผ ์๊ฒ ๋๋ฏ๋ก, ์ ๊ท ํ๋ก์ ํธ๋ผ๋ฉด ๋ฌด์กฐ๊ฑดtrue๋ก ์ค์ ํ๊ณ ์์ํ๋ ๊ฒ์ด 5๋ ์ฐจ์ ์ฒ ์น์ ๋๋ค.
Q2. ์์ํ .d.ts ์ ์ธ ํ์ผ ์์๋ ์ด๋ค ์ฝ๋๋ฅผ ์์ฑํ ์ "์๋"๊ฐ์?
โ
์ ๋ต: ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ฑฐ๋ ํจ์๊ฐ ๋์ํ๋ '๊ตฌํ๋ถ(Implementation)' ์ฝ๋๋ ์์ฑํ ์ ์์ต๋๋ค. (์: function add(a:number) { return a + 1 } ๊ฐ์ด ์ค๊ดํธ๋ก ์คํ๋๋ ์ฝ๋ ๋ถ๊ฐ)
๐ก ์์ธ ํด์ค:
.d.ts๋ ํ์ ์ ์ธ ์ ์ฉ ํ์ผ์ ๋๋ค. ์ค์ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํ(Emit)๋์ง ์๋ ํฌ๋ช ํ ํ์ผ์ ๋๋ค.- ์ค์ง
interface,type,declare module,declare var๋ฑ ๋ผ๋(Signature)๋ง์ ์ ํฌํ๋ ์ญํ ๋ง ์ํํฉ๋๋ค.
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ ์ญ ์ค์ผ ๋๋ ๋ง] ์์ฒ ์ด๊ฐ ์ธํ๋ผํ์ ์์ฒญ์ผ๋ก, ๋ชจ๋ฐ์ผ ์ฑ์์ ์น๋ทฐ(WebView)์ ์ฃผ์
ํด์ฃผ๋ ๋ธ๋ฆฟ์ง(Bridge) ๊ฐ์ฒด window.AppBridge.close()๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. VScode๋ ๊ณ์ window์ AppBridge๊ฐ ์๋ค๊ณ ํ๋ฅผ ๋ด๊ณ , ์์ฒ ์ด๋ ๋ ์ฒด๋
ํ๋ฉฐ (window as any).AppBridge.close()๋ฅผ ์๋๋ค. ํด๊ทผ ์ ์ด ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ ์ํธ ๋ฆฌ๋๋ ์ด๋ค ํด๋ฒ์ ์ ์ํ ๊น์?
โ
์ ๋ต: global.d.ts ํ์ผ์ ๋ง๋ค์ด declare global { interface Window { AppBridge: { close: () => void } } } ๋ก ์ฐ์ํ๊ฒ Window ์ธํฐํ์ด์ค๋ฅผ ํ์ฅ(Declaration Merging)ํด ์ค๋๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๋ด์ฅ ์ ์ญ ๊ฐ์ฒด(Window, Document, Array ๋ฑ)์ ํ์
์ TS ์ฝ์ด ์ ์ธ ํ์ผ์ ์ด๋ฏธ
interface๋ก ๋ฑ๋ก๋์ด ์์ต๋๋ค. 2์ฅ์์ ๋ฐฐ์ด '์ ์ธ ๋ณํฉ' ์๋ฆฌ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๊ฐdeclare global์ค์ฝํ ์์์ ๋์ผํ ์ด๋ฆ์Window์ธํฐํ์ด์ค๋ฅผ ๋ค์ ์ ์ธํ๊ณ ์ด์ ๋ถ์ฌ์ฃผ๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์์์ ํ๋๋ก ํฉ์ณ์ค๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ธ์ ๊น์ง
(window as any)๊ฐ์ ๊ตฌ์ ํดํน์ผ๋ก ์ฝ๋๋ฅผ ์ค์ผ์ํฌ ๊ฑด๊ฐ์? ๋ธ๋ฆฟ์ง ๊ฐ์ฒด๋ ์์ฐํ ํ์ฌ ์์ฐ์ ๋๋ค. ๋น๋นํ๊ฒ ๊ธ๋ก๋ฒ ์๋ฏผ(ํ์ )๊ถ์ ๋ถ์ฌํด ์ฃผ์ธ์." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๋ด ๋ง๋๋ก ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ์กฐํ๊ณ ์ถ๋ค๋ฉด?
declare global๊ณผinterface Window๋ฅผ ํฉ์ฒดํด๋ผ!
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
๐ก "๊ท์น์ ์ฐ๋ฆฌ๋ฅผ ์ต์ํ๋ ๊ฒ ์๋๋ผ, ๋คํต์๋ฅผ ๋ง๋ ๋ฐํ์ ์๋ฌ๋ก๋ถํฐ ์ฐ๋ฆฌ๋ฅผ ์ง์ผ์ฃผ๋ ๊ฐ์ฅ ๋จ๋จํ ๋ฐฉ์ด๋ฒฝ์ด๋ค."
๊ทธ๋์ tsconfig.json์ ๊ทธ๋ฅ React ๊น๋ฉด ๋ธ๋ ค์ค๋ ์๋ฏธ ์๋ ์ฅ์ํ์ธ ์ค ์์๋๋ฐ, ๊ทธ๊ฒ ๋ด VScode์ ๋ชจ๋ ์ง๋ฅ์ ํต์ ํ๋ ์ค์ ๊ด์ ํ์ด์๋ค๋.
๊ฒ๋ค๊ฐ ํญ์ ๋นจ๊ฐ ์ค ๋ฟ์ด๋ด๋ ์ธ๋ถ ๊ตฌํ ์คํฌ๋ฆฝํธ๋ค์ ๋ด ์์ผ๋ก declare module ํด์ ์์ ํ๊ฒ ๋ง๋ค๊ณ ๋๋๊น, ๋ง์น ๋ด๊ฐ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ด๊ฒจ ๋ธ(!) ๊ฒ ๊ฐ์ ์น๋ฆฌ๊ฐ๋ง์ ๋ ๋ค.
์ด์ ๋ ์ด์ window as any ๊ฐ์ ์์ฌ๋ฌผ์ ๋ด ์ฝ๋์ ๋จ๊ธฐ์ง ์๊ฒ ๋ค. ๋ด์ผ ๋ฐ๋ก ๋ธ๋ฆฟ์ง ๋ฉ์๋๋ค global.d.ts ์ ์ ๋ถ ํ์ดํํด์ ์ํธ ๋ฆฌ๋ ๋ํํ
๋ฆฌ๋ทฐ๋ฐ์์ผ์ง. ์ค๋ ํด๊ทผ ๋ฐ๊ฑธ์์ ์ ๋ํ ๊ฐ๋ณ๋ค!