Jieunny์ ๋ธ๋ก๊ทธ
S3) Unit 3. [React] Custom Component ๋ณธ๋ฌธ
๐ฃ CDD
โ๏ธ Component-Driven Development(CDD)
โฐ ๋ถํ ๋จ์๋ก UI ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ ๊ฐ๋ฐ
โฐ ์ฌ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์๋ค.
๐ฃ CSS in JS
โฐ ๋ค์ํ ๋๋ฐ์ด์ค๋ค์ ๋ฑ์ฅ์ผ๋ก ์น์ฌ์ดํธ๋ค์ด ๋ค์ํ ๋์คํ๋ ์ด๋ฅผ ์ปค๋ฒํด์ผ ํ๊ธฐ ๋๋ฌธ์ CSS๋ ๋ ๋ณต์กํด์ง๊ฒ ๋์๋ค.
โฐ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด CSS ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ฑ์ฅํ๋ค.
โ๏ธ CSS ์ ์ฒ๋ฆฌ๊ธฐ : CSS๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ์์ฑ๋ ์ ์๊ฒ ๋์์ ์ฃผ๋ ๋๊ตฌ
โฐ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์์ฒด๋ง์ผ๋ก๋ ์น ์๋ฒ๊ฐ ์ธ์งํ๊ธฐ ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ง๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , ์ปดํ์ผ์ ํ๊ฒ ๋๋ฉด ์ค์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ CSS ๋ฌธ์๋ก ๋ณํ์ด ๋๋ค.
โ๏ธ SASS(Syntactically Awesome Style Sheets)
โฐ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ค ๊ฐ์ฅ ์ ๋ช
ํ๋ฉฐ, CSS๋ฅผ ํ์ฅํด ์ฃผ๋ ์คํฌ๋ฆฝํ
์ธ์ด์ด๋ค.
โฐ CSS๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ธ์ด๋ก์ ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ํน์ ์์ฑ์ ๊ฐ์ ๋ณ์๋ก ์ ์ธํ์ฌ ํ์ํ ๊ณณ์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ ์ฉํ ์ ์๊ณ , ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ ์ธ์ผ๋ก ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉ ํ ์ ์๋๋ก ํด์ฃผ๋ ๋ฑ์ ๊ธฐ๋ฅ์ด ์๋ค.
โฐ SASS๋ SCSS ์ฝ๋๋ฅผ ์ฝ์ด์ ์ ์ฒ๋ฆฌํ ๋ค์ ์ปดํ์ผํด์ ์ ์ญ CSS ๋ฒ๋ค ํ์ผ์ ๋ง๋ค์ด์ฃผ๋ '์ ์ฒ๋ฆฌ๊ธฐ' ์ญํ ์ ํ๋ค.
โฐ ํ์ง๋ง ์ฅ์ ๋ณด๋ค ๋จ์ ์ ๋ ๋ง์ด ๋ฐ๊ฒฌํ๊ฒ ๋๋ค.
โ๏ธ BEM, OOCSS, SMACSS
โฐ SASS์ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํ CSS ๋ฐฉ๋ฒ๋ก
โฐ '์ฝ๋์ ์ฌ์ฌ์ฉ', '์ฝ๋์ ๊ฐ๊ฒฐํ', '์ฝ๋์ ํ์ฅ์ฑ', '์ฝ๋์ ์์ธก์ฑ' ์ ๊ณตํต์ผ๋ก ์งํฅํ๋ค.
โ๏ธ BEM
โฐ Block, Element, Modifier๋ก ๊ตฌ๋ถํ์ฌ ํด๋์ค๋ช
์ ์์ฑํ๋ ๋ฐฉ๋ฒ
โฐ Block, Element, Modifier์ ๊ฐ๊ฐ -์ _๋ก ๊ตฌ๋ถํ๋ค.
โฐ ํด๋์ค๋ช
์ BEM ๋ฐฉ์์ ์ด๋ฆ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ์ฌ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฉฐ, ๋ ์ผ๊ด๋ ์ฝ๋ฉ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ์ฅ์ ์ด ์๋ค.
โฐ ํ์ง๋ง ํด๋์ค๋ช
์ ํ์๊ฐ ์ฅํฉํด์ง๊ณ , ๊ธด ํด๋์ค๋ช
๋๋ฌธ์ ๋งํฌ์
์ด ๋ถํ์ํ๊ฒ ์ปค์ง๋ ๋ฑ์ ๋จ์ ์ด ์๋ค.
๐จ SASS์ BEM๋ ๊ณ ์น์ง ๋ชปํ๋ ๋ช ๊ฐ์ง ๋ฌธ์
1. ์ธ์ด ๋ก์ง ์์ ์ง์ ํ ์บก์ํ์ ๊ฐ๋
์ด ์๋ค.
2. ์ด๋ก ์ธํด ๊ฐ๋ฐ์๋ค์ด ์ ์ผํ ํด๋์ค๋ช
์ ์ ํํ๋ ๊ฒ์ ์์กดํ ์ ๋ฐ์ ์๋ค.
โ๏ธ CSS-in-JS
โฐ CSS๋ ์ปดํฌ๋ํธ ์์ญ์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ ์ํ ๋ฐฉ๋ฒ
โ๏ธ Styled-Component
โฐ CSS-in-JS์ ๋ํ์ ์ธ ๋ฐฉ๋ฒ
โฐ ๊ธฐ๋ฅ์ ํน์ ์ํ๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ๋ค๋ก๋ถํฐ UI๋ฅผ ์์ ํ ๋ถ๋ฆฌํด ์ฌ์ฉํ ์ ์๋ ์์ฃผ ๋จ์ํ ํจํด์ ์ ๊ณตํ๋ค.
๐ฃ CSS ๋ฐฉ๋ฒ๋ก ๋ค์ ํน์ง๊ณผ ์ฅ๋จ์
๐ฃ Styled Components
โ๏ธ React ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ CSS๋ฅผ ์ปดํฌ๋ํธํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โฐ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด CSS๋ ์ฝ๊ฒ JS์์ ๋ฃ์ด์ค ์ ์๋ค.
โฐ HTML + JS + CSS ๊น์ง ๋ฌถ์ด์ ํ๋์ JS ํ์ผ ์์์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐํ ์ ์๊ฒ ๋๋ค.
๐ฃ Styled Components ์ค์นํ๊ธฐ
โ๏ธ ์ค์น
npm install --save styled-components
โ๏ธ package.json์ ์ฝ๋ ์ถ๊ฐ
โฐ ์ฌ๋ฌ ๋ฒ์ ์ Styled Components๊ฐ ์ค์น๋์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ค์ฌ์ค๋ค.
{
"resolutions": {
"styled-components": "^5"
}
}
โ๏ธ ๋ถ๋ฌ์ค๊ธฐ
import styled from "styled-components"
๐ฃ Styled Components ๋ฌธ๋ฒ
1๏ธโฃ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
โฐ ๋ฐ์ดํ๊ฐ ์๋ ๋ฐฑํฑ์ ์ฌ์ฉํ๋ Templete Literals ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค.
const BlueButton = styled.button`
background-color: blue;
color: white;
`;
โฐ ๋ฐฐ๊ฒฝ์์ด ํ๋์, ๊ธ์จ ์์์ด ํ์์์ธ ๋ฒํผ์ด ์์ฑ๋๋ค.
2๏ธโฃ ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด์ ์๋ก์ด ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
const BigBlueButton = styled(BlueButton)`
padding: 10px;
margin-top: 10px;
`;
โฐ ์ด๋ฏธ ๋ง๋ค์ด์ง ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
โฐ 2๋ฒ์ ํ๋ ๋ฒํผ์ padding, margin ์์ฑ์ด ์ถ๊ฐ ๋ ๋ฒํผ์ด ์์ฑ๋๋ค.
3๏ธโฃ Props ํ์ฉํ๊ธฐ
โฐ Styled Component๋ก ๋ง๋ ์ปดํฌ๋ํธ๋ React ์ปดํฌ๋ํธ์ฒ๋ผ props๋ก ๋ด๋ ค์ค ์ ์๋ค.
โฐ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด ๋ฌธ๋ฒ '${}' ์ ์ฌ์ฉํด์ JS ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
1) Props๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋งํ๊ธฐ
const Button = styled.button`
background: ${(props) => props.skyblue? "skyblue" : "white"}
`;
โฐ <Button> ์ปดํฌ๋ํธ์ skyblue๋ผ๋ props๊ฐ ์๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด ๋ฐฐ๊ฒฝ์์ skyblue๋ก, ์์ผ๋ฉด white๋ก ์ง์ ํด์ฃผ๋ ์ฝ๋
<Button skyblue>Button1</Button>
// ๋ฐฐ๊ฒฝ์์ด ์ค์นด์ด๋ธ๋ฃจ์ธ ๋ฒํผ
<Button>Button2</Button>
// ๋ฐฐ๊ฒฝ์์ด ํ์ดํธ์ธ ๋ฒํผ
2) Props ๊ฐ์ผ๋ก ๋ ๋๋งํ๊ธฐ
const Button = styled.button`
background: ${(props) => props.color? props.color: "white"}
`;
<Button>Button1</Button>
<Button color="orange">Button2</Button>
<Button color="tomato">Button3</Button>
โฐ props.color ๊ฐ ์๋ค๋ฉด white๋ฅผ, ์๋ค๋ฉด ๊ทธ ๊ฐ์ ๊ฐ์ ธ์์ ์คํ์ผ ์์ฑ ๊ฐ์ ๋ฆฌํดํด์ฃผ๊ณ ์๋ค.
โฐ ๊ผญ ์ผํญ์ฐ์ฐ์๋ง ์ฌ์ฉํ ํ์๋ ์๋ค -> JS ์ฝ๋๋ผ๋ฉด ๋ฌด์์ด๋ ์ฌ์ฉ ๊ฐ๋ฅ
4๏ธโฃ ์ ์ญ ์คํ์ผ ์ค์ ํ๊ธฐ
import { createGlobalStyle } from 'styled-components";
const GlobalStyle = createGlobalStyle`
button {
padding: 5px;
margin: 2px;
border-radius: 5px;
}
`
function App() {
return (
<>
<GlobalStyle />
<Button>์ ์ญ ์คํ์ผ ์ ์ฉํ๊ธฐ</Button>
</>
);
}
โฐ <GlobalStyle> ์ปดํฌ๋ํธ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ์ ์ฌ์ฉํด์ฃผ๋ฉด ์ ์ญ์ <GlobalStyle> ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์ ์ฉ๋๋ค.
๐ฃ ์ค์ต
import styled from "styled-components";
const Button = styled.button`
padding: 1rem;
font-size: 2rem;
background: powderblue;
border-radius: 1rem;
transition: 0.5s;
&:hover{
// hover ํจ๊ณผ
background: cornflowerblue;
color: white;
transition: 0.5s;
}
`;
export default function App() {
return (
<Button>Practice!</Button>
);
}
๐ฃ ์ปดํฌ๋ํธ UI ๊ฐ๋ฐ์ ์ํ Storybook
โ๏ธ CDD๊ฐ ํธ๋ ๋๋ก ์๋ฆฌ ์ก๊ฒ ๋๋ฉด์ ์ด๋ฅผ ์ง์ํ๋ ๋๊ตฌ์ธ Component Explorer๊ฐ ๋ฑ์ฅํ๋ค.
โ๏ธ Storybook : Component Explorer ์ UI ๊ฐ๋ฐ ๋๊ตฌ ์ค ํ๋
๐ฃ Storybook์ด ๋ฌด์์ธ๊ฐ์?
โ๏ธ UI ๊ฐ๋ฐ, ์ฆ CDD๋ฅผ ํ๊ธฐ ์ํ ๋๊ตฌ
โฐ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ค์ ๋ฐ๋ก ๋ณผ ์ ์๊ฒ ๊ตฌ์ฑํด ์ฃผ์ด ํ ๋ฒ์ ํ๋์ ์ปดํฌ๋ํธ์์ ์์
ํ ์ ์๋ค.
โฐ ์ฌ์ฌ์ฉ์ฑ์ ํ๋ํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ฌธ์ํํ๊ณ , ์๋์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํํ์ฌ ์๋ฎฌ๋ ์ด์
ํ ์ ์๋ ๋ค์ํ ํ
์คํธ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
โฐ ๋ฒ๊ทธ ์ฌ์ ๋ฐฉ์ง, ํ
์คํธ ๋ฐ ๊ฐ๋ฐ ์๋ ํฅ์์ ์ฅ์ ์ด ์๋ค.
๐ฃ Storybook๊ณผ ๊ฐ์ UI ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ์ฌ์ฉํ ๊น์?
โ๏ธ Storybook์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋
๋ฆฝ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์คํ๋๋ฉฐ, ๊ฐ๋ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ค์ํ ์ํฉ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ UI ์ปดํฌ๋ํธ๋ฅผ ์ง์ค์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ค.
โ๏ธ Storybook ์ ์ฃผ์ ๊ธฐ๋ฅ
โฐ UI ์ปดํฌ๋ํธ๋ค์ ์นดํ๋ก๊ทธํ ํ๊ธฐ
โฐ ์ปดํฌ๋ํธ ๋ณํ๋ฅผ Stories๋ก ์ ์ฅํ๊ธฐ
โฐ ํซ ๋ชจ๋ ์ฌ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ฐ๋ฐ ํด ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ
โฐ ๋ฆฌ์กํธ๋ฅผ ํฌํจํ ๋ค์ํ ๋ทฐ ๋ ์ด์ด ์ง์ํ๊ธฐ
๐ฃ Storybook ์ผ๋ก ์ปดํฌ๋ํธ๋ค์ ๋ฌธ์ํํด์ ๊ด๋ฆฌํ๊ธฐ
โฐ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ Storybook ์ค์นํ๊ธฐ
npx storybook init
// package.json์ ๋ณด๊ณ ์ฌ์ฉ ์ค์ธ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง๋ Storybook ์ฌ์ฉํ๊ฒฝ์ ์์์ ๋ง๋ค์ด์ฃผ๋ ๋ช
๋ น์ด
โฐ /.storybook ํด๋์ /src/stories ํด๋๊ฐ ์์ฑ๋๊ณ /.storybook ํด๋์๋ Storybook ๊ด๋ จ ์ค์ ํ์ผ์ด, /src/stories ํด๋์๋ Storybook ์์ ํ์ผ๋ค์ด ๋ค์ด์๋ค.
โฐ ํฐ๋ฏธ๋์์ Storybook ์คํํ๊ธฐ
npm run storybook
โฐ localhost:6006 ์ผ๋ก ์ ๊ทผํ์ฌ Storybook์ ์คํ์ํจ๋ค.
โฐ /src/stories ํด๋ ์์ ์๋, Storybook์์ ๋ง๋ค์ด๋์ ์์ ์คํ ๋ฆฌ๋ฅผ ํ์ธํ ์ ์๋ค.
โฐ ์คํ ๋ฆฌ ์์ฑ -> src ํด๋ ์์ Title.js ํ์ผ์ ๋ง๋ค๊ณ , ์ปดํฌ๋ํธ 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 ํ์ผ์ ํ๋ ๋ง๋ ๋ค.
// ์์์ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
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.bins({}); ๋ ์ ํด์ง ๋ฌธ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
export const RedTitle = Template.bind({});
// ๋ง๋ค์ด์ค ์คํ ๋ฆฌ์ ์ ๋ฌ์ธ์๋ฅผ ์์ฑํด์ค๋๋ค.
RedTitle.args= {
title: "Red Title",
textColor: "red"
}
// ์คํ ๋ฆฌ๋ฅผ ํ๋ ๋ ๋ง๋ญ๋๋ค.
export const BlueTitle = Template.bind({});
// ์คํ ๋ฆฌ์ ์ ๋ฌ์ธ์๋ฅผ ์์ฑํด์ค๋๋ค.
BlueTitle.args= {
title: "Blue Title",
textColor: "blue"
}
โฐ Storybook ์ค์ ํ์ผ์ ์ํด์ ์ปดํฌ๋ํธ ํ์ผ๊ณผ ๋๊ฐ์ ํ์ผ ์ด๋ฆ์ .stories๋ฅผ ๋ถ์ฌ ํ์ผ์ ๋ง๋ค๋ฉด ์์์ ์คํ ๋ฆฌ๋ก ์ธ์ํ๋ค.
๐ฃ useRef
โ๏ธ DOM ์๋ฆฌ๋จผํธ์ ์ฃผ์๊ฐ์ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ React๋ก ๋ชจ๋ ๊ฐ๋ฐ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ์ ์๋ค.
โฐ focus
โฐ text selection
โฐ media playback
โฐ ์ ๋๋ฉ์ด์
์ ์ฉ
โฐ DOM ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
โฐ ์์ ๊ฐ์ ์์ธ์ ์ธ ์ํฉ์์ useRef๋ก DOM ๋
ธ๋, ์๋ฆฌ๋จผํธ, ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์ฃผ์๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>);
}
โฐ ์ด ์ฃผ์๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋๋ผ๋ ๋ฐ๋์ง ์๋๋ค.
๐จ useRef๋ ๋ฆฌ์กํธ์ ํน์ง์ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์์น๊ณผ ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์ ๋จ์ฉํด์๋ ์๋๋ค!
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S3) Unit 5. [์ฌ์ฉ์ ์นํ ์น] ์น ํ์ค (0) | 2023.02.28 |
---|---|
S3) Unit 4. [React] ์ํ ๊ด๋ฆฌ (0) | 2023.02.23 |
S3) Unit 2. [์ฌ์ฉ์ ์นํ ์น] UI/UX (0) | 2023.02.15 |
S3) Unit 1. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] JSON.stringify (0) | 2023.02.14 |
S3) Unit 1. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] ์ฌ๊ท (0) | 2023.02.13 |