<?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[무지성 개발 탈출기 | Feed]]></title><description><![CDATA[chanuuuu's devlog]]></description><link>https://chanuuuuu.github.io</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 05 Nov 2021 15:24:33 GMT</lastBuildDate><item><title><![CDATA[JS의 기본 개념 2. this]]></title><description><![CDATA[this란? 함수 내에서 함수를 호출한 객체에 접근하기 위한 JS의 키워드   함수 내에서 를 보신 적이 있으신가요? 특히 나 객체를 생성하기 위해서 선언하는 함수를 사용한 경험이 있다면, 를 많이 보셨을 겁니다. python의 와 같이 는 기본적으…]]></description><link>https://chanuuuuu.github.io/this/</link><guid isPermaLink="false">https://chanuuuuu.github.io/this/</guid><pubDate>Sat, 06 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;this란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#this%EB%9E%80&quot; aria-label=&quot;this란 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;this란?&lt;/h1&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;함수 내에서 함수를 호출한 객체에 접근하기 위한 JS의 키워드&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  함수 내에서 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 보신 적이 있으신가요? 특히 &lt;code class=&quot;language-text&quot;&gt;Class&lt;/code&gt;나 객체를 생성하기 위해서 선언하는 함수를 사용한 경험이 있다면, &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 많이 보셨을 겁니다. python의 &lt;code class=&quot;language-text&quot;&gt;self&lt;/code&gt;와 같이 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 기본적으로 함수를 호출하는 객체를 가리키고 있지만, 선언 방식이나 호출 방식에 따라 전혀 다른 결과가 나올 수 있습니다. 사실 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 사용할 일이 잘 없지만, 알고 사용하는 것과 모르고 사용하는 것에는 큰 차이가 존재하기 때문에 이번 기회에 정리해보고자 합니다. &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩룰을 소개하기 전에 바인딩룰에 필요한 기본 개념들을 먼저 소개하도록 하겠습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;h2 id=&quot;기본-개념&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%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;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-code-classlanguage-textnewcode-연산자를-통한-객체의-생성-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-code-classlanguage-textnewcode-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%ED%86%B5%ED%95%9C-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;1 code classlanguage textnewcode 연산자를 통한 객체의 생성 과정 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;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자를 통한 객체의 생성 과정&lt;/h3&gt;
&lt;p&gt;  객체의 형식을 정의하는 생성자 함수와 &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자를 통해 객체를 생성할 수 있습니다. 이 방식은 세부적으로 아래와 같이 동작합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;새로운 객체를 생성하고 생성된 객체가 생성자 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;를 참조할 수 있도록 합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;구체적으로 표현하자면, 생성자 함수가 가지는 &lt;em&gt;Prototype Object&lt;/em&gt;를 &lt;em&gt;Prototype Link&lt;/em&gt;에 바인딩 된 새로운 객체를 생성합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;생성된 객체를 함수 내의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩하여 함수를 수행합니다. 이때, &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해 명시적으로 호출되는 프로퍼티와 메소드를 객체에 추가합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함수의 수행이 완료되면 해당 객체를 반환합니다.&lt;/strong&gt;  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위 생성방식에서처럼 생성자 함수를 통해 객체의 프로퍼티와 메소드를 정의하기 위해서는 반드시 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 사용해야 한다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id=&quot;2-lexical-scope&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-lexical-scope&quot; aria-label=&quot;2 lexical scope 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. lexical scope&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;렉시컬 스코프란, 함수의 스코프가 함수의 선언시점의 스코프로 결정되는 방식&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  스코프는 참조가 가능한 식별자들의 집합으로, 참조 범위를 의미합니다. 자바스크립트는 기본적으로 &apos;함수 블록 스코프&apos;를 사용합니다. 상위 함수 블록에 대해서만 참조가 가능하다는 것입니다. 하지만 &apos;함수 블록 스코프&apos; 만으로는 명확한 참조 범위를 정의할 수 없습니다. 다음의 예를 봅시다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; x &lt;span class=&quot;token operator&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 keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f1&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 keyword&quot;&gt;const&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&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;x&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;// .... 1&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;f2&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 keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f2&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;
		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;x&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;// .... 2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;f1&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;p&gt;  함수 &lt;code class=&quot;language-text&quot;&gt;f1&lt;/code&gt;의 출력값은 &apos;함수 블록 스코프&apos;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;f1&lt;/code&gt; 내부에 정의된 &lt;code class=&quot;language-text&quot;&gt;x&lt;/code&gt;의 값 20을 출력합니다. 하지만 문제는 &lt;code class=&quot;language-text&quot;&gt;f2&lt;/code&gt;의 출력값입니다. &apos;함수 블록 스코프&apos;를 사용한다고 하였는데, 함수 &lt;code class=&quot;language-text&quot;&gt;f2&lt;/code&gt;는 선언 시점의 스코프와 실행 시점의 스코프가 다릅니다. 선언 시점의 스코프는 전역이지만 수행 시점의 스코프는 &lt;code class=&quot;language-text&quot;&gt;f1&lt;/code&gt;내부입니다. 만약 선언 시점의 스코프를 사용한다면 전역의 &lt;code class=&quot;language-text&quot;&gt;x&lt;/code&gt;, 10의 값을 출력하지만 수행 시점의 스코프를 사용한다면 내부 변수 &lt;code class=&quot;language-text&quot;&gt;x&lt;/code&gt;, 20의 값을 출력할 것입니다. 여기서 &lt;strong&gt;JS는 선언 시점의 스코프를 사용하는 &apos;렉시컬 스코프&apos;를 사용합니다.&lt;/strong&gt; 즉, 호출 시점의 스코프가 아닌 선언 시점의 스코프를 사용하기 때문에 &lt;code class=&quot;language-text&quot;&gt;f2&lt;/code&gt;의 출력값은 전역의 &lt;code class=&quot;language-text&quot;&gt;x&lt;/code&gt;, 10의 값이 됩니다. 이렇게 &lt;strong&gt;JS는 &apos;함수 블록 스코프&apos;와 &apos;렉시컬 스코프&apos;를 사용합니다. 함수는 자신이 선언된 상위 함수 블록이 스코프가 됩니다.&lt;/strong&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;this-바인딩-룰&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#this-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%A3%B0&quot; aria-label=&quot;this 바인딩 룰 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;this 바인딩 룰&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;  이제 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩룰을 제시하고 각각에 대해 설명해보자 합니다. 먼저 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩룰 전체를 살펴보겠습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;기본적으로 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 함수를 호출하는 객체에 바인딩 됩니다. 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우, 전역객체에 바인딩 됩니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함수의 내부 함수는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않습니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;화살표 함수&lt;/strong&gt;(&lt;strong&gt;Arrow function)의 경우, &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 존재하지 않습니다. 그러므로 화살표 함수 내의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클래스(Class)의 경우, 함수 블록 상의 모든 코드는 &lt;em&gt;&apos;strict mode&apos;&lt;/em&gt;로 수행됩니다.  &apos;&lt;em&gt;strict mode&lt;/em&gt;&apos;는 기본적으로 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 자동으로 바인딩하지 않으며, 호출 객체가 명시되지 않은 경우, &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;를 반환합니다.&lt;/strong&gt;  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  1번 규칙이 기본 규칙이라고 한다면, 나머지는 특수한 상황에서의 규칙이라고 볼 수 있겠습니다. 이제 규칙을 예제와 함께 하나씩 설명해보겠습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id=&quot;1-기본적으로-code-classlanguage-textthiscode는-함수를-호출하는-객체에-바인딩-됩니다-호출하는-객체가-명시되지-않은-단순-함수-호출의-경우-전역객체에-바인딩-됩니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-code-classlanguage-textthiscode%EB%8A%94-%ED%95%A8%EC%88%98%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%A9%EB%8B%88%EB%8B%A4-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B0%9D%EC%B2%B4%EA%B0%80-%EB%AA%85%EC%8B%9C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EB%8B%A8%EC%88%9C-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C%EC%9D%98-%EA%B2%BD%EC%9A%B0-%EC%A0%84%EC%97%AD%EA%B0%9D%EC%B2%B4%EC%97%90-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%A9%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;1 기본적으로 code classlanguage textthiscode는 함수를 호출하는 객체에 바인딩 됩니다 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우 전역객체에 바인딩 됩니다 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;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 함수를 호출하는 객체에 바인딩 됩니다. 호출하는 객체가 명시되지 않은 단순 함수 호출의 경우, 전역객체에 바인딩 됩니다.&lt;/h3&gt;
&lt;p&gt;  &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 함수를 호출한 객체에 접근하기 위한 JS의 키워드라고 하였습니다. 메소드는 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해 자신을 호출한 객체에 접근할 수 있습니다. 하지만 &lt;strong&gt;호출 객체가 명시되지 않은 경우 전역객체에 바인딩 됩니다.&lt;/strong&gt; 이때, 전역객체는 JS가 수행되는 환경에 따라 달라집니다.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;전역객체의 종류&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Node&lt;/em&gt; - &lt;code class=&quot;language-text&quot;&gt;global&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Browser&lt;/em&gt; - &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;strict mode&lt;/em&gt; - &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;DOM&lt;/em&gt; - &lt;code class=&quot;language-text&quot;&gt;document&lt;/code&gt; (전역 객체라기보다는 최상위 객체의 개념)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  예제를 통해 첫 번째 규칙을 설명해보도록 하겠습니다. &lt;span class=&apos;small-text&apos;&gt;(설명을 위해 모든 예제는 전역객체가 window로 바인딩 되는 브라우저상에서 수행합니다.)&lt;/span&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&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;
    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 keyword&quot;&gt;this&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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;
            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 keyword&quot;&gt;this&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 keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&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;// .... 1&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; chanjong &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&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;// .... 2&lt;/span&gt;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodA&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;// .... 3&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodAA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodA&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;methodAA&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;// .... 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;  생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;를 통해 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;가 생성되었습니다. 인스턴스는 메소드 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;를 가지고 있습니다. 출력값을 하나씩 살펴보겠습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;&lt;/strong&gt; - &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자를 통해 생성자 함수를 호출하게 되면 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 새롭게 생성된 객체로 바인딩 되기 때문에 생성된 객체가 생성자 함수를 호출하는 것으로 볼 수 있습니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt;&lt;/strong&gt; - 생성자 함수를 단순 호출하게 되면, 객체 생성이 수행되지 않기 때문에 함수와 마찬가지로 전역객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;&lt;/strong&gt; - 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;는 생성자 함수 내의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt; 를 갖게 됩니다. 또한 메소드를 호출하는 객체는 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이므로 호출하는 객체에 바인딩되는 룰에 의해 출력값은 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;가 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt;&lt;/strong&gt; -  인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;가 가진 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;를 새로운 함수 &lt;code class=&quot;language-text&quot;&gt;methodAA()&lt;/code&gt;로 할당하여 호출하였습니다.  &lt;code class=&quot;language-text&quot;&gt;methodAA()&lt;/code&gt;는 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;이지만 메소드가 어떤 인스턴스에 정의되어있는가는 중요하지 않습니다. 중요한 것은 호출하는 객체입니다. &lt;code class=&quot;language-text&quot;&gt;methodAA()&lt;/code&gt;의 호출하는 객체는 명시되지 않았기 때문에 전역객체에 바인딩 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3 id=&quot;2-함수의-내부-함수는-외부-함수의-code-classlanguage-textthiscode로-바인딩-되지-않습니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%ED%95%A8%EC%88%98%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%95%A8%EC%88%98%EB%8A%94-%EC%99%B8%EB%B6%80-%ED%95%A8%EC%88%98%EC%9D%98-code-classlanguage-textthiscode%EB%A1%9C-%EB%B0%94%EC%9D%B8%EB%94%A9-%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;2 함수의 내부 함수는 외부 함수의 code classlanguage textthiscode로 바인딩 되지 않습니다 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;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않습니다.&lt;/h3&gt;
&lt;p&gt;  1번 규칙 4번 예제에서 메소드의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 는 정의된 인스턴스가 아닌 호출하는 인스턴스에 바인딩 되는 것을 확인하였습니다. 사실 이러한 결과가 나타나는 것은 &lt;strong&gt;중첩된 함수에서 외부 함수 내 선언된 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않기 때문&lt;/strong&gt;입니다. 만약 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되었다면, 1번 규칙 4번 예제의 결과는 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;가 출력되었을 것입니다. 아래의 예제를 통해 한 번 더 확인해봅시다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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;
			  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 keyword&quot;&gt;this&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;// .... 1&lt;/span&gt;
				
				&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;innerFunc&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;
					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 keyword&quot;&gt;this&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 function&quot;&gt;innerFunc&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;// .... 2&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodB&lt;/span&gt; &lt;span class=&quot;token operator&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;
			  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 keyword&quot;&gt;this&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;// .... 3&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;
		    		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 keyword&quot;&gt;this&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;// .... 4&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 keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodA&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;
chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodB&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;p&gt;  &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;는 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해 자신을 호출한 객체를 출력하고, 내부에 &lt;code class=&quot;language-text&quot;&gt;innerFunc()&lt;/code&gt;함수를 선언, 수행합니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;는 내부에서 비동기 함수를 사용, 콜백 함수를 통해서 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 출력합니다. 두 메소드를 사용하였을 때의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩의 결과를 살펴보도록 하겠습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;을 호출하는 객체가 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 출력값은 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;입니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 바인딩 되지 않습니다. 내부 함수의 호출 객체를 확인해야 합니다. 현재 호출객체가 명시되어있지 않기 때문에 전역객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;을 호출하는 객체가 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 출력값은 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;입니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는  외부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 바인딩되지 않는다고 배웠습니다. 비동기 콜백 함수도 동일합니다. 콜백 함수의 호출 객체는 명시되어있지 않기 때문에 반드시 전역객체에 바인딩 됩니다. 중요한 것은 함수의 호출객체라는 점은 1번 규칙과 동일하다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3 id=&quot;3-화살표-함수arrow-function의-경우-code-classlanguage-textthiscode가-존재하지-않습니다-그러므로-화살표-함수-내의-code-classlanguage-textthiscode는-다른-변수와-동일하게-함수의-렉시컬-스코프-상의-code-classlanguage-textthiscode를-참조합니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98arrow-function%EC%9D%98-%EA%B2%BD%EC%9A%B0-code-classlanguage-textthiscode%EA%B0%80-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4-%EA%B7%B8%EB%9F%AC%EB%AF%80%EB%A1%9C-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98-%EB%82%B4%EC%9D%98-code-classlanguage-textthiscode%EB%8A%94-%EB%8B%A4%EB%A5%B8-%EB%B3%80%EC%88%98%EC%99%80-%EB%8F%99%EC%9D%BC%ED%95%98%EA%B2%8C-%ED%95%A8%EC%88%98%EC%9D%98-%EB%A0%89%EC%8B%9C%EC%BB%AC-%EC%8A%A4%EC%BD%94%ED%94%84-%EC%83%81%EC%9D%98-code-classlanguage-textthiscode%EB%A5%BC-%EC%B0%B8%EC%A1%B0%ED%95%A9%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;3 화살표 함수arrow function의 경우 code classlanguage textthiscode가 존재하지 않습니다 그러므로 화살표 함수 내의 code classlanguage textthiscode는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 code classlanguage textthiscode를 참조합니다 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. 화살표 함수(Arrow function)의 경우, &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 존재하지 않습니다. 그러므로 화살표 함수 내의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 다른 변수와 동일하게 함수의 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조합니다.&lt;/h3&gt;
&lt;p&gt;  화살표 함수는 &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt; 키워드 대신 &lt;code class=&quot;language-text&quot;&gt;()=&amp;gt;{}&lt;/code&gt;의 형태로 정의하는 함수를 말합니다. 즉, 화살표 함수는 함수를 정의하는 또 다른 방식입니다. 이렇게 두 가지 방식을 제공하는 것에는 이유가 있습니다. &lt;strong&gt;바로 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩에 대한 차이입니다.&lt;/strong&gt; &lt;em&gt;mozlia docs&lt;/em&gt;의 화살표 함수에 대한 글을 번역하면 다음과 같습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;arrow function은 함수를 편리하게 선언할 수 있는 시맨틱 슈가로만 볼 수 있다. 하지만 그 차이는 this의 바인딩에 있다. 기본적으로 arrow function은 함수 내에 this를 가지지 않는다. 단순히 렉시컬 스코프 상의 this를 참조한다. 이를 통해서 (setTimeout, setInterval, addEventListener) 와 같은 DOM-element function에서의 this 바인딩의 목적을 가진다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  2번 규칙에 따라 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 바인딩 되지 않습니다. 위의 2번 규칙 1번 예시에서처럼 외부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 사용하고자 함에도 전역객체로 바인딩 되어 사용하지 못하는 경우가 발생합니다. 이러한 바인딩 문제를 해결하기 위해서 화살표 함수를 사용합니다. &lt;strong&gt;화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 내부 함수를 화살표 함수로 선언하게 되면 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하여 사용할 수 있게 됩니다.&lt;/strong&gt; 위 예제들을 화살표 함수로 바꿔서 출력값을 확인해보도록 하겠습니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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;
			  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 keyword&quot;&gt;this&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;// .... 1&lt;/span&gt;
				
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;innerFunc&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 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 keyword&quot;&gt;this&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 function&quot;&gt;innerFunc&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;// .... 2&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodB&lt;/span&gt; &lt;span class=&quot;token operator&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;
			  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 keyword&quot;&gt;this&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;// .... 3&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 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 keyword&quot;&gt;this&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;// .... 4&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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodC&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 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 keyword&quot;&gt;this&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 keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodA&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;
chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodB&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 keyword&quot;&gt;const&lt;/span&gt; methodAA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodA&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodCC &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodC&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;methodAA&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;// ... 5&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;methodCC&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;// ... 6&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;을 호출하는 객체가 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 출력값은 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;입니다.&lt;br&gt;
&lt;br/&gt;    &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;innerFunc()&lt;/code&gt;가 화살표 함수로 선언되었습니다. 화살표 함수는 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 1번의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일한 객체 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;를 출력합니다. 즉, &lt;code class=&quot;language-text&quot;&gt;innerFunc()&lt;/code&gt;선언한 함수 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 반드시 상위 함수 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일한 값을 가지게 됩니다.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;중요한 것은 &lt;code class=&quot;language-text&quot;&gt;innerFunc()&lt;/code&gt;를 &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt; 키워드로 정의한 2번 규칙 2번 예제와의 차이입니다. &lt;strong&gt;내부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 바인딩 되지 않고, 호출객체가 명시되어있지 않기 때문에 전역객체에 바인딩 되는 결과를 보았을 겁니다.&lt;/strong&gt; 이렇게 내부 함수에서도 호출 객체에 접근하기 위해서 화살표 함수를 사용합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;을 호출하는 객체가 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 출력값은 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;입니다.&lt;br&gt;
&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt;  &lt;code class=&quot;language-text&quot;&gt;setTimeout()&lt;/code&gt;의 콜백 함수가 화살표 함수로 선언되었습니다. 화살표 함수는 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 3번의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일한 객체 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;를 출력합니다. 즉, &lt;code class=&quot;language-text&quot;&gt;setTimeout()&lt;/code&gt;의 콜백 함수를 선언한 함수 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 반드시 상위 함수 &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일한 값을 가지게 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 메소드 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;를 새로운 함수로 선언하여 호출하였습니다. 중요한 것은 호출 객체라고 배웠습니다. &lt;code class=&quot;language-text&quot;&gt;methodAA()&lt;/code&gt;를 호출하는 객체가 명시되어있지 않기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 전역 객체에 바인딩 됩니다. 화살표 함수 &lt;code class=&quot;language-text&quot;&gt;innerFunc()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 또한 동일한 객체를 출력합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 메소드 &lt;code class=&quot;language-text&quot;&gt;methodC()&lt;/code&gt;를 새로운 함수 &lt;code class=&quot;language-text&quot;&gt;methodCC()&lt;/code&gt;로 선언하여 호출하였습니다. &lt;code class=&quot;language-text&quot;&gt;methodC()&lt;/code&gt;는 화살표 함수로 선언되었으며, 화살표 함수는 렉시컬 스코프의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조한다고 설명하였습니다. 렉시컬 스코프는 함수의 선언 시점의 스코프를 말하기 때문에 화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 찾기 위해서는 선언하는 시점을 확인해야 합니다. &lt;code class=&quot;language-text&quot;&gt;methodC()&lt;/code&gt;가 선언되는 블록은 생성자 함수 내로, 선언 시점의 생성자 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 새롭게 생성되는 인스턴스가 바인딩 됩니다. 그러므로 &lt;code class=&quot;language-text&quot;&gt;methodC()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 또한 인스턴스를 참조하게 됩니다.   &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;중요한 것은 화살표 함수의 바인딩은 선언 시점에 이루어지기 때문에 호출 인스턴스의 영향을 받지 않는다는 것입니다.&lt;/strong&gt; 화살표 함수의 특성으로 인해 &lt;code class=&quot;language-text&quot;&gt;methodCC()&lt;/code&gt;로 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;methodC()&lt;/code&gt;를 선언하여 호출하더라도 &lt;code class=&quot;language-text&quot;&gt;methodC()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 그대로 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;를 참조하게 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함수 정의 방법에 따라 바인딩을 위해 확인해야 하는 영역이 호출 영역인지, 선언 영역인지의 차이가 존재하는 것을 기억해야 합니다.&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;methodAA()&lt;/code&gt;와의 차이를 생각해봅시다. 기존의 &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt; 키워드로 선언된 메소드는 호출객체에 바인딩 되었습니다. 하지만 화살표 함수로 선언된 메소드는 호출 객체가 아닌 렉시컬 스코프(선언 시점의 상위 함수 스코프) 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조합니다. 이로 인해 호출 객체가 명시되어있지 않음에도 계속해서 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해 인스턴스에 접근할 수 있었습니다.   &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;주의할 점은 화살표 함수의 경우, 명시적 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩을 통한 바인딩이 수행되지 않습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3 id=&quot;4-클래스class의-경우-함수-블록-상의-모든-코드는-strict-mode로-수행됩니다--strict-mode는-기본적으로-code-classlanguage-textthiscode를-자동으로-바인딩하지-않으며-호출-객체가-명시되지-않은-경우-code-classlanguage-textundefinedcode를-반환합니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-%ED%81%B4%EB%9E%98%EC%8A%A4class%EC%9D%98-%EA%B2%BD%EC%9A%B0-%ED%95%A8%EC%88%98-%EB%B8%94%EB%A1%9D-%EC%83%81%EC%9D%98-%EB%AA%A8%EB%93%A0-%EC%BD%94%EB%93%9C%EB%8A%94-strict-mode%EB%A1%9C-%EC%88%98%ED%96%89%EB%90%A9%EB%8B%88%EB%8B%A4--strict-mode%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-code-classlanguage-textthiscode%EB%A5%BC-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%B0%94%EC%9D%B8%EB%94%A9%ED%95%98%EC%A7%80-%EC%95%8A%EC%9C%BC%EB%A9%B0-%ED%98%B8%EC%B6%9C-%EA%B0%9D%EC%B2%B4%EA%B0%80-%EB%AA%85%EC%8B%9C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EA%B2%BD%EC%9A%B0-code-classlanguage-textundefinedcode%EB%A5%BC-%EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;4 클래스class의 경우 함수 블록 상의 모든 코드는 strict mode로 수행됩니다  strict mode는 기본적으로 code classlanguage textthiscode를 자동으로 바인딩하지 않으며 호출 객체가 명시되지 않은 경우 code classlanguage textundefinedcode를 반환합니다 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. &lt;strong&gt;클래스(Class)의 경우, 함수 블록 상의 모든 코드는 &lt;em&gt;&apos;strict mode&apos;&lt;/em&gt;로 수행됩니다.  &apos;&lt;em&gt;strict mode&lt;/em&gt;&apos;는 기본적으로 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 자동으로 바인딩하지 않으며, 호출 객체가 명시되지 않은 경우, &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;를 반환합니다.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;  클래스는 생성자 함수와 동일하게 인스턴스를 생성하기 위해 사용되는 특수한 함수입니다. 클래스를 사용하더라도 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 바인딩에 대한 위의 규칙들 모두 성립됩니다. 하지만 생성자 함수에서는 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 전역객체에 바인딩 되었다면 클래스에서는 되지 않는다는 점의 차이가 존재합니다. 클래스와 생성자 함수에는 차이를 몇 가지 더 소개하겠습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;클래스의 &lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt; 내에서는 &lt;code class=&quot;language-text&quot;&gt;const&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt;과 같은 키워드를 사용하지 않으며, 프로퍼티와 메소드의 선언 시 생성자 함수에서  &lt;code class=&quot;language-text&quot;&gt;this.&lt;/code&gt;를 생략한 문법을 사용합니다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;클래스는 기본적으로 &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자를 사용하지 않는 호출은 수행될 수 없습니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;생성자 함수는 메소드가 인스턴스에 선언되지만, 클래스의 메소드는 인스턴스가 아닌 &lt;em&gt;&apos;Prototype Object&apos;&lt;/em&gt;에 저장됩니다.  이를 통해 클래스의 인스턴스들은 &lt;em&gt;Prototype Object&lt;/em&gt; 내에 선언된 메소드를 공유합니다. &lt;span class=&apos;small-text&apos;&gt;(&lt;em&gt;Prototype Object&lt;/em&gt; 개념이 낯설다면 이전의 Prototype 포스트를 읽어보시길 권합니다.)&lt;/span&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;클래스는 함수와는 다르게 호이스팅이 되지 않습니다. 반드시 선언 이후 수행되어야 합니다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위의 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;을 클래스로 구현한 예시를 통해 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩을 설명해보겠습니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Human&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&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-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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;
				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 keyword&quot;&gt;this&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 function-variable function&quot;&gt;methodB&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 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 keyword&quot;&gt;this&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 keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodA&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;// ... 1&lt;/span&gt;
chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodB&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;// ... 2&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodAA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodA&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodBB &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodB&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;methodAA&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;// ... 3&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;methodBB&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;// ... 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;을 호출하는 객체가 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 출력값은 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;입니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt;  화살표 함수는 렉시컬 스코프의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조한다고 설명하였습니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt; 의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 호출 객체인 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;이기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 출력값은 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;입니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt; -&lt;/strong&gt; 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 메소드 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;를 새로운 함수로 선언하여 호출하였습니다. 중요한 것은 호출 객체라고 배웠습니다. &lt;code class=&quot;language-text&quot;&gt;methodAA()&lt;/code&gt;를 호출하는 객체가 명시되어있지 않기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 전역 객체에 바인딩 되어야 합니다. 하지만 클래스 내에서는 전역객체가 바인딩 되지 않기 때문에 &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;가 출력됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 메소드 &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;를 새로운 함수 &lt;code class=&quot;language-text&quot;&gt;methodBB()&lt;/code&gt;로 선언하여 호출하였습니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;는 화살표 함수로 선언되었으며, 화살표 함수는 렉시컬 스코프의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조한다고 설명하였습니다. 렉시컬 스코프는 함수의 선언 시점의 스코프를 말하기 때문에 화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 찾기 위해서는 선언하는 시점을 확인해야 합니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;가 선언되는 블록은 생성자 함수 내로, 선언 시점의 생성자 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 새롭게 생성되는 인스턴스가 바인딩 됩니다. 그러므로 &lt;code class=&quot;language-text&quot;&gt;methodBB()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 또한 자신을 가진 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;를 참조하게 됩니다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;조금-더-복잡한-예&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A1%B0%EA%B8%88-%EB%8D%94-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EC%98%88&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;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;을 선언하였습니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 

	&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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 keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;innerFunc&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;
			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 keyword&quot;&gt;this&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 keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;innerArrowFunc&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 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 keyword&quot;&gt;this&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 function&quot;&gt;innerFunc&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;// .... a&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;innerArrowFunc&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;// .... b&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	
	&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodB&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 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;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;innerFunc&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;
			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 keyword&quot;&gt;this&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 keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;innerArrowFunc&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 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 keyword&quot;&gt;this&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 function&quot;&gt;innerFunc&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;// .... c&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;innerArrowFunc&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;// .... d&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;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodA&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;// .... 1&lt;/span&gt;
chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;methodB&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;// .... 2&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodAA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodA&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodBB &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodB&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;methodAA&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;// .... 3&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;methodBB&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;// .... 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;생성자 함수의 메소드로, 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;에 의해 호출되었습니다. 외부 함수인 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 자신의 호출 객체 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;에 바인딩 되었습니다.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않고 전역객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; 화살표 함수는 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일하게 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;생성자 함수의 메소드로, 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;에 의해 호출되었습니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;는 화살표 함수로 선언되었기 때문에 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조합니다. 상위 스코프인 생성자 함수 내의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 새롭게 생성되는 인스턴스에 바인딩 되고, &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 또한 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;에 바인딩 되었습니다.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않고 전역객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; 화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일하게 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 메소드 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;를 새로운 함수로 선언하여 호출하였습니다. 호출객체가 명시되어있지 않기 때문에 &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 전역객체에 바인딩 됩니다.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩되지 않고 전역객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 는 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일하게 됩니다. &lt;code class=&quot;language-text&quot;&gt;methodA()&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 전역객체에 바인딩 되기 때문에 동일하게 전역 객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 메소드 &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;를 새로운 함수 &lt;code class=&quot;language-text&quot;&gt;methodBB()&lt;/code&gt;로 선언하여 호출하였습니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;는 화살표 함수이므로 호출 객체가 명시되어있지 않음에도 렉시컬 스코프의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조합니다. &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt;가 선언된 생성자 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;가 바인딩 되기 때문에 &lt;code class=&quot;language-text&quot;&gt;methodB()&lt;/code&gt; 또한 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;를 참조합니다.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않고 전역객체에 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; 화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 렉시컬 스코프 상의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조하기 때문에 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;와 동일하게 됩니다.&lt;br&gt;
&lt;br/&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;이외&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EC%99%B8&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;p&gt;이벤트 리스너의 경우, 이벤트가 등록되는 DOM element에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 바인딩됩니다.&lt;br&gt;
&lt;br/&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&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;
    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 keyword&quot;&gt;this&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;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;h2 id=&quot;그래서-this을-말하자면&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B7%B8%EB%9E%98%EC%84%9C-this%EC%9D%84-%EB%A7%90%ED%95%98%EC%9E%90%EB%A9%B4&quot; aria-label=&quot;그래서 this을 말하자면 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;그래서 this을 말하자면..&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 함수 내에서 자신(함수)을 호출한 객체에 접근하기 위한 JS의 키워드입니다. 하지만 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 호출 객체가 바인딩 되지 않는 경우도 존재합니다. 이러한 경우를 네 가지의 바인딩 룰을 통해 소개하였습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 호출 객체에 바인딩 되지만 호출 객체가 명시되어있지 않는 경우, 전역 객체에 바인딩 됩니다.&lt;/strong&gt;    &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩 되지 않습니다.&lt;/strong&gt;    &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;화살표 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 렉시컬 스코프의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 참조합니다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클래스의 내부 코드들은 &lt;em&gt;&apos;strict mode&apos;&lt;/em&gt; 로 수행됩니다. &lt;em&gt;&apos;strict mode&apos;&lt;/em&gt; 에서는 전역 객체에 대한 바인딩이 수행되지 않기 때문에 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;가 됩니다.&lt;/strong&gt;  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  이렇게 네 가지 규칙만으로도 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 사용하는 대부분의 코드를 이해할 수 있을 것입니다. 추가로 바인딩을 명시적으로 하기 위해 제공하는 메소드들 소개하겠습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;-this-바인딩-관련-메소드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-this-%EB%B0%94%EC%9D%B8%EB%94%A9-%EA%B4%80%EB%A0%A8-%EB%A9%94%EC%86%8C%EB%93%9C&quot; aria-label=&quot; this 바인딩 관련 메소드 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;+ this 바인딩 관련 메소드&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;의 바인딩이 의도한 방향으로 되지 않는 경우가 있다고 설명하였습니다. &lt;strong&gt;이를 피하고자 JS는 바인딩을 명시적으로 지정하는 메소드를 제공합니다.&lt;/strong&gt; 이 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; 바인딩 메소드들은 &lt;code class=&quot;language-text&quot;&gt;Function.prototype&lt;/code&gt;에 선언되어있기 때문에 모든 함수에서 사용이 가능합니다.&lt;br&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-code-classlanguage-textbindltobjectgtcode&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-code-classlanguage-textbindltobjectgtcode&quot; aria-label=&quot;1 code classlanguage textbindltobjectgtcode 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;code class=&quot;language-text&quot;&gt;bind(&amp;lt;object&amp;gt;)&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;호출하는 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 인자로 전달한 객체를 바인딩한 함수를 반환합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  4번 규칙의 3번 예시를 보면 메소드를 외부에서 사용하고자 할 때, 호출 객체에 명시되어있지 않아 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;가 전역객체로 바인딩됩니다. 인스턴스를 바인딩하고자 할 때, 이 함수를 사용하여 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 명시적으로 바인딩 합니다. 이때 함수의 호출이 아닌 &lt;strong&gt;함수의 선언&lt;/strong&gt;임을 기억해야 합니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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;
			  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 keyword&quot;&gt;this&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 keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&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 keyword&quot;&gt;const&lt;/span&gt; methodAA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodA&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;methodAA&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;// .... 1                &lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; methodAAA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;methodAA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chanwoo&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;methodAAA&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;// .... 2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;전역객체 &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; -&lt;/strong&gt; 내부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 외부 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩되지 않고 전역객체에 바인딩됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; -&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;bind()&lt;/code&gt;를 통해 명시적으로 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;로 바인딩하였습니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;2-code-classlanguage-textcallltobjectgt-ltparamsgtcode&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-code-classlanguage-textcallltobjectgt-ltparamsgtcode&quot; aria-label=&quot;2 code classlanguage textcallltobjectgt ltparamsgtcode 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;code class=&quot;language-text&quot;&gt;call(&amp;lt;object&amp;gt;, ...&amp;lt;params&amp;gt;)&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;호출하는 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 인자로 전달한 객체를 바인딩하여 함수를 수행합니다.&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  이미 할당되어있는 객체의 메소드를 다른 객체에 바인딩하여 호출하기 위해 사용합니다. 아래의 &lt;code class=&quot;language-text&quot;&gt;apply()&lt;/code&gt;와의 차이점은 함수 인자 전달 방식입니다. 바인딩할 객체 이후 모든 파라미터가 수행할 함수의 파라미터로 사용됩니다.  &lt;/p&gt;
&lt;br/&gt;
&lt;h3 id=&quot;3-code-classlanguage-textapplyltobjectgt-ltparamsgtcode&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-code-classlanguage-textapplyltobjectgt-ltparamsgtcode&quot; aria-label=&quot;3 code classlanguage textapplyltobjectgt ltparamsgtcode 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. &lt;code class=&quot;language-text&quot;&gt;apply(&amp;lt;object&amp;gt;, [&amp;lt;params&amp;gt;])&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;호출하는 함수의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 인자로 전달한 객체를 바인딩하여 함수를 수행합니다.&lt;/strong&gt;  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  이미 할당되어있는 객체의 메소드를 다른 객체에 바인딩하여 호출하기 위해 사용합니다.  아래의 &lt;code class=&quot;language-text&quot;&gt;apply()&lt;/code&gt;와의 차이점은 함수 인자 전달 방식입니다. 바인딩할 객체 이후 전달되는 배열이 수행할 함수의 파라미터로 사용됩니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodA&lt;/span&gt; &lt;span class=&quot;token operator&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;
      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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;methodB&lt;/span&gt; &lt;span class=&quot;token operator&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;age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gender&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;
      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 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;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&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 interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;age&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 interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;gender&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&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 punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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 keyword&quot;&gt;const&lt;/span&gt; chanjong &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanjong&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 keyword&quot;&gt;const&lt;/span&gt; methodBB &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methodB&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 function&quot;&gt;methodBB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chanjong&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;man&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 comment&quot;&gt;// 함수 인자 전달시, 배열을 통한 전달&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;methodBB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chanjong&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;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;man&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;p&gt;  &lt;code class=&quot;language-text&quot;&gt;call()&lt;/code&gt;을 통해 명시적으로 바인딩할 함수 &lt;code class=&quot;language-text&quot;&gt;methodBB&lt;/code&gt;의 인자는 바인딩 될 객체 이후에 인자로 전달합니다. 반면에 &lt;code class=&quot;language-text&quot;&gt;apply()&lt;/code&gt;의 경우, 인자를 배열로 전달합니다. 인자 전달 방법의 차이를 제외하고 명시적으로 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 바인딩하여 함수를 수행하는 기능은 동일합니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JS의 기본 개념 1. 프로토타입]]></title><description><![CDATA[프로토 타입이란? Prototype이란, '원형' 의 뜻을 가지며, 시스템의 미완성 버전 또는 중요한 가능들이 포함된 시스템의 초기모델을 의미한다.   JS에서는 모든 것이 객체입니다. 우리가 사용하는 배열이나 함수도 하나의 객체인데요. 우리가 정의…]]></description><link>https://chanuuuuu.github.io/prototype/</link><guid isPermaLink="false">https://chanuuuuu.github.io/prototype/</guid><pubDate>Fri, 05 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;프로토-타입이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%ED%86%A0-%ED%83%80%EC%9E%85%EC%9D%B4%EB%9E%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;/h1&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Prototype이란, &lt;strong&gt;&lt;em&gt;&apos;원형&apos;&lt;/em&gt;&lt;/strong&gt; 의 뜻을 가지며, 시스템의 미완성 버전 또는 중요한 가능들이 포함된 시스템의 초기모델을 의미한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  JS에서는 모든 것이 객체입니다. 우리가 사용하는 배열이나 함수도 하나의 객체인데요. 우리가 정의하지 않았던 JS의 내장 함수들, 배열의 &lt;code class=&quot;language-text&quot;&gt;forEach()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;includes()&lt;/code&gt;와 함수의 &lt;code class=&quot;language-text&quot;&gt;bind()&lt;/code&gt;와 같은 함수들은 우리가 정의하지 않아도 객체에 상속되어 사용할 수 있습니다. 이를 위해 JS는 Prototype, 즉 &lt;strong&gt;&apos;객체의 원형&apos;&lt;/strong&gt; 을 정의하는 방식을 통해 객체가 가지는 특성이나 메소드의 상속을 구현합니다. Prototype을 이해하기 위해서는 반드시 &lt;strong&gt;&apos;객체의 원형&apos;&lt;/strong&gt; 이라는 의미를 기억하는 것이 중요합니다. 이번 포스트에서는 JS가 Prototype을 통해 어떻게 상속을 구현할 수 있는지를 알아보고자 합니다. 본론으로 들어가기 전에 알아야 할 것이 하나 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;생성자-함수와-code-classlanguage-textnewcode-연산자를-통한-객체-생성과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98%EC%99%80-code-classlanguage-textnewcode-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%ED%86%B5%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;생성자 함수와 code classlanguage textnewcode 연산자를 통한 객체 생성과정 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;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자를 통한 객체 생성과정&lt;/h3&gt;
&lt;p&gt;  객체의 상속을 구현하기 전에 우리는 객체의 생성방법에 대해서 이해해야 합니다. 객체 생성과정에서 Prototype을 사용하기 때문입니다. 생성자 함수는 함수 내에서 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해서 새롭게 생성할 객체의 형식을 정의하는 함수입니다. 생성자 함수로 객체의 형식을 정의했다면 &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자를 통해서 새로운 객체를 생성합니다.&lt;span class=&apos;small-text&apos;&gt;(여기서 생성자 함수는 일반적인 함수와 다를 것이 없지만, 클래스와 같이 함수명의 첫 글자를 대문자로 사용하는 관례가 존재합니다.)&lt;/span&gt; 객체 생성과정을 좀 더 세분화하면 아래의 순서를 가집니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;새로운 객체를 생성하고 생성된 객체가 생성자 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;를 참조할 수 있도록 합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;구체적으로 표현하자면, 생성자 함수가 가지는 &lt;em&gt;Prototype Object&lt;/em&gt;를 &lt;em&gt;Prototype Link&lt;/em&gt;에 바인딩 된 새로운 객체를 생성합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;생성된 객체를 함수 내의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;로 바인딩하여 함수를 수행합니다. 이때, &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;를 통해 명시적으로 호출되는 프로퍼티와 메소드를 객체에 추가합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함수의 수행이 완료되면 해당 객체를 반환합니다.&lt;/strong&gt;  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  여기서 우리가 집중할 것은 첫 번째 과정입니다. Prototype이라는 단어가 가지는 &apos;&lt;strong&gt;원형&lt;/strong&gt;&apos;이라는 의미에서처럼 JS는 객체에 필요한 프로퍼티와 메소드를 전달하기 위해 Prototype을 바인딩하는 작업이 가장 먼저 수행되고 있습니다. 그럼 이제 Prototype을 구성하는 두 개념 &lt;em&gt;Prototype Object&lt;/em&gt;와 &lt;em&gt;Prototype Link&lt;/em&gt;에 대해 알아보도록 하겠습니다. &lt;span class=&apos;small-text&apos;&gt;(두 번째 과정의 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;는 다음 포스팅에서 설명하도록 하겠습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h1 id=&quot;프로토타입의-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EC%9D%98-%EA%B5%AC%EC%A1%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;/h1&gt;
&lt;p&gt;  Prototype은 객체 자기 자신의 원형을 가리키는 &lt;strong&gt;&lt;em&gt;Prototype Link&lt;/em&gt;&lt;/strong&gt;, 자신을 통해 생성될 객체의 원형을 의미하는 &lt;strong&gt;&lt;em&gt;Prototype Object&lt;/em&gt;&lt;/strong&gt;로 구성되어있습니다. 이 두 가지 개념을 하나씩 살펴보겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;prototype-object&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prototype-object&quot; aria-label=&quot;prototype object 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;Prototype Object&lt;/h2&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;함수가 가지는 프로퍼티로, 자신(함수)을 통해 생성되는 객체들의 원형 객체를 말한다.&lt;/strong&gt; &lt;em&gt;(자신의 원형이 아님, 이후에 생성될 객체들의 원형인 것을 주의하자!)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  중요한 것은 이 객체가 &lt;strong&gt;&apos;함수가 가지는 프로퍼티&apos;&lt;/strong&gt;라는 것입니다. &lt;em&gt;Prototype Object&lt;/em&gt;는 생성자 함수를 통해 생성될 객체의 원형을 의미합니다. 객체를 생성할 수 있는 함수에서 사용되는 객체임을 기억해야 합니다. 위에서 생성자 함수를 통한 객체 생성 과정을 설명하였습니다. 그 과정에서 &lt;em&gt;Prototype Object&lt;/em&gt;는 함수가 선언되는 시점에 함수와 함께 생성되고, 생성된 &lt;em&gt;Prototype Object&lt;/em&gt;는 함수의 &lt;code class=&quot;language-text&quot;&gt;prototype&lt;/code&gt; 프로퍼티에 바인딩 됩니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&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;p&gt;  위의 예제에서 이름 프로퍼티와 인스턴스의 이름을 출력하는 메소드를 가지는 객체의 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;을 선언하였습니다. JS는 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;를 선언하는 시점에 자신의 &lt;em&gt;Prototype Object&lt;/em&gt;를 생성하고 &lt;code class=&quot;language-text&quot;&gt;prototype&lt;/code&gt;프로퍼티에 바인딩합니다. 아래는 결과를 그림으로 표현한 것입니다.&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: 189px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/77050fc5aa3cf2d525e9624e7dbb4622/0f8c7/prototype_1.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: 170.27027027027026%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAACXBIWXMAAAsSAAALEgHS3X78AAADUklEQVRIx62W2UpjQRCGz/s/gCB4obkQIYIiKqhxuXCJMXHfNe4ad5O4r798xZTTSU5iBqah6NOnuv9au6oj/RlfX18239zcaG1tTfv7+zo4ONDJyYnR0NCQ2tvb1dvbq7a2Ns3Nzens7ExHR0fa29uzeXp6WpED+Xx1daXn52f7/vj4sPXj46MODw+1sLCgzc1NZTIZbW9v275yuew66eLiQpGDOWCxWNTu7q5ub2+1uLioZDKpzs5OdXR0qKurS93d3ZqamjJtW1palEgktLW1ZftzuVylhkjETEzh++npSW9vb7q8vNTx8bG5AU1PT09tH//Zc39/r9fXVwOOQt+dn59rZ2dHpVJJ4cDUsbExDQwMaHR0VCMjI+rv77e94UCRH8BCoWA+QxoaIBn/QPx3t0Cfn582+34UwKKNjY2/gGj38vJivri+vrYD7+/vZsrs7KwFYmlpScvLy1pdXdX6+rr5mDPsY+CSGsC7uzsz3zVA04mJCa2srCiVSmlyctJSh2/MR7NfAYkyKYBPcAWpgxAyAAuc+A+ffXxXRDk0Gb/EDYQh6OHhIZaP72M1JB0wg7UT6eOZgFDWzsNsAoVlFYDcCNaYgTRMYfZvrmBra6tds5DnfHL1B7CRKeHI5/MN+RGquoYOyL84cj95HsZR5MjkHv74bThgWFAqNCRxSQeqCD4gKIDXI0yurlAVgEgkakQIx3LVAEVINfGfwFVXqBpALw5o28yIA6oA5IoRZTTgG+B6BP9XDUlSKMyrOCIPqdQNAfFbM9H1AWjDKIeA9XIr1OafAesFwXlcu/+ioYNQphrta0rDcFBYPRdj06Y6KIBSeT2yXlyZuQA0K87wz29PmAk1gNRBWiTApBIdb35+3vpKNps1YVRmegtr+OwjPzlbF9ATmcM8MXh6zMzMWIMCKJ1O2xpeWIhrAJFEQ6KcwfPeQRXHd9x1yhzNy3sLBdkpVkPAwoHf6HDj4+PW8Wj0w8PDtq6+FAYYFgU32XsymvBCQDOcTh7yOuPFRWOnoeFDd1FE5vtrywMBgJvHAfhhGYMHoR1838cc8YzgAQQwGhBFCm042EyzHxwctHdiT0+P+vr6at5AZnLcNaN6e1djRiBaIwxTMZk1SlR3v2/KWRXDotSl7AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;prototype 1&quot;
        title=&quot;prototype 1&quot;
        src=&quot;/static/77050fc5aa3cf2d525e9624e7dbb4622/0f8c7/prototype_1.png&quot;
        srcset=&quot;/static/77050fc5aa3cf2d525e9624e7dbb4622/12f09/prototype_1.png 148w,
/static/77050fc5aa3cf2d525e9624e7dbb4622/0f8c7/prototype_1.png 189w&quot;
        sizes=&quot;(max-width: 189px) 100vw, 189px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;1-아래-박스는-생성자-함수-code-classlanguage-texthumancode입니다-생성자-함수는-기본적으로-두-개의-프로퍼티를-가집니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EC%95%84%EB%9E%98-%EB%B0%95%EC%8A%A4%EB%8A%94-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98-code-classlanguage-texthumancode%EC%9E%85%EB%8B%88%EB%8B%A4-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%91%90-%EA%B0%9C%EC%9D%98-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EB%A5%BC-%EA%B0%80%EC%A7%91%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;1 아래 박스는 생성자 함수 code classlanguage texthumancode입니다 생성자 함수는 기본적으로 두 개의 프로퍼티를 가집니다 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;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;입니다. 생성자 함수는 기본적으로 두 개의 프로퍼티를 가집니다.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;prototype&lt;/code&gt;  프로퍼티&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;   생성자 함수는 자신을 통해 생성될 객체의 원형, &lt;em&gt;Prototype Object&lt;/em&gt;를 &lt;code class=&quot;language-text&quot;&gt;prototype&lt;/code&gt; 프로퍼티를 통해 참조하고 있습니다.&lt;br&gt;
&lt;br/&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;   아래에서 설명할 &lt;code class=&quot;language-text&quot;&gt;Prototype Link&lt;/code&gt;를 의미하므로 추후 설명하도록 하겠습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h4 id=&quot;2-위-박스는-생성자-함수-code-classlanguage-texthumancode의-prototype-object입니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%EC%9C%84-%EB%B0%95%EC%8A%A4%EB%8A%94-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98-code-classlanguage-texthumancode%EC%9D%98-prototype-object%EC%9E%85%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;2 위 박스는 생성자 함수 code classlanguage texthumancode의 prototype object입니다 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;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;입니다.&lt;/h4&gt;
&lt;p&gt;  객체의 원형이라는 의미는 곧 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt; 함수를 통해 생성될 객체들이 사용할 수 있는 영역이라고 생각하면 되겠습니다. &lt;strong&gt;모든 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;는 기본적으로 그림과 같이 두 개의 프로퍼티와 빈 슬롯&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;을 가집니다.&lt;/strong&gt; 구조를 하나씩 살펴보겠습니다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;constructor&lt;/code&gt; 프로퍼티&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Prototype Object&lt;/em&gt;이 가지는 프로퍼티로, 자신을 사용하는 생성자 함수를 가리킨다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;   해당 프로퍼티를 통해서 객체는 자신의 생성자 함수를 참조할 수 있습니다. 주로 생성자 함수가 가지는 &lt;em&gt;static method&lt;/em&gt;를 사용하고자 할 때 사용하거나, 해당 객체와 동일한 생성자 함수를 통한 객체를 만들기 위함입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;모든 객체가 가지는 프로퍼티로, 객체 자신의 원형 객체인 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리킵니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;   가장 헷갈리는 부분 중의 하나가 &lt;em&gt;Prototype Object&lt;/em&gt;의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티입니다. &lt;em&gt;Prototype Object&lt;/em&gt;도 하나의 객체이기 때문에 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티를 가집니다. &lt;strong&gt;모든 &lt;em&gt;Prototype Object&lt;/em&gt;의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 동일하게 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리킵니다.&lt;/strong&gt; 즉, &lt;em&gt;Prototype Object&lt;/em&gt;는 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;를 통해서 만들어진, 말 그대로 객체라는 의미가 됩니다. (모든 객체가 Object의 자손임을 의미합니다.) 그림으로 표현하면 아래와 같습니다.&lt;br&gt;
&lt;br/&gt; &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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8e307fbd84c6606a681a4a1a552144d6/a1253/prototype_2.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: 49.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABQUlEQVQoz32Sy66DMAxE+f9fY8MSVIQELQXxhtLyKODqWDKX1Y0UJXFmxhM7zr7v0nWdJEkirutKEARSVZUQ/2+8Xi+53+/K8X1fOfM8i/N+v6Xve6nrWsIwlCzLFLyuq4pu26bz+/2ee+LwjPN8PvXctu2fIPPxeEjTNHrx+Xw0IxPxcRzPMxMMnDRNpSgKveelzrIsCiAzoGmahJgNxLiHSHKcWpyJAfDsMeGYCAHW4zhOMZLgglp5nidxHOv5ijFD8NUhgmTGMiv1MQJuAFNwmkXNhmE4XwCOvXG5c3Bl47pnIM6TKDq/AGFc8LQrxwyAd3BAEDAkukwmA3GHADFrGByc4Zgy5HmuP4OYCkLARRRF2mlcXP8he5pybRZPLMtSORhBUJti/4fst9tNs1F4GnLtNGRWG9QNnP1DBNH5AW86AfbISwyyAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;prototype 2&quot;
        title=&quot;prototype 2&quot;
        src=&quot;/static/8e307fbd84c6606a681a4a1a552144d6/fcda8/prototype_2.png&quot;
        srcset=&quot;/static/8e307fbd84c6606a681a4a1a552144d6/12f09/prototype_2.png 148w,
/static/8e307fbd84c6606a681a4a1a552144d6/e4a3f/prototype_2.png 295w,
/static/8e307fbd84c6606a681a4a1a552144d6/fcda8/prototype_2.png 590w,
/static/8e307fbd84c6606a681a4a1a552144d6/a1253/prototype_2.png 657w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;  &lt;/p&gt;
 &lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;   위 그림에서 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Animal&lt;/code&gt; 모두 &lt;em&gt;Prototype Object&lt;/em&gt;를 가지며 &lt;em&gt;Prototype Object&lt;/em&gt;들의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 함수가 다르더라도 동일하게 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리키고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt; &lt;em&gt;Prototype Object&lt;/em&gt;의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; 값을 가집니다. &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티가 객체 자신의 원형객체인 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리킨다고 설명하였는데 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt; &lt;em&gt;Prototype Object&lt;/em&gt;는 자신의 원형객체가 존재하지 않으므로 &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prototype을 통해 공유될 프로퍼티와 메소드가 들어갈 영역&lt;/strong&gt;  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;   생성자 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;이 가지는 프로퍼티와 메소드가 정의되는 영역입니다. 이후에 설명할 &lt;em&gt;Prototype Link&lt;/em&gt;에 의해 모든 객체가 참조할 수 있으며, 생성자 함수의 &lt;code class=&quot;language-text&quot;&gt;prototype&lt;/code&gt; 프로퍼티를 통해서 추가할 수 있습니다. &lt;/p&gt;
&lt;br/&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&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;// 생성자 함수의 prototype 프로퍼티를 통해서 메소드를 추가하였다.&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;printName&lt;/span&gt; &lt;span class=&quot;token operator&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;
    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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&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;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;prototype-link&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prototype-link&quot; aria-label=&quot;prototype link 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;Prototype Link&lt;/h2&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;모든 객체(함수 포함)가 가지는 프로퍼티로, 자신의 원형 &lt;em&gt;Prototype Object&lt;/em&gt;을 참조하기 위해 사용되는 포인터이다.&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  모든 객체는 &lt;em&gt;Prototype Link&lt;/em&gt;를 가지며, &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티를 통해서 구현됩니다. &lt;strong&gt;이 프로퍼티는 자신의 원형 객체 즉, 객체 자신을 생성할 때 사용하였던 생성자 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리킵니다.&lt;/strong&gt; 이 프로퍼티를 통해 객체는 생성자 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;가 가진 프로퍼티와 메소드를 사용할 수 있습니다. 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;과 이 함수를 통해 생성되는 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt; 예제로 설명하도록 하겠습니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&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;// 생성자 함수의 prototype 프로퍼티를 통해서 메소드를 추가하였다.&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;printName&lt;/span&gt; &lt;span class=&quot;token operator&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;
  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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&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;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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;p&gt;  인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;는 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;을 사용하여 생성되었습니다. &lt;em&gt;Prototype Link&lt;/em&gt;의 정의에 따라 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;는 객체이기 때문에 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티를 가지고 있습니다. 그림으로 표현하자면 아래와 같습니다. &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: 407px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b8317d8c873aaf678fbb0795c10de3a7/0ff56/prototype_3.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: 113.51351351351352%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAAsSAAALEgHS3X78AAACTElEQVQ4y5WU16oCMRCG9/0fyQsvFBFUbNh7wd57dw7fwCxxkXP2BGLclL/MZOK932+hMS4WC9lutzKdTiWbzUo+n9e5+Xwuy+XS3/db8/i5XC6yXq/14P1+l16vJ6VSSTvgx+NRNptNOMDX6yXn81kej4equ91uMhqNZDgcSq1Wk/F4rOu73S4cIOydTkdOp5Ps93sFAGg2m0mj0ZBms6kErIUCxEq/31cVqIMAcEbrh8NB10Jb5hAbsf18Pv0ebH+BKSCbzK4p4tti9m9A9wNbliDiSOzIOiShLdsGLKKS69NqtSQajUoymdRsE2c3KW4PkviABJ7McrBYLEoqlZJMJiPlcllJvoXABbPRM3XuIaqDq9Rut9UuIUAl+wgB34x8BxX7gICZtUqloirT6bSCMkfFkCyc2FUi3m4YfIUwcmgymfglh8LBYKCWSZDVsjXCAzEkrn0F5C6ycL1etfxQQGJQhXLmqHeaWUUh6xYGu7eaFKyyCCA2OAxosDGPE8ghjEQiGm++IUWYZ4+CKWGkk6TgnbM1ajwWi0k8HpdEIqGlCzBYCmhqGAFFZbfb1TihGlXYwiYqTSHAgHHpcekrBIgPV0G1WtWXhv+QWHY5zDfJsgQyt1qt1NWHQlhgJ6tsLBQKmm0jYh+PMA8wZFwp9kIGGKAe2QGIThxoXBEs1+t1nTe72AcMEIhQDzHlyTuqgHZtOMQEB1lEXS6XU3DYsRksNYspo3XPzST/rZysQebO2Yh9Lv7X18YtHRf825yR8LTxGqHe5lj/AZ7l6TL273vRAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;prototype 3&quot;
        title=&quot;prototype 3&quot;
        src=&quot;/static/b8317d8c873aaf678fbb0795c10de3a7/0ff56/prototype_3.png&quot;
        srcset=&quot;/static/b8317d8c873aaf678fbb0795c10de3a7/12f09/prototype_3.png 148w,
/static/b8317d8c873aaf678fbb0795c10de3a7/e4a3f/prototype_3.png 295w,
/static/b8317d8c873aaf678fbb0795c10de3a7/0ff56/prototype_3.png 407w&quot;
        sizes=&quot;(max-width: 407px) 100vw, 407px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 &lt;code class=&quot;language-text&quot;&gt;__proto__&lt;/code&gt; 프로퍼티를 통해 접근할 수 있습니다. 하지만 최근에는 &lt;code class=&quot;language-text&quot;&gt;__proto__&lt;/code&gt; 프로퍼티 대신 &lt;code class=&quot;language-text&quot;&gt;Object.getPrototypeOf()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 정적 메소드를 사용하여 접근하도록 권장하고 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 객체 자신을 생성하기 위해 사용한 생성자 함수인 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리키고 있습니다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;를 가리킵니다. &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;는 모든 &lt;em&gt;Prototype Object&lt;/em&gt;의 원형이라는 의미를 가집니다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;의 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; 값을 가집니다. JS는 모든 것이 객체이며, 모든 객체의 원형이 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;이기 때문입니다. 가장 기본이 되는 원형이기 때문에 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;가 가진 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티가 &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; 값을 가지게 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;h2 id=&quot;그래서-prototype-object-prototype-link를-말하자면&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B7%B8%EB%9E%98%EC%84%9C-prototype-object-prototype-link%EB%A5%BC-%EB%A7%90%ED%95%98%EC%9E%90%EB%A9%B4&quot; aria-label=&quot;그래서 prototype object prototype link를 말하자면 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;그래서 Prototype Object, Prototype Link를 말하자면..&lt;/h2&gt;
&lt;p&gt;  JS는 Prototype을 통해 객체 지향의 상속을 구현합니다. JS의 객체는 모두 자신의 원형이 존재합니다. 이 원형을 Prototype이라고 하는데요. Prototype은 &lt;em&gt;Prototype Object&lt;/em&gt;와 &lt;em&gt;Prototype Link&lt;/em&gt;로 구성되어있습니다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Prototype Object&lt;/em&gt;는 함수 측의 구현으로, 생성자 함수를 통해 생성되는 인스턴스들의 원형 객체를 말합니다. 생성자 함수가 선언되는 시점에 해당 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;가 생성되며, 함수의 &lt;code class=&quot;language-text&quot;&gt;prototype&lt;/code&gt; 프로퍼티를 통해서 &lt;em&gt;Prototype Object&lt;/em&gt; 내에 상속할 프로퍼티와 메소드를 선언할 수 있습니다.&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Prototype Link&lt;/em&gt;는 객체 측의 구현으로, 객체 자신이 생성될 때 사용된 원형 객체, &lt;em&gt;Prototype Object&lt;/em&gt;를 참조하고 있습니다. &lt;em&gt;Prototype Link&lt;/em&gt;는 &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티에 저장되며, 모든 객체가 이 프로퍼티를 가지고 있습니다. 생성자 함수로 생성된 인스턴스의 경우, 함수가 가진 &lt;em&gt;Prototype Object&lt;/em&gt;가 이 프로퍼티에 바인딩 되며, 이 프로퍼티를 통해 &lt;em&gt;Prototype Object&lt;/em&gt;가 가진 프로퍼티와 메소드를 사용할 수 있습니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모든 &lt;em&gt;Prototype Object&lt;/em&gt;는 인스턴스들이 참조할 수 있는 프로퍼티와 메소드가 저장될 슬롯과 두 프로퍼티를 가집니다. &lt;code class=&quot;language-text&quot;&gt;constructor&lt;/code&gt; 프로퍼티는 자신(&lt;em&gt;Prototype Object&lt;/em&gt;)을 사용하여 인스턴스를 생성할 생성자 함수를 참조합니다. &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt; 프로퍼티는 자신의 원형 객체인 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;를 참조하고 있습니다. 그리고 아래에서 서술할 &lt;em&gt;Prototype Chain&lt;/em&gt;에 의해 모든 객체는 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;가 가지는 모든 프로퍼티와 메소드에 접근할 수 있습니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;prototype-chain&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prototype-chain&quot; aria-label=&quot;prototype chain 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;Prototype Chain&lt;/h1&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Prototype Object&lt;/em&gt;과 &lt;em&gt;Prototype Link&lt;/em&gt;로 구성된 Prototype을 통해 상속을 구현하는 방식이다. 포인터를 통해 선형적으로 참조하는 형식이 chain과 같은 모양이기에 &lt;em&gt;Prototype Chain&lt;/em&gt;이라고 합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  모든 객체는 자신의 원형 객체 즉, &lt;em&gt;Prototype Object&lt;/em&gt;를 참조할 수 있습니다. 이 &lt;em&gt;Prototype Object&lt;/em&gt;에는 객체가 상속받을 프로퍼티와 메소드가 저장되어있고, &lt;em&gt;Prototype Link&lt;/em&gt;을 통해 &lt;em&gt;Prototype Object&lt;/em&gt;에 저장되어있는 프로퍼티와 메소드에 접근할 수 있습니다. Prototype을 통해 상속받는 프로퍼티와 메소드를 사용하는 동작 방식은 아래와 같습니다. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;사용하고자 하는 프로퍼티와 메소드가 객체의 슬롯&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;에 존재하는지 확인합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;현재 객체에 존재하지 않는다면, 객체의 &lt;em&gt;Prototype Link&lt;/em&gt;를 통해 원형 객체인 &lt;em&gt;Prototype Object&lt;/em&gt;에 접근합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용하고자 하는 프로퍼티와 메소드가 &lt;em&gt;Prototype Object&lt;/em&gt;가 가진 슬롯에 존재하는지 확인합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;현재의 &lt;em&gt;Prototype Object&lt;/em&gt;에 존재하지 않는다면, 이 &lt;em&gt;Prototype Object&lt;/em&gt;의 객체로 간주하고 1~3번의 과정을 반복합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Prototype Object&lt;/em&gt;를 접근하는 과정에서 객체의 &lt;em&gt;Prototype Link&lt;/em&gt;가 &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;인 경우, 즉 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;인 경우 조회가 종료됩니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  이렇게 Prototype을 통해 객체가 참조할 수 있는 프로퍼티와 메소드를 조회하는 과정에서 여러 개의 &lt;em&gt;Prototype Object&lt;/em&gt;를 거친다고해서 &lt;em&gt;Prototype Chain&lt;/em&gt;이라고 합니다. 위에서 사용하였던 예제와 예제의 Prototype 구조 그림을 통해 &lt;em&gt;Prototype Chain&lt;/em&gt;을 설명해보도록 하겠습니다. &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&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;// 생성자 함수의 prototype 프로퍼티를 통해서 메소드를 추가하였다.&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;printName&lt;/span&gt; &lt;span class=&quot;token operator&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;
  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 keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&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;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;printName&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;// ----- A&lt;/span&gt;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;name&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 comment&quot;&gt;// ----- B&lt;/span&gt;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;printNickName&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;// ----- C&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;  인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;는 생성자 함수가 객체의 형식을 정의하였던대로 &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; 프로퍼티를 가집니다. &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; 프로퍼티는 인스턴스의 슬롯&lt;strong&gt;(1)&lt;/strong&gt; 에 존재하고 있습니다. &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; 프로퍼티를 출력하는 메소드인 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt;을 모든 인스턴스에 선언하게 되면 동일한 함수임에도 인스턴스마다 선언되게 됩니다. 그래서 우리는 모든 인스턴스가 참조할 수 있는 영역인, 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt; 내부에 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt;을 선언하였습니다&lt;strong&gt;(3)&lt;/strong&gt;. 이후 인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;가 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt;을 호출한 상황입니다. 인스턴스가 이 함수를 사용하기 위해 Prototype을 사용하는 과정은 파란색 숫자 순입니다.&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: 429px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7c71b35ad16d96a62ba9960d95d6d591/3d026/prototype_4.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: 102.02702702702702%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAACy0lEQVQ4y42UC3OaUBCF/fH5WZ0mtdFpp7VNjMSYCBh8APJ+yEOB090lqO0kTZi5XoG73z17di+9pmmQF4DrFgiCBEVRYvb4hIlyj0eaM3rp+wF4XXt18+tXr6oImAOHwwFZ7CF0lljpUxiqgtlkhNhbIXAslGULOoHfAIZhg7laI8saZJEJ4+kGS3UM25hCm46w1saIaJOqbtW9C0x3DUyrBittmvolpTaQY+u6oVF/SJ0A+We9qbHbtanz4P9dit3Vwd5j9nghq9jvQQWpCEhe5g3CkF/X4u25wndT7hZU1QFpmpC6BMvlCpeXI1iWSfc7RFF0tOCktPk/sCxLUhUKbDAYYHDdx3A4pPslPM87qjxX+hq81z1wXVeUHKoKi+dn6UGG7cmLUPJnW97y9gQWIPvkeT7SJJW0FUXBeDymcUu+5nAcH0lSw/NpY69BFPPcdkZXqE5lr/VvD3sb4+n+AbPbr1B+XVM//sbD7QCP4yHW+v1LYNtWUdRAmULA/6Z+VJhTvySRB9dewd4YmM8mcLdrbE0DcehiT2vYEs5A03R86X+HbZuI4/jFkjMgP2APS/KrLPcELyhw95dXvCEDF4sFFe0a/f6VFG29XtNZ949Ke6wuCAIZEYGjKKT/vrTLeQUZGIaRPJ9Op5hMFOj6gj4shXTBscpcxS44SRJJgeGqqsp9mqZ0zjMBlmVBI8dC16BrKjR1jqauZD0X9XDYt0AO4Jlhtm3T7hNRwdXebDYUEIrPK+0ON98+4e7nFe5+XOLm+2d4qwks45mAGXGKk8IOyKoeHqjas5kA+Rl7xI1dZCnyXUQzrYt8ePRZCzwbaRzKplsn5+9hJUFcFA5kJYZhSB/O53PZqDP91MxAELLqSorYFjKTtup1i1gBg9kzy7LIcB2maco9d8F5vzmOg9FoJFa9epY/8p07X8dn/eLiQizpxHTv/wCnlQHnI4FGrQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;prototype 4&quot;
        title=&quot;prototype 4&quot;
        src=&quot;/static/7c71b35ad16d96a62ba9960d95d6d591/3d026/prototype_4.png&quot;
        srcset=&quot;/static/7c71b35ad16d96a62ba9960d95d6d591/12f09/prototype_4.png 148w,
/static/7c71b35ad16d96a62ba9960d95d6d591/e4a3f/prototype_4.png 295w,
/static/7c71b35ad16d96a62ba9960d95d6d591/3d026/prototype_4.png 429w&quot;
        sizes=&quot;(max-width: 429px) 100vw, 429px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;1-먼저-위-코드에서-a-code-classlanguage-textchanwooprintnamecode을-수행하는-과정을-설명하겠습니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EB%A8%BC%EC%A0%80-%EC%9C%84-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-a-code-classlanguage-textchanwooprintnamecode%EC%9D%84-%EC%88%98%ED%96%89%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95%EC%9D%84-%EC%84%A4%EB%AA%85%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;1 먼저 위 코드에서 a code classlanguage textchanwooprintnamecode을 수행하는 과정을 설명하겠습니다 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. 먼저 위 코드에서 A, &lt;code class=&quot;language-text&quot;&gt;chanwoo.printName()&lt;/code&gt;을 수행하는 과정을 설명하겠습니다.&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;인스턴스 &lt;code class=&quot;language-text&quot;&gt;chanwoo&lt;/code&gt;의 슬롯에 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt;이 존재하는지 확인합니다. 이 슬롯은 인스턴스 각각의 영역으로, &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; 프로퍼티만 존재합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Prototype Link&lt;/em&gt;를 통해 자신의 원형 객체인 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;에 접근합니다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 객체가 &lt;em&gt;Prototype Link&lt;/em&gt;, &lt;code class=&quot;language-text&quot;&gt;[[Prototype]]&lt;/code&gt;프로퍼티를 가지기 때문에 생성자 함수 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;으로 생성되는 모든 인스턴스가 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;에 접근이 가능합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt; 내에 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt;이 존재하는지 확인합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt; 메소드가 존재하기 때문에 &lt;em&gt;Prototype Link&lt;/em&gt;를 따라 더 조회하지 않고 해당 메소드를 수행합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;2-다음은-b-code-classlanguage-textchanwoohasownproperty39name39code을-수행하는-과정을-설명하겠습니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%EB%8B%A4%EC%9D%8C%EC%9D%80-b-code-classlanguage-textchanwoohasownproperty39name39code%EC%9D%84-%EC%88%98%ED%96%89%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95%EC%9D%84-%EC%84%A4%EB%AA%85%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;2 다음은 b code classlanguage textchanwoohasownproperty39name39code을 수행하는 과정을 설명하겠습니다 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. 다음은 B, &lt;code class=&quot;language-text&quot;&gt;chanwoo.hasOwnProperty(&amp;#39;name&amp;#39;)&lt;/code&gt;을 수행하는 과정을 설명하겠습니다.&lt;/h4&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;1-3까지 위와 동일, &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt; 대신, &lt;code class=&quot;language-text&quot;&gt;hasOwnProperty()&lt;/code&gt;로 바꿔서 이해하시면 되겠습니다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt; 내에 존재하지 않으므로 &lt;em&gt;Prototype Link&lt;/em&gt;에 따라 모든 &lt;em&gt;Prototype Object&lt;/em&gt;의 원형인 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;에 접근합니다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt; 는 모든 &lt;em&gt;Prototype Object&lt;/em&gt;가 &lt;em&gt;Prototype Link&lt;/em&gt;로 참조하고 있기 때문에 모든 객체가 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;Prototype Object&lt;/code&gt;가 가진 프로퍼티와 메소드를 사용할 수 있습니다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hasOwnProperty()&lt;/code&gt; 메소드가 존재하기 때문에 &lt;em&gt;Prototype Link&lt;/em&gt;를 따라 더 조회하지 않고 해당 메소드를 수행합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;3-마지막으로-c-code-classlanguage-textchanwooprintnicknamecode과-같이-prototype-chain-상에-존재하지-않는-메소드를-호출하는-경우입니다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C-c-code-classlanguage-textchanwooprintnicknamecode%EA%B3%BC-%EA%B0%99%EC%9D%B4-prototype-chain-%EC%83%81%EC%97%90-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0%EC%9E%85%EB%8B%88%EB%8B%A4&quot; aria-label=&quot;3 마지막으로 c code classlanguage textchanwooprintnicknamecode과 같이 prototype chain 상에 존재하지 않는 메소드를 호출하는 경우입니다 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. 마지막으로 C, &lt;code class=&quot;language-text&quot;&gt;chanwoo.printNickName()&lt;/code&gt;과 같이 &lt;em&gt;Prototype Chain&lt;/em&gt; 상에 존재하지 않는 메소드를 호출하는 경우입니다.&lt;/h4&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;1-4까지 위 과정과 동일합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;의 &lt;em&gt;Prototype Object&lt;/em&gt;에 존재하지 않아 &lt;em&gt;Prototype Link&lt;/em&gt;를 따라 &lt;em&gt;Prototype Object&lt;/em&gt;에 접근합니다. 이때, &lt;em&gt;Prototype Link&lt;/em&gt;가  &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; 값을 가리키고 있습니다. &lt;em&gt;Prototype Chain&lt;/em&gt;의 끝에 도달하였기 때문에 에러를 반환합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;h2 id=&quot;prototype에서-주의할점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#prototype%EC%97%90%EC%84%9C-%EC%A3%BC%EC%9D%98%ED%95%A0%EC%A0%90&quot; aria-label=&quot;prototype에서 주의할점 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;Prototype에서 주의할점&lt;/h2&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;생성자 함수를 통해 인스턴스를 선언한 이후에 &lt;em&gt;Prototype Object&lt;/em&gt;가 가진 프로퍼티와 메소드가 변경되더라도 &lt;em&gt;Prototype Link&lt;/em&gt;를 통해 가리키고 있는 모든 인스턴스에게 변경이 반영됩니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  생성자 함수를 통한 객체 생성과정을 설명하면서 인스턴스 생성 시점에 &lt;em&gt;Prototype Object&lt;/em&gt;가 &lt;em&gt;Prototype Link&lt;/em&gt;에 바인딩 된다고 설명하였습니다. 이때 중요한 것은 &lt;strong&gt;인스턴스 자신만의 &lt;em&gt;Prototype Object&lt;/em&gt;가 생성되는 것이 아닌, &lt;em&gt;Prototype Link&lt;/em&gt;를 통해  공통의 &lt;em&gt;Prototype Object&lt;/em&gt;를 그저 참조만 하고 있다는 것입니다.&lt;/strong&gt;  &lt;em&gt;Prototype Object&lt;/em&gt; 내의 변화가 존재하더라도 참조하고 있는 포인터 &lt;em&gt;Prototype Link&lt;/em&gt;는 그대로이기 때문에 그 변화가 인스턴스의 생성 시점과는 무관하게 반영될 수 있는 것입니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&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 class-name&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;greet&lt;/span&gt; &lt;span class=&quot;token operator&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;
    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 template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;hi, &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&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 keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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 keyword&quot;&gt;const&lt;/span&gt; chanjong &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanjong&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;greet&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;//  .... 1&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 인스턴스 생성 이후에 Prototype Object의 메소드를 변경하였다.&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;greet&lt;/span&gt; &lt;span class=&quot;token operator&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;
    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 template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token 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;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;greet&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;//  .... 2&lt;/span&gt;
chanjong&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;greet&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;//  .... 3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;동일한 이름의 프로퍼티와 메소드가 존재하더라도 &lt;em&gt;Prototype Chain&lt;/em&gt;에서 우선적으로 조회되는 프로퍼티와 메소드를 사용합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  주의할 것은 참조하기 위한 &lt;strong&gt;&lt;em&gt;Prototype Chain&lt;/em&gt;&lt;/strong&gt;의 순서입니다. &lt;strong&gt;&lt;em&gt;Prototype Chain&lt;/em&gt;&lt;/strong&gt;은 &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt; 인스턴스의 슬롯 &lt;strong&gt;→&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;Human&lt;/code&gt; &lt;em&gt;Prototype Object&lt;/em&gt; &lt;strong&gt;→&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt; &lt;em&gt;Prototype Object&lt;/em&gt; &lt;strong&gt;→&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; 의 순으로 참조하면서 사용하고자 하는 프로퍼티, 메소드를 조회합니다. 동일한 프로퍼티, 메소드가 슬롯마다 정의될 수 있지만 &lt;strong&gt;&lt;em&gt;Prototype Chain&lt;/em&gt;&lt;/strong&gt;의 순서상 앞의 슬롯에 정의된 프로퍼티와 메소드가 우선으로 호출됩니다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;printName&lt;/span&gt; &lt;span class=&quot;token operator&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;
	    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 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;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; by instance&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 comment&quot;&gt;// ------ 1&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;// 생성자 함수의 prototype 프로퍼티를 통해서 메소드를 추가하였다.&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;printName&lt;/span&gt; &lt;span class=&quot;token operator&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;
    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 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;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; by proto&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 comment&quot;&gt;// ------ 2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; chanwoo &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;Human&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;chanwoo&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;

chanwoo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;printName&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;// ----- A&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
&lt;p&gt;  예시는 위의 예시에서 동일한 이름을 가진 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt; 메소드가 인스턴스에도 선언되어있는 것을 볼 수 있습니다. 즉, 위 그림에서 살색의 1번 영역과 3번 영역 모두 동일한 이름의 &lt;code class=&quot;language-text&quot;&gt;printName()&lt;/code&gt; 메소드가 선언된 상태입니다. 하지만 &lt;em&gt;Prototype Chain&lt;/em&gt;의 순서상, 인스턴스의 슬롯인 1번을 먼저 조회하기 때문에 결과는 1번 줄이 수행됩니다. 이는 클래스의 메소드 오버라이딩의 개념과 동일하게 동작합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;객체 생성 방식에 따라 Prototype Link에 바인딩되는 Prototype Object가 다릅니다.&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;생성자 함수와 &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; 연산자&lt;/strong&gt;&lt;br&gt;
생성되는 객체의 &lt;em&gt;Prototype Link&lt;/em&gt;는 생성자 함수의 &lt;em&gt;Prototype Object&lt;/em&gt;가 바인딩됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;object initializer notation&lt;/strong&gt;&lt;br&gt;
생성되는 객체의 &lt;em&gt;Prototype Link&lt;/em&gt;는 최상위 Prototype Object인 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt; &lt;em&gt;Prototype Object&lt;/em&gt;가 바인딩 됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;Object.create(&amp;lt;proto&amp;gt;)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
생성되는 객체의 &lt;em&gt;Prototype Link&lt;/em&gt;는 인자로 전달되는 &lt;code class=&quot;language-text&quot;&gt;*proto*&lt;/code&gt;에 바인딩됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;h2 id=&quot;그래서-prototype-chain을-말하자면&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B7%B8%EB%9E%98%EC%84%9C-prototype-chain%EC%9D%84-%EB%A7%90%ED%95%98%EC%9E%90%EB%A9%B4&quot; aria-label=&quot;그래서 prototype chain을 말하자면 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;그래서 Prototype Chain을 말하자면..&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;em&gt;Prototype Object&lt;/em&gt;와 &lt;em&gt;Prototype Link&lt;/em&gt;를 통해 &lt;strong&gt;프로퍼티와 메소드의 상속 방식&lt;/strong&gt;을 정의하였다면, &lt;em&gt;Prototype Chain&lt;/em&gt;은 &lt;strong&gt;상속된 프로퍼티와 메소드를 사용하는 방식&lt;/strong&gt;이라고 볼 수 있습니다. 프로퍼티나 메소드가 자신의 슬롯에 존재하지 않는 경우, &lt;em&gt;Prototype Link&lt;/em&gt;를 통해 자신의 원형 객체 &lt;em&gt;Prototype Object&lt;/em&gt;에 접근하여 조회하는 방식이 선형적으로 수행되기 때문에 &lt;strong&gt;&lt;em&gt;Prototype Chain&lt;/em&gt;&lt;/strong&gt;이라고 부르게 되었습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;h2 id=&quot;끝으로&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%81%9D%EC%9C%BC%EB%A1%9C&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;hr&gt;
&lt;p&gt;  JS의 객체에 대해 깊이 있게 다뤄보았습니다. 객체의 생성과정, 원형 객체 &lt;em&gt;Prototype Object&lt;/em&gt;, 원형 객체 포인터 &lt;em&gt;Prototype Link&lt;/em&gt;, 그리고 이 둘을 통해 상속받는 메소드와 프로퍼티를 조회하는 방식 &lt;em&gt;Prototype Chain&lt;/em&gt;에 관해 설명하였습니다. 다음 포스팅은 객체 생성과정에서 나왔던 &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt;에 관해 설명해보도록 하겠습니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[MySQL의 엔진 InnoDB를 알아보자.(2/2)]]></title><description><![CDATA[InnoDB 주요 장점 동작을 수행하는 Commit, 동작 수행 이전 상태로 돌아가는 Rollback과 같은 Transaction 기능을 지원한다. Row-level locking과 Consistent reads를 통해 다중 사용자 환경에서 동시 수…]]></description><link>https://chanuuuuu.github.io/innodb-02/</link><guid isPermaLink="false">https://chanuuuuu.github.io/innodb-02/</guid><pubDate>Wed, 14 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;innodb-주요-장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#innodb-%EC%A3%BC%EC%9A%94-%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;innodb 주요 장점 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;InnoDB 주요 장점&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;동작을 수행하는 Commit, 동작 수행 이전 상태로 돌아가는 Rollback과 같은 Transaction 기능을 지원한다.&lt;/li&gt;
&lt;li&gt;Row-level locking과 Consistent reads를 통해 다중 사용자 환경에서 동시 수행이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;물리적 저장 기준인 PRIMARY KEY를 통한 Clustered index 기능을 제공한다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 무결성을 보장하기 위한 FOREIGN KEY 기능을 제공한다.&lt;/strong&gt;  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  이번 포스팅은 지난 포스팅에 이어서 주요 장점 3, 4번에 대해 다룰 것입니다. 나머지 주요 장점들을 이해하기 위해서 먼저 Index와 Key에 대한 이해가 필요합니다. 그러므로 인덱스를 충분히 설명한 뒤에 장점들에 대해 다루도록 하겠습니다.&lt;/p&gt;
&lt;h1 id=&quot;index&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#index&quot; aria-label=&quot;index 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;Index&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;  데이터의 저장된 위치를 일련의 기준으로 정렬하여 저장한 자료구조를 의미합니다. 인덱스와 테이블의 관계는 아래의 그림과 같습니다.&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: 330px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/821deb4c4032c6e7d28bb82e3a75bace/d9ecf/index_table_struct.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.810810810810814%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAACFUlEQVQoz01SaXPaMBD1//8j/dRpJ5OknZYcTUIOHAiYAMbgJLYxxviWrcOXthvnaN/sjLSredr3VlIODg6+dtA0DQCqqqr/w2faNA10kFJ+niq2bUdRHIRhkqaUMtqheAflQhSU5nkRx8l8Pl8s9I3rYsq58DxPEQIX9/LibPY4adsaoIUP3Fxf9S/Pw8DHPaPE320xaEGEoFiJolDBWxrurWe9fD9M9w8kXBKSD4cjx3ryHfV50bNXF+PBEVAdahtqSwqzycbAjcAzFJIzaPbu+oRHAx6rNFokSYpGNs5z4g0yr++uencXX+pUBbaQdCbpY5veAtOC7VLJkVwHlnEmkjFLtdjT0Pmr6LaKvZFrnnsv/Yl62BANShPEGntKMgKhd+SCQeXbxmmVjqFelamOw+gst9H2fmuees9/rNU5iJlkBjKB6ZLcA5+/kTmUu9X0mEcqlng8Z4zj0zCa+db11uy55qmh/UCdLcrulLfZANj0gyw8Qzt8JVeLMtNxYKicU7J76dvLn6FztZwcy+JBYs938h2wx3fZrditZ7/KbMKSSepPfX/POMfvgJ5Rs706G95+b/KpLE0p1pIbLRkCR89617nabfSjKropoxuRLrMsx/+RxEGxVxPnZP/02xh9A6ICnQLVoJjI9BrYONqtlSAICxIVsU0iq4itgoSoOX9D7OZYSRyWOnj6L8KXItls3c1fbraQE+GgOP4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;index table struct&quot;
        title=&quot;index table struct&quot;
        src=&quot;/static/821deb4c4032c6e7d28bb82e3a75bace/d9ecf/index_table_struct.png&quot;
        srcset=&quot;/static/821deb4c4032c6e7d28bb82e3a75bace/12f09/index_table_struct.png 148w,
/static/821deb4c4032c6e7d28bb82e3a75bace/e4a3f/index_table_struct.png 295w,
/static/821deb4c4032c6e7d28bb82e3a75bace/d9ecf/index_table_struct.png 330w&quot;
        sizes=&quot;(max-width: 330px) 100vw, 330px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;  현재 인덱스는 테이블의 첫 번째 컬럼을 기준으로 오름차순 정렬되어있는 것을 볼 수 있습니다. 테이블의 물리적인 저장 순서와는 다르게 인덱스로 지정한 컬럼들의 값을 기준으로 정렬되어있어 &lt;strong&gt;필요한 데이터를 빠르게 찾을 수 있도록 도와주는 역할&lt;/strong&gt;을 수행합니다. 또한, 인덱스를 통해 &lt;strong&gt;테이블에 대한 제약조건을 정의&lt;/strong&gt;할 수 있습니다. 예를 들어 UNIQUE, PRIMARY 인덱스를 정의함으로써 구성된 컬럼을  조건으로 사용한 조회에 대한 성능 향상뿐만 아니라 모든 행이 다른 값으로 삽입되도록 하는 제약 조건을 통해 데이터 무결성을 확보할 수 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;KEY&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;제약 조건을 정의하는 인덱스를 구성하는 컬럼들의 집합&lt;/strong&gt;을 말합니다. 인덱스는 하나 이상의 컬럼을 통해 정의할 수 있으며, SQL문으로 특정 제약조건을 만족하는 컬럼을 키로 가지는 인덱스를 선언하여 제약조건을 정의할 수 있습니다.  &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;&lt;span class=&quot;token keyword&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CONSTRAINT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;인덱스명&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&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 punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;h2 id=&quot;인덱스를-사용하는-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EC%8B%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;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  InnoDB가 쿼리를 수행할 때 쿼리문의 조건에 사용할 수 있는 모든 인덱스를 찾습니다. 각 인덱스의 Cardinality에 따라 우선순위가 매겨지고, 가장 적은 행을 탐색할 수 있는 인덱스를 사용합니다. 하지만 인덱스로 정의된 컬럼을 조건으로 사용한다고 해서 모두 빠른 조회를 수행하는 것은 아닙니다. 특히 여러 개의 컬럼을 인덱스로 설정하였을 때, 인덱스를 사용하지 못하는 경우가 많은데요. 아래의 경우를 살펴봅시다.&lt;/p&gt;
&lt;h3 id=&quot;다중-컬럼-인덱스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%EC%A4%91-%EC%BB%AC%EB%9F%BC-%EC%9D%B8%EB%8D%B1%EC%8A%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;/h3&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;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; index_test &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	x &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
	y &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	z &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;INDEX&lt;/span&gt; tidx &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; z&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;ENGINE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;InnoDB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&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;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&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;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&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;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&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;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&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;p&gt;  &lt;strong&gt;여러 컬럼을 사용하여 인덱스를 정의할 수 있지만 지정하는 컬럼의 순서가 매우 중요합니다.&lt;/strong&gt; 인덱스가 여러 개의 컬럼을 키로 가질 때, 각 컬럼을 독립적으로 고려하지 않고 하나의 값으로 간주하므로 &lt;strong&gt;모든 컬럼의 값들을 튜플 화(x, y, z)하여 정렬&lt;/strong&gt;합니다. 이러한 방식으로 인해 위의 예제에서 tidx의 인덱스는 아래의 그림과 같이 정렬되어있습니다. &lt;span class=&apos;small-text&apos;&gt;(InnoDB의 인덱스는 B-Tree 구조로, 이처럼 단순한 배열 방식은 아니지만, leaf node는 아래의 그림과 같이 동일하게 정렬되어있기 때문에 이해를 돕기 위해 사용하였습니다.)&lt;/span&gt;&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ad47aec4c51140921ded363eab03ea74/0fcea/index_ex1.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: 4.72972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAAAsSAAALEgHS3X78AAAARUlEQVQI1x2JQQoAMQjE9v8P8imlUBQRPEnBgj1PWU8hyTfnxDkHEYG1FpgZVQV3xxgDe+/+qgoRac/Mfn+79zbNDESEB6BpSRJz83pxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;index ex1&quot;
        title=&quot;index ex1&quot;
        src=&quot;/static/ad47aec4c51140921ded363eab03ea74/fcda8/index_ex1.png&quot;
        srcset=&quot;/static/ad47aec4c51140921ded363eab03ea74/12f09/index_ex1.png 148w,
/static/ad47aec4c51140921ded363eab03ea74/e4a3f/index_ex1.png 295w,
/static/ad47aec4c51140921ded363eab03ea74/fcda8/index_ex1.png 590w,
/static/ad47aec4c51140921ded363eab03ea74/0fcea/index_ex1.png 851w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;  정렬 순서를 보면 컬럼 x의 값을 기준으로 먼저 정렬하고 이후에 y, z 컬럼 순의 기준으로 정렬되어있음을 볼 수 있습니다. 이러한 정렬 순서로 인해 2번째 데이터의 y 컬럼의 값이 3번째 데이터의 y 컬럼의 값보다 크지만, 순서상 앞에 있는 것을 볼 수 있습니다. 그렇다면 이제 이러한 인덱스의 정렬 순서가 조회 시에 어떠한 영향을 미치는지 살펴보겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1. 인덱스의 첫번째 컬럼을 사용한 조회&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&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;&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&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 comment&quot;&gt;# |      type     |           key         |      rows       |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |----------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |      ref      |          tidx         |        2        |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +---------------------------------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;tidx 인덱스의 첫 번째 컬럼을 사용한 쿼리입니다. 해당 쿼리의 실행계획을 살펴보면, 인덱스를 사용하여 6개의 행 중에 2개의 행만 조회하여 결과를 반환한 것을 확인할 수 있습니다. x 컬럼의 순으로 정렬되어있기 때문에 배열상에서 빠르게 찾을 수 있었습니다. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2. 인덱스의 첫번째 컬럼을 사용하지 않은 조회&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&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;&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&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 comment&quot;&gt;# |      type       |          key        |      rows       |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |----------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |      index      |         tidx        |        6        |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +---------------------------------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
&lt;p&gt;  tidx 인덱스의 두 번째 컬럼만을 사용한 쿼리입니다. 실행 계획을 통해 해당 쿼리가 인덱스를 사용하였으나, 모든 행을 조회하여 결과를 반환한 것을 확인할 수 있습니다. 인덱스로 정의된 컬럼을 사용하였음에도 모든 행을 조회한 이유는 정렬 순서에 있습니다.&lt;br&gt;
&lt;br/&gt; &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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f7fa63204d6fe063eac250efd1569a1b/0fcea/index_ex2.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: 10.135135135135135%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsSAAALEgHS3X78AAAAfUlEQVQI1x2OQQ6EIBRDvf+V3HsOo18BQdSBAMZk3nxn1zbtSzsRIafEJ0amcWQzhrsUjLUY1Sll9v1CZGHbAvlKuNUikxBc4IwXzjleTt/3dFbN3Ro1Z5Z55gie7/MoZMd7T61VoVVHXrODVpp2ImZZFXZScv13rR4YhoEfbCGV4whjstYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;index ex2&quot;
        title=&quot;index ex2&quot;
        src=&quot;/static/f7fa63204d6fe063eac250efd1569a1b/fcda8/index_ex2.png&quot;
        srcset=&quot;/static/f7fa63204d6fe063eac250efd1569a1b/12f09/index_ex2.png 148w,
/static/f7fa63204d6fe063eac250efd1569a1b/e4a3f/index_ex2.png 295w,
/static/f7fa63204d6fe063eac250efd1569a1b/fcda8/index_ex2.png 590w,
/static/f7fa63204d6fe063eac250efd1569a1b/0fcea/index_ex2.png 851w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;  첫 번째 쿼리의 결과는 파란색 박스, 두 번째 쿼리의 결과는 빨간색 박스로 표현하였습니다. 첫 번째 컬럼을 사용한 쿼리의 결과는 &lt;strong&gt;순서상 연속된 범위에 존재하며, 이외의 순서에서는 값이 존재하지 않는 것을 보장할 수 있기 때문에 해당 범위 이전과 이후 순서에 대해 탐색할 필요가 없습니다.&lt;/strong&gt; 하지만 첫 번째 컬럼을 사용하지 않은 쿼리의 경우, &lt;strong&gt;Y 컬럼의 값이 동일하더라도 X 컬럼의 값에 따라 우선 정렬되기 때문에 쿼리의 결과가 연속되지 않습니다. 이로 인해 첫 번째 컬럼을 사용하지 않은 쿼리는 모든 범위에 대해 탐색할 수밖에 없습니다.&lt;/strong&gt; 이러한 컬럼 순서 기반 정렬은 (x, y)와 (x, z) 컬럼을 조건으로 사용하는 경우 또한 동일한 방식으로 조회 범위를 제한합니다. &lt;/p&gt;
&lt;br/&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;&lt;span class=&quot;token comment&quot;&gt;# (x, y) 컬럼 사용&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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 comment&quot;&gt;# |      type     |           key         |      rows       |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |----------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |      ref      |          tidx         |        1        |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +---------------------------------------------------------+&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# (x, z) 컬럼 사용&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; z &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&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 comment&quot;&gt;# |      type     |           key         |      rows       |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |----------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |      ref      |          tidx         |        2        |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +---------------------------------------------------------+&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# OR 조건 사용은 범위의 제한이 발생하지 않습니다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; index_test &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&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 comment&quot;&gt;# |      type       |          key        |      rows       |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |----------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |      index      |         tidx        |        6        |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +---------------------------------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt; 
&lt;p&gt;  추가로, &lt;strong&gt;여러 컬럼의 집합으로 인덱스를 정의할 수 있지만 컬럼의 값을 인덱스로 저장하기 때문에 인덱스의 크기가 매우 커질 수 있습니다.&lt;/strong&gt; 인덱스가 커지면 테이블의 크기 또한 커질 뿐만 아니라 성능 저하가 발생할 수 있습니다. 여러 컬럼의 값을 함께 사용하여 조회하는 경우, 여러 컬럼의 값을 사용하여 만든 해시값을 사용한 인덱스를 정의할 수 있습니다. 이럴 때, 단일 컬럼이며 해시값을 통해 인덱스의 크기를 줄일 수 있기 때문에 더 빠른 조회가 가능하게 됩니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;인덱스-저장-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%A0%80%EC%9E%A5-%EA%B5%AC%EC%A1%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;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  지금까지 인덱스를 표현한 그림에서는 단순히 정렬된 배열 형태로 표현되었지만, 실제로 InnoDB의 인덱스는 B-Tree 구조를 가집니다. 비교를 위해 Hash 구조의 인덱스에 대해서도 함께 설명합니다. 하지만 InnoDB는 Hash 구조의 인덱스는 지원하지 않습니다.&lt;/p&gt;
&lt;h3 id=&quot;b-tree&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#b-tree&quot; aria-label=&quot;b tree 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;B-Tree&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: 400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ba8d4fab79b0d7ff20f320ebeb04d018/e17e5/b_tree.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: 27.7027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABeUlEQVQY02NgQAO1s46xgOjIthOb1x579X/imkv/2xae/G+Yd/K/eeGx/5al5/8bpm2NAqkxztzFjK6fwSZzLYNn4xUGRZtkRgltN8b///+DxSPqd09rX3rpftXM45cK+vddMsnadcs07/AFs/yj1w1TNnmC1Jjn7me2y17LYJC0lkEfijGAnBADr7gAqwiQCXIpExALgMQFWRn4gJQYEHMxEAAwZ4sCsSkQ8wIxI0SIURDkCRCLDyLACmXqMTDwiEKE5IH6BZm5WMDmMDHM3Xz15NT1V450Lz56vXnmrvtTN1w70b7o9HrPigOLZqw9c6l17sHLjXOOHNfPOnjSLO/QKbOC43s0wmavq5uy+W7r/ONHpq06ccKm8OAJ45xDJ0xzDx1nWLz/+f85O5/8X7D3xf85Ox7/n7P7+f/uFVdehbeeuL/s4Mv/07c+/N+75uZ/q/JLYGxWcPK/ffGhk9M23f3fBxSfv/Pef6/Gy//NSi78tyq7+B8AM3mmTcQLQMYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;b tree&quot;
        title=&quot;b tree&quot;
        src=&quot;/static/ba8d4fab79b0d7ff20f320ebeb04d018/e17e5/b_tree.png&quot;
        srcset=&quot;/static/ba8d4fab79b0d7ff20f320ebeb04d018/12f09/b_tree.png 148w,
/static/ba8d4fab79b0d7ff20f320ebeb04d018/e4a3f/b_tree.png 295w,
/static/ba8d4fab79b0d7ff20f320ebeb04d018/e17e5/b_tree.png 400w&quot;
        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조를 의미한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;  그림을 보면 이전에 인덱스를 설명한 것과 동일하게 B-Tree의 leaf node는 그 값들이 모두 정렬된 것을 볼 수 있습니다. 하지만 빠르게 조회의 범위를 좁혀나갈 수 있도록 중간 구분 값(또는 저장된 값)들을 부모 노드로 사용합니다. 이러한 트리 구조는 조회, 삽입, 삭제의 시간 복잡도를 log(N)에 수행할 수 있도록 합니다. 예를 들어 컬럼의 값 12를 인덱스를 사용하여 조회하는 것을 생각해봅시다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;인덱스로 정의된 컬럼을 조건으로 사용하기 때문에 루트 노드 (7, 16)에서 조회를 시작합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;조건의 컬럼값 12가 루트 노드에 존재하는지 확인합니다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;존재하지 않기 때문에 이후 X ≤ 7, 7 &amp;#x3C; X &amp;#x3C; 16, X ≥ 16의 범위에서 어디에 속하는지 확인합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;7 &amp;#x3C; X &amp;#x3C; 16의 범위에 존재하기 때문에 중간의 인덱스가 가리키고 있는 자식 노드로 이동합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;조건의 컬럼값 12가 자식 노드에 존재하는지 확인합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;존재하지 않기 때문에 X ≤ 9, 9 &amp;#x3C; X &amp;#x3C; 12, X ≥ 12의 범위에서 어디에 속하는지 확인합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;X ≥ 12의 범위에 속하고, 현재의 노드가 leaf node이기 때문에 해당 범위에서부터 순차적으로 탐색하여 12를 찾습니다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  이진 탐색 트리와 유사한 방식으로, 단일 값에 대한 조회뿐 만 아니라 범위를 조건으로 사용하는 조회에 대해서도 효율적입니다. &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;=&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.36687em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;&amp;gt;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.5782em;vertical-align:-0.0391em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;&amp;gt;=&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.5782em;vertical-align:-0.0391em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.36687em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;&amp;lt;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.5782em;vertical-align:-0.0391em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;&amp;lt;=&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.5782em;vertical-align:-0.0391em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.36687em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, or &lt;code class=&quot;language-text&quot;&gt;BETWEEN&lt;/code&gt; 연산자에 대해 인덱스를 사용할 수 있습니다.또한 문자열 조회 시, &lt;code class=&quot;language-text&quot;&gt;LIKE&lt;/code&gt; 연산자는 범위에 대한 조회 방식을 사용하기 때문에 해당 연산자 또한 동일하게 인덱스를 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;hash&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hash&quot; aria-label=&quot;hash 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;Hash&lt;/h3&gt;
&lt;p&gt;  &apos;key- value&apos; 형식의 해쉬 구조로 인덱스를 저장하여 사용합니다. 이러한 구조는 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;=&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.36687em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;,  &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;&amp;lt;=&amp;gt;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.5782em;vertical-align:-0.0391em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.36687em;vertical-align:0em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.5782em;vertical-align:-0.0391em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 과 같은 동치 비교 연산에 대해 매우 빠르게 동작하지만, 이외의 비교 연산에 대해서는 인덱스가 사용되지 않습니다. 또한 여러 개의 컬럼으로 인덱스를 정의할 수 있지만 사용되는 컬럼의 값을 모두 사용하여 해시값을 만들기 때문에 반드시 정의된 모든 컬럼을 사용한 조회에서만 인덱스를 사용할 수 있습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;3-clustered-index&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-clustered-index&quot; aria-label=&quot;3 clustered index 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. Clustered Index&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;  PRIMARY Key(기본 키)의 Index를 의미합니다. Primary Index가 아닌 Clustered Index인 이유는 &lt;strong&gt;데이터의 물리적인 저장구조가 해당 인덱스를 기준으로 클러스터되어 저장&lt;/strong&gt;되기 때문입니다. 실제로 InnoDB는 모든 테이블의 데이터를 해당 테이블의 Clustered Index를 기준으로 정렬하여 해당 인덱스를 통한 조회에 최적화되어 저장합니다. &lt;span class=&apos;small-text&apos;&gt;(이는 일반적인 인덱스의 역할과는 조금 다릅니다.)&lt;/span&gt; 그러므로 &lt;strong&gt;조회의 속도를 높이기 위해서는 Clustered Index를 설정하는 PRIMARY KEY를 자주 사용하는 트랜잭션의 유형에 따라 적절하게 설정하는 것이 중요&lt;/strong&gt;합니다. 실제로 단순히 인덱스 설정만으로도 조회에 대한 성능을 크게 향상할 수 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clustered Index는 제약조건이라는 하나의 &apos;개념&apos;이기 때문에 직접 설정하는 것이 아닌 Primary Key에 의해 설정됩니다.&lt;/li&gt;
&lt;li&gt;데이터를 삽입할 때, 인덱스에 대한 정보도 함께 저장해야 하기 때문에 삽입에 대한 성능은 (미비하게) 저하될 수 있습니다. 하지만 인덱스를 설정하여 오는 삽입의 성능 저하보다 조회의 속도 향상의 이점이 훨씬 높습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;h3 id=&quot;primary-key&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#primary-key&quot; aria-label=&quot;primary key 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;PRIMARY KEY&lt;/h3&gt;
&lt;p&gt;  &apos;기본 키&apos;는 Clustered Index를 구성하는 컬럼의 집합입니다. 기본 키는 PRIMARY의 제약조건을 만족해야 하는데, 제약조건은 아래와 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;기본 키의 컬럼들의 값은 모든 행을 구별할 수 있도록 유일한 값이어야 합니다. (UNIQUE INDEX)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 개의 컬럼으로 구성될 수 있으나, 구성되는 모든 컬럼은 NULL을 사용할 수 없다. (NOT NULL)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;기본 키에 대한 추가적인 설명입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1. 모든 테이블에 대해 기본 키를 반드시 정의해야합니다.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;  이는 Clustered Index를 통한 데이터의 저장구조를 정의하기 위함입니다. 기본 키의 조건을 만족하는 컬럼이 존재하지 않으면 AUTO INCREMENT 컬럼을 생성하여 사용하는 것이 일반적입니다. 물론 기본 키를 설정하지 않으면 내부적으로 유일 키 중에서 제약조건을 만족하는 컬럼을 사용하거나 아예 보이지 않는 기본 키를 생성하여 사용하기도 합니다. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2. 기본키를 컬럼의 갯수나 형식의 크기를 최소화하여 정의하는 것이 좋습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  InnoDB는 모든 보조 인덱스에 기본 키의 컬럼을 추가하여 사용합니다. 이러한 특성으로 인해 기본 키의 크기가 클수록 보조 인덱스 또한 그 크기가 커지게 됩니다. 인덱스가 커질수록 쿼리의 성능 저하가 발생할 수 있기 때문에 기본 키를 최소화하여 정의하는 것이 중요합니다. 아래의 예제를 통해 기본 키와 보조 인덱스의 수행방식을 설명해보도록 하겠습니다.&lt;br&gt;
&lt;br/&gt;&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;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; t1 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
i1 &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&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;
i2 &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&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;
i3 &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&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;
d &lt;span class=&quot;token keyword&quot;&gt;DATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i2&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;INDEX&lt;/span&gt; k_d &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;d&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;ENGINE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;InnoDB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; t1 &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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 string&quot;&gt;&apos;2021-07-13&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;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&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 string&quot;&gt;&apos;2021-07-13&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;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2021-07-13&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;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2021-07-14&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;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2021-07-11&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 keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; t1 &lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2021-07-13&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt; i1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&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 comment&quot;&gt;# |       type       |         key         |      rows     |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |---------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |   index_merge    |     k_d, PRIMARY    |        2      |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +--------------------------------------------------------+&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; t1 &lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2021-07-13&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt; i3 &lt;span class=&quot;token operator&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 comment&quot;&gt;# +----------------------------------------------------+ &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |     type   |     key     |   key_len  |    rows    |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |-----------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |     ref    |     k_d     |      4     |      3     |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +----------------------------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;  &lt;code class=&quot;language-text&quot;&gt;k_d&lt;/code&gt; 인덱스의 키로 정의된 컬럼은 d뿐이지만, 기본 키의 컬럼과 인덱스의 컬럼을 함께 조건으로 사용하는 경우, 쿼리의 성능이 더 좋습니다. 반면에 기본키 컬럼을 조건으로 사용하지 않는 조회의 경우, &lt;code class=&quot;language-text&quot;&gt;k_d&lt;/code&gt; 인덱스만 사용합니다. 이 때, 인덱스의 길이인 &lt;code class=&quot;language-text&quot;&gt;key_len&lt;/code&gt;을 보면, 분명 &lt;code class=&quot;language-text&quot;&gt;k_d&lt;/code&gt; 인덱스의 키는 d컬럼으로, 인덱스 길이는 3(11일, 13일, 14일)이어야 합니다. 하지만 길이가 4인 것으로 볼 때, k_d 인덱스가 (d, i1, i2)를 키로 사용한 (d, i1)컬럼의 값인 (13, 1), (13, 6), (14, 2), (11, 3)으로 구성되어 있을 것으로 예상할 수 있습니다. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;이외의-인덱스-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EC%99%B8%EC%9D%98-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%A2%85%EB%A5%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;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secondary Index (보조 인덱스)&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;  Clustered Index이외의 모든 인덱스를 말합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UNIQUE INDEX&lt;/strong&gt;   &lt;/p&gt;
&lt;p&gt;  UNIQUE INDEX는 UNIQUE KEY(유일 키)를 통해 정의할 수 있으며 해당 인덱스는 모든 행을 구분할 수 있는 제약조건을 정의합니다. 제약조건은 아래와 같습니다.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;유일 키의 컬럼들의 값은 모든 행을 구별할 수 있도록 유일한 값이어야 합니다. (UNIQUE INDEX)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단, NULL이 허용됩니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;유일 키는 NOT NULL의 제약조건이 추가되는 경우, 기본 키가 될 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;4-foreign-key&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-foreign-key&quot; aria-label=&quot;4 foreign key 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. FOREIGN KEY&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;  외래키는 &lt;strong&gt;테이블 간의 데이터의 동일성 제약조건을 정의&lt;/strong&gt;하기 위해 사용됩니다. 외래키의 제약조건은 자식 테이블에서 외래키로 설정된 컬럼들의 값이 반드시 부모 테이블의 컬럼의 값을 사용하도록 강제합니다. 이를 통해 부모 테이블과 자식 테이블 간의 데이터 동일성을 만족하게 됩니다. 제품 - 주문 - 고객 테이블 예제를 통해 알아보도록 하겠습니다.&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;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; product &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    category &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    price &lt;span class=&quot;token keyword&quot;&gt;DECIMAL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&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;ENGINE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;INNODB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; customer &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    id &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&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;ENGINE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;INNODB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; product_order &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;no&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    product_category &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    product_id &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    customer_id &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;no&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;INDEX&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;product_category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; product_id&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;INDEX&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;customer_id&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;FOREIGN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;product_category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; product_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;REFERENCES&lt;/span&gt; product&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CASCADE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DELETE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;RESTRICT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;FOREIGN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;customer_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;REFERENCES&lt;/span&gt; customer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&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;ENGINE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;INNODB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;  위의 SQL문을 통해 테이블과 인덱스, 외래키까지 정의하였습니다. 테이블들의 관계를 ERD 다이어그램으로 그려보면 아래와 같이 그릴 수 있습니다.&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: 451px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6f449481e8009ad88b455f029624d421/38070/foreign_key_1.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: 53.37837837837838%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABUUlEQVQoz42SWYsCQQyE+///LkFHffBBRkbxwmu87/uo5cuSYXBldwNFd6fTqSTV4Xw+azAYqFgsqlarabFYaLlcarVa6ZPN53ONx2NVKhVVq1XV63VFUaQ0TbVerxXa7bZarZYFzWYznU4nQeJ7T8AeGw6Hdgem02m2cn+5XBQ6nY453m273VoyCLm/3+/m73a7dr5er0ZMEnA4HAyBIIKPx2MG2GidR6/XK/ND0O/31Wg0RCGQlctljUYjI3s+n98t3263H9jtdhZEQiqZTCZWNQmbzaZ6vZ75iH08HllsgDVfXR4EAJ8PQ0+SRHEcW5WICVnerGUY3uHGnspYGQECAReEThgZdyBQMg6Qb9lFIBHDdss/dmF87iAQzF8qFAoqlUo2+M1mY38x37LP6C8LzkBiVs7e2n6/NwURAp8n/Q0B9k+CIABGpShK8v9U+QUQnkyiK2B3cQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;foreign key 1&quot;
        title=&quot;foreign key 1&quot;
        src=&quot;/static/6f449481e8009ad88b455f029624d421/38070/foreign_key_1.png&quot;
        srcset=&quot;/static/6f449481e8009ad88b455f029624d421/12f09/foreign_key_1.png 148w,
/static/6f449481e8009ad88b455f029624d421/e4a3f/foreign_key_1.png 295w,
/static/6f449481e8009ad88b455f029624d421/38070/foreign_key_1.png 451w&quot;
        sizes=&quot;(max-width: 451px) 100vw, 451px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;  그림에서 주문 테이블(&lt;code class=&quot;language-text&quot;&gt;product_order&lt;/code&gt;)와 상품 테이블(&lt;code class=&quot;language-text&quot;&gt;product&lt;/code&gt;) &lt;code class=&quot;language-text&quot;&gt;FK(1)&lt;/code&gt;의 표현을 보시면 1: N 관계임을 알 수 있습니다. 자식 테이블인 주문 테이블의 (&lt;code class=&quot;language-text&quot;&gt;product_category&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;product_id&lt;/code&gt;) 컬럼의 값은 반드시 부모 테이블인 상품 테이블의 (&lt;code class=&quot;language-text&quot;&gt;category&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt;) 컬럼에 동일한 값이 존재해야 합니다. 두 테이블 간의 관계는 두 가지를 보장하게 됩니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;주문한 제품이 없는 주문은 존재하지 않습니다.&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모든 주문은 회사가 취급하는 제품(제품 테이블에 존재하는 제품)에 대한 주문입니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  이러한 &lt;strong&gt;추상적인 관계의 제약을 데이터베이스에 적용하기 위해&lt;/strong&gt; 외래키를 사용하는 것입니다. 외래키는 주문이 진행되어 주문 테이블의 행 삽입 시마다 외래키를 통해 제품 테이블의 컬럼값을 확인하는 과정을 거칩니다. 이 과정에서 위의 두 관계를 만족시키지 못하는 경우에는 데이터의 동일성을 유지하기 위해 행이 삽입되지 않습니다. 이와 마찬가지로 주문한 고객이 없는 주문은 있을 수 없기 때문에 &lt;code class=&quot;language-text&quot;&gt;FK(2)&lt;/code&gt;에 의해 주문 테이블의 &lt;code class=&quot;language-text&quot;&gt;customer_id&lt;/code&gt; 컬럼의 값은 반드시 고객(&lt;code class=&quot;language-text&quot;&gt;customer&lt;/code&gt;) 테이블의 &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; 컬럼에 동일한 값이 존재해야 합니다.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여담으로, 제품 테이블의 기본 키를 (category, id) 순으로 사용하는 것으로 보아 제품 각각에 대한 조회보다 카테고리별 조회가 빈번하게 발생하는 경우라고 생각해볼 수 있겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;h3 id=&quot;foreign-key-추가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#foreign-key-%EC%B6%94%EA%B0%80&quot; aria-label=&quot;foreign key 추가 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;FOREIGN KEY 추가&lt;/h3&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;&lt;span class=&quot;token keyword&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; child_tbl_name
    &lt;span class=&quot;token keyword&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CONSTRAINT&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;symbol&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;FOREIGN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index_name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;col_name&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 keyword&quot;&gt;REFERENCES&lt;/span&gt; parent_tbl_name &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;col_name&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;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DELETE&lt;/span&gt; reference_option&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;ON&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; reference_option&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

reference_option:
    &lt;span class=&quot;token keyword&quot;&gt;RESTRICT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CASCADE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NO&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ACTION&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;외래키의 추가는 자식 테이블에서 정의합니다.&lt;span class=&apos;small-text&apos;&gt;(관계를 정의할 대상인 부모 테이블이 존재해야 하기 때문에 어찌 보면 당연합니다..)&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;CONSTRAINT [symbol]&lt;/code&gt; 의 경우, 외래키 제약조건의 이름을 정의하기 위해 사용하며 생략할 수 있으나 이름을 통해 제약조건의 의미를 바로 알아볼 수 있도록 생략하는 것을 피하는 것이 좋습니다.  &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;code class=&quot;language-text&quot;&gt;reference_option&lt;/code&gt;&lt;/em&gt; 을 통해 제약조건에 의해 부모 테이블의 관계가 정의된 컬럼값의 수정, 삭제 시의 반영방식을 정의 할 수 있습니다.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;&lt;br&gt;
부모 테이블의 컬럼 값의 수정, 삭제가 자식 테이블의 컬럼에도 동일하게 반영됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SET NULL&lt;/strong&gt;&lt;br&gt;
부모 테이블의 컬럼 값의 수정, 삭제시 자식 테이블의 컬럼 값은 NULL을 가집니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt;&lt;br&gt;
수정, 삭제 시 InnoDB의 default 옵션으로, 외래키로 정의된 부모 테이블의 컬럼의 수정, 삭제하지 못하도록 막습니다. NO ACTION 옵션도 같게 동작합니다.&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;h3 id=&quot;사용시-장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%9E%A5%EC%A0%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;/h3&gt;
&lt;p&gt;  외래키의 사용이 성능에 대한 이점을 가져다주지는 않습니다. 오히려 삽입 시마다 부모 테이블에 대해 존재 여부를 확인하는 과정을 거쳐야 하기 때문에 성능상 손해라고 볼 수 있습니다. 두 테이블을 외래키를 통해 조인하는 경우, 성능상의 이점을 가진다고 볼 수 있겠지만 이것은 외래키의 사용이 아닌 외래키의 생성 조건에 해당하는 &apos;부모 테이블의 외래키에는 인덱스가 존재하여야 한다&apos;에 의한 것입니다. 조인된 테이블에 대한 조회 시 해당 인덱스를 사용하기 때문입니다. 하지만 &lt;strong&gt;테이블 간의 관계를 제약조건을 통해 데이터베이스가 데이터의 동일성을 유지함으로써 구현할 수 있고, 이는 곧 데이터 무결성을 보장&lt;/strong&gt;한다고 할 수 있겠습니다. &lt;/p&gt;
&lt;br/&gt;
&lt;h3 id=&quot;사용시-유의사항&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD&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;ol&gt;
&lt;li&gt;&lt;strong&gt;외래키로 정의된 부모 테이블의 컬럼과 자식 테이블의 컬럼은 동일한 형식을 사용합니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;외래키로 정의된 부모 테이블의 컬럼은 반드시 인덱스가 필요합니다.&lt;/strong&gt;&lt;br&gt;
 외래키 제약조건에 의해 자식 테이블의 행 삽입 시마다 부모 테이블의 외래키로 정의된 컬럼의 값에 대해 존재 여부를 확인해야 합니다. 이 과정을 테이블에 대한 조회가 아닌 인덱스를 사용한 조회를 통해 빠르게 수행하기 위해 외래키로 정의된 컬럼에 인덱스가 정의되어야 합니다. 부모 테이블에서 여러 컬럼을 외래키로 사용할 때도 동일하게 외래키로 정의된 맨 처음 컬럼에 대한 인덱스가 존재하여야 합니다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파티셔닝된 테이블에 대해서는 외래키를 사용할 수 없습니다.&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;자식 테이블의 외래키 컬럼 값은 반드시 부모 테이블의 외래키 컬럼에 존재하여야 합니다.&lt;/strong&gt;&lt;br&gt;
 매우 당연한 이야기처럼 들리지만, 지켜지지 않는 경우가 꽤 있습니다. 예를 들어, 앞의 예제에서 아래의 ERD 다이어그램과 같이 카테고리만 따로 모아두는 테이블이 생성되었다고 생각해봅시다.&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b94b12569ba3f31c1093f11b6a76a8f0/e185b/foreign_key_2.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: 35.13513513513513%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAAA+0lEQVQoz3WR56qDQBCF9/1fLwERsWJPjBJjiRrP5VtYyI/cgXHL7JwymqqqFEWRLpeL7ve7+r5X0zRq29aucRzL8zx1XadhGLTvu9Z11Xme9kzd931lWabr9SrDJ0kSzfOs9/ttH71eLz0eDwVBIAi3bdNxHHo+n5akKAp9Ph/Vda3b7Wbf0gO4AWwcR8sKKHsCJTSyQkS6GntAUBWGoXXIuSxLGR4gH0aXBIqwDYkDhZRYlsUqAgiHeZ7b+zRNZQD7FdyT2AXA2XaAEE/TZFUDDiHzN67xO50tfhI2GDqWmC/AgPwnxPxS5gAZOpZRwooC1DA76t9OXP4B1MYaD8qWs8kAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;foreign key 2&quot;
        title=&quot;foreign key 2&quot;
        src=&quot;/static/b94b12569ba3f31c1093f11b6a76a8f0/fcda8/foreign_key_2.png&quot;
        srcset=&quot;/static/b94b12569ba3f31c1093f11b6a76a8f0/12f09/foreign_key_2.png 148w,
/static/b94b12569ba3f31c1093f11b6a76a8f0/e4a3f/foreign_key_2.png 295w,
/static/b94b12569ba3f31c1093f11b6a76a8f0/fcda8/foreign_key_2.png 590w,
/static/b94b12569ba3f31c1093f11b6a76a8f0/e185b/foreign_key_2.png 691w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;새로운 카테고리의 제품을 판매하려는 상황을 가정합니다. 이때 카테고리 테이블에 새로운 카테고리 삽입과 제품 테이블에 대한 새로운 카테고리의 물품 삽입을 동시에 실행하려고 하게 되면 간혹 카테고리 테이블에 삽입이 되기 전에 제품 테이블 삽입이 진행되면서 제약조건에 의해 삽입되어야 할 제품들이 누락되는 경우가 발생할 수 있습니다. (생각보다 쉽게 발생할 수 있습니다..)외래키 제약조건의 사용을 고려할 때에는 &lt;strong&gt;반드시 부모 테이블에 대한 초기화가 선행되는 작업일 경우&lt;/strong&gt;에만 사용하거나 동시에 작업이 수행되지 않도록 예외처리를 해둬야 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;정리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%EB%A6%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;/h1&gt;
&lt;p&gt;이번 포스팅에서는 InnoDB의 3, 4번 장점에 관해 설명하였습니다. 저번 포스팅과 동일하게 기능 구현에서 적용할 수 있는 것들을 정리해보겠습니다.&lt;/p&gt;
&lt;h3 id=&quot;3-clustered-index-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-clustered-index-1&quot; aria-label=&quot;3 clustered index 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;3. Clustered Index&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;해당 테이블에서 빈번하게 사용되는 트랜잭션의 조회조건을 파악하여 적합한 기본 키를 설정합니다.&lt;/li&gt;
&lt;li&gt;여러 개의 컬럼을 키로 사용하는 경우, 최소 조건이 되는 컬럼을 가장 빠른 순으로 정의합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-foreign-key-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-foreign-key-1&quot; aria-label=&quot;4 foreign key 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;4. FOREIGN KEY&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;두 테이블 간 동일성이 유지되어야 하는 컬럼에 대해서 외래키를 사용합니다.&lt;/li&gt;
&lt;li&gt;조인이 필요한 테이블에 조인 기준 컬럼을 외래키로 정의합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 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;/h1&gt;
&lt;p&gt;[1] 인덱스와 테이블의 구조 이미지 &lt;a href=&quot;https://www.ibm.com/support/producthub/db2/docs/content/SSEPGG_11.5.0/com.ibm.db2.luw.admin.dbobj.doc/doc/c0023327.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.ibm.com/support/producthub/db2/docs.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] 외래키 &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;</content:encoded></item><item><title><![CDATA[MySQL의 엔진 InnoDB를 알아보자.(1/2)]]></title><description><![CDATA[스타트업 지원사업을 통해 데이터베이스 설계 및 유지보수 컨설팅을 받은 적이 있습니다. 멘토님과 이야기를 나누면서 DBA는 기본적으로 MySQL, MariaDB의 기본 엔진인 InnoDB에 대해 알아야 한다고 조언해주셨습니다. 엔진의 동작 원리에 따라…]]></description><link>https://chanuuuuu.github.io/innodb-01/</link><guid isPermaLink="false">https://chanuuuuu.github.io/innodb-01/</guid><pubDate>Tue, 13 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;  스타트업 지원사업을 통해 데이터베이스 설계 및 유지보수 컨설팅을 받은 적이 있습니다. 멘토님과 이야기를 나누면서 DBA는 기본적으로 MySQL, MariaDB의 기본 엔진인 InnoDB에 대해 알아야 한다고 조언해주셨습니다. 엔진의 동작 원리에 따라 최적화 및 유지보수가 가능하기 때문인데요. 그래서 이번 포스팅은 MySQL docs에서 소개하고 있는 InnoDB의 장점을 자세히 설명하면서 필요한 주변 개념들도 함께 정리하고자 합니다. &lt;/p&gt;
&lt;h2 id=&quot;innodb-주요-장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#innodb-%EC%A3%BC%EC%9A%94-%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;innodb 주요 장점 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;InnoDB 주요 장점&lt;/h2&gt;
&lt;p&gt;  InnoDB는 MySQL 기본 저장 엔진입니다. MySQL docs에서 소개하고 있는 InnoDB의 주요 장점을 살펴보면,  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;동작을 수행하는 Commit, 동작 수행 이전 상태로 돌아가는 Rollback과 같은 Transaction 기능을 지원한다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row-level locking과 Consistent reads를 통해 다중 사용자 환경에서 동시 수행이 가능하다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;물리적 저장 기준인 PRIMARY KEY를 통한 Clustered index 기능을 제공한다. &lt;/li&gt;
&lt;li&gt;데이터 무결성을 보장하기 위한 FOREIGN KEY 기능을 제공한다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  이외에도 여러 가지 기능을 제공하지만 이번 포스팅은 주요 장점 1, 2번에 대해 다룰 것입니다. 1번부터 하나씩 살펴보겠습니다.&lt;/p&gt;
&lt;h1 id=&quot;1-transaction-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-transaction-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot;1 transaction 기능 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. Transaction 기능&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;   Transaction(트랜잭션)이란, 데이터베이스에서 수행하는 작업의 가장 작은 단위를 말합니다. InnoDB는 모든 데이터베이스의 작업을 트랜잭션 단위로 묶어 수행하며, 트랜잭션이 ACID라고 불리는 특성을 만족할 수 있도록 기능을 제공합니다. ACID의 개념을 짧게 정리하면,&lt;/p&gt;
&lt;h3 id=&quot;acid&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#acid&quot; aria-label=&quot;acid 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;ACID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A : Atomicity (원자성)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; 트랜잭션의 작업은 분리될 수 없습니다. 만약 트랜잭션 내의 모두 작업이 수행되지 않으면 트랜잭션의 수행 이전 상태로 돌아가야 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C :  Consistency (일관성)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;트랜잭션의 작업 이전, 이후 모두 데이터베이스의 무결성 제약조건을 만족해야합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I : Isolation (독립성)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;트랜잭션이 동시에 수행될 때, 각 트랜잭션 간의 수행이 서로에게 영향을 주지 않고 독립적으로 수행하게 됩니다. 해당 특성은 자원 점유에 대한 문제로, 성능을 위해 격리 수준을 조절할 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;D : Durability(지속성)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;데이터 베이스의 무결성 제약을 위해 트랜잭션의 결과는 영속적으로 반영되어야 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  이러한 특성을 만족할 수 있도록 트랜잭션의 COMMIT, ROLLBACK 기능을 제공합니다. &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;&lt;span class=&quot;token comment&quot;&gt;// autocommit은 세션 내에서 지정할 수 있습니다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; autocommit &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 comment&quot;&gt;// autocommit mode에서도 트랜잭션을 명시하여 사용할 수 있습니다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;START&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TRANSACTION&lt;/span&gt; 
&lt;span class=&quot;token comment&quot;&gt;// 여러가지 SQL 문.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;COMMIT&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;  또한 SQL 쿼리문 각각이 하나의 트랜잭션으로 수행되는 &lt;strong&gt;&lt;em&gt;autocommit&lt;/em&gt; mode&lt;/strong&gt;를 제공합니다. 해당 모드에서는 사용자의 커넥션이 발생하였을 때, 새로운 세션을 시작하게 되고 각 쿼리문의 트랜잭션이 자동으로 커밋됩니다. 하지만 세션 내에서 트랜잭션의 에러가 발생하게 되면 해당 트랜잭션의 쿼리문의 수행이 ROLLBACK됩니다.  &lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;2-consistent-reads--row-level-locking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-consistent-reads--row-level-locking&quot; aria-label=&quot;2 consistent reads  row level locking 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. Consistent reads &amp;#x26; Row-level locking&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;  데이터베이스의 트랜잭션을 동시에 수행하기 위해서는 동일한 데이터를 동시에 조회하거나 수정/삭제하는 방식을 정의해야 합니다. 이러한 동시성 제어를 위해 &lt;strong&gt;Consistent reads&lt;/strong&gt;와 &lt;strong&gt;Row-level locking&lt;/strong&gt;를 사용합니다.&lt;/p&gt;
&lt;h2 id=&quot;mvccmulti-version-concurrency-control-다중-버전-동시성-제어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mvccmulti-version-concurrency-control-%EB%8B%A4%EC%A4%91-%EB%B2%84%EC%A0%84-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4&quot; aria-label=&quot;mvccmulti version concurrency control 다중 버전 동시성 제어 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;MVCC(Multi-Version Concurrency Control) 다중 버전 동시성 제어&lt;/h2&gt;
&lt;p&gt;  기본적으로 InnoDB는 &lt;strong&gt;여러 시점에 버저닝된 스냅샷을 통해 동시성 제어를 수행&lt;/strong&gt;합니다. 스냅샷이란, 특정 시점의 데이터의 상태를 말합니다. 데이터를 조회하는 시점에 해당 데이터의 현재 상태를 미리 저장하여 두고 작업을 수행하는 방식으로, 여러 트랜잭션이 동시에 수행되더라도 각각 특정 시점의 데이터 상태를 기준으로 수정/삭제하기 때문에 동시성 제어가 가능하게 됩니다. 이후 각 스냅샷들 간의 변경을 데이터베이스에 반영하는 과정이 내부적으로 이루어집니다. 하지만 문제는 &lt;strong&gt;트랜잭션 내에서 여러번의 조회가 발생하는 경우&lt;/strong&gt;입니다. 설명을 위해 MySQL docs의 예제를 가져왔습니다.&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;               &lt;span class=&quot;token keyword&quot;&gt;Session&lt;/span&gt; A              &lt;span class=&quot;token keyword&quot;&gt;Session&lt;/span&gt; B

           &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; autocommit&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;SET&lt;/span&gt; autocommit&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;time&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;          &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;#empty set&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                                 &lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&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;|&lt;/span&gt;
v          &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
           &lt;span class=&quot;token comment&quot;&gt;#empty set&lt;/span&gt;
                                  &lt;span class=&quot;token keyword&quot;&gt;COMMIT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

           &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
           &lt;span class=&quot;token comment&quot;&gt;# (X)&lt;/span&gt;

           &lt;span class=&quot;token keyword&quot;&gt;COMMIT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

           &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		    &lt;span class=&quot;token comment&quot;&gt;# (Y)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;  예제는 두 개의 세션이 동일한 데이터에 대한 트랜잭션을 수행하고 있습니다. 세션 A가 3번째로 조회하는 시점에 세션 B가 트랜잭션이 COMMIT됨에 따라 데이터베이스에 반영되었습니다. 세션 A에서 3번째 조회 결과인 (X)는 두 가지가 될 수 있습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;트랜잭션 내부에서 사용되는 데이터베이스의 상태인 &apos;empty set&apos;  → &lt;strong&gt;Repeatable Read&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;세션 B가 수행한 트랜잭션이 반영된 현재 데이터베이스의 상태인 (1, 2) → &lt;strong&gt;READ COMMITTED&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이러한 &lt;strong&gt;단일 트랜잭션 내의 여러 번의 조회 결과를 정의하는 방식&lt;/strong&gt;을 isolation level(격리 수준)로 정할 수 있는데요. 두 격리 수준에서 동시성 제어는 어떻게 이루어지는지 확인해보겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;repeatable-read&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#repeatable-read&quot; aria-label=&quot;repeatable read 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;Repeatable Read&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  innoDB의 격리 수준 중에서 기본설정에 해당하는 수준입니다. 번역하면 &apos;반복 가능한 읽기&apos;인데, 말 그대로 &lt;strong&gt;동일 트랜잭션 내에서는 동일한 상태를 반복적으로 읽을 수 있다는 것&lt;/strong&gt;입니다. &lt;/p&gt;
&lt;h3 id=&quot;1-consistent-read&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-consistent-read&quot; aria-label=&quot;1 consistent read 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) Consistent read&lt;/h3&gt;
&lt;p&gt;  트랜잭션 내에서 모든 작업은 최초로 읽은 데이터로 구성된 스냅샷을 사용하며, 트랜잭션이 커밋된 이후에만 새로운 스냅샷을 생성하여 사용합니다. 이를 통해 동일 트랜잭션에서의 모든 조회가 동일한 스냅샷을 보기 때문에 반복적인 읽기가 가능하게 됩니다. 그러므로 트랜잭션 내에서 여러 번의 조회를 수행하더라도 다른 트랜잭션이 삽입, 수정, 삭제한 작업의 결과가 데이터에 반영되지 않습니다. 위의 예제에서는 세션 A의 스냅샷을 사용하고 있기 때문에 세 번째 조회 결과 (X) 또한 세션 B의 수정이 반영되지 않은 &apos;empty set&apos;이 반환됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;트랜잭션의 시작 시점이 아닌 최초 SELECT 문을 통한 조회 시점에 스냅샷이 생성됩니다.&lt;/strong&gt;&lt;br&gt;
 그러므로 최초의 SELECT 문을 수행하기 전 커밋된 다른 트랜잭션의 데이터 수정이 스냅샷에 반영됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-row-level-locking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-row-level-locking&quot; aria-label=&quot;2 row level locking 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) Row-level locking&lt;/h3&gt;
&lt;p&gt;  해당 격리 수준에서는 UPDATE, DELETE문을 위한 조회(수정하거나 삭제할 대상을 위한 조회)를 수행할 때 조회하는 조건 방식에 따라 다른 수정 / 삭제 작업인 UPDATE, DELETE문에 대한 잠금이 발생합니다. 모든 잠금은 트랜잭션이 커밋되는 시점에 해제됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UNIQUE Index를 사용할 수 있는 단일 값에 대한 조건을 가진 쿼리에 대해서는 해당 행에 대한 lock을 수행합니다.(Row-level locking)&lt;/strong&gt;&lt;br&gt;
 쿼리문의 대상이 된 행에 대한 lock으로 인해 동시에 수정 / 삭제 작업이 수행되지 못하고 해제될 때까지 지연됩니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이외에 방식의 조건의 경우, 조회에 사용된 모든 범위에 대한 lock을 수행합니다.(Gap locking)&lt;/strong&gt;&lt;br&gt;
 조회 범위에 해당하는 행에 대한 잠금으로 인해 동시에 수정 / 삭제 작업이 수행되지 못하고 해제될 때까지 지연됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;h2 id=&quot;read-committed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#read-committed&quot; aria-label=&quot;read committed 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;READ COMMITTED&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  격리 수준 중, Repeatable Read 다음 수준으로, &lt;strong&gt;조회를 수행하는 시점에 커밋된 것을 읽는다는 것&lt;/strong&gt;을 의미합니다. &lt;/p&gt;
&lt;h3 id=&quot;1-consistent-read-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-consistent-read-1&quot; aria-label=&quot;1 consistent read 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) Consistent read&lt;/h3&gt;
&lt;p&gt;  &lt;strong&gt;조회 시점마다 새로운 스냅샷을 찍기 때문에 동일 트랜잭션 내에서도 다른 트랜잭션의 수정이 반영된 데이터를 조회&lt;/strong&gt;할 수 있게 됩니다. 위의 예제에서 매번 조회시마다 해당 시점의 최신 데이터로 스냅샷을 생성합니다. 세번째 조회 시점에는 이전에 커밋된 세션 B의 결과가 반영된 결과인 (1, 2) 행이 결과로 반환됩니다.&lt;/p&gt;
&lt;h3 id=&quot;2-row-level-locking-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-row-level-locking-1&quot; aria-label=&quot;2 row level locking 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;2) Row-level locking&lt;/h3&gt;
&lt;p&gt;  Repeatable Read 격리 수준과 동일하게 UPDATE, DELETE문을 위한 조회(수정하거나 삭제할 대상을 위한 조회)를 수행할 때 조회하는 조건 방식에 따라 다른 수정 / 삭제 작업인 UPDATE, DELETE문에 대한 잠금이 발생합니다. 모든 잠금은 트랜잭션이 커밋되는 시점에 해제됩니다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하지만 다른 점은 &lt;strong&gt;조회 범위에 대한 잠금이 아닌 수정을 수행할 행에 대해서만 잠금이 발생하게 됩니다.(Row-level locking)&lt;/strong&gt;&lt;br&gt;
 조건으로 사용되지 않은 행에 대해서는 lock이 존재하지 않기 때문에 다른 트랜잭션의 UPDATE, DELETE가 수행되어 값이 즉시 반영되지만, 조건으로 사용된 행에 대해서는 lock이 해제되고 난 후에 수행됩니다. 이러한 잠금 방식은 동시성을 높이고 교착 상태를 피할 수 있게 합니다. 하지만 &lt;em&gt;Phantom Rows&lt;/em&gt;가 발생할 수 있습니다. &lt;em&gt;Phantom Rows&lt;/em&gt;에 대한 설명은 &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;해당 링크&lt;/a&gt;를 참고하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h3 id=&quot;-격리-수준별-row-level-locking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80%EB%B3%84-row-level-locking&quot; aria-label=&quot; 격리 수준별 row level locking 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;+) 격리 수준별 Row-level Locking&lt;/h3&gt;
&lt;p&gt;   각 격리 수준의 행 수준의 잠금 차이를 이해하기 위해 MySQL doc의 예제를 설명하고자 합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1. 인덱스를 사용하지 않는 UPDATE / DELETE&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&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;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; t &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ENGINE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;InnoDB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&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;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&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;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&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;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&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;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&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;COMMIT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Session A&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;START&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TRANSACTION&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Session B&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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 comment&quot;&gt;# |      type     |      rows    |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |-------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |       ALL     |       5      |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;  예제에는 인덱스를 정의하지 않은  테이블 t가 존재합니다. 세션 A 쿼리문의 실행계획를 통해 조회한 행의 수는 5개로, 수정 작업을 위해 모든 행에 대한 조회가 발생했다는 것을 알 수 있습니다. &lt;strong&gt;세션 A의 트랜잭션 수정 작업이 커밋되지 않은 시점에 동시에 세션 B의 수정 작업을 수행하고자 하는 상황&lt;/strong&gt;입니다. 각 격리 수준에 따라 수행 결과를 설명해보겠습니다.  &lt;/p&gt;
&lt;br/&gt; 
&lt;p&gt;&lt;strong&gt;Repeatable Read&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;  세션 A 쿼리문의 실행계획에서처럼 수정 작업의 조건을 만족하는 행을 찾기 위해서 모든 행을 조회하였습니다. 이때, 트랜잭션이 커밋되지 않았기 때문에 &lt;strong&gt;조회를 사용한 모든 행에 대한 잠금이 발생&lt;/strong&gt;합니다. 이전 세션 A의 모든 행에 대한 잠금으로 인해 세션 B의 업데이트는 세션 A의 트랜잭션이 커밋될 때까지 지연됩니다.&lt;br&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;READ COMMITTED&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  해당 격리 수준에서는 수정 작업의 조건을 만족하는 행을 찾기 위해서 조회한 행이 아닌 &lt;strong&gt;실제 수정 작업을 수행하는 행에 대해서만 잠금이 발생&lt;/strong&gt;합니다. 세션 A를 통해서 UPDATE하지 않은 행 (1, 2) (5, 2)에 대한 잠금이 발생하지 않으므로, 세션 A의 트랜잭션이 커밋되지 않았음에도 세션 B의 수정이 즉시 이루어질 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2. 인덱스를 사용하는 UPDATE / DELETE&lt;/strong&gt;&lt;br&gt;
&lt;br/&gt;&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;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; t &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INDEX&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&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;ENGINE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;InnoDB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&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;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&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;COMMIT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Session A&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;START&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TRANSACTION&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Session B&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;EXPLAIN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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 comment&quot;&gt;# |      type     |      possible_keys    |      rows       |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |----------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |     range     |            b          |        1        |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +---------------------------------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
&lt;p&gt;&lt;strong&gt;Repeatable Read, READ COMMITTED&lt;/strong&gt;&lt;br&gt;
  &lt;strong&gt;인덱스를 사용하는 경우, 두 격리 수준 모두 수정 작업을 수행하는 행에 대해서만 잠금이 발생&lt;/strong&gt;합니다. 사실, Repeatable Read 수준에서는 작업을 수행하는 행에 대한 잠금이 발생한다고 해석하는 것보다는 수정 작업의 조건을 만족하는 행을 찾기 위한 조회가 Unique Index로 인해 작업을 수행하는 행에 대해서만 조회가 발생하고, 조회된 행에 대한 잠금이 발생한다고 보는 것이 맞습니다. 실제 Index가 존재할 때 세션 A의 UPDATE문의 실행계획을 보면 인덱스 b를 사용하여 1개의 행에 대한 조회가 발생한 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&quot;정리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%EB%A6%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;/h1&gt;
&lt;p&gt;이번 포스팅에서는 InnoDB의 1, 2번 장점에 관해 설명하였습니다. 장점에 대해 아는 것도 중요하지만 각 장점을 충분히 활용할 수 있도록 기능 구현에서 적용할 수 있는 것들을 정리해보겠습니다.  &lt;/p&gt;
&lt;h3 id=&quot;1-transaction-기능-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-transaction-%EA%B8%B0%EB%8A%A5-1&quot; aria-label=&quot;1 transaction 기능 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. Transaction 기능&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;반드시 함께 수행되어야 하는 쿼리들에 대해서는 트랜잭션으로 묶어서 사용하도록 합니다. 예를 들어 송금에 대한 기능 구현 시, A의 계좌에서 송금할 금액 차감, B의 계좌에 송금된 금액 가산, A에서 B로 송금한 로그 기록 등 하나라도 누락되어서는 안 되는 일련의 작업을 하나의 트랜잭션화하여 일관된 데이터 삽입이 가능하도록 구현합니다.&lt;/li&gt;
&lt;li&gt;트랜잭션 화 하여 수행하는 경우, 트랜잭션을 구성하는 작업 중 하나라도 에러를 반환하면, 해당 트랜잭션이 ROLLBACK되기 때문에 반드시 수행되지 않는 경우에 대해 에러 핸들링이 고려하여야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-row-level-locking과-consistent-reads를-통해-다중-사용자-환경에-대한-동시성-제어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-row-level-locking%EA%B3%BC-consistent-reads%EB%A5%BC-%ED%86%B5%ED%95%B4-%EB%8B%A4%EC%A4%91-%EC%82%AC%EC%9A%A9%EC%9E%90-%ED%99%98%EA%B2%BD%EC%97%90-%EB%8C%80%ED%95%9C-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4&quot; aria-label=&quot;2 row level locking과 consistent reads를 통해 다중 사용자 환경에 대한 동시성 제어 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. Row-level locking과 Consistent reads를 통해 다중 사용자 환경에 대한 동시성 제어&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;수정 및 삭제 작업 시에 조회 조건을 인덱스를 기준으로 사용하여 행별 잠금으로 수행하도록 합니다. 이를 통해 해당 작업을 수행하지 않는 행에 대해서는 동시에 접근할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;다음 포스팅에서는 InnoDB의 나머지 3, 4번 장점에 관해 설명하도록 하겠습니다.&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;</content:encoded></item><item><title><![CDATA[MySQL에서 날짜 및 시간 문자열 저장하기]]></title><description><![CDATA[지난 포스팅을 통해 JS에서 날짜 및 시간 데이터를 전달할 문자열은 ISO 8601 형식에 맞춰 사용하기로 하였다. 이제 이 문자열을 데이터베이스에 저장하고자 한다. 하지만 MySQL에서 사용할 수 있는 날짜 및 시간 데이터의 저장 형식은 5가지나 …]]></description><link>https://chanuuuuu.github.io/date-02/</link><guid isPermaLink="false">https://chanuuuuu.github.io/date-02/</guid><pubDate>Tue, 06 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;  지난 포스팅을 통해 JS에서 날짜 및 시간 데이터를 전달할 문자열은 ISO 8601 형식에 맞춰 사용하기로 하였다. 이제 이 문자열을 데이터베이스에 저장하고자 한다. 하지만 MySQL에서 사용할 수 있는 날짜 및 시간 데이터의 저장 형식은 5가지나 될뿐더러 각 형식에서 사용할 수 있는 문자열의 형식과 ISO 8601의 형식이 다르기 때문에 그대로 사용하기 어렵다. ISO 8601 형식의 문자열에 적합한 저장 형식을 고려하면서 이번 기회에 항상 헷갈렸던 MySQL의 날짜 및 시간 데이터 저장방식을 정리해보았다. &lt;span class=&apos;small-text&apos;&gt;**관계형 데이터베이스의 데이터를 다루기 위해서 데이터베이스 관리 시스템(DBMS)을 사용하는데 그 중, MySQL을 기준으로 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;mysql의-날짜-및-시간-데이터-형식-data-type&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mysql%EC%9D%98-%EB%82%A0%EC%A7%9C-%EB%B0%8F-%EC%8B%9C%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%98%95%EC%8B%9D-data-type&quot; aria-label=&quot;mysql의 날짜 및 시간 데이터 형식 data type 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;MySQL의 날짜 및 시간 데이터 형식 (Data Type)&lt;/h1&gt;
&lt;p&gt;  MySQL은 날짜 및 시간 데이터를 5가지의 형식으로 저장한다. 각 형식에 대한 차이와 사용 가능한 문자열을 설명하고자 한다. &lt;span class=&apos;small-text&apos;&gt;(숫자를 통한 표현도 가능하지만 여기서는 문자열 형식에 집중하였다.)&lt;/span&gt;기본 예제는 &apos;2020-03-20 03:30:58&apos;을 사용한다.&lt;/p&gt;
&lt;h2 id=&quot;예제환경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%88%EC%A0%9C%ED%99%98%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;/h2&gt;
&lt;p&gt;  각 날짜 및 시간 데이터의 형식을 테스트하기 위해 각 형식의 컬럼을 가진 테이블을 생성하였다. 테이블의 DDL과 생성된 테이블의 컬럼을 아래에 제시하였다.&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;&lt;span class=&quot;token keyword&quot;&gt;DROP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;IF&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;EXISTS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&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;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&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;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;timestamp&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;mydate&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;date&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;mytime&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;time&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;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;datetime&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;myyear&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;year&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ENGINE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;InnoDB&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CHARSET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;utf8mb4 &lt;span class=&quot;token keyword&quot;&gt;COLLATE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;utf8mb4_general_ci&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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: 237px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a15e2864e4910a057c8be7ebf7c769fd/008e2/date_table.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: 47.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABqElEQVQoz3VSa2+iUBDl//+R/dL00ybVZm211kcBRaAXEfARQQWadptVUYt6OnNbjV3bSU7ucO/McE7OKLqmwvN8cOx2O+z3ewnOOaIoguu6mEwmGAwGGA6HyPNcvnHd/6E0dAPxbPZlyGnwICEE0jTFaDRCr9c71m632zMoF2YK0WmhVq9D0zQ0Gg2USiVUKhX5HQQBTNOESrmqqqhTXbPZ/JGl8tuM4LsCNrGwLAs+DUjSBEmS0plKia12+/M+RRwnmMUxstUKq/X6DMqFPobV1nBfq+OuWoX9+IjN25tsyEmCcAT+EGPhOPKem9abDRbZEovlOZRLYwLPsWF0OrBtW0o8lRL4PgyjjfF4fJT1nRlHyQURY9T30HV78KiZpf2bz7GkvzHDMArhdLvo9/uSwTLLsCGGzPY7KL8ehtCbNdzclnFbLqNKsq8KBRSKRfx9fYVFrIvX11I2g/PnlxeSnGG+WJxBSg7IFGbHprAJHPn2w8XpdCrd5n2U9+TuYV93h509yZV7/4lcdiQTwzAQhqF8lI10slS91cKUdvUw8LBz+SdO83f9Heg/src5GAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;date table&quot;
        title=&quot;date table&quot;
        src=&quot;/static/a15e2864e4910a057c8be7ebf7c769fd/008e2/date_table.png&quot;
        srcset=&quot;/static/a15e2864e4910a057c8be7ebf7c769fd/12f09/date_table.png 148w,
/static/a15e2864e4910a057c8be7ebf7c769fd/008e2/date_table.png 237w&quot;
        sizes=&quot;(max-width: 237px) 100vw, 237px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h2 id=&quot;date&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#date&quot; aria-label=&quot;date 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;DATE&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  날짜 정보를 저장한다. 사용 가능한 형식은 두 가지이다. 반드시 날짜의 의미를 가진 숫자를 사용해야 한다. &lt;/p&gt;
&lt;h3 id=&quot;1-yyyy-mm-dd-의-형식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-yyyy-mm-dd-%EC%9D%98-%ED%98%95%EC%8B%9D&quot; aria-label=&quot;1 yyyy mm dd 의 형식 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. &apos;YYYY-MM-DD&apos; 의 형식&lt;/h3&gt;
&lt;p&gt;구분자를 사용한 년 - 월 - 일 데이터 형식이다. 아래와 같은 특징을 가진다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;구분자 &apos;-&apos;에 대신 다른 특수 문자로 대체가 가능하다.&lt;/strong&gt;&lt;br&gt;
&lt;/br&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;년 / 월 / 일의 숫자 모두 날짜의 의미를 지니는 숫자여야 한다. 각각의 유효 범위는 아래와 같다.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;(년 / 월 / 일 모두 0은 포함되지 않는다.)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&apos;YYYY&apos;의 유효 범위는 [0001, 9999]&lt;/li&gt;
&lt;li&gt;&apos;MM&apos;의 유효 범위는 [01, 12]&lt;/li&gt;
&lt;li&gt;&apos;DD&apos;의 유효 범위는 [01, 31]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;&lt;span class=&quot;token comment&quot;&gt;# OK!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20&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 comment&quot;&gt;# OK!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020%03%21&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 keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2021~03~22&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 comment&quot;&gt;# Incorrect date value: &apos;2020-03-32&apos; for column &apos;mydate&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 32일은 날짜의 의미를 가지지 못한다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-32&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 comment&quot;&gt;# Incorrect date value: &apos;2020-13-01&apos; for column &apos;mydate&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 13월은 날짜의 의미를 가지지 못한다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-13-01&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 comment&quot;&gt;#Incorrect date value: &apos;2020-01-00&apos; for column &apos;mydate&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 년 / 월 / 일 모두 0은 사용이 불가능하다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-01-00&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;br/&gt;
&lt;h3 id=&quot;2-구분자가-생략된-yyyymmdd-형식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%EA%B5%AC%EB%B6%84%EC%9E%90%EA%B0%80-%EC%83%9D%EB%9E%B5%EB%90%9C-yyyymmdd-%ED%98%95%EC%8B%9D&quot; aria-label=&quot;2 구분자가 생략된 yyyymmdd 형식 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. 구분자가 생략된 &apos;YYYYMMDD&apos; 형식&lt;/h3&gt;
&lt;p&gt;위의 형식에서 구분자가 생략된 형식이다. 구분자를 사용하지 않기 때문에 문자열의 길이를 줄일 수 있으나 자릿 수에 따라 시간적 의미가 달라질 수 있으므로 주의하여야 한다.&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;&lt;span class=&quot;token comment&quot;&gt;# OK!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;20210320&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 comment&quot;&gt;# Incorrect date value: &apos;20201301&apos; for column &apos;mydate&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 13월은 날짜의 의미를 가지지 못한다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;20201301&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 comment&quot;&gt;# 2069-03-20이 저장된다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;690320&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 comment&quot;&gt;# 1970-03-20이 저장된다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;700320&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;ul&gt;
&lt;li&gt;&lt;strong&gt;네 자리 표현 &apos;YYYY&apos;으로 사용된 년도를 두 자리 표현 &apos;YY&apos; 이 사용 가능하다&lt;/strong&gt;&lt;br&gt;
두 자리 표현은 표현 범위의 제약으로 필자는 사용하지 않는다. 사용하려면 &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/two-digit-years.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;표현 범위 제약 조건&lt;/a&gt;에 대해 올바르게 이해하고 사용하자. &lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;time&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time&quot; aria-label=&quot;time 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;TIME&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  시간 정보를 저장한다. 여러 가지 형식이 존재하지만, 기본적인 형식만 설명하고 이외의 형식은 예제로 소개만 하였다. DATE와 동일하게 반드시 시간의 의미를 가진 숫자를 사용해야 한다.&lt;/p&gt;
&lt;h3 id=&quot;1-기본적인-시분초로-구성된-hhmmss-형식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%8B%9C%EB%B6%84%EC%B4%88%EB%A1%9C-%EA%B5%AC%EC%84%B1%EB%90%9C-hhmmss-%ED%98%95%EC%8B%9D&quot; aria-label=&quot;1 기본적인 시분초로 구성된 hhmmss 형식 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. 기본적인 시,분,초로 구성된 &apos;hh:mm:ss&apos; 형식&lt;/h3&gt;
&lt;p&gt;구분자를 사용한 시:분:초 데이터 형식이다. 아래와 같은 특징을 가진다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;시 / 분 / 초 각각의 유효 범위는 아래와 같다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&apos;hh&apos;의 유효 범위는 [00, 23]&lt;/li&gt;
&lt;li&gt;&apos;mm&apos;의 유효 범위는 [00, 60]&lt;/li&gt;
&lt;li&gt;&apos;ss&apos;의 유효 범위는 [00, 60]&lt;br&gt;
&lt;/br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;기본 형식 &apos;hh:mm:ss&apos;에서 일의 수인 &apos;D&apos;를 추가하여 &apos;D hh:mm:ss&apos;를 사용할 수 있다.&lt;/strong&gt;&lt;br&gt;
   &apos;D&apos;는 [0, 34] 사이의 값을 가지며, 1일당 24시간씩 더해져서 TIME 형식으로 저장된다.&lt;br&gt;
위의 예제에서는 4일이므로 24*4인 96시간이 더해져 99시간으로 저장된다.&lt;br&gt;
&lt;/br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;부분 형식 또한 사용이 가능하다.&lt;/strong&gt;&lt;br&gt;
그중 하나인 &apos;hh:mm&apos; 형식을 예제에서 확인할 수 있다.&lt;/li&gt;
&lt;/ul&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;&lt;span class=&quot;token comment&quot;&gt;# &apos;hh:mm:ss&apos; 형식, OK!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;03:30:58&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 comment&quot;&gt;# Incorrect time value: &apos;03:60:58&apos; for column &apos;mytime&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;03:60:58&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 comment&quot;&gt;# &apos;D hh:mm:ss&apos; 형식, OK! &apos;99:30:58&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;4 03:30:58&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 comment&quot;&gt;# &apos;hh:mm&apos; 형식, OK! &apos;03:30:00&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;03:30&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;br/&gt;
&lt;h3 id=&quot;2-구분자가-존재하지-않는-hhmmss-형식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%EA%B5%AC%EB%B6%84%EC%9E%90%EA%B0%80-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-hhmmss-%ED%98%95%EC%8B%9D&quot; aria-label=&quot;2 구분자가 존재하지 않는 hhmmss 형식 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. 구분자가 존재하지 않는 &apos;hhmmss&apos; 형식&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;예제에서처럼 구분자가 존재하지 않는 문자열의 경우, 자릿수가 증가할수록 인식하는 형식이 달라지기 때문에 주의하여야 한다.&lt;/li&gt;
&lt;/ul&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;&lt;span class=&quot;token comment&quot;&gt;# &apos;hhmmss&apos; 형식, OK! &apos;03:30:58&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;033058&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 comment&quot;&gt;# &apos;mmss&apos; 형식, OK! &apos;00:03:30&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;0330&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 comment&quot;&gt;# &apos;ss&apos; 형식, OK! &apos;00:00:08&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;8&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 comment&quot;&gt;# &apos;ss&apos; 형식, Incorrect time value: &apos;80&apos; for column &apos;mytime&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;80&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 comment&quot;&gt;# &apos;mmss&apos; 형식, OK! &apos;00:08:00&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;800&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 comment&quot;&gt;# &apos;mmss&apos; 형식, Incorrect time value: &apos;8000&apos; for column &apos;mytime&apos; at row 1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;8000&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 comment&quot;&gt;# &apos;hhmmss&apos; 형식, OK! &apos;08:00:00&apos;의 값을 가짐.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;80000&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;ul&gt;
&lt;li&gt;&lt;span class=&apos;sub-text&apos;&gt;** TIME 형식의 경우, 정밀도를 위해 소수 초를 지원한다. &apos;hh:mm:ss.fraction&apos; 의 형식으로 최대 6자리까지의 소수를 지원하며 소수 초을 사용하기 위해서는 TIME 형식을 선언할 때, DATE(6) 과 같이 자릿수를 명시한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;datetime&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#datetime&quot; aria-label=&quot;datetime 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;DATETIME&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  날짜 및 시간 정보를 저장한다. 위의 DATE 형식과 TIME 형식을 함께 사용한 &lt;code class=&quot;language-text&quot;&gt;&amp;#39;&amp;lt;DATE&amp;gt;T&amp;lt;TIME&amp;gt;&amp;#39;&lt;/code&gt;의 형식을 사용한다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;날짜와 시간을 &apos;T&apos;를 통해 구분하며, 구분자 대신 공백을 사용할 수 있다. &lt;code class=&quot;language-text&quot;&gt;&amp;#39;&amp;lt;DATE&amp;gt; &amp;lt;TIME&amp;gt;&amp;#39;&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/br&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;DATE&amp;gt;&lt;/code&gt;는 위의 DATE 형식의 설명과, &lt;code class=&quot;language-text&quot;&gt;&amp;lt;TIME&amp;gt;&lt;/code&gt;는 위의 TIME 형식의 설명과 동일하다.&lt;/strong&gt;  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;년 / 월 / 일 / 시 / 분 / 초 모두 각 날짜와 시간의 의미를 가지는 유효 범위 내에 존재하여야 한다.  &lt;/li&gt;
&lt;li&gt;&apos;YYYY-MM-DD hh:mm:ss&apos;, &apos;YYYYMMDDhhmmss&apos;, &apos;YYYYMMDDThhmmss&apos; 의 형식이 사용가 능하다. (하지만 &apos;YYYYMMDD hhmmss&apos; 의 형식은 불가능하다.)&lt;/li&gt;
&lt;li&gt;TIME 형식과 동일하게 소수 초를 지원하며 소수 초을 사용하기 위해서는 TIME 형식을 선언할 때, &lt;code class=&quot;language-text&quot;&gt;DATETIME(6)&lt;/code&gt;와 같이 자릿수를 명시한다.&lt;br&gt;
&lt;br/&gt;   &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;오프셋의 명시가 가능하다.&lt;/strong&gt;    &lt;/p&gt;
&lt;p&gt;  명시된 오프셋이 계산된 &apos;2020-03-20 11:30:58&apos;이 저장된다. TIMESTAMP 형식과 동일하게 시간대를 반영하여 저장되는데, 아래의 TIMESTAMP 형식의 설명을 통해 이해할 수 있다.&lt;br&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;위의 설명을 통해 DATETIME 형식에는 우리가 사용하고자 했던 &apos;2020-03-20T03:30:58Z&apos;은 삽입이 불가능하다는 것을 알 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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;&lt;span class=&quot;token comment&quot;&gt;# &apos;YYYY-MM-DDThh:mm:ss&apos; 형식, &apos;2020-03-20 03:30:58&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20T03:30:58&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 comment&quot;&gt;# &apos;YYYY-MM-DD hh:mm:ss&apos; 형식, &apos;2020-03-20 03:30:58&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20 03:30:58&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 comment&quot;&gt;# ISO 8601 형식, Data truncation: Incorrect datetime value&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20T03:30:58Z&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 comment&quot;&gt;# &apos;YYYYMMDDThhmmss&apos; 형식, &apos;2020-03-20 03:30:58&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;20200320T033058&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 comment&quot;&gt;# &apos;YYYYMMDD hhmmss&apos; 형식, &apos;2020-03-20 03:30:58&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;20200320 033058&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 comment&quot;&gt;# 오프셋 명시 형식,  &apos;2020-03-20 11:30:58&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20T03:30:58+01:00&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;br/&gt;
&lt;br/&gt;
&lt;h2 id=&quot;timestamp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#timestamp&quot; aria-label=&quot;timestamp 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;TIMESTAMP&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  DATETIME과 동일하게 날짜 및 시간 정보를 저장하며 사용할 수 있는 문자열 형식 또한
&lt;code class=&quot;language-text&quot;&gt;&amp;lt;DATE&amp;gt;T&amp;lt;TIME&amp;gt;&lt;/code&gt; ,  &lt;code class=&quot;language-text&quot;&gt;&amp;lt;DATE&amp;gt; &amp;lt;TIME&amp;gt;&lt;/code&gt;으로 동일하다. 하지만 중요한 &lt;strong&gt;두 가지 차이점&lt;/strong&gt;이 존재한다.&lt;/p&gt;
&lt;h3 id=&quot;1-시간-의미의-차이&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%EC%8B%9C%EA%B0%84-%EC%9D%98%EB%AF%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4&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;p&gt;  전달되는 날짜 및 시간 문자열을 그대로 저장하는 DATETIME와 달리 TIMESTAMP 형식은 UTC 시간으로의 변환을 거친 뒤 저장한다. 이러한 변환 과정이 두 형식의 차이를 만드는데, 변환 과정을 &apos;2020-03-20 03:30:58&apos;로 예를 들어 설명한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;데이터베이스의 환경변수로 설정된 time_zone(시간대)을 통해 해당 지역의 오프셋을 정의한다.&lt;/strong&gt;    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;아래의 코드를 통해 현재 데이터베이스가 사용하는 시간대를 확인할 수 있다.&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;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; @&lt;span class=&quot;token variable&quot;&gt;@time_zone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// SYSTEM&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; @&lt;span class=&quot;token variable&quot;&gt;@system_time_zone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//KST&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/br&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;@@time_zone&lt;/code&gt; 은 MySQL이 사용하는 시간대로, &apos;SYSYEM&apos;의 값은 현재 시간대가 설정되지 않았으며, MySQL을 실행하는 OS의 시간대를 사용한다는 의미를 가진다. &lt;code class=&quot;language-text&quot;&gt;SET @@time_zone = &amp;#39;+1&amp;#39;;&lt;/code&gt; 와 같이 SET을 통해 특정 시간대를 설정할 수 있다.&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;@@system_time_zone&lt;/code&gt;은 MySQL을 실행하는 OS의 시간대를 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;      
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;날짜 및 시간 데이터를 정의된 오프셋을 사용하여 UTC 시간으로 변환하여 저장한다.&lt;/strong&gt;   &lt;/p&gt;
&lt;p&gt;  현재 데이터베이스가 사용하는 시간대가 &apos;KST&apos;이므로 오프셋은 &apos;+9&apos;이다.&lt;br&gt;
내부적으로는 &apos;2020-03-20 03:30:58&apos;으로 저장하는 것이 아닌,&lt;br&gt;
오프셋을 반대로 연산하여 변환된 UTC 시간인 &apos;2020-03-19 18:30:58&apos;UTC 로 저장된다.&lt;br&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;조회 시에 현재 데이터베이스의 오프셋을 사용하여 UTC 시간으로 저장되어있는 날짜 및 시간 데이터를 지역 시간으로 바꿔 반환한다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  TIMESTAMP 형식은 데이터 조회시마다 내부 변환 과정을 거친 데이터를 보여주기 때문에 일반적으로 DATETIME과 차이가 나지 않는다. 하지만 행 추가 시점과 조회 시점의 시간대가 변경되는 경우에 그 차이가 나타난다. 아래 코드의 결과를 통해 이해해보자.&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;&lt;span class=&quot;token keyword&quot;&gt;DELETE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; type_test&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// SYSTEM = KST = &apos;+09:00&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; @&lt;span class=&quot;token variable&quot;&gt;@time_zone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 

&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; type_test&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mydatetime&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
&lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20 03:30:58&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20 03:30:58&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 keyword&quot;&gt;SELECT&lt;/span&gt; mydatetime&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mytimestamp &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; type_test&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 comment&quot;&gt;# |      mydatetime     |      mytimestamp    |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |-------------------------------------------|&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# | 2020-03-20 03:30:58 | 2020-03-20 03:30:58 |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +-------------------------------------------+&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; @&lt;span class=&quot;token variable&quot;&gt;@time_zone&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;+01:00&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; mydatetime&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mytimestamp &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; type_test&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 comment&quot;&gt;# |      mydatetime     |      mytimestamp    |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# |-------------------------------------------|&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# | 2020-03-20 03:30:58 | 2020-03-19 19:30:58 |&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# +-------------------------------------------+&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
&amp;nbsp;&amp;nbsp;삽입 시점의 데이터베이스의 시간대는 KST으로, 오프셋은 &apos;+9&apos;이다. 시간대를 변경하기 전 조회 시점의 경우, 동일한 시간대, 동일한 오프셋이기 때문에 두 형식 모두 &apos;2020-03-20 03:30:58&apos;을 출력하는 것을 볼 수 있다. TIMESTAMP는 삽입 시점의 오프셋인 &apos;+9&apos;를 고려한 &apos;2020-03-19 18:30:58&apos;UTC 을 저장해두었다. 이후, 조회 시점의 오프셋 또한 &apos;+9&apos;로 동일하기 때문에 DATETIME과 동일한 &apos;2020-03-20 03:30:58&apos;을 반환한다. 하지만 시간대가 변경되고 난 후 TIMESTAMP 형식의 결과는 조회 시점의 시간대를 반영하기 때문에 &apos;2020-03-19 18:30:58&apos;UTC에 조회 시점의 오프셋인 &apos;+1&apos;을 연산한 &apos;2020-03-19 19:30:58&apos;을 반환하게 된다.  
&lt;/li&gt;
&lt;/ol&gt;
&lt;/br&gt;
&lt;h3 id=&quot;2-표현-범위의-차이&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%ED%91%9C%ED%98%84-%EB%B2%94%EC%9C%84%EC%9D%98-%EC%B0%A8%EC%9D%B4&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;/h3&gt;
&lt;p&gt;  두 번째 차이점인 표현 범위의 차이는 저장 방식의 차이이기도 한데, &lt;strong&gt;TIMESTAMP는 UTC 시간으로 변환하여 저장할 때, 유닉스 시간으로 저장한다.&lt;/strong&gt;   &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&apos;유닉스 시간이란, UTC 시간의 시작시간인 &apos;1970-01-01 00:00:00&apos;UTC 로부터의 경과 시간을 UTC 초를 나타내는 4 바이트 정수를 의미한다.&apos;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  TIMESTAMP는 단순히 &apos;2020-03-20 03:30:58&apos;을 UTC 시간으로 변환한 &apos;2020-03-19 18:30:58&apos;UTC를 저장하는 것이 아닌, &lt;strong&gt;&apos;1970-01-01 00:00:00&apos;UTC 부터 &apos;2020-03-19 18:30:58&apos;UTC 까지의 초 수인 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mn&gt;584&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mn&gt;610&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mn&gt;258&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;1,584,610,258&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8388800000000001em;vertical-align:-0.19444em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 을 저장한다.&lt;/strong&gt; 이러한 저장방식은 아래의 특징들과 같은 표현 범위의 차이를 만든다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;유닉스 시간으로 저장되는 TIMESTAMP는 시작 시간인 &apos;1970-01-01 00:00:00&apos;UTC 에서부터만 표현이 가능하다.&lt;/strong&gt;&lt;br&gt;
   UNIX_TIMESTAMP() 함수를 통해 유닉스 시간으로 변환해볼 수 있는데, &apos;1970-01-01 00:00:00&apos;UTC 이전의 날짜를 변환하면 모두 0의 값을 가진다.   &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;&lt;span class=&quot;token comment&quot;&gt;// 0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; UNIX_TIMESTAMP&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;1970-01-01 00:00:00&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 comment&quot;&gt;// 1584610258&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; UNIX_TIMESTAMP&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2020-03-20 03:30:58&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 comment&quot;&gt;// 0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; UNIX_TIMESTAMP&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;1945-08-15 00:00:00&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;/br&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TIMESTAMP는 4바이트 정수라는 한계로 인해 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mn&gt;147&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mn&gt;483&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mn&gt;647&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mn&gt;31&lt;/mn&gt;&lt;/msup&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2,147,483,647(2^{31}- 1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.064108em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141079999999999em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 초까지만 표현이 가능하다.&lt;/strong&gt;  (이를 &apos;Y2K38&apos;, &lt;a href=&quot;https://ko.wikipedia.org/wiki/2038%EB%85%84_%EB%AC%B8%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;2038년 문제&lt;/a&gt;라고 한다.)&lt;br&gt;
   실제로 유닉스 시간을 지역 시간으로 변환하는 함수인 &lt;code class=&quot;language-text&quot;&gt;FROM_UNIXTIME()&lt;/code&gt;으로 계산을 해보면 &apos;2038-01-19 03:14:07&apos;UTC, 한국 시각으로는 &apos;2038-01-19 12:14:07&apos;까지만 표현이 가능한 것을 확인할 수 있다. 표현 범위의 한계를 넘어선 2,147,483,648초를 변환해보면 NULL이 반환된다.  &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;&lt;span class=&quot;token comment&quot;&gt;// &apos;2038-01-19 12:14:07&apos;, &apos;2038-01-19 03:14:07&apos;UTC&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; FROM_UNIXTIME&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2147483647&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d %h:%i:%s&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 comment&quot;&gt;// NULL&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; FROM_UNIXTIME&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2147483648&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%Y-%m-%d %h:%i:%s&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;/br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  DATETIME, TIMESTAMP의 표현 범위 차이를 정리하면,    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DATETIME은     [&apos;0000-01-01 00:00:00&apos;, &apos;9999-12-31 23:58:59&apos;]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TIMESTAMP는 [&apos;1970-01-01 00:00:00&apos;, &apos;2038-01-19 03:14:07&apos;]&lt;/strong&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  하지만 UTC 시간을 따르는 TIMESTAMP는 시간대에 따라, 명시한 오프셋에 따라 그 범위가 다르다.&lt;br&gt;
또한 날짜 및 시간 데이터를 저장할 때는 표현 범위 밖의 데이터는 저장되지 않는다. 아래의 예제로 확인해보자.&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;&lt;span class=&quot;token comment&quot;&gt;# Data truncation: Incorrect datetime value: &apos;1970-01-01 00:00:01&apos; for column&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;1970-01-01 00:00:00&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 comment&quot;&gt;# Data truncation: Incorrect datetime value: &apos;1970-01-01 09:00:00&apos; for column&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;1970-01-01 09:00:00&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 comment&quot;&gt;# OK! &apos;1970-01-01 09:00:01&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;1970-01-01 09:00:01&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 comment&quot;&gt;# OK! &apos;2020-03-20 11:30:58&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2038-01-19 12:14:08+01:00&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 comment&quot;&gt;# OK! &apos;2038-01-19 12:14:07&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2038-01-19 12:14:07&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 comment&quot;&gt;# Data truncation: Incorrect datetime value: &apos;2038-01-19 12:14:08&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;type_test&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mytimestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2038-01-19 12:14:08&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;p&gt;  예제와 같이 &lt;strong&gt;한국의 시간대를 사용하여 삽입할 때, 표현 범위는 지역의 오프셋을 고려한 범위인 [&apos;1970-01-01 09:00:01&apos;, &apos;2038-01-19 12:14:07&apos;]이 된다.&lt;/strong&gt; 또한 오프셋을 명시한 &apos;2038-01-19 12:14:08+01:00&apos;도 가능한데, 위의 설명과 동일하기 때문에 &apos;2020-03-20 11:30:58&apos;의 값을 가지는 이유에 대해서는 스스로 이해해보자.&lt;/p&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;h1 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;/h1&gt;
&lt;h2 id=&quot;datetime-vs-timestamp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#datetime-vs-timestamp&quot; aria-label=&quot;datetime vs timestamp 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;DATETIME vs TIMESTAMP&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  두 형식을 정리해보자면, &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;두 형식에 사용 가능한 문자열의 형식은 동일하며, 지역 지정자 &apos;Z&apos;가 추가된 문자열은 사용이 불가능하다.&lt;/li&gt;
&lt;li&gt;DATETIME은 &lt;strong&gt;UTC를 고려하지 않고 지역 시간으로 저장&lt;/strong&gt;한다.&lt;/li&gt;
&lt;li&gt;TIMESTAMP는 &lt;strong&gt;UTC를 반영하여 내부적으로 UTC 시간으로 저장해두고 조회 시에 지역 시간으로 변환한다.&lt;/strong&gt; 이를 통해 조회하는 지역마다 동일한 UTC 시간을 의미할 수 있도록 다르게 표현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class=&apos;small-text&apos;&gt;** 년도 정보를 저장하는 YEAR 형식도 존재한다. 자세히 다루지 않고 &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/year.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;링크&lt;/a&gt;로 대체한다.&lt;/span&gt;
&lt;/br&gt;&lt;/p&gt;
&lt;h2 id=&quot;iso-8601-형식에-맞는-저장-형식은&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#iso-8601-%ED%98%95%EC%8B%9D%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%A0%80%EC%9E%A5-%ED%98%95%EC%8B%9D%EC%9D%80&quot; aria-label=&quot;iso 8601 형식에 맞는 저장 형식은 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;ISO 8601 형식에 맞는 저장 형식은?&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;  지금까지 MySQL에서 날짜 및 시간 데이터를 저장하는 형식에 대해 알아보았다. ISO 8601 형식의 데이터를 어떤 형식으로 저장해야할까? 날짜 데이터를 저장하는 DATE, 시간 데이터를 저장하는 TIME 두 형식 모두 날짜와 시간 데이터의 부분적인 정보만을 담을 수 있기 때문에 DATETIME, TIMESTAMP가 ISO 8601 형식의 데이터를 저장하는 데 적합하다고 볼 수 있다. ISO 8601 형식의 두 가지 경우에 따라 적합한 저장 방식과 전략을 설정해야 한다.&lt;/p&gt;
&lt;h3 id=&quot;yyyy-mm-ddthhmmssz-형식의-utc-시간을-사용하는-경우&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#yyyy-mm-ddthhmmssz-%ED%98%95%EC%8B%9D%EC%9D%98-utc-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0&quot; aria-label=&quot;yyyy mm ddthhmmssz 형식의 utc 시간을 사용하는 경우 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;&apos;YYYY-MM-DDThh:mm:ssZ&apos; 형식의 UTC 시간을 사용하는 경우,&lt;/h3&gt;
&lt;p&gt;  먼저 지역 지정자 &apos;Z&apos;가 추가된 문자열은 사용이 불가능하므로 제거하는 전처리가 필요하다.   &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DATETIME 형식으로 저장하게 되면 UTC 시간을 고려하지 않기 때문에 UTC 시간의 의미를 그대로 저장할 수 있으므로 &lt;strong&gt;UTC 시간을 저장하길 원한다면 해당 형식을 사용하자.&lt;/strong&gt;&lt;br&gt;
&lt;/br&gt;  &lt;/li&gt;
&lt;li&gt;TIMESTAMP에 저장하게 되면 해당 시간이 UTC 시간임에도 불구하고 지역 시간대를 고려한 UTC 시간으로 변환하는 작업을 거친 뒤, 저장되게 된다.&lt;del&gt;(UTC 시간의 UTC 시간화..)&lt;/del&gt;&lt;br&gt;
   물론 삽입과 조회 시점의 시간대가 동일한 경우, 저장한 시간의 값은 동일할 수 있으나 UTC 시간의 의미가 사라지게 된다. 또한 시간대가 변경되면 해당 시간대의 오프셋으로 계산되기 때문에 값이 변경될 수 있다. 그러므로 &lt;strong&gt;TIMESTAMP를 사용하기 위해서는 &apos;+00:00&apos;으로 오프셋을 명시하여 UTC 시간으로 저장될 수 있도록 하자.&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;/br&gt;
&lt;h3 id=&quot;yyyy-mm-ddthhmmss-형식의-지역-시간을-사용하는-경우&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#yyyy-mm-ddthhmmss-%ED%98%95%EC%8B%9D%EC%9D%98-%EC%A7%80%EC%97%AD-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0&quot; aria-label=&quot;yyyy mm ddthhmmss 형식의 지역 시간을 사용하는 경우 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;&apos;YYYY-MM-DDThh:mm:ss&apos; 형식의 지역 시간을 사용하는 경우,&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;DATETIME 형식으로 저장하게 되면 UTC 시간을 고려하지 않기 때문에 지역 시간의 의미를 그대로 저장할 수 있으므로 &lt;strong&gt;지역 시간을 저장하길 원한다면 해당 형식을 사용하자.&lt;/strong&gt;&lt;br&gt;
&lt;/br&gt;  &lt;/li&gt;
&lt;li&gt;TIMESTAMP에 저장하게 되면 지역 시간대를 고려한 UTC 시간으로 변환하여 저장하기 때문에 조회하는 지역 시간대를 고려한 지역 시간대를 전달할 수 있다. &lt;strong&gt;하지만 저장하고자 하는 지역 시간의 시간대와 데이터베이스의 시간대가 동일해야 올바른 시간을 전달할 수 있을 것이다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;h2 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;/h2&gt;
&lt;hr&gt;
&lt;p&gt;각 형식별 문자열 형식 &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://dev.mysql.com/doc/date-and-time-literals.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;각 형식별 내부 저장 구조 &lt;a href=&quot;https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://dev.mysql.com/doc/date-and-time-data-type-representation.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JS에서 날짜 및 시간 문자열 다루기]]></title><description><![CDATA[날짜 관련 오류가 발생하면 그 때마다 원인을 이해하려고 하기보다 인터넷에서 코드를 긁어와 빠르게 해결하는 것에 집중했었다. 
하지만 이번 문제를 접하고, JS에서 날짜를 다루는 것에 대해 정리가 필요할 것 같아 포스팅하게 되었다.  문제   Safa…]]></description><link>https://chanuuuuu.github.io/date-01/</link><guid isPermaLink="false">https://chanuuuuu.github.io/date-01/</guid><pubDate>Fri, 02 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;  날짜 관련 오류가 발생하면 그 때마다 원인을 이해하려고 하기보다 인터넷에서 코드를 긁어와 빠르게 해결하는 것에 집중했었다.
하지만 이번 문제를 접하고, JS에서 날짜를 다루는 것에 대해 정리가 필요할 것 같아 포스팅하게 되었다. &lt;/p&gt;
&lt;h1 id=&quot;문제&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C&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;  Safari 환경에서 JS의 Date 객체를 사용하여 날짜를 보여주는 UI에서 &lt;em&gt;&apos;Invalid Date&apos;&lt;/em&gt; 를 뱉어냈다.&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: 249px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3acba4d0bfc03adb82407e5afe3b117b/6a5fb/invalid_date.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: 52.02702702702703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABuUlEQVQoz61RS6uBYRB+5ZY7ueQuuaQkCrmUhSVZiBJZuJSNjVxL+Q9W/opf4Sc4J2Jj4w8ozzkzwqlTZ3Xemu+d75mZ551nRuD7rNdrRKNR5HI5JJNJpNNpZLPZ161UKiGE4H+KZzIZvlOpFPL5POLxOIbDIVFB3G43jEYjLlCr1ZDJZOw/Ta/Xw2AwwGKxsG+32xmXy+WQSCSvPCLff3xCbLdbLBYLBlutFnq9Hmq1Gur1OmazGTqdDr9eKpW4qN1uo9/vYzwecyPVapVrQ6EQNpsNxOl0wmAwYDAcDsPtdnOQZJAcwkiqy+WCx+NhnIhjsRgSiQQCgQDX0mh2ux0E6Z5MJgw6HA5YrVZIpVKWRFK9Xi9sNhvHiDASiUChUHCeyWSCSqXi2mKx+JghfabTKYMkhyQ3m032V6sVut0uyyuXyy/JNAIax3w+R6PR+E34XIrT6eRXqSOfz8fd0BJIttls5q6CwSDLpM79fj/nUm2hUHgTLpdL3pjRaORNarVaaDQa3vrT1+l0HCOfjHAyqqERVCqVN+H1esXhcMD5fAYtiYz8n/YXfjwecblcHoT3+x3/dYjrC9tqr/XHitxLAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;invalid date&quot;
        title=&quot;invalid date&quot;
        src=&quot;/static/3acba4d0bfc03adb82407e5afe3b117b/6a5fb/invalid_date.png&quot;
        srcset=&quot;/static/3acba4d0bfc03adb82407e5afe3b117b/12f09/invalid_date.png 148w,
/static/3acba4d0bfc03adb82407e5afe3b117b/6a5fb/invalid_date.png 249w&quot;
        sizes=&quot;(max-width: 249px) 100vw, 249px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Safari에서 &apos;YYYY-MM-DD hh:mm:ss&apos; (예를 들면 &apos;2020-03-20 03:30:58&apos;) 형식의 문자열로 Date 객체를 선언하게 되는 경우 &lt;em&gt;&apos;Invalid Date&apos;&lt;/em&gt; 을 반환한다.&lt;/p&gt;
&lt;h3 id=&quot;js에서의-date-객체&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#js%EC%97%90%EC%84%9C%EC%9D%98-date-%EA%B0%9D%EC%B2%B4&quot; aria-label=&quot;js에서의 date 객체 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;JS에서의 Date 객체&lt;/h3&gt;
&lt;p&gt;  JS에서는 Date 객체를 사용하여 날짜를 표현한다. 현재 시각이 필요한 경우, &lt;code class=&quot;language-text&quot;&gt;new Date().now()&lt;/code&gt; 를 통해 알아내기도 하고, 서버에서 전달받은 날짜 문자열을 &lt;code class=&quot;language-text&quot;&gt;new Date(dateString)&lt;/code&gt;으로 Date 객체를 만들어 시간/일자 연산(예를 들면, 호텔 체크아웃 날짜 계산)을 하는 등 문자열을 통해 날짜와 시간을 표현해야하는 경우에 쉽게 사용할 수 있다. 하지만 예상한 시간과 다르게 반환되거나 위의 경우처럼 아예 &lt;code class=&quot;language-text&quot;&gt;NaN&lt;/code&gt; 이 뜨는 등 갖가지 오류를 접하기도 하는데, 실제로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/Date&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Mozlia web docs&lt;/a&gt;를 보면 날짜 문자열 파싱 문제를 미리 경고해두었다.&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;&lt;em&gt;&apos;Date 생성자(및 동일한 동작의 Date.parse())를 사용한 날짜 파싱은 동작이 일관적이지 못하고 브라우저끼리 차이가 존재하므로 사용하지 않는 것이 좋습니다.&apos;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  실제로 그런지 각 브라우저간의 차이를 확인하기 위해 Safari, Chrome, IE, Edge를 준비하고 각 브라우저의 콘솔창을 통해 결과값을 확인해보았다. &lt;del&gt;(Firefox, Opera 등 다른 웹 브라우저는 과제로 남겨두겠다.)&lt;/del&gt; 테스트에 사용된 날짜 문자열  &apos;2020-03-20 03:30:58&apos;은 실제로 사용하고 있는 &apos;YYYY-MM-DD hh:mm:ss&apos; 형식의 dummy data이다.&lt;/p&gt;
&lt;h3 id=&quot;브라우저별-date-객체-선언-테스트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EB%B3%84-date-%EA%B0%9D%EC%B2%B4-%EC%84%A0%EC%96%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8&quot; aria-label=&quot;브라우저별 date 객체 선언 테스트 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;브라우저별 Date 객체 선언 테스트&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 테스트 코드&lt;/strong&gt;&lt;br&gt;
  &lt;code class=&quot;language-text&quot;&gt;new Date(&amp;#39;2020-03-20 03:30:58&amp;#39;)&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-테스트-결과&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B2%B0%EA%B3%BC&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;/h4&gt;
&lt;ul&gt;
&lt;li&gt;safari - 버전 14.0.3(16610.4.3.1.7)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 350px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5d734e99474715fc4e60aadfe1da81eb/13ae7/safari_test1.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: 14.864864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsSAAALEgHS3X78AAAAj0lEQVQI123OzQ6CMBBFYd7/FU2U8teK2FJQFHHmOBujJi6+3N3JLdqqJl6V4wx+gjZDXGB3Mr3iolKdBWfqJJS2+0EIWdiegqog8lGE1jOkmTpEk6h8ovEDLkzEy5PztJJvynxXJtu8KKNZVrWAWvBX4bvAmCzmSnzXEHyLKw/0oUO2B/flCvbin/er7+ALI9fnQKeY0UgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;safari test1&quot;
        title=&quot;safari test1&quot;
        src=&quot;/static/5d734e99474715fc4e60aadfe1da81eb/13ae7/safari_test1.png&quot;
        srcset=&quot;/static/5d734e99474715fc4e60aadfe1da81eb/12f09/safari_test1.png 148w,
/static/5d734e99474715fc4e60aadfe1da81eb/e4a3f/safari_test1.png 295w,
/static/5d734e99474715fc4e60aadfe1da81eb/13ae7/safari_test1.png 350w&quot;
        sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;chrome - 버전 91.0.4472.114(공식 빌드) (arm64)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 380px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9eaa16a54f577e574ad01ec58efb11e2/3f520/chrome_test1.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: 10.81081081081081%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsSAAALEgHS3X78AAAAdElEQVQI13WMQQ7CIBQFe/8DqjEW+LS0UDHBWE0BZTTd+5JZzeR19fMm314844rznkdKZCtsYih+pgRPmRzbOJDdSF5X/q21RldrJYaInwNiB3xY0ErTny8MYjHKYI3sqF5xOJ4Y3bS35ueX5YrSQkr3/fQLKv+W4/7RqgwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chrome test1&quot;
        title=&quot;chrome test1&quot;
        src=&quot;/static/9eaa16a54f577e574ad01ec58efb11e2/3f520/chrome_test1.png&quot;
        srcset=&quot;/static/9eaa16a54f577e574ad01ec58efb11e2/12f09/chrome_test1.png 148w,
/static/9eaa16a54f577e574ad01ec58efb11e2/e4a3f/chrome_test1.png 295w,
/static/9eaa16a54f577e574ad01ec58efb11e2/3f520/chrome_test1.png 380w&quot;
        sizes=&quot;(max-width: 380px) 100vw, 380px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;edge - 버전 91.0.864.59 (공식 빌드) (64비트)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 380px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/672f29bdf187b9cebf9cc8836043a9f2/3f520/edge_test1.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: 10.81081081081081%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsSAAALEgHS3X78AAAAdElEQVQI12XK0QqDIBhA4d7/CYMIY6lp6bT2D9ySTrXbHfjuTrPXnZK/SCqMUyavgvUrbt4ITyGmN3N4/fhlo5QPd8dx/Llraq2kmAhLxPmZECJaGx6jxjmPMZbJOYydsJdhGK4n0HUdbdter0YpRd/3iAgnb3qXbnCzn90AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;edge test1&quot;
        title=&quot;edge test1&quot;
        src=&quot;/static/672f29bdf187b9cebf9cc8836043a9f2/3f520/edge_test1.png&quot;
        srcset=&quot;/static/672f29bdf187b9cebf9cc8836043a9f2/12f09/edge_test1.png 148w,
/static/672f29bdf187b9cebf9cc8836043a9f2/e4a3f/edge_test1.png 295w,
/static/672f29bdf187b9cebf9cc8836043a9f2/3f520/edge_test1.png 380w&quot;
        sizes=&quot;(max-width: 380px) 100vw, 380px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;IE - 버전 2004(OS 빌드 19041.985)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 380px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/efa6e163289a4162e077c45b952f52bf/3f520/IE_test1.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: 12.837837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsSAAALEgHS3X78AAAAr0lEQVQI122O0W6CMABF+f9/m1YYbYXSUmxEqSjMzM1Fe0b2sCdvcpN77tPJQgCtYb9PdF1CrKEx0LqEc2BtwrcPjEnUNYRd4n5PvMrz+SBr3Mi7jHThg8ZdKNWEriLGnlF6WP4rh+EH62bkwq2fiOPMeJkY4sgxnv77+fVNVi5661wQ+p7Gt6hKU2r1t0WRY73nervhOs9qI9CL5q4/UsgteamQlUFua95EwXCe+QVqld2tk9sV7QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IE test1&quot;
        title=&quot;IE test1&quot;
        src=&quot;/static/efa6e163289a4162e077c45b952f52bf/3f520/IE_test1.png&quot;
        srcset=&quot;/static/efa6e163289a4162e077c45b952f52bf/12f09/IE_test1.png 148w,
/static/efa6e163289a4162e077c45b952f52bf/e4a3f/IE_test1.png 295w,
/static/efa6e163289a4162e077c45b952f52bf/3f520/IE_test1.png 380w&quot;
        sizes=&quot;(max-width: 380px) 100vw, 380px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  동일한 날짜 문자열의 Date 객체를 선언하였음에도 그 결과가 브라우저마다 다른 것을 볼 수 있다. &lt;span class=&apos;sub-text&apos;&gt; (**브라우저의 실행 지역, 버전에 따라 결과가 다를 수 있습니다.)&lt;/span&gt; 이 테스트를 통해 JS가 수행되는 환경에 따라 Date 객체를 통한 파싱의 결과가 다를 수 있다는 것을 알 수 있었다. 그럼에도 불구하고 서버 측에서 날짜 및 시간에 대한 데이터를 문자열 형태로 전달하기 때문에 브라우저상에서 Date 객체를 통해 날짜를 파싱하는 것이 불가피하였다. 그래서 각기 다른 브라우저에서 동일한 파싱 결과를 보여줄 수 있는 다른 방법을 찾아보았다.&lt;/p&gt;
&lt;h1 id=&quot;원인&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9B%90%EC%9D%B8&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;  하지만 실제 문제의 원인은 날짜 및 시간 데이터의 전달을 위해 내부적으로 사용하던 &apos;YYYY-MM-DD hh:mm:ss&apos; 형식이 날짜 및 시간 문자열 표준 형식인 ISO 8601을 따르지 않은 것이다. 이로 인해 특정 브라우저에서 날짜에 대한 데이터로 인식되지 못하는 문제가 발생했다. 문제를 해결하기 위해서는 날짜 및 시간 문자열의 표준 형식인 ISO 8601의 개념이 필요하기에 나름대로 요약해보았다. 내가 필요한 부분만 가져왔기 때문에 깊게 알고 싶은 분들은 출처를 참조하자.&lt;/p&gt;
&lt;h3 id=&quot;iso-8601&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#iso-8601&quot; aria-label=&quot;iso 8601 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;ISO 8601&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;ISO 8601은 날짜와 시간과 관련된 데이터 교환을 다루는 국제 표준이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;날짜표현은  &lt;code class=&quot;language-text&quot;&gt;YYYY-MM-DD&lt;/code&gt; , 시간 표현은 &lt;code class=&quot;language-text&quot;&gt;hh:mm:ss.sss&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;hh:mm:ss&lt;/code&gt; 으로 표현되며 구분자는 생략이 가능하다.&lt;/li&gt;
&lt;li&gt;날짜와 시간 혼합표현은 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;date&amp;gt;T&amp;lt;time&amp;gt;&lt;/code&gt;이다.&lt;/li&gt;
&lt;li&gt;날짜와 시간은 0을 붙여 고정 자릿수를 유지한다.&lt;/li&gt;
&lt;li&gt;시간이 UTC인 경우, 시간 뒤에 빈칸없이 Z를 직접 추가해야 한다. Z는 오프셋이 0인 UTC를 위한 지역 지정자(zone designator)다.  &lt;code class=&quot;language-text&quot;&gt;&amp;lt;date&amp;gt;T&amp;lt;time&amp;gt;Z&lt;/code&gt; 가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&apos;인터넷 상에서, World Wide Web Consortium (W3C)는 에러율과 소프트웨어 복잡도를 줄이기 위해 제공된 날짜와 시간 형식을 제한하는 표준 프로파일을 정의하기 위해 ISO 8601를 사용한다.&apos;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  날짜 및 시간 문자열 형식을 표준에 맞추기 위해서는 &apos;YYYY-MM-DD hh:mm:ss&apos;가 아닌 &apos;YY-MM-DDThh:mm:ssZ&apos; 의 형식을 사용해야 한다. 단순히&lt;del&gt;(무지성으로)&lt;/del&gt; 날짜와 시간 사이에 &apos;T&apos;를 넣고 맨 마지막에 &apos;Z&apos;가 붙여 표준 형식을 맞추려고 했다면 전혀 다른 날짜 및 시간 정보를 보게 될 것이다. 브라우저가 ISO 8601 문자열로 Date 객체를 생성할 때, &lt;strong&gt;&apos;Z&apos; 문자를 통해 해당 문자열이 표현하는 시간을 오프셋이 0인 UTC 시간으로 인식하기&lt;/strong&gt; 때문이다. 대신, 맨 뒤의 &lt;strong&gt;&apos;Z&apos; 문자를 빼게 되면 해당 문자열이 표현하는 시간을 UTC 시간이 아닌 지역 시간으로 인식하게&lt;/strong&gt; 된다. 갑자기 등장하는 &apos;UTC&apos;, &apos;오프셋&apos;, &apos;지역 시간&apos;의 개념이 생소할 수 있다. 아래에서 간단히 설명하는데 혹시 자세히 알고 싶다면 &lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%98%91%EC%A0%95_%EC%84%B8%EA%B3%84%EC%8B%9C&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;위키&lt;/a&gt;를 참조하자.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UTC&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GMT(그리니치 평균 시간)로도 불리며, 그리니치 천문대의 시간을 기준으로한 국제 표준시이다.
&lt;br/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;오프셋&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;그리니치 천문대의 시간을 기준으로 한 GMT와 지역별의 시간차이를 의미한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;small-text&quot;&gt; 한국은 +9으로, 즉 그리니치 천문대의 시간보다 9시간이 빠르다.&lt;/span&gt;&lt;br&gt;
&lt;br/&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;지역 시간&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GMT를 기준으로 해당 지역의 오프셋, 썸머 타임등을 반영한 시간이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;small-text&quot;&gt; 현재 이 글에서는 서비스 사용자의 브라우저가 실행되는 지역의 시간을 의미한다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;small-text&quot;&gt;  **쉬운 설명을 위해 오프셋에 썸머타임 등, 지역시간에 영향을 주는 변수를 모두 포함하겠다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;글만으로는 이해하기 어려울 것 같아 각 브라우저, 문자열 형식별 비교를 위해 3개의 코드를 각 브라우저에서 실행시켜보았다. 결과를 보면서 이해해보자.&lt;/p&gt;
&lt;h3 id=&quot;브라우저형식별-date-객체-선언-테스트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%ED%98%95%EC%8B%9D%EB%B3%84-date-%EA%B0%9D%EC%B2%B4-%EC%84%A0%EC%96%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8&quot; aria-label=&quot;브라우저형식별 date 객체 선언 테스트 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;브라우저/형식별 Date 객체 선언 테스트&lt;/h3&gt;
&lt;h4 id=&quot;1-테스트-코드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C&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;/h4&gt;
&lt;p&gt;1-1. 이전 테스트&lt;br&gt;
   &lt;code class=&quot;language-text&quot;&gt;new Date(&amp;#39;2020-03-20 03:30:58&amp;#39;)&lt;/code&gt;  &lt;/p&gt;
&lt;p&gt;1-2. 단순히 형식을 맞추기 위한 &apos;T&apos;, &apos;Z&apos; 문자 추가&lt;br&gt;
   &lt;code class=&quot;language-text&quot;&gt;new Date(&amp;#39;2020-03-20T03:30:58Z&amp;#39;)&lt;/code&gt;  &lt;/p&gt;
&lt;p&gt;1-3. 지역 시간으로 전달하기 위해 &apos;Z&apos; 제거&lt;br&gt;
   &lt;code class=&quot;language-text&quot;&gt;new Date(&amp;#39;2020-03-20T03:30:58&amp;#39;)&lt;/code&gt;  &lt;/p&gt;
&lt;h4 id=&quot;2-테스트-결과-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B2%B0%EA%B3%BC-1&quot; aria-label=&quot;2 테스트 결과 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;2. 테스트 결과&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;safari - 버전 14.0.3(16610.4.3.1.7)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 330px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/27a70bb8428abacd4c6d61f250d2d2a2/d9ecf/safari_test2.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: 39.189189189189186%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABaklEQVQoz22R227iMBRF+f+fm1FHbaCQkIsdkzshSQOJ7TUHmKnm0oelc6wtbXnZm8tlQPegL3DsoJogbOHt5Ikaz1E4VE6mYy9zWzjq0eGdw33BZpomtKlIlUHJzE8lcaaZrivDdGW+WRbrua2e6y+s83j/NY/CsmqltMQUtewNKi+l0DJ83JgXx3jjs2xenuXudwn8XXgZBtTZP5VFtRxhX8OrsYSiGIvqNyV7Lcql5UWvZJ3lulhRtKzr+r9yU50wOsWomKowJNE74e4VnUZyzokPAVkSooRoH/Dj5Tvb7ZYkSYiiiHmeHyzLwmYcR8qLoxy83NTRTJ60e36GOoPpPbvSoSW7mySSnT/cpyL/Kg+irOuRtBxIioGiHdmrlm1SE+mWtOgJkoaj6Qh1xy6tyOSN27al73uapnlo37HWPpW7tqYwObnOaOoKlSXE0UE0Y0yuSOOIXKWP/L4HwRthGJLn+YM/lX8Cv4RhGBkc04cAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;safari test2&quot;
        title=&quot;safari test2&quot;
        src=&quot;/static/27a70bb8428abacd4c6d61f250d2d2a2/d9ecf/safari_test2.png&quot;
        srcset=&quot;/static/27a70bb8428abacd4c6d61f250d2d2a2/12f09/safari_test2.png 148w,
/static/27a70bb8428abacd4c6d61f250d2d2a2/e4a3f/safari_test2.png 295w,
/static/27a70bb8428abacd4c6d61f250d2d2a2/d9ecf/safari_test2.png 330w&quot;
        sizes=&quot;(max-width: 330px) 100vw, 330px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;chrome - 버전 91.0.4472.114(공식 빌드) (arm64)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 364px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1950bf9ba20c631566ceb3008a3f089d/e45a9/chrome_test2.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: 30.405405405405407%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABDklEQVQY03XQ646CMBAFYN//BTcLcmuBVlsF2QIF0eNpyZr1x5JMMkMn069zWJYFs3awykK0LUZjMKYJpqrEXMs92ibWTgp49j+fT9zvGx6PxzvCvxCHMHC4DdD6BGMvMIaDK4G2aaEYtZBQrYq1ZJ7lBa5dh6IUsOw/s7/h+bZtCN9h8RSedqHkgaPwh0JXlhjrOuYjlU5UcHkG1/fYKFrXNSr3uH8Kb/0AReGZw6KwrKA53JxNVAXph/AahNU/wmUXXvQFUimM1mLMjpgE98WdumOKqakxSyop9X7fYRjwN95C7z062/H2BjVv0kojS1KIoozSIsshudNQ58y/vpO46yTNcOILwssqyn+FLz51xTrONp2pAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chrome test2&quot;
        title=&quot;chrome test2&quot;
        src=&quot;/static/1950bf9ba20c631566ceb3008a3f089d/e45a9/chrome_test2.png&quot;
        srcset=&quot;/static/1950bf9ba20c631566ceb3008a3f089d/12f09/chrome_test2.png 148w,
/static/1950bf9ba20c631566ceb3008a3f089d/e4a3f/chrome_test2.png 295w,
/static/1950bf9ba20c631566ceb3008a3f089d/e45a9/chrome_test2.png 364w&quot;
        sizes=&quot;(max-width: 364px) 100vw, 364px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;edge - 버전 91.0.864.59 (공식 빌드) (64비트)&lt;br&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 372px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7e8091687ee0d8bb3759fe7befbd7feb/98b6e/edge_test2.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: 32.43243243243243%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABE0lEQVQY002Qi6rDIBBE8/8fWCiEUnKTGHV9paZ5tZ27qxS6IDurOJzZ5jgO7PFAdE+MJiHNC0adYF2GCwt8fIJ8LrOPGb/1+XzK+Z2bfd+RQgJZgjEWRIR+GKCmCVprTKWbovu+hxrHcne5XHC/36GUwvV6Lf+kmp0J17DBU2aygBAfGJTHZCJTzUUbStA8y92yPPF+v3GeZ+nf83q9KqFEnuMMR/zROpDzTKhgqWqlNJMTJqbs/iq50LRti67r+M3gdrshhFAJxXCdNwT3gLYBnuMPyrE5E1KsmnudA9Z1xbZtyDmX/tWyukp4Hnjw0p2VSA7es8lomEhMObomNvIc2bG2iDEipVT2KXuVWXYqplL/3tjIWhOsR4QAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;edge test2&quot;
        title=&quot;edge test2&quot;
        src=&quot;/static/7e8091687ee0d8bb3759fe7befbd7feb/98b6e/edge_test2.png&quot;
        srcset=&quot;/static/7e8091687ee0d8bb3759fe7befbd7feb/12f09/edge_test2.png 148w,
/static/7e8091687ee0d8bb3759fe7befbd7feb/e4a3f/edge_test2.png 295w,
/static/7e8091687ee0d8bb3759fe7befbd7feb/98b6e/edge_test2.png 372w&quot;
        sizes=&quot;(max-width: 372px) 100vw, 372px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;IE - 버전 2004(OS 빌드 19041.985)
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 564px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/785fa2ed66eaa23d8e55307a6d764166/ba4d9/IE_test2.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: 20.945945945945947%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsSAAALEgHS3X78AAAAz0lEQVQY04WO226DMBBE+f+/q6q0JURquRNs7ATHYAPidOGhr304mpmVdmcT7zfqOnC/R8oy0rYzfb/SdYtoYFkCIQRijOz7/i/J67WSXhV5bskyIyiKwstxx+2m0dpgjBEdWNf1jxgXKVvOooPDb9tGEsJG2ziU8vLl8Z2X5YhWk2THPM9M04RzI+PziRtH8Q5rDQ9rGYbhLLTivfck2ky8vTd8XXsuH1roSLOHoPlMW3qtabqeomoo64aqbs+cF5XMar7zgp+iJC8r7mrgF+pwL4tgko7RAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IE test2&quot;
        title=&quot;IE test2&quot;
        src=&quot;/static/785fa2ed66eaa23d8e55307a6d764166/ba4d9/IE_test2.png&quot;
        srcset=&quot;/static/785fa2ed66eaa23d8e55307a6d764166/12f09/IE_test2.png 148w,
/static/785fa2ed66eaa23d8e55307a6d764166/e4a3f/IE_test2.png 295w,
/static/785fa2ed66eaa23d8e55307a6d764166/ba4d9/IE_test2.png 564w&quot;
        sizes=&quot;(max-width: 564px) 100vw, 564px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  &lt;code class=&quot;language-text&quot;&gt;new Date(&amp;#39;2020-03-20T03:30:58Z&amp;#39;)&lt;/code&gt;의 결과를 살펴보면 한국의 시간 오프셋은 +9이기 때문에 &apos;T&apos;, &apos;Z&apos; 문자가 추가된 Date 객체의 시간은 03시가 아닌 9시간이 더해진 12시가 된다. 하지만 &apos;T&apos; 문자만 추가한 &lt;code class=&quot;language-text&quot;&gt;new Date(&amp;#39;2020-03-20T03:30:58&amp;#39;)&lt;/code&gt;의 결과에서는 오프셋을 계산할 지역 정보가 존재하지 않기 때문에 지역 시간으로 간주하여 시간이 03시 그대로인 것을 볼 수 있다.&lt;/p&gt;
&lt;h1 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;/h1&gt;
&lt;p&gt;  이번 문제는 날짜 및 시간의 문자열을 표준 형식으로 맞추는 것으로 문제를 해결할 수 있다. 해결하는 방법은 기준 시간대를 UTC 시간으로 할 것인가, 지역 시간으로 할 것인가에 따라 두 가지로 나뉜다. 이해를 돕기 위해 글의 작성시점인 한국 시각 &apos;2021-06-30 13:49:30&apos;를 예로 들어 설명하고자 한다.&lt;/p&gt;
&lt;h3 id=&quot;1-utc-시간을-기준으로-포맷팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-utc-%EC%8B%9C%EA%B0%84%EC%9D%84-%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C-%ED%8F%AC%EB%A7%B7%ED%8C%85&quot; aria-label=&quot;1 utc 시간을 기준으로 포맷팅 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. UTC 시간을 기준으로 포맷팅&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&apos;기존의 시간에서 지역의 시간 오프셋을 반대로 연산하여 UTC 시간으로 바꿔 전달하여 브라우저가 사용자의 지역시간에 맞게 변경할 수 있도록 한다.&apos;&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;   UTC 시간을 기준으로 전달하기 위해 &apos;2021-06-30 13:49:30&apos;을 한국의 오프셋인 &apos;+9&apos;를 고려하여 9시간을 뺀 &apos;2021-06-30T04:49:30&apos;UTC 로 미리 계산, 포맷팅하여 데이터 베이스나 서버의 내부 데이터로 사용하는 방법이다. &lt;strong&gt;브라우저는 &apos;2021-06-30T04:49:30Z&apos;의 문자열로 Date 객체를 생성할 때 해당 시간을 UTC 시간으로 인식하고 브라우저가 실행되는 지역에 맞게 지역 시간으로 변경한다.&lt;/strong&gt; 한국의 브라우저에서는 9시간이 더해진 &apos;2021-06-30 13:49:30&apos;으로 표현될 것이고, 오프셋이 &apos;+1&apos;인 프랑스의 브라우저에서는 &apos;2021-06-30 05:49:30&apos;으로 표현될 것이다. 이를 통해 지역별 시간대 변환 문제를 해결할 수 있다. 하지만 &lt;strong&gt;지역 시간으로 변경하는 연산을 브라우저에게 의존해야 하기 때문에&lt;/strong&gt; 예기치 않은 문제가 발생할 수 있다는 단점이 있다.&lt;span class=&apos;sub-text&apos;&gt;(브라우저 종류, 버전에 따라 달라질 수 있다고 한다.)&lt;/span&gt; 또한 국내 시간대만 사용하는 서비스의 경우, 지역 오프셋을 미리 계산하는 포맷팅 과정이 불필요할 수 있다.&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id=&quot;2-지역-시간을-기준으로-포맷팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%EC%A7%80%EC%97%AD-%EC%8B%9C%EA%B0%84%EC%9D%84-%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C-%ED%8F%AC%EB%A7%B7%ED%8C%85&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;/h3&gt;
&lt;p&gt;&lt;strong&gt;&apos;지역 시간을 기준으로 전달하기 위해 &apos;2021-06-30 13:49:30&apos;을 &apos;2021-06-30T13:49:30&apos;로 변환하여 데이터 베이스나 서버의 내부 데이터로 사용하는 방법이다.&apos;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;   지역 시간을 기준으로 전달하기 위해 &apos;2021-06-30 13:49:30&apos;을 &apos;2021-06-30T13:49:30&apos;로 변환하여 데이터 베이스나 서버의 내부 데이터로 사용하는 방법이다. 위의 방법과 달리 &lt;strong&gt;브라우저는 &apos;2021-06-30T13:49:30&apos;의 문자열로 Date 객체를 생성할 때 해당 문자열을 지역 시간으로 인식하고 그대로 &apos;2021-06-30 13:49:30&apos;을 표현한다.&lt;/strong&gt; 국내 시간대만 사용하는 서비스의 경우에는 지역 시간만 사용해도 되기 때문에 바로 적용 가능한 방법이다. &lt;strong&gt;하지만 동일 시간대를 사용하지 않는 다른 지역에서의 접속 시 문제가 발생한다. 해당 지역의 오프셋을 고려하지 않기 때문에 프랑스의 브라우저에서도 동일하게 &apos;2021-06-30 13:49:30&apos;으로 표현된다.&lt;/strong&gt; 같은 시간이 &lt;em&gt;&quot;표시됐으니 된 거 아냐?&quot;&lt;/em&gt; 할 수 있지만, 전혀 다른 의미를 가진다. 프랑스 브라우저의 시간을 한국 시각으로 계산해보면,   &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class=&apos;small-text&apos;&gt;&apos;2021-06-30 13:49:30&apos;을 UTC 시간으로 변경하면 -1 시간을 한 &apos;2021-06-30 11:49:30&apos;이 된다. &lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span class=&apos;small-text&apos;&gt; &apos;2021-06-30 11:49:30&apos;을 한국 시간으로 변경하면 +9 시간을 한 &apos;2021-06-30 20:49:30&apos;이 된다.&lt;/span&gt;   &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;프랑스의 브라우저가 나타내는 시간은 전혀 다른 &apos;2021-06-30 20:49:30&apos;을 의미하고 있는 것이다! 한국의 브라우저에서는 내가 점심을 먹고 글을 작성하였다면, 프랑스의 브라우저에서는 저녁을 먹고 글을 작성한 것이 된다. 이처럼 여러 시간대의 글로벌한 서비스를 위해서는 단순히 지역 시간으로 제공하는 것이 아닌   &apos;2021-06-30T13:49:30+9&apos;,  &apos;2021-06-30T13:49:30+1&apos;과 같이 문자열 끝에 해당 지역의 오프셋을 명시하는 방법을 사용해야 한다. 사실 Date 객체의 &lt;code class=&quot;language-text&quot;&gt;toLocaleString()&lt;/code&gt; 함수를 사용하여 지역 시간대로 변경할 수 있다고 하지만 이 글에서는 문자열에만 집중해보았다.&lt;/p&gt;
&lt;br/&gt;
&lt;h3 id=&quot;3-날짜-관련-라이브러리-사용&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%EB%82%A0%EC%A7%9C-%EA%B4%80%EB%A0%A8-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9&quot; aria-label=&quot;3 날짜 관련 라이브러리 사용 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. 날짜 관련 라이브러리 사용&lt;/h3&gt;
&lt;p&gt;  위의 두 가지의 해결 방식은 라이브러리의 사용을 고려하지 않았다. 하지만 라이브러리는 문자열의 형식이나 오프셋 계산등 걱정하지 않고 사용할 수 있도록 많은 기능이 제공된다. 사실상 지금까지의 모든 고민을 해결할 수 있으니 나처럼 고민하지 말고 그냥 사용하자. 추천하는 라이브러리는 &lt;em&gt;day.js&lt;/em&gt; 인데 대문부터 크기를 강조하는 것을 보면 다른 날짜 라이브러리보다 가벼운 것은 확실해 보인다. (가벼운 게 최고다.) 함수명이 매우 직관적이라 쉽게 사용할 수 있기 때문에 설명하지 않고 예제와 &lt;a href=&quot;https://day.js.org/docs/en/installation/installation&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;docs&lt;/a&gt; 링크를 남긴다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 대충 한국 시간대를 사용하겠다는 코드&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dayjs
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; LocalizedFormat &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dayjs/plugin/localizedFormat&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; relativeTime &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dayjs/plugin/relativeTime&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dayjs/locale/ko&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

dayjs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;LocalizedFormat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
dayjs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;relativeTime&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;dayjs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;date&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;toISOstring&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;br/&gt;
&lt;h1 id=&quot;요약&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%94%EC%95%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;ul&gt;
&lt;li&gt;Date 객체를 사용하여 날짜 및 시간 문자열을 파싱하기 위해서는 표준인 ISO 8601을 따르자. 그래야 브라우저별로 다르게 동작하는 것을 &lt;del&gt;(거의 다)&lt;/del&gt; 막을 수 있다.  &lt;/li&gt;
&lt;li&gt;시간대별로 브라우저의 동작이 다를 수 있으니 서비스에 따라 &apos;UTC 시간&apos;, &apos;지역 시간&apos; 또는 &apos;오프셋을 명시한 지역시간&apos; 중 적절한 형식을 사용하자.  &lt;/li&gt;
&lt;li&gt;그냥 날짜 관련 라이브러리를 사용하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;다음 포스팅에서는 Node.js(NestJS) - MySQL 데이터 베이스에서 날짜 및 시간 문자열을 다루는 것을 정리해보려고 한다. MySQL에서 날짜 및 시간 문자열을 다루는 형식은 또 다르다. 다음 글은 좀 짧으니 시간이 남는다면 읽어보자.&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;p&gt;시간 및 날짜 문자열에 대한 정리 &lt;a href=&quot;https://meetup.toast.com/posts/130&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://meetup.toast.com/posts/130&lt;/a&gt;&lt;br&gt;
ISO 8601에 대한 정의 &lt;a href=&quot;https://ko.wikipedia.org/wiki/ISO_8601&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://ko.wikipedia.org/wiki/ISO_8601&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;</content:encoded></item></channel></rss>