<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Marco Song의 블로그]]></title><description><![CDATA[개발, 커뮤니케이션, 동기부여에 미친 개발자]]></description><link>https://lumen.netlify.com</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 20 May 2020 14:06:07 GMT</lastBuildDate><item><title><![CDATA[[Javascript] async/await 과 Promise.all로 비동기 처리하기]]></title><link>https://lumen.netlify.com/posts/about-js-asynchronous-multi</link><guid isPermaLink="false">https://lumen.netlify.com/posts/about-js-asynchronous-multi</guid><pubDate>Wed, 20 May 2020 10:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;자바스크립트의-비동기-동작에-대해---2--반복적인-비동기-동작-처리하기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%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-%EB%8F%99%EC%9E%91%EC%97%90-%EB%8C%80%ED%95%B4---2--%EB%B0%98%EB%B3%B5%EC%A0%81%EC%9D%B8-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%8F%99%EC%9E%91-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0&quot; aria-label=&quot;자바스크립트의 비동기 동작에 대해   2  반복적인 비동기 동작 처리하기 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;자바스크립트의 비동기 동작에 대해 - 2 : 반복적인 비동기 동작 처리하기&lt;/h2&gt;
&lt;p&gt;자바스크립트에서 비동기 처리를 위해 자주 사용하는 방법은 3가지가 있으며, 자세한 개념 설명은 간단한 gif 이미지와, 아래의 링크로 대체한다.
&lt;img src=&quot;/7fb9295d430321f59545b802fe66888d/async_await.gif&quot; alt=&quot;sync_all&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;자바스크립트의-비동기-처리-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%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&quot; aria-label=&quot;자바스크립트의 비동기 처리 방법 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;자바스크립트의 비동기 처리 방법&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;콜백 함수(callback function) : &lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;프로미스(Promise) : &lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;async - await : &lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/js-async-await/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://joshua1988.github.io/web-development/javascript/js-async-await/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(+ generator 도 있음. 추후 포스팅 검토중 )&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;이 글에서는 자바스크립트에서 비동기 동작을 수천 번 이상 반복적으로 수행해야할 때 어떻게 해야하는지를 다뤄보고자 한다.&lt;/p&gt;
&lt;h2 id=&quot;여러-개의-비동기-동작을-빠르게-처리하고-싶다면&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%AC%EB%9F%AC-%EA%B0%9C%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%8F%99%EC%9E%91%EC%9D%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B3%A0-%EC%8B%B6%EB%8B%A4%EB%A9%B4&quot; aria-label=&quot;여러 개의 비동기 동작을 빠르게 처리하고 싶다면 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;여러 개의 비동기 동작을 빠르게 처리하고 싶다면?&lt;/h2&gt;
&lt;p&gt;자바스크립트를 사용하면서 비동기 동작 관련하여 개발할 때 힘들었던 이슈는, 비동기 처리를 수천 개 이상 해야할 때였다. 구체적인 예시로는 이메일, 알림톡 등 HTTP 리퀘스트가 많이 발생하는 경우가 있다. 통신, 파일 입출력 등 시간이 오래 걸리는 프로세스를 동기로 실행하게 되면 처리가 상당히 느리며, 병렬로 작업을 가져가도록 코드 설계가 필요해진다.&lt;/p&gt;
&lt;p&gt;간단한 코드 처리 예시와 결과를 통해 알아보자.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;예제-함수&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%88%EC%A0%9C-%ED%95%A8%EC%88%98&quot; aria-label=&quot;예제 함수 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;예제 함수&lt;/h2&gt;
&lt;p&gt;시간이 오래 걸리는 함수 프로세스가 있다. 예제에선 500ms 후 작업이 완료되도록 구성하였다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;json으로 HTTP POST 요청을 보낼 때 (axios 모듈 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;longTimeTask&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stdout&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;index&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;번째 일하는중...&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;// let items = randomTime;&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;index&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;번째 작업완료&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;코드-예제---for문&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BD%94%EB%93%9C-%EC%98%88%EC%A0%9C---for%EB%AC%B8&quot; aria-label=&quot;코드 예제   for문 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;코드 예제 - for문&lt;/h2&gt;
&lt;p&gt;이런 프로세스를 수천 번 실행해야 한다면 어떻게 할까?
ex) 수천 명의 유저에게 이메일이나 SMS 메시지 등을 보내야 하는 경우&lt;/p&gt;
&lt;p&gt;일단은 반복문을 써보기로 하자. for문을 돌려보면, 동기로 동작한다. 앞선 작업이 끝나야 다음 작업이 진행되기 때문에, 동작 횟수가 많아지면 시간이 오래 걸린다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;작업 시작&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//가상의 작업 리스트&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; workList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; loopCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; work &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; workList&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; taskRes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;longTimeTask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;loopCount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;taskRes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;loopCount&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;모든 작업이 끝났습니다.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;코드-실행-결과-앞선-작업이-끝나야-다음-작업이-수행된다-답답&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BD%94%EB%93%9C-%EC%8B%A4%ED%96%89-%EA%B2%B0%EA%B3%BC-%EC%95%9E%EC%84%A0-%EC%9E%91%EC%97%85%EC%9D%B4-%EB%81%9D%EB%82%98%EC%95%BC-%EB%8B%A4%EC%9D%8C-%EC%9E%91%EC%97%85%EC%9D%B4-%EC%88%98%ED%96%89%EB%90%9C%EB%8B%A4-%EB%8B%B5%EB%8B%B5&quot; aria-label=&quot;코드 실행 결과 앞선 작업이 끝나야 다음 작업이 수행된다 답답 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;코드 실행 결과. 앞선 작업이 끝나야 다음 작업이 수행된다… (답답)&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/f8305bca44903b0320ea9d81817fb719/sync_work.gif&quot; alt=&quot;work_sync&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;코드-예제---promiseall&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BD%94%EB%93%9C-%EC%98%88%EC%A0%9C---promiseall&quot; aria-label=&quot;코드 예제   promiseall permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;코드 예제 - Promise.all&lt;/h2&gt;
&lt;p&gt;따라서 반복문이 병렬로 처리될 수 있도록 추가적인 조치가 필요해진다. 여러 방법이 있지만, 나의 경우 map과 Promise.all()의 조합이 코드 양이 적어서 주로 활용하는 편이다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; workPromises &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; workList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; taskRes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;longTimeTask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;taskRes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Promise&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workPromises&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;모든 작업이 끝났습니다.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;코드-실행-결과&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BD%94%EB%93%9C-%EC%8B%A4%ED%96%89-%EA%B2%B0%EA%B3%BC&quot; aria-label=&quot;코드 실행 결과 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;코드 실행 결과.&lt;/h4&gt;
&lt;h4 id=&quot;앞의-for문을-사용한-케이스와-비교했을-때-훨씬-빠르게-작업이-끝난다-편안&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%9E%EC%9D%98-for%EB%AC%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%BC%80%EC%9D%B4%EC%8A%A4%EC%99%80-%EB%B9%84%EA%B5%90%ED%96%88%EC%9D%84-%EB%95%8C-%ED%9B%A8%EC%94%AC-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%9E%91%EC%97%85%EC%9D%B4-%EB%81%9D%EB%82%9C%EB%8B%A4-%ED%8E%B8%EC%95%88&quot; aria-label=&quot;앞의 for문을 사용한 케이스와 비교했을 때 훨씬 빠르게 작업이 끝난다 편안 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;앞의 for문을 사용한 케이스와 비교했을 때 훨씬 빠르게 작업이 끝난다. (편안)&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/c3ea54740e02723fc34e249ca6a07b0e/work_async.gif&quot; alt=&quot;work_async&quot;&gt;&lt;/p&gt;
&lt;p&gt;이외에도 가능한 여러 조합이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;foreach 와 Array.push, Promise.all 조합 등등…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;주의할 점은, 항상 비동기 처리를 병렬로만 처리하는 것이 능사는 아니라는 것이다. 예를 들어 클라이언트에서 한 번에 많은 리퀘스트를 서버에 병렬로 보내도록 시도한다면, 서버 혹은 중간에 있는 로드밸런서 등의 미들웨어에서 리퀘스트를 받아주지 못하기도 한다. 이렇게 되는 경우 서버가 감당할 수 있는 만큼만 보내도록 제한하는 방법을 생각해볼 수 있다. 항상 각자의 환경에 맞게 최적의 방법을 찾는 노력이 필요하다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[자바스크립트의 비동기 처리 방식에 대한 고찰]]></title><link>https://lumen.netlify.com/posts/about-js-asynchronous</link><guid isPermaLink="false">https://lumen.netlify.com/posts/about-js-asynchronous</guid><pubDate>Sun, 12 Apr 2020 10:00:00 GMT</pubDate><content:encoded>&lt;h3 id=&quot;들어가며&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0&quot; aria-label=&quot;들어가며 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;들어가며&lt;/h3&gt;
&lt;p&gt;사실 자바스크립트의 설계와 동작 방식에 대한 좋은 글은 이미 많이 있다. 그럼에도 불구하고 이 글을 쓰는 이유는, 내가 직접 이해하고 나만의 언어로 표현함으로써 자바스크립트를 더 잘 알게 되리라 생각했기 때문이다. 또한 웹 개발을 하면서 가장 어렵게 다뤘던 부분이 자바스크립트의 비동기 처리여서, 꼭 한 번은  정리하고 싶었다. &lt;/p&gt;
&lt;h3 id=&quot;자바스크립트의-동작-방식에-대하여&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%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&quot; aria-label=&quot;자바스크립트의 동작 방식에 대하여 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;자바스크립트의 동작 방식에 대하여&lt;/h3&gt;
&lt;p&gt;자바스크립트는 싱글 스레드이며, 동기 방식으로 동작한다. 자바나 C++처럼 병렬 실행을 위해 스레드를 새로 만들 수 없다. 따라서, 싱글 스레드로 동작하는데 어느 한 코드에서 발이 묶여버린다면 그대로 전체 프로그램이 굳어 버린다. (block 된다고 표현한다.) 웹 페이지에서 이런 일이 일어난다면 UI가 완전 멈추게 되어, 브라우저에서 다음과 같이 에러를 발생시킨다.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 786px;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6f8e1ad476e6eb3387a4fab035c5e16b/b40ed/erroruxui.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.05089058524173%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABnElEQVQoz4WT246CMBCGef8H8cYnMHHvvcJkRcUDR6tBxANoy9l/OyU1qxvXJn9p6MzH3xlqDIdfiKI9qqpCnucoy1KJ1p9UFAWu1ysmE0syIozHYxhN02C7YwhYCC90sVjaWKyXHbjoRImv0h8mtU0LzjmE4DCEECirLunGb+olPYuygMiFdCLkXv4Eq2Q87XEZy2Wsjqc9g6bj8QjTNGHbNtq2xf1+hxs4WDoLrLwVNtsQ5reJ+WqKtbOC6zvwNz7iJIYf+nBkbHpLlVuDJjr/bDaDZVmYz+fKfnbLEMV7xPsIyekAl/mwpjYOxwgsYsp5XTeq9iRdd3Vk5ch10ev1MBqNkCQJaJxPZwhZdJ5zpFKeu5PlkSWoS5nTytPcHyfSTTV0t8jhYDBAv98HYwzvhsxVAA3TwLquNVCoglK3aVAA2acAnaDVNO0TpAO/AKlbClDV6qnroaGfREZIjxrSRL9Kml5wkcqu2R/wO3U/doY0S9VaAWlBsJAF8AIPbLf9CPoN3MeRvBQBqLkPh7oxOuj1JvwH1NLX9geW5JoCtUt5BQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source
          srcset=&quot;/static/6f8e1ad476e6eb3387a4fab035c5e16b/8ac56/erroruxui.webp 240w,
/static/6f8e1ad476e6eb3387a4fab035c5e16b/d3be9/erroruxui.webp 480w,
/static/6f8e1ad476e6eb3387a4fab035c5e16b/4cb1e/erroruxui.webp 786w&quot;
          sizes=&quot;(max-width: 786px) 100vw, 786px&quot;
          type=&quot;image/webp&quot;
        /&gt;
        &lt;source
          srcset=&quot;/static/6f8e1ad476e6eb3387a4fab035c5e16b/e4891/erroruxui.png 240w,
/static/6f8e1ad476e6eb3387a4fab035c5e16b/0ce91/erroruxui.png 480w,
/static/6f8e1ad476e6eb3387a4fab035c5e16b/b40ed/erroruxui.png 786w&quot;
          sizes=&quot;(max-width: 786px) 100vw, 786px&quot;
          type=&quot;image/png&quot;
        /&gt;
        &lt;img
          class=&quot;gatsby-resp-image-image&quot;
          src=&quot;/static/6f8e1ad476e6eb3387a4fab035c5e16b/b40ed/erroruxui.png&quot;
          alt=&quot;erroruxui&quot;
          title=&quot;erroruxui&quot;
          loading=&quot;lazy&quot;
          style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        /&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;이런 블로킹으로 인한 퍼포먼스 저하를 막기 위해, 자바스크립트는 비동기 방식으로 사용할 수 있도록 설계됐다. 시간이 오래 걸리는 작업을 기다리지 않아도 동작하도록 코드를 짤 수 있다. 핵심 원리는 오래 걸리는 일을 그 자리에서 기다리는 대신, 결과가 나왔을 때 받아서 처리하는 것이다.  따라서 HTTP 통신, 파일 입출력 등 시간이 많이 필요한 코드가 수행되는 동안 다른 동작(UX/UI 등)을 계속 수행할 수 있고, 유저 경험을 해치지 않게 되는 것이다.&lt;/p&gt;
&lt;p&gt;정리하면 &lt;strong&gt;자바스크립트는 기본적으로 동기 방식이며, 싱글 스레드로 동작한다. 다만 비동기 처리를 위한 몇몇 유용한 기능을 지원한다. (틀리다면 피드백 환영합니다. 아래는 참고자료입니다.)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2035645/when-is-javascript-synchronous&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://stackoverflow.com/questions/2035645/when-is-javascript-synchronous&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/better-programming/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-7aa9dd8f3bfb&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://medium.com/better-programming/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-7aa9dd8f3bfb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;자바스크립트의-비동기-처리-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%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&quot; aria-label=&quot;자바스크립트의 비동기 처리 방법 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;자바스크립트의 비동기 처리 방법&lt;/h3&gt;
&lt;p&gt;자바스크립트에서 비동기 처리를 하는 방법은 총 3가지 정도가 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;callback function&lt;/li&gt;
&lt;li&gt;Promise&lt;/li&gt;
&lt;li&gt;async - await&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(generator는 제외)&lt;/p&gt;
&lt;p&gt;각 기능들은 이전의 기능의 불편함을 개선하면서 등장했기 때문에, 이전 기능을 이해하지 않고 사용하면 겉핥기로만 사용할 우려가 있다. 특히 ES2017 이후 등장한 async / await 은 사용성이 너무 좋다보니, 이전의 개념들을 이해하지 않아도 어떻게든 쓸 수는 있다. 그러나 버그가 발생했을 때 Promise 에 대해서 모른다면 디버깅하기가 참 힘들다. 특히 반복문(foreach, map)이랑 사용할 때 시행착오를 많이 겪게 된다. async - await 을 알려면 Promise를 알아야 하고, Promise를 알려면 비동기 처리에 대해서 알아야 하니, 자바스크립트의 비동기 처리에 대해 개념 정리를 확실히 해두는 것이 좋다.&lt;/p&gt;
&lt;p&gt;각 비동기 동작의 내용에 대해서는 다음 시리즈에서 다룰 예정이다. &lt;/p&gt;
&lt;h3 id=&quot;참고-자료&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot; aria-label=&quot;참고 자료 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;참고 자료&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;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&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://engineering.huiseoul.com/자바스크립트는-어떻게-작동하는가-엔진-런타임-콜스택-개관-ea47917c8442&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/js-async-await/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://joshua1988.github.io/web-development/javascript/js-async-await/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;반복문과 함께 async / await 사용 &lt;a href=&quot;https://velog.io/@minsangk/2019-09-06-0209-%EC%9E%91%EC%84%B1%EB%90%A8-eik06xy8mm&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://velog.io/@minsangk/2019-09-06-0209-작성됨-eik06xy8mm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mygumi.tistory.com/328&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://mygumi.tistory.com/328&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yorr.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://yorr.tistory.com/20&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[DB 데이터를 변경할 때 사용하는 보험들 (UPDATE, DELETE)]]></title><link>https://lumen.netlify.com/posts/about-change-data</link><guid isPermaLink="false">https://lumen.netlify.com/posts/about-change-data</guid><pubDate>Sun, 22 Mar 2020 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 960px;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/994afe2c71a749e5eab38cc459f4baac/b89a9/fail-db.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAGt2XWHrCyk/wD/xAAaEAACAwEBAAAAAAAAAAAAAAAAAgEDESIj/9oACAEBAAEFAr2SSt8Yj0lF6w//xAAWEQADAAAAAAAAAAAAAAAAAAABEFH/2gAIAQMBAT8BMX//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAgEBPwEn/8QAHhAAAQIHAQAAAAAAAAAAAAAAAQAQAhETMTJBUZH/2gAIAQEABj8ChB2qZ9YT6r5Fv//EABoQAAMBAAMAAAAAAAAAAAAAAAERIQAQUXH/2gAIAQEAAT8hEUugsUQCZOCdPCOeTKj3vf/aAAwDAQACAAMAAAAQXN//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAEf//EABURAQEAAAAAAAAAAAAAAAAAABBR/9oACAECAQE/EKP/xAAeEAEAAgIBBQAAAAAAAAAAAAABABEhUTFBYXGh8P/aAAgBAQABPxDAFwy0fqhCAp0muTyalxChG5UI79TJlYwMVXGmdlDU/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source
          srcset=&quot;/static/994afe2c71a749e5eab38cc459f4baac/8ac56/fail-db.webp 240w,
/static/994afe2c71a749e5eab38cc459f4baac/d3be9/fail-db.webp 480w,
/static/994afe2c71a749e5eab38cc459f4baac/e46b2/fail-db.webp 960w,
/static/994afe2c71a749e5eab38cc459f4baac/f992d/fail-db.webp 1440w,
/static/994afe2c71a749e5eab38cc459f4baac/882b9/fail-db.webp 1920w&quot;
          sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
          type=&quot;image/webp&quot;
        /&gt;
        &lt;source
          srcset=&quot;/static/994afe2c71a749e5eab38cc459f4baac/5a194/fail-db.jpg 240w,
/static/994afe2c71a749e5eab38cc459f4baac/8a430/fail-db.jpg 480w,
/static/994afe2c71a749e5eab38cc459f4baac/0781d/fail-db.jpg 960w,
/static/994afe2c71a749e5eab38cc459f4baac/e5be1/fail-db.jpg 1440w,
/static/994afe2c71a749e5eab38cc459f4baac/b89a9/fail-db.jpg 1920w&quot;
          sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
          type=&quot;image/jpeg&quot;
        /&gt;
        &lt;img
          class=&quot;gatsby-resp-image-image&quot;
          src=&quot;/static/994afe2c71a749e5eab38cc459f4baac/0781d/fail-db.jpg&quot;
          alt=&quot;schema&quot;
          title=&quot;schema&quot;
          loading=&quot;lazy&quot;
          style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        /&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;근래 들어, 일하면서 특정 조건에 해당하는 고객데이터를 수정할 일이 많았다. DB 데이터를 변경하게 되는 UPDATE/DELETE 쿼리 문은 사용할 때 항상 조심스럽다. 트랜잭션을 마친 데이터는 DB에서의 복구가 불가능하며, 백업본으로 복구하는 것 밖에는 방법이 없기 때문이다. (백업본마저 없다면 애도를 표한다 …) &lt;/p&gt;
&lt;p&gt;따라서 여러 개의 데이터를 변경할 경우에는, 잘못된 변경에 대한 복구가 가능하도록 보험을 들어놓고 시도하는 것이 안전하다. 아래는 데이터를 잘못 변경하더라도 복구할 수 있는 보편적인 방법들이다. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DB 백업&lt;/li&gt;
&lt;li&gt;트랜잭션&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;나는 백업과 트랜잭션을 조합해서 다음과 같이 사용한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(테스트 DB에서) &lt;strong&gt;트랜잭션&lt;/strong&gt;을 이용해, UPDATE/DELETE 쿼리문을 실행하고 롤백해보면서 개발한다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(라이브 DB 반영시) 라이브 DB &lt;strong&gt;스냅샷 떠서 백업본을 만들고&lt;/strong&gt;, &lt;strong&gt;트랜잭션&lt;/strong&gt;을 거쳐 업데이트를 실행한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;업데이트 결과가 적절한지 확인한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;affected rows를 체크&lt;/li&gt;
&lt;li&gt;SELECT 문을 실행하여 해당 데이터들이 의도한데로 수정된지 확인 후 COMMIT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라이브 배포&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;지금까지 DB 데이터를 안전하게 변경하는 방법에 대해서 알아보았다. 백업과 트랜잭션을 사용하는 방법에 대한 내용은 다음 글에서 다룰 예정이다. &lt;/p&gt;</content:encoded></item><item><title><![CDATA[스키마란 무엇인가]]></title><link>https://lumen.netlify.com/posts/about-schema</link><guid isPermaLink="false">https://lumen.netlify.com/posts/about-schema</guid><pubDate>Sun, 08 Mar 2020 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;최근 백엔드 작업을 하다가, “JSON 스키마”를 처음 접했다. 스키마? 데이터의 구조로 알고 있는데… 데이터베이스에서나 쓰던 개념 아니야? JSON에 무슨 스키마가 있다는 거지? 라는 질문에서 스키마에 대해서 잘 모르는 것이 많다는 생각이 들어서, 용어에 대한 정의부터 출발해 스키마가 실제로 어떻게 쓰이고 있는지에 대하여 고민해보았다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;이론&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%A1%A0&quot; aria-label=&quot;이론 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;이론&lt;/h2&gt;
&lt;p&gt;스키마의 사전적 정의는 다음과 같다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Schema : (계획·이론의) 개요[윤곽]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;흠… -_-;;
사전적 의미가 크게 와닿지 않아서 구글에 “Schema”를 이미지로 검색해보았다.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 568px;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9fa5c0cebb155fe9380af649c0450cab/870c3/schema.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.16197183098592%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsSAAALEgHS3X78AAADGklEQVQ4y4VTyYobSRCtX/L3+D/m3hf7NDBnQ4M9NL6YwQt4A4PdeFOvarXtlltqlWpfM6tUq0pL6zkiZMHcXBBURsb6Il8YWRTAGf+EOfwG37xGYN8gTVOs12ssl0vM53N0XSfC5z/pRuTfwBqfwvdsmIM+xr0e1P8Stm0Lx3FgWZYEse55ntwtFgs0TSM213VFN7zpCKNvZ0jiGN7wO+z+Z+SZxmq1lqRcNUkSxGTnAC4ym81EdgjYppTaJrz+8R1nva8EM8HE+onR5AKzYibJ6roWZw7WWktQlmXI81x0vufxsM42vjMG1wP0Lo/gRz7Or/r4OjiCpg43m404TacWfN8XSDuo/LdtG0EQyHl3z7rBFblKXVXIqEJAwawzlNvbW+l0J6vVaisElf8MefcgDJf/RkbtRgQrimJpWetMZsbOPHBHOvPhU3XuOKFiSZIiJH+lcyq6kcIsjMrgOeU5Dbko0LRzrNlIBv4WlJRtO6kIxbbTNVlXJEvx23pvP2O1WmK56ES6tkTb1JjpFE1domsquV90c4q6RVFWcL0QmQrxqa+w92+Lw7MUOg3lvihKGC3BaqoSVZEj9i1yTqBCFzklTTwLZa7JXkjScpYgcEZw6EFOBzYOng1wfOHCdSwE7phyKBhLGmacZ3Bobi1BnhNxJ6YplGjo7NLMIpoVsMZ/hzXuPwoxubmCMz3B6HIfrtXH1XCIe49ivDmqKSHNqaTAhDqL0xgFzenk5IRe2yOCKziUsCQUnPD0KsfzDw4l+oi3vb/w9+EdfDjaw3BwjKfvPVyOChhCUno9pVJMXQ9BrGS9giiFabtImcz0+nXdEOQUWTyGJs5+Of0HTz7fxfH5PnQcIU9GBJmIvV3qlhKWuDGJCjN6DBpDRgOeTGPacSUbwzxj2hy8CvHgqY3B2UeElokfF4d05+Dxm2C7KezMdNAqRxJpOpcyPyZ623SoyrmQmDmWaYUn7yI8fElonIg2yMPYdLH/IsbB60TyGEppImm03VnaYS5QlKXwcvdtfvNS+JpFKLJQtqkkv4Jill2B9aIScv8CUSCqo4zaRFwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source
          srcset=&quot;/static/9fa5c0cebb155fe9380af649c0450cab/8ac56/schema.webp 240w,
/static/9fa5c0cebb155fe9380af649c0450cab/d3be9/schema.webp 480w,
/static/9fa5c0cebb155fe9380af649c0450cab/bebff/schema.webp 568w&quot;
          sizes=&quot;(max-width: 568px) 100vw, 568px&quot;
          type=&quot;image/webp&quot;
        /&gt;
        &lt;source
          srcset=&quot;/static/9fa5c0cebb155fe9380af649c0450cab/e4891/schema.png 240w,
/static/9fa5c0cebb155fe9380af649c0450cab/0ce91/schema.png 480w,
/static/9fa5c0cebb155fe9380af649c0450cab/870c3/schema.png 568w&quot;
          sizes=&quot;(max-width: 568px) 100vw, 568px&quot;
          type=&quot;image/png&quot;
        /&gt;
        &lt;img
          class=&quot;gatsby-resp-image-image&quot;
          src=&quot;/static/9fa5c0cebb155fe9380af649c0450cab/870c3/schema.png&quot;
          alt=&quot;schema&quot;
          title=&quot;schema&quot;
          loading=&quot;lazy&quot;
          style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        /&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;이미지를 보니, 복잡하고 큰 개념을 뭔가 형식으로 도식화한 느낌을 준다. 왜 이렇게 규칙을 만들어 도식화하는가? 규칙을 정해 데이터를 다룸으로써 우리가 복잡하고 큰 데이터를 컨트롤할 수 있겠다는 생각이 들었고, 형식과 규칙을 스키마의 핵심이라고 나름대로 생각을 정리했다. &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;실전에서-사용하는-스키마들&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%A4%EC%A0%84%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%8A%A4%ED%82%A4%EB%A7%88%EB%93%A4&quot; aria-label=&quot;실전에서 사용하는 스키마들 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;실전에서 사용하는 스키마들&lt;/h2&gt;
&lt;p&gt;이번에는 실전에서 사용하는 스키마의 용례들을 살펴보자. 사례를 찾아보니 데이터를 다루는 곳에서 스키마가 많이 사용되고 있었다. 데이터를 효율적으로 다루기 위해서는 규칙과 형식, 즉 스키마가 필요한 것이다. 찾아본 바로는 크게 database(RDBMS, noSQL), XML(XSD), JSON Schema 에서 스키마를 언급하여 소개해둔다. &lt;/p&gt;
&lt;h3 id=&quot;1-데이터베이스에서의-기본-개념-기본-구조로써-언급되는-스키마&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%97%90%EC%84%9C%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0%EB%A1%9C%EC%8D%A8-%EC%96%B8%EA%B8%89%EB%90%98%EB%8A%94-%EC%8A%A4%ED%82%A4%EB%A7%88&quot; aria-label=&quot;1 데이터베이스에서의 기본 개념 기본 구조로써 언급되는 스키마 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 데이터베이스에서의 기본 개념, 기본 구조로써 언급되는 스키마&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;외부 스키마, 개념 스키마, 내부 스키마 등 (아래 자료 참고)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ykcb.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8A%A4%ED%82%A4%EB%A7%88%EC%9D%98-%EA%B0%9C%EB%85%90-%ED%8A%B9%EC%A7%95&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://ykcb.tistory.com/entry/데이터베이스-스키마의-개념-특징&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.guru99.com/dbms-schemas.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.guru99.com/dbms-schemas.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-rdbms의-정해진-구조로써-언급되는-스키마&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-rdbms%EC%9D%98-%EC%A0%95%ED%95%B4%EC%A7%84-%EA%B5%AC%EC%A1%B0%EB%A1%9C%EC%8D%A8-%EC%96%B8%EA%B8%89%EB%90%98%EB%8A%94-%EC%8A%A4%ED%82%A4%EB%A7%88&quot; aria-label=&quot;2 rdbms의 정해진 구조로써 언급되는 스키마 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. RDBMS의 정해진 구조로써 언급되는 스키마&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;noSQL이 스키마가 없어 데이터 구조가 유연하다는 말은, 다음 두 가지 의미를 내포한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RDBMS처럼 정해진 테이블 구조를 갖지 않는다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDBMS에서 property 하나를 추가하려면 Alter table 해서 모든 레코드에 컬럼을 추가해야 하지만, noSQL에서는 그럴 필요가 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 레코드의 property가 고정돼있지 않다(예를 들면, int 컬럼을 가진 레코드인데 string을 넣으면 테이블에선 대응이 안되지만 noSQL에서는 된다는 것)&lt;/li&gt;
&lt;li&gt;참고 자료 : &lt;a href=&quot;https://www.mongodb.com/blog/post/why-schemaless&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.mongodb.com/blog/post/why-schemaless&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-mysql에서-db-자체로써-언급되는-스키마&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-mysql%EC%97%90%EC%84%9C-db-%EC%9E%90%EC%B2%B4%EB%A1%9C%EC%8D%A8-%EC%96%B8%EA%B8%89%EB%90%98%EB%8A%94-%EC%8A%A4%ED%82%A4%EB%A7%88&quot; aria-label=&quot;3 mysql에서 db 자체로써 언급되는 스키마 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. mySQL에서 DB 자체로써 언급되는 스키마&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;mySQL에서는 테이블의 집합체로써의 데이터베이스를 스키마라고 얘기한다. 그래서 데이터베이스 만드는 코드랑 스키마 만드는 코드가 같다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;mysql &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DATABASE&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;Sparta&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

mysql &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SCHEMA&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;Greek&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-json-xml-에서-언급되는-스키마&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-json-xml-%EC%97%90%EC%84%9C-%EC%96%B8%EA%B8%89%EB%90%98%EB%8A%94-%EC%8A%A4%ED%82%A4%EB%A7%88&quot; aria-label=&quot;4 json xml 에서 언급되는 스키마 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. JSON, XML 에서 언급되는 스키마&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSON과 XML은 데이터를 형식화하는 방법이다. 이들과 함께 사용되는 스키마는 데이터의 구조를 알 수 있게 해주고, validation시 활용한다. (스키마에 맞지 않는 데이터를 보냈다면 오류를 발생시킨다던지)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;참고 자료&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tcpschool.com/json/json_schema_schema&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;http://tcpschool.com/json/json&lt;em&gt;schema&lt;/em&gt;schema&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tcpschool.com/xml/xml_xsd_intro&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;http://tcpschool.com/xml/xml&lt;em&gt;xsd&lt;/em&gt;intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/XML_%EC%8A%A4%ED%82%A4%EB%A7%88_(W3C)&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://ko.wikipedia.org/wiki/XML&lt;em&gt;스키마&lt;/em&gt;(W3C)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;아래 예시는 각각 JSON, XML 스키&lt;strong&gt;****&lt;/strong&gt;마를 나타낸다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;강아지 스키마&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;이 스키마는 강아지에 관한 데이터를 검증하기 위해 작성된 스키마임.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;category&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;integer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;weight&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;number&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;xml&quot;&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;    &lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;schema&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;elementFormDefault&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;qualified&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;xs&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/2001/XMLSchema&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    	...
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;sequence&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Recipient&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;xs:string&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;House&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;xs:string&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Street&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;xs:string&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Town&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;xs:string&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;County&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;xs:string&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;minOccurs&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;PostCode&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;xs:string&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;element&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Country&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;minOccurs&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    
        ...
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xs:&lt;/span&gt;schema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id=&quot;정리하면&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%EB%A6%AC%ED%95%98%EB%A9%B4&quot; aria-label=&quot;정리하면 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;정리하면…&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 324px;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fe1f486cda196bf6cbbb07c6b2bb0ac1/b20dd/theory_practice.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 107.09876543209877%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAAsSAAALEgHS3X78AAACiklEQVQ4y22TeUtqURTF/ex+AhGMMBI0RJFyjBxwwKlySOv5nkM5oCVqlrOmptbPex5a6v7jcu/lrL3WXnsd2ZdUq9WKZ7fbfX19rdfrj4+P+Xy+Vqs1m83xeLxcLr8OlWzzNplMCoVCuVy+vb19f3/v9XqpVIo/Dw8Pb29vG4JdMI1h+yMVzBzlORqNBoMBWlqtVjwen06n+/g1uFQqXV1d8eTozc1NOp3OZrN/papWq7SoVCqRSETgf4E/Pz85LSa8u7vjHEMOh0M+mTyZTH58fNAC8lwuN5/Pf4Hpd39/z3jg6QIecpiBoWXjGVNwABW7spF3fn5eLBZtNpvD4dDr9RcXFxaLRaVSXV5eYiEEwpTFYvELzHcmk7FarQhzuVwwBwKBs7MzXDAajTRCV7vdns1mcOzOjNXoSSQSqLXb7c/Pz3waDAbAZrPZ7/ejCHI2x8sBt/n1TypkA/P5fAhxOp1YAPjp6Skv1Y5ba7BohjCygW0I8Xq9CoXi5eWl3++Dpym27SO3CaMFeLTxjv6TkxOPx8M7OyMwAnk4YZsSGcY/9At79gGHmUGKTYA8Ojoi1XzCOZWKqOzsaWuYYBBPEqLT6dxuN5FkfrwIh8PRaLTT6exo+c9MSCFpNBqEgWt0fHzMtrEKC0klgxA4kr8ZbQtmt5gECaliN7FY7PT0lD3/5KE1zETl5881GMK0VLgNEp/JFsz0Ev5TXEzk0JF4L6Vag3GCSHKBUMWVur6+Jpsmk4lzBFvM3JKKXmq1mr7MQs5RIaMTuSNVmIxPGo2GVGIPOecQgSNtyGFzHFAqlXK5XKvVcsnWYNjZAfK4tMFgMBQKccPQjAs04oXunEMaKrgk/McjMfk30kZYuZkLJiIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source
          srcset=&quot;/static/fe1f486cda196bf6cbbb07c6b2bb0ac1/8ac56/theory_practice.webp 240w,
/static/fe1f486cda196bf6cbbb07c6b2bb0ac1/4e123/theory_practice.webp 324w&quot;
          sizes=&quot;(max-width: 324px) 100vw, 324px&quot;
          type=&quot;image/webp&quot;
        /&gt;
        &lt;source
          srcset=&quot;/static/fe1f486cda196bf6cbbb07c6b2bb0ac1/e4891/theory_practice.png 240w,
/static/fe1f486cda196bf6cbbb07c6b2bb0ac1/b20dd/theory_practice.png 324w&quot;
          sizes=&quot;(max-width: 324px) 100vw, 324px&quot;
          type=&quot;image/png&quot;
        /&gt;
        &lt;img
          class=&quot;gatsby-resp-image-image&quot;
          src=&quot;/static/fe1f486cda196bf6cbbb07c6b2bb0ac1/b20dd/theory_practice.png&quot;
          alt=&quot;theory_practice&quot;
          title=&quot;theory_practice&quot;
          loading=&quot;lazy&quot;
          style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        /&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;스키마 자체는 개요, 구조, 형식이라는 뜻을 가지고 있다. 데이터베이스에서 사용하는 스키마에 대해서만(그것도 겉할기로) 스키마를 알고 있다보니, 여러 문맥에서 사용되는 스키마를 봤을 때 헷깔렸던 것 같다. 스키마는 문맥에 따라 다른 모습으로 머릿속에 그려져야 한다. 이론과 실제가 머리에 들어오게 되어, 이제는 스키마가 뭔지 확실히 얘기할 수 있다는 확신이 생겼다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[글또와 개발 블로그를 시작하며]]></title><description><![CDATA[개발 블로그 출사표]]></description><link>https://lumen.netlify.com/posts/start-blog</link><guid isPermaLink="false">https://lumen.netlify.com/posts/start-blog</guid><pubDate>Wed, 26 Feb 2020 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 640px;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c6dfa790b84533d37df25edb573c1834/70d1f/justwrite.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 99.84375%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAAzUlEQVQ4y2NgYGD4T2U8auCQMJCRkRFOwzATExMYw9gwNfR3IS8f/399Pb3/nJyc/0VFRf9raWn9V1RU/B8WFvbfw8Pjv4qKyn9nZ5f/yspK/7mAanAaCPNCeETk/xnTp/1vbGj4v2L5iv8T+vv+6wEt2LBh4/8FCxb8Lyoq/j9t2vT/Gzds+F9TXfmfkZALdYGaNTQ0/uvr64Oxioryf3Z29v8SkpL/paSk/gsKCoJpPT19INb9z8PDTecwxBaryOIwNp6YHs0powaSigG8wqxGbmD/wgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
        &lt;source
          srcset=&quot;/static/c6dfa790b84533d37df25edb573c1834/8ac56/justwrite.webp 240w,
/static/c6dfa790b84533d37df25edb573c1834/d3be9/justwrite.webp 480w,
/static/c6dfa790b84533d37df25edb573c1834/0ba47/justwrite.webp 640w&quot;
          sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
          type=&quot;image/webp&quot;
        /&gt;
        &lt;source
          srcset=&quot;/static/c6dfa790b84533d37df25edb573c1834/e4891/justwrite.png 240w,
/static/c6dfa790b84533d37df25edb573c1834/0ce91/justwrite.png 480w,
/static/c6dfa790b84533d37df25edb573c1834/70d1f/justwrite.png 640w&quot;
          sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
          type=&quot;image/png&quot;
        /&gt;
        &lt;img
          class=&quot;gatsby-resp-image-image&quot;
          src=&quot;/static/c6dfa790b84533d37df25edb573c1834/70d1f/justwrite.png&quot;
          alt=&quot;justwrite&quot;
          title=&quot;justwrite&quot;
          loading=&quot;lazy&quot;
          style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        /&gt;
      &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;개발-블로그를-시작하게-된-배경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EB%B0%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B2%8C-%EB%90%9C-%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;개발 블로그를 시작하게 된 배경 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;개발 블로그를 시작하게 된 배경&lt;/h1&gt;
&lt;p&gt;우리 회사 대표는 네트워크의 달인이다. 적극적으로 멋진 사람들에게 SNS로 다가가 조언을 구하고, 좋은 인맥을 만든다. 개발자는 개발을 잘 해야되지 않겠나 하는 회의적인 시각이 처음에 있었지만, 좋은 개발자를 만나는 가장 좋은 방법은 결국 네트워크라는 생각이 들어서 네트워킹에도 조금씩 투자를 해야겠다는 생각이 들었다. 그래서 다른 개발자들은 어떻게 네트워킹을 하고 있는지 많이 검색해봤다. SNS, 블로그 등 다양한 채널이 있었지만 그중 가장 적합하다고 생각한 건 개발 블로그였다. 많은 개발자들이 자신의 성과를 블로그로 차곡차곡 잘 정리함으로써 네트워킹 뿐만 아니라 커뮤니케이션과 개발 실력 등 많은 이점을 얻고 있었고, 이에 동기부여가 되어 개발 블로그를 시작하기로 결심하였다.&lt;/p&gt;
&lt;h2 id=&quot;헤맨-끝에-글또와-함께하다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%97%A4%EB%A7%A8-%EB%81%9D%EC%97%90-%EA%B8%80%EB%98%90%EC%99%80-%ED%95%A8%EA%BB%98%ED%95%98%EB%8B%A4&quot; aria-label=&quot;헤맨 끝에 글또와 함께하다 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;헤맨 끝에 글또와 함께하다&lt;/h2&gt;
&lt;p&gt;막상 블로그를 시작해보니 티스토리, 벨로그, 깃헙 페이지, 개츠비 등등 글을 쓰는 것보다는 플랫폼에 눈이 돌아가서 이것 저것 옮겨다니는데 급급했다. 그림을 그려야되는데 붓만 계속 새로 사는 것과 같달까… 거기에 일이 바쁘다는 핑계가 더해져 개발 블로그를 거의 하지 않았었다. 그런 와중에 개발자 동료를 통해 글또를 알게 되어 좋은 기회로 함께하게 됐다. 함께 가려면 멀리 가라 했던가. 글또의 여러 개발자분들과 함께 꾸준히 글쓰기로 멀리 갈 수 있기를 바란다.&lt;/p&gt;
&lt;h1 id=&quot;블로그를-시작한-이유와-목적을-기억하자&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%9C-%EC%9D%B4%EC%9C%A0%EC%99%80-%EB%AA%A9%EC%A0%81%EC%9D%84-%EA%B8%B0%EC%96%B5%ED%95%98%EC%9E%90&quot; aria-label=&quot;블로그를 시작한 이유와 목적을 기억하자 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;블로그를 시작한 이유와 목적을 기억하자&lt;/h1&gt;
&lt;p&gt;개발 블로그를 시작하기에 앞서, 왜 내가 개발 블로그를 시작하려는지, 무엇을 얻고자 하는지를 명확히 해두고자 한다.
열정을 가지고 열심히 글을 쓸 것이나, 동기부여가 때로는 떨어질지도 모른다. 그 때마다 이 글을 보고 초심으로 돌아갔으면 좋겠다.&lt;/p&gt;
&lt;h2 id=&quot;왜-개발-블로그를-시작하려-하는가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%99%9C-%EA%B0%9C%EB%B0%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A0%A4-%ED%95%98%EB%8A%94%EA%B0%80&quot; aria-label=&quot;왜 개발 블로그를 시작하려 하는가 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;왜 개발 블로그를 시작하려 하는가?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;개발 블로그를 잘 만들어 두면, 그것 자체가 나의 브랜딩이 되고, 나의 이력서이자 포트폴리오가 된다.&lt;/li&gt;
&lt;li&gt;기록은 커뮤니케이션 중 최고의 무기라고 생각한다. 글을 잘 쓴다는 것은 생각을 잘 정리한다는 것이며, 생각이 잘 정돈된 사람은 말도 잘한다.&lt;/li&gt;
&lt;li&gt;꾸준히 뭔가를 한다는 것은 성공에 있어서 상당히 중요하다고 생각한다. 이전까지 블로그에 대해서 생각만 많았지, 정작 실천하는 것이 별로 없었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;무엇을-얻고자-하는가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B4%EC%97%87%EC%9D%84-%EC%96%BB%EA%B3%A0%EC%9E%90-%ED%95%98%EB%8A%94%EA%B0%80&quot; aria-label=&quot;무엇을 얻고자 하는가 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;무엇을 얻고자 하는가?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;커뮤니케이션&lt;/li&gt;
&lt;li&gt;글쓰기 실력&lt;/li&gt;
&lt;li&gt;꾸준한 실천력&lt;/li&gt;
&lt;li&gt;개발 실력&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;어떻게-개발-블로그를-운영할-것인가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B0%9C%EB%B0%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%9A%B4%EC%98%81%ED%95%A0-%EA%B2%83%EC%9D%B8%EA%B0%80&quot; aria-label=&quot;어떻게 개발 블로그를 운영할 것인가 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;어떻게 개발 블로그를 운영할 것인가?&lt;/h2&gt;
&lt;p&gt;개발하면서 공부한 내용들, 삽질했던 내용들을 글로 정리할 예정이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javascript (node.JS, typescript 등)&lt;/li&gt;
&lt;li&gt;RDBMS, SQL&lt;/li&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;백엔드 개발을 하면서 얻은 인사이트들&lt;/li&gt;
&lt;li&gt;관심 기술들(graphQL, 데이터 분석 등등)&lt;/li&gt;
&lt;li&gt;그외 진행하는 개인프로젝트 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;벤치마크한-개발-블로그들&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B2%A4%EC%B9%98%EB%A7%88%ED%81%AC%ED%95%9C-%EA%B0%9C%EB%B0%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%93%A4&quot; aria-label=&quot;벤치마크한 개발 블로그들 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;벤치마크한 개발 블로그들&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;개발자 이현섭님 : &lt;a href=&quot;https://hyunseob.github.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://hyunseob.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;개발자 윤우식님 : &lt;a href=&quot;https://suitee.me/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://suitee.me/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;개발자 박상권님 : &lt;a href=&quot;https://gun0912.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://gun0912.tistory.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ELB 로드밸런서 관련 오류를 해결하면서...]]></title><link>https://lumen.netlify.com/posts/fix-elb-error</link><guid isPermaLink="false">https://lumen.netlify.com/posts/fix-elb-error</guid><pubDate>Mon, 20 Jan 2020 22:40:32 GMT</pubDate><content:encoded>&lt;h3 id=&quot;문제-발생&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C-%EB%B0%9C%EC%83%9D&quot; aria-label=&quot;문제 발생 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;문제 발생&lt;/h3&gt;
&lt;p&gt;우리 서비스에서 동물 등록을 진행하려면, 동물 보호 시스템에서 다운로드 받은 엑셀 파일을 파싱하여 우리 DB에 업로드 한다.
이 때, 적게는 수십 개, 많게는 수백 개 이상의 동물 등록 데이터를 API 서버에 HTTP 리퀘스트로 보낸다. &lt;/p&gt;
&lt;p&gt;최근 업로드한 데이터가 DB에 있던 기존 데이터와 맞는지 검사하는 로직이 추가되면서, 동물 등록 관련 프로세스가 헤비해졌다.
엑셀에 있는 데이터를 통으로 서버로 보내서 비교하기 때문에, 패킷도 무겁고 로직도 무겁다. &lt;/p&gt;
&lt;p&gt;이로 인해 200건 이상의 데이터를 리퀘스트했을 때 에러 발생이 많아졌다.
에러 메시지는 502 Bad gateway. CORS 관련 에러 메시지였다. &lt;/p&gt;
&lt;h3 id=&quot;원인-파악&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9B%90%EC%9D%B8-%ED%8C%8C%EC%95%85&quot; aria-label=&quot;원인 파악 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;원인 파악&lt;/h3&gt;
&lt;p&gt;CORS 관련 에러는 서버, 로드밸런서로 인해 생길 수 있는데, 삽질을 하며 파악해본 결과 로드밸런서의 문제로 파악했다.&lt;/p&gt;
&lt;p&gt;다음 두 가지 원인으로 502 에러가 발생했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트 - 로드밸런서 사이에 한 번에 너무 많은 리퀘스트를 보낼 때&lt;/li&gt;
&lt;li&gt;로드밸런서 - 서버 사이에 keep alive timeout이 끝나서 커넥션이 끊긴 상태인데 또 리퀘스트를 시도할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;해결&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%B4%EA%B2%B0&quot; aria-label=&quot;해결 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;해결&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라 - 로드 밸런서 사이에는 리퀘스트 갯수가 50개 이상일 경우, 리퀘스트를 50개씩 끊어서 보내도록 구현했다. (전체 프로미스 - 내부 50개씩 보내는 프로미스로 비동기 처리) &lt;/li&gt;
&lt;li&gt;로드밸런서 - 서버 사이에는 keep alive timeout 관련 설정을 추가해서 해결했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;결론&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B2%B0%EB%A1%A0&quot; aria-label=&quot;결론 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;결론&lt;/h3&gt;
&lt;p&gt;힘들었던 점은, 나는 클라이언트-로드밸런서 / 혹은 로드밸런서-서버 둘 중 하나만 해결하면 문제가 해결될 줄 알았는데, 그렇지는 않았다는 점이다.&lt;/p&gt;
&lt;p&gt;마지막에 지푸라기라도 잡는 심정으로, 클라, 서버 둘 다 처리한 걸 테스트해보니까 문제가 해결됐다.
어쩌면 ELB 관련 설정을 잘 해주면 단번에 해결될 문제였을지도 모르겠다. ELB 관련 공부가 더 필요하다.&lt;/p&gt;
&lt;p&gt;테스트 환경과 라이브 환경이 다른 것도 이번 삽질의 원인이었던 거 같으니, 연습을 실전처럼 하자고 건의해야겠다.
버그 해결에는 다양한 시도와 창의적인 생각이 필수적인듯!&lt;/p&gt;</content:encoded></item></channel></rss>