2023-09 
๐ ๋งํฌ & ์ฝ์ ๊ฑฐ๋ฆฌ
์ฑ๋ฅ ํ๋ฉด ๋น ์ง ์ ์๋ ๋ฉ๋ชจ์ด์ ์ด์ , ๋ค๊ฐ ๊ถ๊ธํด

React์์ ๋ฉ๋ชจ์ด์ ์ด์ ์ด ์ฑ๋ฅ ๊ฐ์ ์ ๋ง๋ฅ ํด๊ฒฐ์ฑ ์ผ๊น?
์ด ๊ธ์์๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด๋ป๊ฒ ํ๋ฉด ๋ ์ ์ธ ์ ์๋์ง์ ๋ํด ๋ค์ํ ์ผ์ด์ค์ ์ฝ๋๋ฅผ ์๋ก ๋ค๋ฉฐ ์ค๋ช ํ๊ณ ์๋ค.
๊ธ์ ์ฝ๊ณ ๋ ํ์๋ ์ด๋ค ์ํฉ์์ ๋ฉ๋ชจ์ด์ ์ด์ ์ด ์คํ๋ ค ์ฑ๋ฅ์ ์ ํ ์ํค๋์ง, ์ด๋ค ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ณ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋์ง, ์ด๋ป๊ฒ ํ๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ์ด์ ์ด์ ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋์ง ์๊ฒ ๋ ๊ฒ์ด๋ค.
State of CSS 2023

์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ CSS ํํฉ ์ค๋ฌธ์กฐ์ฌ ๊ฒฐ๊ณผ๊ฐ ๊ณต๊ฐ๋์๋ค.
CSS Frameworks ๋ถ๋ฌธ์์๋ Tailwind CSS๊ฐ ์ ๋ ๋์ ์ด์ด ๊ณ์ํด์ ์ฌ์ฉ๋์ด ์ฐ์ํฅ ํ๋ฉฐ 50%๋ฅผ ๊ธฐ๋กํ๊ณ ๊ฐ์ฅ ๋์ ๊ธ์ ์ ์ธ ๊ฒฝํ์ ๋ํ๋ด์๋ค. ํ์ง๋ง ๊ด์ฌ๋์ ๋ง์กฑ๋ ๋ถ๋ถ์์๋ Open Props๊ฐ Tailwind CSS๋ฅผ ์์ง๋ฅด๋ ๋ชจ์ต์ ๋ณด์๋ค.
CSS-in-JS ๋ถ๋ฌธ์์๋ CSS Modules๊ฐ ๊ฐ์ฅ ํฐ ๋ง์กฑ๋๋ฅผ ๋ณด์๊ณ Styled Components๊ฐ ๊ทธ ๋ค๋ฅผ ์ด์๋ค.
CSS Frameworks์ CSS-in-JS ์ฌ์ฉ์์ ํ๋ณต๋๋ฅผ ๋น๊ตํ๋ฉด ๊ฐ๊ฐ 35.1%, 20.3%๋ก CSS Frameworks ์ฌ์ฉ์์ ํ๋ณต๋๊ฐ ์ข ๋ ๋์๋ค.
Randomness in CSS using trigonometry
์ต์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ค์์๋ ์๋ก์ด CSS Trigonometric functions(์ผ๊ฐํจ์)๋ค์ ์ฌ์ฉํ ์ ์๋ค๋ ์ฌ์ค์ ์๊ณ ์๋๊ฐ? ์ด ํจ์๋ค์ ์ฌ์ฉํ๋ฉด ์ด์ ์๋ ๋ถ๊ฐ๋ฅํ๋ CSS ๋ ๋ฒจ์์ ์ํ์ ๊ณ์ฐ์ ๋ณด๋ค ์ ๊ตํ๊ฒ ์ํํ ์ ์๋ค.
์ด ๊ธ์์ ์ด๋ค ํจ์๋ฅผ ํ์ฉํด pseudo-random ๊ฐ๋ค์ ์์ฑํด ์ ๋๋ฉ์ด์ ์ด๋ ์์น ๋ฑ์์ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
[์ฐธ๊ณ ] ์ผ๊ฐํจ์์ ๋ํด ๋ณด๋ค ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด, ๋ค์ ๊ธ์ ์ฐธ๊ณ ํ๋ผ.
htmx
์น ๊ฐ๋ฐ์ ๋๋ถ๋ถ์ HTML/CSS์ ํตํด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๊ณ , ๊ทธ์ ๋ฐ๋ผ JavaScript๋ฅผ ํตํด ์๋ก์ด ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ์ ๊ทผ์ ์ค๋ ์๊ฐ ๋์ ๋ฐ์๋ค์ด๊ณ ์ฌ์ฉํ๊ณ ์๋ค.
htmx๋ ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ์๋ ๊ฐ๋ฐ ๋ฐฉ์์ ์๋ก์ด ์ ๊ทผ์ ์ ์ํ๋ฉฐ, ๋๋ถ๋ถ์ ์์ ๋ค์ HTML ํ๊ทธ์ ์์ฑ์ ํตํด ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ค.
<!-- htmx๋ฅผ ๋ก๋ฉ -->
<script src="https://unpkg.com/htmx.org@1.9.5"></script>
<button
hx-post="/some-api"
hx-trigger="click"
hx-target="#parent-div"
hx-swap="outerHTML"
>
Click Me!
</button>
์์ ์ฝ๋๋ ์ฌ์ฉ์๊ฐ <button>
์ ํด๋ฆญํ๋ฉด, /some-api
๋ก POST ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ #parent-div
์ outerHTML๋ก ๊ต์ฒดํ๋ค.
[์ฐธ๊ณ ] ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ์๊ณ ์ถ๋ค๋ฉด, ๋ค์ ๋งํฌ๋ค์ ์ฐธ๊ณ ํ๋ผ.
Optimizing speed on eBay.com
์น ์ฑ๋ฅ์ ์จ๋ผ์ธ ๋น์ฆ๋์ค, ํนํ ์จ๋ผ์ธ ์ผํ์์ ๋งค์ถ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์ค์ํ ์์ญ์ด๋ค. eBay ๋ํ ์ด์ ์ค์์ฑ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์, 2019๋ ๋ถํฐ ์ฑ๋ฅ ๊ฐ์ ์ ๊ฐ์น๋ฅผ ์ธ์ํ๊ธฐ ์์ํ๊ณ ์ค์ ๋ก ๊ฒ์ ๋ก๋ฉ ์๊ฐ์ด 100ms ํฅ์๋ ๋๋ง๋ค ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ ํ์๊ฐ 0.5% ์ฆ๊ฐํ๋ค๊ณ ํ๋ค.
์ฑ๋ฅ ๊ฐ์ ์ ์ํด ์ด๋ค ํญ๋ชฉ๋ค์ ์ง์คํด์ผ ํ๋์ง๋ฅผ eBay์ ์ฌ๋ก๋ก๋ถํฐ ๋ฐฐ์๋ณผ ์ ์๋ค.
How we reduced the size of our JavaScript bundles by 33%

์ด ๊ธ์, ๋๋กญ๋ฐ์ค๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๋ ๊ฑฐ์ ๋ฒ๋ค๋ฌ๋ฅผ ๋กค์ ์ผ๋ก ๊ต์ฒดํ๋ฉด์ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ์ค์ด๊ณ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฐ์ ํ๋ ๊ฒฝํ๊ธฐ๋ฅผ ๋ด๊ณ ์๋ค.
๋กค์ ์ ์ ์ ํํ๋์ง, ๊ธฐ์กด ๋ ๊ฑฐ์ ๋ฒ๋ค๋ฌ์์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด์ ๋ํ๋ ๋ฌธ์ ์ ์ด ๋ฌด์์ด์๋์ง, ์ด๋ค ์ ๋ค์ด ๊ฐ์ ๋์๋์ง ์ดํด๋ณผ ์ ์๋ค.
ํ๊ตญ์ด ๋ฒ์ญ ๊ธ๋ ์๋ค.
How Back/forward Cache Helped Yahoo! JAPAN News Increase Revenue by 9% on Mobile

Back/Forward Cache
๋ ์ฆ์ ๋ค๋ก, ์์ผ๋ก ํ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ธ๋ผ์ฐ์ ์ต์ ํ ๊ธฐ๋ฒ์ผ๋ก bfcache
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง์ด ์๋ ค์ ธ ์๋ค.
์ด ๊ธฐ๋ฅ์ Firefox 1.5(2005๋
)์์ ๋์
๋์๊ณ , Safari, Chrome์์๋ ์ง์์ด ๋๊ณ ์๋ค.
์ด ๊ธ์์๋ Yahoo Japan News์์ bfcache ์ ์ค๋ฅ ์ ๊ฐ์ ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํจ๊ณผ ๋์์ ๋น์ฆ๋์ค์ ์ธ ์ฑ๊ณผ๋ ๊ฐ์ ธ์จ ๋ด์ฉ์ ์๊ฐํ๋ค.
Decoupling UI and Logic in React: A Clean Code Approach with Headless Components

๋ณต์กํ UI๋ฅผ ์ปดํฌ๋ํธํํ๋ค๋ฉด ๋ ๋๋ง๊ณผ ์ํ ๊ด๋ฆฌ/๋ก์ง์ ๋ถ๋ฆฌํ ํค๋๋ฆฌ์ค ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ผ ์ ์๋ค. ํค๋๋ฆฌ์ค ๋ฐฉ์์ ์ฌ์ฉํด UI์ ๋์ ๋ถ๋ถ์ ๋ถ๋ฆฌํ๋ค๋ฉด, ์ ์ง ๋ณด์๊ฐ ์ฝ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํด ์ค๋ณต์ฑ์ ์ค์ด๊ณ , ๋์๊ฐ ์ ์ฌ์ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์๋ค.
์ด ๊ธ์์๋ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ฅผ ์๋ก ์์ํด ํค๋๋ฆฌ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Downshift๋ฅผ ์ฌ์ฉํ์ฌ ์ข ๋ ๋ณต์กํ ์๋๋ฆฌ์ค๋ก ํ์ฅํ๋ ์ค๋ช ์ ํ๊ณ ์๋ค. ์ด๋ฅผ ํตํด ํค๋๋ฆฌ์ค๊ฐ ๋ณต์กํ UI์ ์ด๋ป๊ฒ ํจ๊ณผ์ ์ธ์ง ์ดํด๋ณผ ์ ์์ ๊ฒ์ด๋ค.
Three common types of test automation

์น ํ ์คํธ ์ข ๋ฅ์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์ง ์๊ฐํ๊ณ ๊ด๋ จ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ตํ๊ฒ ์ ์ํ๊ณ ์๋ค.
10 essential VS Code tips & tricks for greater productivity

VS Code๋ฅผ ์ฌ์ฉํ๋ฉด์ ์์๋๋ฉด ์ข์ 10๊ฐ์ง ํ๋ค์ ์๊ฐํ๊ณ ์๋ค. ์๋ ํฌ๋ฉงํ
, ํด๋ ํ์ผ ๋นจ๋ฆฌ ๋ง๋ค๊ธฐ ๋ฑ ์๊ณ ์์ผ๋ฉด ์ ์ฉํ ๋ด์ฉ๋ค์ด ์์ง๋ง ๊ทธ์ค์์๋ ๋ถ๋๋ฌ์ด ์ปค์ ๊ธฐ๋ฅ(Editor: Cursor Smooth Caret Animation
)์ด ์ฌ๋ฏธ์์๋ค.
๐น ํํ ๋ฆฌ์ผ
JavaScript for Web Designers
์ ๋ชฉ์์ ์ ์ ์๋ฏ์ด, ์ด ์ฑ ์ ๋์์ด๋๊ฐ JavaScript๋ฅผ ์ดํดํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด์ง๋ง ์ด๋ ๋ฐ๋๋ก ์๊ธฐํ๋ฉด ๋น ๊ธฐ์ ์ ์ง๋ฌด๋ฅผ ์ํํ๋ ๋ชจ๋ ์ด๋ค์ ์ํ ์ฑ ์ด๋ผ๊ณ ํ ์ ์๋ค.
๐ฆ ์ฝ๋์ ๋๊ตฌ
JavaScript Visualizer 9000
JavaScript ๋ฐํ์ ๋ชจ๋ธ์ธ Event Loop๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋๊ตฌ๋ก, ๊ฐ ๋ผ์ธ๋ณ ์ฝ๋๋ค์ ํธ์ถ ํํ์ ๋ฐ๋ผ Task ๋๋ Microtask ํ๋ก ๋ถ๋ฆฌ๋๊ณ , ์ฝ ์คํ์ด ์ด๋ป๊ฒ ์์ฌ ์ต์ข ์ ์ผ๋ก ์คํ๋๋์ง๋ฅผ ์ง์ ํ์ธํด ๋ณผ ์ ์๋ค.
ts-reset
Typescript์ ๊ธฐ๋ณธ ํ์ ์ ๊ต์ ํด ์ฃผ๋ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. CSS ๋ฆฌ์ ์ ํ๋ฏ์ด ํ์ ์ ๋ฆฌ์ ํ๋ค.
ts-reset๊ฐ ์์๋:
- ๐จ
fetch ํจ์์ .json()
๊ณผJSON.parse()
๋ any ํ์ ์ ๋ฐํํจ - ๐คฆ
.filter(Boolean)
๊ฐ ํ์ ์ ์ผ๋ก undefined๋ฅผ ๊ฑธ๋ฌ์ฃผ์ง ๋ชปํจ - ๐ก
array.includes()
๋ ์ข ์ข readonly ๋ฐฐ์ด์์ ๋์์ด ๋๋ฌด strictํด์ ๋ถํธํจ
ts-reset์ ์ฌ์ฉํ ๋:
- ๐
fetch ํจ์์ .json()
๊ณผJSON.parse()
๋ unknown ํ์ ์ ๋ฐํํจ - โ .filter(Boolean)๊ฐ ์ ํํ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํ์ ์ ๋ฐํํจ
- ๐ฅน
array.includes()
๊ฐ ์ฌ์ฉํ๊ธฐ ํธํด์ง - ๐ ์ธ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ํฌํจ
shadcn-ui/ui
shadcn-ui๋ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉด์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ค.
UI ์ปดํฌ๋ํธ ์ฝ๋๊ฐ ํ์ผ๋ก ์ถ๊ฐ๋์ด ์ค์น๊ฐ ๋๋ ํน์ดํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ถ์, ์ฝ๋ ๋์ ๋ฐ ์คํ์ผ์ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๋ค.
RSC Devtools

RSC(React Server Component) payload๋ฅผ ๋คํธ์ํฌ ํญ์์ ๋ณด๋ฉด ๊ตฌ์กฐ๋ฅผ ํ์ ํ๊ธฐ ํ๋ค๋ค. RSC Devtools์ RSC payload๋ฅผ ์๊ฐ๋๋ณ๋ก ํ์, ๋ถ์ํ ์ ์๋๋ก ๋์์ค๋ค. ๋น๊ณต์ Devtool์ด๋ฉฐ, ๊ฐ๋ฐ ์ํฐํด์์ ์์ธํ ๊ฐ๋ฐ ํ๊ธฐ๋ฅผ ์ฝ์ ์ ์๋ค.
Regulex

์ ๊ท ํํ์์ ์๊ฐํํด์ฃผ๋ ์๋น์ค
react-timer-hook
์คํฑ์์น, ํ์ด๋จธ, ํ์์ hook์ผ๋ก ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
VitePress
VitePress๋ Vue์ Vite๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ์ฌ์ดํธ๋ฅผ ๋ง๋ค ์ ์๋ ๋๊ตฌ๋ค.