{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/19-04-25-rxjs-trigger/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"fbace078-f8a3-5a29-bc7c-dc6be296bf29","excerpt":"왜 나는 이런 고민을 하게 되었나 개발을 하던 중에 모달 이벤트를 처리해야 하는 경우가 있다. 블로그에서 글을 삭제한다고 하자. 이 때 삭제 버튼을 누르자마자 바로 삭제를 수행하는 것은 조금 위험하다. 그러니 정말 삭제할 것인지 물어보는 모달을 띄운다. 해당 모달에서 삭제한다고 했을 때, 비로소 정말 삭제를 수행한다. 간단한 이벤트 처리이다. 모달을 범용적으로 사용하기 흔한 상황이지만, RxJs만으로 만든다고 하면 난해할 수 있다. 일단 모달을 띄우는 플래그인 을 Observable…","html":"<h1 id=\"왜-나는-이런-고민을-하게-되었나\" style=\"position:relative;\"><a href=\"#%EC%99%9C-%EB%82%98%EB%8A%94-%EC%9D%B4%EB%9F%B0-%EA%B3%A0%EB%AF%BC%EC%9D%84-%ED%95%98%EA%B2%8C-%EB%90%98%EC%97%88%EB%82%98\" aria-label=\"왜 나는 이런 고민을 하게 되었나 permalink\" class=\"anchor 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>왜 나는 이런 고민을 하게 되었나</h1>\n<p>개발을 하던 중에 모달 이벤트를 처리해야 하는 경우가 있다.</p>\n<p>블로그에서 글을 삭제한다고 하자. 이 때 삭제 버튼을 누르자마자 바로 삭제를 수행하는 것은 조금 위험하다. 그러니 정말 삭제할 것인지 물어보는 모달을 띄운다. 해당 모달에서 삭제한다고 했을 때, 비로소 정말 삭제를 수행한다. 간단한 이벤트 처리이다.</p>\n<h1 id=\"모달을-범용적으로-사용하기\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%8B%AC%EC%9D%84-%EB%B2%94%EC%9A%A9%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0\" aria-label=\"모달을 범용적으로 사용하기 permalink\" class=\"anchor 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>모달을 범용적으로 사용하기</h1>\n<p>흔한 상황이지만, RxJs만으로 만든다고 하면 난해할 수 있다. 일단 모달을 띄우는 플래그인 <code class=\"language-text\">shouldShowModal</code>을 Observable로 제어하고, 모달 내부의 버튼을 통해 어플리케이션의 상태를 변경해야 한다. 모달을 범용적으로 사용하기 위해서는 모달에서 yes를 클릭하면, 모달을 사용하는 쪽에서도 yes에 준하는, truthy한 값을 가지는 것이 좋다. 이 경우에 truthy한 값이 의미하는 것은 ‘삭제’이다.</p>\n<p>만약 모달의 yes 버튼이 truthy한 값을 가지는 것이 아니고 삭제를 수행하는 특정 함수를 호출한다고 하면 해당 모달은 삭제 모달로만 사용이 가능하다. 그러면 나중에 탈퇴 모달을 만든다고 할 때, yes 버튼에 탈퇴를 수행하는 함수를 또 정의해야한다. 그런 귀찮은 일은 모달을 사용하는 쪽에서 정의하도록 하자. 모달이 truthy한 값을 주면 모달을 사용하는 곳에서 삭제를 수행하거나 탈퇴를 수행하는 함수를 호출한다.</p>\n<p>따라서 모달의 yes는 truthy 이고 no는 falsy하게 작동하는 것이 범용적이고 직관적이다.</p>\n<h1 id=\"모달-실행을-observable로-관리하기\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%8B%AC-%EC%8B%A4%ED%96%89%EC%9D%84-observable%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0\" aria-label=\"모달 실행을 observable로 관리하기 permalink\" class=\"anchor 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>모달 실행을 Observable로 관리하기</h1>\n<p>그러면 모달에서 버튼을 누를 때 Observer에게 boolean 값을 전달하는 플래그가 필요하다. 이름은 <code class=\"language-text\">shouldApplyAction</code> 으로 설정한다.</p>\n<p>일단 모달을 띄우기 위해서는 <code class=\"language-text\">shouldShowModal</code>이 false 에서 true 값으로 변해야 한다. 모달을 제어하는 함수의 이름을 <code class=\"language-text\">toggleModal</code>이라고 짓고 boolean 값을 Observer에게 전달하는 Observable을 제어해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 모달이 off 된 상태여야 하기 때문에 BehaviorSubject로 초기값을 false로 지정한다.</span>\n<span class=\"token keyword\">const</span> shouldShowModal$ <span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BehaviorSubject<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span></span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">toggleModal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n shouldShowModal$<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>이제 모달을 띄웠다. 그런데 모달의 액션을 제어해야한다. 마찬가지 방법으로 제어할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">const</span> shouldApplyAction$ <span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BehaviorSubject<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span></span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">applyAction</span><span class=\"token punctuation\">(</span>modalButtonValue<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n shouldApplyAction$<span class=\"token punctuation\">.</span><span class=\"token function\">next</span><span class=\"token punctuation\">(</span>modalButtonValue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>이제 끝났는가? 아니다. 모달을 가져다가 쓰는 쪽에서 모달이 truthy 값을 주는지 falsy 값을 주는지 알아야 한다. 그런데 서로 다른 Observable은 서로 연관성을 가지고 있다. 모달을 띄워야만 apply가 가능하니까. 하지만 최종적으로 true 인지 false 인지 알기 위해서는 shouldApplyAction$이 주는 값을 알아야한다. 여기서는 <code class=\"language-text\">withLatestFrom</code> 을 이용해서 두 Observable을 연결한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\">shouldApplyAction$<span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>\n  <span class=\"token function\">withLatestFrom</span><span class=\"token punctuation\">(</span>shouldShowModal$<span class=\"token punctuation\">)</span>  \n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>shouldApplyAction<span class=\"token punctuation\">,</span> shouldShowmodal<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>shouldApplyAction<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// 함수 실행</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>위의 코드는 <code class=\"language-text\">shouldApplyAction$</code>을 시작 Observable로 한다. shouldShowModal<span class=\"math math-inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mtext>이시작이면모달을띄우자마자</mtext><mi>s</mi><mi>u</mi><mi>b</mi><mi>s</mi><mi>c</mi><mi>r</mi><mi>i</mi><mi>b</mi><mi>e</mi><mtext>를수행하기때문이다</mtext><mi mathvariant=\"normal\">.</mi><mtext>하지만</mtext><mi>s</mi><mi>h</mi><mi>o</mi><mi>u</mi><mi>l</mi><mi>d</mi><mi>S</mi><mi>h</mi><mi>o</mi><mi>w</mi><mi>M</mi><mi>o</mi><mi>d</mi><mi>a</mi><mi>l</mi></mrow><annotation encoding=\"application/x-tex\">이 시작이면 모달을 띄우자마자 subscribe를 수행하기 때문이다. 하지만 shouldShowModal</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6944em;\"></span><span class=\"mord hangul_fallback\">이시작이면모달을띄우자마자</span><span class=\"mord mathnormal\">s</span><span class=\"mord mathnormal\">u</span><span class=\"mord mathnormal\">b</span><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">scr</span><span class=\"mord mathnormal\">ib</span><span class=\"mord mathnormal\">e</span><span class=\"mord hangul_fallback\">를수행하기때문이다</span><span class=\"mord\">.</span><span class=\"mord hangul_fallback\">하지만</span><span class=\"mord mathnormal\">s</span><span class=\"mord mathnormal\">h</span><span class=\"mord mathnormal\">o</span><span class=\"mord mathnormal\">u</span><span class=\"mord mathnormal\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathnormal\">d</span><span class=\"mord mathnormal\" style=\"margin-right:0.05764em;\">S</span><span class=\"mord mathnormal\">h</span><span class=\"mord mathnormal\">o</span><span class=\"mord mathnormal\" style=\"margin-right:0.10903em;\">wM</span><span class=\"mord mathnormal\">o</span><span class=\"mord mathnormal\">d</span><span class=\"mord mathnormal\">a</span><span class=\"mord mathnormal\" style=\"margin-right:0.01968em;\">l</span></span></span></span></span>의 값이 toggleModal 함수 호출로 결정이 나도, applyAction을 호출하지 않으면 Observable은 구독을 하지 않고 따라서 구독 내부의 콜백 함수까지는 도달하지 않는다.</p>","frontmatter":{"title":"RxJs를 이용하여 비동기 이벤트가 발생하면 버튼으로 제어하기","date":"April 25, 2019"}}},"pageContext":{"slug":"/19-04-25-rxjs-trigger/","previous":{"fields":{"slug":"/19-04-22-trust-asset/"},"frontmatter":{"title":"신뢰자본과 개발주도","category":"Dev","draft":false}},"next":{"fields":{"slug":"/19-11-27-call-by-value-refrence-deep-shallow-copy/"},"frontmatter":{"title":"immutable 과 mutable","category":"Python","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}