December 19, 2020
์จ๋ผ์ธ ์น ๋งํผ์ ๊ฒ์์ด๊ณ ๊ฐ์๊ฐ ์ฝ๋ฉ ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฏธ์ ์ด ์ฃผ์ด์ง๋ค.
(์์ง ๋ชจ๋ฅด๊ฒ ๋ค..)
์ํฌ์คํฐ๋ ๊ฐ์ข ํผ๋ฐฉ์ ๋๋๋ค.
(์ด๋ค ํผ๋ฐฉ์ธ์ง๋ ์ด ๋ํ ๋ฏธ์ ..)
์ฑํ ์ ํตํด ๋งํผ์๋ฅผ ์ก์ ๋ธ๋ค. ๋ญ๊ฐ ๋ด์ฉ์ ๊ฐ๋จํ๋ค.
ํ์ง๋ง ์ด๋ป๊ฒ ๋ง๋ค๊น? ํ๋๋ ํ๋ค.
๊ทธ๋ฅ ์บ๋ฆญํฐ๊ฐ ๊ท์ฝ๊ฒ ์๊ฒจ์์ด๋ค.
์์๋ ์นด์นด์คํก ์ด๋ชจํฐ์ฝ๋ ๋ง ์์ฒญ ๊ทธ๋ฆผ์ฒด๊ฐ ํ๋ ค ํด์ ์ธ๊ธฐ๋ฅผ ๋๋๊ฒ ์๋๋ผ, ๋ญ๊ฐ..
๊ทธ๋ฆผ์ฒด๊ฐ ๋ง ์์ฒญ๋ ํํ์ ์๋ํ์ง ์๊ณ ๋ณ๋ง(?) ์ค๋ฝ๊ฒ ์๊ฒผ์ง๋ง ์ธ๊ธฐ๋ฅผ ๋๋? ๊ทธ๋ฐ ์บ๋ฆญํฐ ๋ง์ด๋ค.
์ด๋ชฝ์ด์ค ์บ๋ฆญํฐ๊ฐ ๋ฑ ๊ทธ๋ฐ ๋๋์ด๋ค. (๋ด์๊ฐ์๋ ..ใ ใ )
๊ตฌ๊ธ์ amongus font ๋ก ๊ฒ์ํด๋ณด๋,
in-your-face ๋ผ๋ ํฐํธ์ vcr-osd-mono ํฐํธ ๋ ์ข ๋ฅ๊ฐ ์์๋ค.
๋ฉ์ธ ํฐํธ๋ in-your-face ๋ก ๊ฐ๋ฉด์ ์์ด๋๋ ๋น๋ฐ๋ฒํธ ์ ๋ ฅํ ๋ ์ฐ๋ ํฐํธ๋ vcr ํฐํธ๋ก ๊ฐ ์๊ฐ์ด๋ค.
ํฐํธ ํ์ฅ์๋ woff, eot, svg ๋ฑ์ด ์๋๊ฑฐ ๊ฐ์๋ฐ ์ ํํ๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๋ ๊ฒ ํด๋ ๋ด์ ๋ฃ๊ณ ์,
@font-face {
font-family: "VCR-OSD-Mono";
src: url("./fonts/VCR-OSD-Mono.ttf.woff") format("woff"),
url("./fonts/VCR-OSD-Mono.ttf.svg#VCR-OSD-Mono") format("svg"),
url("./fonts/VCR-OSD-Mono.ttf.eot"),
url("./fonts/VCR-OSD-Mono.ttf.eot?#iefix") format("embedded-opentype");
font-weight: normal;
font-style: normal;
}
App.css ์ ์์ ๊ฐ์ ์์ผ๋ก ์ ์ฉํด ์ฃผ๋ฉด ๋๋ค.
Home.js ๐ http://localhost:3000/
Profile.js ๐ http://localhost:3000/profile
Signin.js ๐ http://localhost:3000/signin
Signup.js ๐ http://localhost:3000/signup
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒฝ๋ก์ ํด๋นํ๋ ํ์ผ์ ๋ํด์๋ ๋๊ฐ์ ๋์์ธ์ ์ ์ฉํ๊ธฐ ์ํด์!
src/components ํด๋ ๋ด AppLayout ์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์๋ค.
์ฌ๊ธฐ์๋ ๊ฐ์ด๋ฐ ๋ด์ฉ์ด ์๋ฆฌํ ์ปจํ ์ธ ์ ์๋ ๋ฉ๋ด ๋ฒํผ๋ค์ด ๊ณตํต์ผ๋ก ๋ค์ด๊ฐ๊ฒ๋ ํด์ฃผ์๋ค.
๊ฐ ๊ฒฝ๋ก๋ณ๋ก ๋ค์ด๊ฐ๋ ์ปจํ ์ธ ๋ด์ฉ์ด ๋ฌ๋ผ์ง ๊ฒ์ด๊ธฐ์,
์ผ๋จ ๋ค ๊ฒฝ๋ก์ ์ปดํฌ๋ํธ๋ฅผ ์๋์ ๊ฐ์ด AppLayout ์ผ๋ก ๊ฐ์ธ์ฃผ์๋ค.
import React from 'react'
import AppLayout from '../../src/components/AppLayout'
const Home = () => {
return (
<AppLayout>
<div>Let's build COMONGUS</div>
</AppLayout>
)
}
export default Home
๊ทธ๋ฌ๋ฉด ์ AppLayout ์ฌ์ด ์๋์์น ๋ ๋ฆฌ์กํธ node ๋ AppLayout ์ children ์ด ๋๋ค.
๊ทธ๋ฌ๋ฉด AppLayout ์ปดํฌ๋ํธ์์ children ๊ฐ์ฒด๋ก ๋ฐ์ ์ธ ์ ์๋ค.
react-router-dom ์ค์นํด ์ค๋ค.
App.js ์ ์๋์ ๊ฐ์ด ์์ ํ๊ณ ๋ผ์ฐํธ์ ๋ง๋ค์ด๋์ ์ปดํฌ๋ํธ๋ฅผ ์ํฌํธ ํ๋ค.
function App() {
return (
<>
<div className="app__title">COMONG US</div>
<Route path="/" component={Home} exact={true} />
<Route path="/profile" component={Profile} />
<Route path="/signin" component={Signin} />
<Route path="/signup" component={Signup} />
</>
)
}
exact ์ด๊ผด true ๋ฅผ ์ ์ ์ด์ ๋ /profile ์ ๋ค์ด๊ฐ์ ๋ ๋ฃจํธ ๊ฒฝ๋ก์ ๋ด์ฉ๊น์ง ๊ฒน์ณ ๋์ค๊ฒ ๋๋ฏ๋ก ์์ ๊ฐ์ด ์กฐ์ .
๋ฐ์ํ์ด๋ผ๋ ๊ฒ์ ์ฒ์ ์จ๋ณด๊ฒ ๋์๋ค.
๋ฌผ๋ก ๋ ํ๊ณ ๋ค๋ฉด ๋ ๋ง์ด ๋์ค๊ฒ ์ง๋ง ์ผ๋จ ๋๋ ์ด๋ ๊ฒ ํ๋ค.
์ผ๋จ App.css ์์ ์ ์ฒด ์ ์ธ ๊ณตํต css ์ ๋ชจ์์ ์ก๋๋ฐ,
// ํ๋ฉด ์ต๋์น ์ผ๋ css
@media (min-width: 1024px) {
// ์ฌ๊ธฐ๋ ์ต์ ํ๋ฉด ํฌ๊ธฐ๊ฐ 1024๋ถํฐ ์ผ๋
// ์์๋ค ์จ๋ ๋ ๊ฑฐ๊ฐ์๋ฐ ์๋จน์ด์ ์ด๋ ๊ฒ ๊ผผ์๋ฅผ ์
}
@media (max-width: 1023px) {
}
@media (max-width: 767px) {
}
์ค์ํ ์ ์ ๋ฌด์กฐ๊ฑด ์ฐฝ์ด ์ ์ผ ์์๋ ๋ถํฐ css ๋์์ธ์ ํด๋๊ฐ์ผ ํ๋จ ์ ์ด๋ค.
ํฐ๊ฑฐ ๋ถํฐ ์ง์ ์์ ์ฐฝ์ css ํ๋ฉด ์ ์ ๊ฑด๊ฐ์ ์ด๋กญ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ๊ฐ๋ ฅ ๋ฐฐ์ ํ๊ณ ์ค๋ก์ง ๋ฐ๋ฐ๋ฅ๋ถํฐ ๋ง๋ค ์๊ฐ์ด์ง๋ง, ์์ด์ฝ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ๋ง๋ค ์ด์ ๋ ์๋ค๊ณ ์๊ฐํ๋ค.
https://material-ui.com/getting-started/installation/
์ค์นํ import ํด์ ์ ์ฉํ๋ฉด ๋๋ค.
<div className="menu__item">
<Link to="/">
<a style={{ color: '#ff6341' }}>
<HomeOutlinedIcon style={{ fontSize: '40px' }} />
<span>MAIN</span>
</a>
</Link>
</div>
Signin.js ์์ ์ ์ ์ ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ผ UserProfile ์ด๋ LoginForm ์ ๋ณผ ์ ์๊ฒ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ ์ฉํ๋ค.
const Signin = () => {
const [isLoggedIn, setIsLoggedIn] = useState(false)
return <AppLayout>{isLoggedIn ? <UserProfile /> : <LoginForm />}</AppLayout>
}
๊ทธ๋ฆฌ๊ณ components ๋ด์ LoginForm ์ ๋ง๋ค์๋ค.
LoginForm ์์๋ ์ด๋ชฝ ์ฌ์ง๊ณผ ๋ก๊ทธ์ธ์ ํ๋ label, input ํ๊ทธ๋ก ํ๋ฉด์ ๊ตฌ์ฑํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์๊น์ ๊ฐ์ ๋ฐ์ํ์ ์ ์ฉํด์ css ๋ฅผ ์ ์ฉํ๋ค.
์ฐฝ ํฌ๊ธฐ๊ฐ ์ค๊ฐ ์ดํ๋ก ๋จ์ด์ง ๋๋ ์๋์ ๊ฐ์ด,
์ฐฝ ํฌ๊ธฐ๊ฐ ์ต์๋ก ์ค์ด๋ค๋ฉด,
์ด๋ ๊ฒ ํ ๋ฒ์ ๋ง์ด์ฉ ๋ง๋ค์ง ๋ชปํ ํ ๋ ๋งค์ผ ์กฐ๊ธ์ฉ ์กฐ๊ธ์ฉ ํด๋๊ฐ์ผ ๊ฒ ๋ค.
์ค๋์ ๋ฌด์๋ฌด์์ ๋ฐฐ์ ๋ค~ ๊ณต๋ถํ๋ค~ ๊ทธ๋ฌ๋ฉด ์ต๋ํ ์ ์ฉํ ๋ฐฉ๋ฒ์ ์ฐพ์์ ์ ์ฉํด ๋ณด๊ณ ๋ ธ๋ ฅํด ๋ณด์.
์์๋ ์๋๊ฒ ์๋๋ ๊ฑธ ์๊ฒ ๋์์ผ๋ ์ฒ์ฒํ ๋ด ํ์ด์ค์ ๋ง๊ฒ ๋ง๋ค์ด ๋๊ฐ์.