Logo
Hyunsu Blog
js_closure

๐Ÿ“†Published :Mar 20, 2024 โ€ข

๐Ÿ“†Updated :Mar 20, 2024 โ€ข

โ˜•๏ธ3min

ํด๋กœ์ €๋ฅผ ์ œ๋Œ€๋กœ ์•Œ์ง€ ๋ชปํ•ด ๋ฌธ์ œ ์ •์˜๋ฅผ ์ž˜๋ชปํ•œ ์ ์ด ์žˆ๋‹ค.

๋“ค์–ด๊ฐ€๋ฉด์„œ

์ด๋ฒˆ ๊ธ€์€, closure์— ๋Œ€ํ•œ ์˜คํ•ด ๊ฒฝํ—˜๊ณผ ์•Œ์•„๊ฐ€๋ฉด์„œ ์ƒ๊ธด ๊ถ๊ธˆ์ฆ๋“ค์„ ์ •๋ฆฌํ•˜๋Š” ๊ธ€์ด๋‹ค. ์ด ๊ธ€์€ ์‹œ๋ฆฌ์ฆˆ๋กœ ์ž‘์„ฑ ๋˜์–ด์งˆ ์˜ˆ์ •์ด๋‹ค. ์ง€๊ธˆ ๊ธ€์€ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์™€ ํด๋กœ์ € ๊ฐœ๋…์˜ ์—ฐ๊ฒฐ์ ์„ ์ค‘์‹ฌ์œผ๋กœ ํด๋กœ์ €๊ฐ€ ๊ด€์ฐฐ ๋˜๋Š” ์ƒํƒœ์™€ ์•„๋‹Œ ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•œ ํด๋กœ์ € ๊ฐœ๋…์— ์ดˆ์ ์„ ๋งž์ถ”์—ˆ๋‹ค. ์ „์—ญ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€๋ฅผ ํ•ด๋ถ€ ํ•˜๋Š” ๊ธ€์ด ๋‹ค์Œ ๊ธ€์ด ๋  ๊ฒƒ์ด๋‹ค.

์˜คํ”ˆ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์œ ์ €๊ฐ€ Drawer๋ฅผ ํ† ๊ธ€ ํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ฒ˜๋ฆฌ์—์„œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ์›์ธ์„ ํด๋กœ์ €๋กœ ์ธํ•ด ์ƒํƒœ๊ฐ’์ด ์บก์ณ๋ง ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋ฌธ์ œ ์ •์˜๋ฅผ ์• ์ดˆ์— ์ž˜๋ชปํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค. ์ด ๋•Œ ๋‚ด๊ฐ€ ์ •์˜ํ•œ ์บก์ณ๋ง์ด ์™„์ „ ์ž˜๋ชป ๋˜์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

ํด๋กœ์ €์— ๋Œ€ํ•ด ์ •ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ๋”๋ผ๋ฉด, ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋” ๋นจ๋ฆฌ ๋„๋‹ฌ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.


ํด๋กœ์ € ํ˜„์ƒ ํŒŒ์•… ํ•˜๊ธฐ

๋จผ์ € ํด๋กœ์ € ํ˜„์ƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋‹ค.

let str0 = "str0"; function func1() { let str1 = "str1"; console.log(str0, str1, str2); } function func2() { let str2 = "str2"; console.log(str0, str1, str2); } console.log(str0, str1, str2); func1(); func2();

์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” ํฌ๋กฌ์˜ devtools์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ ค ๋ณด์•˜๋‹ค. (๋ธŒ๋ผ์šฐ์ €, IDE ๋งˆ๋‹ค scope์˜ ์ด๋ฆ„์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค.) ์ด๋ฏธ์ง€์˜ ์ œ์ผ ์™ผ์ชฝ์— ์žˆ๋Š” container๊ฐ€ ์ฝœ์Šคํƒ์ด๋‹ค. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ ๋งˆ๋‹ค ์ฝœ์Šคํƒ์— ์Œ“์ด๊ณ , ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด ์Šค์ฝ”ํ”„๊ฐ€ ๋ฐ”๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํšจ๋ฒ”์œ„์— ํ•ด๋‹นํ•œ๋‹ค.

alt text

func1() ๋‚ด์—์„œ str0 ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ์‹คํ–‰ ๋˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” str0์„ ์ฐพ๋Š”๋‹ค.

์œ ํšจ ๋ฒ”์œ„์˜ ์‹œ์ž‘์€ ํ˜„์žฌ ๋ณด์ด๋Š” scope ๊ธฐ์ค€์œผ๋กœ local scope๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์—†์œผ๋ฉด global scope๋กœ ์˜ฌ๋ผ๊ฐ€์„œ ์ฐพ๋Š”๋‹ค. ์™œ local str1์ด local scope์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด let, var, const ์˜ ์œ ํšจ๋ฒ”์œ„์— ๋Œ€ํ•œ ์„ ํ–‰ ์ง€์‹์ด ํ•„์š”ํ•˜๋‹ค. script scope์— str0์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— str0์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ func1()์—์„œ str2๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ์ด์œ ๋Š” str2๋Š” func1() ์˜ ์Šค์ฝ”ํ”„์—์„œ๋Š” ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.

๊ทธ๋Ÿผ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ณด์ž.

func2() ํ˜ธ์ถœ์„ func1()๋‚ด๋กœ ์˜ฎ๊ฒจ ๋ณธ๋‹ค.

let str0 = "str0"; function func1() { let str1 = "str1"; console.log(str0, str1, str2); func2(); } function func2() { let str2 = "str2"; console.log(str0, str1, str2); } console.log(str0, str1, str2); func1();

func2()๋ฅผ func1()์—์„œ ํ˜ธ์ถœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— str1์„ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, func2()๋ผ๋Š” ํ•จ์ˆ˜์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์ƒ์„ฑ๋œ ์ˆœ๊ฐ„, func2()์˜ ์œ ํšจ๋ฒ”์œ„๋Š” func1()์˜ ์œ ํšจ๋ฒ”์œ„์™€๋Š” ๋‹ค๋ฅด๋‹ค. str1์„ ์ฐธ์กฐ ํ•  ์ˆ˜ ์—†๋‹ค.

์ด์ œ ํด๋กœ์ €์ธ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

export function func1() { const func2 = () => { let str2 = "str2"; console.log(str1, str2); //"str1str2" return str1 + str2; }; let str1 = "str1"; console.dir(func2); // console.log(str1, str2) func2(); } func1();

scope์— closure๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ์ด ๋˜์—ˆ๋‹ค. ์ฆ‰ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์—ˆ๋˜ str1์„ func2ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์œ„์น˜๋ฅผ func1() ๋‚ด๋กœ ๋ณ€๊ฒฝํ•˜๋‹ˆ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

img.png

๋‹ค์Œ์€ ์ธํ…”๋ฆฌ์ œ์ด์—์„œ ํด๋กœ์ €๋ฅผ ๋””๋ฒ„๊น…ํ•œ ํ™”๋ฉด์ด๋‹ค. console.dir(function2) ์—์„œ [[Scopes]] ๋‚ด closure๋กœ str1์„ ์ฐธ์กฐ ํ•˜๊ณ  ์žˆ๋‹ค.

intellij_closure_debugger

์™ธ๋ถ€ ํ•จ์ˆ˜ func1()์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜ func2()์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, func2()์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ์‚ด์•„ ์žˆ๊ณ ,

ํด๋กœ์ €์˜ ๊ฐœ๋… ์ค‘์—์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ํ•  ๋•Œ์˜ ๋ณ€์ˆ˜์™€ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•ด์„œ ๋…๋ฆฝ์ ์ธ ํด๋กœ์ €๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค๋Š” ๋ง์ด ์žˆ๋Š”๋ฐ, ํŠน์ •์‹œ์ ์˜ ๊ฐ’์„ ๋ณด์กดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌํƒœ ์˜คํ•ดํ•œ ํด๋กœ์ €์˜ ๊ฐœ๋…์ด์—ˆ๋‹ค. ์บก์ณ๋ง ํ˜น์€ ์Šค๋ƒ…์ƒท์˜ ์˜๋ฏธ๋กœ ์ž˜๋ชป ์ดํ•ด ํ•˜์—ฌ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์ง€ ์•Š๋Š” ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ํด๋กœ์ €์— ์˜ํ•ด ์บก์ฒ˜๋˜๋Š” ๊ฒƒ์€ ๋ณ€์ˆ˜ ์ž์ฒด์˜ "๊ฐ’"์ด ์•„๋‹ˆ๋ผ, ๋ณ€์ˆ˜์— ๋Œ€ํ•œ "์ฐธ์กฐ" ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ๋•Œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ฐ˜์˜๋œ๋‹ค. You Don't Know JS ์ฑ…์—์„œ๋Š” ํด๋กœ์ €๋ฅผ "๋ผ์ด๋ธŒ ๋งํฌ"๋กœ ํ‘œํ˜„ ํ–ˆ๋‹ค. ์ด์ œ ์™œ ๋ผ์ด๋ธŒ ๋งํฌ์ธ์ง€ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค.

์นด์ผ ์‹ฌ์Šจ ์ฑ…์„ ๋ณด๊ณ  ์žˆ๋˜ ์ค‘, ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ˆ์‹œ๊ฐ€ ์žˆ์—‡๋‹ค. ์ด๊ฑด ํด๋กœ์ €๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?

let hits; { let count = 0; hits = function () { count++; console.log(count); }; } hits(); // 1 hits(); // 2 hits(); // 3

ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•œ count ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋ฐ–์˜ ์Šค์ฝ”ํ”„์—์„œ ์ •์˜๋œ count๋ฅผ ์ฐธ์กฐ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜ ๋ฐ–์˜ ์Šค์ฝ”ํ”„๊ฐ€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹Œ ๋ธ”๋Ÿญ ์Šค์ฝ”ํ”„ ์ด๋‹ค. ๋””๋ฒ„๊น… ํ•ด๋ณด๋ฉด hits ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์—๋Š” closure๊ฐ€ ์—†๋‹ค.

img.png

๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ๋„ ํด๋กœ์ € ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๊ทธ๋ ‡๋‹ค๊ณ  ํ•œ๋‹ค. ํด๋กœ์ €์˜ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜์—์„œ ์œ ๋ž˜ํ•˜์ง€๋งŒ, ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์ผ ํ•„์š”๋Š” ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๋Š” ์™ธ๋ถ€ ์Šค์ฝ”ํ”„(ํ•จ์ˆ˜, ๋ธ”๋ก)๊ฐ€ ์žˆ์œผ๋ฉด ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

[[Scopes]] ์— Closure์ด ์•„๋‹Œ Block์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ์ด๊ฒƒ์€ Block Scope๋ฅผ ๊ฐ€์ง€๋Š” let, const, class, function ๋“ฑ์˜ ์„ ์–ธ์ด ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํด๋กœ์ €์˜ ์˜ํ•ด ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์ธ Block Scope์˜ count ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.

img_1.png

๋ณด์ด์ง€ ์•Š๋Š” ํด๋กœ์ €

์•„๋ฌด๋„ ์—†๋Š” ์ˆฒ์—์„œ ๋‚˜๋ฌด ํ•œ ๊ทธ๋ฃจ๊ฐ€ ์“ฐ๋Ÿฌ์กŒ์ง€๋งŒ, ๊ทธ ๋ˆ„๊ตฌ๋„ ์†Œ๋ฆฌ๋ฅผ ๋“ฃ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ์†Œ๋ฆฌ๋Š” ๋‚œ ๊ฒƒ์ธ๊ฐ€?

ํด๋กœ์ €๋ฅผ ๊ด€์ฐฐ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ๋ฅผ ๋ณด์ž.

function say(myName) { let greeting = "Hello, "; function inner() { console.log(greeting + myName); } inner(); } say("Hyunsu");

ํด๋กœ์ €๋ฅผ ๊ด€์ฐฐ ํ•  ์ˆ˜ ์žˆ๋‚˜?

  • inner() ํ•จ์ˆ˜ ๋‚ด์—์„œ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์ธ say() ํ•จ์ˆ˜์— ์ •์˜๋œ greeting๊ณผ myName์„ ์ฐธ์กฐ ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ ๋œ๋‹ค๊ณ  ์˜คํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๊ด€์ฐฐ ๋˜๋Š” ๊ฒƒ์€ ํด๋กœ์ €๊ฐ€ ์•„๋‹Œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ์ด๋‹ค.
  • ๊ทธ ์ด์œ ๋Š” inner() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์œ„์น˜๊ฐ€ geeting๊ณผ myName์„ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ผ ์Šค์ฝ”ํ”„ ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ํด๋กœ์ €๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด์—์„œ๋„ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„ ์–ธ์–ด๋ฉด ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

๋‘๋ฒˆ์งธ ์˜ˆ์ด๋‹ค.

var students = [ { name: "Joo", score: 80 }, { name: "Jin", score: 70 }, { name: "Kim", score: 60 }, { name: "Park", score: 50 }, { name: "Lee", score: 40 }, { name: "Choi", score: 30 }, ]; function getFirstStudent() { return function firstStudent() { return students[0].name; }; } let student = getFirstStudent(); console.log(student());
  • getFirstStudent() ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ด์„ ํ•จ์ˆ˜๋กœ ํ•˜๊ณ  ๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊นŒ์ง€ ํ–ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ํด๋กœ์ €๋Š” ๊ด€์ฐฐ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด์œ ๋Š” ์ฐธ์กฐํ•œ students ๋ณ€์ˆ˜์˜ ์ •์˜๋œ ์œ„์น˜๊ฐ€ ์ตœ์ƒ์œ„์ธ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์ด๋‹ค.
  • ์–ด๋–ค ํ•จ์ˆ˜์—์„œ๋“  students ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” ํด๋กœ์ €๊ฐ€ ์•„๋‹ˆ๋ผ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํ•จ์ˆ˜์—์„œ๋“  ์ „์—ญ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ธ๋ฒˆ์งธ ์˜ˆ์ด๋‹ค.

function lookupStudent(studentId) { return function nobody() { let msg = "Nobody here"; console.log(msg); }; } let student = lookupStudent(112); student(); // Nobody here
  • studentId ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ nobody() ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.nobody ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” studentID๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • lookupStudent() ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ studentId๋ฅผ ์–ด๋–ค ์Šค์ฝ”ํ”„์—์„œ๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

์ด๋กœ์จ ๋„์ถœ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ, ๊ทธ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ, ํด๋กœ์ €๊ฐ€ ๊ด€์ฐฐ ๋œ๋‹ค.

์ •๋ฆฌ

  • ํด๋กœ์ €์˜ ํ•ต์‹ฌ์€
  • ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜์™€ ๊ด€๋ จ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ด์ƒ์€ ๋ฌด์กฐ๊ฑด ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ฐธ์กฐํ•˜๋ ค๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ, ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•ด์•ผ ํ•œ๋‹ค.

Hi, I'm Hyunsu ๐Ÿ‘‹

Profile Image

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ฃผํ˜„์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ’๋ถ€ํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์ผ์— ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค.

์˜ต์‹œ๋””์–ธ(Obsidian)์—์„œ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ๋กœ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์— ์žˆ์–ด์š”. โ˜•๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป โ›ท

Github on ViewReach Me Out