Post

πŸ₯œ [Vue] Vue 에 λŒ€ν•΄ μ•Œμ•„λ³΄μž

ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” Vue.js 에 λŒ€ν•΄ μ€‘μ μ μœΌλ‘œ λ‹€λ£¨λŠ” νŽ˜μ΄μ§€ μž…λ‹ˆλ‹€.

image-01

μ™œ?

Vue 2 의 지원은 2023.12.31 λΆ€λ‘œ 끝이 λ‚˜κΈ°λ„ ν–ˆκ³  ν˜„μž¬ λ‹€λ‹ˆλŠ” νšŒμ‚¬μ—μ„œ Vue λ₯Ό κ°€μž₯ 많이 μ‚¬μš©ν•˜κ³  μžˆμ–΄ λ°°μ›Œλ³΄λ € ν–ˆλ‹€.

ν•˜ν•„ 또 λ‚΄κ°€ μ•ˆμ¨λ³Έ 것 쀑 ν•˜λ‚˜κ°€ Vue 이기에..

Vue λž€?

Vue === View

Vue λŠ” View 와 발음이 μœ μ‚¬ν•˜λ‹€. Vue.js λŠ” Model-View μ—μ„œ View 에 ν•΄λ‹Ήν•˜λŠ”

μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ ˆμž„ μ›Œν¬ 라고 ν•œλ‹€.

κ³΅μ‹λ¬Έμ„œ μ°Έκ³ 

HTML, CSS, JavaScript μœ„μ— ꡬ좕 λ˜λŠ”λ°

νŠΉμ΄ν•˜κ²Œλ„ .vue λΌλŠ” 고유 ν™•μž₯자 λͺ…을 μ‚¬μš©ν•œλ‹€. 이걸 주둜 SFC 라고 λΆ€λ₯Έλ‹€.

SFC (Single File Component)

μƒνƒœκ°€ λ³€κ²½ 될 λ•Œ HTML 을 μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈ ν•˜λ©°

μ΄λ•Œ λ³€κ²½ 된 μ—…λ°μ΄νŠΈλ₯Ό 트리거 ν•  수 μžˆλŠ” μƒνƒœλ₯Ό λ°˜μ‘ν˜•μ΄λΌκ³  함

이제 ν•΄λ‹Ήν•˜λŠ” Vue 의 νŠΉμ§• 쀑 SFC λ₯Ό λ¨Όμ € κ°„λž΅νžˆ μ•Œμ•„λ³΄μž


SFC (μ‹±κΈ€ 파일 μ»΄ν¬λ„ŒνŠΈ)

λΉŒλ“œ 도ꡬλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ Vue ν”„λ‘œμ νŠΈμ—μ„œλŠ” HTML κ³Ό μœ μ‚¬ν•œ SFC 파일 ν˜•μ‹μ„ μ‚¬μš©ν•˜λ©°

μ»΄ν¬λ„ŒνŠΈμ˜ 논리 (JS)

ν…œν”Œλ¦Ώ (HTML)

μŠ€νƒ€μΌ (CSS)

을 ν•œ 곳에 λ¬Άμ–΄ μΊ‘μŠν™” ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- vue μ΄μ§€λ§Œ rouge κ°€ vue λ₯Ό μΈμ‹ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ -->
<!-- highlight λ₯Ό html 으둜 λŒ€μ²΄ -->

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

<template>
  <button @click="count++">Count is: 9</button>
</template>

<style scoped>
.button {
  font-weight: bold;
}
</style>


ν”„λ‘œκ·Έλ ˆμ‹œλΈŒ ν”„λ ˆμž„μ›Œν¬

Vue λŠ” ν”„λ‘ νŠΈμ•€λ“œ κ°œλ°œμ— 주둜 μ‚¬μš©ν•˜λŠ” β€˜ν”„λ ˆμž„μ›Œν¬β€™ 쀑 ν•˜λ‚˜λ‹€.

ν•˜μ§€λ§Œ 웹은 맀우 λ‹€μ–‘ν•˜κ³  κ΅¬μΆ•ν•˜λ €λŠ” κ²ƒμ˜ ν˜•νƒœμ™€ 규λͺ¨κ°€ λ‹€ λ‹€λ₯Ό 수 μžˆλ‹€.

κ·Έλž˜μ„œ Vue λŠ” 처음 섀계 될 λ•ŒλΆ€ν„° 쑰금 더 μœ μ—°ν•œ λ°©λ²•μœΌλ‘œ μ„€κ³„λ˜μ—ˆλ‹€κ³  ν•œλ‹€.

  • λΉŒλ“œ κ³Όμ • 없이 정적 HTML 에 적용
  • λͺ¨λ“  νŽ˜μ΄μ§€μ— μ›Ή μ»΄ν¬λ„ŒνŠΈλ‘œ μΆ”κ°€
  • SPA
  • SSR
  • SSG (정적 μ‚¬μ΄νŠΈ 생성)

λ“± μ—¬λŸ¬ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ©° 이런 νŠΉμ„±μ„ ν™œμš©ν•΄ Vue λŠ” μ–΄λ–€ ν™˜κ²½μ—μ„œλ„ 졜적의

방법을 μ„ νƒν•˜λ©΄μ„œ 같은 생산성을 μœ μ§€ ν•  수 μžˆλ‹€κ³  ν•œλ‹€.


API μŠ€νƒ€μΌ

Vue λŠ” Optional API 와 Comoposition API 으둜 API μŠ€νƒ€μΌμ„ 두 κ°€μ§€λ‘œ μž‘μ„± ν•  수 μžˆλ‹€κ³  ν•œλ‹€.

각각의 μŠ€νƒ€μΌμ—λŠ” νŠΉμ§•μ΄ μžˆλŠ”λ° ν•œλ²ˆ μ•Œμ•„λ³΄μž


Optional API

data, methods, mounted 같은 객체λ₯Ό μ‚¬μš©ν•˜λ©° μ»΄ν¬λ„ŒνŠΈμ˜ λ‘œμ§μ„ μ •μ˜ν•¨

μ˜΅μ…˜μœΌλ‘œ μ •μ˜λœ 속성은 μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” ν•¨μˆ˜ λ‚΄λΆ€μ˜ this 에 λ…ΈμΆœμ΄ 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<script>
export default {
  // data()μ—μ„œ λ°˜ν™˜λœ 속성듀은 λ°˜μ‘μ μΈ μƒνƒœκ°€ λ˜μ–΄
  // `this`에 λ…ΈμΆœλ©λ‹ˆλ‹€.
  data() {
    return {
      count: 0
    }
  },

  // methodsλŠ” 속성 값을 λ³€κ²½ν•˜κ³  μ—…λ°μ΄νŠΈ ν•  수 μžˆλŠ” ν•¨μˆ˜.
  // ν…œν”Œλ¦Ώ λ‚΄μ—μ„œ 이벀트 ν—¨λ“€λŸ¬λ‘œ 바인딩 될 수 있음.
  methods: {
    increment() {
      this.count++
    }
  },

  // 생λͺ…μ£ΌκΈ° ν›…(Lifecycle hooks)은 μ»΄ν¬λ„ŒνŠΈ 생λͺ…μ£ΌκΈ°μ˜
  // μ—¬λŸ¬ λ‹¨κ³„μ—μ„œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  // 이 ν•¨μˆ˜λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ 마운트 된 ν›„ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  mounted() {
    console.log(`숫자 μ„ΈκΈ°μ˜ μ΄ˆκΈ°κ°’μ€ ${ this.count } μž…λ‹ˆλ‹€.`)
  }
}
</script>

<template>
  <button @click="increment">숫자 μ„ΈκΈ°: 9</button>
</template>


Composition API

import ν•΄μ„œ κ°€μ Έμ˜¨ api ν•¨μˆ˜λ“€μ„ μ‚¬μš©ν•˜λ©° μ»΄ν¬λ„ŒνŠΈμ˜ λ‘œμ§μ„ μ •μ˜

SFC μ—μ„œ Composition API λŠ” 주둜 <script setup> κ³Ό ν•¨κ»˜ μ‚¬μš©ν•¨

setup 속성을 톡해 Vue κ°€ μ’€ 더 적은 λ¬Έλ§₯의 μ½”λ“œλ‘œ composition API λ₯Ό μ‚¬μš©ν•˜κ³ 

μ˜λ„ν•œ λŒ€λ‘œ 컴파일 λ™μž‘ ν•  수 μžˆλ„λ‘ ν•˜λŠ” μ½”λ“œ 힌트 쀑 ν•˜λ‚˜

<script setup> 에 import λ˜μ–΄ κ°€μ Έμ˜¨ 객체듀과 μ„ μ–Έ 된 μ΅œμƒμœ„ λ³€μˆ˜ 및 ν•¨μˆ˜λŠ”

ν…œν”Œλ¦Ώμ—μ„œ 직접 μ‚¬μš©ν•  수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script setup>
import { ref, onMounted } from 'vue'

// λ°˜μ‘μ μΈ μƒνƒœμ˜ 속성
const count = ref(0)

// 속성 값을 λ³€κ²½ν•˜κ³  μ—…λ°μ΄νŠΈ ν•  수 μžˆλŠ” ν•¨μˆ˜.
function increment() {
  count.value++
}

// 생λͺ… μ£ΌκΈ° ν›…
onMounted(() => {
  console.log(`숫자 μ„ΈκΈ°μ˜ μ΄ˆκΈ°κ°’μ€ ${ count.value } μž…λ‹ˆλ‹€.`)
})
</script>

<template>
  <button @click="increment">숫자 μ„ΈκΈ°: 9</button>
</template>

그럼 뭘 μ„ νƒν•˜λΌλŠ”κ±°μ•Ό?

두 API λͺ¨λ‘ 일반적인 μ‚¬μš©ν™˜κ²½μ—μ„œ μ •μƒμ μœΌλ‘œ μ™„λ²½ν•˜κ²Œ λ‹€λ£° 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 두 가지가 μžˆμ–΄ λ§Žμ΄λ“€ κ³ λ―Όν•˜κ³  무엇을 μ„ νƒν•΄μ•Όν•˜λŠ”μ§€ μƒκ°ν•˜κ²Œ λœλ‹€.

그럼 뭘 ν•˜λΌλŠ”κ±°μ•Ό?

ν•˜μ§€λ§Œ μ˜΅μ…˜ API λŠ” μ»΄ν¬μ§€μ…˜ API μœ„μ— μ˜¬λΌκ°„λ‹€.

Optional API

일반적으둜 OOP μ–Έμ–΄μ˜ 배경을 가진 μ‚¬μš©μžλ₯Ό μœ„ν•œ Class 기반 λͺ¨λΈκ³Ό 더 잘 λ§žλŠ”

μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€ (this κ°œλ…) 을 μ€‘μ‹¬μœΌλ‘œ ν•˜λ©° λ°˜μ‘ν˜• μ„ΈλΆ€ 사항을 좔상화 ν•˜κ³ 

μ˜΅μ…˜ 그룹을 톡해 μ½”λ“œ ꡬ쑰λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ΄ˆλ³΄μžμ—κ²Œ μΉœμˆ™

Composition API

ν•¨μˆ˜ λ²”μœ„μ—μ„œ 직접 λ°˜μ‘ν˜• λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  λ³΅μž‘μ„±μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ν•¨μˆ˜μ˜ μƒνƒœλ₯Ό

ν•¨κ²Œ κ΅¬μ„±ν•˜λŠ”λ° 쀑점을 λ‘‘λ‹ˆλ‹€. 보닀 더 자유둜운 ν˜•μ‹μ΄λ©° Vue μ—μ„œ λ°˜μ‘ν˜•μ΄ 효과적으둜

μ‚¬μš©ν•˜λŠ” 방식에 λŒ€ν•΄ 이해λ₯Ό ν•΄μ•Ό ν•  ν•„μš”κ°€ 있음. μ’€ 더 μœ μ—°ν•˜κ³  λ‘œμ§μ„ κ΅¬μ„±ν•˜κ³ 

μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•œ 보닀 κ°•λ ₯ν•œ νŒ¨ν„΄μ„ κ°€λŠ₯ν•˜κ²Œ 함

κ·Έλƒ₯ μžκΈ°ν•œν…Œ λ§žλŠ”κ±° μ‚¬μš©ν•˜μž


마치며

Vue 에 λŒ€ν•΄ κ°„λž΅ν•˜κ²Œ 큰 νŠΉμ§•μ„ κΈ°μ€€μœΌλ‘œ μ•Œμ•„λ³΄μ•˜λ‹€.

λ‹€μŒ ν¬μŠ€νŠΈμ—μ„œλŠ” Vue 의 μ‚¬μš© 방법과 Vue 의 λ™μž‘ 방식을 κΈ°μ€€μœΌλ‘œ μ•Œμ•„λ³΄μž.

또 λ‹€μ‹œ μƒˆλ‘œμš΄ κ±Έ 배우렀 ν•˜λ‹ˆ 머리가 μ•„νŒ λ‹€β€¦

ν•˜μ§€λ§Œ 곡뢀λ₯Ό ν•΄μ•Όλ§Œ ν•˜λŠ” 직업이기에 버텨야지

This post is licensed under CC BY 4.0 by the author.