์ค๋์ ์ ์ ๋ค๋ค๋ดค์๋ Styled-Components ์ ๋ํด ๋ฐฐ์ด๋ค.
์ด๊ฒ์ด CDD์ด๋ฉฐ, ๋ ๋ค๋ฅธ ํด์ธ Storybook ์ด๋ผ๋ ๊ฒ์ด ์๋ค๋ ์ฌ์ค์ ์ฒ์ ์๊ฒ๋์๋ค.
๋จผ์ ์ด๋ฌํ ๋ฐฉ๋ฒ์ด ๋ฑ์ฅํ๊ฒ ๋ ๋ฐฐ๊ฒฝ์ธ Component Driven Development(CDD)์ CSS-in-JS์ ๋ํด์ ๋ค๋ค๋ณด๊ฒ ๋ค.
ํ์ด์ง๊ฐ ๋ชจ๋ ์์ฑ๋์๋๋ฐ, ๋ค๋ฅธ ํ์ด์ง์ ์ ์ฉ๋๋ ๋ฒํผ์ ๋ํ ์ถ๊ฐ์ ์ธ ๊ธฐํ์์ด ๋์ฐฉํ๋ค.
์ด? ๊ทธ๋ฐ๋ฐ ๊ธฐํ์๊ฐ ์์ฒญํ ์ฌํญ์์ ๋ฒํผ์ ๋ํ ๊ธฐํ์ด ์ด์ ์ ์์ฒญ๋ฐ์๋ ๋ฒํผ์ ๋๊ฐ์ด ์ฌ์ฉํ๋๋ก ์์ฒญํ๋ค๋ฉด?
๋์์ด๋์ ๊ฐ๋ฐ์๋ ์ด ๋ถ๋ถ์ ๋ชจ๋ ์๋ก ๋ง๋ค์ด์ผ ํ๋ ๊ฑธ๊น?
๋ต์ ์๋๋ค.
๋์์ธ๊ณผ ๊ฐ๋ฐ ๋จ๊ณ์์๋ถํฐ ์ฌ์ฌ์ฉํ ์ ์๋ UI ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋์์ธํ๊ณ ๊ฐ๋ฐํ๋ฉด ์ด๋ฐ ๊ณ ๋ฏผ์ ํด๊ฒฐํ ์ ์๋ค.
์ด ๊ณ ๋ฏผ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฐ๋ฐ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก Component Driven Development (CDD) ์ด๋ค.
๋ ๊ณ ์ฒ๋ผ ์กฐ๋ฆฝํด ๋๊ฐ ์ ์๋ ๋ถํ ๋จ์๋ก UI ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ ๊ฐ๋ฐ์ ์งํํ ์ ์๋ค.
์ธํฐ๋ท์ด ๋ง๋ค์ด์ง ์ดํ ๊ธฐ์ ์ ๋ฐ๋ฌ๊ณผ ํจ๊ป ์ฌ์ฉ์๋ค์ ๋ค์ํ ํ๊ฒฝ(๋๋ฐ์ด์ค)์์ ์ธํฐ๋ท์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ค.
์ด์ ๋ฐ๋ผ ๊ฐ๋ฐ์๋ค์ CSS ์์ฑ ๋ฐฉ์๋ ๊พธ์คํ ์งํํด ์ค๊ณ ์๋ค.
ํ๋ก์ ํธ์ ๊ท๋ชจ๋ ๋ณต์ก๋๊ฐ ์ ์ ์ปค์ง๊ณ ํจ๊ป ์์
ํด์ผ ํ ํ์ ์๋ ๋ง์์ง์
๋ฐ๋ผ CSS๋ฅผ ์์ฑํ๋ ์ผ๊ด๋ ํจํด์ด ์๋ค๋ ๊ฒ์ ๊ฐ๋ฐ์๋ค์๊ฒ ๊ฐ์ฅ ํฐ ๊ฑธ๋ฆผ๋์ด ๋์๋ค.
๋ํ ๋ชจ๋ฐ์ผ์ด๋ ํ๋ธ๋ฆฟ์ ๋น๋กฏํ ๋ค์ํ ๋๋ฐ์ด์ค๋ค์ ๋ฑ์ฅ์ผ๋ก ์น์ฌ์ดํธ๋ค์ด
๋ค์ํ ๋์คํ๋ ์ด๋ฅผ ์ปค๋ฒํด์ผ ํ๊ธฐ ๋๋ฌธ์ CSS๋ ๋ ๋ณต์กํด์ง๊ฒ ๋์๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด CSS ์ ์ฒ๋ฆฌ๊ธฐ(CSS Preprocessor)๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ค.
CSS ์ ์ฒ๋ฆฌ๊ธฐ(CSS Preprocessor)๋ CSS๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ์์ฑ๋ ์ ์๊ฒ ๋์์ ์ฃผ๋ ๋๊ตฌ์ด๋ค.
ํ์ง๋ง ์ด CSS ์ ์ฒ๋ฆฌ๊ธฐ(CSS Preprocessor) ์์ฒด๋ง์ผ๋ก๋ ์น ์๋ฒ๊ฐ ์ธ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์
๊ฐ CSS ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ง๋ Compiler๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ ์ปดํ์ผ์ ํ๊ฒ ๋๋ฉด ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ CSS ๋ฌธ์๋ก ๋ณํ์ด ๋๋ค.
์ด๋ฅผ ํตํด CSS ํ์ผ๋ค์ ์ ๊ตฌ์กฐํํ ์ ์๊ฒ ๋์๊ณ , ์ต์ํ CSS ํ์ผ์ ์์ ํ์ผ๋ก ๋ถ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ฒผ๋ค.
CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ค์์ ๊ฐ์ฅ ์ ๋ช ํ SASS๋
Syntactically Awesome Style Sheets์ ์ฝ์๋ก CSS๋ฅผ ํ์ฅํด ์ฃผ๋ ์คํฌ๋ฆฝํ ์ธ์ด์ด๋ค.
์ฆ, CSS๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ธ์ด๋ก์ ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ํน์ ์์ฑ์ ๊ฐ์ ๋ณ์๋ก ์ ์ธํ์ฌ ํ์ํ ๊ณณ์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ ์ฉํ ์๋ ์๊ณ , ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ ์ธ์ผ๋ก ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด ์ฃผ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ฐ์ก๋ค.
๊ทธ๋์ SASS๋ SCSS ์ฝ๋๋ฅผ ์ฝ์ด์ ์ ์ฒ๋ฆฌํ ๋ค์ ์ปดํ์ผํด์
์ ์ญ CSS ๋ฒ๋ค ํ์ผ์ ๋ง๋ค์ด ์ฃผ๋ ์ ์ฒ๋ฆฌ๊ธฐ(preprocessor)์ ์ญํ ์ ํ๋ค.
ํ์ง๋ง ์ผ๋ง ์ง๋์ง ์์์ SASS๊ฐ โCSS์ ๊ตฌ์กฐํโ๋ฅผ
ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ ์ฅ์ ๋ณด๋ค ๋ค๋ฅธ ๋ฌธ์ ๋ค์ ๋ ๋ง์ด ๋ง๋ค์ด๋ธ๋ค๋ ๊ฒ์ด ๋ฐํ์ก๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์ ์ฒ๋ฆฌ๊ธฐ(preprocessor)๊ฐ ๋ด๋ถ์์ ์ด๋ค ์์ ์ ํ๋์ง๋ ์์ง ๋ชปํ ์ฑ, ์คํ์ผ์ด ๊ฒน์น๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋จ์ํ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๋ด๋ ๊ฒ์ ์์งํ๊ฒ ๋์๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ปดํ์ผ๋ CSS์ ์ฉ๋์ ์ด๋ง์ด๋งํ๊ฒ ์ปค์ง๊ฒ ๋์๋ค.
์ด๋ฌํ CSS ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด BEM, OOCSS, SMACSS ๊ฐ์ CSS ๋ฐฉ๋ฒ๋ก ์ด ๋๋๋์๋ค.
๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์์ผ๋ ๊ฒฐ๊ตญ ์ธ ๋ฐฉ๋ฒ๋ก ๋ชจ๋ ๊ฐ์ ์งํฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
๋ฐฉ๋ฒ๋ก ์ ๊ณตํต ์งํฅ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ฐ CSS ๋ฐฉ๋ฒ๋ก ๋ค์ ๊ฐ์ด ์ผํ๋ ํ ๋๋ฃ๋ค์ ํ์ํฌ์๋ ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํ์์ด ํจ๊ป
์์
ํ๋ ์ํฉ์์ CSS ์์ฑ์ ์์ด์ ๋ฐฉ๋ฒ๋ค์ ๊ท์น์ผ๋ก ์ ํด๋๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ ์์๋ผ๊ณ ํ ์ ์๋ค.
๋ํ์ ์ธ CSS ๋ฐฉ๋ฒ๋ก ์ผ๋ก๋ BEM์ด ์๋ค.
BEM์ด๋ Block, Element, Modifier๋ก ๊ตฌ๋ถํ์ฌ ํด๋์ค๋ช
์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ,
Block, Element, Modifier ๊ฐ๊ฐ์ โ์ __๋ก ๊ตฌ๋ถํ๋ค.
ํด๋์ค๋ช
์ BEM ๋ฐฉ์์ ์ด๋ฆ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ์ฌ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฉฐ
HTML/CSS/SASS ํ์ผ์์๋ ๋ ์ผ๊ด๋ ์ฝ๋ฉ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ค๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ๋ก ๋ค์์๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๊ธฐ ์์ํ๋ค. ํด๋์ค๋ช ์ ํ์๊ฐ ์ฅํฉํด์ง๊ณ , ์ด๋ฐ ๊ธด ํด๋์ค๋ช ๋๋ฌธ์ ๋งํฌ์ ์ด ๋ถํ์ํ๊ฒ ์ปค์ง๋ฉฐ, ์ฌ์ฌ์ฉํ๋ ค๊ณ ํ ๋๋ง๋ค ๋ชจ๋ UI ์ปดํฌ๋ํธ๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ฅํด์ผ๋ง ํ๋ค.
๋ํ SASS์ BEM๋ ๊ณ ์น์ง ๋ชปํ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ค์ ์ธ์ด ๋ก์ง ์์ ์ง์ ํ ์บก์ํ(encapsulation : ๊ฐ์ฒด์ ์์ฑ๊ณผ ํ์๋ฅผ ํ๋๋ก ๋ฌถ๊ณ ์ค์ ๊ตฌํ ๋ด์ฉ ์ผ๋ถ๋ฅผ ์ธ๋ถ์ ๊ฐ์ถ์ด ์๋ํ๋ ๊ฐ๋ )์ ๊ฐ๋ ์ด ์๋ค๋ ๊ฒ์ด์๊ณ , ์ด๋ก ์ธํด ๊ฐ๋ฐ์๋ค์ด ์ ์ผํ ํด๋์ค๋ช ์ ์ ํํ๋ ๊ฒ์ ์์กดํ ์๋ฐ์ ์์๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๊ฐ๋ฐ ๋ฐฉํฅ์ด ์งํํ๋ฉด์ ์ปดํฌ๋ํธ ๋จ์์ ๊ฐ๋ฐ์ ์บก์ํ์ ์ค์์ฑ์ ๋ถ๋ฌ์๋ค.
ํ์ง๋ง CSS๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ๋ฐฉ์์ ์ํด ๋ง๋ค์ด์ง ์ ์ด ํ ๋ฒ๋ ์์๋ค.
๊ฒฐ๊ตญ CSS๋ ์ปดํฌ๋ํธ ์์ญ์ผ๋ก ๋ถ๋ฌ๋ค์ด๊ธฐ ์ํด์ CSS-in-JS๊ฐ ํ์ํด์ ์ด ๋ฌธ์ ๋ฅผ ์ ํํ๊ฒ ํด๊ฒฐํ๋ค.
CSS-in-JS์๋ ๋ํ์ ์ผ๋ก Styled-Component๊ฐ ์๋ค.
Styled-Component๋ ๊ธฐ๋ฅ์ (Functional) ํน์ ์ํ๋ฅผ ๊ฐ์ง
์ปดํฌ๋ํธ๋ค๋ก๋ถํฐ UI๋ฅผ ์์ ํ ๋ถ๋ฆฌํด ์ฌ์ฉํ ์ ์๋ ์์ฃผ ๋จ์ํ ํจํด์ ์ ๊ณตํ๋ค.
CSS ์ฝ๋๋ฅผ ๋ค๋ฃฐ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ถํธํจ์ ๋๊ปด๋ณธ ์ ์๋๊ฐ?
์ด ์ธ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด๋ ค์์ด ์์ ์ ์๋ค. ์ด๋ฐ ๋ถํธํจ์ CSS๋ฅผ ์ปดํฌ๋ํธํ ์ํด์ผ๋ก์จ ํด๊ฒฐํด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค.
๋ฐ๋ก React ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ Styled Components๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Styled Components๋ ์์ ๋ฐฐ์ด CSS in JS๋ผ๋ ๊ฐ๋ ์ด ๋๋๋๋ฉด์ ๋์จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๊ธฐ์กด์ HTML, CSS, JS ํ์ผ๋ก ์ชผ๊ฐ์ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์์, React ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฑ์ฅ์ผ๋ก
์ปดํฌ๋ํธ ๋จ์ ๊ฐ๋ฐ์ด ์ฃผ๋ฅ๊ฐ ๋์์ง๋ง, CSS๋ ๊ทธ๋ ์ง ๋ชปํ๋ค๋ ์ ์์ ์ถ๋ฐํ ๊ฐ๋
์ด๋ค.
CSS in JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด CSS๋ ์ฝ๊ฒ Javascript ์์ ๋ฃ์ด์ค ์ ์์ผ๋ฏ๋ก,
HTML + JS + CSS๊น์ง ๋ฌถ์ด์ ํ๋์ JSํ์ผ ์์์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐํ ์ ์๊ฒ ๋๋ค.
Styled Components ์ค์นํ๊ธฐ
// Styled Components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น
# with npm
$ npm install --save styled-components@latest
# with yarn
$ yarn add styled-components
// ๊ทธ ๋ค์ Styled Components๋ฅผ ์ฌ์ฉํ ํ์ผ๋ก ๋ถ๋ฌ์์ฃผ๋ฉด ์ฌ์ฉ ์ค๋น๋ ์๋ฃ!
import styled from "styled-components"
Styled Components ๋ฌธ๋ฒ
1. ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
Styled Components๋ ES6์ Templete Literals ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค. ์ฆ, ๋ฐ์ดํ๊ฐ ์๋ ๋ฐฑ ํฑ(`)์ ์ฌ์ฉํ๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ ํ styled.ํ๊ทธ
์ข
๋ฅ๋ฅผ ํ ๋นํ๊ณ , ๋ฐฑ ํฑ ์์ ๊ธฐ์กด์ CSS๋ฅผ ์์ฑํ๋ ๋ฌธ๋ฒ๊ณผ ๋๊ฐ์ด ์คํ์ผ ์์ฑ์ ์์ฑํด ์ฃผ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฏ ๋ฆฌํด๋ฌธ ์์ ์์ฑํด ์ฃผ๋ฉด ์คํ์ผ์ด ์ ์ฉ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
import styled from "styled-components";
//Styled Components๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ
const BlueButton = styled.button`
background-color: blue;
color: white;
`;
export default function App() {
// React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฏ์ด ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
return <BlueButton>Blue Button</BlueButton>;
}
2. ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด์ ์๋ก์ด ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
์ด๋ฏธ ๋ง๋ค์ด์ง ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ styled()์ ์ฌํ์ฉํ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํด ์ค ๋ค์, ์ถ๊ฐํ๊ณ ์ถ์ ์คํ์ผ ์์ฑ์ ์์ฑํด ์ฃผ๋ฉด ๋๋ค.
import styled from "styled-components";
const BlueButton = styled.button`
background-color: blue;
color: white;
`;
//๋ง๋ค์ด์ง ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
const BigBlueButton = styled(BlueButton)`
padding: 10px;
margin-top: 10px;
`;
//์ฌํ์ฉํ ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํ ์๋ ์์ต๋๋ค.
const BigRedButton = styled(BigBlueButton)`
background-color: red;
`;
export default function App() {
return (
<>
<BlueButton>Blue Button</BlueButton>
<br />
<BigBlueButton>Big Blue Button</BigBlueButton>
<br />
<BigRedButton>Big Red Button</BigRedButton>
</>
);
}
3. Props ํ์ฉํ๊ธฐ
Styled Component๋ก ๋ง๋ ์ปดํฌ๋ํธ๋ React ์ปดํฌ๋ํธ์ฒ๋ผ props๋ฅผ ๋ด๋ ค์ค ์ ์๋ค.
๋ด๋ ค์ค props ๊ฐ์ ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
Styled Components๋ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด ๋ฌธ๋ฒ(${ })์ ์ฌ์ฉํ์ฌ JavaScript ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
props๋ฅผ ๋ฐ์์ค๋ ค๋ฉด props๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
โ๏ธ 1. Props๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋งํ๊ธฐ
์ ์ฝ๋์ ๊ฒฝ์ฐ๋ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํด Button ์ปดํฌ๋ํธ์ skyblue๋ผ๋ props๊ฐ ์๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด ๋ฐฐ๊ฒฝ์์ผ๋ก skyblue๋ฅผ, ์์ ๊ฒฝ์ฐ white๋ฅผ ์ง์ ํด ์ฃผ๋ ์ฝ๋์ด๋ค. ์๋๋ ๋ ๋๋ง ๋ Button ์ปดํฌ๋ํธ ๊ฒฐ๊ณผ์ด๋ค.
Button1์ ๊ฒฝ์ฐ๋ skyblue๋ผ๋ props๊ฐ ์์ด ๋ฐฐ๊ฒฝ์์ด skyblue๋ก ์ง์ ๋๊ณ ,
Button2์ ๊ฒฝ์ฐ๋ props๊ฐ ์์ ์์ด ๋ฐฐ๊ฒฝ์์ด white๋ก ์ง์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
import styled from "styled-components";
import GlobalStyle from "./GlobalStyle";
//๋ฐ์์จ prop์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ด ๊ฐ๋ฅํฉ๋๋ค.
const Button1 = styled.button`
background: ${(props) => (props.skyblue ? "skyblue" : "white")};
`;
export default function App() {
return (
<>
<GlobalStyle />
<Button1>Button1</Button1>
<Button1 skyblue>Button1</Button1>
</>
);
}
โ๏ธ 2. Props ๊ฐ์ผ๋ก ๋ ๋๋งํ๊ธฐ
3๋ฒ๊ณผ ๋น์ทํ๊ฒ, props์ ๊ฐ์ ํต์งธ๋ก ํ์ฉํด์ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ์ฉํ ์ ์๋ค.
๋๊ฐ์ด ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง, ์ด๋ฒ์๋ props.color๊ฐ ์๋ค๋ฉด white๋ฅผ, props.color๊ฐ ์๋ค๋ฉด props.color์ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ์คํ์ผ ์์ฑ ๊ฐ์ผ๋ก ๋ฆฌํดํด์ฃผ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ ๊ฒฐ๊ณผ color๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐ์ props์ ๊ฐ์ผ๋ก ๋ฐฐ๊ฒฝ์์ด ์ง์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ผญ ์ผํญ ์ฐ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
JavaScript ์ฝ๋๋ผ๋ฉด ๋ฌด์์ด๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ํ๋ ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ํจ์ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
import styled from "styled-components";
import GlobalStyle from "./GlobalStyle";
//๋ฐ์์จ prop ๊ฐ์ ๊ทธ๋๋ก ์ด์ฉํด ๋ ๋๋งํ ์๋ ์์ต๋๋ค
const Button1 = styled.button`
background: ${(props) => (props.color ? props.color : "white")};
`;
//๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก๋ ํ์ฉํ ์ ์์ต๋๋ค.
const Button2 = styled.button`
background: ${(props) => props.color || "white"};
`;
export default function App() {
return (
<>
<GlobalStyle />
<Button1>Button1</Button1>
<Button1 color="orange">Button1</Button1>
<Button1 color="tomato">Button1</Button1>
<br />
<Button2>Button2</Button2>
<Button2 color="pink">Button2</Button2>
<Button2 color="turquoise">Button2</Button2>
</>
);
}
4. ์ ์ญ ์คํ์ผ ์ค์ ํ๊ธฐ
์คํ์ผ์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ์ข์ง๋ง, ์ ์ญ์ ์คํ์ผ์ ์ค์ ํ๊ณ ์ถ์ ๋ ์ด๋ป๊ฒ ํ๋ฉด ์ข์๊น?
๋ฌผ๋ก Styled Components๋ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ ์ปดํฌ๋ํธ๋ ์ค๋นํด ๋์๋ค.
์ฐ์ ์ ์ญ ์คํ์ผ์ ์ค์ ํ๊ธฐ ์ํด Styled Components์์ createGlobalStyle ํจ์๋ฅผ ๋ถ๋ฌ์จ๋ค.
๊ทธ๋ค์ ์ด ํจ์๋ฅผ ์ฌ์ฉํด CSS ํ์ผ์์ ์์ฑํ๋ฏ ์ค์ ํด ์ฃผ๊ณ ์ถ์ ์คํ์ผ์ ์์ฑํ๋ค.
import { createGlobalStyle } from "styled-components";
const GlobalStyle = createGlobalStyle`
button {
padding : 5px;
margin : 2px;
border-radius : 5px;
}
`
function App() {
return (
<>
<GlobalStyle />
<Button>์ ์ญ ์คํ์ผ ์ ์ฉํ๊ธฐ</Button>
</>
);
}
์ด๋ ๊ฒ ๋ง๋ค์ด์ง GlobalStyle ์ปดํฌ๋ํธ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํด ์ฃผ๋ฉด, ์ ์ญ์ GlobalStyle ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์ ์ฉ๋๋ค.
Styled Components ๊ด๋ จ ์ต์คํ ์ ์๊ฐ
Styled Components๋ฅผ ์ฌ์ฉํ ๋, CSS ์ฝ๋๋ฅผ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํด์ ์์ฑํ๊ฒ ๋๋ค.
์ฆ, CSS ์ฝ๋๋ฅผ ๋ฌธ์์ด๋ก ์์ฑํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์๋ ์ด๋ฏธ์ง์ฒ๋ผ VSCode์์ ์ฝ๋ ์์ฑ ์,
CSS ํ์ผ์์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ๋์์ด ๋๋ VSCode ์ต์คํ ์ ์ด ์๋ค. ๋ฐ๋ก VSCode-Styled-Components๋ผ๋ ์ต์คํ ์ ์ด๋ค.
VSCode ์ข์ธก์ Extensions ๋ฒํผ์ ํด๋ฆญํ ํ, Vscode-Styled-Components๋ฅผ ๊ฒ์ํ์ ๋๋์ค๋ ์ฒซ ๋ฒ์งธ ์ต์คํ ์ ์ ์ค์นํ๋ฉด ๋๋ค.
Storybook์ UI ๊ฐ๋ฐ ์ฆ, Component Driven Development๋ฅผ ํ๊ธฐ ์ํ ๋๊ตฌ์ด๋ค.
๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ค์ ๋ฐ๋ก ๋ณผ ์ ์๊ฒ ๊ตฌ์ฑํด ์ฃผ์ด ํ ๋ฒ์ ํ๋์ ์ปดํฌ๋ํธ์์ ์์ ํ ์ ์๋ค.
๋ณต์กํ ๊ฐ๋ฐ ์คํ์ ์์ํ๊ฑฐ๋, ํน์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ฐ์ ์ด๋ํ๊ฑฐ๋,
์ ํ๋ฆฌ์ผ์ด์
์ ํ์ํ ํ์ ์์ด ์ ์ฒด UI๋ฅผ ํ๋์ ๋ณด๊ณ ๊ฐ๋ฐํ ์ ์๋ค.
Storybook์ ์ฌ์ฌ์ฉ์ฑ์ ํ๋ํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ฌธ์ํํ๊ณ , ์๋์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํํ์ฌ ์๋ฎฌ๋ ์ด์
ํ ์ ์๋ ๋ค์ํ ํ
์คํธ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋๋ก ๋์์ค๋ค.
๋ํ ํ
์คํธ ๋ฐ ๊ฐ๋ฐ ์๋๋ฅผ ํฅ์ํ๋ ์ฅ์ ์ด ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์
๋ํ ์์กด์ฑ์ ๊ฑฑ์ ํ์ง ์๊ณ ๋น๋ํ ์ ์๋ค.
Storybook์์ ์ง์ํ๋ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
๋จผ์ ๋ฆฌ์กํธ ํ๋ก์ ํธ ํด๋๊ฐ ์์ฑ๋๋ฉด, ํด๋ ์์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ Storybook์ ์ค์นํ๋ค.
npx storybook@latest init
์ด ๋ช
๋ น์ด๋ package.json์ ๋ณด๊ณ ์ฌ์ฉ ์ค์ธ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง๋ Storybook ์ฌ์ฉํ๊ฒฝ์
์์์ ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์, ๊ผญ React๊ฐ ์๋๋๋ผ๋ ๋ค์ํ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ค.
Storybook ์ค์น๊ฐ ์๋ฃ๋๋ฉด, /.storybook ํด๋์ /src/stories ํด๋๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
/.storybook ํด๋์๋ Storybook ๊ด๋ จ ์ค์ ํ์ผ์ด, /src/stories ํด๋์๋ Storybook ์์ ํ์ผ๋ค์ด ๋ค์ด์๋ค.
์ด์ ํฐ๋ฏธ๋ ์ฐฝ์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ Storybook์ ์คํํ๋ฉด ๋๋ค.
npm run storybook
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด React๊ฐ localhost:3000์ผ๋ก ์ ๊ทผํ๋ฏ์ด, localhost:6006์ผ๋ก ์ ๊ทผํ์ฌ Storybook์ ์คํ์ํจ๋ค.
Storybook์ ์คํํ๋ฉด /src/stories ํด๋ ์์ ์๋, Storybook์์ ๋ง๋ค์ด๋์ ์์ ์คํ ๋ฆฌ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ Storybook์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ณ ์ด๋ฒคํธ๋ฅผ ํตํด ์ํ๋ฅผ
๋ณ๊ฒฝํ๋ ๊ณผ์ ์ ๊ฑฐ์น์ง ์์๋ ์ํ ๋ณํ์ ๋ฐ๋ฅธ ์ปดํฌ๋ํธ์ ๋ณํ๋ฅผ ํ์ธํ ์ ์๋ค.
์์ฑ ๋ฐฉ๋ฒ
์ด์ ์ง์ Storybook ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
๊ทธ ์ ์, ํํ ๋ฆฌ์ผ์ ์งํํ๋ฉด์ ์ฌ์ฉํ Styled-Components๋ฅผ ๋จผ์ ์ค์นํ๋ค.
npm install styled-components
์ค์น๋ฅผ ์๋ฃํ๋ค๋ฉด, ๊ฐ๋จํ ์คํ ๋ฆฌ๋ฅผ ์ง์ ์์ฑํด ๋ณด์.
src ํด๋ ์์ Title.js ํ์ผ์ ํ๋ ๋ง๋ค๊ณ , ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ React ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ง๋ค์ด export ํด์ค๋ค.
import React from "react";
// title์ h1 ์์์ textContent, textColor์ ๊ธ์์์ด ๋๋ props์
๋๋ค.
const Title = ({title, textColor}) => (
<h1 style={{color: textColor}}>{title}</h1>
);
export default Title;
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์์น์ธ src ํด๋ ์์ Title.stories.js ํ์ผ์ ํ๋ ๋ง๋ ๋ค.
/.storybook ์์ ์๋ Storybook ์ค์ ํ์ผ์ ์ํด์ ์ปดํฌ๋ํธ ํ์ผ๊ณผ
๋๊ฐ์ ํ์ผ ์ด๋ฆ์ .stories๋ฅผ ๋ถ์ฌ ํ์ผ์ ๋ง๋ค๋ฉด ์์์ ์คํ ๋ฆฌ๋ก ์ธ์ํ๋ค.
Title.stories.js ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
// ์์์ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import Title from "./Title";
// title : ์ปดํฌ๋ํธ ์ด๋ฆ์ผ๋ก, '/'๋ฅผ ๋ฃ์ด ์นดํ
๊ณ ๋ฆฌํํ ์ ์์ต๋๋ค.
// ์ดํ ์์์์ ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช
ํฉ๋๋ค.
// component : ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์์ ์คํ ๋ฆฌ๋ก ๋ง๋ค ๊ฒ์ธ์ง ๋ช
์ํฉ๋๋ค.
// argTypes : ์ปดํฌ๋ํธ์ ํ์ํ ์ ๋ฌ์ธ์์ ์ข
๋ฅ์ ํ์
์ ์ ํด์ค๋๋ค.
// ์ง๊ธ์ title, textColor์ด๋ผ๋ ์ ๋ฌ์ธ์์ text ํ์
์ด ํ์ํจ์ ์๋ฏธํฉ๋๋ค.
export default {
title: "Practice/Title",
component: Title,
argTypes: {
title: { control: "text" },
textColor: {control: "text"}
}
}
// ํ
ํ๋ฆฟ์ ๋ง๋ค์ด์ค๋๋ค. ์ด ํ
ํ๋ฆฟ์์๋
// Title ์ปดํฌ๋ํธ๊ฐ args๋ฅผ ์ ๋ฌ๋ฐ์ props๋ก ๋ด๋ ค์ค๋๋ค.
const Template = (args) => <Title {...args} />
// Storybook์์ ํ์ธํ๊ณ ์ถ์ ์ปดํฌ๋ํธ๋ export const๋ก ์์ฑํฉ๋๋ค.
// ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ Storybook์ ๋ฃ์ด์ค ์คํ ๋ฆฌ๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
// Template.bind({}); ๋ ์ ํด์ง ๋ฌธ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
export const RedTitle = Template.bind({});
// ๋ง๋ค์ด์ค ์คํ ๋ฆฌ์ ์ ๋ฌ์ธ์๋ฅผ ์์ฑํด์ค๋๋ค.
RedTitle.args= {
title: "Red Title",
textColor: "red"
}
// ์คํ ๋ฆฌ๋ฅผ ํ๋ ๋ ๋ง๋ญ๋๋ค.
export const BlueTitle = Template.bind({});
// ์คํ ๋ฆฌ์ ์ ๋ฌ์ธ์๋ฅผ ์์ฑํด์ค๋๋ค.
BlueTitle.args= {
title: "Blue Title",
textColor: "blue"
}
Title.stories.js ํ์ผ์ ์ ์ฅํ๊ณ Storybook์ ํ์ธํด ๋ณด์.
Storybook์ ํซ ๋ชจ๋ ๋ฆฌ๋ก๋ฉ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์๋ก๊ณ ์นจ์ ํ์ง ์์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ก ํ์ธํ ์ ์๋ค.
title: โPractice/Titleโ
๋ก ์์ฑํด ์ค ์ฝ๋๊ฐ ์ข์ธก ๋ฉ๋ด์์ ์นดํ
๊ณ ๋ฆฌ๋ก ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.์ด๋ฒ์๋ ์ ๋ฌ์ธ์๋ฅผ ์ง์ ๋ฐ๋ ์คํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณด์.
์์ ๋ง๋ค์๋ ๋ ์คํ ๋ฆฌ ๋ฐ๋ก ๋ฐ์ ๋ค์๊ณผ ๊ฐ์ ์คํ ๋ฆฌ๋ฅผ ํ๋ ๋ ์์ฑํด ์ค๋ค.
...
export const StorybookTitle = (args) =>{
return <Title {...args} />
}
์ด ์คํ ๋ฆฌ๋ ํ ํ๋ฆฟ์ ํ์ฉํ์ง ์๊ณ ๋ฐ๋ก ์ ๋ฌ์ธ์๋ฅผ ๋ฐ๊ณ ์๋ค. ์ ์ฅ ํ ๋ค์ Storybook์ ํ์ธํด ๋ณด์.
์ด๋ฒ์ ๋ง๋ ์คํ ๋ฆฌ๋ ์ ๋ฌ ์ธ์๋ฅผ ์ง์ ์์ฑํด ์ฃผ๋ฉด ๊ฑฐ๊ธฐ์ ๋ง์ถฐ ๋ชจ์ต์ด ๋ณํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฒ์๋ ์ ๋ฌ ์ธ์๋ฅผ ์ง์ ๋ฐ์ผ๋ฉด์, Styled Components๋ฅผ ์ฌ์ฉํด์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ ๋ฆฌ๋ก ๋ง๋ค์ด๋ณด์.
์ฐ์ , Button.js๋ผ๋ ํ์ผ์ ํ๋ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.
Button.stories.js๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด ์ค๋ค.
// ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import Button from "./Button";
export default {
title: "Practice/Button",
component: Button,
// ์ด๋ฒ์ ์์ฑํ ์ ๋ฌ์ธ์์ ํ์
์ Storybook์ ๋ณด๊ณ ์ง์ ํ์ธํด๋ณด์ธ์.
argTypes: {
color: { control: 'color'},
size: { control: { type:'radio'}, options : ['big', 'small'] },
text: { control: 'text'}
}
};
export const StorybookButton = (args) => (
<Button {...args}></Button>
)
์ด๋ฒ์ ๋ง๋ ์คํ ๋ฆฌ์์๋ control: โcolorโ์ control: { type: โradioโ, options: [] }๊ฐ
๊ฐ๊ฐ ์ด๋ค ํํ๋ก ์ธ์๋ฅผ ์ ๋ฌํด ์ฃผ๋์ง ํ์ธํด ๋ณด๋ฉด ๋๋ค.
React๋ฅผ ๊ณต๋ถํ๋ฉด์, React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ๋ DOM์ ์ง์ ์กฐ์ํ๋ ๊ฒ์ ์ง์ํด์ผ ํ๋ค๊ณ ๋ฐฐ์ ๋ค.
ํ์ง๋ง, ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด DOM์ ์ง์ ๊ฑด๋๋ ค์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๊ธฐ๋ ํ๋ค.
์ด๋ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก useRef๋ผ๋ Hook ํจ์์ด๋ค.
์ง๊ธ๊น์ง๋ React๋ง ๊ฐ์ง๊ณ ๊ฑฐ์ ๋๋ถ๋ถ์ ํ๋ก ํธ์๋ ์๊ตฌ์ฌํญ์ ๊ตฌํํ ์ ์์๋ค.
ํ์ง๋ง React๋ก ๋ชจ๋ ๊ฐ๋ฐ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ์๋ ์๋ค.
์๋์ ๊ฐ์ด DOM ์๋ฆฌ๋จผํธ์ ์ฃผ์๊ฐ์ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ํนํ ๊ทธ๋ ๋ค.
React๋ ์ด๋ฐ ์์ธ์ ์ธ ์ํฉ์์ useRef๋ก DOM ๋
ธ๋, ์๋ฆฌ๋จผํธ, ๊ทธ๋ฆฌ๊ณ React ์ปดํฌ๋ํธ ์ฃผ์๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
const ์ฃผ์๊ฐ์_๋ด๋_๊ทธ๋ฆ = useRef(์ฐธ์กฐ์๋ฃํ)
// ์ด์ ์ฃผ์๊ฐ์_๋ด๋_๊ทธ๋ฆ ๋ณ์์ ์ด๋ค ์ฃผ์๊ฐ์ด๋ ๋ด์ ์ ์์ต๋๋ค.
return (
<div>
<input ref={์ฃผ์๊ฐ์_๋ด๋_๊ทธ๋ฆ} type="text" />
{/* React์์ ์ฌ์ฉ ๊ฐ๋ฅํ ref๋ผ๋ ์์ฑ์ ์ฃผ์๊ฐ์_๋ด๋_๊ทธ๋ฆ์ ๊ฐ์ผ๋ก ํ ๋นํ๋ฉด*/}
{/* ์ฃผ์๊ฐ์_๋ด๋_๊ทธ๋ฆ ๋ณ์์๋ input DOM ์๋ฆฌ๋จผํธ์ ์ฃผ์๊ฐ ๋ด๊น๋๋ค. */}
{/* ํฅํ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ input DOM ์๋ฆฌ๋จผํธ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. */}
</div>);
์ด ์ฃผ์๊ฐ์ ์ปดํฌ๋ํธ๊ฐ re-render ๋๋๋ผ๋ ๋ฐ๋์ง ์๋๋ค.
์ด ํน์ฑ์ ํ์ฉํ์ฌ ์๋์ ์ ํ๋ ์ํฉ์์ useRef๋ฅผ ํ์ฉํ ์ ์๋ค.
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>);
}
์ ์๋ ์ํฉ ์ ์ธํ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ React ๋ฌธ๋ฒ์ ๋ฒ์ด๋ useRef๋ฅผ ๋จ์ฉํ๋ ๊ฒ์ ๋ถ์ ์ ํ๊ณ ,
React์ ํน์ง์ด์ ์ฅ์ ์ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์์น๊ณผ ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์, ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.