์น์ ๋ฐ์ ์ผ๋ก ์น์ ๋ค์ํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๊ณ ํ๋ คํ UI๋ฅผ ์์ฐ์ฑ์๊ฒ ๊ตฌํํ๊ธฐ ์ํด์
Angular/Vue/React
์ฌ์ฉ์๊ฐ ๋ง์์ ์ํ๊ณ๊ฐ ํ์ฑํ ๋์ด์๊ณ ํ์ด์ค๋ถ์ ๊พธ์คํ ๊ด๋ฆฌ๋ก ์ฌ๋ฌ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ ๋ฌธ์ํ๊ฐ ์๋์ด์์ด์ ๋ฐฐ์ฐ๋ ์ ์ฅ์์ ์ฝ๊ฒ ์์ํ ์์์
DOM: ์๋ฐ์คํฌ๋ฆฝํธ์์ HTML์ ๊ฐ์ฒดํ ์์ผ์ ์ ๊ทผํ ์์๋ ๋ชจ๋ธ
์ค์ DOM์ ๋๊ฐ์ด ๋ณต์ฌ๋ฅผ ํด์ UI๊ฐ ๋ฐ๋๋ ๋ถ๋ถ๋ง ๊ต์ฒดํด์ค๋ค.
Node.js๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ฐ์์๋ ๋์ํ๊ฒ ํ๋ ํ๊ฒฝ์ ๋งํ๋ค. ๋ฆฌ์กํธ๋ ์น์์ ์คํ๋์ง๋ง ๋ฐ๋ฒจ, ์นํฉ๊ณผ ๊ฐ์ ํ๋ก์ ํธ์ ํ์ํ ์ฃผ์ ๋๊ตฌ๋ค์ด Node.js๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ค์นํด์ผํ๋ค.
npm์ Node.js๋ฅผ ์ค์นํ๋ฉด ์๋ ์ค์น๊ฐ ๋๋๋ฐ npm์ ํตํด์ ๋ค์ํ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๋ฒ์ ์ ๊ด๋ฆฌํ ์ ์๋ค.
๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์์ํ๋๋ฐ ํ์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ธํ
ํด์ฃผ๋ ๋๊ตฌ
CRA๋ ๋ฆฌ์กํธ๋ก ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ธฐ ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๋ค
CRA๋ฅผ ์ด์ฉํ๋ฉด ํ๋์ ๋ช
๋ น์ด๋ก ๋ฆฌ์กํธ ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ค
CRA์ ์ด๊ธฐํด๋๋ ํฌ๊ฒ [node.modules - package.json - .gitignore]์ [index.html - index.js - App.js]๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
CRA๋ฅผ ๊ตฌ์ฑํ๋ ์์ค์ฝ๋๋ค์ด ๋ค์ด์๋ ํจํค์ง ํด๋
CRA๊ธฐ๋ณธ ํจํค์ง ์ธ ์ถ๊ฐ๋ก ์ค์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/ํจํค์ง ์ ๋ณด๊ฐ ๊ธฐ๋ก๋๋ ํ์ผ
dependencies์์๋ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ชจ๋ ํจํค์ง ๋ฆฌ์คํธ, ๋ฒ์ ํ์ธ ๊ฐ๋ฅ
ํ์ ์ ํ ๋, ๋ด๊ฐ ์ค์นํ ํจํค์ง๋ ๋ด ๋ก์ปฌ์๋ง ์ ์ฅ์ด ๋๋๋ฐ github์ ์ฌ๋ฆด๋ ๋ด๊ฐ ์์ฑํ ์ฝ๋์ package.json(+์ถ๊ฐ๋ก ์ค์นํ ์ ๋ณด)์ ์ฌ๋ฆฐ๋ค. ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ๊ฑธ pullํด์ npm install์ ํ๋ฉด package.json์ ๊ธฐ๋ก๋์ด์๋ ๋์ ์ถ๊ฐ ํจํค์ง๊ฐ ์๋์ผ๋ก ์ค์น๋๋ค.
github์ ์ฌ๋ฆฌ๊ณ ์ถ์ง์์ ํด๋์ ํ์ผ์ ์์ฑํ ์์๋ค.
node.modules ๊ฐ์ ๊ฒฝ์ฐ ๋ฌด๊ฒ๊ธฐ๋๋ฌธ์ github์ ์ฌ๋ฆฌ์ง ์๋๋ค.
์ ์: ์ฌํ์ฉ ๊ฐ๋ฅํ UI ๊ตฌ์ฑ ๋จ์
ํน์ง: ์ฌํ์ฉํ์ฌ ์ฌ์ฉํ ์ ์๊ณ ์ฝ๋ ์ ์ง๋ณด์์ ์ข๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ํ์ด์ง๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง ํ๋์ ํ์
ํ ์์๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์๋ render ํจ์๊ฐ ๊ผญ! ์์ด์ผํ๊ณ ๊ทธ์์ ๋ณด์ฌ์ค์ผํ jsx๋ฅผ ๋ฐํํ๋ค
ํจ์ํ ์ปดํฌ๋ํธ๋ ํจ์ฌ ๊ฐ๋จํ๊ณ ์์ฑํ๊ธฐ ํธ๋ฆฌํ๋ค. ์๋๋ state์ lifecycle method๊ฐ ์์์ผ๋ hooks์ ๋์
์ผ๋ก state์ lifecycle method๋ฅผ ์ธ์์๊ฒ ๋์๋ค.
Javascript Syntax Extension ์๋ฐ์คํฌ๋ฆฝํธ ํ์ฅ๋ฌธ๋ฒ
JSX๋ก ์์ฑ๋ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ๋ ๊ณผ์ ์์ ๋ฐ๋ฒจ์ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์ ์ฝ๋๋ก ๋ณํ๋๋ค
์ฅ์ : html ํ๊ทธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฉ ๋ณด๊ธฐ ์ฝ๊ณ ์ต์ํ๋ฉฐ html tag์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋์์ ์ฌ์ฉํ ์์๋ค
์๋ฐ์คํฌ๋ฆฝํธ ํํ๋ฅผ ์ฌ์ฉํ ๋๋ curly bracket์ ์ฌ์ฉํ๋ค { }
class ๋์ className์ ์ฌ์ฉํ๋ค
inline-styling์ ํ ๊ฒฝ์ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ฝ๋ + ์คํ์ผ๋ง์ด๊ธฐ๋๋ฌธ์ curly bracket์ ๋๋ฒ ์ฌ์ฉํ๋ค
<div style={{color : "red"}}>Hello React</div>
๋ชจ๋ ์์๋ ์ต์์ ์์์ ๊ฐ์ธ์ฌ ์๋ค. <> ... </>
SPA (Single Page Application)์ด๋ ํ์ด์ง๊ฐ ํ๊ฐ์ธ ์ดํ๋ฆฌ์ผ์ด์
์ ๋งํ๋ค.
๋ฆฌ์กํธ ํ๋ก์ ํธ์์ .htmlํ์ผ์ ๋จ ํ๊ฐ! ์ฆ, Single Page Application
์ด๋ค.
ํ๊ฐ์ ์นํ์ด์ง์์์ ์ฌ๋ฌ๊ฐ์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก Routing์ด๋ค. ๋ฆฌ์กํธ ์์ฒด์๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์์ง ์๊ธฐ๋๋ฌธ์ React Router ๊ฐ์ third party library๋ฅผ ์ถ๊ฐ ์ค์น ํด์ฃผ์ด์ผํ๋ค. (๋ฆฌ์กํธ๊ฐ framework๊ฐ ์๋ library๋ก ๋ถ๋ฅ๋๋ ์ด์ ๊ฐ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ด ๋ด์ฅ๋์ด์์ง ์๊ธฐ๋๋ฌธ!)
<Link>
vs withRouterHOC<Link>
๋ ํด๋ฆญ์ ๋ฐ๋ก ์ด๋ํ๋ ๋ก์ง ๊ตฌํ์์ ์ฌ์ฉํ๊ณ
withRouterHOC๋ ํ์ด์ง ์ ํ์ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํด์ผํ๋ ๋ก์ง(backend API๋ก ๋ฐ์ดํฐ ์ ์ก, user data ์ธ์ฆ/์ธ๊ฐ ๋ฑ๋ฑ)์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
Syntactically Awesome StyleSheet
CSS Preprocessor, CSS๊ฐ ๋์ํ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ผ๋ก CSS์ ๋ถํธํจ์ ์์์์ผ์ฃผ๋ CSS ํ์ฅ๋ฒ์
์ผ๋จ SASS๋ก ์์ฑํ๊ณ ์น์์ ๋์ ๊ฐ๋ฅํ ํ์ค์ CSS๋ก ์ปดํ์ผํ๋ค.
์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ์ ์ํ๊ฐ
ํ๋ฉด์ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ์ UI์ ๋ณด๋ฅผ ์ง๋๊ณ ์๋ ๊ฐ์ฒด
state๋ ์ปดํฌ๋ํธ ๋ด์์ ์ ์ํ๊ณ ์ฌ์ฉํ๋ฉฐ ์ผ๋ง๋ ์ง ๋ฐ์ดํฐ(๊ฐ์ฒด)๊ฐ ๋ณ๊ฒฝ๋ ์ ์์
์ปดํฌ๋ํธ ์์ ์์์์ ๊ทธ ์ํ๊ฐ์ ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ ๋๋ง๋ค ํจ์จ์ ์ผ๋ก ํ๋ฉด์ ๋ํ๋ด๊ธฐ ์ํด์
setState()๋ฅผ ์ด์ฉํด์ state๋ฅผ ์ ๋ฐ์ดํธ ์์ผ์ค๋ค. ์ ๋ฐ์ดํธ ํ ๋๋ง๋ค renderํจ์๊ฐ ํธ์ถ๋๋ค
์ปดํฌ๋ํธ์ ์์ฑ๊ฐ
๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง๋๊ณ ์๋ ๊ฐ์ฒด
Props๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ์๊ฒ state์ ์ํ๊ฐ๊ณผ event handler๋ฅผ ๋๊ฒจ์ค์์์
this
: ํด๋น ์ปดํฌ๋ํธ
this.props
: ํด๋น ์ปดํฌ๋ํธ์ props ๊ฐ์ฒด
this.props.titleColor
: props ๊ฐ์ฒด์ ํน์ key(titleColor)๊ฐ. ์ฆ "red"
์ํ ๋ฐ์ดํฐ, ์ค์ API์์ ๋ฐ์์จ ๋ฐ์ดํฐ๊ฐ ์๋ ํ๋ก ํธ์ค๋ ๊ฐ๋ฐ์๊ฐ ํ์์ ์ํด ์ํ๋ก ๋ง๋ ๋ฐ์ดํฐ
ํ๋ก์ ํธ ์งํ์ API๊ฐ ๋์ค๊ธฐ์ ์ ํ๋ก ํธ์๋์ ํ์ด์ง ๋ ์ด์์์ด ๋จผ์ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ๋๋ฌธ์ mock data๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์ํฉ์ ๋ฏธ๋ฆฌ ๋๋นํ๊ณ ๊ตฌํํ๋์ง ํ์ธํด์ผํ๋ค
https://ko.reactjs.org/docs/thinking-in-react.html
์๋ฆฌ๋ ๋ธ๋ก๊ทธ ์ฐธ๊ณ : https://yeri-kim.github.io/posts/fetch/
๋ฐฑ์๋๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ค๋ฉด api๋ฅผ ํธ์ถํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์๋ตํ ๋ ์ฐ๋ ํจ์ (axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ ๊ฐ๋ฅ!)
fetch('api ์ฃผ์')
.then(res => res.json())
.then(res => {
// data๋ฅผ ์๋ต ๋ฐ์ ํ์ ๋ก์ง
});
fetch()ํจ์์์ default method๋ get!
Get์ ์กฐํํ ๋ ์ฌ์ฉํ๋ค
fetch('https://api.google.com/user/3')
.then(res => res.json())
.then(res => {
if (res.success) {
console.log(`${res.user.name}` ๋ ํ์ํฉ๋๋ค);
}
});
post์ธ ๊ฒฝ์ฐ fetchํจ์์ method ์ ๋ณด๋ฅผ ๋๊ฒจ์ค์ผํ๋ค.
Post๋ ์์ฑํ ๋ ์ฌ์ฉํ๋ค.
Body๋ ๊ฐ์ฒดํํ์ด๋ฉฐ JSON.stringfy()๋ฅผ ์ด์ฉํด์ JSONํ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
res.json()์ ๋ฐฑ์๋์์ ๋ฐ์์จ json()ํํ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํด์ค๋ค.
fetch('https://api.google.com/user', {
method: 'post',
body: JSON.stringify({ //jsonํํ๋ก ๋ณํ
name: "myname",
batch: 1
})
})
.then(res => res.json())
.then(res => {
if (res.success) {
alert("์ ์ฅ ์๋ฃ");
}
})