# Lifecycle API Vue 3

๋ผ์ดํ”„์‚ฌ์ดํด(Lifecycle) API๋ž€ ์ปดํฌ์ง€์…˜(Composition API)์—์„œ ์‚ฌ์šฉ๋œ ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ปดํฌ์ง€์…˜์—์„œ ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฉ์–ด์ •๋ฆฌ

  • ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›… : ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช… ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ํŠน์ • ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ ํ•จ์ˆ˜. created(), beforeMount() ๋“ฑ
  • ๋ผ์ดํ”„์‚ฌ์ดํด API : ์ปดํฌ์ง€์…˜ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋œ ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…

# ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ž€? Vue 2Vue 3

์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ž€ ๋ทฐ ์ธ์Šคํ„ด์Šค(์ปดํฌ๋„ŒํŠธ) ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธ๋˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์˜๋ฏธํ•˜๋Š”๋ฐ์š”. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด์€ created, beforeMount, mounted ๋“ฑ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์œผ๋กœ ์ถ”๊ฐ€ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<template>
  <h1>์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…</h1>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello'
    }
  },
  created() {
    console.log(this.message);
  }
}
</script>

์œ„ ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž message ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. created ๋ผ๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•œ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ์ด์™ธ์—๋„ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ์…‹์—…ํ•˜๋Š” ๋“ฑ์˜ ์ถ”๊ฐ€ ๋กœ์ง์„ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์— ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# Lifecycle API ์†Œ๊ฐœ Vue 3

๋ผ์ดํ”„์‚ฌ์ดํด API๋Š” ์ปดํฌ์ง€์…˜ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋œ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์ด ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์Šคํ„ด์Šค ์˜ต์…˜ ์†์„ฑ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋œ๊ฑฐ์— ๋ฐ˜ํ•ด ๋ณ„๋„์˜ API๋ฅผ ์ž„ํฌํŠธํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<script>
export default {
  // ์ธ์Šคํ„ด์Šค ์˜ต์…˜ ์†์„ฑ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋œ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…
  created() {},
  beforeMount() {},
  mounted() {},
  destroyed() {}
}
</script>

์ด๋ฒˆ์—” ๋ผ์ดํ”„์‚ฌ์ดํด API์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    // data
    const message = ref('Hello');

    // lifecycle API
    onMounted(() => {
      console.log(message.value);
    });
  }
} 
</script>

์œ„ ์ฝ”๋“œ๋Š” onMounted๋ผ๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด API๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ(๋ถ€์ฐฉ)๋˜์—ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†” ์ฐฝ์— message ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. message์˜ ์ดˆ๊ธฐ ๊ฐ’์ด Hello๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Hello๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ผ์ดํ”„์‚ฌ์ดํด API๋Š” setup() ํ•จ์ˆ˜ ์•ˆ์—์„œ onXX ํ˜•ํƒœ๋กœ API๋ฅผ ์ž„ํฌํŠธํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…๊ณผ Lifecycle API์˜ ์ฐจ์ด์ 

์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…๊ณผ ๋ผ์ดํ”„์‚ฌ์ดํด API๋Š” ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์‚ด์ง ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ผ๋Š” ๋ง์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ, API๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ผ๋Š” ๊ฑธ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์€ ์•„๋ž˜์™€ ๊ฐ™์ด created() ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด์— ๋ผ์ดํ”„์‚ฌ์ดํด API๋Š” onCreated()์™€ ๊ฐ™์€ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

<script>
export default {
  // ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…
  created() {}, // O
  
  // ๋ผ์ดํ”„์‚ฌ์ดํด API
  setup() {
    onCreated(() => {}) // X - ์ด API๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ
  }
}
</script>

์œ„์™€ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” setup() ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ์  ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. setup() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด ๊ธฐ์กด์˜ beforeCreate(), created()๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ๊ณผ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธํ•  ๋‚ด์šฉ๋“ค์€ ๋ชจ๋‘ setup() ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<script>
export default {
  beforeCreate() {
    console.log('API ํ˜ธ์ถœ ์ „');
  },
  created() {
    axios.get('users/1').then(res => console.log(res));
  },
}
</script>
<script>
export default {
  setup() {
    console.log('API ํ˜ธ์ถœ ์ „');
    axios.get('users/1').then(res => console.log(res));
  }
}
</script>

์ด์ฒ˜๋Ÿผ onBeforeCreate, onCreate๊ฐ€ ์—†๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด API ์ด๋ฆ„์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›… ๋ผ์ดํ”„์‚ฌ์ดํด API ๋น„๊ณ 
beforeCreate X ๋Œ€์‹  setup() ์‚ฌ์šฉ
created X ๋Œ€์‹  setup() ์‚ฌ์šฉ
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeDestroy onBeforeUnmount destory ๋ผ๋Š” ํ‘œํ˜„์ด unmount๋กœ ๋ณ€๊ฒฝ๋จ
destroyed onUnmounted destory ๋ผ๋Š” ํ‘œํ˜„์ด unmount๋กœ ๋ณ€๊ฒฝ๋จ
errorCaptured onErrorCaptured

์œ„ ํ‘œ๋ฅผ ๋ณด๋ฉด ์ „๋ฐ˜์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” API๋Š” ๋™์ผํ•˜์ง€๋งŒ ์•„๋ž˜ 3๊ฐ€์ง€๊ฐ€ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

  • beforeCreate, created ๋Œ€์‹ ์— setup() ์„ ์‚ฌ์šฉ
  • onXX ํ˜•ํƒœ๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€ ์ 
  • beforeDestory, destroyed ๋“ฑ destory ๋Œ€์‹ ์— onBeforeUnmount, onUnmounted๋ฅผ ์‚ฌ์šฉ