React : Create React App

<angeLog/>ยท2024๋…„ 2์›” 20์ผ

REACT

๋ชฉ๋ก ๋ณด๊ธฐ
7/25
post-thumbnail

๐Ÿ’ก๋…ธ๋งˆ๋“œ์ฝ”๋” ๋‹ˆ๊ผฌ์Œค์˜ ๊ฐ•์˜๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถ€ํ•˜๋Š” ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค.

Before Create React App

React๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Node๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
Node๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด node.js์—์„œ ์„ค์น˜ํ•˜์ž.
Node์˜ ์„ค์น˜์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„์ด๋‚˜ CMD์—์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

//๋…ธ๋“œ ๋ฒ„์ „ ํ™•์ธ, ๋…ธ๋“œ๊ฐ€ ์ž˜์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
node -v

//์ •์ƒ์„ค์น˜ ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋ฒ„์ „๋ช…์ด ์ถœ๋ ฅ๋œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด ์žฌ์„ค์น˜ ํ•„์š”.
npm -v

์ •์ƒ์„ค์น˜๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

//์ถ”๊ฐ€ ํ™•์ธ ํ•ญ๋ชฉ
npx

npx๊นŒ์ง€ ์ž‘๋™์ด ๋˜์–ด์•ผ react๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ ๋œ ๊ฒƒ์ด๋‹ค.
๋งŒ์•ฝ npx๊ฐ€ ์ž‘๋™๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋กœ ์„ค์น˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

npm install -g npx

NPM๊ณผ NPX
npm(Node Package Manager)์€ node.js์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€์™€ ๋ชจ๋“ˆ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋…ธ๋“œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ๋œป ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Dependency) ๋“ค์ด ์ „์—ญ์ด๋‚˜ ๋กœ์ปฌ์— ์„ค์น˜๋œ ์ฑ„ ๊ด€๋ฆฌ๊ฐ€ ๋˜๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์„ ๋•Œ, ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€์™€ ๋กœ์ปฌ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๊ฐ๊ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•ด์„œ ๋‚˜์˜จ ๊ฒƒ์ด npx(Node Package eXecut)์ด๋‹ค.

Create React App

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์„ฑ.
my-app์€ ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
์ฐธ๊ณ ๋กœ react, react-dom, react-scripts๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ๋Š” ํ”„๋กœ์ ํŠธ๋ช…์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค.

npx create-react-app my-app
cd my-app
npm start

ํ•˜์ง€๋งŒ ์Šฌํ”„๊ฒŒ๋„ ์ตœ์‹ ๋ฆด๋ฆฌ์ฆˆ์—์„œ ๋”์ด์ƒ Create React App์˜ ์ „์—ญ ์„ค์น˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋‹ˆ ํ„ฐ๋ฏธ๋„์—์„œ ์ œ๊ณตํ•œ ํžŒํŠธ๋Œ€๋กœ npm์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜๋ฅผ ํ•˜๋„๋ก ํ•œ๋‹ค.

npm init react-app my-app

๋ณธ์ธ์ด ์ƒ์„ฑํ•œ ํ”„๋กœ์ ํŠธ ํด๋”์—์„œ package.jsonํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ํŒŒ๋ž€ ๊ธ€์”จ๋กœ ์•ˆ๋‚ดํ•ด์ค€ script๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ผ๋‹จ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰.

npm run start

๐Ÿ‘‰๐Ÿปcreate-react-app github

ํ”„๋กœ์ ํŠธ ์‚ดํŽด๋ณด๊ธฐ


๐Ÿ“src
์•ž์œผ๋กœ ์ƒ์„ฑํ•  ๋ชจ๋“  ํŒŒ์ผ์„ ๋„ฃ์„ ํด๋”.

src > index.js
์ต์ˆ™ํ•œ ๋ชจ์Šต์ด ๋ณด์ธ๋‹ค.
root๊ฐ€ ์žˆ๊ณ , root์—์„œ App์„ renderํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.
์ € root๋Š” public์˜ index.html์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์‹œ index.js ์‚ดํŽด๋ณด๊ธฐ
ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์ธ App์ด index.js์—์„œ ๋ถˆ๋ ค์ง€๋Š” ๊ฒƒ๊นŒ์ง€ ์ต์ˆ™ํ•œ ๊ตฌ์กฐ์ด๋‹ค.

ํ•ด๋ณด์ž๊ณ ~!

์ฝ˜ํ…์ธ ๋ถ€ํ„ฐ css๊นŒ์ง€ ๋ชจ๋‘ ์ƒˆ๋กœ ์‹œ์ž‘ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹น๋‹ค ์ง€์› ๋‹ค.
์ด์ œ ์‹œ์ž‘์ด๋‹ค!

Button component

srcํด๋” ์•ˆ์— Button.js๋ผ๋Š” ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

function Button({ text }) {
  return <button>{text}</button>;
}
export default Button;

Button์„ ๋ณด์—ฌ์ค˜์•ผํ•˜๋Š” ํŒŒ์ผ์— Button์„ importํ•ด๋ณด์ž.

import Button from './Button';
function App() {
  return (
    <div>
      <h1>welcome back, React!</h1>
      <Button text={'Continue'} />
    </div>
  );
}
export default App;

์šฐ๋ฆฌ๋Š” import๋œ component Button์˜ text๊ฐ€ props๋ณด ์ „๋‹ฌ๋˜๋Š” state๋ผ๋Š” ๊ฒƒ์„ ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค.
props์˜ type์„ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด propTypes ์„ค์น˜.

npm i prop-types
import PropTypes from 'prop-types';
import Button from './Button';
function App() {
  return (
    <div>
      <h1>welcome back, React!</h1>
      <Button text={'Continue'} />
    </div>
  );
}
Button.prototype = {
  text: PropTypes.string.isRequired,
};
export default App;

text์˜ ํƒ€์ž…์€ string์ด๊ณ  ํ•„์ˆ˜๊ฐ’์ด๋ผ๋Š” ๊ฒƒ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šˆํผ์Šค์œ—~!

CSS๋„ Import ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” javaScript๋ฅผ ์ด์šฉํ•ด์„œ ์š”์†Œ์— ์ง์ ‘ ์Šคํƒ€์ผ์„ ํ•ด์คฌ๋‹ค๋ฉด ์ด๋ฒˆ์—” CSSํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ importํ•ด๋ณธ๋‹ค.
react์—์„œ์˜ css๋Š” ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ํŒŒ์ผ๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

//Button์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” cssํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•  ๋•Œ
Button.moducle.css
.btn {
  background-color: tomato;
  color: white;
}

component์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ importํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

import styles from './Button.module.css';
function Button({ text }) {
  return <button className={styles.btn}>{text}</button>;
}

export default Button;


ํ† ๋งˆํ†  ์ƒ‰์˜ ๋ฒ„ํŠผ์ด ๋ณด์—ฌ์ง„๋‹ค.
๋‚ด ๊ฒฝ์šฐ๋Š” App.module.css๋„ ๋งŒ๋“ค์–ด์„œ App.js์— ์ ์šฉ์‹œ์ผœ๋†“์€ ์ƒํƒœ์ด๋‹ค.
์—ฌ๊ธฐ์„œ ๊ฐœ๋ฐœ์ž๋ชจ๋“œ์˜ ์š”์†Œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด

ํด๋ž˜์Šค๋ช…์ด ์ปดํฌ๋„ŒํŠธ๋ช…-ํด๋ž˜์Šค๋ช…-๋žœ๋ค๋ฌธ์žํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ € ๋žœ๋ค๋ฌธ์ž ๋•๋ถ„์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ํด๋ž˜์Šค๋ช…์ด ์‚ฌ์šฉ๋˜์–ด๋„ ์Šคํƒ€์ผ์ด ๊นจ์ง€๋Š” ์ผ ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
์ผ๋‹จ ํ•ด๋ณผ๊ฒŒ์š”!โœ๐Ÿป

0๊ฐœ์˜ ๋Œ“๊ธ€