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

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

    2023-02

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

    The Most Demanded Frontend Frameworks in 2022

    ํ˜„์žฌ ์‹ค์ œ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ฐ์ข… ์„ค๋ฌธ์กฐ์‚ฌ ๋“ฑ์„ ํ†ตํ•ด ๋˜๋Š” ์ƒ์‚ฐ๋˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ํŒŒ์•…๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉ๋ฅ ์€ ์ธ๊ธฐ์— ๋น„๋ก€ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜๋Š” ์—†๋‹ค.

    ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” DevJobsScanner์—์„œ๋Š” 14๊ฐœ์›”๊ฐ„(โ€™21/10 ~ โ€™22/11) ๊ฐ ์ฑ„์šฉ ์„œ๋น„์Šค๋“ค(LinkedIn, Glassdoor, RemoteOK, Dice ๋“ฑ)์— ๋“ฑ๋ก๋œ ๊ตฌ์ธ ๊ธ€์„ ๋ถ„์„ํ•ด โ€˜22๋…„ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ๊ฐ€์žฅ ๋งŽ์•˜๋Š”์ง€ ๊ณต๊ฐœํ–ˆ๋‹ค.

    TypeScript vs JavaScript | Guido van Rossum and Lex Fridman

    TypeScript์™€ JavaScript์— ๋Œ€ํ•ด Python์˜ ์ฐฝ์‹œ์ž์ธ Guido Van Rossum์€ ์–ด๋–ค ์ƒ๊ฐ์„ ๊ฐ–๊ณ  ์žˆ์„๊นŒ? 6๋ถ„ ๋ถ„๋Ÿ‰์˜ ์งง์€ ์˜์ƒ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋Œ€๊ฐ€์˜ ์˜๊ฒฌ์„ ์ง์ ‘ ๋“ค์–ด๋ณด๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

    A cure for React useState hell?

    ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์—์„œ ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ฐ’์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด useState hook์„ ๋‹ค์ˆ˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ์ด๋Š” ์–ด์ฉŒ๋ฉด โ€œuseState hook hellโ€์ธ ์ƒํƒœ์— ๋†“์—ฌ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๊ฒฝ์šฐ, useReducer hook์„ ํ†ตํ•ด ๋ณต์žก๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์ฃผ์˜์  ๋“ฑ์„ ์†Œ๊ฐœํ•œ๋‹ค.

    Introducing the WebAssembly JavaScript Promise Integration API

    JSPI(JavaScript Promise Integration) API๋Š” ์™ธ๋ถ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋™๊ธฐํ™”๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๊ฐ€์ •ํ•ด ์ž‘์„ฑ๋œ wasm ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ์‹ค์ œ๋กœ๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™๋˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

    JSPI๋Š” ๋™๊ธฐ/๋น„๋™๊ธฐ Web API๋“ค ๊ฐ„์˜ ๋ธŒ๋ฆฌ์ง€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋™๊ธฐ API ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ˆ˜ํ–‰์„ ์ž ์‹œ ์ค‘๋‹จํ–ˆ๋‹ค๊ฐ€ ๋น„๋™๊ธฐ I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์žฌ๊ฐœํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

    ์ด ๊ธ€์€ JSPI API ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค๊ณผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ์ด์— ๋Œ€ํ•œ ์˜ˆ์ œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

    Summer Afternoon

    ์ŠคํŽ˜์ธ ์ถœ์‹ ์˜ Vicente Lucendo๊ฐ€ ๊ณต๊ฐœํ•œ ์‹คํ—˜์  ์›น ๊ฒŒ์ž„(?)์œผ๋กœ ์กฐ์šฉํ•œ ์–ด๋А ์—ฌ๋ฆ„๋‚ ์˜ ํ’๊ฒฝ์„ ๋ฐฐ๊ฒฝ์œผ๋กœ ํ•œ๋‹ค. ์ ˆ์ฐจ์  3D ์•„ํŠธ(Procedural 3D Art)๋ฅผ ์—ฐ์Šตํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    ์˜ํ™”, ๋น„๋””์˜ค ๊ฒŒ์ž„ ๋“ฑ์—์„œ ํ™œ์šฉ๋˜๋Š” 3์ฐจ์› ์• ๋‹ˆ๋ฉ”์ด์…˜/์‹œ๊ฐํšจ๊ณผ ์†Œํ”„ํŠธ์›จ์–ด์ธ SideFx์˜ Houdini์™€ Three.js, WebGL ๋“ฑ์„ ํ™œ์šฉํ•ด ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    Scrollend, a new JavaScript event

    ์Šคํฌ๋กค์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์‹คํ—˜์  onscrollend ์ด๋ฒคํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๊ทธ๊ฐ„ ์Šคํฌ๋กค์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋Š” onscroll ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์žˆ์—ˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ์Šคํฌ๋กค ์•ก์…˜๋งˆ๋‹ค ๋ฌด์–ธ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๋งˆ์ง€๋ง‰ ์Šคํฌ๋กค์ด ๋ฐœ์ƒํ•œ ์‹œ์ ๋ถ€ํ„ฐ ์ผ์ • ์‹œ๊ฐ„(๋Œ€๋žต 1s ๋’ค) ๋™์•ˆ ์ƒˆ๋กœ์šด ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋•Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ–ˆ์—ˆ๋‹ค.

    ์•„์ง ๋ธŒ๋ผ์šฐ์ € ์ปค๋ฒ„๋ฆฌ์ง€(FF 109+, Chrome 109 chrome://flags/#enable-experimental-web-platform-features ํ”Œ๋ž˜๊ทธ ํ™œ์„ฑํ™” ํ•œ ๊ฒฝ์šฐ)๊ฐ€ ๋†’์ง€๋Š” ์•Š์ง€๋งŒ, Chrome์˜ ๊ฒฝ์šฐ 112 ๋ฒ„์ „์„ ํ†ตํ•ด ์ •์‹ ์ง€์›๋  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

    [์ฐธ๊ณ ] MDN: Document: scrollend event

    The State of JS 2022

    ์ง€๋‚œ 1๋…„๊ฐ„ Front-end ์˜์—ญ์—์„œ์˜ ๋ณ€ํ™”์™€ ์•ž์œผ๋กœ์˜ ์ „๋ง์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋Š” State of JS 2022 ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ๋‹ค.

    ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์ „ ์„ธ๊ณ„์˜ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์„ ํ˜ธ๋„์™€ ๋งŒ์กฑ๋„๋ฅผ ์ •๋ฆฌ๋œ ์ž๋ฃŒ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    TL;DR

    • ํ”„๋ ˆ์ž„์›Œํฌ: ์—ฌ์ „ํžˆ ๋†’์€ ์‚ฌ์šฉ๋Ÿ‰์˜ React, ๋†’์€ ๊ด€์‹ฌ๊ณผ ๋งŒ์กฑ๋„์˜ Svelte
    • ํ…Œ์ŠคํŒ…: ์ž‘๋…„ ๋“ฑ์žฅํ•œ vitest์˜ ๋†’์•„์ง„ ์‚ฌ์šฉ๋Ÿ‰ (3% -> 14%)
    • ๋ชจ๋ฐ”์ผ & ๋ฐ์Šคํฌํ†ฑ: ์ž‘๋…„ ๋“ฑ์žฅํ•œ Tauri์˜ ๋ถ€์ง„ํ•œ ์„ฑ์žฅ์„ธ, ๊ณต๊ณ ํžˆ ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ค๋Š” Electron, React Native
    • ๋นŒ๋“œ ๋„๊ตฌ: ์ฒœ์ฒœํžˆ ๋‚ด๋ ค๊ฐ€๋Š” webpack ์‚ฌ์šฉ๋Ÿ‰, ๊ธ‰ ๋ถ€์ƒํ•˜๋Š” vite (30% -> 49%)
      • webpack์— ๋Œ€ํ•œ ๋†’์€ ๋ถ€์ •์  ๊ฒฝํ—˜, vite์— ๋Œ€ํ•œ ๋†’์€ ๊ธ์ •์  ๊ฒฝํ—˜
    • ๋ชจ๋…ธ๋ ˆํฌ ๋„๊ตฌ: ์ž‘๋…„ ๊ฐ€์žฅ ๋†’์€ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ๋กํ•œ lerna์˜ ๋ถ€์ง„ (25% -> 22%), pnpm์˜ ๋†’์€ ์ƒ์Šน์„ธ (13% -> 21%)

    passKey

    ์›น๊ณผ ์•ฑ ๋ชจ๋‘ passkey๋ฅผ ์ด์šฉํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด passkey๋ฅผ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ๋Š” Chrome์ด M108๋ถ€ํ„ฐ passkey๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ํ˜„์žฌ ์‚ฐ์—… ์ „๋ฐ˜์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ์ƒ์ฒด์ธ์‹, PIN ํ”Œ๋กœ์šฐ๋ฅผ ์ฑ„์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ์•ž์œผ๋กœ ์ง€์› ์ถ”์ด๋ฅผ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์•ฝ์†์„ ์ง€ํ‚ฌ๊นŒ?

    Promise, async/await, setTimeout์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ECMAScript ํ‘œ์ค€ ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค. ๋น„๋™๊ธฐ ์ƒํƒœ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ํ•ญ์ƒ ๋งŽ์ด ์ด์•ผ๊ธฐ๋˜์—ˆ๋˜ ์ฃผ์ œ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ ๊ทผ๋ณธ์ ์œผ๋กœ ์›น์˜ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ข‹์€ ๊ธ€๋กœ ๋ณด์ธ๋‹ค.

    ๋””์ž์ธ์‹œ์Šคํ…œ

    ์ด 8ํŽธ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋””์ž์ธ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์•„ํ‹ฐํด์ž…๋‹ˆ๋‹ค. 2019๋…„์— ์ž‘์„ฑ๋œ ๊ฝค ์˜ค๋ž˜๋œ ์•„ํ‹ฐํด์ด์ง€๋งŒ ๋””์ž์ธ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๋Š” ๋ชฉ์ ์ด๋ผ๋ฉด ์•„์ง๋„ ํ›Œ๋ฅญํ•œ ๊ธ€์ด๋‹ค. ์‹ค๋ฌด์—์„œ ๋””์ž์ธ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ถ„์ด๋ผ๋ฉด ์ฝ์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

    ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด ์ปค๋ฆฌ์–ด ๋กœ๋“œ๋งต: ์ฃผ๋‹ˆ์–ด๋ฅผ ์œ„ํ•œ 3๊ฐ€์ง€ ์ „๋ฌธ์„ฑ ํŠธ๋ž™

    Front-end ์—”์ง€๋‹ˆ์–ด๋กœ ์–ด๋–ป๊ฒŒ ์„ฑ์žฅํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ธ€์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ๋‹ˆ์–ด ์—”์ง€๋‹ˆ์–ด ์—ญ๋Ÿ‰์˜ ๋ชฉํ‘œ๋ฅผ ์–ด๋””์— ๋‘์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ช…์พŒํ•œ ๋‹ต๋ณ€์ด ์žˆ์–ด์„œ ๊ธ€์„ ์ฝ๋Š” ๋™์•ˆ ํ†ต์พŒํ•จ์„ ๋А๊ผˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ถ„์•ผ๋ณ„ ์ „๋ฌธ์„ฑ์„ ์ •๋ฆฌ๋ฅผ ์ž˜ ํ•ด ๋‘์–ด์„œ ์ž์‹ ์ด ์–ด๋–ค ํŠธ๋ž™์œผ๋กœ ์„ฑ์žฅ์„ ํ•ด๋‚˜๊ฐ€์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋„ ํ•จ๊ป˜ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธ€์ด๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    ChatGPT Tutorial for Developers - 38 Ways to 10x Your Productivity

    ๋น„ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ๋„ ์ด์Šˆ๊ฐ€ ๋˜๊ณ  ์žˆ๋Š” ChatGPT๋Š” 2022๋…„ 11์›”์— ์ถœ์‹œํ•ด์„œ ๋‹จ 5์ผ ๋งŒ์— 100๋งŒ ์‚ฌ์šฉ์ž๋ฅผ ํ™•๋ณดํ–ˆ์„ ์ •๋„๋กœ ์ธ๊ธฐ๊ฐ€ ๋œจ๊ฒ๋‹ค. ์ด ์˜์ƒ์€ ChatGPT์— ๋Œ€ํ•ด์„œ ๊ฐ€๋ณ๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  Python, HTML, CSS, Javascript, SQL๊นŒ์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” 38๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ด ์ค€๋‹ค.

    The truth about CSS selector performance

    ์•„๋งˆ๋„ ํ•œ ๋ฒˆ์ฏค์€ CSS ์…€๋ ‰ํ„ฐ๊ฐ€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ์„ฑ๋Šฅ์ด ๋А๋ฆฐ ์…€๋ ‰ํ„ฐ๋“ค์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธธ ์›ํ•  ๊ฒƒ์ด๋‹ค.

    ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์€ ์›น ํŽ˜์ด์ง€ ๋‚ด ํŠน์ • ์˜์—ญ์— ๋Œ€ํ•œ ๋ณ€ํ™”๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด DOM ํŠธ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด, ํ˜„์žฌ ํŽ˜์ด์ง€์— ์ ์šฉ๋œ CSS stylesheet๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ฉฐ, ์Šคํƒ€์ผ๊ณผ DOM ํŠธ๋ฆฌ๋ฅผ ๋งค์นญํ•˜๋Š” ๊ฒƒ์„ style recalculation์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

    ์ด ํŠœํ† ๋ฆฌ์–ผ์€ Edge ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome์€ ์ง€์›ํ•˜์ง€ ์•Š์Œ)์˜ Performance(์„ฑ๋Šฅ) ํƒญ์„ ํ†ตํ•ด ๋Œ€์ƒ ํŽ˜์ด์ง€๋ฅผ ํ”„๋กœํŒŒ์ผ๋ง ํ•œ ํ›„, Main ์„น์…˜์—์„œ Recalculate Style ํ•ญ๋ชฉ์œผ๋กœ ์ˆ˜ํ–‰๋œ ์ž‘์—…์—์„œ ์…€๋ ‰ํ„ฐ๋“ค๊ณผ ์‹คํ–‰ ์‹œ๊ฐ„(Selector Stats ๊ฒฐ๊ณผ ํƒญ)์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

    [์ฐธ๊ณ ] Analyze selector performance during Recalculate Style events

    React Email First Look

    React๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ํŽธ์ง‘ํ•˜๊ณ  ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ธ react-email ์— ๋Œ€ํ•œ ๊ธฐ์ดˆ์ ์ธ ํŠœํ† ๋ฆฌ์–ผ์ด๋‹ค.

    ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ง€์›ํ•˜๋ฉฐ Nodemailer์™€ ๊ฐ™์€ ๋„๊ตฌ๋“ค๊ณผ ํ†ตํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  Gmail, Outlook๊ณผ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

    Zod

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

    ๊ฒ€์ฆ์ž(validator)๋ฅผ ํ•œ ๋ฒˆ ์„ ์–ธํ•˜๋ฉด, ๋Ÿฐํƒ€์ž„์—์„œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์™€ ํผ์˜ ๊ฐ’ ๊ฒ€์‚ฌ ๋“ฑ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜ํ•œ ๋ณ„๋„์˜ ํฐ ์ž‘์—… ์—†์ด๋„ TypeScript ์œ ํ˜•์œผ๋กœ ์ถ”๋ก ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    import { z } from "zod";
    
    // 1) ๋ฌธ์ž ์Šคํ‚ค๋งˆ ์ƒ์„ฑ
    const mySchema = z.string();
    
    // ํŒŒ์‹ฑ
    mySchema.parse("tuna"); // => "tuna"
    mySchema.parse(12); // => throws ZodError
    
    // โ€œ์•ˆ์ „ํ•œ" ํŒŒ์‹ฑ (๊ฒ€์ฆ์ด ์‹คํŒจํ•˜๋”๋ผ๋„ ์˜ค๋ฅ˜๋ฅผ throw ํ•˜์ง€ ์•Š์Œ)
    mySchema.safeParse("tuna"); // => { success: true; data: "tuna" }
    mySchema.safeParse(12); // => { success: false; error: ZodError }
    
    // 2) ๊ฐ์ฒด ์Šคํ‚ค๋งˆ ์ƒ์„ฑ
    const User = z.object({
      username: z.string(),
    });
    
    User.parse({ username: "Ludwig" });
    
    // TypeScript์—์„œ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ถ”๋ก ๋œ ํƒ€์ž…์„ ์ถ”์ถœ
    type User = z.infer<typeof User>; // { username: string }
    

    ์ฐธ๊ณ :

    TypeScript 5.0 Beta

    TypeScript 5.0 ๋ฒ ํƒ€๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ๋‹ค. 5๋…„ ๋™์•ˆ ์ŠคํŽ™ ๋…ผ์˜๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋˜ Decorator๊ฐ€ stage:3 ์ด ๋˜๋ฉด์„œ JavaScript์˜ superset์ธ TypeScript์—์„œ๋„ ์ •์‹ ์ŠคํŽ™์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ค‘์š”ํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค๋„ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋‹ˆ ๊ด€์‹ฌ ์žˆ๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

    ์ฐธ๊ณ  ์˜์ƒ: https://www.youtube.com/watch?v=iOTAFRFgm8I

    MSW(Mock Service Worker) 1.0.0 ๋ฆด๋ฆฌ์ฆˆ

    23๋…„ 1์›” 25์ผ MSW 1.0 ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ๋˜์—ˆ๋‹ค. Web Service Worker๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋„คํŠธ์›Œํฌ ๊ตฌ๊ฐ„์„ mocking์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด์˜ HTTP ๋ชจํ‚น์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (AxiosMockAdapter, supertest, ...)์˜ ๊ทผ๋ณธ์ ์ธ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ต์ˆ™ํ•œ express ํ˜•ํƒœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ œ๊ณตํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ์„œ๋น„์Šค ์šด์˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ฐธ๊ณ  ๋งํฌ: fe-news 2020.09์›”ํ˜ธ

    SWR(Stale-While-Revalidate) 2.0.3 ๋ฆด๋ฆฌ์ฆˆ

    22๋…„ 10์›” 10์ผ 2.0 Major ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒจ์น˜๊ฐ€ ์ˆ˜์ •๋œ ๋ฒ„์ „์ด 23๋…„ 1์›” 29์ผ ๋ฆด๋ฆฌ์ฆˆ๋˜์—ˆ๋‹ค. React 18๊ณผ SWRDevtool์˜ ์ถ”๊ฐ€์™€ ํ•จ๊ป˜ 1.0์—์„œ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ๋ณด์™„ํ•˜๊ณ  ๋‚˜์˜จ 2.0์ด react-query์˜ ์•„์„ฑ์„ ๋ฌด๋„ˆ๋œจ๋ฆด ์ˆ˜ ์žˆ์„์ง€ ๊ท€์ถ”๊ฐ€ ์ฃผ๋ชฉ๋œ๋‹ค.

    Future of Storybook in 2023

    2020๋…„ 6.0 ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„ 3๋…„ ๋งŒ์— Major ๋ฆด๋ฆฌ์ฆˆ๋˜๋Š” Storybook 7.0์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ UI ํ™•์ธ์„ ์œ„ํ•œ ์šฉ๋„์˜ Storybook์ด ํ…Œ์ŠคํŠธ ์ค‘์‹ฌ์˜ ์ƒˆ๋กœ์šด ํ”Œ๋žซํผ์œผ๋กœ์˜ ์ „ํ™˜์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค.

    ๋‹จ์œ„ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , CI๋ฅผ ํ†ตํ•œ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•์ธ๊นŒ์ง€ ๋ชฉํ‘œํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ์™ธ์— ๊ธฐ์กด์— ๋ถˆํ•„์š”ํ•œ ๊ณผ์ •์ธ ๋ฒˆ๋“ค ๊ณผ์ •์„ ์ œ๊ฑฐํ•จ์œผ๋กœ์„œ ์„ฑ๋Šฅ ๋ฉด์—์„œ๋„ ๊ฐœ์„ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•˜๊ณ  ์žˆ๋‹ค. Front-end ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ด€์‹ฌ ์žˆ๊ฒŒ ๋ฐ”๋ผ๋ด์•ผ ํ•  ํ”„๋กœ์ ํŠธ์ด๋‹ค.