{"data":{"site":{"siteMetadata":{"title":"lastrites2018","author":"lastrites2018","siteUrl":"https://lastrites2018.netlify.com","comment":{"disqusShortName":"","utterances":"lastrites2018/gatsby-first-blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"b3c2a354-8845-5b04-90ee-4e5d7523909d","excerpt":"callback 콜백은 단순히 자바스크립트 함수를 사용하기 위한 규칙의 이름일 뿐이다. 자바스크립트 언어엔 ‘콜백’이란 것이 없다. 대부분의 함수처럼 즉시 결과를 반환하는 대신, 콜백을 사용하는 함수는 결과를 산출하는데 약간의 시간이 걸린다. 쉽게 와닿지 않는 ‘비동기’라는 단어는 일종의 ‘시간이 걸린다’ 또는 ‘지금 발생하지는 않지만 미래에 발생한다’를 의미한다. 일반적으로 콜백은 I / O를 할 때만 사용된다. (ex…","html":"<h2 id=\"callback\"><a href=\"#callback\" aria-label=\"callback permalink\" class=\"anchor\"><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>callback</h2>\n<p>콜백은 단순히 자바스크립트 함수를 사용하기 위한 규칙의 이름일 뿐이다. 자바스크립트 언어엔 ‘콜백’이란 것이 없다. 대부분의 함수처럼 즉시 결과를 반환하는 대신, 콜백을 사용하는 함수는 결과를 산출하는데 약간의 시간이 걸린다. 쉽게 와닿지 않는 ‘비동기’라는 단어는 일종의 ‘시간이 걸린다’ 또는 ‘지금 발생하지는 않지만 미래에 발생한다’를 의미한다. 일반적으로 콜백은 I / O를 할 때만 사용된다. (ex, 다운로드, 파일 읽기, 데이터베이스와 통신)</p>\n<p>콜백은 당장 결과를 낼 수 없을 때, 다른 프로그램의 진행을 <strong>블록</strong> 시키지 않기 위해, 비동기 영역으로 보내버린다. 콜백을 이해하는 핵심은 비동기 작업이 완료될 때가 언제인지 모르는 경우에 콜백을 사용한다는 점이다.</p>\n<p>콜백 지옥을 어떻게 벗어날 수 있을까?</p>\n<ol>\n<li>익명함수 대신 네이밍 함수를 사용한다.</li>\n<li>모듈화</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span>submit <span class=\"token operator\">=</span> formSubmit\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">formSubmit</span><span class=\"token punctuation\">(</span>submitEvent<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> name <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>value\n  <span class=\"token function\">request</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">{</span>\n      uri<span class=\"token punctuation\">:</span> <span class=\"token string\">'http://example.com/upload'</span><span class=\"token punctuation\">,</span>\n      body<span class=\"token punctuation\">:</span> name<span class=\"token punctuation\">,</span>\n      method<span class=\"token punctuation\">:</span> <span class=\"token string\">'POST'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    postResponse\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">postResponse</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">,</span> body<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> statusMessage <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.status'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>statusMessage<span class=\"token punctuation\">.</span>value <span class=\"token operator\">=</span> err<span class=\"token punctuation\">)</span>\n  statusMessage<span class=\"token punctuation\">.</span>value <span class=\"token operator\">=</span> body\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ol>\n<li>\n<p>모든 에러 처리를 해줄 것</p>\n<p>간단히 Node.js 스타일을 사용해주면 됨. 여기서 콜백에 대한 첫 번째 인수는 항상 오류를 위해 예약되어 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span>\n\nfs<span class=\"token punctuation\">.</span><span class=\"token function\">readFile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/Does/not/exist'</span><span class=\"token punctuation\">,</span> handleFile<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">handleFile</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">,</span> file<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Uhoh, there was an error'</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span>\n <span class=\"token comment\">// otherwise, continue on and use `file` in your code</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n</li>\n<li>\n<p>요점 : 항상 모든 오류를 처리해주고, 코드를 단순하게 유지한다. 중첩하지 않고, 작은 모듈로 나눠준다.</p>\n</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// self-assessment 3에서</span>\nfs<span class=\"token punctuation\">.</span>readfile의 callback은 다른 사람이 콜백을 넣어서 활용하라고 만들어놓은 것<span class=\"token punctuation\">.</span>\ngetWordCount의 콜백은 다른 사람보고 콜백을 써서 활용하라고 만들어주는 것<span class=\"token punctuation\">.</span>\n우리가 fs<span class=\"token punctuation\">.</span>readFile을 사용할때\nfs<span class=\"token punctuation\">.</span><span class=\"token function\">readFile</span><span class=\"token punctuation\">(</span>filePath<span class=\"token punctuation\">,</span><span class=\"token string\">' utf-8'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> 이 경우에는 다른 사람이 만들어놓은 영역을 내가 사용하는 것<span class=\"token punctuation\">.</span></code></pre></div>\n<h2 id=\"모듈\"><a href=\"#%EB%AA%A8%EB%93%88\" aria-label=\"모듈 permalink\" class=\"anchor\"><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<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 이 안에서 있는 애들만이 다른 문서에서 require 됐을때 사용할 수 있다.</span>\n<span class=\"token punctuation\">}</span>\n\n혹은\n\n<span class=\"token comment\">// formuploader.js</span>\nmodule<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span>submit <span class=\"token operator\">=</span> formSubmit <span class=\"token comment\">// 이렇게 추출해버릴 수 있다.</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">formSubmit</span> <span class=\"token punctuation\">(</span>submitEvent<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> name <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>value\n  <span class=\"token function\">request</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    uri<span class=\"token punctuation\">:</span> <span class=\"token string\">\"http://example.com/upload\"</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token punctuation\">:</span> name<span class=\"token punctuation\">,</span>\n    method<span class=\"token punctuation\">:</span> <span class=\"token string\">\"POST\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> postResponse<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"path\"><a href=\"#path\" aria-label=\"path permalink\" class=\"anchor\"><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>path</h2>\n<p>path.dirname(”)</p>\n<p>path.join(_dirname, ”)</p>\n<p>노드가 어디서 실행될지 모르기 때문에</p>\n<p>현재 위치에서 상대 경로를 지정해야 함.</p>\n<h2 id=\"참조\"><a href=\"#%EC%B0%B8%EC%A1%B0\" aria-label=\"참조 permalink\" class=\"anchor\"><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><a href=\"http://callbackhell.com/\">http://callbackhell.com/</a></p>","frontmatter":{"title":"콜백과 모듈","date":"October 16, 2018"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/til/20181016 콜백과 모듈/","previous":{"fields":{"slug":"/til/20181015 IM08D21 database/"},"frontmatter":{"title":"Immersive Sprint - database","category":"TIL"}},"next":{"fields":{"slug":"/til/20181016 IM08D22 database/"},"frontmatter":{"title":"Immersive Sprint - database","category":"TIL"}}}}