{"componentChunkName":"component---src-templates-blog-post-js","path":"/vue/vue-js-vuex의-개념-및-구조의-이해/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"89455268-6a83-5e19-b2aa-6aa1cf841a13","excerpt":"Vue Js Vuex의 개념 및 구조의 이해 Vuex Vuex는 Vue.js 애플리케이션에 대한 상태 관리 패턴 + 라이브러리 이다. 애플리케이션의 모든 컴포넌트에 대한 중앙 집중식 저장소 역할을 하며 예측 가능한 방식으로 상태를 변경할 수 있다. 상태 관리(State…","html":"<p><img src=\"/assets/vue-logo.png\" alt=\"Vue Js Vuex의 개념 및 구조의 이해\" title=\"Vue Js Vuex의 개념 및 구조의 이해\"></p>\n<h2 id=\"vuex\" style=\"position:relative;\"><a href=\"#vuex\" aria-label=\"vuex permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vuex</h2>\n<p>Vuex는 Vue.js 애플리케이션에 대한 상태 관리 패턴 + 라이브러리 이다. 애플리케이션의 모든 컴포넌트에 대한 중앙 집중식 저장소 역할을 하며 예측 가능한 방식으로 상태를 변경할 수 있다.</p>\n<h2 id=\"상태-관리state-management가-필요한-이유\" style=\"position:relative;\"><a href=\"#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%ACstate-management%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0\" aria-label=\"상태 관리state management가 필요한 이유 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>상태 관리(State Management)가 필요한 이유</h2>\n<p>컴포넌트 기반 프레임워크에서는 작은 단위로 쪼개진 여러 개의 컴포넌트로 화면을 구성한다. 예를 들면, header, button, list 등의 화면 요소가 각각 컴포넌트로 구성되어 한 화면에서 많은 컴포넌트를 사용한다. 이에 따라 컴포넌트 간의 통신이나 데이터 전달을 좀 더 유기적으로 관리할 필요성이 생긴다.</p>\n<h2 id=\"상태-관리\" style=\"position:relative;\"><a href=\"#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC\" aria-label=\"상태 관리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>상태 관리</h2>\n<p>상태 관리란 여러 컴포넌트 간의 데이터 전달과 이벤트 통신을 한곳에서 관리하는 패턴을 의미한다. 뷰와 성격이 비슷한 프레임워크인 리액트(React)에서는 Redux, Mobx와 같은 상태 관리 라이브러리를 사용하고 있고 뷰에서는 Vuex라는 상태 관리 라이브러리를 사용한다.</p>\n<h2 id=\"상태-관리로-해결할-수-있는-문제점\" style=\"position:relative;\"><a href=\"#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%EB%A1%9C-%ED%95%B4%EA%B2%B0%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%AC%B8%EC%A0%9C%EC%A0%90\" aria-label=\"상태 관리로 해결할 수 있는 문제점 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>상태 관리로 해결할 수 있는 문제점</h2>\n<p>상태 관리는 중대형 규모의 웹 애플리케이션에서 컴포넌트 간에 데이터를 더 효율적으로 전달할 수 있다. 일반적으로 앱의 규모가 커지면서 생기는 문제점들은 아래와 같다.</p>\n<ul>\n<li>뷰의 컴포넌트 통신 방식인 props, event 때문에 중간에 거쳐할 컴포넌트가 많아지는 경우가 있다.</li>\n<li>props, event 때문에 거쳐야할 컴포넌트가 많아지는 경우 Event Bus를 사용하여 개선을 하는데 Event Bus를 많아 사용하면 컴포넌트 간 데이터 흐름을 파악하기 어려움이 있다.</li>\n</ul>\n<p>위 문제점을 해결하기 위해 모든 데이터 통신을 한 곳에서 중앙 집중식으로 관리하는 것이 상태 관리이다.</p>\n<p><strong>Vuex 전체 흐름도</strong>\n<img src=\"/assets/vuex-diagram.png\" alt=\"Vue Js Vuex Diagram\" title=\"Vue Js Vuex Diagram\"></p>\n<h2 id=\"상태-관리-패턴\" style=\"position:relative;\"><a href=\"#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%ED%8C%A8%ED%84%B4\" aria-label=\"상태 관리 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>상태 관리 패턴</h2>\n<p>상태 관리 구성요소는 크게 3가지가 있다.</p>\n<ul>\n<li>state : 컴포넌트 간에 공유할 data</li>\n<li>view : 데이터가 표현될 template</li>\n<li>actions : 사용자의 입력에 따라 반응할 methods</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- view --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>vuex<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span>아메리카노 : {{ counter }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">@click</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>ameriano<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>ameriano<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// state</span>\n    <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">counter</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token comment\">// actions</span>\n    <span class=\"token literal-property property\">methods</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">ameriano</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>counter<span class=\"token operator\">++</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p><img src=\"/assets/vuex-ameriano-ex.png\" alt=\"Vue Js Vuex Ex\" title=\"Vue Js Vuex Ex\"></p>\n<p>위 구성요소는 아래와 같은 흐름으로 동작한다.</p>\n<p><strong>단방향 흐름 처리를 나타낸 그림</strong>\n<img src=\"/assets/vuex-state-one-way-data-flow.png\" alt=\"Vue Js Vuex Data Flow\" title=\"Vue Js Vuex Data Flow\"></p>\n<p><strong>데모</strong>\n<a href=\"https://codepen.io/bottlehs/pen/ZELyXba\" title=\"https://codepen.io/bottlehs/pen/ZELyXba\">https://codepen.io/bottlehs/pen/ZELyXba</a></p>","tableOfContents":"<ul>\n<li><a href=\"/vue/vue-js-vuex%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4/#vuex\">Vuex</a></li>\n<li><a href=\"/vue/vue-js-vuex%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4/#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%ACstate-management%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0\">상태 관리(State Management)가 필요한 이유</a></li>\n<li><a href=\"/vue/vue-js-vuex%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4/#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC\">상태 관리</a></li>\n<li><a href=\"/vue/vue-js-vuex%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4/#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%EB%A1%9C-%ED%95%B4%EA%B2%B0%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%AC%B8%EC%A0%9C%EC%A0%90\">상태 관리로 해결할 수 있는 문제점</a></li>\n<li><a href=\"/vue/vue-js-vuex%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4/#%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%ED%8C%A8%ED%84%B4\">상태 관리 패턴</a></li>\n</ul>","wordCount":{"words":252},"fields":{"slug":"/vue/vue-js-vuex의-개념-및-구조의-이해/","image":"/assets/vue-logo.png","faq":[]},"frontmatter":{"title":"Vue Js Vuex의 개념 및 구조의 이해","date":"2021년 4월 4일","dateISO":"2021-04-04T19:11:34.709Z","updatedISO":null,"category":"vue","description":"Vuex는 Vue.js 애플리케이션에 대한 상태 관리 패턴 + 라이브러리 이다. 애플리케이션의 모든 컴포넌트에 대한 중앙 집중식 저장소 역할을 하며 예측 가능한 방식으로 상태를 변경할 수 있다.","tags":["vue","javascript","framework","frontend","web","router"]}}},"pageContext":{"slug":"/vue/vue-js-vuex의-개념-및-구조의-이해/","previous":{"fields":{"slug":"/vue/vue-js-네임드-라우트/"},"frontmatter":{"title":"Vue Js 뷰 네임드 라우트","tags":["vue","javascript","framework","frontend","web","router","named-routes"]}},"next":{"fields":{"slug":"/springboot/스프링-부트-API-인터페이스-및-결과-데이터-구조-설계/"},"frontmatter":{"title":"스프링 부트 API 인터페이스 및 결과 데이터 구조 설계","tags":["스프링","스프링부트","Spring","SpringBoot","Java","프레임워크","스프링부트구조","아키텍쳐"]}}}},"staticQueryHashes":["213619243","3262363727"]}