{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/about-js-asynchronous","result":{"data":{"markdownRemark":{"id":"2acffcea-14c6-5cb1-8962-75eced671969","html":"<h3 id=\"들어가며\" style=\"position:relative;\"><a href=\"#%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%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>들어가며</h3>\n<p>사실 자바스크립트의 설계와 동작 방식에 대한 좋은 글은 이미 많이 있다. 그럼에도 불구하고 이 글을 쓰는 이유는, 내가 직접 이해하고 나만의 언어로 표현함으로써 자바스크립트를 더 잘 알게 되리라 생각했기 때문이다. 또한 웹 개발을 하면서 가장 어렵게 다뤘던 부분이 자바스크립트의 비동기 처리여서, 꼭 한 번은  정리하고 싶었다. </p>\n<h3 id=\"자바스크립트의-동작-방식에-대하여\" style=\"position:relative;\"><a href=\"#%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC\" 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>자바스크립트의 동작 방식에 대하여</h3>\n<p>자바스크립트는 싱글 스레드이며, 동기 방식으로 동작한다. 자바나 C++처럼 병렬 실행을 위해 스레드를 새로 만들 수 없다. 따라서, 싱글 스레드로 동작하는데 어느 한 코드에서 발이 묶여버린다면 그대로 전체 프로그램이 굳어 버린다. (block 된다고 표현한다.) 웹 페이지에서 이런 일이 일어난다면 UI가 완전 멈추게 되어, 브라우저에서 다음과 같이 에러를 발생시킨다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 786px;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/6f8e1ad476e6eb3387a4fab035c5e16b/b40ed/erroruxui.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 60.05089058524173%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABnElEQVQoz4WT246CMBCGef8H8cYnMHHvvcJkRcUDR6tBxANoy9l/OyU1qxvXJn9p6MzH3xlqDIdfiKI9qqpCnucoy1KJ1p9UFAWu1ysmE0syIozHYxhN02C7YwhYCC90sVjaWKyXHbjoRImv0h8mtU0LzjmE4DCEECirLunGb+olPYuygMiFdCLkXv4Eq2Q87XEZy2Wsjqc9g6bj8QjTNGHbNtq2xf1+hxs4WDoLrLwVNtsQ5reJ+WqKtbOC6zvwNz7iJIYf+nBkbHpLlVuDJjr/bDaDZVmYz+fKfnbLEMV7xPsIyekAl/mwpjYOxwgsYsp5XTeq9iRdd3Vk5ch10ev1MBqNkCQJaJxPZwhZdJ5zpFKeu5PlkSWoS5nTytPcHyfSTTV0t8jhYDBAv98HYwzvhsxVAA3TwLquNVCoglK3aVAA2acAnaDVNO0TpAO/AKlbClDV6qnroaGfREZIjxrSRL9Kml5wkcqu2R/wO3U/doY0S9VaAWlBsJAF8AIPbLf9CPoN3MeRvBQBqLkPh7oxOuj1JvwH1NLX9geW5JoCtUt5BQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n        <source\n          srcset=\"/static/6f8e1ad476e6eb3387a4fab035c5e16b/8ac56/erroruxui.webp 240w,\n/static/6f8e1ad476e6eb3387a4fab035c5e16b/d3be9/erroruxui.webp 480w,\n/static/6f8e1ad476e6eb3387a4fab035c5e16b/4cb1e/erroruxui.webp 786w\"\n          sizes=\"(max-width: 786px) 100vw, 786px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/6f8e1ad476e6eb3387a4fab035c5e16b/e4891/erroruxui.png 240w,\n/static/6f8e1ad476e6eb3387a4fab035c5e16b/0ce91/erroruxui.png 480w,\n/static/6f8e1ad476e6eb3387a4fab035c5e16b/b40ed/erroruxui.png 786w\"\n          sizes=\"(max-width: 786px) 100vw, 786px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          src=\"/static/6f8e1ad476e6eb3387a4fab035c5e16b/b40ed/erroruxui.png\"\n          alt=\"erroruxui\"\n          title=\"erroruxui\"\n          loading=\"lazy\"\n          style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        />\n      </picture>\n  </a>\n    </span></p>\n<p>이런 블로킹으로 인한 퍼포먼스 저하를 막기 위해, 자바스크립트는 비동기 방식으로 사용할 수 있도록 설계됐다. 시간이 오래 걸리는 작업을 기다리지 않아도 동작하도록 코드를 짤 수 있다. 핵심 원리는 오래 걸리는 일을 그 자리에서 기다리는 대신, 결과가 나왔을 때 받아서 처리하는 것이다.  따라서 HTTP 통신, 파일 입출력 등 시간이 많이 필요한 코드가 수행되는 동안 다른 동작(UX/UI 등)을 계속 수행할 수 있고, 유저 경험을 해치지 않게 되는 것이다.</p>\n<p>정리하면 <strong>자바스크립트는 기본적으로 동기 방식이며, 싱글 스레드로 동작한다. 다만 비동기 처리를 위한 몇몇 유용한 기능을 지원한다. (틀리다면 피드백 환영합니다. 아래는 참고자료입니다.)</strong></p>\n<ul>\n<li><a href=\"https://stackoverflow.com/questions/2035645/when-is-javascript-synchronous\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://stackoverflow.com/questions/2035645/when-is-javascript-synchronous</a></li>\n<li><a href=\"https://medium.com/better-programming/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-7aa9dd8f3bfb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://medium.com/better-programming/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-7aa9dd8f3bfb</a></li>\n</ul>\n<h3 id=\"자바스크립트의-비동기-처리-방법\" style=\"position:relative;\"><a href=\"#%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95\" 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>자바스크립트의 비동기 처리 방법</h3>\n<p>자바스크립트에서 비동기 처리를 하는 방법은 총 3가지 정도가 있다.</p>\n<ol>\n<li>callback function</li>\n<li>Promise</li>\n<li>async - await</li>\n</ol>\n<p>(generator는 제외)</p>\n<p>각 기능들은 이전의 기능의 불편함을 개선하면서 등장했기 때문에, 이전 기능을 이해하지 않고 사용하면 겉핥기로만 사용할 우려가 있다. 특히 ES2017 이후 등장한 async / await 은 사용성이 너무 좋다보니, 이전의 개념들을 이해하지 않아도 어떻게든 쓸 수는 있다. 그러나 버그가 발생했을 때 Promise 에 대해서 모른다면 디버깅하기가 참 힘들다. 특히 반복문(foreach, map)이랑 사용할 때 시행착오를 많이 겪게 된다. async - await 을 알려면 Promise를 알아야 하고, Promise를 알려면 비동기 처리에 대해서 알아야 하니, 자바스크립트의 비동기 처리에 대해 개념 정리를 확실히 해두는 것이 좋다.</p>\n<p>각 비동기 동작의 내용에 대해서는 다음 시리즈에서 다룰 예정이다. </p>\n<h3 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" 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>참고 자료</h3>\n<ul>\n<li><a href=\"https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-%EC%97%94%EC%A7%84-%EB%9F%B0%ED%83%80%EC%9E%84-%EC%BD%9C%EC%8A%A4%ED%83%9D-%EA%B0%9C%EA%B4%80-ea47917c8442\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://engineering.huiseoul.com/자바스크립트는-어떻게-작동하는가-엔진-런타임-콜스택-개관-ea47917c8442</a></li>\n<li><a href=\"https://joshua1988.github.io/web-development/javascript/js-async-await/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://joshua1988.github.io/web-development/javascript/js-async-await/</a></li>\n<li>반복문과 함께 async / await 사용 <a href=\"https://velog.io/@minsangk/2019-09-06-0209-%EC%9E%91%EC%84%B1%EB%90%A8-eik06xy8mm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://velog.io/@minsangk/2019-09-06-0209-작성됨-eik06xy8mm</a></li>\n<li><a href=\"https://mygumi.tistory.com/328\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://mygumi.tistory.com/328</a></li>\n<li><a href=\"https://yorr.tistory.com/20\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://yorr.tistory.com/20</a></li>\n</ul>","fields":{"slug":"/posts/about-js-asynchronous","tagSlugs":["/tag/javascript/","/tag/backend/"]},"frontmatter":{"date":"2020-04-12T10:00:00.169Z","description":null,"tags":["javascript","backend"],"title":"자바스크립트의 비동기 처리 방식에 대한 고찰","socialImage":"/media/erroruxui.png"}}},"pageContext":{"slug":"/posts/about-js-asynchronous"}}}