naver/fe-news ๋‰ด์Šค๋ ˆํ„ฐ ๋ทฐ์–ด (๋น„๊ณต์‹)

๋ชฉ์ฐจ
๋ชฉ์ฐจ

    2022-12

    ๋งํฌ & ์ฝ์„๊ฑฐ๋ฆฌ

    Complete rewrite of ESLint

    2013๋…„ ์ฒ˜์Œ ์ถœ์‹œ๋˜์—ˆ๋˜ ESLint๋Š” ์ด์ œ ๊ณง 10๋…„์„ ์•ž๋‘๊ณ  ์žˆ๋‹ค. 2013๋…„ ๊ฐœ๋ฐœ๋˜์—ˆ๋˜ ๊ธฐ๋ณธ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด ์ƒˆ๋กœ์šด ๋ณ€ํ™”๋“ค์— ์ ์ง„์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•ด ์™”์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ–ฅํ›„ 10๋…„์— ๋Œ€ํ•œ ๋ฐฉํ–ฅ์„ฑ์—๋Š” ๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜๊ณ  ์ด๋ฅผ ์œ„ํ•ด ์ „์ฒด์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์žฌ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณ„ํš๊ณผ ํ•จ๊ป˜, ์ด์˜ ๋‹ฌ์„ฑ์„ ์œ„ํ•ด 10๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ๊ณต๊ฐœํ–ˆ๋‹ค.

    Supper Club ร— Ryan Dahl and Deno

    Node.js์™€ Deno ๊ฐœ๋ฐœ์ž์ธ Ryan Dahl์˜ ํŒŸ์บ์ŠคํŠธ ์ธํ„ฐ๋ทฐ ๋‚ด์šฉ์œผ๋กœ, Node์™€ Deno์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์ƒ๊ฐ์„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์™œ ์•„์ง๊นŒ์ง€๋„ JavaScript์— ๋ฒ ํŒ…ํ•˜๋Š”์ง€, ๊ฐœ๋ฐœ์ž๋“ค์ด Rust๋ฅผ ๋ฐฐ์›Œ์•ผ ํ• ์ง€ ๋“ฑ์— ๋Œ€ํ•œ ์›น ์ „๋ฐ˜์— ๋Œ€ํ•œ ์˜๊ฒฌ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ๋‹ค์Œ์˜ ์ฃผ์ œ๋“ค์— ๋Œ€ํ•œ Ryan Dahl์˜ ๋‹ต๋ณ€์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ์ง์ ‘ ๋“ค์–ด๋ณด๊ธธ ์ถ”์ฒœํ•œ๋‹ค.

    • Why are you still betting on JavaScript for the web?
    • Should developers be learning Rust?
    • Will libraries that work on npm eventually work in Deno?
    • Client side vs server side rendering

    performance.now() 2022

    ์ง€๋‚œ 11์›” 2~3์ผ ์•”์Šคํ…Œ๋ฅด๋‹ด์—์„œ ์›น ์„ฑ๋Šฅ ์ฃผ์ œ์— ํฌ์ปค์‹ฑ ํ•œ ์ฝ˜ํผ๋Ÿฐ์Šค๋กœ, ์ด 14๊ฐœ์˜ ์„ธ์…˜์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์„ฑ๋Šฅ ๊ด€์ ์˜ ๊ฒฝํ—˜์„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    if(kakao)dev2022

    ๋งค๋…„ Kakao์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ฝ˜ํผ๋Ÿฐ์Šค์ด๋‹ค. ์˜ฌํ•ด๋Š” 12์›” 7์ผ ~ 12์›” 9์ผ 3์ผ๊ฐ„ ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. Day 1.์—๋Š” ์ง€๋‚œ 10์›” 15์ผ ํŒ๊ต IDC ํ™”์žฌ ์‚ฌ๊ณ ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ์žฅ์• ์— ๋Œ€ํ•œ ๊ณต์œ ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , Day 2. ~ 3.์—๋Š” ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์ฃผ๋กœ ๋‹ค๋ฃฌ๋‹ค๊ณ  ํ•œ๋‹ค.

    ๊ธฐ์ˆ  ๊ณต์œ  ์ค‘ Front-end ๊ด€๋ จ ์„ธ์…˜์€ ์ด 11๊ฐœ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

    • MFA ๋ˆ„๊ตฌ๋ƒ ๋„ˆ: ๊ณตํ†ต ํ”Œ๋žซํผ ํŒŒํŠธ์˜ MFA ๋„์ž…๊ธฐ
    • ์›น ๋ฐ˜์‘์„ฑ ๊ฐœ์„ ํ•˜๊ธฐ
    • ๋ธŒ๋Ÿฐ์น˜ FE ์‹ฌํ์†Œ์ƒ์ˆ 
    • ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๊ฐœ์„ : My๊ตฌ๋…์˜ Redux์—์„œ React-Query ์ „ํ™˜ ๊ฒฝํ—˜ ๊ณต์œ 
    • ๊ด‘๊ณ  ์›น SDK ๊ฐœํŽธ๊ธฐ with Preact
    • ์‚ฌ์ง„ํŽธ์ง‘๊ธฐ! ์ด๊ฒƒDOM ์ ์šฉํ•ด๋ณผGL?
    • ์„ฌ์„ธํ•œ ISFP์˜ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ๊ฐœ์„  ๊ฒฝํ—˜
    • ๋ณต์žกํ•œ ์ƒํƒœ๊ด€๋ฆฌ๋„๊ตฌ Svelte์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ
    • ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์‹ค๋ฌด์— ์“ธ๋งŒํ• ๊นŒ?
    • ์นด์นด์˜คํŽ˜์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœํŒ€์˜ Client Side Rendering ํ™˜๊ฒฝ ๊ณ ๋„ํ™”
    • Sentry๋ฅผ ์ด์šฉํ•œ ์—๋Ÿฌ ์ถ”์ ๊ธฐ, React์˜ ์„ ์–ธ์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ

    ๋””์ž์ธ ํŒจํ„ด๋“ค

    ๋””์ž์ธ ํŒจํ„ด๋“ค์„ ์†Œ๊ฐœํ•˜๋Š” ์‚ฌ์ดํŠธ์ด๋‹ค. ๋””์ž์ธ ํŒจํ„ด ๋ชฉ๋ก๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํŒจํ„ด์˜ ์ด์ , ๋ถ„๋ฅ˜, ์—ญ์‚ฌ ๋“ฑ๋„ ์งง๊ฒŒ๋‚˜๋งˆ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ ์–ธ์–ด๋ณ„๋กœ ์ž‘์„ฑ๋œ ์˜ˆ์‹œ ์ฝ”๋“œ๋„ ์ œ๊ณตํ•˜์—ฌ ์ดํ•ด๋ฅผ ๋•๋Š”๋‹ค.

    ์ถ”ํ›„ ๋ฆฌํŒฉํ„ฐ๋ง, SOLID ์›์น™ ๋“ฑ์˜ ๋‚ด์šฉ๋„ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋ผ๊ณ  ํ•œ๋‹ค.

    How React Uses Closures to Avoid Bugs

    React class component์—์„œ this.props ์ฐธ์กฐ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ธ€์ด๋‹ค. ๋ฌธ์ œ๋Š” class component๊ฐ€ re-render(update) ๋  ๋•Œ, ์ง„ํ–‰ ์ค‘์ด๋˜ async handler ๋“ฑ์—์„œ ์ฐธ์กฐํ•˜๋Š” this.props๋„ ๋ณ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

    ์ด์— ๋Œ€ํ•œ ์›์ธ์€ ๋‹ค์Œ์œผ๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค:

    • class component๋Š” instance๋กœ์„œ ๊ด€๋ฆฌ๋œ๋‹ค.
    • React updating phase์—์„œ๋Š” instance๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋œ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„๋™๊ธฐ์ธ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ์—์„œ this.props ์ ‘๊ทผ ์‹œ, ํด๋ฆญ ์‹œ์ ์ด ์•„๋‹Œ, ๋น„๋™๊ธฐ ์ดํ›„ ์‹œ์ ์˜ this.props๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์ „์— this.props๋ฅผ ์กฐ๊ธฐ์— ํ•ด์ฒดํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค:

    handleLikeClick = async () => {
      const {post} = this.props;
      const {user, toggleLike} = this.context;
    
      if (!(await canLike(post, user))) return;
    
      toggleLike(post);
    };
    

    ํ•˜์ง€๋งŒ, ์ด ๊ฐ™์€ ๋ฌธ์ œ๋Š” function component์—์„  ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” function component๋Š” props๋ฅผ closure๋กœ์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์ด์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋„ ๋ณธ ๊ธ€์—์„œ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    TechBlogPosts

    IT ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋“ค์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ธ์–ด์™€ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ์ดํŠธ์ด๋‹ค. ๋ผ์ธ, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค ๋“ฑ ๊ตญ๋‚ด IT ํšŒ์‚ฌ ๋ธ”๋กœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ตฌ๊ธ€, MS ๋“ฑ์˜ ๋ธ”๋กœ๊ทธ ๊ธ€๋„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ๊ธฐ์ˆ  ๋ถ„์•ผ๋ณ„๋กœ ๊ธ€์ด ๋ถ„๋ฅ˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฑด ์•„์‰ฝ๋‹ค.

    [๋ฒˆ์—ญ] React์— SOLID ์›์น™ ์ ์šฉํ•˜๊ธฐ

    ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™์ธ SOLID๋ฅผ React ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์— ์ ์šฉํ•ด ๋ณด๋Š” ๊ธ€์ด๋‹ค. L(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)์„ ์ œ์™ธํ•œ S, O, I, D ๊ฐ๊ฐ์˜ ์›์น™๋“ค์„ ์ง€ํ‚ค์ง€ ์•Š์€ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ์ œ์‹œํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

    How to Use Google Sheets as a Database with React and Serverless

    Google Sheets๋Š” ๋‹ค๋“ค ๋งŽ์ด ๋“ค์–ด๋ณด๊ณ  ์จ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Google Sheets๊ฐ€ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ์„œ์˜ ์—ญํ• ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š”๊ฐ€? ์ด๋Š” Google Sheets์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ํ†ตํ•ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด์— ๋Œ€ํ•ด ๋ณธ ๊ธ€์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•œ๋‹ค.

    The Wet Codebase - Dan Abramov

    Redux ์™€ React ๊ฐœ๋ฐœ์ž๋กœ ์œ ๋ช…ํ•œ Dan Abramov ๊ฐ€ 2019๋…„ deconstructconf์—์„œ ๋ฐœํ‘œํ•œ ๋‚ด์šฉ์ด๋‹ค. ๊ฝค ์˜ค๋ž˜๋œ ์˜์ƒ์ด์ง€๋งŒ ๋ณ€์น˜ ์•Š๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ผ๋ฐ˜์  ํŠน์„ฑ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์œ ํšจํ•œ ๋‚ด์šฉ๋“ค์ด๋‹ค.

    ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๋‹ˆ ๊ณตํ†ต ์ฝ”๋“œ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€๋งŒ ์ด์— ๋Œ€ํ•ด์„œ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ƒฅ copy and paste ํ•˜์ฃ ๋ผ๊ณ  ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค. DRY ์›์น™์˜ ์žฅ๋‹จ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด ๋ณด๊ณ , ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ƒฅ copy and paste ํ•˜์ฃ ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ?

    FE Conf

    ์ง€๋‚œ 10์›” 8์ผ ์ง„ํ–‰๋œ ๊ตญ๋‚ด ํ”„๋ŸฐํŠธ์—”๋“œ ์ปจํผ๋Ÿฐ์Šค ํ–‰์‚ฌ์ธ FE Conf์˜ ๋ฐœํ‘œ ๋‚ด์šฉ๋“ค์ด ์œ ํŠœ๋ธŒ์— ๊ณต๊ฐœ๋˜์—ˆ๋‹ค.

    ์ด์™ธ์—๋„ ์—ฌ๋Ÿฌ ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ๋“ค์ด ๋ฐœํ‘œ๋˜์—ˆ๋‹ค.

    State Of JS

    ์œ ๋ช… ํ”„๋ŸฐํŠธ์—”๋“œ ํŠธ๋ Œ๋“œ ์„ค๋ฌธ์ธ State Of JS์˜ 2022 ์„ค๋ฌธ์ด ์‹œ์ž‘๋˜์—ˆ๋‹ค.

    ์„ค๋ฌธ์— ์ฐธ์—ฌํ•ด ํ†ต๊ณ„์— ๊ธฐ์—ฌํ•œ๋‹ค๋Š” ์˜์˜๋„ ์žˆ์ง€๋งŒ ์„ค๋ฌธ์„ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ํŠธ๋ Œ๋“œ์™€ ๊ธฐ์ˆ ์„ ์ ‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜์˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์”ฉ ์ฐธ์—ฌํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

    ์–ธ์–ด, ๋ธŒ๋ผ์šฐ์ € API, ํ”„๋ŸฐํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ, Rendering Frameworks, ํ…Œ์ŠคํŒ…, ๋ชจ๋ฐ”์ผ & ๋ฐ์Šคํฌํ†ฑ, ๋นŒ๋“œ ๋„๊ตฌ ๋“ฑ์˜ ํ•ญ๋ชฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    Node.js visualized

    ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์€ ํ•œ ๋ฒˆ์— ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ์ˆœ์ฐจ์  ์ž‘์—…์œผ๋กœ ์ด์ „์˜ ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋‹ค์Œ ์ž‘์—…์ด ์ด์–ด์„œ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์งˆ์˜์— ๋Œ€ํ•œ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์˜ค๋žœ ์‹œ๊ฐ„ ์†Œ์š”๋˜์—ˆ์„ ๋•Œ, ๋” ๋งŽ์€ ์ž‘์—…์ด ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋˜์ง€ ๋ชปํ•˜๋„๋ก ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋‹คํ–‰ํžˆ๋„ Node.js๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด C++๋กœ ์ž‘์„ฑ๋œ Libuv๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, DNS ํ™•์ธ, ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž‘์—… ๋“ฑ์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

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

    ์ฝ”๋“œ์™€ ๋„๊ตฌ

    Solid Start

    SolidJS meta framework์ธ Solid Start ๋ฒ ํƒ€๋ฒ„์ „์ด ์ง€๋‚œ 11/10์ผ ๊ณต๊ฐœ๋˜์—ˆ๋‹ค. (React์˜ Next.js์™€ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.) ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ตฌ์„ฑ์˜ ์ดˆ๊ธฐ ์…‹์—…์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์ค‘์ฒฉ ํŒŒ์ผ์‹œ์Šคํ…œ ๋ผ์šฐํŒ… ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•œ๋‹ค.

    CAF

    YDKJS์˜ ์ €์ž getify๊ฐ€ ๋งŒ๋“  CAF(Cancelable Async Flows)๋ผ๋Š” ์ด๋ฆ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Generator function(function*)์„ async function์ฒ˜๋Ÿผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ , cancellation ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฐ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค:

    // two๋ผ๋Š” ์ด๋ฆ„์˜ generator function์„ ๋žฉํ•‘(CAF)ํ•˜์—ฌ async์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    var two = CAF( function *two(signal,v){
        yield delay( 100 );
        return v * 2;
    });
    
    // CAF์—์„œ ์ œ๊ณตํ•˜๋Š” token์„ ๋„ฃ์–ด์ฃผ์–ด ์‚ฌ์šฉํ•œ๋‹ค.
    var token = new CAF.cancelToken();
    
    two( token.signal, 21 )
    .then( console.log, console.error );
    
    // ์ด๋ ‡๊ฒŒ cancellation๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    two( token, 21 )
    .then( console.log, console.error ); // Took too long!
    
    token.abort( "Took too long!" );
    

    signal์ด๋ž€ ํ‘œํ˜„์—์„œ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด๋ถ€์ ์œผ๋กœ AbortController๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ๋˜ํ•œ Nested์—๋„ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ token.abort() ์‹œ ์ „์ฒด๊ฐ€ abort ๋˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ๋„์ค‘ ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค:

    var token = new CAF.cancelToken();
    
    var one = CAF( function *one(signal,v){
        return yield two( signal, v );
    } );
    
    var two = CAF( function *two(signal,v){
        return yield three( signal, v );
    } );
    
    var three = CAF( function *three(signal,v){
        return yield ajax( `http://some.tld/?v=${v}` );
    } );
    
    one( token.signal, 42 );
    
    // 5์ดˆ๋ฅผ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ abortํ•œ๋‹ค.
    setTimeout( function onElapsed(){
        token.abort( "Request took too long!" );
    }, 5000 );
    

    typescript-strict-plugin

    typescript compile option ์ค‘ strict ์˜ต์…˜์„ ๋ˆ ์ƒํƒœ๋กœ ๊ฑฐ๋Œ€ํ•ด์ง„ ํ”„๋กœ์ ํŠธ์—์„œ ์ค‘๊ฐ„์— strict ์˜ต์…˜์„ ํ‚ค๋Š” ๊ฒƒ์€ ํž˜๋“ค๊ณ  ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ผ์ด๋‹ค. typescript-strict-plugin์€ strict ์˜ต์…˜์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. v2์™€ v1์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ƒ์ดํ•œ ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ ์ทจํ–ฅ์— ๋”ฐ๋ผ์„œ ์„ ํƒํ•˜๋ฉด ๋  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

    v2: // @ts-strict-ignore ์ฃผ์„์„ ํŒŒ์ผ ๋งจ ์œ„์— ๋†“์Œ์œผ๋กœ์จ strict ์˜ต์…˜์„ ํ•ด๋‹น ํŒŒ์ผ์—์„œ๋งŒ ๋Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. v1: // @ts-strcit ์ฃผ์„์„ ํŒŒ์ผ ๋งจ ์œ„์— ๋†“์Œ์œผ๋กœ์จ strict ์˜ต์…˜์„ ํ•ด๋‹น ํŒŒ์ผ์—์„œ๋งŒ ํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

    strict ์˜ต์…˜ ์ •์˜ํ•ด๋†“์€ ์ฝ”๋“œ์—์„œ ๊ฐ•ํ•˜๊ฒŒ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ์ถ”ํ›„์— ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์ •์˜์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.