2021. 12. 8. 00:33ใWEB Dev/ToyProject
๐ท CloneTodo โ - Todomate Clone Project | Team CloneMate
CloneTodo : ๋ง์ ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํฌ๋๋ฉ์ดํธ๋ฅผ ํด๋ก ํ์ฌ ์น ์๋น์ค๋ฅผ ๋ฐฐํฌํด๋ณด๋ ํ๋ก์ ํธ
์ด์ ๋ ํด๋ํธ๋ฆฌ๋ฅผ ๊ทธ๋ ค๋ณด์๊ณ ์ค๋์ MUI ์ค์ต์ ํ๋ ค๊ณ ํ๋ค.
'์ฝ๋์ ๋น ์ง๋ค' ๋ผ๋ ๋ธ๋ก๊ทธ์์ ์ข์ ์ค์ต ์๋ฃ๊ฐ ์๋ ๊ฒ ๊ฐ์์ ๊ทธ๋๋ก ๋ฐ๋ผํ๋ฉด์ ์ด๊ฒ ์ ๊ฒ ์ปดํฌ๋ํธ๋ฅผ UI๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฝ์ ํด๋ณด๋ ค๊ณ ํ๋ค.
์ด๋ฒ ์ฐ์ต์ ๋ฆฌ์กํธ ๊ฐ์๋ฅผ ๋ค์๋ ์ฝ๋ฉ์ ํ ์ค์ตํ์ผ์ MUI๋ฅผ ์ถ๊ฐํด์ ์ด๊ฒ์ ๊ฒ ์ง๋ณด๋ ค๊ณ ํ๋๋ฐ
์๋
๊นํ๋ธ ์๋๋ฅผ ํ๋๋ผ๋ ๋ ์ฑ์์ผ ํ๊ธฐ ๋๋ฌธ์..!
๐ธ MUI Material-UI๋?
๋ฆฌ์กํธ์๋ ์ธ์ง๋๊ฐ ๋์ ๋ถํธ์คํธ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ง๋ง ์์ฆ์ Material-UI ๋ผ๊ณ ํ์๋ถ๋ค์ด ํ์ ์ ์ฒ์ ์๊ฒ ๋์๋ค. ์ญ์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํ์ด ๋นจ๋ฆฌ์ง๋๋ค. ์๋ ์๋ง ํด๋ ๋น์ฐํ ๋ถํธ์คํธ๋ฉ ์ด๋ค๊ณ ๋ฐฐ์ ๋๋ฐ ^^
Material-UI๋ ์ธ๊ณ์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ฆฌ์กํธ UI ํ๋ ์์ํฌ๋ผ๊ณ ํ๋ค.
์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ฐ ์ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๊ตฌ๊ธ๋งํด์ ๋ค๋ฅธ ์ฌ๋์ ๋ธ๋ก๊ทธ์์ ์ฝ๋ ํ ๋ถ๋ถ์ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ๊ฒ ์ฒ๋ผ ๋ฏธ๋ฆฌ ๋์์ธํด ๋ง๋ค์ด ๋ ๋ค์ํ ๋ฒํผ, ํ ์ด๋ธ, ๋ฐฐ๋ ๋ฑ์ ์ฝ๋๋ฅผ ๋ ๋ผ์์ ๋ด ์ฝ๋ ์์ ๋ถ์ฌ ๋ฃ์ด ๋ง๋๋ ๊ฒ์ด UI๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
npm ํจํค์ง๋ yarn์ผ๋ก ์ค์น๊ฐ ๊ฐ๋ฅํ๋ค.
styled-components์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ์ด๋ฒ์๋ npm์ผ๋ก ์ค์นํด์ ํ๋ ์์ํฌ๋ฅผ ์ํฌํธํด์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค.
๐ธ MUI Material-UI ์ค์นํ๊ธฐ
๋จผ์ MUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
// with npm
npm install @mui/material @emotion/react @emotion/styled
// with yarn
yarn add @mui/material @emotion/react @emotion/styled
๋๋ npm์ ์ฃผ๋ก ์ด์ฉํ๊ธฐ ๋๋ฌธ์ npm ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ๋ถ์ฌ๋ฃ์ด ์ค์นํ๋ค. (CDN๋ ๊ฐ๋ฅํ๋ค.)
๊ทธ๋ฆฌ๊ณ Roboto ๊ธ๊ผด๊ณผ ์์ด์ฝ๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ณต์๋ฌธ์๊ฐ ์ ์ํ๋๋๋ก link ํ๊ทธ๋ฅผ public>index.html์ ์ถ๊ฐํ๋ค.
<!-- Roboto -->
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
<!-- Material Icons -->
<link
rel="stylesheet"
href="https://fonts.googleapis.com/icon?family=Material+Icons"
/>
// with npm
npm install @mui/icons-material
// with yarn
yarn add @mui/icons-material
์ฌ๊ธฐ์ ๋ถ์ฌ๋ฃ๊ฒ ๋ ์ปดํฌ๋ํธ๋ ๊ฐ๊ฐ API(์ฌ์ฉํ ๋ ์กฐ์ ํ ์ ์๋ ์กฐ๊ฑด๋ค)์ ์ ๊ณตํ๋๋ฐ props๋ className, attr๋ก ๊ฐ์ ๋๊ฒจ์ค ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ CSS๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ MUI์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ด๋ฅผ ์ํด์ ๋ณ๋์ ํจํค์ง๋ฅผ ํ๋ ๋ ์ค์นํด์ผ ํ๋ค.
// with npm
npm install @mui/styles
// with yarn
yarn add @mui/styles
import ํ ๋ { makeStyles }๋ฅผ @mui/styles์์ import ํด์ค๋ค.
๊ธฐ๋ณธ CSS๋ฅผ ์ฌ์ฉํ ๋์ฒ๋ผ reset.css๋ฅผ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด CssBaseline ํจํค์ง๋ฅผ import ํด์ค์ผ ํ๋ค.
import * as React from 'react';
import CssBaseline from '@mui/material/CssBaseline';
export default function MyApp() {
return (
<React.Fragment>
<CssBaseline />
{/* The rest of your application */}
</React.Fragment>
);
}
๐ธ MUI Material-UI ์ฌ์ฉํ๊ธฐ
๋ณ ๋ฌธ์ ์์ด ์ค์น๋์๋ค๋ฉด ์ฒ์์ผ๋ก ํ๋ฉด์ ๋ฒํผ ํ๋๋ฅผ ๋์๋ณด๋ ค๊ณ ํ๋ค.
App.js์ ๋ด๋ถ๋ฅผ ๊น๋ํ๊ฒ ์ง์๋ฒ๋ฆฌ๊ณ npm start๋ก ํ๋ฉด์ ๋ธ๋ผ์ฐ์ ์ ๋์ด๋ค.
import React from "react";
import './App.css';
function App() {
return
}
export default App;
์ด ์ํ์์๋ ์๋ฌด๊ฒ๋ ์๋ ๋น ํ๋ฉด์ด ๋ฑ์ฅํ๋๋ฐ Button UI ์์ ๋ฅผ ๋ฐ๋ผํ๊ธฐ ์ํด MUI๋ฅผ import ํ๋ค.
Button ์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ธฐ ์ํด์๋ MUI-Button์ Button ์ปดํฌ๋ํธ๋ฅผ importํด์ค์ผ ํ๋ค.
import * as React from "react";
import ReactDOM from "react-dom";
import Button from "@mui/material/Button";
import CssBaseline from "@mui/material/CssBaseline";
์๋ ์ปดํฌ๋ํธ๊น์ง ์ ๋ ฅํ๋ฉด ์ด๋ ๊ฒ ๋๋ค.
import * as React from "react";
import ReactDOM from "react-dom";
import Button from "@mui/material/Button";
import CssBaseline from "@mui/material/CssBaseline";
function App() {
return (
<React.Fragment>
<CssBaseline />
<Button variant="contained">Hello World</Button>
</React.Fragment>
);
}
export default App;
props ๋ก ๋ค์ด๊ฐ variant๋ ๋ฒํผ์ ์ข ๋ฅ(๋์์ธ)์ธ๋ฐ ์๋์ ๊ฐ์ด Text, Contained, Outlined ์ธ ๊ฐ์ง์ ์กฐ๊ฑด์ด ์ ๊ณต๋๋ค.
์์ ๊ฐ์ด ๋ง๋ ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋๋ก ์ธ์ธํ๊ฒ ์์ ํ๊ณ ์ถ๋ค๋ฉด makeStyles ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
(์ด ๋ฐฉ์์ ๋ฆฌ์กํธ V5 ์์๋ถํฐ ๋ ๊ฑฐ์๊ฐ ๋์๋ค ๐ญ๐ญ)
๋ด์ผ์ MUI์์ ์ธ๋ถ CSS๋ฅผ ๋ค๋ฃจ๋ ๋ฒ๊ณผ (๊ทธ๋ฅ SCSS ์ ์ฉํด๋ ๋๋? ํ ์คํธํด๋ณด๋ App.css์ !important๋ก ๋ฐ์ด๋ฃ์ด๋ ๋ฌธ์ ์์ด ์ ์ฉ๋์๋ค.) ๋ฉ์ธ ํ๋ฉด ์ค ๋ก๊ทธ์ธ ํ๋ฉด์ ์ปดํฌ๋ํธ๋ก ์ง๋ด์ผ๊ฒ ๋ค.