Frontend/Vue

Make Your Components Easier to Think About (์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ๋” ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ)

Seyun(Marco) 2024. 9. 15. 21:20
728x90

๐Ÿ’ก์›๋ณธ๊ธ€ : https://michaelnthiessen.com/make-your-components-easier-to-think-about

 

Make Your Components Easier to Think About

I hate thinking. Well, actually, I *love* thinking, but only when Iโ€™m able to solve problems or make progress with it. But often our code gets in the way of this.

michaelnthiessen.com

 

๋‚˜๋Š” ์ƒ๊ฐํ•˜๋Š”๊ฑธ ์‹ซ์–ดํ•œ๋‹ค.

์‚ฌ์‹ค ์ €๋Š” ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ์ง„์ „์„ ์ด๋ฃฐ์ˆ˜ ์žˆ์„๋•Œ๋งŒ ์ƒ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ข…์ข… ์ฝ”๋“œ๊ฐ€ ์ด๋ฅผ ๋ฐฉํ•ดํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์›Œํฌ์ˆ ์ฐธ์„์ž๊ฐ€ ์ฝ”๋“œ ์ฝ๊ธฐ์— ๋Œ€ํ•ด ๋งํ–ˆ๋“ฏ์ด โ€œ๋งŒ์•ฝ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋ฉด ๋„ˆ์˜ ์ž˜๋ชป์ด ์•„๋‹™๋‹ˆ๋‹ค.โ€ ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜์—ฌ ํ˜ผ๋ž€์„ ์ค„์ด๊ณ  ์‹ค์ œ ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ

์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์˜๋„(intention)์™€ ๊ตฌํ˜„(implementation)์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„์„ ํ•ด๋‹น ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์‹ค์ œ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

<template>
  <div>
    <p>{{ user.name }} ({{ user.age }})</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const user = ref({
  name: 'John Doe',
  age: 28,
});
</script>

UserInfo ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ถœํ•˜๋ฉด ์ด ํ•œ ์ค„์ด ํ•˜๋Š” ์ผ์ธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

<template>
  <div>
    <UserInfo :user="user" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import UserInfo from './UserInfo.vue';

const user = ref({
  name: 'John Doe',
  age: 28,
});
</script>

์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<template>
  <p>{{ user.name }} ({{ user.age }})</p>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  user: Object,
});
</script>

๋ฆฌํŒฉํ† ๋งํ•œ ์ฝ”๋“œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ UserInfo ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“ˆํ™”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” ์ข€๋” ์ฝ๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ด๋ฉฐ, ์ด์ ์€ ์ ์Šต๋‹ˆ๋‹ค. ๋” ๊ธธ๊ณ  ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ถœํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ self-documenting code(์Šค์Šค๋กœ ๋ฌธ์„œํ™”๋œ ์ฝ”๋“œ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ํ•œ ์˜ˆ์‹œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ Clean Components Toolkit์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒจํ„ด, ๊ธฐ์ˆ  ๋ฐ ์›์น™์€ โ€œ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ์„ค๋ช…์ ์œผ๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ์„๊นŒ?โ€๋ผ๋Š” ์งˆ๋ฌธ์„ ๋˜์ง‘๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ฝ”๋“œ๋ฅผ ๋œ ์„ค๋ช…์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค๋ฉด ์ข‹์€ ํŒจํ„ด์ด ์•„๋‹ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ self-documenting code(์Šค์Šค๋กœ ๋ฌธ์„œํ™”๋œ ์ฝ”๋“œ)๋Š” ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ์„ธ๋ถ„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข€ ๋” self-documenting code(์Šค์Šค๋กœ ๋ฌธ์„œํ™”๋œ ์ฝ”๋“œ)๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ

Vue ์ปดํฌ๋„ŒํŠธ์—๋Š” props, data, computed ์†์„ฑ, methods, ๋ผ์ด๋ธŒ์‚ฌ์ดํด hooks ๋“ฑ๋“ฑ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ณ  ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ๊ฐ€ ์ ์ ˆํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ, ์„œ์‹(formatting), ๋“œ๋ฌธ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒด๊ณ„์ ์ด๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ์˜ ์ฝ”๋“œ๊ฐ€ self-documenting(์Šค์Šค๋กœ ๋ฌธ์„œํ™”๋œ ์ฝ”๋“œ) ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ์˜๋„๋ฅผ ์•Œ๋ฆฌ๋Š”๋ฐ ๋„์›€๋ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฌด๋‹ˆ์—†๋Š” ์˜ˆ์‹œ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ(๋ˆ„๊ฐ€ ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์–ด์š”?) ์ฝ”๋“œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ฃ .

<template>
  <div>
    <button @click="c">Increment</button>
    <p>{{ a }}</p>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';

const a = ref(0);

function c() {
  a.value++;
}
</script>

๋งž์Šต๋‹ˆ๋‹ค. counter ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋ณด์ž๋งˆ์ž ๋ฌด์—‡์ธ์ง€ ์ฆ‰์‹œ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template>
  <div>
    <button @click="incrementCounter">Increment</button>
    <p>{{ counterValue }}</p>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';

const counterValue = ref(0);

function incrementCounter() {
  counterValue.value++;
}
</script>

๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ์—์„œ๋Š” ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ์•„์˜ฌ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„๊ณผ ์ •์‹ ์  ์—๋„ˆ์ง€๋ฅผ ๋‚ญ๋น„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๊ธด ์ปดํฌ๋„ŒํŠธ ๋ถ„ํ• ํ•˜๊ธฐ

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

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
    <ul>
      <li v-for="item in items" :key="item.id">
        {{ item.name }} - {{ item.price }}
        <button @click="addToCart(item)">Add to cart</button>
      </li>
    </ul>
    <div>
      <h2>Cart</h2>
      <ul>
        <li v-for="item in cart" :key="item.id">
          {{ item.name }} - {{ item.price }}
          <button @click="removeFromCart(item)">Remove</button>
        </li>
      </ul>
      <p>Total: {{ totalPrice }}</p>
    </div>
  </div>
</template>

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

const title = ref('My Store');
const description = ref('Welcome to my store!');

const items = ref([
  { id: 1, name: 'Item A', price: 10 },
  { id: 2, name: 'Item B', price: 20 },
]);

const cart = ref([]);

function addToCart(item) {
  cart.value.push(item);
}

function removeFromCart(item) {
  const index = cart.value.indexOf(item);
  if (index !== -1) {
    cart.value.splice(index, 1);
  }
}

const totalPrice = computed(() => {
  return cart.value.reduce((sum, item) => sum + item.price, 0);
});
</script>

์ด๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” Clean Components Toolkit์˜ ์ปดํฌ๋„ŒํŠธ ๊ฒฝ๊ณ„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ์— ์ด๋ฏธ ์ •์˜๋œ ๊ฒฝ๊ณ„๊ฐ€ ์žˆ์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ฐพ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํ…œํ”Œ๋ฆฟ์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • StoreHeader
  • ItemList
  • Cart
<template>
  <div>
    <!-- StoreHeader -->
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>

    <!-- ItemList -->
    <ul>
      <li v-for="item in items" :key="item.id">
        {{ item.name }} - {{ item.price }}
        <button @click="addToCart(item)">Add to cart</button>
      </li>
    </ul>

    <!-- Cart -->
    <div>
      <h2>Cart</h2>
      <ul>
        <li v-for="item in cart" :key="item.id">
          {{ item.name }} - {{ item.price }}
          <button @click="removeFromCart(item)">Remove</button>
        </li>
      </ul>
      <p>Total: {{ totalPrice }}</p>
    </div>
  </div>
</template>

์ƒˆ๋กญ๊ณ  ๊ฐ„์†Œํ™”๋œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template>
  <div>
    <StoreHeader :title="title" :description="description" />
    <ItemList :items="items" @addToCart="addToCart" />
    <Cart :cart="cart" @removeFromCart="removeFromCart" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import StoreHeader from './StoreHeader.vue';
import ItemList from './ItemList.vue';
import Cart from './Cart.vue';

const title = ref('My Store');
const description = ref('Welcome to my store!');

const items = ref([
  { id: 1, name: 'Item A', price: 10 },
  { id: 2, name: 'Item B', price: 20 },
]);

const cart = ref([]);

function addToCart(item) {
  cart.value.push(item);
}

function removeFromCart(item) {
  const index = cart.value.indexOf(item);
  if (index !== -1) {
    cart.value.splice(index, 1);
  }
}
</script>

 

StoreHeader ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
  </div>
</template>

<script setup>
const props = defineProps({
  title: String,
  description: String,
});
</script>

ItemList ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      {{ item.name }} - {{ item.price }}
      <button @click="$emit('addToCart', item)">Add to cart</button>
    </li>
  </ul>
</template>
<script setup>
const props = defineProps({
  items: Array,
});
</script>

Cart ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

<template>
  <div>
    <h2>Cart</h2>
    <ul>
      <li v-for="item in cart" :key="item.id">
        {{ item.name }} - {{ item.price }}
        <button @click="$emit('removeFromCart', item)">Remove</button>
      </li>
    </ul>
    <p>Total: {{ totalPrice }}</p>
  </div>
</template>

<script setup>
import { defineProps, computed } from 'vue';

const props = defineProps({
  cart: Array,
});

const totalPrice = computed(() => {
  return props.cart.reduce((sum, item) => sum + item.price, 0);
});
</script>

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

๊ฐ€์žฅ ๋ฉ์ฒญํ•˜๊ณ , ๊ฐ€์žฅ ์ขŒ์ ˆํ•˜๊ณ , ๊ฐ€์žฅ ํ”ผ๊ณคํ•œ ์ž๊ธฐ์ž์‹ ์„ ์œ„ํ•ด. ์ตœ์ ํ™” ํ•˜์„ธ์š”.

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

๊ฒฐ๋ก 

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

728x90
728x90