Vue.js 를 배워보자

상태? 상태관리?

_Blue_Sky_ 2024. 11. 23. 10:45
728x90
728x90

상태를 관리하는 이유는 애플리케이션의 데이터 일관성과 유지보수성을 높이기 위해서입니다. 더 구체적으로 살펴보겠습니다.


1. 상태(state)란 무엇인가?

  • 상태는 애플리케이션의 현재 데이터와 상태를 나타내는 값입니다.
  • 예를 들어:
    • 쇼핑몰: 장바구니에 담긴 상품, 사용자 로그인 상태, 상품 목록.
    • 채팅 앱: 현재 접속 중인 사용자, 메시지 내용, 읽음 상태.
    • 게임: 플레이어의 점수, 레벨, 체력.

상태의 종류

  1. 로컬 상태
    • 특정 컴포넌트 안에서만 필요한 데이터.
    • 예: 버튼 클릭 여부, 모달 열림/닫힘 상태.
  2. 공유 상태
    • 여러 컴포넌트가 동시에 사용하는 데이터.
    • 예: 사용자 로그인 정보, 장바구니 항목.

2. 왜 상태를 관리해야 하나?

현대 웹 애플리케이션에서는 다양한 컴포넌트가 서로 연결되고 데이터를 공유해야 하기 때문에 상태를 체계적으로 관리하지 않으면 문제가 발생합니다.

1) 데이터 일관성 유지

  • 컴포넌트가 많아질수록 데이터 동기화 문제가 발생합니다.
  • 예:
    • 사용자 정보가 변경되었을 때, 화면의 모든 관련 부분(헤더, 대시보드, 프로필 페이지)이 즉시 업데이트되어야 합니다.
    • 중앙에서 상태를 관리하면 이러한 데이터를 동기화하는 작업이 쉬워집니다.

2) 코드 유지보수성 향상

  • 상태 관리가 없는 경우:
    • 데이터를 컴포넌트 간에 전달하기 위해 부모-자식 관계를 따라 props와 events를 계속 사용해야 합니다.
    • 규모가 커질수록 데이터를 추적하기 어렵고, 수정 시 부작용이 발생할 가능성이 높습니다.
  • 상태 관리 도구(Vuex, Pinia 등)를 사용하면:
    • 모든 상태를 한곳에서 관리하여 수정과 추적이 용이해집니다.
    • 상태 변경 로직이 중앙화되어 버그 발생 가능성이 줄어듭니다.

3) 복잡한 데이터 흐름 처리

  • 상태를 중앙에서 관리하지 않으면, 데이터를 전달하거나 공유하는 과정이 복잡해집니다.
  • 예:
    • 컴포넌트 A → B → C로 데이터를 전달해야 하는 경우, 상태 관리 도구를 사용하면 직접 A ↔ C로 데이터를 전달할 수 있습니다.

3. 상태 관리를 안 하면 어떤 문제가 생기나요?

1) 데이터 불일치

  • 여러 컴포넌트에서 데이터를 따로 관리하면 서로 다른 값을 가지게 될 수 있습니다.
  • 예: A 컴포넌트에서는 사용자 이름이 John인데, B 컴포넌트에서는 여전히 Jane으로 보이는 상황.

2) 디버깅이 어려움

  • 상태 변경이 여러 군데에서 이루어지면, 어떤 코드가 상태를 변경했는지 추적하기가 매우 어렵습니다.

3) 비효율적인 데이터 전달

  • 부모-자식 관계를 따라 불필요한 데이터 전달이 발생합니다.
  • 예: 부모에서 자식으로, 다시 자식의 자식으로 전달하는 과정에서 코드가 복잡해지고 오류가 발생할 가능성이 높아집니다.

4. 상태 관리를 통해 얻는 이점

1) 단일 진실의 원천 (Single Source of Truth)

  • 모든 상태를 중앙에서 관리하면, 상태를 변경하거나 읽는 곳이 명확해집니다.
  • Vuex에서는 state가 단일 진실의 원천 역할을 합니다.

2) 데이터 흐름 추적 가능

  • Vuex는 상태 변경 과정(누가, 언제, 어떤 데이터를 변경했는지)을 기록하기 때문에, 디버깅과 로깅이 쉽습니다.

3) 반응성

  • Vue의 반응성 시스템 덕분에 상태가 변경되면, 이를 사용하는 모든 컴포넌트가 자동으로 업데이트됩니다.
  • 개발자는 상태가 변경될 때 수동으로 UI를 업데이트할 필요가 없습니다.

5. 간단한 비유

상태 관리를 하지 않는 경우

  • 상태를 관리하지 않으면 마치 "메모를 아무 데나 흩어놓고 필요한 정보를 찾으려는 상황"과 비슷합니다.
    • 어떤 컴포넌트가 어떤 데이터를 사용하고 변경했는지 알기 어렵습니다.

상태 관리를 하는 경우

  • 상태 관리 도구(Vuex 등)를 사용하면 마치 "중앙 노트에 모든 중요한 정보를 적어놓고 필요한 곳에서 읽고 수정하는 상황"과 같습니다.
    • 모든 데이터가 중앙에 정리되어 있어, 데이터를 변경하거나 읽는 과정을 명확히 할 수 있습니다.

 

상태 관리는 현대 웹 애플리케이션의 복잡성을 줄이고, 데이터를 일관성 있게 유지하며, 코드의 유지보수성을 높이는 데 필수적입니다. 특히 여러 컴포넌트가 데이터를 공유하거나, 비동기 작업(API 호출 등)이 많아질수록 상태 관리는 더욱 중요해집니다.


질문 : 왜 +1을 하지 토글도 있잖아?

 

좋은 질문입니다! 상태 관리를 이야기할 때, 상태를 단순히 +1처럼 증가시키는 것만 다루는 것은 아니라는 점을 이해하는 것이 중요합니다. Vuex에서 +1은 단순한 예제로, 상태를 변경하는 방법을 보여주기 위한 것입니다. 실제 애플리케이션에서는 다양한 형태로 상태를 업데이트합니다.


1. 왜 예제에서 +1을 사용하나요?

+1은 Vuex의 상태 변경 흐름을 학습하기 위한 가장 간단한 사례입니다.

  • 상태(state): count라는 숫자 값.
  • 변경(mutation): state.count를 증가시킴.
  • 사용 시나리오:
    • 클릭 카운터: 사용자가 버튼을 누른 횟수.
    • 페이지 뷰: 페이지가 로드된 횟수.
    • 게임 점수: 플레이어 점수 증가.

하지만 이는 Vuex의 기능을 단순화한 예제일 뿐, 실제 애플리케이션에서는 상태를 업데이트하는 다양한 방식(토글, 값 대체 등)이 필요합니다.


2. 토글(toggle) 같은 상태 변경도 가능할까?

물론 가능합니다! Vuex는 상태를 어떻게 변경할지 개발자가 원하는 로직에 따라 설정할 수 있습니다. 아래는 토글(toggle) 예제입니다.

토글 상태 관리 예제

// store.js
export const store = new Vuex.Store({
  state: {
    isVisible: false, // 토글 상태
  },
  mutations: {
    toggleVisibility(state) {
      state.isVisible = !state.isVisible; // 현재 상태를 반전시킴
    },
  },
  actions: {
    toggleVisibilityAsync({ commit }) {
      setTimeout(() => {
        commit('toggleVisibility');
      }, 1000); // 1초 후 비동기로 토글 상태 변경
    },
  },
});

컴포넌트에서 사용하기

<template>
  <div>
    <p>상태: {{ isVisible ? '보임' : '숨김' }}</p>
    <button @click="toggleVisibility">즉시 토글</button>
    <button @click="toggleVisibilityAsync">1초 후 토글</button>
  </div>
</template>

<script>
import { mapState, mapMutations, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState(['isVisible']), // isVisible 상태를 가져옴
  },
  methods: {
    ...mapMutations(['toggleVisibility']), // 동기적으로 상태 변경
    ...mapActions(['toggleVisibilityAsync']), // 비동기로 상태 변경
  },
};
</script>

3. 다양한 상태 업데이트의 사례

Vuex에서 +1은 단순히 하나의 상태 변경 방식일 뿐입니다. 실제 애플리케이션에서는 다양한 패턴이 필요합니다.

1) 토글(toggle)

  • 상태: isVisible(true/false)
  • 변경 로직: true → false 또는 false → true

2) 값 대체(assign)

  • 상태: 사용자 정보(user: { name: '', age: 0 })
  • 변경 로직: 특정 값을 새 값으로 대체
    mutations: {
      setUser(state, payload) {
        state.user = payload;
      },
    }
    

3) 리스트 추가 및 삭제

  • 상태: items: [] (리스트)
  • 변경 로직: 새 항목 추가 또는 특정 항목 삭제
    mutations: {
      addItem(state, item) {
        state.items.push(item);
      },
      removeItem(state, index) {
        state.items.splice(index, 1);
      },
    }
    

4) 토글 그룹 관리

  • 상태: 여러 항목이 토글 가능
    state: {
      items: [
        { id: 1, selected: false },
        { id: 2, selected: false },
      ],
    },
    mutations: {
      toggleItem(state, id) {
        const item = state.items.find((item) => item.id === id);
        if (item) item.selected = !item.selected;
      },
    }
    

4. 토글과 +1의 차이점

특징 +1 예제 토글 예제

목적 숫자 상태를 증가시키는 동작 상태를 반전시키는 동작
상태 타입 숫자 (count: 0) 불리언 (isVisible: false)
로직 복잡성 단순 (숫자에 +1) 약간 복잡 (현재 상태를 기준으로 반전)
사용 시나리오 클릭 카운터, 점수 증가 모달 열기/닫기, 다크모드 토글

 


 

Vuex에서 상태를 관리하는 방식은 +1만으로 제한되지 않습니다. 상태를 증가, 감소, 토글, 대체, 삭제 등 다양한 방식으로 관리할 수 있습니다. +1은 단순한 학습용 예제일 뿐, 실제 애플리케이션에서는 더 복잡하고 다양한 상태 관리 패턴이 필요합니다.

**"왜 +1이냐?"**라는 질문은 결국 **"상태는 애플리케이션의 요구사항에 맞게 유연하게 관리되어야 한다"**라는 답으로 이어집니다. 토글도 좋은 사례이고, Vuex는 이를 충분히 지원합니다!


질문 : isVisible 이 전역변수! 정도로 생각하면 되? 물론 같을수는 없지만?

 

네, 거의 맞습니다! isVisible은 전역 상태로 생각할 수 있습니다. 하지만, 정확히 말하자면, 전역 변수와 **Vuex의 상태(state)**는 개념상 약간의 차이가 있습니다. 이를 좀 더 자세히 설명드리겠습니다.

전역 변수 vs Vuex 상태

  • 전역 변수:
    • 보통 애플리케이션 어디에서든 접근할 수 있는 변수를 의미합니다.
    • window 객체나 전역으로 선언된 변수들은 어디에서나 접근 가능하지만, 이런 변수들은 컴포넌트 간의 데이터 흐름을 관리하기 어려움을 초래할 수 있습니다.
    • 상태가 변경되었을 때, 이를 반영하는 로직을 추적하고 관리하기가 힘듭니다.
    예를 들어:
  • let isVisible = false; // 전역 변수로 선언된 값
  • Vuex의 상태 (state):
    • Vuex는 Vue 애플리케이션의 상태를 중앙에서 관리하는 라이브러리입니다. Vuex의 상태는 기본적으로 전역적이지만, Vuex의 핵심은 이 상태를 체계적으로 관리하고, 컴포넌트 간에 일관되게 공유하는 것입니다.
    • 상태가 변경될 때 Vuex는 상태 변경 추적, 디버깅, 로깅 등을 자동으로 지원해줍니다.
    • 상태 변경은 mutations를 통해 이루어지며, action을 통해 비동기 작업을 처리할 수 있습니다.
    • 이 방식은 상태 흐름을 예측 가능하고 추적 가능하게 만들어, 더 큰 애플리케이션에서 유지보수성과 확장성을 높여줍니다.
    예를 들어:
  • // store.js export const store = new Vuex.Store({ state: { isVisible: false, // Vuex 상태로 관리 }, mutations: { toggleVisibility(state) { state.isVisible = !state.isVisible; }, }, });

주요 차이점:

 

특징  전역 변수  Vuex 상태
데이터 공유 범위 전역적으로 접근 가능하지만 관리가 어려움 앱 전역에서 컴포넌트 간에 공유되고 관리됨
상태 관리 상태 변경 추적 및 로깅이 어려움 상태 변경을 중앙에서 관리하고 추적 가능
데이터 변경 방법 변수 값을 직접 변경 mutations을 통해 상태를 변경
상태 일관성 여러 곳에서 변경될 경우 상태 불일치 가능성 Vuex는 데이터 변경을 중앙 집중화하여 일관성 유지

왜 Vuex를 사용하나요?

  1. 상태 추적과 디버깅:
    • Vuex는 상태의 변화를 추적하고 디버깅하기 쉽게 만들어줍니다. 예를 들어, vue-devtools를 사용하면 상태 변화의 흐름을 쉽게 확인할 수 있습니다.
  2. 일관성:
    • 상태를 하나의 중앙에서 관리하면, 모든 컴포넌트가 같은 상태를 참조하게 되어 데이터 불일치 문제가 사라집니다.
  3. 유지보수성:
    • 상태 변경 로직이 분리되어 있기 때문에, 각 컴포넌트가 상태를 직접 변경하는 것보다 훨씬 관리가 용이합니다. 애플리케이션이 커질수록 Vuex는 더욱 중요한 역할을 합니다.
  4. 비동기 작업 처리:
    • Vuex에서는 actions를 통해 비동기 작업을 처리하고, 그 후에 mutations을 통해 상태를 변경할 수 있기 때문에, 복잡한 비동기 흐름을 잘 처리할 수 있습니다.

 

  • **isVisible**을 Vuex의 상태로 관리하는 것은 전역 변수처럼 애플리케이션 어디에서든 접근할 수 있다는 점에서 비슷하지만, Vuex는 상태 변경의 추적, 변경 관리, 디버깅 등을 더 용이하게 할 수 있는 구조를 제공합니다.
  • 따라서, 전역 변수처럼 단순히 값을 저장하는 것보다는, 상태 관리 패턴을 통해 애플리케이션의 복잡도가 커져도 일관성 있게 유지할 수 있습니다.
728x90
728x90