๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒณ React

[React] http://localhost:5173/ ์ดˆ๊ธฐ ํ™”๋ฉด์„ ๋ถ„์„ํ•ด๋ณด์ž.

by ._.sori 2025. 10. 13.

 

 

 

์ฐธ๊ณ ๋กœ React์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์•„๋ฌด๊ฑฐ๋‚˜ ๋ง‰ ํ•ด๋ณด๋Š” ์ค‘์ด๊ณ  ์˜ณ์€ ์ •๋ณด์ธ์ง€ ์ €๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค!

 

 


 

 

์ดˆ๊ธฐ ํ™”๋ฉด๊ณผ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ 
์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ถ„์„ํ•ด๋ณด์ž!




 

1. ํ™”๋ฉด

 

ํ™”๋ฉด์„ ์‚ดํŽด๋ณด๋ฉด, Vite์™€ React ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ React ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€๋Š” ๋น™๊ธ€๋น™๊ธ€ ํšŒ์ „ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  count is 0 ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด 0์ด ์ ์  ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 


 

 

 

 

2. ํŒŒ์ผ

  • ์ „์ฒด ํŒŒ์ผ

 

 

  • jsx์™€ css์˜ ์ฐจ์ด์ 
jsx๋Š” ํ™”๋ฉด ๊ตฌ์กฐ์™€ ๋กœ์ง์„ ๋‹ด๋‹นํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ฐฐ์—ดํ• ๊ฑด์ง€ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊ฑด์ง€ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ธ jsx ํŒŒ์ผ์ด๋‹ค. css๋Š” ์™ธํ˜•์„ ๊พธ๋ฏธ๋Š” ์„ค์ •์„ ํ•œ๋‹ค. ์ƒ‰์ƒ, ์—ฌ๋ฐฑ, ํฐํŠธ ๋“ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค.

Vue๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•œ ์ž…์žฅ์—์„œ ์•Œ์•„๋ณด๋‹ˆ, script์™€ template๊ฐ€ jsx ํŒŒ์ผ์„ ๋‹ด๋‹นํ•˜๊ณ  style์ด css๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฑธ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

  • App.jsx
// useState๋Š” ์ปดํฌ๋„ŒํŠธ์— state ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” React Hook์ด๋‹ค.
import { useState } from 'react'
// ๋กœ๊ณ ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
// App.css๋„ ๊ฐ€์ ธ์˜ค์ž.
import './App.css'


// ์ฒซํ™”๋ฉด์ด ๋ณด์ด๋„๋ก ํ•œ๋‹ค.
function App() {

  // useState๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  // count๊ฐ€ ์›๋ž˜ ๊ฐ’, setCount๋Š” ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. 
  const [count, setCount] = useState(0)

  // ํ™”๋ฉด์— ๋ณด์ด๊ณ  ์‹ถ์€ UI๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
  return (
    <>
      <div>
        <a href="https://vite.dev" target="_blank">
          <img src={viteLogo} className="logo" alt="Vite logo" />
        </a>
        <a href="https://react.dev" target="_blank">
          <img src={reactLogo} className="logo react" alt="React logo" />
        </a>
      </div>
      <h1>Vite + React</h1>
      
      <div className="card">
        {/* ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด setCount ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  */}
        {/* count ๊ฐ’์„ ๋ฐ”๊ฟ”์ค€๋‹ค. */}
        <button onClick={() => setCount((count) => count + 1)}>     
          {/* ์—ฌ๊ธฐ์„œ count๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค. */}
          count is {count}
        </button>
        <p>
          Edit <code>src/App.jsx</code> and save to test HMR
        </p>
      </div>
      <p className="read-the-docs">
        Click on the Vite and React logos to learn more
      </p>
    </>
  )
}


// main.jsx์—์„œ import ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ณด๋‚ด์ž.
export default App
useState๋Š” ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [something, setSomething]๊ณผ ๊ฐ™์€ state ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ทœ์น™์ด๋‹ค. ์˜ˆ๋กœ const[age,setAge]=useState(28); ์ด๋Ÿฐ์‹์˜ ๊ตฌ์กฐ๋ฅผ ๋„์–ด์•ผํ•œ๋‹ค. useState๋Š” ์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. [state์˜ ์ดˆ๊ธฐ ์„ค์ •๊ฐ’, ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” set ํ•จ์ˆ˜]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€ useState๋Š” Hook์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์ด๋‚˜ ์ง์ ‘ ๋งŒ๋“  Hook์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ถœํ•˜๊ณ  state๋ฅผ ๊ทธ ์•ˆ์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค.


๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด์— ๋Œ€ํ•ด์„œ๋„ ์งง๊ฒŒ ์„ค๋ช…์„ ํ•ด๋ณด๊ฒ ๋‹ค. let arr = ["Bora", "Lee"]๋กœ ์ด๋ฆ„๊ณผ ์„ฑ์„ ์š”์†Œ๋กœ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด ์žˆ๋‹ค. ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด(๊ตฌ์กฐ ๋ฐฐ์—ด ํ• ๋‹น)๋Š” let [firstName, surname] = arr;๋กœ firstName์—” arr[0]์„, surname์—” arr[1]์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ ๋ณ€์ˆ˜๋กœ ์ด๋ฆ„๊ณผ ์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

- react์˜ usestate

 

useState – React

The library for web and native user interfaces

ko.react.dev

 

 

- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด)

 

๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

 

ko.javascript.info

 

 

 

  • App.css
#root {
  max-width: 1280px;
  margin: 0 auto;
  padding: 2rem;
  text-align: center;
}

.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
  filter: drop-shadow(0 0 2em #61dafbaa);
}
#root๋Š” ๋ฉ”์ธํ™”๋ฉด์˜ ํฌ๊ธฐ์™€ text์˜ ๋ฐฐ์น˜ ๋“ฑ์„ ์„ค์ •ํ–ˆ๋‹ค.

.logo๋Š” className="logo"์ธ Vite ๋กœ๊ณ ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ React ๋กœ๊ณ ๋„ ์ ์šฉ๋œ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. React ๋กœ๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์€ class="logo react"์ด๋‹ค. CSS์—์„œ๋Š” .logo๋ผ๊ณ  ์ ์œผ๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„์— logo๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ชจ๋“  ํด๋ž˜์Šค์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์–ด์„œ ๋ฆฌ์•กํŠธ ๋กœ๊ณ ์—๋„ ํ•ด๋‹น ์Šคํƒ€์ผ์ด ์ง€์ •๋๋‹ค. 

๋กœ๊ณ ์— ๋งˆ์šฐ์Šค๋ฅผ ๊ฐ€์ ธ๋‹ค ๋Œ€๋ฉด ๋กœ๊ณ  ๋’ค์— ์˜…์€ ๊ทธ๋ฆผ์ž๊ฐ€ ๋ณด์ด๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฑธ ์ง€์ •ํ•˜๋Š”๊ฒŒ :hover์ธ๋ฐ, ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๊ทธ๋ฆผ์ž๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋ณด์—ฌ์ง€๋„๋ก ํ–ˆ๋‹ค. .logo์— ๋ณด๋ฉด will-change์™€ transition์ด ์žˆ๋‹ค. will-change๋Š” ๋ณ€ํ™”ํ•˜๊ธฐ ์ „์— ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฏธ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ์‹œ์ผœ๋‘๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  transition์œผ๋กœ 300ms ๋™์•ˆ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. filter๋Š” ์š”์†Œ์— ๊ทธ๋ž˜ํ”ฝ ํšจ๊ณผ๋ฅผ ์ ์šฉํ•˜๋Š” CSS ์†์„ฑ์ด๋‹ค. ์†”์งํžˆ ๋ฌด์Šจ ๋ณด์ •์„ ํ•ด์ฃผ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ด๊ฑด ๋‹ค์Œ์— ๋‹ค์–‘ํ•˜๊ฒŒ ์†์„ฑ์„ ์ง€์ •ํ•˜๋ฉด์„œ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

๋งˆ์šฐ์Šค๋ฅผ ๊ฐ€์ ธ๋‹ค ๋Œ„ ๋กœ๊ณ ๋Š” ๊ทธ๋ฆผ์ž๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, ์•„์ฃผ ์ž์„ธํžˆ ๋ณด๋ฉด ์ด ๋‘ ๋กœ๊ณ ์˜ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ์ด ๋‹ค๋ฅธ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Vite ๋กœ๊ณ ๋Š” ๋ณด๋ผ์ƒ‰์ด๊ณ , react๋Š” ํŒŒ๋ž€์ƒ‰์ด๋‹ค. ๊ทธ๋ž˜์„œ :hover์—์„  ๊ฐ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ •ํ™•ํ•˜๊ฒŒ ์ ์–ด์คฌ๋‹ค. drop-shadow๊ฐ€ ๊ทธ๋ฆผ์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

 

- will-change

 

will-change - CSS: Cascading Style Sheets | MDN

auto ์ด ํ‚ค์›Œ๋“œ๋Š” ํŠน์ • ์˜๋„ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค; ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๋ณดํ†ต ์‹คํ–‰ํ•˜๋Š” ์–ด๋–ค ๋ฐœ๊ฒฌํ•œ ๋ฐฉ๋ฒ•์ด๋˜ ์ตœ์ ํ™”์ด๋˜ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋Š” ๋‹ค์Œ์˜ ๊ฐ’์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ๋‹ค: scroll-position ๋จธ์ง€์•Š์•„ ์š”์†Œ ์Šค

developer.mozilla.org

 

@keyframes logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

@media (prefers-reduced-motion: no-preference) {
  a:nth-of-type(2) .logo {
    animation: logo-spin infinite 20s linear;
  }
}
ํ™”๋ฉด์„ ๋ณด๋ฉด React ๋กœ๊ณ ๊ฐ€ ๋น™๊ธ€๋น™๊ธ€ ๋Œ๊ณ  ์žˆ๋‹ค. ๋น™๊ธ€๋น™๊ธ€ ๋Œ๊ฒŒ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. ์ „์— Vue๋กœ ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด ๊ฒฝ์ฃผ๊ฒŒ์ž„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“  ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋•Œ @keyframs๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋•Œ์˜ ๊ธฐ์–ต์„ ๋˜์งš์–ด๋ณด๋ฉด keyframs๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ๋™์ž‘์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ 0%์—๋Š” ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด๊ฐ€ ์–ด๋””์— ์žˆ์„์ง€ ์ •ํ–ˆ๊ณ , 50%๋Š” ์–ด๋””์˜ ์œ„์น˜์— ์žˆ์„์ง€๋ฅผ ์ •ํ–ˆ๋‹ค. ์ด ์ฝ”๋“œ์—์„œ๋Š” ๊ทธ๋ƒฅ ๋น™๊ธ€๋น™๊ธ€ ๋Œ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— 0%์ธ from์€ 0๋„์ด๊ณ , ๋งˆ์ง€๋ง‰ 100%์ธ to๋Š” 360๋„๋กœ ์„ค์ •ํ–ˆ๋‹ค.

์›๋ž˜๋Š” to๊ฐ€ ๋˜๋ฉด ๋ฉˆ์ถฐ์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋กœ๊ณ ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์† ๋น™๊ธ€๋น™๊ธ€ ๋Œ๊ณ  ์žˆ๋‹ค. ๊ทธ๊ฑธ @media์—์„œ ์„ค์ •ํ•œ๋‹ค. animation์—์„œ logo-spin์ธ ์ฆ‰, 0๋„์—์„œ 360๋„๋กœ ์›€์ง์ž„์„ ๋ณ€๊ฒฝํ–ˆ๋˜ ๊ฒƒ์„ infinite๋กœ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ํ•œ๋ฐ”ํ€ด๋ฅผ ๋Œ ๋•Œ 20์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉฐ, linear๋กœ ์†๋„๊ฐ€ ์ผ์ •ํ•˜๋„๋ก ํ–ˆ๋‹ค. 

๋กœ๊ณ ๋Š” ์ด ๋‘ ๊ฐœ์˜€๋‹ค. Vite ๋กœ๊ณ ์™€ React ๋กœ๊ณ ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋กœ๊ณ ๋Š” ๋ถ„๋ช… ๋‘ ๊ฐœ์ธ๋ฐ, ์–ด๋–ป๊ฒŒ React ๋กœ๊ณ ๋งŒ ๋Œ๊ณ  ์žˆ์„๊นŒ? animation ์œ„์˜ ์ฝ”๋“œ์ธ. a:nth-of-type(2) .logo๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. App.jsx ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด <a>๋Š” ๋กœ๊ณ ๋ฅผ ์„ค์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ a ์š”์†Œ ์ค‘์— ๋‘๋ฒˆ์งธ a, ๊ทธ ์ค‘ ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ƒ ๋‘ ๋ฒˆ์งธ ๋งํฌ ๋‚ด๋ถ€์˜ ๋กœ๊ณ ๋งŒ ๋Œ๋ฆฌ๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค. 

@media๋Š” ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์กฐ๊ฑด์— ๋”ฐ๋ผ CSS๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ์ด ์ฝ”๋“œ์—์„  prefers-reduced-motion: no-preference๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์›€์ง์ž„ ์ค„์ด๊ธฐ๋ฅผ ์ผœ๋ฉด ์›€์ง์ด์ง€ ์•Š๋„๋ก ํ•˜๋ฉด์„œ ์ด ์กฐ๊ฑด์ด a ์š”์†Œ์˜ ๋‘๋ฒˆ์งธ์— ์‚ฌ์šฉ๋˜๋„๋ก ์กฐ๊ฑด์„ ์„ธ์› ๋‹ค. ์ด๋Ÿฐ ์กฐ๊ฑด ๋ง๊ณ ๋„ ์ฐพ์•„๋ณด๋‹ˆ, ์‚ฌ์šฉ์ž ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ๊ฐ™์€ ๊ฒƒ๋„ ์žˆ์—ˆ๋‹ค.

 

 

- @media

 

@media - CSS: Cascading Style Sheets | MDN

@media @๊ทœ์น™์€ ์ตœ์ƒ์œ„ ์ฝ”๋“œ๋‚˜, ์•„๋ฌด ์กฐ๊ฑด๋ถ€ ๊ทธ๋ฃน @๊ทœ์น™ ์•ˆ์— ์ค‘์ฒฉํ•ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /* ์ตœ์ƒ์œ„ ์ฝ”๋“œ ๋ ˆ๋ฒจ */ @media screen and (min-width: 900px) { article { padding: 1rem 3rem; } } /* ๋‹ค๋ฅธ ์กฐ๊ฑด๋ถ€ @๊ทœ์น™ ๋‚ด์—

developer.mozilla.org

 

 

- media queries

 

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ - CSS: Cascading Style Sheets | MDN

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ธ ๋ฏธ๋””์–ด ์œ ํ˜•๊ณผ, ์ž์œ ๋กœ์šด ์ˆ˜์˜ ๋ฏธ๋””์–ด ํŠน์„ฑ ํ‘œํ˜„์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์ˆ˜์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š”

developer.mozilla.org

 

 

 

  • index.css
@media (prefers-color-scheme: light) {
  :root {
    color: #213547;
    background-color: #ffffff;
  }
  a:hover {
    color: #747bff;
  }
  button {
    background-color: #f9f9f9;
  }
index.css์—๋Š” ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ์ ์šฉ๋˜๋Š” ๊ณตํ†ต ์Šคํƒ€์ผ์„ ์ง€์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ผ์ดํŠธ ๋ชจ๋“œ์ผ ๋•Œ, ๊ฐ ์ปฌ๋Ÿฌ๋“ค์„ ๋ฐ”๊พธ๋„๋ก ์กฐ๊ฑด์„ ์„ธ์› ๋‹ค.

 

 

 

  • main.jsx
// StricMode๋Š” ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์ง„๋‹จ ๋„๊ตฌ์ด๋‹ค.
import { StrictMode } from 'react'

// creatRoot๊ฐ€ Root ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// React 18์˜ ์ƒˆ ๋ฃจํŠธ API
import { createRoot } from 'react-dom/client'

// ์ „์—ญ ์Šคํƒ€์ผ์„ ์ „์šฉ์‹œํ‚จ๋‹ค.
import './index.css'

// App.jsx์˜ default export๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
import App from './App.jsx'

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <App />
  </StrictMode>,
)
main.jsx๋Š” ๋ฆฌ์•กํŠธ ์•ฑ์„ ํŽ˜์ด์ง€์— ๋ถ™์ด๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค. ์ž‘์„ฑํ•œ App๊ณผ index๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‹ค์ œ ํ™”๋ฉด์— ๋ณด์ด๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

document.getElementById('root')๋Š” index.html์— ์žˆ๋Š” <div id="root"></div>๋ฅผ ์ฐพ์•„์˜ค๋ผ๊ณ  ์‹œํ‚จ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด createRoot๋กœ ์ด์ œ ์ฐพ์•„์˜จ ๋ถ€๋ถ„์„ ๋ฆฌ์•กํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค. <StricMode>๋Š” ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ, ์ด ๋ชจ๋“œ ์•ˆ์—์„œ <App />์„ ๊ทธ๋ฆฌ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์ข€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค. ๋Œ€์ถฉ ๋น„์œ ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๋ฉด <div id="root"></div>๋Š” ์•ก์ž, main.jsx๋Š” ์•ก์ž๋ฅผ ์ฐพ๋Š” ์—ญํ• , ์•ก์ž ์•ˆ์—์„œ๋งŒ App์„ ๊ทธ๋ฆฌ๋„๋ก Rect๊ฐ€ ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.