ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Vue.js] Vue ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ
    ๐Ÿ“— Vue.js 2024. 9. 24. 14:16

    Vue3์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”์šฑ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด <script setup> ๋ฌธ๋ฒ•์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” Vue 3์—์„œ <script setup> ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ ๊ฐ ํŒŒ์ผ์˜ ์—ญํ• ์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ˜‰

     

    1. Vue ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์กฐ ( Vite ๊ธฐ๋ฐ˜ )

    Vite๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Vue 3 ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋” ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

    my-vue-app/
    โ”œโ”€โ”€ node_modules/
    โ”œโ”€โ”€ public/
    โ”œโ”€โ”€ src/
    โ”‚   โ”œโ”€โ”€ assets/
    โ”‚   โ”œโ”€โ”€ components/
    โ”‚   โ”œโ”€โ”€ App.vue
    โ”‚   โ”œโ”€โ”€ main.js
    โ”œโ”€โ”€ index.html
    โ”œโ”€โ”€ package.json
    โ””โ”€โ”€ vite.config.js

     

    ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์œ„์™€ ๊ฐ™์€ ํด๋”๊ตฌ์กฐ๊ฐ€ ๋‚˜์˜ค์ง€๋งŒ, ์ด์ „ ๊ธ€์—์„œ vue๋ฅผ ์ƒ์„ฑํ•˜์…จ๋”๋ผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    my-vue-app/
    โ”œโ”€โ”€ node_modules/
    โ”œโ”€โ”€ public/
    โ”œโ”€โ”€ src/
    โ”‚   โ”œโ”€โ”€ assets/
    โ”‚   โ”œโ”€โ”€ components/
    โ”‚   โ”œโ”€โ”€ router/
    โ”‚   โ”œโ”€โ”€ stores/
    โ”‚   โ”œโ”€โ”€ views/
    โ”‚   โ”œโ”€โ”€ App.vue
    โ”‚   โ”œโ”€โ”€ main.js
    โ”œโ”€โ”€ .eslintrc.cjs
    โ”œโ”€โ”€ .prettierrc.json
    โ”œโ”€โ”€ index.html
    โ”œโ”€โ”€ package.json
    โ””โ”€โ”€ vite.config.js

     

     

     

    • node_modules ํด๋”: ํด๋”๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  npm ํŒจํ‚ค์ง€์™€ ๊ทธ ์˜์กด์„ฑ๋“ค์ด ์ €์žฅ๋˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค.
    • src ํด๋”: ์ฃผ์š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
    • public ํด๋”: ์ •์  ํŒŒ์ผ์ด ์œ„์น˜ํ•˜๋Š” ๊ณณ์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ HTML์ด๋‚˜ ์ด๋ฏธ์ง€, ํฐํŠธ ํŒŒ์ผ ๋“ฑ์„ ์—ฌ๊ธฐ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • vite.config.js: Vite์˜ ์„ค์ • ํŒŒ์ผ๋กœ, ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ๋ฐ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌ์„ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • eslintrc.cjs: eslintrc.cjs ํŒŒ์ผ์€ ESLint์˜ ์„ค์ • ํŒŒ์ผ๋กœ, JavaScript ๋ฐ Vue ํŒŒ์ผ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • prettierrc.jsonprettierrc.json ํŒŒ์ผ์€ Prettier์˜ ์„ค์ • ํŒŒ์ผ๋กœ, ์ฝ”๋“œ ํฌ๋งคํŒ… ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • package.json: package.json ํŒŒ์ผ์€ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๋ฉฐ, npm ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

     

     

    2. main.js ํŒŒ์ผ

    main.js๋Š” Vue.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ( entry point ) ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. Vue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์ด ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐ ์„ค์ •์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. Vue ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํŠน์ • DOM ์š”์†Œ์— ๋งˆ์šดํŠธ( Mount )ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

     

    3. App.vue ํŒŒ์ผ

    App.vue๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์˜ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ฃผ์š” ๊ตฌ์กฐ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

    Vue 3์˜ <script setup>์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๊ฒฐํ•ด์ง‘๋‹ˆ๋‹ค.

     

    <template>
      <div id="app">
        <h1>{{ title }}</h1>
        <MyComponent />
      </div>
    </template>
    
    <script setup>
    import { ref } from 'vue';
    import MyComponent from './components/MyComponent.vue';
    
    const title = ref('Hello Vite + Vue 3!');
    </script>
    
    <style>
    #app {
      font-family: Avenir, Helvetica, Arial, sans-serif;
      text-align: center;
      margin-top: 60px;
    }
    </style>

     

     

    • <template>: ์ปดํฌ๋„ŒํŠธ์˜ HTML ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • <script setup>: ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, Vue์˜ ref, reactive ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • <style>: ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
    ref, reactive๋ž€?

    ref : ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…(๋ฌธ์ž์—ด, ์ˆซ์ž ๋“ฑ)์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.
    reactive : ๊ฐ์ฒด๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” API์ž…๋‹ˆ๋‹ค. reactive๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์†์„ฑ์ด ๋ฐ˜์‘ํ˜•์ด ๋ฉ๋‹ˆ๋‹ค.

     

    // ref
    import { ref } from 'vue';
    
    const count = ref(0); // count๋ณ€์ˆ˜๋ฅผ ๋ฐ˜์‘ํ˜• ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    
    function increment() {
      count.value++; // ๊ฐ’์„ ๋ณ€๊ฒฝ ํ•˜๋ฉด UI์— ์ž๋™ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    }
    
    // reactive
    import { reactive } from 'vue';
    
    const state = reactive({
      count: 0,
      message: 'Hello, Vue!'
    });
    
    function increment() {
      state.count++; // ๊ฐ’์„ ๋ณ€๊ฒฝ ํ•˜๋ฉด UI์— ์ž๋™ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    }

     

    4. Vite์˜ ์—ญํ• 

    Vite๋Š” ๋น ๋ฅธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๋น ๋ฅธ ๋ฒˆ๋“ค๋ง๊ณผ HMR(Hot Module Replacement) ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    • ๋น ๋ฅธ ๋นŒ๋“œ: Vite๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • HMR ์ง€์›: ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ์„ ๋น ๋ฅด๊ฒŒ ๋ฆฌ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

     

    HMR์ด๋ž€?

    ๋ชจ๋“ˆ ๊ต์ฒด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ์„ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
    ์ฃผ๋กœ ์›น ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠนํžˆ Vue.js์™€ Vite์™€ ๊ฐ™์€ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋นŒ๋“œ ๋„๊ตฌ์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

     

Designed by Tistory.