2021-09 
๋งํฌ & ์ฝ์๊ฑฐ๋ฆฌ
FE devtalk 20ํ, ๋์์ธ ์์คํ ๊ฐ๋ฐ ํธ 2ํ

์ง๋ 8์ 17์ผ, ๋ค์ด๋ฒ์์ ์งํํ๋ ์ฌ๋ด ํ๋ก ํธ์๋ ์ปจํผ๋ฐ์ค์ธ FE Devtalk์์ "๋์์ธ ์์คํ (๊ฐ๋ฐํธ 2ํ)"๋ ์ฃผ์ ๋ก 20ํ ํ์ฌ๊ฐ ์งํ๋์๋ค.
์์นด, ๋ฑ ํฌ์๋ฌ๋, ์นด์นด์ค ์ํฐํ๋ผ์ด์ฆ, ์ง๋ฐฉ๊ณผ ๊ฐ์ ์ธํฐ๋ท ์๋น์ค ํ์ฌ๋ค์ด ์์ฒด์ ์ธ ๋์์ธ ์์คํ ์ ์ด๋ป๊ฒ ๊ธฐํ/๋์์ธ/๊ฐ๋ฐ/ํ์ ํ๊ณ ์์๊น ๋ผ๋ ๊ถ๊ธ์ฆ์ผ๋ก ์์๋ ์ด ์ฃผ์ ๋ 3ํ์ ๊ฑธ์ณ ์งํ๋๋ฉด์ ๊ทธ ์ด์ผ๊ธฐ๋ค์ ํ์ด๋ด๊ณ ์๋ค.
์ด๋ฒ 20ํ์์ ์ฝ๋ฉํ , ์ฝ๋ฐํธ, ์๋์ฆ, ์ง๋ฐฉ์ ๊ฐ๋ฐ์๋ค์ด ์ฐธ์ฌํด ๋์์ธ ์์คํ ๊ฐ๋ฐ์ ๋ํ ๊ฒฝํ์ ๊ณต์ ํ๋ค. ์๋ ๋งํฌ์์ ๋ฐํ๋ค์ ํ์ธํด ๋ณผ ์ ์๋ค.
- 17ํ - ๋์์ธ ์์คํ (๊ธฐํ์, ๋์์ด๋ ํธ) - ๋ฆฌ๋, ์์นด, ๋ง์ด๋ฆฌ์ผํธ๋ฆฝ
- 19ํ - ๋์์ธ ์์คํ (๊ฐ๋ฐํธ 1ํ) - ๋ค๋ ธ, ๋ฑ ํฌ์๋ฌ๋, ์นด์นด์ค์ํฐํ๋ผ์ด์ฆ
- 20ํ - ๋์์ธ ์์คํ (๊ฐ๋ฐํธ 2ํ) - ์ฝ๋ฉํ , ์ฝ๋ฐํธ, ์๋์ฆ, ์ง๋ฐฉ
TensorFlow๋ก ๋์์ธ์์คํ ๋ง๋ค๊ธฐ

๋์์ธ ์์คํ ์ ์ค์ ๋ก ๋ง๋๋ ๋์์ด๋์ ์ ์ฅ์์ ๋งค๋ฒ ๊ณ ํต์ค๋ฝ๊ฒ ๋ฐ๋ณตํด์ผํ๋ ์์ ์ด ๋ง๋ค.
์ด๋ฅผ Zeplin๊ณผ tensorflow.js์ ๊ฐ์ฒด์ธ์(Object Detection)์ ์ฌ์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ๋ก์ ํธ์ ๋ํด ์๊ฐํ๊ณ ์๋ค.
Zeplin-ML๋ผ๋ ์ด ํ๋ก์ ํธ๋ ์คํฌ๋ฆฐ ๋์์ธ๋ค์์ UI๊ฐ์ฒด๋ฅผ ์ฐพ์์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ๊ทธ๊ฒ์ ๋น๊ตํ๊ธฐ ์ฝ๊ฒ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ฉด๋ค๋ ์ ๊ณตํ๋ค.
JavaScript vs JavaScript. Fight!
์ํํธ์จ์ด ๊ฐ๋ฐ์ ํ๋ฉด์ ์ฐ๋ฆฌ๋ค์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ผํ ๊ฒ์ ์ํํ์ง๋ง, ์์ ๋ค์ ๊ฒ์ด ์ต๊ณ ๋ผ๊ณ ํ๋ณดํ๋ ์๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ๋ค ์ค์์ ๊ทธ๋ค์ ์ฅ๋จ์ ์ ๋น๊ตํ๊ณ ์ ํํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ๊ทธ๋ฌ๋ ๋๋๋ก ์ฐจ๋ณํ ์์๋ ์ฐ๋ฆฌ๊ฐ ์ฑ์ทจํ๊ณ ์ ํ๋ ๊ฒ๊ณผ ๋ ๊ด๋ จ์ด ์๊ณ , ๋จ์ ๋ค์ด ๋ฌด์์ธ์ง ํญ์ ๋ช ํํ์ง๋ ์๋ค. ์ด๋ฐ ๊ฒ๋ค์ด ์ ๋ง ์ค์ํ ๊ฒ๋ค์ผ๊น?
ํ ๋ฒ์ฏค์ ๋ค๋ค ๊ณ ๋ฏผํด ๋ดค์ ์ฃผ์ ๋ค์ธ MPA vs SPA, React vs Reactivity, VDOM vs No VDOM, Components vs Web Components ๋ฑ์ ๋ ผ์ ๋ค์ด ๋ฌด์์ด๊ณ ์ด๋ ํ ์ ์ ๊ณ ๋ คํด์ผ ํ ์ง ์ดํด๋ณผ ์ ์๋ค.
Modern web apps without JavaScript bundling or transpiling
2000๋ ๋ RJS (Ruby-to-JavaScript)๋ CoffeeScript ๋ฑ์ ํตํด JavaScript๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก JavaScript ์ฝ๋๋ฅผ ์์ฑํด ๋ผ์ ์๊ฒ ๋์๊ณ , ์ดํ 2015๋ ES6๋ก์ ๋ฐ์ ์ ํตํด ๋ ๋์ JavaScript ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์๊ณ , ์ต์ ๋ฌธ๋ฒ์ ๋ธ๋ผ์ฐ์ ์ง์์ ๊ธฐ๋ค๋ฆด ํ์ ์์ด Babel์ด ๋ฏธ๋์ ์ต์ ๋ฌธ๋ฒ์ ์ฝ๋๋ฅผ ์ฆ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด ์ฃผ์๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ณต์ง๊ฐ ์๋์๊ณ , ์น์ ๋ณต์ก์ฑ์ ์๋ฐํ๊ฒ ๋ง๋ค์๋ค.
์ค๋๋ ์ ์น ํ๊ฒฝ์์ transpiler๋ ๋ฒ๋ค๋ง ๋๊ตฌ๊ฐ ๊ผญ ํ์ํ ๊ฒ์ผ๊น?
CSS module scripts: import
stylesheets like JavaScript modules
CSS ํ์ผ์ ESM๊ณผ ๊ฐ์ด import ๋ฌธ๋ฒ์ผ๋ก ๋ก๋ฉํ ์ ์๊ฒ ํ๋ CSS module script ์ง์์ด Edge์ Chrome 93์ ์ถ๊ฐ๋ ์์ ์ด๋ค.
import sheet from './styles.css' assert { type: 'css' };
document.adoptedStyleSheets = [sheet];
shadowRoot.adoptedStyleSheets = [sheet];
๋ณด๋ค ์์ธํ CSS Module Script์ ๋ํ ๋ด์ฉ์ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ผ.
Node v16.8.0 (Current) Released
Node V16.8.0์ด ๋ฆด๋ฆฌ์ฆ ๋์๋ค.
V16.6.0๋ฒ์ ๋ถํฐ๋ Array.prototype.at
์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋์ด์ array[array.length-1]
๋ก ๋ง์ง๋ง ์์๋ฅผ ์ฐพ์๊ฐ ํ์๊ฐ ์๋ค. array.at(-1)
์ด๋ฉด ๋!
A Visual Guide to React Rendering - useMemo
props๊ฐ ๋ฐ๋์ง๋ ์์๋๋ฐ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ํ์์ ์ด์ ์ useMemo๋ฅผ ํตํ ํด๊ฒฐ๊ณผ์ ์ ์๋ ค์ฃผ๋ ๊ฐ์ด๋์ด๋ค. ์๋์น ์์ ๋ฆฌ๋ ๋๋ง์ผ๋ก ๊ณ ์ํ ๊ฒฝํ์ด ์๋ค๋ฉด 1๋ ์ ๊ถํ๋ค.
Headless UI Library๋?
์ปดํฌ๋ํธ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ๋ฐํ ๋์ Headless๋ก ๊ตฌํํ๋ฉด ์ด๋ค ์ ์ด ์ข์์ง๋์ง ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์์ฑํ ์ ์๋์ง์ ๋ํด ์ค๋ช ํ๊ณ ์๋ค.
์ฌ๊ธฐ์ Headless(๋๋ Renderless)๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์คํ์ผ์ ๋ด๋นํ๋ ๋ถ๋ถ์ ์ ์ธํ๊ณ ์ํ์ ๊ด๋ จ๋ ๋ถ๋ถ๋ง์ ๋ค๋ฃจ๋ ๊ฒ์ ๋งํ๋ค.
Typescript 4.4์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ
TypeScript 4.4์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ๋ํด ์์๋ฅผ ํตํด ์ค๋ช
ํ ๊ธ์ด๋ค.
class์์ static ๋ธ๋ก์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค. ๋ํ, ๊ธฐ์กด์๋ Type Guard๋ฅผ ํตํด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ฅผ 4.4์์๋ "alias ๋ ์กฐ๊ฑด๋ฌธ๊ณผ ํ๋ณ๋ฌธ ํ๋ฆ ๋ถ์"์ ํตํด ์ข๋ ์ฝ๊ฒ ํ์
์ถ๋ก ์ ํ ์ ์๋ค.
Guideline from the 70's on how to split your React components

์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ๋๋์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฌ์ด ์ผ์ด ์๋๋ค. ์ด ๊ธ์ David Parnas์ 1979๋ โDesigning Software for Ease of Extension and Contractionโ์์ ์ป์ ์์ด๋์ด์ ๊ธฐ์ดํ์ฌ, ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ์ ์ง๋ณด์ ๋น์ฉ์ ์ค์ด๋ ์ธก๋ฉด์์ ์ด๋ป๊ฒ ์ปดํฌ๋ํธ๋ฅผ ๋๋ ์ ์์์ง ๊ฐ์ด๋๋ผ์ธ์ ์ ์ํ๋ค.
Whatโs the Average JavaScript Developer Salary in 2021?

์๋ฐ์คํฌ๋ฆฝํธ์ ์น ์ํ๊ณ์ ๋ถํฅ์ ๋ฐ๋ผ ์ ๋ง์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ๊ณ ์ต๊ทผ์๋ React, Angular, Vue 3๊ฐ ๊ตฌ๋๊ฐ ์ ์ง๋๊ณ ์๋ค. ๊ฐ ํ๋ ์์ํฌ ๋ณ ์ฐ๋ด์ ์ด๋ป๊ฒ ๋ ๊น?
์ ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ์ฐ๋ด๊ณผ ํ๋ ์์ํฌ ๋ณ ์ฐ๋ด์ ์๊ตฌ๊ถ ๊ตญ๊ฐ ์์ฃผ๋ก ํต๊ณ๋ฅผ ๋ด์ ์ ๋ฆฌํด๋์๋ค. (์์ฝ๊ฒ๋ ๋ํ๋ฏผ๊ตญ์ ํต๊ณ๋ ์๋ค.)
ํํ ๋ฆฌ์ผ
Vanilla Javascript๋ก ์ํ๊ด๋ฆฌ ์์คํ ๋ง๋ค๊ธฐ
Flux ๊ธฐ๋ฐ์ Redux, Vuex์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Vanilla JS๋ฅผ ์ด์ฉํด์ ๋ง๋ค์ด ๊ฐ๋ ํํ ๋ฆฌ์ผ ๋ฌธ์์ด๋ค. Observer pattern, ๊ทธ๋ฆฌ๊ณ ์ํ ๋ณํ๋ฅผ ์ธ์งํ ์ ์๋ Object.defineProperty, proxy ๋ฑ์ ์๊ฐํ๋ฉด์ ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋ณผ ์ ์๋ค. ์ค๋ฌด์์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํ ๋ฒ์ฉ ๋ฐ๋ผ ํด ๋ณด๋ฉด ์ข์ ํ์ต์ด ๋ ๊ฒ์ด๋ค.
How to Make your React App a Progressive Web App(PWA)
React ์ฑ์ PWA๋ก ๋ง๋ค์ด๊ฐ๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์์ ํ ํํ ๋ฆฌ์ผ์ด๋ค. PWA๋ฅผ ๋ง์ ธ๋ณด๊ณ ์ถ์ง๋ง ์ด๋ป๊ฒ ์์ํด์ผ ํ ์ง ๋ชจ๋ฅด๋ ์ํ์์ ๊ธ์ ํ๋ฒ ๋ฐ๋ผ ํด ๋ณด๋ฉด PWA์ ๋ํ ์ดํด๋ฅผ ๋์ผ ์ ์์ ๊ฒ์ด๋ค. ํํ ๋ฆฌ์ผ์ ๋ฐ๋ผ ํ์ง ์๊ณ PWA์ Service Worker์ ๋ํ ์ค๋ช ๋ง ์ฝ์ด๋ณด์๋ PWA์ ๋ํ ๊ฐ์ ์ก์ ์ ์๋ค.
์ฝ๋์ ๋๊ตฌ
JS is weird
JavaScript๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ์ด์ํ ๋ฌธ๋ฒ 25๊ฐ๋ฅผ ํ ์ ์๋ค.
์ฌ์ฌํ์ด๋ก ํ์ด๋ณด๊ณ ์ค๋ฌด์์๋ ์ด์ ๊ฐ์ ํผ๋์ค๋ฌ์ด ๋ฌธ๋ฒ์ ๊ฐ๊ธ์ ์ง์ํด์ผ๊ฒ ๋ค.
React Suite
React Suite๋ ๊ธฐ์ ์ฉ ์ ํ์ ์ํ ์คํ์์ค ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ข์ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ์ ์ด์ ์ ๋์๋ค. ๋งํฌ์ ๊ฐ์ด ๊ฐ ์ปดํฌ๋ํธ์ ๋์์ธ ํ๋กํ ํ์ ๊ณผ ๋ช ์ธ๋ ์ ๊ณตํ๋ค.
WEBRIX

Bootstrap์ด๋ Material-UI์ ๊ฐ์ ์ปดํฌ๋ํธ ํ๋ ์์ํฌ(๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ๋์ ํด ์น์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ฉด ์ด๊ธฐ์ ๋น ๋ฅด๊ฒ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง ์ปดํฌ๋ํธ๋ฅผ ์ปค์คํฐ๋ง์ด์ง์ ํ๋ ค๊ณ ํ๊ฑฐ๋, ์๋น์ค๊ฐ ๋ฐ์ ํด ์์ฒด์ ์ธ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ๋ค๊ณ ํ์ ๋ ์์ ๊ฐ์ ํ๋ ์์ํฌ์ ๋์ ์ด ๋ถ๋ด์ด ๋ ์ ์๋ค.
๊ทธ๋ ๋ค๊ณ ํ๋๋ถํฐ ์ด๊น์ง ์ปดํฌ๋ํธ๋ฅผ ์์ฒด์ ์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ ๋ํ ๋ญ๋น์ ์ธ ๋ถ๋ถ์ด ์๊ธด๋ค.
์ด๋ฅผ ํด๊ฒฐํด ์ค ์ ์๋ ์๋ฃจ์ ์ด ๋ฐ๋ก WEBRIX์ด๋ค.
WEBRIX ๋ <Movable/>
, <Stackable/>
, <Pannable/>
, <Resizable/>
, <Poppable/>
, <Scalable/>
, <Scrollable/>
, <Collapsible/>
์ ๊ฐ์ด ๊ธฐ๋ฅ์ ๋ถ๋ถ์ ํฌ์ปค์ค ๋ ์ปดํฌ๋ํธ๋ค์ ์ ๊ณตํ๋ค. ์๋น์ค ๊ฐ๋ฐ์๋ ์ปดํฌ๋ํธ์ presentaion ์ ์ธ ๋ถ๋ถ๋ง ์ ๊ฒฝ ์จ์ ๊ฐ๋ฐํ๋ฉด ๋๋ค.
wavesurfer.js

Web Audio API์ CANVAS๋ก audio๋ฆฌ์์ค๋ฅผ ์๊ฐํํ๊ณ ํ์ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
WinXP

Windows XP ์ด์์ฒด์ ์ ๋ช๊ฐ์ง ๊ธฐ๋ฅ๊ณผ ๊ฐ๋จํ ์ฑ๋ค์ React์ hooks๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ํ๋ก์ ํธ์ด๋ค. ์๋์ฐ์์ ์น์ํ ์ธํฐ๋ ์ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณผ ์ ์๋ค.
macos-web

์ด๋ฒ์ MacOS ์ด์์ฒด์ ๋ค. Svelte๋ก ์์ฑ๋์๋ค. ์ฝ๋๋ฅผ ํตํด MacOS์ ์ธํฐ๋ ์ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ํ์ธํ ์ ์๋ค.