43. Creating Components

npm create vue@latest


์ด์ œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•  ๋•Œ src ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ๋ช‡ ๊ฐ€์ง€ ์‹œ์ž‘ ํŒŒ์ผ๋“ค์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ํŒŒ์ผ๋“ค์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์— ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ •๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์šฐ์„  components์™€ assets ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋“ค์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ App ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ์•ˆ์˜ ์Šคํƒ€์ผ ๋ธ”๋ก์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ์— CSS๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
์Šคํƒ€์ผ์ด ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋„ Vue๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฝํŠธ์™€ ํ…œํ”Œ๋ฆฟ ๋ธ”๋ก ๋‚ด์˜ ์ฝ”๋“œ๋„ ๊ฐ„์†Œํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฝํŠธ ๋ธ”๋ก์—์„œ setup ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
์ด ์†์„ฑ์€ ๊ตฌ์„ฑ API์˜ ์ถ•์•ฝ ๋ฌธ๋ฒ•์ด์ง€๋งŒ, ํŠน๋ณ„ํžˆ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด ์„น์…˜์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹จ์ผ ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ(SFC)๊ฐ€ ์œ ํšจํ•˜๋ ค๋ฉด ์ตœ์†Œํ•œ ํ…œํ”Œ๋ฆฟ ๋ธ”๋ก์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ํ…œํ”Œ๋ฆฟ์—๋Š” ์ตœ์†Œ ํ•˜๋‚˜์˜ ๋ฃจํŠธ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.(vue3์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฃจํŠธ ์š”์†Œ๊ฐ€ ๊ผญ ํ•„์š”ํ•˜์ง„ ์•Š๋‹ค.)
ํ…œํ”Œ๋ฆฟ์—์„œ ๊ฐ„๋‹จํ•œ ์ธ์‚ฌ๋ง์„ ๋‹ด์€ ๋ฌธ๋‹จ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฝํŠธ ๋ธ”๋ก์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ์„ค์ •์„ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฐ์ฒด์—๋Š” data, methods, computed, watch ๋“ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ์— ์ด๋ฆ„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋””๋ฒ„๊น…์— ์œ ์šฉํ•˜๋ฉฐ Vue ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ํ•จ์ˆ˜ ์•ˆ์— message๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๊ณ , ํ…œํ”Œ๋ฆฟ์—์„œ message ํ‘œํ˜„์‹์œผ๋กœ ์ •์  ํ…์ŠคํŠธ๋ฅผ ๋Œ€์ฒดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ npm run dev ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ , ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ฑ์„ ๋ฏธ๋ฆฌ๋ณด๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋“ค์€ ์ปดํฌ๋„ŒํŠธ์—๋„ ์—ฌ์ „ํžˆ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ฃผ๋œ ์ฐจ์ด์ ์€ ๋กœ์ง์˜ ๋ถ„๋ฆฌ๊ฐ€ ๋” ์ž˜ ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ…œํ”Œ๋ฆฟ์— ๊ตฌ๋ฌธ ๊ฐ•์กฐ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์„ ๋•Œ ์ปดํฌ๋„ŒํŠธ ์ž‘์—…์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.
Vue ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด๋ฉด, name ์†์„ฑ์— ์ง€์ •ํ•œ ์ด๋ฆ„์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋Š” ๋•Œ๋•Œ๋กœ ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ '์ต๋ช…'์œผ๋กœ ํ‘œ์‹œํ•˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฆ„์„ ํ• ๋‹นํ•˜๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฆ„์„ ์†Œ๋ฌธ์ž๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

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

App.vue
<script>
  export default {
    data() {
      return {
        msg: 'Hello World'
      }
    }
  }
</script>

<template>
  <p>{{ msg }}</p>
</template>

App.vue
<script>
  export default {
    name: 'App',
    data() {
      return {
        msg: 'Hello World'
      }
    }
  }
</script>

<template>
  <p>{{ msg }}</p>
</template>