๐ก React๋?ํ์ด์ค๋ถ์์ ๊ฐ๋ฐํ๊ณ ๊ด๋ฆฌํ๋ย ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๋ง๋ค๊ธฐ ์ํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์น์ดํ๋ฆฌ์ผ์ด์
์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ฉฐย ์์ฐ์ฑ์ ํฅ์
์ํค๊ณ ย ๋ง์ ์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ
์ ์ฝ๋ ์ ์ง ๋ณด์๋ฅผ ๋์ฑ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํด ๋ค์ํย Frontend Framework(Library)
๊ฐ ๋ฑ์ฅํ๊ฒ ๋์๋ค.๊ทธ ์ค ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ์ธ ๊ฐ์ง๊ฐย Angular
,ย Vue
,ย React
ย ์ด๋ค.
๐ ์ ๊น)ย Frontend Framework(Library)์ ๋ํด ์๊ณ ๋์ด๊ฐ์.
:: Angular2010๋ Google์์ ๊ฐ๋ฐํ Framework.-์ฅ์ : TypeScript ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ์ธ Frontend App ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์๋ค.-๋จ์ : ๋ฌด๊ฒ๊ณ ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๋ค.
:: Vue2014๋ Evan You๋ผ๋ ๊ฐ์ธ์ด ๊ฐ๋ฐํ Framework.-์ฅ์ : ์ฝ๋๊ฐ ๊น๋ํ๊ณ ๋ฐฐ์ฐ๊ธฐ ์ฝ๋ค. ๊ฐ์ฅ ๋์ค์ ์๊ฒผ์ง๋ง ์ฑ์ฅ ์๋๊ฐ ์ ๋ง ๋น ๋ฅด๋ค.-๋จ์ : ์ธ์ง๋๊ฐ ๋ฎ์ผ๋ฉฐ, ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๊ฐ ์ผ์ ํ์ง ์๋ค.
:: React*โ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ณํํ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถํ๋ ๊ฒโ*ย ์ ๋ชฉํ๋ก 2013๋ Facebook์์ ๊ฐ๋ฐํ Library.ย -์ฅ์ : ํ์ด์ค๋ถ์ ์ง์์ ์ธ ๊ด๋ฆฌ์ ํจ๊ปย ์ํ๊ณ๊ฐ ํ์ฑํย ๋์ด ์์ด ๋ค์ํ ์๋ฃ, ๊ทธ๋ฆฌ๊ณ React Native์ ์ฌ์ฉ์ผ๋ก ์ธํด ์ฌ์ฉ์๊ฐ ๊พธ์คํ ์ฆ๊ฐํ๋ค.-๋จ์ : Angular, Vue์๋ ๋ค๋ฅด๊ฒ ๋ฆฌ์กํธ๋ ์ค๋ก์ง View๋ง ๋ด๋นํ๋ค. ๊ทธ๋งํผ ๋ด์ฅ๋์ด ์๋ ๊ธฐ๋ฅ์ด ๋ถ์กฑํดย third-party ๋ผ์ด๋ธ๋ฌ๋ฆฌ(ex. React-router, Redux)๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค.
๐ง Library? Framework?
ํ์ด์ค๋ถ์์ ๊ฐ๋ฐํ๊ณ ๊ด๋ฆฌํ๋ย ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๋ง๋ค๊ธฐ ์ํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
๋ฆฌ์กํธ์ ๊ฐ์ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ย ๊ฐ์ฅ ํฐ ์ด์
ย ์ค ํ๋๋ ๊ฐ์ ๋์ ํตํดUI๋ฅผ ์๋์ผ๋ก ๋น ๋ฅด๊ฒ ์
๋ฐ์ดํธ
ํด ์ค๋ค๋ ์ ์ด๋ค.๊ฐ์ ๋(Virtual Dom)์ย ์ด์ UI ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํด์, ๋ณ๊ฒฝ๋ UI์ ์ต์ ์งํฉ์ ๊ณ์ฐํ๋ ๊ธฐ์ ์ด๋ค. ์ด ๊ธฐ์ ๋๋ถ์ ๋ถํ์ํ UI ์
๋ฐ์ดํธ๋ ์ค๊ณ , ์ฑ๋ฅ์ ์ข์์ง๋ค.
:: Node.js
Node.js ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ธ๋ผ์ฐ์ ๋ฐ(ex. ์๋ฒ)์์๋ ๋์ํ๊ฒ ํ๋ ํ๊ฒฝ
์ ์๋ฏธํ๋ค. ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ฝ๋์ด๋ฏ๋ก Node.js์ ์ง์ ์ ์ธ ์ฐ๊ด์ ์์ง๋ง, ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ํ์ํ ์ฃผ์ ๋๊ตฌ๋ค(ex. ๋ฐ๋ฒจ, ์นํฉ)์ด Node.js ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ค์นํด์ผ ํ๋ค.Node.js๋ฅผ ์ค์นํ๋ฉดย npm(node package manager)
ย ์ด ์๋์ผ๋ก ์ค์น ๋๋๋ฐ npm์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋
ธ๋(Node.js)๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ค. ํฐ๋ฏธ๋์์ ์๋์ ๋ช
๋ น์ด๋ฅผ ์คํ ํจ์ผ๋ก์จ Node.js ์ ๋ฒ์ ์ ํ์ธํ ์ ์๋ค. ๋
ธ๋ ๋ฒ์ ์ด ์ ์์ ์ผ๋ก ํ์ธ๋๋ฉด ์ค์น๋ ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ด๋ค.
$ node -v
:: npm
Node ๊ธฐ๋ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉดย npm(node package manager)
์ด๋ผ๋ ํจํค์ง ๋๊ตฌ๊ฐ ํ์ํ๋ค. npm ์ ํตํด ๋ค์ํ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๋ฒ์ ์ ๊ด๋ฆฌํ ์ ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก npm ๋ฒ์ ์ ํ์ธํ๋ ๋ช
๋ น์ด๋ฅผ ํตํด ์ค์น๊ฐ ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ก๋์ง ํ์ธํด๋ณผ ์ ์๋ค.
$ npm -v
:: CRA(Create-React-App)
: ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์์ํ๋๋ฐ ํ์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ธํ ํด์ฃผ๋ ๋๊ตฌ(toolchain)
๋ฆฌ์กํธ๋ UI ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ตฌ์ถํด์ผํ๋ ๊ฒ๋ค์ด ๋ง๋ค. ์ ๋ฐ์ ์ธ ์์คํ ์ ์ง์ ๊ตฌ์ถํ ์ ์์ผ๋ ์ํ๋ ํ๊ฒฝ์ ๋ง๊ฒ ์ต์ ํํ ์ ์์ง๋ง, ๋ฐ๋๋ก ์ ๊ฒฝ์ธ ๊ฒ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ฒ์ ์์ํ๋ ๋จ๊ณ์์๋ ์ง์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
๋ฆฌ์กํธ ํ์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํดย CRA(Create-React-App)
์ ๋ง๋ค์๋ค. CRA๋ ๋ฆฌ์กํธ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ธฐ ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๋ค. CRA๋ฅผ ์ด์ฉํ๋ฉด ํ๋์ ๋ช
๋ น์ด๋ก ๋ฆฌ์กํธ ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ค.
CRA๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ ๋ ํจํค์ง ๋ฒ์ ๋ง ์ฌ๋ฆฌ๋ฉด ๋๋ค.
:: CRA ์ค์น
// 1. Desktop - wecode ํด๋ ์ง์
cd Desktop/wecode
// 2. westagram-react ํ๋ก์ ํธ ์ค์น
npx create-react-app westagram-react
// 3. westagram-react ํ๋ก์ ํธ ์ง์
cd westagram-react
// 4. ๋ก์ปฌ ์๋ฒ ๋์ฐ๊ธฐ
npm start
๐ก Component๋?- ์ฌํ์ฉ ๊ฐ๋ฅํ UI ๊ตฌ์ฑ ๋จ์์ด๋ค.
ex) instagram ๋ฉ์ธ ํ์ด์ง
:: ์ปดํฌ๋ํธ์ ํน์ง
:: Class vs Functional Component
์ปดํฌ๋ํธ์ ์ข ๋ฅ, ์ฆ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
1) Class Component
import React from 'react'
class Component extends React.Component {
render() {
return (
<div><h1>This is Class Component!</h1></div>)
}
}
export default Component
render
ย ํจ์๊ฐ ๊ผญ ์์ด์ผ ํ๊ณ , ๊ทธ ์์ ๋ณด์ฌ ์ฃผ์ด์ผ ํ ย JSX
๋ฅผ ๋ฐํํฉ๋๋ค.2) Functional Component
import React from 'react'
const Component = () => {
return (
<div><h1>This is Functional Component!</h1></div>)
};
export default Component
๐ก JSX(JavaScript Syntax Extension)๋?๋ฆฌ์กํธ์์ ์ฌ์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ฅ ๋ฌธ๋ฒ์ด๋ค.JSX๋ก ์์ฑํ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ๋ ๊ณผ์ ์์ ๋ฐ๋ฒจ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์ ์ฝ๋๋ก ๋ณํ๋๋ค.
:: JSX ์ฅ์
:: JSX ํน์ง
{ ... javascript... }
class
ย -->ย className
ย ์ ํ<div style={{color : "red"}}>Hello React</div>
<div></div>
ย orย <div />
<> ... </>
) ํ์<> //JSX์ ํฐ ํน์ง, ๋ด๋ถ ์์๋ค์ ๊ฐ์ธ๋ ์ต์์ ์์
<div className="loginBtn" onClick={() => console.log("click")}>Login</div><br /><div style={{backgroundColor: "grey", height: "10px"}} /></>