TIL

TIL 38: [React] ์ปดํฌ๋„ŒํŠธ ๋””์ž์ธ

Deviloper๐Ÿ˜ˆ 2021. 9. 14. 00:02

์˜ค๋Š˜์€ 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์€ ๊ณ ํ’ˆ์งˆ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.