2021. 9. 16. 08:00ใFront-End ์์ ์ค/Vue.js
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ ์ฃผ๋ํ๋์ด React์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฒ์ ๊ณต๋ถํ๋ ์๊ฐ์ธ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ Full-Stack์ด ๋๊ณ ์ถ์ ๊ฒ์ด์์!
๐ Reate ๊ฐ๋ (์ฑ ์ถ์ฒ: ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive)
๐Reate ํ์ ์ด์
๊ทธ๊ฒ์ ๋ฐ๋ก ์๋์ ๊ฐ์ ์ด์ ๋๋ฌธ์ธ ๊ฒ์ด์์.
- Component - Props, State
- HOOK
- Axios
- Router - Tamplate ์ด์ฉ
- Redux - thunk / saga ---> Redux Toolkit
๐Reate์ ์์
JSTL์ 2015๋ ๋ถํฐ Update๊ฐ ๋์ง ์์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค!
- SSR (Server Side Render) : ์๋ฒ์์ ํ์ํ ๊ฒ์ ๋ค ๋ง๋ค์ด ๋ณด๋ด๋ ๋ฐฉ๋ฒ
SSR -> JSP -> JAVA -> Compile -> Output State - SEO (Search Engine Optimizer)
- Web Page ์ค์ฌ๊ณผ Web Application
- HTML์ ์ ์ฅ ๋ณํ
- JS์ ์ ์ฅ ๋ณํ
- ๋จ์ผ Todo List
Browser๋ HTML์ ๋ง๋๋ฉด HTML์ Memory์ Tree ๊ตฌ์กฐ๋ก ๋ฃ๋ ๊ฒ์ด์์. ์ด๊ฒ์ DOM Tree(HTML๊ณผ 1:1๋ก ๋งค์นญ)๋ผ๊ณ ํ๊ณ , JS์์๋ DOM ํธ๋ค๋ง์ด๋ผ ํ๋ ๊ฒ์ด์์. CSS๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ง Tree ๊ตฌ์กฐ๋ก ๋ง๋๋ ๊ฒ์ด์์. (๋๋๋ง ํธ๋ฆฌ)
๐Component๋?
์ฌ์ฉ์๊ฐ ์ ์ํ Tag๋ฅผ ๋งํ๋ ๊ฒ์ด์์. Component๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์ ์ ๋ฌด์์ผ๊น์?
- ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
- ์ฌ ์ฌ์ฉ์ฑ์ด ์ข์์ง๋ค.
- ์ ์ง๋ณด์์ฑ์ด ์ข์์ง๋ค.
- html Code๋ฅผ ํ ํ์ด์ง์ ์์ฑํ๊ณ , ๊ทธ ๋ด์ฉ์ ์ฌ์ฉํ ๊ณณ์์ Tag๋ง ์ ์ด์ฃผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ
๐์ต์ด ์ค์
react๋ฅผ ์ค์นํ ๋, npx์ npm์ ์ด์ฉํ ์ ์์ต๋๋ค!
- npx : ์์ ์ค์น ๋ค ๋ฐ๋ก ์ญ์
- npm : ์๊ตฌ ์ค์น
๐Reate์ ์ด๋ชจ์ ๋ชจ
์ต์ด ๋ฆฌ์ํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด index.js(์ต์ด ์ ๊ทผ์ )์ document.getElementById('root')๋ก ๋์ด ์๋๋ฐ, ์ด๊ฒ์ index.html์ 31๋ฒ์งธ ์ค์ <div> Tag์์ id์ด๋ฆ์ด๊ณ , Mapping์ด ๋๋ ๊ฒ์ด์์.
๋ค์ index.js์ import ๋ถ๋ถ์ App from ./App์ด ์๋๋ฐ, ์ด๊ฒ์ App.js๋ฅผ importํ์ฌ <div className="APP">์ด ๋๋ ๋ ๊น์ง ๊ทธ ์์ ๋ชจ๋ ๋ด์ฉ์ import ํ๊ฒ ๋ค๋ ๊ฒ์ด์์. index.js 7 ~ 9๋ฒ์งธ ์ค์ <App />์ ํตํด App.js์ ๋ด์ฉ์ ๊ฒฐ๊ตญ ๊ฐ์ ธ์ค๋ ๊ฒ์ด์ง์.
๋ํ, css File์ ์์ ํ ๋๋ index.js์ import๋ index.css๋ฅผ ์์ ํ๋ฉด ๋๋ ๊ฒ์ด์์.
JS๊ฐ ๋ฌธ์์ด์ Browser์ ๋ณด๋ด์ฃผ๋ฉด ์ต์ด Browser๋ ํ๋ฒ ์ฝ๋๋ฐ, '~~๋ฌธ'(์ ์ด๋ฌธ ๋ฑ ํน์ ์ ์ธ๋ฌธ (๋ณ์ ๋ฑ))์ ๋จผ์ ์ฐพ๊ณ , ๋๋ฒ์งธ ์ฝ์ ๋๋ '~~์'์ ์ฐพ๋ ๊ฒ์ด์์.
๋ง์ฝ ์ฝ๋ฉ์ ํ๊ณ , ๋ธ๋ผ์ฐ์ ์์ ๊ฒฝ๊ณ ๋ก Undifind๋ผ๊ณ ๋์ค๋ฉด ๋ณ์๋ ์๋๋ฐ, ๊ฐ์ด ์์ ๋ ๋์ค๋ ๊ฒ์ด์์. JS๋ ํจ์๋ ๋ณ์์ฒ๋ผ ์ฒ๋ฆฌํ๋ต๋๋ค!
Not Difind๋ ๋ณ์ ์กฐ์ฐจ ์ฐพ์ ์ ์์ ๋ ๋จ๋ Error์์.
JS ํธ์ด์คํ ์ด๋? ํจ์์์ ์ฌ์ฉ๋ ๋งค๊ฐ ๋ณ์๊ฐ ํจ์ ๋ณด๋ค ์๋์์ ๊ฐ์ด ๋ด๊ธฐ๋ ํ์์ ๋งํ๋ ๊ฒ์ด์์.
JS ํด๋ก์ ธ๋? ํจ์์ ํจ์๊ฐ ์ ์ธ๋ ์ดํ์ (Lexical) ํ๊ฒฝ์ ์กฐํฉ์ธ ๊ฒ์ด์์.
์ด ๋ง์ด ๋ฌด์์ด๋๋ฉด?
function outerFunc() {
var x = 10;
var innerFunc = function() {
console.log(x);
}
innerFunc();
}
outerFunc(); // 10
์์ ์ฝ๋์์ outerFunc ๋ด์์ ๋ด๋ถ ํจ์ innerFunc๊ฐ ์ ์ธ๋๊ณ ํธ์ถ์ด ๋ ๊ฒ์ด์์. ์ด ๋ ๋ด๋ถ ํจ์ innerFunc๋ ์์ ์ ํฌํจํ๊ณ ์๋ ์ธ๋ถ ํจ์ outerFunc์ ๋ณ์ x์ ์ ๊ทผ ํ ์ ์๊ฒ ๋๋ต๋๋ค. ์ด๋ ํจ์ innerFunc๊ฐ ํจ์ outerFunc์ ๋ด๋ถ์์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๐ก์ฐธ๊ณ :
์ค์ฝํ๋ ํจ์๋ฅผ ํธ์ถํ ๋๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ด๋์ ์ ์ธํ์๋์ง์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค. ์ด๋ฅผ Lexical scoping (๋ ์์ปฌ ์ค์ฝํ)์ด๋ผ ํ๋ค. ์ ์์ ์ ํจ์ innerFunc๋ ํจ์ outerFunc์ ๋ด๋ถ์์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ํจ์ innerFunc์ ์์ ์ค์ฝํ๋ ํจ์ outerFunc์ด๋ค. ํจ์ innerFunc๊ฐ ์ ์ญ์ ์ ์ธ๋์๋ค๋ฉด ํจ์ innerFunc์ ์์ ์ค์ฝํ๋ ์ ์ญ ์ค์ฝํ๊ฐ ๋๋ค.
ํด๋ก์ ๋ ์์ ์ด ์์ฑ๋ ๋ ํ๊ฒฝ(Lexical enviroment)์ ๊ธฐ์ตํด์ผ ํ๋ฏ๋ก Memory ์ฐจ์์์ ์ํด๋ฅผ ๋ณผ ์ ์๋ ๊ฒ์ด์์. ํ์ง๋ง ํด๋ก์ ๋ ์๋ฐ ์คํฌ๋ฆฝํธ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ต๋๋ค!
๊ทธ๊ฒ์ ๋ฐ๋ก! ์ํ ์ ์ง!
ํด๋ก์ ๊ฐ ๊ฐ์ฅ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ์ํฉ์ ํ์ฌ ์ํ๋ฅผ ๊ธฐ์ตํ๊ณ , ๋ณ๊ฒฝ๋ ์ต์ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ด์์.
๐ํจ์ ์ด์ผ๊ธฐ
console.log(doA)
console.log(doA())
function doA() { // ํจ์์ ์ ์ธ๋ฌธ
return 10
}
์ฐธ๊ณ ๋ก ํจ์๋ ๋ณ์๋ก ๋ด์ผ ํด์. ์์ ์์ ์์ doA๋ ํจ์๊ฐ ์๋ ๋ณ์๋ก ๋ณด๊ณ , { }๋ ๋ณ์์ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐ์ ํฉ์๋ค!
์์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด 1๋ฒ(console.log(doA))๋ ๋ธ๋ผ์ฐ์ ธ ์์์ ํจ์ ๋ด์ฉ์ด ๊ทธ๋๋ก ์ถ๋ ฅ๋๊ฒ ๋๊ณ , 2๋ฒ(console.log(doA())๋ 10์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด์์.
๐๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ด์ผ๊ธฐ
- console.log(boj.name)
- console.log(obj[name])
์์ ์๋๋ ๋ ๋ค ๊ฐ๋ฅํ์ง๋ง, ๊ธฐ๋ฅ์ ์ฐจ์ด๊ฐ ํฌ๋ค - var obj = { name : 'AAA', age : 16 } // ๊ฐ์ฒด ๋ฆฌํฐ๋ด ํ์
- JSON = ๋ฌธ์์ด์ด๋ค.
- JSON.parse() = JSON ํ์์ JS ๊ฐ์ฒด๋ก ๋ฐํํ ๋ ์ฌ์ฉ
์์ ํ๊ธฐ ์๋ฃ์์ ๋ถ์กฑํ ๋ด์ฉ์ ์๋์ ์์ฑํ ๊ฒ์!
Props (Properties) : JavaScript์ ๊ฐ์ฒด๋ก ๋๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์ํฅ์ ์ฃผ๋ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๊ณ , ํจ์ ๋งค๊ฐ ๋ณ์์ฒ๋ผ ์ปดํฌ๋ํธ์ ์ ๋ฌ์ด ๋๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ๊ฐ์ ์ฃผ๋ ๊ฒ์ผ๋ก ์์ ์ปดํฌ๋ํธ์์๋ props๋ฅผ ๋ฐ์์ค๊ธฐ๋ง ํ๊ณ , ๋ฐ์์จ props๋ฅผ ์ง์ ์์ ํ ์๋ ์๋ค. ์ด๋ฐ ์ด์ ๋ก ์ ํ๊ธฐ ์๋ฃ์ ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ๊ณ ์์ฑํ ๊ฒ
State : JavaScript์ ๊ฐ์ฒด๋ก ๋๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์ํฅ์ ์ฃผ๋ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๊ณ , ํจ์ ๋ด์ ์ ์ธ๋ ๋ณ์์ฒ๋ผ ์ปดํฌ๋ํธ ์์์ ๊ด๋ฆฌ๋๋ค. ๋ํ, ๋ด๋ถ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๐React Router ์ด์ผ๊ธฐ
๐Higher Order Component ์ด์ผ๊ธฐ
Higher Order Component - HOC (๊ณ ์ฐจ ์ปดํฌ๋ํธ) ๋? ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ React์ ๊ณ ๊ธ ๊ธฐ์ ์ธ ๊ฒ์ด์์.
HOC์ React API์ ์ผ๋ถ๊ฐ ์๋๊ณ , React์ ๊ตฌ์ฑ์ ํน์ฑ์์ ๋์ค๋ ํจํด์ด๋๋๋ค.
์๋๋ HOC๋ฅผ ๊ฐ์ ธ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์ ์ธ ๊ฒ์ด์์.
const EnhancedComponent = higherOrderComponent(WrappedComponent);
์ปดํฌ๋ํธ๋ props๋ฅผ UI๋ก ๋ณํํ๋ ๋ฐ๋ฉด HOC๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ณํ ํ๋ ๊ฒ์ด์์.
HOC์ Redux์ connect์ Relay์ createFragmentContainer์ ๊ฐ์ 3rd Party React Library์์ ํํ๊ฒ ๋ณผ ์ ์๋ต๋๋ค.
๐Redux ์ด์ผ๊ธฐ
๐๋ฐฐํฌ ์ ์ฐธ๊ณ
์ต์ด ๊ฐ๋ฐ ๋จ๊ณ์์ Browser๋ฅผ ํตํด ํ์ธํ๊ณ ์ ํ ๋ #npm run start ๋ช ๋ น์ด๋ก ์คํํ๋๋ฐ, ์ด๋ ๊ฒ ์คํํ๋ฉด Browser์ Resource๋ฅผ ์์ฒญ ์ก์ ๋จน๊ฒ ๋๋ ๊ฒ์ด์์. ๊ทธ๋์ ๋ฐฐํฌ ํ ๋๋ #npm run build ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ผ ๋๋ ๊ฒ์ด์์.
๐๋ถ๋ก
์๋ฉํฑ Tag๋ React์ ์ ํ ๊ด๊ณ ์๋ HTML 5์ Tag๋ก ๊ทธ ์ด๋ค ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ๊ฒ์ด ์๋๊ณ , ์ฌ๋๋ค๋ผ๋ฆฌ ์ด๊ฒ์ด ๋ฌด์์ธ์ง์ ๋ํ ๊ตฌ๋ณ์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด์์.
<header></header>๋ ์ฌ๊ธฐ๊ฐ ํค๋๋ถ์์ ์๋ฆฌ๋ ๊ฒ์ด๊ณ , <nav></nav>๋ ์ฌ๊ธฐ๊ฐ ๋ค๋น๊ฒ์ด์ ๋ถ์์ ์๋ฆฌ๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช ๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'Front-End ์์ ์ค > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] State์ Props์ ์ฐจ์ด (0) | 2021.10.02 |
---|---|
[React] State (0) | 2021.09.27 |
[React] Component File ๋ถ๋ฆฌ (0) | 2021.09.26 |
[React] Props (0) | 2021.09.25 |
[React] Component ๋ง๋ค๊ธฐ (0) | 2021.09.24 |