CDD ( Component Driven Development )
โฅ ๋ถํ ๋จ์๋ก UI ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ ๊ฐ๋ฐ ๋ฐฉ์
โฅ ์ฌ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ๋ค.
โฅ ์ํฅ์ ๊ฐ๋ฐ
Styled-Component (CSS-in-JS๊ฐ ๋์ค๊ฒ ๋ ๋ฐฐ๊ฒฝ)
CSS ์ ์ฒ๋ฆฌ๊ธฐ ( CSS Preprocessor )
โฅ CSS๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ์์ฑ๋ ์ ์๊ฒ ๋์์ ์ฃผ๋ ๋๊ตฌ
* ๊ฐ CSS ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ง๋ Compiler๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. (CSS ์ ์ฒ๋ฆฌ๊ธฐ ์์ฒด๋ง์ผ๋ก๋ ์น ์๋ฒ๊ฐ ์ธ์งํ์ง ๋ชปํจ)
โฅ ๊ทธ๋์ CSS ํ์ผ๋ค์ ์ ๊ตฌ์กฐํํ ์ ์๊ฒ ๋์๊ณ , ์ต์ํ CSS ํ์ผ์ ๋ช ๊ฐ์ ์์ ํ์ผ๋ก ๋ถ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ธด ๊ฒ์ด๋ค.
- CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ก ๊ฐ์ฅ ์ ๋ช ํ SASS (CSS๋ฅผ ํ์ฅํด ์ฃผ๋ ์คํฌ๋ฆฝํ ์ธ์ด)
์ฅ์ : ์คํ์ผ์ด ๊ฒน์น๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. (๋ณ์๋ฅผ ์ ์ธํด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ)
๋จ์ : ์ฉ๋์ด ์ปค์ง๋ค.
- CSS ๋ฐฉ๋ฒ๋ก ์ ๊ณตํต๋ ์งํฅ์
* ์ฝ๋์ ์ฌ์ฌ์ฉ
* ์ฝ๋์ ๊ฐ๊ฒฐํ(์ ์ง ๋ณด์ ์ฉ์ด)
* ์ฝ๋์ ํ์ฅ์ฑ
* ์ฝ๋์ ์์ธก์ฑ(ํด๋์ค ๋ช ์ผ๋ก ์๋ฏธ ์์ธก)
CSS ๋ฐฉ๋ฒ๋ก ์ผ๋ก ๋๋๋ BEM, OOCSS, SMACSS ๋ฑ๋ฑ
๋จ์ : ํด๋์ค๋ช ์ ํ์๊ฐ ์ฅํฉํด์ง๊ณ , ์บก์ํ์ ๊ฐ๋ ์ด ์๋ค.
๐๐๐๐๐
์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๊ฐ๋ฐ ๋ฐฉํฅ์ด ์งํํ๋ฉด์ ์ปดํฌ๋ํธ ๋จ์์ ๊ฐ๋ฐ์ ์บก์ํ์ ์ค์์ฑ์ ๋ถ๋ฌ์๋ค.
CSS๋ ์ปดํฌ๋ํธ ์์ญ์ผ๋ก ๋ถ๋ฌ๋ค์ด๊ธฐ ์ํด์ CSS-in-JS๊ฐ ํ์ํ๋ค.
๋ํ์ ์ผ๋ก Styled-Component๊ฐ ์๋ค.
์ฅ์ : ๊ธฐ๋ฅ์ ๋๋ ์ํ๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ๋ค๋ก๋ถํฐ UI๋ฅผ ์์ ํ ๋ถ๋ฆฌํด ์ฌ์ฉํ ์ ์๋ ์์ฃผ ๋จ์ํ ํจํด์ ์ ๊ณตํ๋ค.
ํน์ง | ์ฅ์ | ๋จ์ | |
CSS | ๊ธฐ๋ณธ์ ์ธ ์คํ์ผ๋ง ๋ฐฉ๋ฒ | - | ์ผ๊ด๋ ํจํด์ ๊ฐ๊ธฐ ์ด๋ ต๋ค. !important์ ๋จ์ฉ |
SASS | ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋์ ํด์ ์ปดํ์ผ๋ css๋ฅผ ๋ง๋ค์ด๋ด๋ ์ ์ฒ๋ฆฌ๊ธฐ | ๋ณ์,ํจ์,์์ ๊ฐ๋ ์ ํ์ฉํด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ, css์ ๊ตฌ์กฑํ | ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๊ณ , ๋๋ฒ๊น
์ ์ด๋ ค์์ด ์๋ค. ์ปดํ์ผํ cssํ์ผ์ ์ฉ๋์ด ์ปค์ง |
BEM | css ํด๋์ค๋ช ์์ฑ์ ์ผ๊ด๋ ํจํด์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ๋ก | ๋ค์ด๋ฐ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ, ์ ์ฒ๋ฆฌ ๊ณผ์ ํ์์์ | ์ ํ์์ ์ด๋ฆ์ด ์ฅํฉํด์ง๊ณ , ํด๋์ค ๋ชฉ๋ก์ด ๋๋ฌด ๋ง์์ง. |
Styled-Component (CSS-in-JS) |
์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก css๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | css๋ฅผ ์ปดํฌ๋ํธ ์์ผ๋ก ์บก์ํ, ๋ค์ด๋ฐ์ด๋ ์ต์ ํ๋ฅผ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ | ๋น ๋ฅธ ํ์ด์ง ๋ก๋์ ๋ถ๋ฆฌํจ. |
Styled Components ๋ผ์ด๋ธ๋ฌ๋ฆฌ => ๋ฆฌ์กํธ ํ๊ฒฝ์์ ์ฌ์ฉ๊ฐ๋ฅ!!
CSS๋ฅผ ์ปดํฌ๋ํธํ ์ํจ๋ค!!
์๋์ ๊ฐ์ ๋ฌธ์ ์ ํํ!! ๐งจ
--------------------------------------------------------------
1. class, id ์ด๋ฆ ์ง๋๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
2. css ํ์ผ ์์์ ๋ด๊ฐ ์ํ๋ ๋ถ๋ถ ์ฐพ๊ธฐ ํ๋ค๋ค.
3. css ํ์ผ์ด ๋๋ฌด ๊ธธ์ด์ ธ์ ํ์ผ์ ์ชผ๊ฐ๊ฑฐ๋ ์ฃผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋กญ๋ค.
4. ์คํ์ผ ์์ฑ์ด ๊ฒน์น๋ ๋ฐ๋์ ๋ด๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋๋ค.
--------------------------------------------------------------------
CSS in JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด CSS๋ ์ฝ๊ฒ Javascript ์์ ๋ฃ์ด์ค ์ ์์ผ๋ฏ๋ก, HTML + JS + CSS๊น์ง ๋ฌถ์ด์ ํ๋์ JSํ์ผ ์์์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐํ ์ ์๋ค.
CSS in JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ์ฌ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ => Styled Components
Styled Components ์ ์ค์น ๋ฐฉ๋ฒ
# with npm
$ npm install --save styled-components
# with yarn
$ yarn add styled-components
package.json์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐ (์ถ๊ฐ ์ฌ๋ถ๋ ์ต์ ์ด์ง๋ง, ์ถ๊ฐํ๋ฉด ์ฌ๋ฌ ๋ฒ์ ์ Styled Components๊ฐ ์ค์น๋์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ค์ฌ์ค๋ค.)
{
"resolutions": {
"styled-components": "^5"
}
}
Styled Components๋ฅผ ์ฌ์ฉํ ํ์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ
import styled from "styled-components"
Styled Components ๋ฌธ๋ฒ
1. ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
import styled from "styled-components";
const BlueButton = styled.button`
background-color : blue;
color : white;
`;
function App() {
return <BlueButton>ํ๋๋ฒํผ</BlueButton>
}
export default App;
์ด๋ฐ์์ผ๋ก ๋์จ๋ค.
2. ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด์ ์๋ก์ด ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ styled() ์ ์ฌํ์ฉํ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํด์ค ๋ค์, ์ถ๊ฐํ๊ณ ์ถ์ ์คํ์ผ ์์ฑ์ ์์ฑํด์ฃผ๊ธฐ.
import styled from "styled-components";
const BlueButton = styled.button`
background-color : blue;
color : white;
`;
const RedButton = styled.button`
background-color : red;
`;
function App() {
return (
<>
<BlueButton>ํ๋๋ฒํผ</BlueButton>
<br />
<br />
<RedButton>๋นจ๊ฐ๋ฒํผ</RedButton>
</>
);
}
export default App;
์ด๋ ๊ฒ ๋์จ๋ค.
3. Props ํ์ฉํ๊ธฐ
React ์ปดํฌ๋ํธ์ฒ๋ผ props๋ฅผ ๋ด๋ ค์ค ์ ์๊ณ , ๋ด๋ ค์ค props ๊ฐ์ ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
1) Props๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋งํ๊ธฐ
const Button = styled.button`
background:${(props) => props.skyblue ? "skyblue" : "white"}
`;
<Button> ์ปดํฌ๋ํธ์ skyblue๋ผ๋ props๊ฐ ์๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด ๋ฐฐ๊ฒฝ์์ผ๋ก skyblue, ์์ผ๋ฉด white๋ก ์ง์
<Button skyblue>๋ฒํผ</Button>
์ด๋ ๋ค๋ฉด
์ด๋ ๊ฒ ๋์จ๋ค.
import styled from "styled-components";
const Button1 = styled.button`
background: ${(props) => (props.skyblue ? "skyblue" : "white")};
`;
export default function App() {
return (
<>
<Button1 skyblue>Button1</Button1>
<br/>
<br/>
<Button1>Button1</Button1>
</>
);
}
2) Props ๊ฐ์ผ๋ก ๋ ๋๋งํ๊ธฐ
props์ ๊ฐ์ ํต์งธ๋ก ํ์ฉํด์ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ์ฉํ ์ ์๋ค.
๊ผญ ์ผํญ์ฐ์ฌ์๋ฅผ ์ธ ํ์ ์๋ค.
import styled from "styled-components";
const Button1 = styled.button`
backbround: ${(props) => (props.color ? props.color : "white")};
`;
const Button2 = styled.button`
backbround: ${(props) => (props.color || "white")};
`;
export default function App() {
return (
<>
<Button1>Button1</Button1>
<Button1 color="orange">Button1</Button1>
<Button1 color="tomato">Button1</Button1>
<br />
<br />
<Button2>Button2</Button2>
<Button2 color="pink">Button2</Button2>
<Button2 color="turquoise">Button2</Button2>
</>
)
}
4. ์ ์ญ ์คํ์ผ ์ค์ ํ๊ธฐ
1. GlobalStyle ํ์ผ ์๋ก ๋ง๋ค์ด์ ์๋ import ํด์ฃผ๊ธฐ
import { createGlobalStyle } from "styled-components";
2. ์ค์ ํด์ฃผ๊ณ ์ถ์ ์คํ์ผ ์์ฑํ๊ธฐ
const GlobalStyle = createGlobalStyle`
button {
padding : 5px;
margin : 1px;
border-radius : 5px;
}
`
3. <GlobalStyle> ์ปดํฌ๋ํธ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํด์ฃผ๊ธฐ
function App() {
return (
<>
<GlobalStyle />
<Button>์ ์ญ ์คํ์ผ ์ ์ฉํ๊ธฐ</Button>
</>
);
}
hover ํจ๊ณผ ์ฃผ๋ ๋ฐฉ๋ฒ
import styled from "styled-components";
const NewButton = styled.button`
padding: 1rem;
font-size: 2rem;
background: powderblue;
border-radius: 1rem;
transition: 0.5s;
`;
const HoveringButton = styled(NewButton)`
&:hover {
background: cornflowerblue;
color: white;
transition: 0.5s;
}
`;
export default function App() {
return <HoveringButton>Practice!</HoveringButton>;
}
https://codesandbox.io/embed/upbeat-panka-6gpmdt?fontsize=14&hidenavigation=1&theme=dark