๐Ÿš€Comongus Begins

๐ŸŒˆComong US Concept

์˜จ๋ผ์ธ ์›น ๋งˆํ”ผ์•„ ๊ฒŒ์ž„์ด๊ณ  ๊ฐ์ž๊ฐ€ ์ฝ”๋”ฉ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฏธ์…˜์ด ์ฃผ์–ด์ง„๋‹ค.

(์•„์ง ๋ชจ๋ฅด๊ฒ ๋‹ค..)

์ž„ํฌ์Šคํ„ฐ๋Š” ๊ฐ์ข… ํ›ผ๋ฐฉ์„ ๋†“๋Š”๋‹ค.

(์–ด๋–ค ํ›ผ๋ฐฉ์ธ์ง€๋Š” ์ด ๋˜ํ•œ ๋ฏธ์ •..)

์ฑ„ํŒ…์„ ํ†ตํ•ด ๋งˆํ”ผ์•„๋ฅผ ์žก์•„ ๋‚ธ๋‹ค. ๋ญ”๊ฐ€ ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ? ํ›„๋œ๋œ ํ•˜๋‹ค.

๐ŸŽ‰์™œ? ์–ด๋ชฝ์–ด์Šค ์บ๋ฆญํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๋‚˜?

๊ทธ๋ƒฅ ์บ๋ฆญํ„ฐ๊ฐ€ ๊ท€์—ฝ๊ฒŒ ์ƒ๊ฒจ์„œ์ด๋‹ค.

์š”์ƒˆ๋Š” ์นด์นด์˜คํ†ก ์ด๋ชจํ‹ฐ์ฝ˜๋„ ๋ง‰ ์—„์ฒญ ๊ทธ๋ฆผ์ฒด๊ฐ€ ํ™”๋ ค ํ•ด์„œ ์ธ๊ธฐ๋ฅผ ๋„๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ญ”๊ฐ€..

๊ทธ๋ฆผ์ฒด๊ฐ€ ๋ง‰ ์—„์ฒญ๋‚œ ํ™”ํ’์„ ์ž๋ž‘ํ•˜์ง€ ์•Š๊ณ  ๋ณ‘๋ง›(?) ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฒผ์ง€๋งŒ ์ธ๊ธฐ๋ฅผ ๋„๋Š”? ๊ทธ๋Ÿฐ ์บ๋ฆญํ„ฐ ๋ง์ด๋‹ค.

์–ด๋ชฝ์–ด์Šค ์บ๋ฆญํ„ฐ๊ฐ€ ๋”ฑ ๊ทธ๋Ÿฐ ๋Š๋‚Œ์ด๋‹ค. (๋‚ด์ƒ๊ฐ์—๋Š” ..ใ…Žใ…Ž)

๐Ÿ•นํ˜„์žฌ ์ง„ํ–‰ ์‚ฌํ•ญ

1. src/fonts ๋‚ด์— 2๊ฐ€์ง€ ํฐํŠธ ๋„ฃ์Œ

๊ตฌ๊ธ€์— 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 ์— ์œ„์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์ ์šฉํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

2. src/routes ๋‚ด ๊ฒฝ๋กœ ๋‚˜๋ˆ„์–ด ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ

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 ๊ฐ์ฒด๋กœ ๋ฐ›์•„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

3. react-router-dom ์„ค์น˜ ๋ฐ ๊ฒฝ๋กœ ๋ถ„๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑ

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 ์„ ๋“ค์–ด๊ฐ”์„ ๋•Œ ๋ฃจํŠธ ๊ฒฝ๋กœ์˜ ๋‚ด์šฉ๊นŒ์ง€ ๊ฒน์ณ ๋‚˜์˜ค๊ฒŒ ๋˜๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด ์กฐ์ •.

4. CSS ๋†€์ด (App.css)

๋ฐ˜์‘ํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ์ฒ˜์Œ ์จ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฌผ๋ก  ๋” ํŒŒ๊ณ  ๋“ค๋ฉด ๋” ๋งŽ์ด ๋‚˜์˜ค๊ฒ ์ง€๋งŒ ์ผ๋‹จ ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ํ–ˆ๋‹ค.

์ผ๋‹จ App.css ์—์„œ ์ „์ฒด ์ ์ธ ๊ณตํ†ต css ์˜ ๋ชจ์–‘์„ ์žก๋Š”๋ฐ,

// ํ™”๋ฉด ์ตœ๋Œ€์น˜ ์ผ๋•Œ css

@media (min-width: 1024px) {
  // ์—ฌ๊ธฐ๋Š” ์ตœ์†Œ ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ 1024๋ถ€ํ„ฐ ์ผ๋•Œ
  // ์œ„์—๋‹ค ์จ๋„ ๋ ๊ฑฐ๊ฐ™์€๋ฐ ์•ˆ๋จน์–ด์„œ ์ด๋ ‡๊ฒŒ ๊ผผ์ˆ˜๋ฅผ ์”€
}

@media (max-width: 1023px) {

}

@media (max-width: 767px) {

}

์ค‘์š”ํ•œ ์ ์€ ๋ฌด์กฐ๊ฑด ์ฐฝ์ด ์ œ์ผ ์ž‘์„๋•Œ ๋ถ€ํ„ฐ css ๋””์ž์ธ์„ ํ•ด๋‚˜๊ฐ€์•ผ ํ•œ๋‹จ ์ ์ด๋‹ค.

ํฐ๊ฑฐ ๋ถ€ํ„ฐ ์งœ์„œ ์ž‘์€ ์ฐฝ์„ css ํ•˜๋ฉด ์ •์‹ ๊ฑด๊ฐ•์— ์ด๋กญ์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

5. Material UI Icon ์‚ฌ์šฉ

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์€ ๊ฐ•๋ ฅ ๋ฐฐ์ œํ•˜๊ณ  ์˜ค๋กœ์ง€ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๋งŒ๋“ค ์ƒ๊ฐ์ด์ง€๋งŒ, ์•„์ด์ฝ˜์„ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๋งŒ๋“ค ์ด์œ ๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

https://material-ui.com/getting-started/installation/

comongus born

์„ค์น˜ํ›„ import ํ•ด์„œ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.

<div className="menu__item">
  <Link to="/">
    <a style={{ color: '#ff6341' }}>
      <HomeOutlinedIcon style={{ fontSize: '40px' }} />
      <span>MAIN</span>
    </a>
  </Link>
</div>

6. LoginForm ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

Signin.js ์—์„œ ์œ ์ €์˜ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ UserProfile ์ด๋‚˜ LoginForm ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ–ˆ๋‹ค.

const Signin = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(false)
  return <AppLayout>{isLoggedIn ? <UserProfile /> : <LoginForm />}</AppLayout>
}

๊ทธ๋ฆฌ๊ณ  components ๋‚ด์— LoginForm ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

LoginForm ์—์„œ๋Š” ์–ด๋ชฝ ์‚ฌ์ง„๊ณผ ๋กœ๊ทธ์ธ์„ ํ•˜๋Š” label, input ํƒœ๊ทธ๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„๊นŒ์™€ ๊ฐ™์€ ๋ฐ˜์‘ํ˜•์„ ์ ์šฉํ•ด์„œ css ๋ฅผ ์ ์šฉํ–ˆ๋‹ค.

7. ์Šคํฌ๋ฆฐ์ƒท

among main

์ฐฝ ํฌ๊ธฐ๊ฐ€ ์ค‘๊ฐ„ ์ดํ•˜๋กœ ๋–จ์–ด์งˆ ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด,

among mid

์ฐฝ ํฌ๊ธฐ๊ฐ€ ์ตœ์†Œ๋กœ ์ค„์–ด๋“ค๋ฉด,

among small

๐ŸŒˆAchievement Goal

์ด๋ ‡๊ฒŒ ํ•œ ๋ฒˆ์— ๋งŽ์ด์”ฉ ๋งŒ๋“ค์ง€ ๋ชปํ•  ํ…Œ๋‹ˆ ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์กฐ๊ธˆ์”ฉ ํ•ด๋‚˜๊ฐ€์•ผ ๊ฒ ๋‹ค.

์˜ค๋Š˜์€ ๋ฌด์—‡๋ฌด์—‡์„ ๋ฐฐ์› ๋‹ค~ ๊ณต๋ถ€ํ–ˆ๋‹ค~ ๊ทธ๋Ÿฌ๋ฉด ์ตœ๋Œ€ํ•œ ์ ์šฉํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ์ ์šฉํ•ด ๋ณด๊ณ  ๋…ธ๋ ฅํ•ด ๋ณด์ž.

์•Œ์•„๋„ ์•„๋Š”๊ฒŒ ์•„๋‹ˆ๋ž€ ๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ ์ฒœ์ฒœํžˆ ๋‚ด ํŽ˜์ด์Šค์— ๋งž๊ฒŒ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€์ž.


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook