2022. 5. 22. 03:55ใFront-End ์์ ์ค/Nuxt.js
Git Hub
ํ ๊ถ์ผ๋ก ๋ฐฐ์ฐ๋ Vue js 3 ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ธฐ์ด ์ค์ (์์ง์ฑ )
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ ๋ชฉ์ฐจ
โ [Vue+Nuxt.js] Nuxt.js ๊ธฐ๋ณธ
โ[Vue+Nuxt.js] Nuxt.js ์์ํ๊ธฐ
โ [Vue+Nuxt.js] Nuxt.js Data ํธ์ถ ๋ฐฉ์๊ณผ API ์ฐ๋
โ[Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์ฉํ์ฌ ์ผํ ์ํ ๋ชฉ๋ก ํ์ด์ง์ ์์ธ ํ์ด์ง ๊ฐ๋ฐ
โ [Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์ฉํ์ฌ ์ผํ ์ํ ๊ฒ์ UI ๊ฐ๋ฐ
โ [Vue+Nuxt.js] Vuex๋ฅผ ์ด์ฉํ์ฌ ์ฅ๋ฐ๊ตฌ๋ Page ๋ง๋ค๊ธฐ
๐ API ์ฐ๋ํ๊ธฐ
๐ฝ Axios
๐ฆ Axios ์ค์น ๋ฐ API ํธ์ถ
์ต์ด Nuxt.js Root Path์์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ axios๋ฅผ ์ค์น ํด ์ฃผ๊ฒ ์ต๋๋ค.
๋ช
๋ น์ด
npm install axios
main.vue์ script ์ ๋ ฅ๋ถ์ ์์ ๊ฐ์ด `axios`๋ฅผ importํ๊ณ , created()๋ฅผ ๋ง๋ค์ด `get`์ผ๋ก Backend์์ ๋ด์ฉ์ ๊ฐ์ ธ์ค๊ฒ ํด ์ฃผ์์ต๋๋ค.
๐ก ์ฐธ๊ณ ์ฌํญ
BackEnd๋ Mock ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ ธ ์์ผ๋ฉฐ, ํ์ํ์ ๋ถ๋ค์ ์ฃผ๋ํ๋์ Git Page์์ `backend` Package๋ฅผ ๋ด๋ ค๋ฐ๊ธฐ ํ์ ๋ค Nuxt.js Package ์ต์๋จ์ ๋ฃ์ด์ฃผ์๋ฉด ๋๊ณ , `backend` Package ์์์ `npm run dev`๋ฅผ ์ ๋ ฅํ์๋ฉด `Backend`๊ฐ ๋์ํฉ๋๋ค.
Main Page๋ฅผ ๋ค์ด์๋ณด๋ฉด HTML์ ๋ณ๋ค๋ฅธ ๋ด์ฉ์ ๋ฃ์ด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ `axios`๋ฅผ ํตํด ๋ถ๋ฌ์จ Data๊ฐ ๋ณด์ด์ง ์๋๋ฐ, ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํตํด ํ์ธ์ ํด ๋ณด๋ฉด Data๋ฅผ ๋ถ๋ฌ์จ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
๐ฝ Nuxt.js Port ๋ฐ ๋ฐ์์จ Data ๋ฟ๋ ค์ฃผ๊ธฐ
๐ฆ Nuxt.js Port ๋ณ๊ฒฝ
๋จผ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ Nuxt.js์ Port๋ฅผ ์ ์ ์ผ๋ก ๋ฐ์์ฃผ๋๋ก ํด ๋ณผ๊ฒ์.
`nuxt.config.js`์์ ์์
์ ํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
39 ~ 41๋ฒ์งธ๋ฅผ ์ฃผ๋ชฉํ ํ์๊ฐ ์๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด server ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ , port๋ผ๋ ๊ฐ์ฒด์ port ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด ํด๋น ๋ฒํธ๋ก Nuxt.js๊ฐ ๋์ํ๊ฒ ๋ฉ๋๋ค.
์์ฃผ ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฆ Axios๋ก ๋ฐ์์จ Data ๋ฟ๋ ค์ฃผ๊ธฐ
์ด๋ฒ์๋ Axios๋ฅผ ํตํด https://localhost:3000/products์์ get Method๋ฅผ ํตํด ๋ฐ์์จ Data๋ฅผ View์ ๋ฟ๋ ค์ฃผ๋ ์์
์ ํด ๋ณผ ๊ฒ์ด์์.
์ต์ด Backend์์ ๋ฐ์์จ Data๋ฅผ `response`์ ๋ด๊ฒ 23๋ฒ์งธ ์ค์ ์ ์ธ์ ํด ์ฃผ์๊ณ , 27๋ฒ์งธ ์ค์ ๋ณด๋ฉด `response`์์ `data`์ ๋ด์ฉ์ `products` ํ๋ ๋ฐฐ์ด ๋ณ์์ ๋ด๊ฒ ํด ์ค ๊ฒ์ด์์.
`Backend`์์ ๋ด์์จ Data๋ ์ฐ๋ฆฌ๊ฐ ์ ์ธํ ๊ฐ์ฒด ๋ด `data`๋ผ๋ ๊ณณ์ ๋ด๊ฒจ์ค๊ฒ ๋๋ฉฐ, ์ด `data` ๊ฐ์ฒด ์์ ๋ค์ฌ๋ค ๋ณด๋ฉด ์ฌ๋ฌ๊ฐ์ง ๊ฐ์ฒด๊ฐ ๋ ์กด์ฌํ๋ ๊ฒ์ ์ ์ ์์ด์.
`main.vue`์ 17๋ฒ์งธ ~ 21๋ฒ์งธ๋ฅผ ์ฃผ๋ชฉํด ๋ณด๋ฉด `data()` ์์ return์ ์ ์ธํ๊ณ , ๊ทธ ๊ณณ์ `products`๋ผ๋ ๋น ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ์ ์ธํด ์ฃผ์์ด์. ๊ทธ๋ฐ ๋ค 27๋ฒ์งธ ์ค์์ `Backend`์์ ์๋ต์ผ๋ก ๋ค์ด์จ ๊ฐ์ ๋ฐ์ ์ ์๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ด์์.
5๋ฒ์งธ ~ 7๋ฒ์งธ ์ค์ ๋ณด๋ฉด `<div>` Tag๋ก ๊ฐ์ธ์ค ๋ค `products` ๊ฐ์ฒด ๋ฐฐ์ด์ ๊ฐ์ ๋ฟ๋ ค์ฃผ๋๋ก ํด ์ฃผ๋ฉด ์๋์ ๊ฐ์ด ๋ฐ์์จ Data๊ฐ ํ๋ฉด์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๊ฐ๋ฐ์ ๋๊ตฌ Console์ ๋์ค๋ ๊ฐ ์ค ๋งจ ์๋๋ฅผ ๋ณด๋ฉด `[HMR]`์ด ๋์ค๋๋ฐ, ์ด๋ `Hot Module Replacement`์ ์ฝ์์ด๋ฉฐ, ๋ด๋ถ์ ์ผ๋ก Web Pack์ด ๋ค ๋๊ณ ์๋ ์ํฉ์ธ ๊ฒ์ด์์.
์ฐธ๊ณ ๋ก ํ์ฌ Page์์ ์๋ก๊ณ ์นจ์ ํ๊ฒ ๋๋ฉด ํ๋ฒ ๊น๋นก์ด๋ ํ์์ ๋ง๋ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋ ๋น๋๊ธฐ์ ์ผ๋ก Data๋ฅผ ์ฒ๋ฆฌํ๋ ํน์ฑ์ผ๋ก ๋จผ์ Data๋ฅผ ๋ถ์ด์ค๊ธฐ ์ ์ ๋น ๋ฐฐ์ด์ด ๋จผ์ ํ๋ฉด์ ๋ฟ๋ ค์ง๊ฒ ๋๊ณ , ์ดํ์ Data๋ฅผ ๊ฐ์ ธ์์ ๋ฟ๋ ค์ง๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๐ฝ Data ํธ์ถ
๐ฆ Data ํธ์ถ ๋ฐฉ์
Nuxt.js ๋น๋๊ธฐ ๋ฐ์ดํฐ ํธ์ถ ๋ฐฉ๋ฒ ์ด๋ก ์ `์ด ๊ณณ`์ ๋ฐ๋ก ์ค๋นํด ๋์์ด์.
์ต์ด `asyncData()`๋ฅผ ํ๋ฒ ์ด์ฉํด ๋ณด๋๋ก ํ ๊ฒ์.
`export default{}`์ ์ต์๋จ์ `acyncData()`๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ๊ธฐ์กด์ `created()`์ ์ ์๋ ๋ด์ฉ์ ๊ฐ์ ธ์ ๋ณด์์ต๋๋ค.
์ผ๋จ ์ด๋ ๊ฒ ํ๊ณ , ์ ์ฅ์ ํ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ ์ ์ ์์ด์.
โ
Error๊ฐ ๋ฐ์ํ ์ด์ ๋ ๋ฐ๋ก 22๋ฒ์งธ ์ค์ `this` Keyword ๋๋ฌธ์ด์์.
`asyncData`๋ ๋น๋๊ธฐ๋ก Data๋ฅผ ์์ฒญํ๋ ์ฆ, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ ์ฌ์ฉํ๋ ์ธ์คํด์ค ์์ฑ์ด์์.
`asyncData()`๋ ํน์ Page์ ์ง์
ํ๊ธฐ ์ ์ ํธ์ถ๋๋ ์์ฑ์
๋๋ค. Page์ ์ง์
ํ๊ธฐ ์ ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ `asyncData()` Logic์ด ์ ๋ชป ๋์๋ค๋ฉด Page ์ง์
์์ฒด๊ฐ ๋ถ๊ฐ๋ฅ ํด ์ง๋๋ค.
์ฆ, Page๊ฐ ๊ทธ๋ ค์ง๊ธฐ ์ ์ ๋ถ๋ ค์ง๋ Logic์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ Component๊ฐ ์์ฑ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ Component๊ฐ ์์ฑ๋ ์ดํ์ ํธ์ถ๋๋ `data()`, `created()`์ ๊ฐ์ ์น๊ตฌ๋ค์ด ์กด์ฌํ๊ธฐ ์ด ์ ์ ํธ์ถ์ด ๋๊ณ , ์ด ๋๋ฌธ์ `data()`์ ๋ง๋ค์๋ `products:[]`๋ ์กด์ฌํ์ง ์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ `this` Keyword์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์.
`asyncData()`๋ฅผ ์ฌ์ฉํ ๋ค์ ํด๋น Page์์ ์๋ก๊ณ ์นจ์ ํ๋ฉด ํ๋ฉด ๊น๋นก์๋ ์ ๊ฑฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ฆ, `asyncData()`๋ฅผ ์ด์ฉํ๋ฉด Nuxt.js๊ฐ ์ถ๊ตฌํ๊ณ ์ ํ๋ SSR์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ ๊ฒ์ด์์.
๐ฆ asyncData ์์ฑ ์ฃผ์์ฌํญ
์ด๋ฒ์๋ `ProductList.vue`๋ผ๋ Component๋ฅผ ํ๋ฒ ๋ง๋ค์ด ๋ณผ๊ฒ์.
Component Package ๋ฐ์ `ProductList.vue`๋ฅผ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด Code๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค `Main.vue`์์ `ProductList.vue` Component๋ฅผ ์ด์ฉํ ์ ์๊ฒ ์๋์ ๊ฐ์ด Code๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
VS Code์์ Compoent ์ด๋ฆ์ผ๋ก Tag๋ฅผ ์ ์ธํ๊ฒ ๋๋ฉด ์๋์ผ๋ก import์ compoents๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ฒ ๋ฉ๋๋ค.
15๋ฒ์งธ ์ค๊ณผ 18๋ฒ์งธ ์ค์ VS Code๊ฐ ์๋์ผ๋ก ์
๋ ฅํด ์ค ๋ด์ฉ์ด์์.
์ต์ด ์์ ๊ฐ์ด Code๋ฅผ ์
๋ ฅํ๋ฉด Error๊ฐ ๋ฐ์ํ ๊ฒ์ด์์.
์๋ํ๋ฉด `main.vue`์์ `ProductList.vue`๋ฅผ ๋ถ๋ฌ์์ง๋ง, `ProductList.vue`์๋ ์๋ฌด ๋ด์ฉ์ด ์๊ธฐ ๋๋ฌธ์ด์์.
์ด๋ฒ์๋ `asyncData()`์ ์ฃผ์์ ์ ์์๋ณด๊ธฐ ์ํด ์๋์ ๊ฐ์ด Code๋ฅผ ์์ ํด ๋ณด์์ด์.
`main.vue`์ `asyncData()` ๋ด์ฉ์ ๋ชจ๋ ์ฃผ์์ฒ๋ฆฌํ๊ณ , ์๋์ ๊ฐ์ด `ProductList.vue`์ ์ฎ๊ฒจ ์ฃผ์์ด์.
์์ ๊ฐ์ด Code๋ฅผ ์์ ํ ๋ค ์ ์ฅ์ ํ๊ณ ์คํ์ ํ๊ณ ๋๋ฉด Error๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๊ฐ๋ฐ์ ๋๊ตฌ์ Console์์ ๋งจ ์ ๋ถ๋ถ์ ๋ณด๋ฉด `Nuxt SSR`์ด๋ผ๊ณ ํ์๊ฐ ๋๊ณ , ๊ทธ ๋ด์ฉ์ ํผ์ณ๋ณด๊ธฐ ํ๋ฉด ์์ ๊ฐ์ด Error๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ์ด๋ Nuxt ์ฆ, Server์์ ๋๋ Error์ธ ๊ฒ์ด์์.
์์ ๊ฐ์ด Error๊ฐ ๋๋ ์ด์ ๋ ๊ฒฐ๋ก ์ ์ผ๋ก `asyncData()`๊ฐ ๋์ํ์ง ์์๊ธฐ ๋๋ฌธ์ด์์.
์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด `console.log("asyncData Error ๋ฐ์");'์ ๋ง๋ค์ด ์ค ๋ค ๋ค์ ์คํ ํด ๋ณด์์ด์.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์คํ ํด ๋ณธ ๋ค ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ดํด ๋ณด์์ด์.
๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ดํด๋ณด๋ log ์ฐ๋ ๋ถ๋ถ์ ์์ ์ ๊ทผ ์กฐ์ฐจ ๋ชปํ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๊ทธ ์ด์ ๋ `asyncData()`๋ ์์์ ์ด์ผ๊ธฐ ํ๋๋ก `pages`๋ผ๋ Package ๋ฐ์ Component์์๋ง ์ฌ์ฉํ ์ ์๋ ์์ฑ์ด๊ธฐ ๋๋ฌธ์ด์์.
์ด๋ฒ์ ์ฃผ๋ํ๋์ `components`๋ผ๋ Package ๋ฐ์ ์๋ Component์์ ์ด๋ฅผ ์ฌ์ฉํ๋ ค ํ๊ธฐ ๋๋ฌธ์ ๋์ํ์ง ์๋ ๊ฒ์ด์์.
๐ฆ asyncData ์์ฑ ์ ๋ฆฌ
๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด ๋ณด๋ฉด `asyncData()`๋ Page๊ฐ ๊ทธ๋ ค์ง๊ธฐ ์ ์ Data๋ฅผ ๋ชจ๋ ๋ฐ์์จ ๋ค์ Page๋ฅผ ๊ทธ๋ฆฐ๋ค ํน์ ์ง์
ํ๋ค ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ต๋๋ค.
ํ ๊ถ์ผ๋ก ๋ฐฐ์ฐ๋ Vue js 3 ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ธฐ์ด ์ค์ (์์ง์ฑ )
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
'Front-End ์์ ์ค > Nuxt.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์ฉํ์ฌ ์ผํ ์ํ ๊ฒ์ UI ๊ฐ๋ฐ (0) | 2022.06.01 |
---|---|
[Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์ฉํ์ฌ ์ผํ ์ํ ๋ชฉ๋ก ํ์ด์ง์ ์์ธ ํ์ด์ง ๊ฐ๋ฐ (0) | 2022.05.24 |
[Nuxt.js] ๋น๋๊ธฐ ๋ฐ์ดํฐ ํธ์ถ ๋ฐฉ๋ฒ (0) | 2022.05.22 |
[Vue+Nuxt.js] Nuxt.js ์์ํ๊ธฐ (0) | 2022.05.18 |
[Vue+Nuxt.js] Nuxt.js ๊ธฐ๋ณธ (0) | 2022.05.17 |