TIL 38: [React] ์ปดํฌ๋ํธ ๋์์ธ
์ค๋์ React์์ ์ปดํฌ๋ํธ ๋จ์๋ก ์ด๋ป๊ฒ ๋์์ธ ํ ์ ์๋์ง์ ๋ํด ์ด๋ก ์ ์ธ ๋ถ๋ถ์ ํ์ตํ์ต๋๋ค. ๊ฒ์ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ์ด๋ ๊ฒ CSS๋ฅผ ์ ์ฉํ๊ณ ์ถ์๋๋ฐ ๊ทธ ๋๋ ํ๋ ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ ์ ๋๋ก ๊ตฌํํ ์ ์์์ง๋ง, ์ด์ ์ด ๋ถ๋ถ์ ์ ๊ทน ํ์ฉํด์ ์ข ๋ ํธ๋ฆฌํ๊ฒ ํ์ด์ง๋ฅผ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค ๐
์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐํ๊ธฐ
Component-Driven Development
Component-Driven Development(CDD)๋ ์ฌ์ฌ์ฉํ ์ ์๋ UI ์ปดํฌ๋ํธ(๋ถํ) ๋จ์๋ก ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ปํฉ๋๋ค. CDD๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ์ ์์ฒญ๋ฐ์๋ ๋ฒํผ์ ๋ ์์ฒญํ๋ ๊ฒฝ์ฐ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ๋ฉ๋๋ค.
Storybook
CDD๋ฅผ ์ง์ํ๋ ๋๊ตฌ๋ Component Explorer(์ปดํฌ๋ํธ ํ์๊ธฐ)๋ผ๊ณ ํฉ๋๋ค. ๊ทธ ์ค ํ๋๊ฐ Storybook ์ ๋๋ค.
Storybook์ ์ฃผ์ ๊ธฐ๋ฅ์ ์๋์ ๊ฐ์ต๋๋ค.
- UI ์ปดํฌ๋ํธ๋ค์ ์นดํ๋ก๊ทธ ํํ๊ธฐ
- ์ปดํฌ๋ํธ ๋ณํ๋ฅผ Stories๋ก ์ ์ฅํ๊ธฐ
- ํซ ๋ชจ๋ ์ฌ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ฐ๋ฐ ํด ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ
- ๋ฆฌ์กํธ๋ฅผ ํฌํจํ ๋ค์ํ ๋ทฐ ๋ ์ด์ด ์ง์ํ๊ธฐ
Storybook์ ํฐ๋ฏธ๋๋ก ์ค์นํ ํ, Storybook์ด ์คํ๋๊ธฐ ์ํ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
import React from "react";
import { Button } from "@storybook/react/demo";
export default {
title: "Button",
component: Button
};
export const Primary = () => (
<Button>Hello Button</Button>
);
export const Secondary = () => (
<Button>Bye Button</Button>
);
๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์์ Primary์ Secondary ํจ์ ์ปดํฌ๋ํธ๋ค์ export ํ๋ฉด storybook์์ UI ๋ชฉ์ ์ ํ์ธํ ์ ์์ต๋๋ค.
CSS ๋ฐฉ๋ฒ๋ก ํน์ง
ํน์ง | ์ฅ์ | ๋จ์ | |
CSS | ๊ธฐ๋ณธ์ ์ธ ์คํ์ผ๋ง ๋ฐฉ๋ฒ | - | ์ผ๊ด๋ ํจํด ๊ฐ๊ธฐ ์ด๋ ค์ |
SASS | CSS๋ฅผ ์ปดํ์ผํ ๋ ์ปดํ์ผ ์ง์ ์ ์คํ๋๋ ํ๋ก๊ทธ๋จ (์ ์ฒ๋ฆฌ๊ธฐ) | ๋ณ์/ํจ์/์์ ๊ฐ๋
์ ํ์ฉํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ CSS ๊ตฌ์กฐํ |
์ ์ฒ๋ฆฌ ๊ณผ์ ํ์ ๋๋ฒ๊น ์ ์ด๋ ค์ ์ปดํ์ผํ CSS ํ์ผ์ด ๊ฑฐ๋ํด์ง |
BEM | CSS ํด๋์ค๋ช ์์ฑ์ ์ผ๊ด๋ ํจํด์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ๋ก | ๋ค์ด๋ฐ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ๋ถํ์ |
์ ํ์ ์ด๋ฆ ์ฅํฉํ๊ณ , ํด๋์ค ๋ชฉ๋ก ๋๋ฌด ๋ง์์ง |
Styled Component (CSS in JS) | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก CSS๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | CSS๋ฅผ ์ปดํฌ๋ํธ ์์ผ๋ก ์บก์ํ ๋ค์ด๋ฐ์ด๋ ์ต์ ํ๋ฅผ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ |
๋น ๋ฅธ ํ์ด์ง ๋ก๋์ ๋ถ๋ฆฌํจ |
Styled Component (CSS in JS)
Styled Component์ ์ฅ์ ์ ๋ํด ๋ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- Automatic critical CSS Styled Component ๋ ํ๋ฉด์ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋์๋์ง ์ถ์ ํด์ ํด๋นํ๋ ์ปดํฌ๋ํธ์ ๋ํ ์คํ์ผ์ ์๋์ผ๋ก ์ฝ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์ ์ ํ ๋ถ๋ฐฐํด ๋์ผ๋ฉด ์ฌ์ฉ์๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ๋ ์ต์ํ์ ์ฝ๋๋ง์ผ๋ก ํ๋ฉด์ด ๋์์ง๋๋ก ํ ์ ์์ต๋๋ค.
- No class name bugs Styled Component ๋ ์ค์ค๋ก ์ ๋ํฌํ className ์ ์์ฑํฉ๋๋ค. ์ด๋ className ์ ์ค๋ณต์ด๋ ์คํ๋ก ์ธํ ๋ฒ๊ทธ๋ฅผ ์ค์ฌ์ค๋๋ค.
- Easier deletion of CSS ๊ธฐ์กด์๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ์ญ์ ํ ์ปดํฌ๋ํธ์ ํด๋นํ๋ ์คํ์ผ ์์ฑ์ ์ ๊ฑฐํ๊ธฐ์ํด CSS ํ์ผ ์์ className์ ์ด๋ฆฌ์ ๋ฆฌ ์ฐพ์์ผ ํ์ต๋๋ค. ํ์ง๋ง Styled Component ๋ ๋ชจ๋ ์คํ์ผ ์์ฑ์ด ํน์ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ์ญ์ ํ ๊ฒฝ์ฐ ์ด์ ๋ํ ์คํ์ผ ์์ฑ๋ ํจ๊ป ์ญ์ ๋ฉ๋๋ค.
- Simple dynamic styling className์ ์ผ์ผ์ด ์๋์ผ๋ก ๊ด๋ฆฌํ ํ์ ์์ด React ์ props ๋ ์ ์ญ ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ปดํฌ๋ํธ์ ์คํ์ผ ์์ฑ์ ๋ถ์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ ๋๋ค.
- Painless maintenance ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์์ํ๋ ์์ฑ์ ์ฐพ์ ๋ค๋ฅธ CSS ํ์ผ๋ค์ ๊ฒ์ํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋๋ผ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ต์ง ์์ต๋๋ค.
- Automatic vendor prefixing ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ง๋ค ๊ธฐ์กด์ CSS ๋ฅผ ์ด์ฉํ์ฌ ์คํ์ผ ์์ฑ์ ์ ์ํ๋ฉด ๋ ๋ฟ์ ๋๋ค. ์ด์ธ์ ๊ฒ๋ค์ Styled Component ๊ฐ ์์์ ์ฒ๋ฆฌํด ์ค๋๋ค.
Styled Component ์์๋ package.json์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋๋ก ๊ถ์ฅํ๊ณ ์์ต๋๋ค. ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ฌ๋ฌ ๋ฒ์ ์ Styled Component๊ฐ ์ค์น๋์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ค์ฌ์ค๋๋ค.
{
"resolutions": {
"styled-components": "^5"
}
}
DOM Reference๋ฅผ ํ์ฉํ useRef
React๋ ์๋์ ๊ฐ์ ์์ธ์ ์ธ ์ํฉ์์ useRef์ผ๋ก DOM ๋ ธ๋, ์๋ฆฌ๋จผํธ, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์ฃผ์๊ฐ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์๋ ์์ ์ฝ๋์ฒ๋ผ ์์ฑํ์๋ฉด ์ฃผ์๊ฐ์ ํ์ฉํ ์ ์์ต๋๋ค.
- focus
- text selection: ํ ์คํธ ๋ณต๋ถ์ด๋ ๊ฒ์ํ๊ธฐ ์ํด ์์ญ ์ค์ ํ๊ณ ์ถ์ ๋
- media playback: ๋์์ ์ผ์์ ์ง/์ฌ์๊ธฐ๋ฅ
- ์๋๋ฉ์ด์ ์ ์ฉ
- d3.js, greensock ๋ฑ DOM ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ: d3.js๋ ๋์ ์ด๊ณ ์ธํฐ๋ ํฐ๋ธํ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. greensock์ ๊ณ ํ์ง ์ ๋๋ฉ์ด์ ์ด ๊ตฌํ๋ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.