[React] 2. React Router, Sass]

์ •๊ฒฝํ›ˆยท2021๋…„ 9์›” 17์ผ
1
post-thumbnail

๐Ÿ” React Router

  • path์†์„ฑ์œผ๋กœ ์ž์‹ ์ด ์›ํ•˜๋Š” URL ์ฃผ์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ํ•ด๋‹น URL์— ๋“ค์–ด๊ฐˆ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ง€์ •ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์ด๋™ ์—†์ด ๋น ๋ฅด๊ฒŒ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ๋„์›€์„ ์ค€๋‹ค.
  • CRA(Create React App)์—๋Š” routing์„ ์œ„ํ•œ ๋กœ์ง์ด ๋“ค์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” routing soulution์ธ react-router๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ routing์„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

๐Ÿ” Before Routing...

Routing์„ ์‹ค์Šต์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

1. SPA(Single Page Applicatoin) : ํŽ˜์ด์ง€๊ฐ€ ํ•˜๋‚˜๊ฐ€ ํ•œ ๊ฐœ์ธ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

โ“ Questionโ“
Q1. ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์˜ .html ํŒŒ์ผ์˜ ๊ฐœ์ˆ˜๋Š” ?
A . 1๊ฐœ(SPA์ด๊ธฐ ๋•Œ๋ฌธ์—)
Q2. ํ•œ ๊ฐœ์˜ ์›นํŽ˜์ด์ง€(html)์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์€?
A. Routing

2. Routing : ๋‹ค๋ฅธ ๊ฒฝ๋กœ(url์ฃผ์†Œ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ View(ํ™”๋ฉด)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ.(๋ฆฌ์•กํŠธ ์ž์ฒด์—๋Š” ๊ธฐ๋Šฅ์ด ์—†์Œ - ๋ฆฌ์•กํŠธ๊ฐ€ Library๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ์ด์œ )

๐Ÿ” Routes ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ(Routes.jsํŽธ)

์œ„ ์‚ฌ์ง„์€ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ–ˆ๋˜ ์ธ์Šคํƒ€๊ทธ๋žจ ํด๋ก ์ฝ”๋”ฉ์˜ ๊ฒฐ๊ณผ๋ฌผ์„ Routes Component๋กœ ๊ตฌ์„ฑํ•ด๋‘” ๋‚ด์šฉ์ด๋‹ค. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ณต๊ธฐํ•ด๋ด์•ผ๊ฒ ๋‹ค.

(1) ๋จผ์ €, ๋ผ์šฐํŒ…์„ ์œ„ํ•ด ๋ช…๋ น์–ด๋“ค(1,2๋ฒˆ)์„ ์ž…๋ ฅํ•˜๊ณ , ๋‚ด๊ฐ€ ๋งŒ๋“  ๋กœ๊ทธ์ธ, ๋ฉ”์ธ ํŽ˜์ด์ง€(4,5๋ฒˆ)๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผฐ๋‹ค.
(2) ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•จ์ˆ˜ํ˜•๊ณผ classํ˜• 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ classํ˜•์„ ์ด์šฉํ•˜์˜€๋‹ค.(8๋ฒˆ ์ค„)
(3) Route๋กœ ์ƒ์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ ์ค‘ ๋งค์นญ๋˜๋Š” ์ฒซ Route๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๊ณ , ๋กœ๊ทธ์ธ์„ ์ฒซํŽ˜์ด์ง€, ๋ฉ”์ธ์„ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐํ•˜์˜€๋‹ค.(13,14๋ฒˆ์งธ ์ค„)
(4) ๋งˆ๋ฌด๋ฆฌ๋กœ Routes ์ปดํฌ๋„ŒํŠธ๋ฅผ export ํ•˜์˜€๋‹ค.
โญ๏ธ ์—ฌ๊ธฐ์„œ๋Š” ๋ฃจํŠธ์˜ path์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค.
exact path = "/"์ด๊ฒƒ์€ ์ดˆ๊ธฐํ™”๋ฉด์œผ๋กœ ๋ณดํ†ต ํŽ˜์ด์ง€์˜ ์ฒซ ํ™”๋ฉด์„ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.(๋‚˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ง€์ •ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. โญ๏ธ

๐Ÿ” Routes ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ(index.jsํŽธ)

๋ผ์šฐํŒ…์„ ํ•˜๊ธฐ ์œ„ํ•ด index.js๋„ ์ˆ˜์ •์„ ํ–ˆ๋‹ค.
(1) import Routes from "./Routes"; ๋กœ Routes.js์—์„œ ์ง€์ •ํ•œ Routes ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค.
(2) reset.scss ์™€ common.scss ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์™€ ๋ฉ”์ธ ํŽ˜์ด์ง€๊ฐ€ ๋ชจ๋‘ ์ง€์ •๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ ธ์™”๋‹ค.
(3) ReactDOM.render(<Routes(์ปดํฌ๋„ŒํŠธ๋ช…) />(์ธ์ž1) , document.getElementById("root"))(์ธ์ž2)๋กœ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ํ–ˆ๋‹ค.

โญ๏ธ 3๋ฒˆ์งธ ์ค„๊ณผ 4๋ฒˆ์งธ ์ค„์€ ๋ผ์šฐํŒ…์„ ํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ๋‚ด์šฉ๋“ค์„ ์‹ค์Šตํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. โญ๏ธ

๐Ÿ” Routes ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ(Routes.js pathํŽธ)

Routes.js์—์„œ ์„ค์ •ํ•œ path๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•

(1) Link ์ปดํฌ๋„ŒํŠธ

- html์˜ <a> ํƒœ๊ทธ์™€ ๊ฐ™์ด <Link>ํƒœ๊ทธ๋„ ์ง€์ •ํ•œ ๊ฒฝ๋กœ๋กœ ๋ฐ”๋กœ ์ด๋™์‹œ์ผœ์ค€๋‹ค.

- import {Link} from "react-router-dom"; โžก๏ธ react-router-dom์—์„œ ์ œ๊ณตํ•˜๋Š” <Link>์ปดํฌ๋„ŒํŠธ๋Š” DOM์—์„œ <a>๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

- ๋‚˜๋Š” ๋ฒ„ํŠผ์—๊ฒŒ ๋ฉ”์ธ์œผ๋กœ ๊ฐ€๋Š” ๋งํฌ๋ฅผ ์ฃผ๊ณ  ์‹ถ์–ด <Link to ="main">์„ ๋ฒ„ํŠผํƒœ๊ทธ์— ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค. ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ๊ธฐ์–ตํ•˜์ž <Link to = "๋ณด๋‚ด๊ณ ์‹ถ์€๊ณณ">

  • ํ™œ์šฉ๋ฒ• : ํด๋ฆญ์‹œ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„์‹œ (Nav Bar, Aside Menu, ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ)

(2) this.props.history.push()๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

  • ์•„์ง์€ ์ž์„ธํžˆ ๋ชจ๋ฅด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์šด๋งŒํผ๋งŒ ์ ์–ด๋ณด๊ฒ ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๋‹ค.

    - goToMain์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ์ด๋™์‹œ์ผฐ๋‹ค. โžก๏ธ goToMain = () => {this.props.history.push("/main")}

    - ์ดํ›„์— ๋ฒ„ํŠผ์— ์˜จํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ง€์ •ํ–ˆ๋‹ค.(<button onClick={this.goToMain}>๋กœ๊ทธ์ธ</button>)

  • ํ™œ์šฉ๋ฒ• : ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋Š”๊ฒฝ์šฐ์— ๊ตฌํ˜„ํ•œ๋‹ค.

    (์˜ˆ) ํšŒ์›๊ฐ€์ž…์ด ๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž โžก๏ธ ๋ฉ”์ธํŽ˜์ด์ง€ ์ด๋™

    ย ย ย ย ย ย ย ํšŒ์›๊ฐ€์ž…์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์‚ฌ์šฉ์ž โžก๏ธ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™

๐Ÿ” React | Sass

์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ผ

(1) ssas ์„ค์น˜ : npm install node-sass@4.14.1 --save(๋ช…๋ น์–ด)
๋ฒ„์ „์— ๋”ฐ๋ผ ํ˜ธํ™˜ ์ด์Šˆ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด ๋‚˜๋Š” 4.14.1๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•˜๋‹ค.
์„ค์น˜ ํ›„ node-modulesํด๋”์— node-sass๊ฐ€ ์ƒ๊ฒผ๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ.

(2) .css ํŒŒ์ผ .scss๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ
Sass์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋Š” .scss์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค.

Sass ๊ธฐ๋Šฅ
(1) Nesting ๊ธฐ๋Šฅ : nav์˜ ์ž์‹์š”์†Œ๋ฅผ ๋ชจ๋‘ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด๋‘” ๊ฒƒ(์™ผ์ชฝ)๊ณผ ๋‹ฌ๋ฆฌ Nesting๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ nav์˜ ์ž์‹์š”์†Œ๋“ค์„ ๋ชจ๋‘ ํ•œ๊ณณ์— ๋ชจ์•„์ฃผ์—ˆ๋‹ค.

(2) ๋ณ€์ˆ˜ํ™œ์šฉ, &์—ฐ์‚ฐ์ž, mixin ๋“ฑ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ ์šฉํ•˜๊ธฐ : ์ด ๋ถ€๋ถ„์€ ์•„์ง ํ™œ์šฉํ•˜์ง€ ๋ชปํ•ด๋ดค๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ์ •๋„๋ฅผ ์ผ๋‹จ ์•Œ์•„๋‘์ž.

๊ฐ„๋‹จํšŒ๊ณ 

๋ผ์šฐํŒ…์€ ๋ญ”๊ฐ€ ์–ด๋ ค์šด๋“ฏ ํฅ๋ฏธ๋กœ์šด ์„ธ์…˜์ด์—ˆ๋‹ค. ์ง์ ‘ ์ ์šฉํ•ด๋ณด๋ฉด์„œ ์„ธ์…˜์„ ๋“ค์œผ๋ฉด์„œ ์•Œ์•„๋“ฃ์ง€ ๋ชปํ–ˆ๋˜ ๋‚ด ๋จธ๋ฆฌ์†์ด ์กฐ๊ธˆ์”ฉ ์ •๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค. ์ผ๋‹จ์€ ๋‚ฏ์„  ๋ฆฌ์•กํŠธ๋ผ๋Š” ํ™˜๊ฒฝ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด์„œ ๋งŽ์ด ๋ณด๊ณ  ๋งŽ์ด ์จ๋ณด๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.
์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€!
profile
๋ฐœ์ „ํ•˜๊ณ  ์‹ถ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ž…๋‹ˆ๋‹ค :)

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