<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>계발하는 개발자</title>
    <link>https://ziszini.tistory.com/</link>
    <description>공부한 것을 기록하고,
잊을까봐 기록합니다 </description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 22:41:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev_genie</managingEditor>
    <image>
      <title>계발하는 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/5807526/attach/ed196106141a4bd5a22596a90283d03e</url>
      <link>https://ziszini.tistory.com</link>
    </image>
    <item>
      <title>[JS] 구조 분해 할당 | 객체, 배열 구조 분해</title>
      <link>https://ziszini.tistory.com/197</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오픈소스를 보다보면 구조 분해 할당된 코드를 심심치 않게 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 경우 평소에 잘 써보지 않은 문법이라 이번에 맘 먹고 정리해보기로 했다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;구조분해할당(Destructuring assignment)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; 구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;개발을 하다 보면 객체나 배열에 저장된 일부 데이터에 접근해야 하는 경우가 생기기 마련이다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이럴 때 객체나 배열을 변수로 '분해'할 수 있게 해주는 특별한 문법인 구조 분해 할당을 사용할 수 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;1. 객체 분해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;객체 분해의 경우 아래처럼 내가 원하는 특정 값을 변수에 담을 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;기본 변수 할당&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; 객체 구조분해 변수에 값을 할당하는 기본 방법은 다음과 같다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701445571822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = {
    id: 1,
    name: 'ppororo',
    age: 3,
    habit: 'cook',
};

const { id, habit } = obj;

console.log(id) // 1
console.log(habit) // 'cook'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;선언에서 분리한 할당&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;변수 선언과 할당을 분리하여 객체 구조분해 할당을 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701447253503&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var { a, b } = { a:1, b:2 };

console.log(a); // 1
console.log(b); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;새로운 변수 이름에 할당&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다음과 같이 새로운 변수 이름에 값을 할당받을 수도 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701447472857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = { p: 30, q: true };
var { p: foo, q: bar } = a;

console.log(foo); // 30
console.log(bar); // true&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;중첩된 객체와 배열 구조분해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다음의 복잡한 객체, 배열의 구조에도 구조 분해하여 값을 참조할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701447994192&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var helloWorld = {
  title: 'shepherd',
  detail: [
    {
      language: 'ko',
      place: [],
      last_edit: '2014-04-14T08:43:37',
      url: '../data/utils/happyHouse',
      title: 'cute dog',
    },
  ],
  url: '../docs/desc/pat',
};

var {
  title: Mydog,
  detail: [{ title: mvTitle }],
} = helloWorld;
console.log(Mydog); // &quot;shepherd&quot;
console.log(mvTitle); // &quot;cute dog&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;매개변수에서 구조분해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;많이 보이는 유형이다. 구조분해한 값을 매개변수로 참조할 수도 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701448493096&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var movie = {
  rank: 3,
  title: 'lalaland',
  cast: { miya: 'emma', sebastian: 'lion' },
};

function awards({ rank }) {
  return rank;
}

console.log(awards(movie)); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;2. 배열 분해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;할당하고자 하는 변수의 개수가 분해하고자 하는 배열의 길이보다 크더라도 에러가 발생하지 않는다. 할당할 값이 없으면 undefined로 취급된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;객체 분해와 다르게 배열 분해의 경우는 내가 필요로 하는 값만 특정해서 꺼낼 수는 없다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;기본 변수 할당&lt;/span&gt;&lt;/b&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;배열 구조분해 변수에 값을 할당하는 기본 방법은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701443242653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = [1, 'abc', 3];
const [ar1, ar2, ar3] = arr;

console.log(ar1) // 1
console.log(ar2) // 'abc'
console.log(ar3) // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;선언에서 분리한 할당&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;변수 선언과 할당을 분리하여 배열 구조분해 할당을 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701445063779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a, b;

[a, b] = [1, 2];
console.log(a) // 1
console.log(b) // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;기본값 설정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; 배열 구조분해는 기본값 설정이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701446304228&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a, b;

[a = 2, b = 10] = [7];
console.log(a) // 7 (배열에서 받아온 값)
console.log(b) // 10 (기본값)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;a에는 7이 할당되었고, b에는 값이 할당되지 않았기 때문에 기본값인 10이 할당되었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;값 교환&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;두 개의 값 교환을 배열 구조분해를 사용하면 한 줄로 표현이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701446524201&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var [a, b] = [10, 7];

[a, b] = [b, a];
console.log(a); // 7
console.log(b); // 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;함수의 반환된 배열&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;함수에서 반환된 배열로도 구조분해 할당이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701446581104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function foo() {
  return [3, 4];
}

var [a, b] = foo();
console.log(a); // 3
console.log(b); // 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;값 무시하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;배열에서 필요하지 않은 값을 변수에 할당해야 하는 경우에 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701446749517&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function foo() {
  return [3, 4, 5];
}
var [a, , b] = foo();
console.log(a); // 3
console.log(b); // 5

[a, , b] = [4, 5, 6];
console.log(a); // 4
console.log(b); // 6

// 또는 아래같이 모든 값을 무시하는 것도 가능
[,,] = [1, 2, 3, 4, 5];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;전개 연산자를 이용한 저장&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;...(전개 연산자)를 이용해 나머지 배열을 변수에 할당이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701446864345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var [a, ...b] = [1, 2, 3];

console.log(a); // 1
console.log(b); // [2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;* 이해에 도움이 됐던 자료 참고 :&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.javascript.info/destructuring-assignment&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/destructuring-assignment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/fKjJIzvBJcg&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/fKjJIzvBJcg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Language/Javascript</category>
      <category>js구조분해할당</category>
      <category>객체구조분해</category>
      <category>구조분해할당</category>
      <category>배열구조분해</category>
      <category>비구조화 할당</category>
      <category>자바스크립트 구조분해할당</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/197</guid>
      <comments>https://ziszini.tistory.com/197#entry197comment</comments>
      <pubDate>Sat, 2 Dec 2023 01:36:37 +0900</pubDate>
    </item>
    <item>
      <title>[React 에러] 폰트어썸 regular 아이콘 사용시 에러 해결 | 'IconDefinition' 형식은 'IconProp' 형식에 할당할 수 없습니다.</title>
      <link>https://ziszini.tistory.com/196</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://github.com/FortAwesome/react-fontawesome/issues/366&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/FortAwesome/react-fontawesome/issues/366&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;에러&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;폰트어썸 regular 아이콘을 사용하려고 했을 때 아래같은 에러가 발생했다.&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;icon-erro2.png&quot; data-origin-width=&quot;1451&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KhtqD/btsBcZZwSsp/Jewn2QhahtrjDDnMYMeGqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KhtqD/btsBcZZwSsp/Jewn2QhahtrjDDnMYMeGqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KhtqD/btsBcZZwSsp/Jewn2QhahtrjDDnMYMeGqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKhtqD%2FbtsBcZZwSsp%2FJewn2QhahtrjDDnMYMeGqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1451&quot; height=&quot;799&quot; data-filename=&quot;icon-erro2.png&quot; data-origin-width=&quot;1451&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 스택오버플로우를 쭉 살펴보니까 패키지 버전 호환으로 인한 에러라고들 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이러한 버전 호환성 에러는 fontawesome-svg-core&lt;span style=&quot;text-align: left;&quot;&gt; 패키지가 Font Awesome의 다른 패키지와 버전 호환성이 없을 경우 발생할 수 있는데 난 애초에 svg-core 패키지를 설치하지 않아서 그런듯..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;fortawesome/fontawesome-svg-core 패키지를 추가로 설치해줬고, 에러가 사라졌다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701407860142&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// before
&quot;@fortawesome/free-regular-svg-icons&quot;: &quot;^6.5.1&quot;,
&quot;@fortawesome/free-solid-svg-icons&quot;: &quot;^6.5.0&quot;,
&quot;@fortawesome/react-fontawesome&quot;: &quot;^0.2.0&quot;,

// after
&quot;@fortawesome/fontawesome-svg-core&quot;: &quot;^6.5.1&quot;,
&quot;@fortawesome/free-regular-svg-icons&quot;: &quot;^6.5.1&quot;,
&quot;@fortawesome/free-solid-svg-icons&quot;: &quot;^6.5.0&quot;,
&quot;@fortawesome/react-fontawesome&quot;: &quot;^0.2.0&quot;,&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리액트에서 폰트어썸을 사용하려면 아래 3가지 유형의 패키지들을 설치해줘야 한다는 걸 알게 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #374151; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@fortawesome/fontawesome-svg-core: 아이콘 사용시 필요한 핵심 도구와 기능을 제공하는 패키지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@fortawesome/free-solid-svg-icons, @fortawesome/free-regular-svg-icons, 등: 각각의 아이콘 패키지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@fortawesome/react-fontawesome: React에서 아이콘을 사용할 수 있게 해주는 패키지&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>❗️Error</category>
      <category>'IconDefinition' 형식은 'IconProp' 형식에 할당할 수 없습니다.</category>
      <category>Type 'IconDefinition' is not assignable to type 'IconProp'</category>
      <category>리액트 폰트어썸</category>
      <category>리액트 폰트어썸 에러</category>
      <category>폰트어썸 regular 아이콘</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/196</guid>
      <comments>https://ziszini.tistory.com/196#entry196comment</comments>
      <pubDate>Fri, 1 Dec 2023 14:34:35 +0900</pubDate>
    </item>
    <item>
      <title>[React] 리액트에서 폰트어썸 아이콘 사용하는 방법</title>
      <link>https://ziszini.tistory.com/195</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리액트에서 오랜만에 폰트어썸 아이콘을 사용하려고하니 공식문서를 보면서도 조금 헤맸다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 따로 정리하는 포스팅..!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다운로드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1701335241784&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스크립트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1701335027046&quot; class=&quot;clean&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1701335173428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;FontAwesomeIcon icon={faChevronLeft}/&amp;gt;
&amp;lt;FontAwesomeIcon icon={faChevronRight}/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용하려는 아이콘을 선택해서 React 탭 &amp;gt; 아이콘 이름 부분을 파스칼케이스 방식으로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 가팅 icon 속성에 적어주면 해당 아이콘이 삽입되게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MGftf/btsBfe8U23r/olu8Dy190bNi7FbfqkjJ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MGftf/btsBfe8U23r/olu8Dy190bNi7FbfqkjJ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MGftf/btsBfe8U23r/olu8Dy190bNi7FbfqkjJ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMGftf%2FbtsBfe8U23r%2Folu8Dy190bNi7FbfqkjJ70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;438&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체코드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1701334548890&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';
import &quot;./Header.css&quot;;

const Header = () =&amp;gt; {
    return (
        &amp;lt;header&amp;gt;
            &amp;lt;div className=&quot;header-container&quot;&amp;gt;
                &amp;lt;div className=&quot;header_focus-date&quot;&amp;gt;
                    &amp;lt;FontAwesomeIcon icon={faChevronLeft}/&amp;gt;
                    &amp;lt;div className=&quot;header_focus-month&quot;&amp;gt;월&amp;lt;/div&amp;gt;
                    &amp;lt;div className=&quot;header_focus-year&quot;&amp;gt;&amp;lt;/div&amp;gt;
                    &amp;lt;FontAwesomeIcon icon={faChevronRight}/&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/header&amp;gt;
    );
};

export default Header;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 이제 아래처럼 아이콘이 브라우저에 나타난다!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1557&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQq4h/btsBbKVi7ef/kVGIEjiuA8RVJznO13r9hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQq4h/btsBbKVi7ef/kVGIEjiuA8RVJznO13r9hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQq4h/btsBbKVi7ef/kVGIEjiuA8RVJznO13r9hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQq4h%2FbtsBbKVi7ef%2FkVGIEjiuA8RVJznO13r9hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1557&quot; height=&quot;579&quot; data-origin-width=&quot;1557&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Frontend/React</category>
      <category>fontawesome</category>
      <category>react fontawesome</category>
      <category>react 아이콘 삽입</category>
      <category>react 아이콘 컴포넌트</category>
      <category>react 외부 라이브러리</category>
      <category>리액트 폰트어썸</category>
      <category>리액트에서 폰트어썸 사용</category>
      <category>폰트어썸</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/195</guid>
      <comments>https://ziszini.tistory.com/195#entry195comment</comments>
      <pubDate>Thu, 30 Nov 2023 18:13:51 +0900</pubDate>
    </item>
    <item>
      <title>[React 에러] fontawesome 버전 충돌로 설치 안되는 에러 해결</title>
      <link>https://ziszini.tistory.com/194</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;에러&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;react 에서 폰트어썸 아이콘을 사용하려고 패키지 설치하려고 했을 때 아래같은 에러가 떴다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DaMIF/btsBfenEQ4d/n6JR831i9DZ36avDt4lK4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DaMIF/btsBfenEQ4d/n6JR831i9DZ36avDt4lK4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DaMIF/btsBfenEQ4d/n6JR831i9DZ36avDt4lK4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDaMIF%2FbtsBfenEQ4d%2Fn6JR831i9DZ36avDt4lK4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;380&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1701332442524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;c:\Users\LG\Desktop\my_project\cashbook\frontend&amp;gt;npm i --save @fortawesome/react-fontawesome@latest
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: react-scripts@5.0.1
npm ERR! Found: typescript@5.3.2
npm ERR! node_modules/typescript
npm ERR!   peer typescript@&quot;&amp;gt;= 2.7&quot; from fork-ts-checker-webpack-plugin@6.5.3
npm ERR!   node_modules/fork-ts-checker-webpack-plugin       
npm ERR!     fork-ts-checker-webpack-plugin@&quot;^6.5.0&quot; from react-dev-utils@12.0.1
npm ERR!     node_modules/react-dev-utils
npm ERR!       react-dev-utils@&quot;^12.0.1&quot; from react-scripts@5.0.1
npm ERR!       node_modules/react-scripts
npm ERR!         react-scripts@&quot;5.0.1&quot; from the root project 
npm ERR!   peer typescript@&quot;&amp;gt;=2.8.0 || &amp;gt;= 3.2.0-dev || &amp;gt;= 3.3.0-dev || &amp;gt;= 3.4.0-dev || &amp;gt;= 3.5.0-dev || &amp;gt;= 3.6.0-dev || &amp;gt;= 3.6.0-beta || &amp;gt;= 3.7.0-dev || &amp;gt;= 3.7.0-beta&quot; from tsutils@3.21.0
npm ERR!   node_modules/tsutils
npm ERR!     tsutils@&quot;^3.21.0&quot; from @typescript-eslint/eslint-plugin@5.62.0
npm ERR!     node_modules/@typescript-eslint/eslint-plugin   
npm ERR!       @typescript-eslint/eslint-plugin@&quot;^5.5.0&quot; from
 eslint-config-react-app@7.0.1
npm ERR!       node_modules/eslint-config-react-app
npm ERR!         eslint-config-react-app@&quot;^7.0.1&quot; from react-scripts@5.0.1
npm ERR!         node_modules/react-scripts
npm ERR!       1 more (eslint-plugin-jest)
npm ERR!     tsutils@&quot;^3.21.0&quot; from @typescript-eslint/type-utils@5.62.0
npm ERR!     node_modules/@typescript-eslint/type-utils      
npm ERR!       @typescript-eslint/type-utils@&quot;5.62.0&quot; from @typescript-eslint/eslint-plugin@5.62.0
npm ERR!       node_modules/@typescript-eslint/eslint-plugin 
npm ERR!         @typescript-eslint/eslint-plugin@&quot;^5.5.0&quot; from eslint-config-react-app@7.0.1
npm ERR!         node_modules/eslint-config-react-app        
npm ERR!         1 more (eslint-plugin-jest)
npm ERR!     1 more (@typescript-eslint/typescript-estree)   
npm ERR!   1 more (the root project)
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peerOptional typescript@&quot;^3.2.1 || ^4&quot; from react-scripts@5.0.1
npm ERR! node_modules/react-scripts
npm ERR!   react-scripts@&quot;5.0.1&quot; from the root project       
npm ERR!
npm ERR! Conflicting peer dependency: typescript@4.9.5       
npm ERR! node_modules/typescript
npm ERR!   peerOptional typescript@&quot;^3.2.1 || ^4&quot; from react-scripts@5.0.1
npm ERR!   node_modules/react-scripts
npm ERR!     react-scripts@&quot;5.0.1&quot; from the root project     
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry      
npm ERR! this command with --force or --legacy-peer-deps     
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR!
npm ERR! For a full report see:
npm ERR! C:\Users\LG\AppData\Local\npm-cache\_logs\2023-11-30T07_58_08_395Z-eresolve-report.txt

npm ERR! A complete log of this run can be found in: C:\Users\LG\AppData\Local\npm-cache\_logs\2023-11-30T07_58_08_395Z-debug-0.log&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 길어서 무슨 에러인지 한 번에 파악은 안됐는데, 마지막 줄의 다음 이미지 부분을 보고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;typescript랑 react-scripts 종속성 간의 버전 충돌로 인한 에러라는 걸 알았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에러메시지를 자세히 보면 권고사항도 나와있는데, react-scripts 패키지가 최소한 &quot;^3.2.1 || ^4&quot; 버전의 TypeScript를 필요로 하는데, 현재 설치된 &lt;span style=&quot;text-align: start;&quot;&gt;TypeScript 버전이 달라서 에러가 발생한다는 내용이 있었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;(=&amp;gt; 즉 호환되는 typescript 버전으로 변경하라는 소리)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzabvQ/btsBfg6Gldo/tuGgCpSc5lsgNQidmMnKG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzabvQ/btsBfg6Gldo/tuGgCpSc5lsgNQidmMnKG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzabvQ/btsBfg6Gldo/tuGgCpSc5lsgNQidmMnKG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzabvQ%2FbtsBfg6Gldo%2FtuGgCpSc5lsgNQidmMnKG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;350&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. react-scripts 버전 업데이트 또는 typescript 버전 변경&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1701333233822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install react-scripts@latest
// or
npm install typescript@^4 // 또는 3.2.1 버전&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. --force 또는 --legacy-peer-deps 플래그 사용하여 설치&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1701332595963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i --save @fortawesome/react-fontawesome@latest --legacy-peer-deps
// or
npm i --save @fortawesome/react-fontawesome@latest --force&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이중 에러메시지에서 제안해준 해결 방법인 --legacy-peer-deps 플래그를 추가해서 패키지를 다시 설치해줬고, 성공적으로 패키지 설치가 되는 것을 확인할 수 있었다 :)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZliEv/btsA7ZMk3JJ/ZnlSn6Hi8GKTKMxmbXiZh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZliEv/btsA7ZMk3JJ/ZnlSn6Hi8GKTKMxmbXiZh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZliEv/btsA7ZMk3JJ/ZnlSn6Hi8GKTKMxmbXiZh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZliEv%2FbtsA7ZMk3JJ%2FZnlSn6Hi8GKTKMxmbXiZh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1428&quot; height=&quot;418&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>❗️Error</category>
      <category>fontawesome 버전 충돌</category>
      <category>fontawesome 설치 안될때</category>
      <category>fontawesome 설치 에러</category>
      <category>fontawesome 설치안됨</category>
      <category>fontawesome 패키지 설치</category>
      <category>버전충돌에러</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/194</guid>
      <comments>https://ziszini.tistory.com/194#entry194comment</comments>
      <pubDate>Thu, 30 Nov 2023 17:51:25 +0900</pubDate>
    </item>
    <item>
      <title>[React 에러] Cannot&amp;nbsp;find&amp;nbsp;module&amp;nbsp;'react-dom/client 에러 해결</title>
      <link>https://ziszini.tistory.com/193</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;에러&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;React v18 환경에서 v17으로 다운그레이드 하고나니까 아래 같은 에러가 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[에러 코드]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Cannot find module 'react-dom/client'&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;index.js 파일에서 react-dom/client 모듈을 찾을 수 없어서 발생한 문제다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;react-dom/client는 v18에서 새로 추가된 모듈이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;React v18 부터는 이 모듈을 이용해 DOM을 렌더링한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반면 React v18 이전 버전은 다른 모듈(react-dom)을 사용하여 렌더링한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 이걸 회귀시켜주면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 이전 방식의 react-dom을 사용하여 DOM을 렌더링 해주면 된다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1. ReactDOM을 react-dom 에서 import 해준다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701319909013&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// import ReactDOM from 'react-dom/client'; // react v18 버전용
import ReactDOM from 'react-dom';  // react v17 버전용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;2. DOM 렌더링 코드를 수정해준다.&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701320006579&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react v 18 버전 용
// const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
// root.render(&amp;lt;App /&amp;gt;);

// react v 17 버전용
ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
        &amp;lt;App /&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById('root')
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이와 같은 문제를 피하기 위해선&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버전별 업데이트된 사항을 잘 숙지하고, 공식문서를 평소 탐독하는 것이 중요할 것 같다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>❗️Error</category>
      <category>Cannot&amp;nbsp;find&amp;nbsp;module&amp;nbsp;'react-dom/client</category>
      <category>react 17버전</category>
      <category>react 18버전</category>
      <category>react v17</category>
      <category>react v18</category>
      <category>react 버전 차이</category>
      <category>react-dom</category>
      <category>react-dom/client</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/193</guid>
      <comments>https://ziszini.tistory.com/193#entry193comment</comments>
      <pubDate>Thu, 30 Nov 2023 13:56:15 +0900</pubDate>
    </item>
    <item>
      <title>[JS/라이브러리] chart.js - 차트 라이브러리 사용법</title>
      <link>https://ziszini.tistory.com/192</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;chart.js란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;canvas를 이용하여 다양한 종류의 차트를 생성할 수 있는 데이터 시각화 &lt;b&gt;라이브러리&lt;/b&gt;다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 라이브러리를 사용하면 쉽고 간단하게 데이터 기반의 반응형 차트를 생성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701250529457&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Getting Started | Chart.js&quot; data-og-description=&quot;Getting Started Let's get started with Chart.js! Alternatively, see the example below or check samples. Create a Chart In this example, we create a bar chart for a single dataset and render it on an HTML page. Add this code snippet to your page: You should&quot; data-og-host=&quot;www.chartjs.org&quot; data-og-source-url=&quot;https://www.chartjs.org/docs/latest/getting-started/&quot; data-og-url=&quot;https://www.chartjs.org/docs/latest/getting-started/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DWtnK/hyUCbNt09M/j6nBwzh2m9K1u11uw2csl1/img.png?width=1646&amp;amp;height=838&amp;amp;face=0_0_1646_838&quot;&gt;&lt;a href=&quot;https://www.chartjs.org/docs/latest/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.chartjs.org/docs/latest/getting-started/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DWtnK/hyUCbNt09M/j6nBwzh2m9K1u11uw2csl1/img.png?width=1646&amp;amp;height=838&amp;amp;face=0_0_1646_838');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started | Chart.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started Let's get started with Chart.js! Alternatively, see the example below or check samples. Create a Chart In this example, we create a bar chart for a single dataset and render it on an HTML page. Add this code snippet to your page: You should&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.chartjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1701250973149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// cdn
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/chart.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

// npm
npm install chart.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 기본 구성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1701251092839&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
    &amp;lt;!-- 차트 표시할 엘리먼트 --&amp;gt;
    &amp;lt;div class=&quot;container text-center&quot;&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;col-md-12&quot;&amp;gt;
                &amp;lt;canvas id=&quot;chart-container&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        const chartEl = document.getElementById('chart-container').getContext('2d');
        const barChart = new Chart(chartEl, {
            type: 'line',
            data: {
                labels: ['1월', '2월', '3월', '4월'],
                datasets: [{
                    label: '월별 매출액',
                    borderWidth: 3,
                    data: [
                        30000000,
                        80000000,
                        120000000,
                        300000000
                    ]
                }]
            },
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 설정 옵션&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type: 차트의 유형&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;datasets: &lt;span style=&quot;text-align: start;&quot;&gt;차트에 표시되는 데이터 정의&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;label: 데이터셋의 레이블&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;data: 차트에 표시할 실제 데이터값&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;labels: &lt;span style=&quot;text-align: start;&quot;&gt;차트의 각 데이터 포인트에 대한 레이블&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이외에도 범례 설정을 위한 legend 등 다양한 옵션들이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;차트 종류로는 아래같은 'bar', 'doughnut', 'line', 'radar', 'pie', 'polarArea', 'bubble' 등이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type에 단어를 넣어주면 원하는 차트 유형으로 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;① type: 'bar' - 막대 차트&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/to4Yj/btsBbNjnND2/LRXTwsenOzbjRM3QZMzh5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/to4Yj/btsBbNjnND2/LRXTwsenOzbjRM3QZMzh5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/to4Yj/btsBbNjnND2/LRXTwsenOzbjRM3QZMzh5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fto4Yj%2FbtsBbNjnND2%2FLRXTwsenOzbjRM3QZMzh5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;278&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;②&amp;nbsp;type: 'doughnut' - 도넛 차트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSvB7y/btsA3Sz0Dw4/Hu45d3NTpnszTNtPQicCTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSvB7y/btsA3Sz0Dw4/Hu45d3NTpnszTNtPQicCTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSvB7y/btsA3Sz0Dw4/Hu45d3NTpnszTNtPQicCTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSvB7y%2FbtsA3Sz0Dw4%2FHu45d3NTpnszTNtPQicCTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;467&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;③&amp;nbsp;type: 'line' - 선형 차트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QkaAE/btsA7wpqspF/9RVh4s0w1PfSlLMdWVndP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QkaAE/btsA7wpqspF/9RVh4s0w1PfSlLMdWVndP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QkaAE/btsA7wpqspF/9RVh4s0w1PfSlLMdWVndP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQkaAE%2FbtsA7wpqspF%2F9RVh4s0w1PfSlLMdWVndP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;317&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;④&amp;nbsp;type: 'radar' - 레이더 차트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceTHql/btsA4PC6PuR/LNGthDOiZXCL64MCSiD911/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceTHql/btsA4PC6PuR/LNGthDOiZXCL64MCSiD911/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceTHql/btsA4PC6PuR/LNGthDOiZXCL64MCSiD911/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceTHql%2FbtsA4PC6PuR%2FLNGthDOiZXCL64MCSiD911%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;531&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;⑤&amp;nbsp;type: 'pie' - 파이 차트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rjaqb/btsBc0Cwijy/DVkle2CKAcrEk2GkcLVcv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rjaqb/btsBc0Cwijy/DVkle2CKAcrEk2GkcLVcv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rjaqb/btsBc0Cwijy/DVkle2CKAcrEk2GkcLVcv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frjaqb%2FbtsBc0Cwijy%2FDVkle2CKAcrEk2GkcLVcv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;482&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;⑥&amp;nbsp;type: ' &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;polarArea&lt;/span&gt; ' - 원형 영역 차트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yiBg7/btsA5fnWuqO/giT2Q1rZUrd3otGFMkKBRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiBg7/btsA5fnWuqO/giT2Q1rZUrd3otGFMkKBRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiBg7/btsA5fnWuqO/giT2Q1rZUrd3otGFMkKBRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiBg7%2FbtsA5fnWuqO%2FgiT2Q1rZUrd3otGFMkKBRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;531&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;⑦&amp;nbsp;type: '&lt;span&gt; bubble&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;' - 버블 차트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byRiIC/btsBbJVziTg/R4Vvtp5kooYfH7mZKROSEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byRiIC/btsBbJVziTg/R4Vvtp5kooYfH7mZKROSEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byRiIC/btsBbJVziTg/R4Vvtp5kooYfH7mZKROSEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyRiIC%2FbtsBbJVziTg%2FR4Vvtp5kooYfH7mZKROSEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;293&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이외 추가적으로 기존 차트에 데이터 레이블을 추가하려면 아래의 datalabels 라는 플러그인을 추가로 설치해줘야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLdixI/btsBaYZX3hY/mdEWcI8U3DE0IkAuN5oSwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLdixI/btsBaYZX3hY/mdEWcI8U3DE0IkAuN5oSwK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLdixI/btsBaYZX3hY/mdEWcI8U3DE0IkAuN5oSwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLdixI%2FbtsBaYZX3hY%2FmdEWcI8U3DE0IkAuN5oSwK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;256&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1701311775910&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Getting Started | chartjs-plugin-datalabels&quot; data-og-description=&quot;Getting Started Installation npm (opens new window) (opens new window) CDN (opens new window) (opens new window) By default, https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels returns the latest (minified) version, however it's highly recommended (open&quot; data-og-host=&quot;chartjs-plugin-datalabels.netlify.app&quot; data-og-source-url=&quot;https://chartjs-plugin-datalabels.netlify.app/guide/getting-started.html#installation&quot; data-og-url=&quot;https://chartjs-plugin-datalabels.netlify.app/guide/getting-started.html#installation&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://chartjs-plugin-datalabels.netlify.app/guide/getting-started.html#installation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chartjs-plugin-datalabels.netlify.app/guide/getting-started.html#installation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started | chartjs-plugin-datalabels&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started Installation npm (opens new window) (opens new window) CDN (opens new window) (opens new window) By default, https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels returns the latest (minified) version, however it's highly recommended (open&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chartjs-plugin-datalabels.netlify.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Language/Javascript</category>
      <category>canvas 라이브러리</category>
      <category>Chart.js</category>
      <category>데이터시각화</category>
      <category>데이터시각화 라이브러리</category>
      <category>차트 라이브러리</category>
      <category>차트js</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/192</guid>
      <comments>https://ziszini.tistory.com/192#entry192comment</comments>
      <pubDate>Wed, 29 Nov 2023 19:30:57 +0900</pubDate>
    </item>
    <item>
      <title>[Vue3 에러] Component name should always be multi-word 에러 해결</title>
      <link>https://ziszini.tistory.com/191</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://eslint.vuejs.org/rules/multi-word-component-names.html#vue-multi-word-component-names&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eslint.vuejs.org/rules/multi-word-component-names.html#vue-multi-word-component-names&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;에러&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통 컴포넌트 파일 이름을 지을 때 xxComp.vue 라고 하는 편인데&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번엔 'Comp' 는 빼고 그냥 xx.vue 형식으로 파일 이름을 지었더니 아래같은 에러가 발생했다.&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vOSuQ/btsA8pDqAOO/MqxOrfvFJKAp6TICARU2p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vOSuQ/btsA8pDqAOO/MqxOrfvFJKAp6TICARU2p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vOSuQ/btsA8pDqAOO/MqxOrfvFJKAp6TICARU2p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvOSuQ%2FbtsA8pDqAOO%2FMqxOrfvFJKAp6TICARU2p0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;140&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 이름은 항상 여러 단어로 이루어져있어야 된다는 뜻의 에러인데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜 Vue 컴포넌트의 이름은 항상 여러 단어여야 하는걸까?&amp;nbsp;궁금해서 찾아보았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://eslint.vuejs.org/rules/multi-word-component-names.html#vue-multi-word-component-names&quot;&gt;eslint-plugin-vue 공식문서&lt;/a&gt;&lt;/b&gt;에서 vue/multi-word-component-names 규칙에 관해 찾아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단일 단어로 구성된 HTML 엘리먼트와의 충돌을 방지하기 위해&lt;/b&gt;&amp;nbsp;vue에서 제공하는 빌트인 컴포넌트를 제외한 컴포넌트의 이름은 항상 여러 단어로 구성되어야 한다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;아래처럼 다중 단어로 이뤄진 이름을 사용하면 에러가 깔끔하게 해결된다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;vue/multi-word-component-names 규칙을 꺼두는 것으로도 해결할 수 있었겠지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가급적이면 규칙을 따르고자 그냥 이름을 바꿔줬다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dX13vH/btsA6URxr4V/QeVFXJYaNHVxreTBVC0FQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dX13vH/btsA6URxr4V/QeVFXJYaNHVxreTBVC0FQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dX13vH/btsA6URxr4V/QeVFXJYaNHVxreTBVC0FQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdX13vH%2FbtsA6URxr4V%2FQeVFXJYaNHVxreTBVC0FQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;433&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>❗️Error</category>
      <category>Component name should always be multi-word</category>
      <category>vue.js에러</category>
      <category>Vue3에러</category>
      <category>파일명 다중언어</category>
      <category>파일명 다중키워드</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/191</guid>
      <comments>https://ziszini.tistory.com/191#entry191comment</comments>
      <pubDate>Wed, 29 Nov 2023 16:39:47 +0900</pubDate>
    </item>
    <item>
      <title>웹 접근성과 시맨틱 마크업 | 검색엔진(SEO) 최적화</title>
      <link>https://ziszini.tistory.com/190</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시맨틱 마크업(Semantic Markup)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시맨틱(Semantic)&lt;/b&gt; 이란 &quot;의미론적인&quot;의 뜻을 가지며, &lt;b&gt;마크업(Markup)&lt;/b&gt;이란 HTML 태그로 문서를 작성하는 것을 말한다. 따라서 &lt;b&gt;시맨틱 마크업&lt;/b&gt;이란, 의미를 잘 전달하도록 문서를 작성하는 것을 말한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시맨틱 마크업은 다음과 같이 표현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JCvh6/btsA2tzVpdY/L2BP6iw0Yr2UEDK2DMP9KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JCvh6/btsA2tzVpdY/L2BP6iw0Yr2UEDK2DMP9KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JCvh6/btsA2tzVpdY/L2BP6iw0Yr2UEDK2DMP9KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJCvh6%2FbtsA2tzVpdY%2FL2BP6iw0Yr2UEDK2DMP9KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;562&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;작성 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 시맨틱 마크업을 하기 위해선 각 태그를 그 용도에 맞게 사용하여야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를들어 다음과 같이.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 헤더/푸터에 &lt;b&gt;&amp;lt;header&amp;gt;&lt;/b&gt;와 &lt;b&gt;&amp;lt;footer&amp;gt;&lt;/b&gt; 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 메인 컨텐츠에 &lt;b&gt;&amp;lt;main&amp;gt;&lt;/b&gt;과&lt;b&gt; &amp;lt;section&amp;gt;&lt;/b&gt; 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 독립적인 컨텐츠에 &lt;b&gt;&amp;lt;article&amp;gt;&lt;/b&gt; 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 최상위 제목으로 &lt;b&gt;&amp;lt;h1&amp;gt;&lt;/b&gt; 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 순서가 없는 목록으로 &lt;b&gt;&amp;lt;ul&amp;gt;&lt;/b&gt;과 &lt;b&gt;&amp;lt;li&amp;gt;&lt;/b&gt; 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 네비게이션에 &lt;b&gt;&amp;lt;nav&amp;gt;&lt;/b&gt; 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 식의 태그가 가지고 있는 의미에 맞게 사용하는 것을 말하는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 점 외에도 CSS 스타일을 명시하는 태그를 사용하지 않는 것 또한 시맨틱 마크업의 한 종류라 할 수 있다. &lt;b&gt;즉, 태그가 가지는 의미 자체가 스타일이라면 이는 마크업 자체가 스타일을 갖는 것이기 때문에 시맨틱 마크업에 적합하지 않다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, 동일한 효과를 부여하는 &amp;lt;strong&amp;gt;과 &amp;lt;b&amp;gt; 태그가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;둘은 동일하게 글자색을 진하게 하는 기능을 하지만 &lt;b&gt;&amp;lt;b&amp;gt;&lt;/b&gt; 태그의 경우는 그 자체가 &quot;bold&quot;의 약어이기 때문에 태그 자체가 스타일을 가진다고 할 수 있다. 하지만 &lt;b&gt;&amp;lt;strong&amp;gt;&lt;/b&gt;의 경우에는 &quot;그 안의 내용이 다른 내용보다 더 강조되어야 한다&quot;라는 의미를 가지기 때문에 시맨틱 마크업에 더 적합하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검색엔진이 시맨틱 태그를 중요한 키워드로 간주하기 때문에, 검색엔진 최적화(SEO)에 유리하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 접근성 측면에서, 시각장애가 있는 사용자가 스크린리더를 통해 의미를 더 잘 파악할 수 있다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스크린리더가 strong 태그를 만나면 조금 더 강하게 말해준다. 예를 들어 p태그 안에 &quot;볼드체&quot; 라는 텍스트가 있다고 해보자.&amp;nbsp; p태그의 font-weight 안의 text는 그냥 일반적인 톤으로 &quot;볼드체&quot;라고 읽는다면, strong 태그 안의 text는 강조된 톤으로 &quot; &lt;b&gt;p태그안의↗ strong태그↗ 입니다↗&quot; &lt;/b&gt;로 읽는다. 그러면 시각장애인은 해당 음성만 듣고도 페이지에서 중요한 부분이 어디에 있는지를 인식할 수 있게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순히 div, span으로 둘러싸인 요소들보다 코드의 가독성이 좋다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시맨틱 마크업 HTML&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. &amp;lt;title&amp;gt;과 &amp;lt;h&amp;gt;태그&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &amp;lt;head&amp;gt;에 위치한 title과 h태그(제목태그)는 현재 페이지의 주제를 알려줄 수 있는 태그이기 때문에 각 페이지마다 신경써서 작성해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 회사명이나 사이트명 등 해당 페이지의 주제를 효과적으로 전달할 수 있는 제목을 title태그에 정확하게 작성해야 하며 각 페이지별로 다르게 작성하는 것이 좋다. 타이틀의 경우 &amp;lsquo;제목 없음&amp;rsquo;이나 &amp;lsquo;새 페이지&amp;rsquo;와 같은 의미없는 타이틀을 넣지 않도록 하며, 불필요한 키워드나 너무 긴 텍스트를 사용하지 않는 것이 좋다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;&amp;lt;h&amp;gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;제목 태그의 경우 중요한 텍스트를 강조하거나 콘텐츠의 계층 구조를 만들어 사용자가 문서를 더 쉽게 탐색할 수 있도로 한다. 너무 긴 제목과 한페이지내에 과도한 사용을 지양해야 한다. 따라서 꼭 필요한 경우에만 사용하고 단순히 디자인적으로 강조가 필요할때는 제목태그 대신 &amp;lt;em&amp;gt;이나 &amp;lt;strong&amp;gt;같은 태그를 사용하는 것이 좋다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 메타 설명 태그 &amp;lt;meta name=&amp;ldquo;description&amp;rdquo; content=&amp;ldquo;페이지 설명&amp;rdquo;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;메타 설명태그는 &amp;lt;head&amp;gt;에 위치하는 태그로 검색엔진에 페이지의 내용을 요약하여 제공하며 길이 제한은 없지만 한두 문장 또는 짧은 단락 정도로 작성한다. 메타 설명태그는 구글Google 검색 결과에서 페이지의 스니펫으로 사용할 수 있기 때문에 이 태그를 잘 작성하면 구글봇뿐만 아니라 사용자가 해당 페이지의 내용을 이해하는데 도움이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erW0HD/btsA4QOOycZ/LaIVvKVmi5diHXTBf2xkIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erW0HD/btsA4QOOycZ/LaIVvKVmi5diHXTBf2xkIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erW0HD/btsA4QOOycZ/LaIVvKVmi5diHXTBf2xkIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerW0HD%2FbtsA4QOOycZ%2FLaIVvKVmi5diHXTBf2xkIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;288&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;위 이미지에서 vibe 라는 타이틀 아래 짧은 한줄의 스니펫이 들어가있는 걸 볼 수 있는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;vibe 사이트 개발자모드를 확인하면 바로 아래같이 메타 설명태그에 작성한 내용이 스니펫으로 들어가있다는 걸 확인할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIgfYJ/btsA6S6DXUu/5XaXknt8DypKusXKKS05Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIgfYJ/btsA6S6DXUu/5XaXknt8DypKusXKKS05Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIgfYJ/btsA6S6DXUu/5XaXknt8DypKusXKKS05Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIgfYJ%2FbtsA6S6DXUu%2F5XaXknt8DypKusXKKS05Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;493&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 시각자료는 텍스트로 설명한다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 컴퓨터는 이미지나 영상같은 시각자료에 대한 정보를 텍스트로 알 수 있기때문에 이에 대한 설명을 반드시 추가해줘야 한다. 이미지의 경우 대체텍스트 alt를 단순히 파일 제목으로 하기보다는 간단하게라도 이미지에 대해 설명하는 글을 넣어주는 것이 좋다. 이는 시각장애인들이 사용하는 스크린 리더기가 이미지를 읽는 방법이기도 하고 이미지에 링크를 사용할 경우 앵커텍스트로써의 역할도 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;4. &lt;/span&gt;페이지, 콘텐츠별 고유한 URL&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 이해하기 쉬운 url을 통해 구글봇과 사용자에게 콘텐츠의 내용을 전달할 수 있다. 여러개의 하위 카테고리나 메뉴가 있을 경우 디렉토리 구조를 최대한 단순하게 만들고 의미없는 id나 암호화된 문자보다는 홈페이지(메인페이지)를 기반으로 탐색경로나 카테고리가 반영된 url을 사용하는 것이 좋다. 아래 LG전자의 경우 url만 봐도 사용자가 현재 어떤 카테고리에서 어떤 상품을 보고 있는지 알 수 있기때문에 사이트를 탐색하기 편리하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co9bX8/btsA7z6VA2H/UFkIdGUGiZERijFTERQ0vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co9bX8/btsA7z6VA2H/UFkIdGUGiZERijFTERQ0vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co9bX8/btsA7z6VA2H/UFkIdGUGiZERijFTERQ0vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco9bX8%2FbtsA7z6VA2H%2FUFkIdGUGiZERijFTERQ0vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;390&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. CSR과&amp;nbsp;SSR&amp;nbsp;(vue와&amp;nbsp;nuxt)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;대부분의 웹&amp;nbsp;&lt;/span&gt;크롤러&lt;span style=&quot;text-align: start;&quot;&gt;들은 HTML에서 컨텐츠를 수집하는데 CSR 방식의 경우 서버는 단지 json파일만 보내주고 HTML을 그리는 역할은 클라이언트에서 js로 수행하기때문에 CSR방식으로 개발된 페이지를 빈페이지로 인식할수도 있다. 반면 SSR 방식은 View를 서버에서 전부 렌더링하기 때문에 HTML에 모든 컨텐츠가 저장되어 있어 SEO를 사용하는데 문제가 없다. 현재 구글봇의 경우 자바스크립트도 지원하고 있어 CSR 방식의 사이트도 크롤링이 가능하다고 하지만 vue보다는 SSR방식을 사용하는 nuxt가 검색엔진 최적화에 적합하다고 할 수 있다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;검색엔진(SEO) 최적화&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검색엔진은 로봇(Robot)이라는 프로그램을 이용해 매일 전 세계의 웹사이트 정보를 수집한다. (이것을 크롤링이라 하며 검색엔진의 크롤러가 이를 수행한다.) 그리고 검색 사이트 이용자가 검색할 만한 키워드를 미리 예상하여 검색 키워드에 대응하는 인덱스(색인)을 만들어 둔다.(이것을 인덱싱이라 하며 검색엔진의 인덱서가 이를 수행한다.)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인덱스를 생성할 때 사용되는 정보는 검색로봇이 수집한 정보인데 결국 웹사이트의 HTML 코드이다. 즉, 검색 엔진은 HTML 코드 만으로 그 의미를 인지하여야 하는데 이때 시맨틱 요소(Semantic element)를 해석하게 된다. 검색엔진 봇은 작성된 HTML 구조와 그 안에 담긴 텍스트를 분석함으로써 정보를 획득하고 종합하여 검색결과 상위에 노출될 수 있도록 최적화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹 접근성(Web Accessibility)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 접근성이란 장애인, 고령자 등이 웹 사이트에서 제공하는 정보에 대해 비장애인과 동등하게 접근하고 이해할 수 있도록 보장하는 것을 말한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹 접근성 자가 진단 평가 도구&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tpgi.com/color-contrast-checker/%EF%BB%BF&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.tpgi.com/color-contrast-checker/%EF%BB%BF&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;: 웹 접근성 진단 서비스&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tpgi.com/color-contrast-checker/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.tpgi.com/color-contrast-checker/&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 명도 대기 확인 서비스&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jigsaw.w3.org/css-validator/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jigsaw.w3.org/css-validator/&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;: 마크업, 웹 접근성 오류를 확인하고 웹 표준 검사할 수 있는 서비스&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹 접근성 가이드 참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wah.or.kr:444/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wah.or.kr:444/&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;: 웹접근성 연구소&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://news.seoul.go.kr/gov/archives/47485&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://news.seoul.go.kr/gov/archives/47485&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;: 서울시 웹접근성 및 웹표준 준수 가이드&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;검색엔진 상위노출 가이드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://minsoftk.tistory.com/68&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://minsoftk.tistory.com/68&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;: 구글 검색센터 SEO&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://searchadvisor.naver.com/guide/seo-help&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://searchadvisor.naver.com/guide/seo-help&lt;/a&gt; : 네이버 서치어드바이저&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Computer Science/Programming</category>
      <category>seo</category>
      <category>SEO검색엔진</category>
      <category>검색결과 상위노출</category>
      <category>검색엔진</category>
      <category>검색엔진상위노출</category>
      <category>시맨틱마크업</category>
      <category>웹접근성</category>
      <category>웹접근성 시맨틱마크업</category>
      <category>웹접근성 시맨틱태그</category>
      <category>의미론적인마크업</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/190</guid>
      <comments>https://ziszini.tistory.com/190#entry190comment</comments>
      <pubDate>Tue, 28 Nov 2023 23:14:11 +0900</pubDate>
    </item>
    <item>
      <title>정적/동적 웹페이지 특징 및 장단점</title>
      <link>https://ziszini.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인터넷을 이용하면서 접속하게 되는 웹페이지는 크게 둘로 나뉜다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마치 컴퓨터에 저장된 메모장 파일을 열어보듯 그대로 보는 &lt;b&gt;정적 웹페이지&lt;/b&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 변수들에 의해 변경되어 보이는 &lt;b&gt;동적 웹페이지.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;정적 웹페이지 특징&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgu0IJ/btsA25yMpD5/y2WvUpNkx4qiPnwgq8dgOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgu0IJ/btsA25yMpD5/y2WvUpNkx4qiPnwgq8dgOK/img.png&quot; data-alt=&quot;출처: 위키백과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgu0IJ/btsA25yMpD5/y2WvUpNkx4qiPnwgq8dgOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgu0IJ%2FbtsA25yMpD5%2Fy2WvUpNkx4qiPnwgq8dgOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;435&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: 위키백과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹서버에 이미 저장된 html 문서를 클라이언트에게 전송하는 웹페이지&lt;/li&gt;
&lt;li&gt;사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹페이지를 보게 된다.&lt;/li&gt;
&lt;li&gt;모든 사용자는 같은 결과의 웹 페이지를 서버에 요청하고 응답 받는다.&lt;/li&gt;
&lt;li&gt;Ex) 회사소개 페이지, 음식메뉴, 백과사전 등 내용이 변하지 않고 고정적인 페이지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;case1. 나무위키 검색결과페이지&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmLcV9/btsA21QHsjP/LwcDxGG8RY4yivddGa0XfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmLcV9/btsA21QHsjP/LwcDxGG8RY4yivddGa0XfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmLcV9/btsA21QHsjP/LwcDxGG8RY4yivddGa0XfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmLcV9%2FbtsA21QHsjP%2FLwcDxGG8RY4yivddGa0XfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;482&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;963&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;case2. 회사 소개페이지&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;965&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqhR8/btsA6SFmbm6/xfB6HdWq3otKvBcCHfkex0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqhR8/btsA6SFmbm6/xfB6HdWq3otKvBcCHfkex0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqhR8/btsA6SFmbm6/xfB6HdWq3otKvBcCHfkex0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqhR8%2FbtsA6SFmbm6%2FxfB6HdWq3otKvBcCHfkex0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;425&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;965&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동적 웹페이지 특징&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2eTyH/btsA4bd8YDG/ljabMe1XSgmRjsfwnOlK61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2eTyH/btsA4bd8YDG/ljabMe1XSgmRjsfwnOlK61/img.png&quot; data-alt=&quot;출처: 위키백과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2eTyH/btsA4bd8YDG/ljabMe1XSgmRjsfwnOlK61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2eTyH%2FbtsA4bd8YDG%2FljabMe1XSgmRjsfwnOlK61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;847&quot; height=&quot;257&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: 위키백과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청 정보를 처리한 후에 제작된 HTML 문서를 클라이언트에게 전송하는 웹페이지&lt;/li&gt;
&lt;li&gt;사용자는 상황, 시간, 요청 등에 따라 달라지는 웹페이지를 보게 된다.&lt;/li&gt;
&lt;li&gt;같은 페이지라도 사용자마다 다른 결과의 웹페이지를 서버에 요청하고 받을 수 있다.&lt;/li&gt;
&lt;li&gt;우리가 보는 대부분의 웹페이지는 동적 웹페이지다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Ex) 계속해서 다른 화면을 큐레이션해서 보여줘야 하는 유튜브, 인스타 페이지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;case1. 스크롤 down시 계속 새로운 영상이 나타나는 유튜브&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;youtube.gif&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zCZXH/btsA1crqA2d/KnNkWk8jjIB5tVFG7HFslK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zCZXH/btsA1crqA2d/KnNkWk8jjIB5tVFG7HFslK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zCZXH/btsA1crqA2d/KnNkWk8jjIB5tVFG7HFslK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zCZXH/btsA1crqA2d/KnNkWk8jjIB5tVFG7HFslK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;539&quot; data-filename=&quot;youtube.gif&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;case2. 보고&amp;nbsp;있는&amp;nbsp;위치에&amp;nbsp;출력&amp;nbsp;결과와&amp;nbsp;url이&amp;nbsp;계속&amp;nbsp;변하는&amp;nbsp;네이버&amp;nbsp;지도&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;map.gif&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oYcI5/btsA4R7LFDl/JEPyiNchTi5IrsP1nbC821/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oYcI5/btsA4R7LFDl/JEPyiNchTi5IrsP1nbC821/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oYcI5/btsA4R7LFDl/JEPyiNchTi5IrsP1nbC821/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/oYcI5/btsA4R7LFDl/JEPyiNchTi5IrsP1nbC821/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;397&quot; data-filename=&quot;map.gif&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;정적 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;웹페이지 장/단점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 빠르다 : 요청에 대한 파일만 전송하면 되기 때문에 추가적인 작업이 필요없다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 적은 비용 : 웹 서버만 구축하면 되기 때문에 비용이 적게 든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 한정적인 서비스 : 저장된 정보만 보여줄 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 어려운 관리 : 추가, 수정, 삭제 작업 모두 수동으로 이뤄져야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동적 웹페이지 장/단점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 다양한 서비스 : 다양한 정보를 조합하여 동적인 페이지 제공이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;2. 쉬운 관리 : 웹사이트 구조에 따라서 추가, 수정, 삭제 등의 작업이 용이하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 느린 속도 : 사용자에게 웹페이지를 전달하기 전에 처리하는 작업이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 추가 비용이 듦 : 웹서버 외 추가적으로 처리를 위한 애플리케이션 서버가 필요하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>  Computer Science/Programming</category>
      <category>동적페이지</category>
      <category>웹페이지</category>
      <category>웹페이지종류</category>
      <category>정적 동적페이지</category>
      <category>정적 동적페이지 장단점</category>
      <category>정적 동적페이지 특징</category>
      <category>정적페이지</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/189</guid>
      <comments>https://ziszini.tistory.com/189#entry189comment</comments>
      <pubDate>Tue, 28 Nov 2023 20:07:26 +0900</pubDate>
    </item>
    <item>
      <title>동기/비동기 개념과 프로세스와 스레드</title>
      <link>https://ziszini.tistory.com/188</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동기(Synchronous)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업을 다른 스레드로 보낸 후, 그 작업이 끝나길 &lt;b&gt;기다렸다가 &lt;/b&gt;다음 일을 진행한다 (직렬적으로 진행)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 스레드로 보낸 작업이 끝날 때까지 작업 중단(blocking)이 일어난다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시작 시점과 끝나는 시점이 일치한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 스레드에서 여러 요청을 동시에 처리할 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 12.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sA4BK/btsAXiSprWk/xkfArbQ3b8UFK0aJt3YPc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sA4BK/btsAXiSprWk/xkfArbQ3b8UFK0aJt3YPc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sA4BK/btsAXiSprWk/xkfArbQ3b8UFK0aJt3YPc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsA4BK%2FbtsAXiSprWk%2FxkfArbQ3b8UFK0aJt3YPc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2193&quot; height=&quot;1760&quot; data-filename=&quot;Group 12.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비동기(Asynchronous)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업을 다른 스레드로 보낸 후, 그 작업이 끝나길&lt;b&gt; 안&lt;/b&gt;&amp;nbsp;&lt;b&gt;기다리고&amp;nbsp;&lt;/b&gt;다음 일을 진행한다 (병렬적으로 진행)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 스레드에서 요청을 동시에 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업이 언제 끝날지 예측하기 힘들기 때문에, 보통 시간이 많이 걸리는 작업을 요청할 때 쓰인다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 14.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cht37F/btsAYFNuzyf/1EqTFZJKUSo5cV2cQkXpfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cht37F/btsAYFNuzyf/1EqTFZJKUSo5cV2cQkXpfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cht37F/btsAYFNuzyf/1EqTFZJKUSo5cV2cQkXpfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcht37F%2FbtsAYFNuzyf%2F1EqTFZJKUSo5cV2cQkXpfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2193&quot; height=&quot;1760&quot; data-filename=&quot;Group 14.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;직렬(Serial)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메인스레드에서 다른 스레드로 분산처리 시킨 작업을 &lt;b&gt;오직 하나의 스레드에서만&lt;/b&gt; 순차적으로 처리하는 것을 말한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉 1번 스레드에서 4개의 작업을 분산처리 시켰는데, 이를 2번 스레드에서만 처리하는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 15.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBiti/btsAZ92bChO/s6L9vKsAKf3uW66l92BjHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBiti/btsAZ92bChO/s6L9vKsAKf3uW66l92BjHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBiti/btsAZ92bChO/s6L9vKsAKf3uW66l92BjHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBiti%2FbtsAZ92bChO%2Fs6L9vKsAKf3uW66l92BjHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2193&quot; height=&quot;1760&quot; data-filename=&quot;Group 15.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동시(Concurrent)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 메인스레드에서 &lt;b&gt;다른 여러 개 스레드로&lt;/b&gt; 작업을 분산시켜 동시에 처리하는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;작업들이 각자 독립적이지만 유사한 작업들일 경우 유용한 처리 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 16.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr7CWc/btsAUL10lOw/ccUif6H8RQxHv7swbHDxNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr7CWc/btsAUL10lOw/ccUif6H8RQxHv7swbHDxNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr7CWc/btsAUL10lOw/ccUif6H8RQxHv7swbHDxNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr7CWc%2FbtsAUL10lOw%2FccUif6H8RQxHv7swbHDxNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2193&quot; height=&quot;1760&quot; data-filename=&quot;Group 16.png&quot; data-origin-width=&quot;2193&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;여기서 드는 의문..&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 동시랑 비동기는 같은 개념인가?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 직렬은 왜 사용하지? 동시가 더 좋아보인다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비동기가 동시는 비슷해보이나, 아예 다른 개념이다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 동기와 비동기는 메인 스레드의 대기열을 어떤 방식으로 처리할지를 정하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;직렬과 동시는 어떤 대기열을 사용할 지를 정하는 것(한 개 or 여러 개 스레드).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;작동되는 개념이 비슷하다고 혼용해서 생각하지 말자! 아예 다른 개념이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;직렬을 사용하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 작업의 &lt;b&gt;'순서'&lt;/b&gt;가 중요할 때 직렬이 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;동시는 여러 개 스레드에서 분산 처리하기 때문에 순서에 상관하지 않고 스레드에 할당된 작업은 각 스레드가 모조리 처리하는 특징이 있다. 이 때문에 만약 어떤 작업이 꼭 먼저 이뤄져야 하는 경우라면, 그럴 때는 직렬을 사용하는 것이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;프로세스(Process)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실행 중인 프로그램을 나타낸다. 하나의 프로세스는 여러 개의 스레드를 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스레드(Thread)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 프로세스 내에서 실행되는 작업의 단위를 가리킨다. 스레드는 프로세스 내의 메모리 공간을 공유하기&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;때문에, 같은 프로세스 내에서 실행되는 스레드들은 서로 간에 데이터를 공유할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnOxyE/btsA4SrkXBY/KitXRz5D0EY6B1eRILCRS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnOxyE/btsA4SrkXBY/KitXRz5D0EY6B1eRILCRS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnOxyE/btsA4SrkXBY/KitXRz5D0EY6B1eRILCRS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnOxyE%2FbtsA4SrkXBY%2FKitXRz5D0EY6B1eRILCRS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;612&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업관리자에서 프로세스를 자세히 보면 몇 개의 스레드가 돌아가고 있는지 확인이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;멀티스레딩(Multi-Thread)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대표적으로는 Java가 이러한 멀티 스레딩 방식을 채택하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;멀티스레딩의 한계&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 일반적으로 클라이언트의 요청마다 스레드를 발생시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;동시 접속자 수가 많다는 것은, 그만큼 스레드가 많이 발생한다는 의미이며 따라서 메모리 자원도 많이 소모되게 된다. 그러나 서버의 자원은 제한되서 일정 수 이상의 스레드를 발생시킬 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이러한 근본적인 문제들로, 서버를 업그레이드 하거나 로드 밸런싱(Load-Balancing) 으로 분산처리 해야하며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 스레드 간의 데이터 공유나 동기화 문제 등을 해결해야 하는 복잡한 작업들이 필요하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이로 인해 개발이 어려워지고, 복잡한 애플리케이션에서는 교착 상태나 경합 조건과 같은 문제가 발생하기도 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 Node의 장점이 있는데, Node는 내부적으로는 멀티 스레드를 사용하지만, 개발자가 직접 스레드를 조작하거나 생성할 필요가 없이 주요 작업은 싱글 스레드에서 실행된다. 따라서 복&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잡한 동기화 문제를 해결할 필요가 없어 개발이 간편해지고, 작업 처리 속도가 빨라지게 된다. 또한 이벤트 루프를 통해 비동기 작업을 처리함으로써, 자원 사용량이 최소화되며 확장성도 높아진다는 장점이 있다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>  Computer Science/Programming</category>
      <category>Asynchronous</category>
      <category>동기</category>
      <category>동기와비동기</category>
      <category>동기프로그래밍</category>
      <category>멀티스레딩</category>
      <category>비동기</category>
      <category>비동기프로그래밍</category>
      <category>직렬과동시처리</category>
      <category>프로세스 쓰레드</category>
      <category>프로세스와스레드</category>
      <author>dev_genie</author>
      <guid isPermaLink="true">https://ziszini.tistory.com/188</guid>
      <comments>https://ziszini.tistory.com/188#entry188comment</comments>
      <pubDate>Tue, 28 Nov 2023 13:32:07 +0900</pubDate>
    </item>
  </channel>
</rss>