tsconfig & tsd

movieยท2022๋…„ 10์›” 1์ผ
1
post-thumbnail

โš™๏ธ tsconfig

tsconfig๋ฅผ ์„ค์ •ํ•˜๋Š” ์ด์œ ๋Š”?

  • vscode๊ฐ€ typescript๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์–ด
    • vscode์˜ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ root์— ๋ฐ˜๋“œ์‹œ tsconfig๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • tsc๊ฐ€ typescript๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์–ด

๋‚ด๊ฐ€ ์จ๋ดค๋˜ ์„ค์ •์€?

์ข…๋ฅ˜

  • ํŒŒ์ผ ๊ด€๋ จ ์„ค์ •
  • ์ปดํŒŒ์ผ ๊ด€๋ จ ์„ค์ •
    • JS ๋ฌธ๋ฒ• ๊ด€๋ จ
    • ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ด€๋ จ
    • ์„ ์–ธ ํŒŒ์ผ ๊ด€๋ จ (d.ts)
    • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ

๐Ÿ“‚ ํŒŒ์ผ ๊ด€๋ จ ์„ค์ •

  • files, include, exclude : ์›ํ•˜๋Š” ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ณ , ์ œ์™ธํ•˜๋Š” ์„ค์ •
  • ๊ฒฝ๋กœ๋Š” tsconfig.json์˜ ์œ„์น˜์—์„œ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

files

  • ์›ํ•˜๋Š” ํŒŒ์ผ๋งŒ tsc๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ํ„ฐ๋ฏธ๋„์—์„œ tsc target.ts ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

include

  • ํ”„๋กœ๊ทธ๋žจ์— ํฌํ•จํ•  ํŒŒ์ผ ์ด๋ฆ„ ๋˜๋Š” ํŒจํ„ด์˜ ๋ฐฐ์—ด์„ ์ง€์ •ํ•œ๋‹ค.
  • pattern ํ˜•ํƒœ๋กœ ์›ํ•˜๋Š” ํŒŒ์ผ ๋ชฉ๋ก์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

exclude

  • include์— ์ง€์ •ํ•œ ํŒŒ์ผ์ด๋‚˜ ํŒจํ„ด์„ ์ œ์™ธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ["node_modules", "bower_components", "jspm_packages"] ์™€ย outDir์— ์ง€์ •ํ•œ ๊ฒฝ๋กœ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’

๐Ÿ“‚ ์ปดํŒŒ์ผ ๊ด€๋ จ ์„ค์ • (compilerOptions)

  • ์ปดํŒŒ์ผ ๊ด€๋ จ ์„ค์ •
    • JS ๋ฌธ๋ฒ• ๊ด€๋ จ
    • ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ด€๋ จ
    • ์„ ์–ธ ํŒŒ์ผ ๊ด€๋ จ (d.ts)
    • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ

target (:js ๋ฌธ๋ฒ• ๊ด€๋ จ)

  • ์ปดํŒŒ์ผ๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ๋ฌธ๋ฒ• ํ˜•ํƒœ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์€ ES3
  • ๋งŒ์•ฝ ES5๋ฅผ ์„ ํƒํ•˜๋ฉด ํ™”์‚ดํ‘œํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ(function) ํ˜•ํƒœ๋กœ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค. (ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ด์ „)
  • esnext : ES6 ์ดํ›„ ๋ฒ„์ „๋“ค์„ ํ†ตํ‹€์–ด esnext๋ผ๊ณ  ํ•œ๋‹ค.

module (:๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ด€๋ จ)

  • ์ปดํŒŒ์ผ๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ์‚ฌ์šฉํ•  module ๋ฐฉ์‹
  • ๋งŒ์•ฝ commonjs๋ฅผ ์„ ํƒํ•œ๋‹ค๋ฉด require ์‚ฌ์šฉ, es6~๋Š” import ์‚ฌ์šฉ

esModuleInterop (:๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ด€๋ จ)

  • module ์‹œ์Šคํ…œ์ด ํ˜ผ์žฌ๋˜์–ด ์žˆ์„ ๋•Œ esModuleInterop: true๋ฉด ํ˜ธํ™˜ํ•ด์ค€๋‹ค.
  • ๋งŒ์•ฝ module1์ด commonjs๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์–ด export ๋˜์–ด ์žˆ๋‹ค๋ฉด esmodule ๋ฐฉ์‹์œผ๋กœ module1์„ importํ•  ๋•Œ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์˜ต์…˜

isolatedModules (:๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ด€๋ จ)

  • ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค ๊ฒƒ์„ ๊ฐ•์ œํ•œ๋‹ค.
  • isolatedModules: true๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“ˆ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋งŒ์•ฝ ํŒŒ์ผ์—์„œ import / export๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ทธ ํŒŒ์ผ์€ ์ „์—ญ ๊ณต๊ฐ„์œผ๋กœ ์ •์˜๋œ๋‹ค.

moduleResolution (:๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ด€๋ จ)

  • ๋ชจ๋“ˆ ํ•ด๊ฒฐ ์ „๋žต ์„ค์ • (module์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์–ด๋””๋ฅผ ๋ด์•ผํ• ๊นŒ?)
  • classic vs node

์ƒ๋Œ€์  vs ๋น„์ƒ๋Œ€์  ๋ชจ๋“ˆ import

  • ์ƒ๋Œ€์  : /, ./, ../ ์ค‘ ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๋น„์ƒ๋Œ€์  : ์ด์™ธ์˜ ๋ชจ๋“ˆ์€ ๋ชจ๋‘ ๋น„์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.
    • baseUrl๋กœ ํ•ด์„๋˜๊ฑฐ๋‚˜, ambient ๋ชจ๋“ˆ ์„ ์–ธ์œผ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค.
  • node: moduleResolution์„ node๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ node.js ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์„ ์ฐพ๋Š”๋‹ค.
  • classic : ์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • You probably wonโ€™t need to useย classic in modern code

declaration (:d.ts ๊ด€๋ จ)

  • declaration: true tsํŒŒ์ผ์˜ d.ts๋„ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

declarationDir (:d.ts ๊ด€๋ จ)

  • ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋กœ ๋งŒ๋“ค์–ด์ง„ d.ts ํŒŒ์ผ๋“ค๋งŒ ๋”ฐ๋กœ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

emitDeclarationOnly (:d.ts ๊ด€๋ จ)

  • emitDeclarationOnly: true ๋ผ๋ฉด ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋กœ d.ts ํŒŒ์ผ๋งŒ ์ƒ์„ฑ๋œ๋‹ค.

skipLibCheck (์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ, d.ts ๊ด€๋ จ)

  • skipLibCheck: true์˜ ๊ฒฝ์šฐ d.ts ํƒ€์ž… ์ฒดํฌ๋ฅผ ์ƒ๋žตํ•œ๋‹ค.
  • ๊ฐœ๋ฐœ์ž์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ํƒ€์ž… ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ€์ž… ์ •์˜๊ฐ€ ์ž˜๋ชป๋˜์–ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๊ฒฝ์šฐ ์œ ์šฉํ•œ ์˜ต์…˜
  • ๋Œ€๋ถ€๋ถ„์˜ d.ts๋Š” ์™ธ๋ถ€์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. (๊ฐœ๋ฐœ์ž์˜ ํ”„๋กœ์ ํŠธ์—์„œ d.ts๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์ง€ ์•Š๋‹ค. ์ผ๋ฐ˜ typescript ํ”„๋กœ์ ํŠธ์—์„œ๋Š” type ์ •์˜๋ฅผ ts ํŒŒ์ผ์—์„œ ํ•˜๊ณ , export, importํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.)



tsd ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • https://www.npmjs.com/package/tsd
  • type ์„ ์–ธ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (d.ts ํŒŒ์ผ ๋“ฑ)
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํŒŒ์ผ์ธ .test-d.ts ํŒŒ์ผ์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  1. d.ts ์„ ๋งŒ๋“ค์–ด์„œ ํŒŒ์ผ ์•ˆ์— ํƒ€์ž… ์„ ์–ธ์„ ํ•ด์ค€๋‹ค. (๋‚ด๊ฐ€ ๋งŒ๋“ค module์ด๋‚˜, function, value์— ๋Œ€ํ•œ ํƒ€์ž…)
declare function _(selector: string): string;

export default _;
  1. test ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ ํ•ด์ค€๋‹ค. (๋‚˜๋Š” ์ด๋ฆ„์„ test.d.ts๋กœ ํ•ด์ฃผ์—ˆ๋‹ค.)
import { expectType } from 'tsd';

import _ from '../../src/index.d';

expectType<string>(_('string')); 
expectType<number>(_('string')); // ERROR
  1. npx tsd๋ฅผ ํ†ตํ•ด ํƒ€์ž… ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

๋งŒ์•ฝ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•œ๋‹ค๋ฉด ์•„๋ฌด ์„ค๋ช…๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ ,
์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์„ค์ •

  1. package.json์—์„œ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
{
	"name": "ts-module",
	
	...
	"tsd": {
		...
	}
}
  1. ๋‚ด๊ฐ€ ํ•ด์ค€ ์„ค์ •

์šฐ์„  ๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ์ด๋ ‡๋‹ค.

root 
	๐Ÿ“‚ __tests__
		๐Ÿ“‚ @types
			๐Ÿ“„ type.test.ts
		
		... ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๊ด€๋ จ ํŒŒ์ผ๋“ค (jest ๋“ฑ) 

"tsd": {
		"directory": "./__tests__/@types"
}

@types๋กœ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š” ํ…Œ์ŠคํŠธ ๋‹จ์œ„๋ฅผ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ฌถ๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

tsd.directory

  • ํ…Œ์ŠคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์€ ์„ค์ •์€ compilerOptions์ด๋‹ค.

compilerOptions

  • ํ”„๋กœ์ ํŠธ์•ˆ tsconfig.json์ด ์กด์žฌํ•  ๋•Œ overrideํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งŒ์•ฝ vscode์˜ type checker์™€ ์„ค์ •์„ ๋‹ค๋ฅด๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๋ฉด ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
    (moduleResolution ์˜ต์…˜์€ override ๋ถˆ๊ฐ€๋Šฅ)

tsd์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ• ๊นŒ?

expectType์˜ ๊ตฌํ˜„๋ถ€๋Š” ์ด์™€ ๊ฐ™๋‹ค.

/**
 * Asserts that the type of `expression` is identical to type `T`.
 *
 * @param expression - Expression that should be identical to type `T`.
 */
// @ts-expect-error
const expectType = (expression) => {
    // Do nothing, the TypeScript compiler handles this for us
};
exports.expectType = expectType;
// d.ts

/**
 * Asserts that the type of `expression` is identical to type `T`.
 *
 * @param expression - Expression that should be identical to type `T`.
 */
export declare const expectType: <T>(expression: T) => void;

๋ณด๋ฉด ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”๊ฒŒ ์—†๋‹ค. ์˜ˆ์ƒํ•ด๋ณด๋ฉด ๊ทธ๋ƒฅ type checker์—๊ฒŒ ๋งก๊ฒจ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

์•„๋งˆ๋„ ์–ด๋ ค์šด ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.
์ด๋ฒˆ ๋ฏธ์…˜์—์„œ omit์ด๋ผ๋Š” ์œ ํ‹ธํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ–ˆ๊ณ , ์ด์— ๋Œ€ํ•œ ํƒ€์ž…๋„ ์ง€์ •ํ•ด์ค˜์•ผ ํ–ˆ๋‹ค.
์—ฌ๋Ÿฌ ํฌ๋ฃจ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ , ๊ฒฐ๋ก ์€ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์™”๋‹ค.

function omit<T extends object, K extends keyof T>(
    object: T,
    target: K | K[]
): Omit<T, K>

// ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ ๊ฐ์ฒด์—์„œ (object)
// ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ ํ”„๋กœํผํ‹ฐ(target)๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค. 

tsd๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์ด ํ‹€๋ ธ๋Š”์ง€ ์•„๋‹Œ์ง€ ์‰ฝ๊ฒŒ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์—ฌ๋Ÿฌ assertions(expectType, expectNotType ๋“ฑ)๋ฅผ ํ™œ์šฉํ•ด๋ณด๋ฉด ์ •ํ™•ํžˆ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

expectType<Omit<{ a: 'a'; b: 'b' }, 'a'>>(omit({ a: 'a', b: 'b' }, 'a'));
// c๋ฅผ ๋บ์œผ๋‹ˆ a, b๋งŒ ํฌํ•จํ•ด์•ผ ๋œ๋‹ค. 

expectNotType<{ a: 'a'; b: 'b'; c: 'c' }>(
  omit({ a: 'a', b: 'b', c: 'c' }, 'c')
);
// c๋ฅผ ๋บ์œผ๋‹ˆ c๋Š” ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค. 

expectError<{ a: 'a'; b: 'b'; c: 'c' }>(
  omit({ a: 'a', b: 'b', c: 'c' }, 'c')
);
// c๊ฐ€ return ํƒ€์ž…์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. 

๋˜, ts-loader๋ฅผ ์“ฐ๋Š” ์ด์œ ์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, ts-loader๋Š” babel-loader์™€ ๋‹ฌ๋ฆฌ ํƒ€์ž… ์ฒดํ‚น๋„ ์ง„ํ–‰ํ•œ๋‹ค. ํ•˜์ง€๋งŒ vscode์—๋Š” type checker๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด์„œ ์ด๋ฏธ ํƒ€์ž… ์ฒดํ‚น์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค. ์ด์— ๋˜ ts-loader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ฒดํ‚น์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. (vscode type checker๊ฐ€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ œ๋Œ€๋กœ type checking์— ์‹คํŒจํ•ด์„œ ๋Ÿฐํƒ€์ž„์— ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ ์•„์˜ˆ ์ฐจ๋‹จ)

tsd๋„ ๋น„์Šทํ•œ ๋งฅ๋ฝ์ด ์•„๋‹๊นŒ ๐Ÿ˜€




์ฐธ๊ณ 

profile
์˜ํ™”๋ณด๊ด€์†Œ๋Š” ์˜ํ™”๊ด€ ๐Ÿ˜Ž

4๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 10์›” 1์ผ

ํ™œ๋ฐœํ•œ ํฌ์ŠคํŒ… ๋ณด๊ธฐ์ข‹๋„ค์š” :)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 10์›” 1์ผ

์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค~

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2024๋…„ 2์›” 13์ผ

Cooooool

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2024๋…„ 2์›” 13์ผ

Amidst the fragrant aroma of freshly brewed coffee, I settled into my seat for an evening of cinematic indulgence, eager to lose myself in the enchanting world of storytelling. Tonight's film offered an opportunity to challenge my perceptions and explore uncharted territories, and I embraced it with enthusiasm. With each unfolding https://gidonline-io.online/ scene, I admired the craftsmanship and ingenuity of the filmmakers, who brought their vision to life with breathtaking visuals and compelling narratives. From expansive landscapes to intimate character moments, I was transported to a universe of endless possibilities. In those exhilarating moments, I felt a sense of wonder and excitement, as if I were embarking on a grand adventure of my own.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ