๐Ÿ” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค FE ๋ฐ๋ธŒ์ฝ”์Šค 5๊ธฐ WIL = 11.27 ~ 12.03

Jun 2k (Jun2)ยท2023๋…„ 12์›” 5์ผ
1

23.11.27 ~ 23.12.03

๐Ÿ’ป Intro & TMI

Vue ๊ณผ์ œ์™€ ์—„์ฒญ๋‚œ Vue ๊ฐ•์˜๋Ÿ‰์ด ๊ฒน์น˜๋ฉด์„œ TIL์€ ๊ณ ์ˆ˜ํ•˜๊ณ  WIL๋„ ์ด์ œ์„œ์•ผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
๊ทธ๋ž˜๋„ ์ฐฉ์‹คํžˆ ๊ฐ•์˜๋ฅผ ๋“ค์€ ๊ฒฐ๊ณผ Vue ๊ณผ์ œ๋ฅผ ๋‚˜๋ฆ„ ๊ดœ์ฐฎ๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์•„์ง๊นŒ์ง€ ๊ฐœ์„ ํ•ด์•ผํ•  ์ ์ด ๋งŽ์ง€๋งŒ ๊ธฐ๋ณธ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ์„ ํƒ ์š”๊ตฌ์‚ฌํ•ญ์€ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๊ธฐ์— ์ถ”ํ›„์— ๋” ๋ฆฌํŒฉํ† ๋งํ•  ๊ฒƒ์ด๋‹ค.

์ด๋ฒˆ์ฃผ๋ถ€ํ„ฐ๋Š” ๋ง๋„ ๋งŽ๊ณ  ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ ๋Œ€์„ธ์ธ React์™€ ๋งˆ์ฃผํ•œ๋‹ค.
์ด์ „์— ์ฐ๋จน์œผ๋กœ ๋ฐฐ์› ๋˜ React๋Š” ์ž์œ ๋„๋Š” ๋†’์ง€๋งŒ ์–ด๋ ค์› ๋˜ ๊ธฐ์–ต์ด ์žˆ์–ด ๋ฐ๋ธŒ์ฝ”์Šค์—์„œ๋Š” ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค์ ธ๋‚˜๊ฐˆ ๊ณ„ํš์ด๋‹ค! ์•„์ž!



๐Ÿง ์ด๋ฒˆ์ฃผ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ

Vue์˜ ์ƒํƒœ๊ด€๋ฆฌ ํŒจํ„ด Vuex
Vuex ๋ชจ๋“ˆํ™”
Not Found page path ์„ค์ •
๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ์™€ ๋ฉ”ํƒ€ ํ•„๋“œ๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ ์ œํ•œ
๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ ์‹œ ์Šคํฌ๋กค ๋ฆฌ์…‹ํ•˜๊ธฐ
Composition API
reactive ํ•จ์ˆ˜
pinia vs vuex
HTML ๋ณ€์ˆ˜์˜ ์žฅ์ 
HTMLInputElement ๋‹จ์–ธ ํ•„์š”์„ฑ
๋…ธ์…˜ ํด๋ก ๊ณผ Todo List ํŽ˜์ด์ง€ ์‹ค์Šต


Vue์˜ ์ƒํƒœ๊ด€๋ฆฌ ํŒจํ„ด Vuex

React์—๋„ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด redux, recoil์ด ์žˆ๋“ฏ์ด ์–ผ๋งˆ ์ „๊นŒ์ง€๋Š” Vuex๋ฅผ ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • ์„ค์น˜ ํ›„ ์‚ฌ์šฉ
    npm i vuex@next ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์น˜๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด importํ›„ createStore ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต์€ index.js๋ผ๋Š” ๋…๋ฆฝ๋œ ํŒŒ์ผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

// index.js
import { createStore } from 'vuex'

export default createStore({
	// ์ปจ์…‰ ์ž‘์„ฑ ...
})

๋Œ€๋žต์ ์œผ๋กœ ํฌ๊ฒŒ 4๊ฐ€์ง€ ์ปจ์…‰์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.
๊ฐ๊ฐ์˜ ์ปจ์…‰์˜ ์—ญํ• ์ด ๋‹ค๋ฅด๋ฉฐ ์„œ๋กœ์˜ ์—ญํ• ์„ ์นจ๋ฒ”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
์„œ๋กœ์˜ ์—ญํ• ์„ ์นจ๋ฒ”ํ•˜๊ฒŒ ๋˜๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
๋‚˜์ค‘์— ๊ด€๋ จ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์ถ”์ ์ด ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ž์˜ ๊ธฐ๋Šฅ์— ๋งž๊ฒŒ ๊ตฌํšํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค.

  1. State
    ๊ธฐ๋ณธ์ ์ธ ์ƒํƒœ์— ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    ๊ธฐ์กดdata()์™€ ๊ฐ™์ด ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋Š” ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    ์ ‘๊ทผํ•  ๋•Œ๋Š” computed ์†์„ฑ๊ณผ ํ•จ๊ป˜ $store.state๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

  2. Getters
    state๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. state๊ฐ€ ๋ฐ”๋€Œ๋ฉด getters์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๋€ ๊ณ„์‚ฐ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค.
    getters๋‚ด ๋ฉ”์„œ๋“œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ state๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    ์ ‘๊ทผํ•  ๋•Œ๋Š” $store.getters๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

  3. Mutations
    ํ•œ๊ธ€๋กœ ๋ณ€์ด๋ผ๋Š” ๋œป์ด๋‹ค. ์ง๊ด€์ ์œผ๋กœ state๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™”(๋ณ€์ด)์‹œํ‚ค๋Š” ๋ฉ”์Šค๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค.
    mutations๋‚ด ๋ฉ”์„œ๋“œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ state๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    mutations ๋‚ด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” $store.commit("๋ฉ”์„œ๋“œ๋ช…")์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

  4. Actions
    Mutations์—์„œ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ƒํƒœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™”์— ๋Œ€ํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด actions์—์„œ๋Š” ๋ณดํ†ต ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒํƒœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Async await.
    actions๋‚ด ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” context ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
    ์ด ๊ฐ์ฒด๋Š” state, getters, commit, dispatch์˜ ์†์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๋”ฐ๋ผ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.
    Actions ๋‚ด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” $store.dispatch("๋ฉ”์„œ๋“œ๋ช…")์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ตœ๊ทผ Vue3 ๋ฒ„์ „์—์„œ๋Š” ์ƒˆ๋กœ์šด Pinia๊ฐ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋งŒ ๊ธฐ์กด์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ๋˜ Vuex์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋จผ์ € ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ์— ๊ผญ ์ˆ™์ง€ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ๊ฒ ๋‹ค.



Vuex ๋ชจ๋“ˆํ™”

์ƒํƒœ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋ชจ๋“ˆํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐ•์˜์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์‹œ์ง€์˜ ์ƒํƒœ์™€ ์นด์šดํŠธ ์ˆซ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Vuex ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ–ˆ์—ˆ๋‹ค.

๊ทธ ์ค‘ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋œฏ์–ด๋ณด์ž.

๋ชจ๋“ˆ์€ createStore ๊ฐ์ฒด ๋‚ด์— ๋”ฐ๋กœ modules ์†์„ฑ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ปค์Šคํ…€ ์ด๋ฆ„: ๋ชจ๋“ˆ๋ช…์œผ๋กœ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ
ํ˜„์žฌ๋Š” module ๊ฐ์ฒด ๋‚ด์—์„œ ์†์„ฑ๋ช…๊ณผ ๊ฐ’์ด ๊ฐ’์œผ๋ฏ€๋กœ ํ•˜๋‚˜๋กœ ์ƒ๋žตํ•˜์˜€๋‹ค.

// index.js
import message from './message'

export default createStore({
   	// ...
    modules: {
        message
    }
})

๊ทธ๋Ÿผ message.js ๋ชจ๋“ˆ์„ ์‚ดํŽด๋ณด์ž.
์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์ธ Vuex ๊ตฌ์กฐ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ํ•˜๋‚˜ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

// message.js
export default {
  namespaced: true,
  state() { ... },
  getters: { ... },
  mutations: { ... },
  actions: { ... },
}

๋ฐ”๋กœ namespaced ์†์„ฑ์ด๋‹ค.
์ด๊ฒƒ์„ true๋กœ ์ง€์ •ํ•˜๋ฉด ํ•ด๋‹น Vuex๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋“ˆํ™”๊ฐ€ ๋˜์–ด Vue ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐœ๋ณ„ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋˜ํ•œ Vue ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ชจ๋“ˆ ๋‚ด ์—ฌ๋Ÿฌ ์†์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌ ๋ฐ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด mapํ—ฌํผ๋ฅผ ์ง€์›ํ•œ๋‹ค.
... ์—ฐ์‚ฐ์ž ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ...map์ปจ์…‰๋ช…('๋ชจ๋“ˆ๋ช…', ['๋ฉ”์„œ๋“œ๋ช…']) ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๊ฒƒ ๋˜ํ•œ ๊ฐ ์ปจ์…‰์—์„œ ์ผ์ผ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๊ฐ™์€ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฌถ์–ด์ ธ ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ์ถ”์ ์ด ๋นจ๋ผ์ง„๋‹ค.



Not Found page path ์„ค์ •

createRouter ๊ฐ์ฒด๋กœ routes ์†์„ฑ์„ ํ†ตํ•ด ํŠน์ • ๊ฒฝ๋กœ๋กœ route ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ง€์ •ํ•œ ๊ฒฝ๋กœ ์ด์™ธ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ๋Š” Not Found 404 ์—๋Ÿฌ๋กœ ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ด ํŽ˜์ด์ง€ ๋˜ํ•œ ๋ผ์šฐํ„ฐ ์„ค์ •์„ ๋”ฐ๋กœ ํ•ด๋†“์•„์•ผ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์ธ์ง€์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ "์ง€์ •ํ•œ ๊ฒฝ๋กœ ์ด์™ธ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ"๋ผ๋Š” ์กฐ๊ฑด์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜์ง€?

์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด :noFound(.*) ํ‚ค์›Œ๋“œ์ด๋‹ค.
๊ด„ํ˜ธ ์† .*์€ ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ์ฐพ์•„์ง€์ง€ ์•Š์€ ๋ชจ๋“  ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ NotFound ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ผ์šฐํŒ…์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

export default createRouter({
    history: createWebHashHistory(),
    routes: [
        // ...
        {
            path: '/:notFound(.*)', // ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๋ฌธ์ž ์ผ์น˜
            component: NotFound
        }
    ]
})


๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ์™€ ๋ฉ”ํƒ€ ํ•„๋“œ๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ ์ œํ•œ

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์ดํŠธ๋“ค์€ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ํŠน์ • ํŽ˜์ด์ง€์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ์ด๊ฒƒ์„ Vue ๋ผ์šฐํŒ…์—์„œ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ์™€ ๋ฉ”ํƒ€ ํ•„๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ํŽ˜์ด์ง€์˜ routes ๊ฐ์ฒด์— meta ์†์„ฑ์„ ๋ถ€์—ฌํ•ด ref๋ฅผ ํ†ตํ•ด ํŠน์ • DOM๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

// requiresAuth๋Š” ์ ‘๊ทผ๊ฐ€๋Šฅ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ด๋‹ค.
meta: {
  requiresAuth: true
}

์ด๊ฒƒ๊ณผ ํ•จ๊ป˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ์—์„œ requiresAuth๋ฅผ ํ™•์ธํ•ด์„œ ํ•ด๋‹น ๋ผ์šฐํŒ… ํ˜ธ์ถœ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์ด๋•Œ ๋ผ์šฐํŒ… ํ•˜๊ธฐ์ „์— ์ฒดํฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ beforeEach ๋ฉ”์„œ๋“œ์™€ to์ธ์ž๋ฅผ ํ†ตํ•ด ๋ฉ”ํƒ€ ํ•„๋“œ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•œ๋‹ค.

// guard.js
router.beforeEach((to) => {
    if (to.meta.requiresAuth && !store.state.user.isLoggedIn) {
       ...
    }
})


๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ ์‹œ ์Šคํฌ๋กค ๋ฆฌ์…‹ํ•˜๊ธฐ

ํ•œ ํŽ˜์ด์ง€์—์„œ ์Šคํฌ๋กค์„ ํ•ด์„œ ๋‚ด์šฉ์„ ๋ณด๋˜ ์ค‘ ๋น„์Šทํ•œ ๋ ˆ์ด์•„์›ƒ์˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ์œ ์ง€๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์„ ์‹ค์ œ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งจ ์œ„๋กœ ์Šคํฌ๋กค์„ ๋ฆฌ์…‹ํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค.
์ด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด scrollBehavior์ด๋‹ค.

// routes/index.js
...
history: createWebHistory(), // HTML5 ํžˆ์Šคํ† ๋ฆฌ ๋ชจ๋“œ์—์„œ๋งŒ ์ž‘๋™๊ฐ€๋Šฅํ•˜๋‹ค.
  scrollBehavior() {
  return {
    top: 0
  }
},
...

๋‹ค์Œ๊ณผ ๊ฐ™์ด top: 0์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ์Šคํฌ๋กค ์˜์—ญ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์Šคํฌ๋กค์ด ๋ฆฌ์…‹๋œ๋‹ค.



Composition API

์˜ต์…˜ ์„ ์–ธ ๋Œ€์‹  importํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Vue ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” API ์„ธํŠธ์ด๋‹ค.

์™œ ์˜ต์…˜์„ ๋ƒ…๋‘๊ณ  Composition API๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๊ฑธ๊นŒ?
๊ณต์‹๋ฌธ์„œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐ€์ง€ ์ด์œ ๋ฅผ ๋“ ๋‹ค.

  1. ๋กœ์ง์˜ ์žฌ์‚ฌ์šฉ์„ฑ
    ์ƒํƒœ ์ €์žฅ ๋กœ์ง์„ ์บก์Аํ™”ํ•ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ์„œ ๊น”๋”ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋กœ์ง ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ์œ ์—ฐํ•œ ์ฝ”๋“œ ๊ตฌ์„ฑ
    ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํŠน์ • ๋กœ์ง์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์˜ต์…˜ API๋Š” ์—ฌ๋Ÿฌ ๋ธ”๋ก ์‚ฌ์ด๋ฅผ ์˜ค๊ฐ€๋ฉด์„œ ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค.
    ํ•˜์ง€๋งŒ Composition API๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ๋„ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์••์ถ•ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๊ธฐ์ ์ธ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ ์œ ๋ฆฌํ•˜๋‹ค.
  3. ํƒ€์ž… ์ถ”๋ก ์— ์œ ๋ฆฌ
    Composition API๋Š” ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•˜๋ฏ€๋กœ TS๋กœ ์ž‘์„ฑํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

์‹ค์ œ๋กœ Vue ๊ณผ์ œ๋„ ์ด๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ƒ๋ช… ์ฃผ๊ธฐ์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋งํ•  ๋•Œ ํŽธ๋ฆฌํ–ˆ๋‹ค!



reactive ํ•จ์ˆ˜

ref ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ฐธ์กฐ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋งค๋ฒˆ value ์†์„ฑ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์ด reactive์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด reactive๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋ผ๋Š” ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ reactive๋Š” ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋งŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ฐธ์กฐ ๊ฐ์ฒด ํƒ€์ž…์ด ์•„๋‹Œ ์›์‹œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ref๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

reactive ๋ฐ์ดํ„ฐ๋ฅผ watch ํ•จ์ˆ˜๋กœ ๊ฐ์‹œํ•  ๋•Œ๋Š” ๋”ฐ๋กœ deep ์˜ต์…˜์„ ์ฃผ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๊ฐ์ฒด ๋‚ด๋ถ€ ์š”์†Œ์˜ ๋ณ€ํ™”๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.



pinia vs vuex

ํ˜„์žฌ ์ตœ์‹  ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” pinia์ด๋‹ค.
ํ•˜์ง€๋งŒ vuex๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ ์ปจ์…‰์€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ pinia store ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ modules ์†์„ฑ์ด ํ•„์š”์—†๋‹ค.
  2. ๋‚ด๋ถ€ state์— ์ ‘๊ทผํ•  ๋•Œ this๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋”ฐ๋กœ mutations ์ปจ์…‰์ด ์ƒ๋žต๋˜์–ด actions ์ปจ์…‰์—์„œ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ญ์ƒ ์ข‹์€ ์ ๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. actions ์ปจ์…‰์—์„œ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์–ด๋– ํ•œ ๋ชจ๋“ˆ์—์„œ๋„ ์ƒํƒœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.



HTML ๋ณ€์ˆ˜์˜ ์žฅ์ 

scss ๋‚ด ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น scss ํŒŒ์ผ์„ ํ•ญ์ƒ import ํ•ด์™€์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ตœ์ƒ์œ„ ํƒœ๊ทธ ๋‚ด HTML ๋ณ€์ˆ˜๋กœ ์ƒ‰์ƒ๊ณผ ๊ฐ™์€ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด
๋”ฐ๋กœ import๊ฐ€ ํ•„์š”์—†์ด var(๋ณ€์ˆ˜๋ช…)์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜์ž.



HTMLInputElement ๋‹จ์–ธ ํ•„์š”์„ฑ

input ํƒœ๊ทธ์— ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” v-model์ด๋‚˜ ์ง์ ‘ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ•œ๊ธ€์„ ์ž…๋ ฅํ•  ๋•Œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋™์ž‘์„ ์œ„ํ•ด์„œ๋Š” ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ @input ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ์ ์ ˆํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๋•Œ $event.target์„ ํ†ตํ•ด DOM์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ฒŒ ๋˜๋Š”๋ฐ TS ์ƒ์—์„œ๋Š” ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์ถ”๋ก ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
๋”ฐ๋ผ์„œ as ํƒ€์ž… ๋‹จ์–ธ์„ ํ†ตํ•ด ํ•ด๋‹น ์š”์†Œ๊ฐ€ HTMLInputElement ํƒ€์ž…์ž„์„ ๋‹จ์–ธํ•ด์ฃผ์–ด์•ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.



๋…ธ์…˜ ํด๋ก ๊ณผ Todo List ํŽ˜์ด์ง€ ์‹ค์Šต

๋ฐ”๋‹๋ผ JS๋กœ ์ผ์ฃผ์ผ ๋™์•ˆ ๊ผฌ๋ฐ• ๋งŒ๋“  ๋…ธ์…˜ ํด๋ก  ํ”„๋กœ์ ํŠธ๋ฅผ Vue๋กœ๋Š” ๋‹จ 5์‹œ๊ฐ„ ๊ฐ•์˜๋กœ ๋š๋”ฑ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ํ˜„ํƒ€๊ฐ€ ์„ธ๊ฒŒ ์™”์—ˆ๋‹ค.
์ด๊ฒŒ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์œ„๋ ฅ์ธ๊ฐ€๋ผ๋Š” ๊ฒƒ์„ ์‹ค๊ฐํ–ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ํŽธ๋ฆฌํ–ˆ๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ UI๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์—„์ฒญ๋‚œ ๋ฉ”๋ฆฌํŠธ์˜€๋‹ค.
๋ฌผ๋ก  ๋ฐ”๋‹๋ผ JS๋กœ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋ฅผ ์–ด๋А ์ •๋„ ๊ณต๋ถ€ํ–ˆ๊ธฐ์— Vue ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“ˆํ™” ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ™•๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์ด ๋” ํฌ๊ฒŒ ์™€ ๋‹ฟ์•˜๋‹ค.
๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด ๋ฐ”๋‹๋ผ JS๋ฅผ ์ž˜ ๋‹ค๋ฃจ์ง€ ๋ชปํ•˜๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์ฃฝ์‘ค๊ฒ ๋‹ค๋Š” ๊นจ๋‹ฌ์Œ์„ ์–ป์—ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์‹ค์Šต์œผ๋กœ๋Š” Todo List ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ์‹ค์Šต์ด์—ˆ๋‹ค.
๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” Todo List ๊ธฐ๋Šฅ๋“ค์ด์—ˆ์ง€๋งŒ ๊ณ ๋ คํ•ด์•ผํ•  ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋“ค์ด ์žˆ์—ˆ๋‹ค.

  • ํ•  ์ผ ๋ชฉ๋ก์„ ์žฌ์ •๋ ฌํ•  ๋•Œ ํ•„์š”ํ•œ SortableJs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ฌด๋ถ„๋ณ„ํ•œ api ํ˜ธ์ถœ์„ ๋ง‰๊ธฐ ์œ„ํ•œ debounce ๊ธฐ๋Šฅ์„ ์œ„ํ•œ lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ @keyframes
  • ๋ชจ๋‹ฌ์ฐฝ ํŽ˜์ด์ง€ ์ „ํ™˜ ํšจ๊ณผ๋ฅผ ์œ„ํ•œ Transition
  • API ์š”์ฒญ ์‹œ ์ค‘์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋…ธ์ถœ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜
  • Vercel ๋ฐฐํฌ ์‹œ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ 404 ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ vercel.json ๋ผ์šฐํŒ… ์„ค์ •

๋ณด๊ธฐ์—๋Š” ๊ฐ„๋‹จํ•œ Todo List ํŽ˜์ด์ง€๊ฐ€ ์ด๋ ‡๊ฒŒ๋‚˜ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ค์ •๋“ค์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์šฐ๋ฉด์„œ Vue ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์„ ์–ป์—ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์œ„์™€ ๊ฐ™์€ ํฌ์ธํŠธ๋“ค์„ ํ•ญ์ƒ ๊ณ ๋ คํ•˜๋ฉด์„œ ์˜ˆ์™ธ์ ์ธ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋ฐ ๋ณด์•ˆ์—๋„ ์ฒ ์ €ํ•œ ๊ด€๋ฆฌ์™€ ๋ฐฉ์–ด์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.



๐Ÿ‘€ ๋А๋‚€์ 

Vue ๊ณผ์ œ๋ฅผ ๋ฌด์‚ฌํžˆ ์™„๋ฃŒํ–ˆ๋‹ค. ๋ฐฐํฌ ๋งํฌ

๊ณผ์ œ ๊ธฐ๋ณธ ๋ฐ ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ๊นŒ์ง€ ํ•ด๊ฒฐ์„ ๋‹ค ํ–ˆ๋‹ค!! ๋ฟŒ๋“ฏํ•˜๋‹ค!!
ํ•˜์ง€๋งŒ ์•„์ง๊นŒ์ง€ ๋ฐ˜์‘ํ˜• CSS๋ฅผ ์ ์šฉํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ๋‹ค๋ฅธ ํ”„๋กฑ์ด๋“ค์˜ ์‚ฌ์ดํŠธ์—์„œ ์Šค์ผˆ๋ ˆํ†ค UI๋‚˜ ์ •๋ ฌ ๊ธฐ๋Šฅ, ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์„ ๋ณด๊ณ  ๋‹ค์–‘ํ•˜๊ณ  ํ†กํ†ก ํŠ€๋Š” ์•„์ด๋””์–ด๋ฅผ ๋‚ด ํ”„๋กœ์ ํŠธ์—๋„ ์ ์šฉ์‹œ์ผœ๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.
(๋”ฑ ์™„์„ฑํ–ˆ์„ ๋• ๋นˆํ‹ˆ์ด ์—†์–ด๋ณด์˜€์ง€๋งŒ... ์˜ค๋งŒ๊ณผ ํŽธ๊ฒฌ?!)

๐Ÿ‘ Keep

๋ˆ„๊ตฐ๊ฐ€๋Š” Vue ์–ด์ฐจํ”ผ ์•ˆ ์“ธ ๊ฒƒ์ด๋ผ๊ณ  ๋“ฑํ•œ์‹œํ•˜๋Š” ์‚ฌ๋žŒ๋„ ๋ถ„๋ช…ํžˆ ์žˆ์„ ๊ฒƒ์ด์ง€๋งŒ ๋‚œ Vue๋„ ์–ธ์  ๊ฐ€๋Š” ์—ฐ๊ฒฐ๋˜์–ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœํ•  ๋•Œ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋žฌ๊ธฐ์— ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๊ณผ์ œ ์ˆ˜ํ–‰๊นŒ์ง€ ์ •๋ง ์—ด์‹ฌํžˆ ์ตœ์„ ์„ ๋‹คํ•œ ๊ฒƒ์ด ์ž˜ํ–ˆ๋‹ค๊ณ  ์Šค์Šค๋กœ์—๊ฒŒ ์นญ์ฐฌํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค. React๋กœ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ทธ๋ฆฌ๊ณ  ์ž˜๊ทผ์ž˜๊ทผ ์”น์–ด๋จน์–ด๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค.

๐Ÿ˜ฑ Problem

Vue ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ ์•„์ง๊นŒ์ง€ API๋ฅผ ๋‹ค๋ฃฐ ๋•Œ axios๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋Šฅ์ˆ™ํ•˜์ง€๊ฐ€ ๋ชปํ–ˆ๋‹ค. ๊ฐ•์˜์—์„œ ์ง„ํ–‰ํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ๋ฒค์น˜๋งˆํ‚น์ด๋ผ ์ฝ๊ณ  ๊ฑฐ์˜ ๋ณต์ œํ•ด์™€์„œ ์กฐ๊ธˆ ์ˆ˜์ •๋งŒ ํ–ˆ๋‹ค.
์Œฉ์œผ๋กœ ์ƒˆ๋กœ์šด api์— ๋Œ€ํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ผ๊ณ  ํ•˜๋ฉด ๊ณผ์—ฐ ํ•  ์ˆ˜ ์žˆ์„๊นŒ ์˜๋ฌธ์ด๋‹ค. ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋Œ€ํ•œ cs ์ง€์‹๊ณผ axios์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๊ณต๋ถ€๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค.

๐Ÿ˜œ Try

๋Œ๋Œ๋ฆฌ.. ์ด์ œ React๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋ชจ๋”ฅ๋ฆฌ ์ฑ…์€ Ebook์ด ์•„์ง ๋‚˜์˜ค์ง€ ์•Š์•„ ๋‚˜์˜ค๋ฉด ์‚ด ์˜ˆ์ •์ด๋‹ค. ๊ฐ™์€ ํŒ€ ์ธํ˜๋‹˜์ด ์ฑ…์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ํ‰์„ ํ•ด์ฃผ์…”์„œ ๋”์šฑ ๋” ๊ตฌ๋งค์˜์‚ฌ๊ฐ€ ํ™•์‹คํ•ด์กŒ๋‹ค. ๋…์Šคํด๋Ÿฝ๋„ ๋“ค์–ด๊ฐ€์„œ ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ๋กœ ๋‚ด ์ž์‹ ๊ณผ ์•ฝ์†ํ–ˆ๋‹ค. React ๊ฐ•์˜๊ฐ€ ์„ ํ˜‘๋‹˜์ด ์ง„ํ–‰ํ•˜์‹œ๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ ์š”์•ฝ ๊ฐ•์˜๊ฐ€ ๋งŽ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ•์˜ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ณต์‹๋ฌธ์„œ ์ •๋…์„ ๊ฐ™์ด ๋ณ‘ํ–‰ํ•  ์˜ˆ์ •์ด๋‹ค. ๊ฐ•์˜๊ฐ€ ์งง๋‹ค๊ณ  ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ๋“ค์—ˆ๋‹ค๊ณ  ๋‚ด๊ฒƒ์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ์— ๋ช…์‹ฌํ•˜์ž.

๊ทธ๋ž˜๋„ 2์ฃผ ๋™์•ˆ Vue์— ๋Œ€ํ•ด์„œ ์•„์˜ˆ ๋ชจ๋ฅด๊ณ  ์žˆ๋‹ค๊ฐ€ ๋น„๋ก ๊ณผ์ œ์ด์ง€๋งŒ Vue ๊ฐ€์ง€๊ณ  ํ•˜๋‚˜์˜ ๋ฐฐํฌ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ๋˜ ํ•œ ๋‹จ๊ณ„ ์„ฑ์žฅํ•œ ๊ฒƒ์„ ๋ชธ์†Œ ๋А๋‚„ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์˜€๋‹ค. ์ด๋Œ€๋กœ๋งŒ ์ญ‰ ๊ฐ€๋ณด์ž๊ณ !



๐Ÿ˜… ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ค€๋น„์ค‘...

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

comment-user-thumbnail
2023๋…„ 12์›” 6์ผ

๊ธฐ์กดTIL ํ˜•์‹์ธ๊ฑฐ๊ฐ™์€๋ฐ WIL๋กœ ์ž˜๋‹ด๊ฒจ์žˆ๋„ค์š” ์šฐ์™•~ ์ต๋‘ฅ๋‹˜ ํ™”์ดํŒ…

1๊ฐœ์˜ ๋‹ต๊ธ€