๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Frontend Dev/TypeScript

VSCode์—์„œ TypeScript ํ™˜๊ฒฝ ์„ค์ •ํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

๐Ÿ‘พ VSCode์—์„œ TypeScript ํ™˜๊ฒฝ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

 ๋ณธ๊ฒฉ์ ์œผ๋กœ TypeScript ํ•™์Šต์„ ํ•˜๊ธฐ ์œ„ํ•ด VSCode์—์„œ ํ™˜๊ฒฝ ์„ค์ •์„ ํ–ˆ๋‹ค. ๊ณผ์ •์ด ๋งˆ๋ƒฅ ๋‹จ์ˆœํ•œ๊ฑด ์•„๋‹Œ๊ฒƒ ๊ฐ™์•„์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋‘๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ˜น์‹œ๋‚˜ ๋‹ค์Œ์— ๋‹ค์‹œ ๋ณด๊ฒŒ๋  ๋‚˜๋ฅผ ์œ„ํ•ด, ํ˜น์€ ๋‚˜์ฒ˜๋Ÿผ ์ฒ˜์Œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ์„ธํŒ…์„ ํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์œ„ํ•ด :)

 

1. ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (๐Ÿ“ learn-typescript)

# learn-typescript ํด๋”์—์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
npm init -y

 

โœจ OPTION. scripts ๋ช…๋ น์–ด๋กœ build์™€ start ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ package.json ์„ค์ •

{
  "name": "learn-typescript",
  "version": "1.0.0",
  "description": "",
  "main": "index.js", // ์‚ญ์ œ
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1", // ์‚ญ์ œ
    "build": "tsc",  // ์ถ”๊ฐ€
    "start": "node dist/index.js" // ์ถ”๊ฐ€ ( node [index.js ํŒŒ์ผ์ด ๋‹ด๊ธฐ๋Š” ํด๋”๋ช…] )
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": { // → 2. Typescript ์„ค์น˜
    "typescript": "^5.1.6"
  }
}

 

2. Typescript ์„ค์น˜

# --save-dev์™€ -D๋Š” ๊ฐ™์€ ์˜๋ฏธ
npm install -D typescript 
npm install typescript --save-dev
// --save-dev๋ฅผ ํ•˜๋ฉด devDependencies์— typescript๊ฐ€ ์„ค์น˜๋œ๋‹ค.
"devDependencies": {
  "typescript": "^5.1.6"
}

โ—๏ธํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐœ๋ฐœ ์‹œ์ ์—๋งŒ ํ•„์š”ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์‹œ์ ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ์˜์กด์„ฑ(dev dependency)์œผ๋กœ ์„ค์น˜ํ•œ๋‹ค.

 

3. tsconfig.json ์ƒ์„ฑ ๋ฐ ์„ธํŒ…

 ํ„ฐ๋ฏธ๋„ ๋˜๋Š” ์ง์ ‘ tsconfig.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ž‘์„ฑํ•œ๋‹ค. 

# ํ„ฐ๋ฏธ๋„์—์„œ tsconfig.json ์ƒ์„ฑ
touch tsconfig.json
// tsconfig.json

{
  "include": ["src"], // ์œ„์น˜์ง€์ • : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ src์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ํ™•์ธํ•œ๋‹ค๋Š” ์˜๋ฏธ

  // compilerOptions ๋‚ด์˜ ์†์„ฑ์€ ์ž์œ ๋กญ๊ฒŒ ์ปค์Šคํ…€ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  "compilerOptions": {
    "outDir": "./dist", 
    /* 
      outDirecory : ์ปดํŒŒ์ผ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๋””๋ ‰ํ† ๋ฆฌ 
      (→ ./dist ๋ผ๋Š” ํด๋”์— ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ)
    */
    "target": "ES6",
    /* 
      target : ์–ด๋–ค ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํŒŒ์ผํ• ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
      Create-React-App์ด๋‚˜ NextJS, NestJS๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์“ด๋‹ค๋ฉด ์•Œ์•„์„œ ์ƒ์„ฑํ•ด์ฃผ๋‹ˆ ์‹ ๊ฒฝ์“ธ ํ•„์š” ์—†์Œ.
    */
    "lib": ["ES6", "DOM"],
    /*
      lib : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์–ด๋–ค API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ง€๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.
      ํ”„๋กœ๊ทธ๋žจ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋ฉด "DOM" ์œ ํ˜• ์ •์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. (DOM ์œ ํ˜• ์ •์˜์‹œ ๊ด€๋ จ ์ž๋™์™„์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌ)
    */
    "strict": true, // ๋ชจ๋“  ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ์˜ต์…˜์„ ํ™œ์„ฑํ™”. strictํ”Œ๋ž˜๊ทธ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ •ํ™•์„ฑ์„ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ณด์žฅํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ๋™์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
    "allowJs": true, // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ—ˆ์šฉํ•จ.
    "module": "CommonJS", // ๋ธŒ๋ผ์šฐ์ € ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ์œผ๋ฉด "umd"๋ฅผ ์„ ํƒํ•˜๋ฉด ๋จ
    "sourceMap": true, // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(์›๋ณธ) => ์ปดํŒŒ์ผ => ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(๋ณ€ํ™˜)

    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true
    /*
      esModuleInterop : 
      ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ†ตํ•ด CommonJS์™€ ES ๋ชจ๋“ˆ ๊ฐ„์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์ œ๊ณต

      allowSyntheticDefaultImports : 
      default export๊ฐ€ ์—†๋Š” ๋ชจ๋“ˆ์—์„œ default imports๋ฅผ ํ—ˆ์šฉ
      ์ฝ”๋“œ ๋ฐฉ์ถœ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉฐ, ํƒ€์ž… ๊ฒ€์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    */
  }
}

๐Ÿ’ฌ tsconfig.json๊ฐ€ ์žˆ์œผ๋ฉด VSCode๋Š” ์šฐ๋ฆฌ๊ฐ€ typescript๋กœ ์ž‘์—…์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋œ๋‹ค.

 

๐Ÿ”— ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ ์ฐธ๊ณ  : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ณต์‹๋ฌธ์„œ

 

๐Ÿ“˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ ์„ค์ • - tsconfig ์˜ต์…˜ ์ด์ •๋ฆฌ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ ์„ค์ • tsconfig.json์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ ์‹œํ‚ค๋Š” ์ปดํŒŒ์ผ ์„ค์ •์„ ํ•œ๊บผ๋ฒˆ์— ์ •์˜ ํ•ด๋†“๋Š” ํŒŒ์ผ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผ ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฃจํŠธ ํŒŒ์ผ,

inpa.tistory.com

 

[TypeScript] ์ปดํŒŒ์ผ ์˜ต์…˜ ์‚ดํŽด ๋ณด๊ธฐ (TSConfig Reference)

TSConfig Reference - Docs on every TSConfig option From allowJs to useDefineForClassFields the TSConfig reference includes information about all of the active compiler flags setting up a TypeScript project. www.typescriptlang.org TSConfig ํŒŒ์ผ์ด ์œ„์น˜

it-eldorado.tistory.com

 ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ๋„ ํ•˜๊ณ  ์–ด๋ ต๋‹ค๊ณ  ๋Š๊ปด์ ธ์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋น„๋กฏํ•œ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

4. index.ts ์ƒ์„ฑ (๐Ÿ“ learn-typescript > src)

 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

 

// index.ts
const sum = (a: number, b:number) => {
  return a + b
}

console.log(sum(10, 20));

 

5. index.ts → index.js๋กœ ์ปดํŒŒ์ผ

 ๋ธŒ๋ผ์šฐ์ €๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ํ•ด์„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ž‘์„ฑํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌ์‹œ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 ํ„ฐ๋ฏธ๋„์— tsc๋ฅผ ์ž…๋ ฅํ•˜๋ฉด tsconfig.json ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์ปดํŒŒ์ผ์„ ์‹คํ–‰ํ•œ๋‹ค. 

 

# tsconfig.json์— ๋Œ€ํ•œ fs๋ฅผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒ€ํ† ํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹คํ–‰
tsc

# ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ index.ts๋งŒ ํŠธ๋žœ์ŠคํŒŒ์ผ
tsc index.ts

# ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ src ํด๋” ์•ˆ์— ๋ชจ๋“  .ts ํŒŒ์ผ์„ ํŠธ๋žœ์ŠคํŒŒ์ผ
tsc src/*.ts

# tsconfig.json์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์„ค์ •์œผ๋กœ src ํด๋” ์•ˆ์— ๋ชจ๋“  .ts ํŒŒ์ผ์„ ํŠธ๋žœ์ŠคํŒŒ์ผ
tsc --project tsconfig.json src/*.ts

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ณต์‹๋ฌธ์„œ ์ถœ์ฒ˜

 

tsc --project ./tsconfig.json

 

โฌ‡๏ธŽ compile โฌ‡๏ธŽ

 

์ปดํŒŒ์ผ์„ ํ•˜๋ฉด dist ํด๋”์— index.js ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

// index.js
const sum = (a, b) => {
    return a + b;
};
console.log(sum(10, 20));
//# sourceMappingURL=index.js.map

dist > index.js

 ์ปดํŒŒ์ผ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 


 

โœจ OPTION. ์ปดํŒŒ์ผ๊ณผ ์‹คํ–‰(build & start)์„ ๋™์‹œ์— ํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 1. package.json์˜ script์— build, start ์ถ”๊ฐ€

// package.json
"scripts": {
  "build": "tsc",  
  "start": "node dist/index.js" // node [index.js ํŒŒ์ผ์ด ๋‹ด๊ธฐ๋Š” ํด๋”๋ช…]
},
# build์™€ start๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ npm build์™€ start ๊ฐ€ ํ•จ๊ป˜ ๊ฐ€๋Šฅํ•˜๋‹ค.
npm run build && npm start

npm run build && npm start ์ž…๋ ฅ์‹œ ๋‘ ๊ฐ€์ง€ ์ž‘์—…์ด ํ•จ๊ป˜ ์ง„ํ–‰๋œ๋‹ค.

 

๋ฐฉ๋ฒ• 2. ts-node & nodemon ํ™œ์šฉํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ ํ™•์ธ

 nodemon์„ ํ™œ์šฉํ•ด TypeScript ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‹คํ–‰์ˆ˜ ์žˆ๋‹ค. ์ˆ˜์ • ํ›„ ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์–ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 ๐Ÿ‘€ nodemon์€ node monitor์˜ ์•ฝ์ž๋กœ, ๋…ธ๋“œ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ํŒŒ์ผ์ด ์†ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด ์ž๋™์œผ๋กœ ๋…ธ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์‹œ์ž‘ํ•˜๋Š” ํ™•์žฅ ๋ชจ๋“ˆ์ด๋‹ค. nodemon์„ ์„ค์น˜ํ•˜๋ฉด ์žฌ์‹œ์ž‘ ์—†์ด ์ฝ”๋“œ๋ฅผ ์ž๋™ ๋ฐ˜์˜ ํ• ์ˆ˜ ์žˆ๋‹ค.

# ๊ฐœ๋ฐœ์‹œ์—๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ -D(--save-dev) ์˜ต์…˜์œผ๋กœ ์„ค์น˜
npm i -D nodemon
npm i -D ts-node
// package.json script ์„ค์ •
"scripts": {
  "dev": "nodemon --exec ts-node src/index.ts"
},
# ์‹คํ–‰
npm run dev

# ์ข…๋ฃŒ (Mac)
control C

# JS๋กœ ์ปดํŒŒ์ผ์‹œ tsc๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

ts-node & nodemon ์‚ฌ์šฉ

 

โž• ts-node๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š๊ณ  ts ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 nodemon์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ts-node๋งŒ ์‚ฌ์šฉํ•ด๋„ TypeScript ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

# ๊ฐœ๋ฐœ์‹œ์—๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ -D(--save-dev) ์˜ต์…˜์œผ๋กœ ์„ค์น˜
npm i -D ts-node

 ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋Š” ์•„๋‹ˆ๊ณ  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋น ๋ฅด๊ฒŒ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋นŒ๋“œํ•œ ๋‹ค์Œ์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ts-node๊ฐ€ ์ปดํŒŒ์ผํ•  ํ•„์š”์—†์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ€์‹  ์‹คํ–‰ํ•ด์ค€๋‹ค.

 

// package.json script ์„ค์ •
"scripts": {
  "dev": "ts-node src/index"
},
# ์‹คํ–‰
npm run dev

# JS๋กœ ์ปดํŒŒ์ผ์‹œ tsc๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

ts-node ์‚ฌ์šฉ

 

๐Ÿ“Œ nodemon์€ ํŒŒ์ผ ์ €์žฅ์‹œ ์ž๋™์œผ๋กœ ๋ฐ˜์˜์ด ๋˜๊ณ , ts-node๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์— ๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ts-node๋งŒ ์‚ฌ์šฉํ•˜๋“ , nodemon๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋“  ์ปดํŒŒ์ผ์€ ๋”ฐ๋กœ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ JS๋กœ ์ปดํŒŒ์ผ์„ ์›ํ•œ๋‹ค๋ฉด tsc ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 


โœ๏ธ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ •๋ณด๋‚˜ ๋” ๊ณต์œ ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š

๋ฐ˜์‘ํ˜•