Skip to content

๐Ÿ‘ฉโ€๐Ÿ’ป Study | Learn the Basics of React by Cloning a Movie Site โš›

Notifications You must be signed in to change notification settings

CoodingPenguin/movie-rating-site-clone

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

38 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation


Logo

React Basic

Do it! ํด๋ก  ์ฝ”๋”ฉ ์˜ํ™” ํ‰์  ์›น์„œ๋น„์Šค๋กœ ๋ฐฐ์šฐ๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ

๐Ÿ‘ฉโ€๐Ÿ’ป ๊ฒฐ๊ณผ

react-basic-result

โœ… ๊ณต๋ถ€์ผ์ง€



3์žฅ. ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ๊ฐœ๋… ์•Œ์•„๋ณด๊ธฐ

  • ๋ฆฌ์•กํŠธ๋Š” src ํด๋” ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ index.html์— ๋ Œ๋”๋งํ•œ๋‹ค.
  • ReactDOM.Render()์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ปดํฌ๋„ŒํŠธ(Component), ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ Œ๋”๋งํ•  ์œ„์น˜์ด๋‹ค.
  • ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๊ณ  ๋ฆฌ์•กํŠธ ์•ฑ์€ ๋ชจ๋‘ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • JSX๋Š” HTML๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์กฐํ•ฉํ•œ ๋ฌธ๋ฒ•์ด๋‹ค. ์ด ๋ฌธ๋ฒ•์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ๋•Œ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž์—ฌ์•ผ ํ•œ๋‹ค.
  • ๋ฆฌ์•กํŠธ๋Š” ์ตœ์ข…์œผ๋กœ ๋‹จ ํ•œ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ Œ๋”๋งํ•œ๋‹ค. (์ปดํฌ๋„ŒํŠธ๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ–์„ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.)
  • props๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค. ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ {}๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

4์žฅ. ์Šˆํผ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

  • arr.map(func)๋Š” arr์˜ ์›์†Œ๋ฅผ func์— ๋„ฃ์–ด ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ชจ์•„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์œ ์ผํ•œ key prop๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. (๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ) ์™œ๋ƒํ•˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ด ๋•Œ, key props๋Š” ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ํ•œ props๋กœ ์ปดํฌ๋„ŒํŠธ๋กœ ์ง์ ‘ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • prop-types๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ „๋‹ฌ๋ฐ›์€ props๊ฐ€ ์ •๋ง ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์ธ์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

5์žฅ. state์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ

  • state๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋˜๋ ค๋ฉด React.Component๋ฅผ ์ƒ์†๋ฐ›์•„์•ผ ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” return์œผ๋กœ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” render() ํ•จ์ˆ˜๊ฐ€ JSX๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋•Œ ๋ฆฌ์•กํŠธ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ render() ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.
  • state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” setState()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • constructor() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ์ฒด(์ปดํฌ๋„ŒํŠธ)๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    • render() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด JSX๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•œ๋‹ค.
    • ๋ Œ๋”๋ง์ด ๋๋‚˜๊ณ  componentDidMount()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • ๋งŒ์•ฝ state์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์ฆ‰, setState() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋ฉด componentDidUpdate()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ๋– ๋‚˜๋ฉด componentWillUnmount() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

6์žฅ. ์˜ํ™” ์•ฑ ๋งŒ๋“ค๊ธฐ

  • fetch ๋Œ€์‹  axios๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • fetch๋Š” ์„œ๋ฒ„์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ผ์„ ํ•œ๋‹ค. ์ž์„ธํ•œ ๊ฑด ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ fetch ๋ฌธ์„œ ์ฐธ์กฐ
    • axios๋Š” Node.js๋ฅผ ์œ„ํ•œ HTTP ๋น„๋™๊ธฐ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • axios.get() ํ•จ์ˆ˜์— URL์„ ์ „๋‹ฌํ•˜์—ฌ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • axios๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ์ด์šฉํ•˜๊ธฐ์— ์ •๋ณด๋ฅผ ๋‹ค ๋ฐ›๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด async์™€ await๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • async๋Š” ํ•จ์ˆ˜ ์•ž์— ๋ถ™์—ฌ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์ด ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž„์„ ์•Œ๋ ค์ค€๋‹ค.
    • await๋Š” ํ•จ์ˆ˜ ๋‚ด์— ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์— ๋ถ™์—ฌ์„œ ํ•ด๋‹น ์ค„์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • state๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ, state๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • API์— ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์„ ์ž˜ ํ™œ์šฉํ•˜์ž. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์–ด๋–ค ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ.
  • ๋ฆฌ์•กํŠธ์—์„œ class ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” className์„ ์จ์•ผํ•œ๋‹ค. ๋‚˜์ค‘์— ๋ฆฌ์•กํŠธ๊ฐ€ JSX๋ฅผ HTML๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์ด className์„ class๋กœ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ.

7์žฅ. ์˜ํ™” ์•ฑ ๋‹ค๋“ฌ๊ธฐ

  • map()ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ํ•จ์ˆ˜์˜ 2๋ฒˆ์งธ ์ธ์ž์—๋Š” map() ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๋ฉฐ ๋ฐ˜ํ™˜ํ•  ๋ฐฐ์—ด ์›์†Œ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  • slice(start, end)๋กœ start๋ถ€ํ„ฐ end-1๊นŒ์ง€ ๋ฌธ์ž์—ด์„ ์ž๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

8์žฅ. ์˜ํ™” ์•ฑ์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ๋ผ์šฐํ„ฐ๋Š” URL์— ๋งž๊ฒŒ ํ™”๋ฉด ์ด๋™์„ ์‹œ์ผœ์ฃผ๋Š” ์žฅ์น˜์ด๋‹ค. ์ด๋ฅผ react-router-dom ํŒจํ‚ค์ง€๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Route์— URL์„ ์œ„ํ•œ path props์™€ URL์— ๋งž๋Š” component props๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, URL์„ ๋ณด๊ณ  ๊ทธ์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฐ๋‹ค.
  • ๋ผ์šฐํ„ฐ๋Š” ๊ฐ€์žฅ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ path props๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด /about/cs์— ์ ‘์†ํ•˜๋ฉด, ๊ฐ€์žฅ ์ƒ์œ„ path์ธ /๋ถ€ํ„ฐ /about, /about/cs ์ˆœ์œผ๋กœ path props๋ฅผ ์ฐพ๋Š”๋‹ค.
    • ์ด ๋•Œ์˜ component props๋ฅผ ํ•ด๋‹น ์ˆœ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์œ„์˜ ๋ฌธ์ œ๋ฅผ ๊ณ ์น˜๊ณ  ์‹ถ๋‹ค๋ฉด exact props๋ฅผ true๋กœ ํ•˜์—ฌ path props์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” URL์—๋งŒ ๋ฐ˜์‘ํ•˜๋„๋ก ํ•œ๋‹ค.
  • <a>์˜ href ์†์„ฑ์€ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— <Link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ์ƒˆ๋กœ ๊ณ ์นจ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • <Link>์™€ <Route> ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฌด์กฐ๊ฑด <HashRouter> ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์žˆ์–ด์•ผ ์ž‘๋™ํ•œ๋‹ค.
    • <Link>์˜ to ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค URL๋กœ ๊ฐˆ์ง€, ๊ทธ ๋•Œ ๊ทธ๋ ค์ง€๋Š” ์ปดํฌ๋„ŒํŠธ์— ์–ด๋–ค props๋ฅผ ๋„˜๊ฒจ์ค„์ง€๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • route props๋Š” ๋ผ์šฐํŒ… ๋Œ€์ƒ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ์ฃผ๋Š” ๊ธฐ๋ณธ props๋ฅผ ๋งํ•œ๋‹ค.
    • route props์˜ history ์•ˆ์—๋Š” push, go, goBack, goForward์™€ ๊ฐ™์ด URL์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋“ค์ด ๋“ค์–ด์žˆ๋‹ค.
    • push๋Š” ์ง€์ •๋œ URL๋กœ ์ด๋™์„ ์‹œ์ผœ์ค€๋‹ค.

Appendix. GitHub์— ๋ฐฐํฌํ•˜๊ธฐ

  • package.json์— hompage ํ‚ค์™€ ํ‚ค๊ฐ’์„ browerlist ์•„๋ž˜์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • package.json์˜ scripts ํ‚ค๊ฐ’์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
{
    scripts: {
        ...
        "predeploy": "npm run build",
        "deploy": "gh-pages -d build",
    }
}
  • GitHub์— ์ฝ”๋“œ๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  gh-pages ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
  • npm run deploy๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•œ๋‹ค.

About

๐Ÿ‘ฉโ€๐Ÿ’ป Study | Learn the Basics of React by Cloning a Movie Site โš›

Topics

Resources

Stars

Watchers

Forks