<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>의진이의 개발 어린이 탈출기</title>
    <link>https://dmlwls7094.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 22 May 2026 14:35:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>의진이다람쥐</managingEditor>
    <image>
      <title>의진이의 개발 어린이 탈출기</title>
      <url>https://tistory1.daumcdn.net/tistory/5965341/attach/8f231bf0bbfe40d6928169b506601b4c</url>
      <link>https://dmlwls7094.tistory.com</link>
    </image>
    <item>
      <title>리뷰리스트 ul? div??</title>
      <link>https://dmlwls7094.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에 프로젝트를&amp;nbsp; 진행하면서, 리뷰리스트를 ul와 div 중 어떤 태그를 선택할지 고민하다가, 화 x라는 사이트와 무 xx라는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사이트를 참고 하였는데 각각 사용하는 게 달라서 어떤 게 맞는지 알아보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-25 오전 11.12.32.png&quot; data-origin-width=&quot;2410&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXGhm/btsMwsIhUx9/uD6TAYNhOPm6xFhxQscBnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXGhm/btsMwsIhUx9/uD6TAYNhOPm6xFhxQscBnk/img.png&quot; data-alt=&quot;화x&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXGhm/btsMwsIhUx9/uD6TAYNhOPm6xFhxQscBnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXGhm%2FbtsMwsIhUx9%2FuD6TAYNhOPm6xFhxQscBnk%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;224&quot; data-filename=&quot;스크린샷 2025-02-25 오전 11.12.32.png&quot; data-origin-width=&quot;2410&quot; data-origin-height=&quot;956&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화x&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-25 오전 11.13.23.png&quot; data-origin-width=&quot;2426&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgJenY/btsMvL2F1FU/mDkJpeCe9kJmrERqLqg05K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgJenY/btsMvL2F1FU/mDkJpeCe9kJmrERqLqg05K/img.png&quot; data-alt=&quot;무xx&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgJenY/btsMvL2F1FU/mDkJpeCe9kJmrERqLqg05K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgJenY%2FbtsMvL2F1FU%2FmDkJpeCe9kJmrERqLqg05K%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;580&quot; height=&quot;962&quot; data-filename=&quot;스크린샷 2025-02-25 오전 11.13.23.png&quot; data-origin-width=&quot;2426&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무xx&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;우선 각각의 장점? 이 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1️⃣ ul &amp;gt; li를 사용하는 게 더 좋은 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;HTML 의미론인 &lt;b&gt;시멘틱 마크업&lt;/b&gt;을 고려할 때 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ul은 관련된 항목들의 목록의 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리뷰 리스트는 여러 개의 리뷰 항목으로 구성된 목록이므로, ul &amp;gt; li 가 의미적으로는 더 적절합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;화면 낭독기(Screen Reader) 사용자의 경우에는 ul은 리스트로 인식되어서 더 명확하게 정보를 제공합니다.&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리하자면,&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 1. &lt;b&gt;웹 접근성(Accessibility)&lt;/b&gt;   ul은 &amp;ldquo;리스트&amp;rdquo;임을 명확히 전달, 스크린 리더기가 더 잘 인식함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 2. &lt;b&gt;SEO(Search Engine Optimization)&lt;/b&gt;   검색 엔진이 리뷰 항목들을 더 구조적으로 이해할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 3. &lt;b&gt;디자인 일관성 유지&lt;/b&gt;   CSS에서 li 스타일링을 활용하여 쉽게 조정 가능.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2️⃣. div를 사용하는 게 더 좋은 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ul을 사용할 필요가 없는 경우이다. 리스트가 아닌 단순한 레이아웃 요소라면 div가 더 적절하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리뷰 항목들이 독립적인 UI로 구성되고 리스트가 아닌 레이아웃의 역할을 한다면 div를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;정리하자면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 1. &lt;b&gt;&amp;ldquo;리스트&amp;rdquo;가 아니라 &amp;ldquo;레이아웃&amp;rdquo;을 위한 요소일 때.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 2. &lt;b&gt;리뷰 항목이 각각 독립적인 카드(Card) UI로 동작할 때.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 3. &lt;b&gt;CSS로 리스트 스타일링이 필요 없는 경우.&lt;/b&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;font-family: 'Nanum Gothic';&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;ldquo;리뷰 리스트&amp;rdquo;처럼 여러 개의 동일한 유형의 콘텐츠를 나열하는 경우, &lt;/b&gt;ul &amp;gt; li&lt;b&gt;를 사용하는 것이 더 의미론적으로 적절함.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;하지만, &amp;ldquo;그리드 카드 UI&amp;rdquo;처럼 배치가 더 중요하면 &lt;/b&gt;div&lt;b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저는 이번 프로젝트에서는 시멘틱 태그를 적절히 활용하는 것을 목표로 하므로,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리뷰 리스트를 &lt;/b&gt;&lt;span&gt;ul &amp;gt; li&lt;/span&gt;&lt;b&gt; 구조로 구현할 계획이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Project issue</category>
      <category>css</category>
      <category>div</category>
      <category>Li</category>
      <category>ul</category>
      <category>리뷰리스트</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/41</guid>
      <comments>https://dmlwls7094.tistory.com/41#entry41comment</comments>
      <pubDate>Tue, 25 Feb 2025 11:25:27 +0900</pubDate>
    </item>
    <item>
      <title>React useState에 대해 자세히 알아보기</title>
      <link>https://dmlwls7094.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에 금정이와 React-TS 프로젝트를 진행하면서 &lt;b&gt;React Hooks&lt;/b&gt;에 대해 더 깊이 알아볼 필요성을 느꼈습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이전에도 React Hook에 대한 포스팅을 했지만, &lt;b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 기회에 React Hooks를 하나씩 &lt;b&gt;좀 더 깊이 공부하면서 정리하는 &lt;b&gt;포스팅을 연재해 볼 예정&lt;/b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333; text-align: start;&quot;&gt;입니다.&lt;/span&gt;&lt;/b&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;스크린샷 2025-02-19 오후 3.22.59.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeRUz7/btsMnABkQw7/wCzCBDu5zvsGSK4wW3tk8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeRUz7/btsMnABkQw7/wCzCBDu5zvsGSK4wW3tk8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeRUz7/btsMnABkQw7/wCzCBDu5zvsGSK4wW3tk8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeRUz7%2FbtsMnABkQw7%2FwCzCBDu5zvsGSK4wW3tk8k%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;446&quot; height=&quot;351&quot; data-filename=&quot;스크린샷 2025-02-19 오후 3.22.59.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;580&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  &lt;b&gt;useState란 무엇인가 ??&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;useState&lt;/b&gt;는 React 훅 중 하나입니다. 함수형 컴포넌트에서 상태를 관리할 수 있게 해 주고, 함수형 컴포넌트는 단순히 입력을 받아&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;출력을 반환하는 함수라 상태라는 것을 갖지 않습니다. 그렇지만 &lt;b&gt;useState&lt;/b&gt;를 사용하면 함수형 컴포넌트에도 상태라는 것을&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;추가할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기서 함수형 컴포넌트가 무엇인지 잘 모르는 분들을 위해 함수형 컴포넌트에 대해서도 설명드릴 건데요.&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;font-family: 'Nanum Gothic';&quot;&gt;  &lt;b&gt;함수형 컴포넌트란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;React에서 UI를 정의하는 가장 기본적인 컴포넌트 유형 중 하나입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 컴포넌트는 자바스크립트 함수로 정의가 되며, props를 받아 JSX를 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 JSX는 React가 화면에 그릴 요소들을 정의하는 데 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739886913337&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function introduce(props) {
	return &amp;lt;h1&amp;gt;Hello My name is {props.name}~!!&amp;lt;/h1&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;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기서 introduce는 함수형 컴포넌트입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 컴포넌트는 name이라는 것을 예를 들어서 의진이란 데이터를 props로 받으면 Hello My name is 의진~!!이라는 문장을 반환합니다. React는 이 리턴된 JSX를 해석하여&amp;nbsp;DOM 요소로 변환한 후 화면에 렌더링 합니다.&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  함수형 컴포넌트의 특징&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;가장 큰 특징은 순수 함수 pure function 이라고도 하는데 이처럼 동작한다는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;주어진 props에 따라 항상 동일하게 출력을 반환하고, 컴포넌트 자체에 내부 상태 부수 효과가 없다는 가정이 포함됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 이유로 함수형 컴포넌트는 초기에 상태를 가질 수 없었고, 상태를 관리하거나, 컴포넌트 생명주기에 따라 작업을 수행하려면&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클래스형 컴포넌트를 사용해야 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 함수형 컴포넌트가 상태를 가질 수 없다는 제약은 훅이 도입되면서 변경이 되었고, &lt;b&gt;useState&lt;/b&gt;, useEffect와 같은 훅을 사용하여&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;함수형 컴포넌트에서도 상태를 관리하고, 부수 효과를 처리할 수 있게 되었습니다.!!&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  useState 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1739895674863&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const [name, setName] = useState('');&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;state :&lt;/b&gt; 현재 상태의 값이다. 예를 들어, 이름을 나타내는 상태라면, name은 현재 이름이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;setName(setState) : 상태를 업데이트하는 함수이다. 이 함수를 호출하면 상태가 변경되고, React가 Ui를 다시 리렌더링 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;useState&lt;/b&gt;() 안에 있는 값은 상태의 초기값이다. 이름을 비어있는 상태를 초기값을 두면 위처럼 설정하면 된다.&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;⚙️ useState의 동작 원리&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;useState&lt;/b&gt;는 컴포넌트가 렌더링 될 때, 리액트의 내부 메모리에 상태를 저장합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컴포넌트가 처음 렌더링될 때&lt;b&gt;. useState&lt;/b&gt;는 초기 상태 값을 받아 내부적으로 관리하고, 이 상태 값은&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컴포넌트가 다시 렌더링 되더라도 유지가 됩니다.&lt;/span&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;만약 상태를 업데이트하는 setName과 같은 setState 함수를 호출하게 되면, 리액트는 해당 컴포넌트를&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리렌더링 하여 화면을 업데이트 합니다. 이 시점에 새로운 상태 값이 적용된 컴포넌트가 렌더링하여 최신 상태를&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;반영합니다. 리액트는 가상의 DOM을 사용하여 변경된 부분만 업데이트하기 때문에 성능적으로 효율적입니다.&lt;/span&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;또 한 가지 지식을 얻었던 부분이 있는데, &lt;b&gt;useState&lt;/b&gt; 내부에는 JS의 클로저 개념이 적용되어 있어,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;함수형 컴포넌트가 매번 호출될 때마다 상태가 유지가 되고, React의 가상 DOM과 결합하여 상태가 변경될 때마다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;효율적으로 UI를 업데이트할 수 있다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* Closure : 함수가 생성될 때 함수 내부에서 참조하는 변수를 함수가 생성된 환경에서 기억하는 특성&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  useState를 사용할 때 고려사항&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  복잡한 상태 관리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;useState&lt;/b&gt;는 간단한 상태를 관리하기에는 좋지만. 상태가 복잡해지면 여러 개의 &lt;b&gt;useState&lt;/b&gt;를 사용해야 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 경우 코드가 복잡해지고 가독성이 떨어질 수 있습니다. 복잡한 상태관리가 필요할 때는 useReducer를&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이용하는 게 적절할 수 있습니다.&lt;/span&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;동기(Synchronous)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 코드가 &lt;b&gt;위에서 아래로 순차적으로 실행&lt;/b&gt;됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 하나의 작업이 끝나야 다음 작업이 실행됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;비동기(Asynchronous)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 특정 작업이 &lt;b&gt;끝나기를 기다리지 않고, 다음 코드가 실행됨&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 시간이 걸리는 작업(예: 네트워크 요청, 파일 읽기, 타이머)에서 사용됨&lt;/span&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;useState&lt;/b&gt;의 상태를 업데이트할 수 있는 함수는 setState는 비동기적으로 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상태가 업데이트된 그 값을 참조하려면 주의해야 합니다.&lt;/span&gt;&lt;/p&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;font-family: 'Nanum Gothic';&quot;&gt;지금까지는 개별 컴포넌트 내부에서의 상태 관리(&lt;b&gt;useState&lt;/b&gt;)에 대해서만 이야기했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 &lt;b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. &lt;b&gt;간단한 상태 관리&lt;/b&gt; &amp;rarr; &lt;b&gt;useState&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 한 개의 컴포넌트 내부에서만 사용되는 상태&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 예: 버튼 클릭 시 UI 변경, 입력 필드 값 관리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 2. &lt;b&gt;여러 컴포넌트 간 상태 공유&lt;/b&gt; &amp;rarr; useContext + useReducer&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 부모 &amp;rarr; 자식 컴포넌트 간 상태 전달 (props로 넘기기 어려운 경우)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 예: 다크 모드 설정, 사용자 인증 정보 (로그인 상태)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 3. &lt;b&gt;대규모 애플리케이션 상태 관리&lt;/b&gt; &amp;rarr; Redux, Recoil, Zustand, Jotai 등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 전역 상태 관리 필요할 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;bull; 예: 장바구니, 사용자 정보, 테마 설정 등 &lt;b&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/40</guid>
      <comments>https://dmlwls7094.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 19 Feb 2025 15:23:33 +0900</pubDate>
    </item>
    <item>
      <title>웹 접근성(A11Y) &amp;amp; WAI-ARIA</title>
      <link>https://dmlwls7094.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-17 오후 5.10.53.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRhIiK/btsMkLCSoiM/yvo8kdlD0j1kN4lGfVLbkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRhIiK/btsMkLCSoiM/yvo8kdlD0j1kN4lGfVLbkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRhIiK/btsMkLCSoiM/yvo8kdlD0j1kN4lGfVLbkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRhIiK%2FbtsMkLCSoiM%2Fyvo8kdlD0j1kN4lGfVLbkK%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;637&quot; height=&quot;377&quot; data-filename=&quot;스크린샷 2025-02-17 오후 5.10.53.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;482&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;  웹 접근성(A11Y) 이란?&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 사용자가 장애 유무와 관계없이 웹사이트를 쉽게 이용할 수 있도록 보장하는 것을 의미합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정상인뿐만 아니라, 장애를 가지고 있는 사용자들도 웹콘텐츠를 문제없이 이용할 수 있도록 웹사이트를 설계하는 것이 중요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;웹 접근성을 개발하면, SEO, 사용자 경험(UX) 브랜드 이미지 개선에도 큰 도움이 된다고 합니다.!!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  웹 접근성 핵심 개념&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 접근성의 원칙은 4가지(POUR)로 정리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 인식가능(Perceivable) : 시각적, 청각적으로 콘텐츠를 인식할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 운용 가능(Operable) : 키보드 음성 스크린리더 등 다양한 방식으로 웹을 조작할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이해 가능(Understandable) : 사용자 인터페이스와 콘텐츠가 예측 가능해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 견고성(Robust) : 다양한 기기와 보조 기술에서 정상적으로 작동해야 합니다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;  WAI-ARIA란? (Accessible Rich Internet Applications)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션에서 접근성을 향상하기 위한 표준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 HTML의 alt, label, title 같은 태그만으로 충분하지 않은 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARIA 속성을 활용해 접근성을 향상할 수 있습니다.&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;  WAI-ARIA 핵심 속성&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;EX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;role&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;요소의 역할을 명확하게 정의&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;&amp;lt;div role=&quot;button&quot;&amp;gt;클릭&amp;lt;/div&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;aria-label&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;보조 기술이 읽을 수 있는 레이블을 &lt;br /&gt;제공&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;&amp;lt;button aria-label=&quot;메뉴 열기&quot;&amp;gt;☰&amp;lt;/button&amp;gt;&amp;nbsp; (햄버거바임)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;aria-labelledby&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;기존 요소의 id를 참조하여 레이블 제공&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;&amp;lt;input id=&quot;name&quot;&amp;gt;&amp;lt;label for=&quot;name&quot;&amp;gt;이름&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;aria-hidden&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;화면에 표시되지만 보조 기술이 읽지 않도록 설정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;&amp;lt;span aria-hidden=&quot;true&quot;&amp;gt;X&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;aria-live&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;동적 콘텐츠 업데이트 시 알림 제공&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;&amp;lt;div aria-live=&quot;notification&quot;&amp;gt;새로운 알림이 있습니다.&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML5에는 button, link, heading 같은 요소의 의미가 내장되어있지만, &amp;lt;div&amp;gt;나 &amp;lt;span&amp;gt; 같은 태그를 사용할 경우 보조기술은 이해할 수 없습니다. 이 문제를 해결할 때, WAI-ARIA에 role 속성을 추가하면 요소의 의미를 명확히 전달 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 role 속성은 HTML 요소의 의미를 명확히 설명하여 보조 기술이 이해할 수 있도록 도와줍니다.&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ alt 속성 활용 (이미지 대체 텍스트)&lt;/h3&gt;
&lt;pre id=&quot;code_1739779349828&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;euijin.png&quot; alt=&quot;의진 사진&quot;&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;size16&quot;&gt;alt 속성을 활용하면 시각 장애인이 화면 낭독기로 웹을 사용할 때 alt 속성을 읽어줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ label 속성 활용 (form 요소 연결)&lt;/h3&gt;
&lt;pre id=&quot;code_1739779452731&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;label for=&quot;username&quot;&amp;gt;이름&amp;lt;/label&amp;gt;
&amp;lt;input type=&quot;text&quot; id=&quot;username&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;label과 input을 연결하면 클릭 영역이 넓어지고 스크린 리더가 내용을 읽을 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ aria-hidden=&quot;true&quot; (보조 기술 무시)&lt;/h3&gt;
&lt;pre id=&quot;code_1739779553075&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;span aria-hidden=&quot;true&quot;&amp;gt; &amp;lt;/span&amp;gt; 새 알림이 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이콘이나 장식 요소는 보조 기술이 읽지 않도록 aria-hidden=&quot;true&quot; 추가하여 의미 없는 내용을 읽지 않도록 합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4️⃣ aria-live=&quot;polite&quot; (실시간 알림 읽어주기)&lt;/h3&gt;
&lt;pre id=&quot;code_1739779663634&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div aria-live=&quot;polite&quot;&amp;gt;새로운 메시지가 도착했습니다.&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면이 업데이트되거나, 알림이 올 때 스크린 리더가 자연스럽게 읽어줍니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5️⃣ 키보드 접근성 개선(tabindex)&lt;/h3&gt;
&lt;pre id=&quot;code_1739779737056&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div role=&quot;button&quot; tabindex=&quot;0&quot;&amp;gt;키보드로 접근 가능&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tabindex=&quot;0&quot; 키보드 tab 키로 초점 이동 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tabindex=&quot;-1&quot; 초점은 안 가지만 JS로 포커스 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;웹 접근성(A11Y)&lt;/b&gt; &amp;rarr; 모든 사용자가 웹을 쉽게 이용할 수 있도록 보장하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;WAI-ARIA&lt;/b&gt; &amp;rarr; HTML 요소에 의미를 부여하고 보조 기술이 인식할 수 있도록 돕는 속성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;실무에서 접근성을 개선하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✔ &lt;/span&gt;alt&lt;span&gt; 속성 활용 (&lt;/span&gt;&amp;lt;img alt=&quot;...&quot; /&amp;gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✔ &lt;/span&gt;aria-label&lt;span&gt;, &lt;/span&gt;aria-hidden&lt;span&gt;, &lt;/span&gt;aria-live&lt;span&gt; 등 WAI-ARIA 속성 활용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ 키보드 접근성을 위한 &lt;span&gt;tabindex&lt;/span&gt; 추가&lt;/p&gt;</description>
      <category>HTML</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/39</guid>
      <comments>https://dmlwls7094.tistory.com/39#entry39comment</comments>
      <pubDate>Mon, 17 Feb 2025 17:11:52 +0900</pubDate>
    </item>
    <item>
      <title>React 훅(Hook) 이란..?</title>
      <link>https://dmlwls7094.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-15 오전 4.02.27.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be1CjQ/btsMj60qovY/AvnpElkmDs6HNBck5ayI91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be1CjQ/btsMj60qovY/AvnpElkmDs6HNBck5ayI91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be1CjQ/btsMj60qovY/AvnpElkmDs6HNBck5ayI91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe1CjQ%2FbtsMj60qovY%2FAvnpElkmDs6HNBck5ayI91%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;900&quot; height=&quot;366&quot; data-filename=&quot;스크린샷 2025-02-15 오전 4.02.27.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 리액트 훅에 대해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅해 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;React에서 훅은 함수형 컴포넌트에서 상태(state)와 생명주기 기능을 사용할 수 있도록 해주는 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 React에서는 클래스 컴포넌트에서만 상태 관리와 생명주기 메서드를 사용할 수 있었지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 16.8부터 useStatue, useEffect 같은 훅을 사용하여 함수형 컴포넌트에서도 이를 활용 가능 하게 되었습니다.&lt;/p&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;b&gt;  1️⃣ React Hook의 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Hook은 크게 기본 훅, 추가 훅, 그리고 커스텀 훅으로 나뉩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 훅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useState : 컴포넌트 상태 관리(state)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useEffect : 컴포넌트 생명주기 관리(side effects, API 요청 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useContext : 전역 상태 관리 (React Context API 활용)&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useReducer : 복잡한 상태 로직을 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useRef : DOM 요소 또는 값 유지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useMemo : 렌더링 성능 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useCallback : 이벤트 핸들러 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useLayoutEffect : useEffect와 유사하지만 렌더링 직후 동기적으로 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useImperativeHandle : 컴포넌트의 인스턴스를 직접조작&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 사용하는 대표적인&amp;nbsp; React Hook 3가지 설명 및 사용법을 적어보겠습니다.&lt;/p&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;b&gt;  2️⃣ 기본 React Hook 상세 설명 및 사용법&lt;/b&gt;&lt;/p&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;b&gt; &lt;b&gt;&amp;nbsp;1️⃣.&lt;/b&gt; useState - 상태(state) 관리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739559051174&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from &quot;react&quot;;

const Counter = () =&amp;gt; {
  const [count, setCount] = useState(0); // &amp;lt;== 초기값
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;버튼을 몇번 눌렀을까요? {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;+1 증가 ~ &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Counter;&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;useState(초기값)을 사용하여 상태를 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 눌러 setCount를 호출하면 컴포넌트가 다시 렌더링 됩니다.&lt;/p&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;b&gt;✅ 2. useEffect - 상태(state) 관리 (저번 포스팅에서 axios를 사용하여 API 요청법을 포스팅했으므로 융합해서 써볼게요)&lt;/b&gt;&lt;/p&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;b&gt;&amp;nbsp;1️⃣. useEffect + axios 기본 예제&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739559303198&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect } from &quot;react&quot;;
import axios from &quot;axios&quot;;

const FetchData = () =&amp;gt; {
  useEffect(() =&amp;gt; {

    const fetchData = async () =&amp;gt; {
      try {
        const response = await axios.get(&quot;https://요청주소기입하세요/test&quot;);
        console.log(&quot;API 데이터:&quot;, response.data);
      } catch (error) {
        console.error(&quot;API 요청 중 오류 발생:&quot;, error);
      }
    };

    fetchData();
  }, []); 

  return &amp;lt;h2&amp;gt;콘솔에서 데이터를 확인하세요!&amp;lt;/h2&amp;gt;;
};

export default FetchData;&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;b&gt;설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.useEffect(() =&amp;gt; {...}, []) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴포넌트가 처음 렌더링될 때 API를 한 번만 요청하도록 설정합니다.&lt;/b&gt;&lt;/p&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;b&gt;✅ 3. useContext - 전역 상태 관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739559493245&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { createContext, useContext } from &quot;react&quot;;

// 1️⃣ 컨텍스트 생성
const ThemeContext = createContext(&quot;light&quot;);

const ThemeComponent = () =&amp;gt; {
  // 2️⃣ 컨텍스트 값 가져오기
  const theme = useContext(ThemeContext);
  return &amp;lt;p&amp;gt;현재 테마: {theme}&amp;lt;/p&amp;gt;;
};

const App = () =&amp;gt; {
  return (
    &amp;lt;ThemeContext.Provider value=&quot;dark&quot;&amp;gt;
      &amp;lt;ThemeComponent /&amp;gt;
    &amp;lt;/ThemeContext.Provider&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useContext는 React의 Context API를 사용하여 전역적으로 상태를 공유할 때 유용합니다.(ex. 다크모드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 설명은 ThemeContext.Provider로 value를 설정하고 하위 컴포넌트에서 useContext로 가져올 수 있음.&lt;/p&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;b&gt;  최종 정리&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;훅&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;useState&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;컴포넌트 내부 상태 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;useEffect&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;생명주기 관리, API 요청, 이벤트 핸들링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;useContext&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;전역 상태 관리(Context API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;useReducer&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;복잡한 상태 로직 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;useRef&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;DOM 요소 참조, 렌더링과 무관한 값 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/38</guid>
      <comments>https://dmlwls7094.tistory.com/38#entry38comment</comments>
      <pubDate>Sat, 15 Feb 2025 04:02:57 +0900</pubDate>
    </item>
    <item>
      <title>SSR vs CSR: 언제, 왜 사용해야 할까?</title>
      <link>https://dmlwls7094.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Next.js 프로젝트를 진행하기 전에, Next.js와 React의 차이점을 공부하면서 *SSR(서버 사이드 렌더링)*과 *CSR(클라이언트 사이드 렌더링)*이 주요 키워드로 많이 언급되는 것을 알게 되었습니다.&lt;/p&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&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&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;b&gt; ️ SSR(Server-Side Rendering) &amp;ndash; 서버 사이드 렌더링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR은 &lt;b&gt;서버에서 HTML을 미리 렌더링 하여 클라이언트에 전달하는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 사용자가 요청을 보내면 &lt;b&gt;서버에서 HTML을 생성한 후 브라우저로 전송&lt;/b&gt;하며, 이후 JavaScript가 실행되면서 인터랙티브 기능이 활성화됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-07 오후 5.59.13.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8Fao/btsMa7ZVbCa/HmGpPYc3SXpe5vyklV9gaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8Fao/btsMa7ZVbCa/HmGpPYc3SXpe5vyklV9gaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8Fao/btsMa7ZVbCa/HmGpPYc3SXpe5vyklV9gaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8Fao%2FbtsMa7ZVbCa%2FHmGpPYc3SXpe5vyklV9gaK%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;1524&quot; height=&quot;850&quot; data-filename=&quot;스크린샷 2025-02-07 오후 5.59.13.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;850&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;size16&quot;&gt;위 그림 대로 정리를 하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 사용자가 웹사이트에 요청을 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버는 렌더링이 가능한 HTML 파일을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 브라우저는 빠르게 HTML을 읽을 수 있어 화면은 렌더링 되었지만, 조작은 불가능한 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 브라우저가 JS파일을 읽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 이제 유저는 콘텐츠를 볼수도 있고, 사용자의 조작도 기록이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 브라우저가 JS 프레임워크를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 기록된 사용자 조작도 실행되고 페이지 상호작용도 가능해집니다.&lt;/p&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;b&gt;✅ SSR 동작 과정 (요약)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;사용자가 웹사이트에 요청을 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;서버가 해당 요청을 처리하고 HTML을 생성하여 클라이언트에 응답&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;브라우저가 HTML을 렌더링 하고 JS 파일을 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;JS가 실행되면 페이지의 인터랙티브 요소가 활성화됨&lt;/p&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;b&gt;  SSR 장점&lt;/b&gt;&lt;/p&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;b&gt;검색엔진 최적화(SEO)에 유리&lt;/b&gt; &amp;ndash; 완전한 HTML을 서버에서 제공하기 때문에 검색 엔진 크롤러가 쉽게 분석 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;초기 페이지 로딩 속도 빠름&lt;/b&gt; &amp;ndash; 첫 번째 화면을 서버에서 렌더링 후 제공하기 때문에 사용자 경험이 향상됨&lt;/p&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;b&gt;  SSR 단점&lt;/b&gt;&lt;/p&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;b&gt;페이지 이동 시 로딩 속도가 CSR보다 느림&lt;/b&gt; &amp;ndash; 새로운 페이지를 요청할 때마다 서버 렌더링을 다시 수행해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;서버 부하 증가&lt;/b&gt; &amp;ndash; 요청이 많을수록 서버의 부담이 커지고, 확장성이 떨어질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;클라이언트에서 JS가 실행되기 전까지 페이지 조작 불가능&lt;/b&gt;&lt;/p&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;b&gt;⚡ CSR(Client-Side Rendering) &amp;ndash; 클라이언트 사이드 렌더링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSR은 &lt;b&gt;초기에는 빈 HTML을 전달하고, 브라우저에서 JavaScript를 실행하여 화면을 렌더링하는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 클라이언트(브라우저)가 데이터를 받아 화면을 구성하며, React, Vue 등 &lt;b&gt;SPA(Single Page Application) 프레임워크에서 주로 사용&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-07 오후 6.20.07.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcVW6u/btsMcpyjC5Y/CZyfZHN5BHy3aytF3WwInK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcVW6u/btsMcpyjC5Y/CZyfZHN5BHy3aytF3WwInK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcVW6u/btsMcpyjC5Y/CZyfZHN5BHy3aytF3WwInK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcVW6u%2FbtsMcpyjC5Y%2FCZyfZHN5BHy3aytF3WwInK%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;1528&quot; height=&quot;830&quot; data-filename=&quot;스크린샷 2025-02-07 오후 6.20.07.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;830&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;size16&quot;&gt;&lt;b&gt;✅ CSR 동작 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;사용자가 웹사이트에 요청을 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;CDN이 빠르게 HTML과 JS 파일을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;브라우저가 HTML 및 JS를 다운로드 (이 시점에서는 화면이 안 보일 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;JS가 실행되면서 API 요청을 보내고 데이터를 받아와 UI를 렌더링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;페이지가 완성되면 사용자 인터랙션 가능&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 필요한 데이터를 한 번에 받고 받은 데이터를 브라우저가 렌더링 하는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 화면 렌더링 방식인 SPA(Single Page Application) 이랑도 밀접한 연관이 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPA는 CSR 방식이고, 처음 한번 페이지 전체를 로딩하고, 필요시 데이터만 바꿔서 화면을 그려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 개발할 때 많이 사용되는 프레임워크인 React도 SPA입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSR은 CPU 성능 상승 + JS 표준화(리액트, 뷰, 앵귤러 프레임워크의 발전)와 함께 본격적으로 시작되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSR은 서버에서 데이터를 받아 모두 읽고 다시 화면에 페이지를 바꿔서 보여주는 것보다 훨씬 빠르게 화면을 그릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 성능적으로도, 페이지를 새로 렌더링을 하지 않아, 서버자원을 덜 사용하며, 새로고침이 발생하지 않기 때문에, 화면이 바뀔 때도 화면 깜빡임이 없어 사용자 경험을 높일 수 있습니다.&lt;/p&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;/p&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;b&gt;  CSR 장점&lt;/b&gt;&lt;/p&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;b&gt;사용자 경험(UX)이 향상됨&lt;/b&gt; &amp;ndash; 페이지 새로고침 없이 빠르게 화면을 변경할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;트래픽 감소 효과&lt;/b&gt; &amp;ndash; 변경된 데이터만 받아오기 때문에 네트워크 비용 절감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;페이지 간 이동 속도 빠름&lt;/b&gt; &amp;ndash; 서버 요청 없이 프런트엔드에서 화면을 조작 가능&lt;/p&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;b&gt;  CSR 단점&lt;/b&gt;&lt;/p&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;b&gt;초기 로딩 속도 느림&lt;/b&gt; &amp;ndash; JS가 실행되기 전까지 빈 HTML이 로드됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ &lt;b&gt;SEO에 불리&lt;/b&gt; &amp;ndash; 초기 HTML이 비어있어 검색 엔진이 콘텐츠를 제대로 읽지 못할 가능성 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 SSR과 CSR은 언제 사용해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR은 네트워크가 느리거나, 검색엔진 최적화가 필요할 때, 페이지 상호작용이 별로 없을 때 사용을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(블로그, 뉴스, 실시간 데이터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSR은 네트워크가 빠르고, 검색엔진 최적화가 필요 없고, 페이지 상호작용이 많이 필요할 때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR과 CSR은 각각 장단점이 있으며, &lt;b&gt;서비스 특성에 따라 적절한 렌더링 방식을 선택하는 것이 중요&lt;/b&gt;합니다.&lt;/p&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;b&gt;SEO가 중요한 블로그, 뉴스 사이트&lt;/b&gt; &amp;rarr; &lt;b&gt;SSR을 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;대시보드, 웹앱처럼 빠른 화면 전환이 필요한 경우&lt;/b&gt; &amp;rarr; &lt;b&gt;CSR을 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;SEO와 사용자 경험을 모두 고려해야 하는 경우&lt;/b&gt; &amp;rarr; &lt;b&gt;Next.js의 Hybrid Rendering(SSR + CSR 조합) 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js는 &lt;b&gt;SSR, CSR뿐만 아니라 SSG(Static Site Generation), ISR(Incremental Static Regeneration)까지 지원&lt;/b&gt;하여 다양한 렌더링 방식의 장점을 활용할 수 있습니다.&lt;/p&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;b&gt;다음 포스팅에서는 Next.js의 다양한 렌더링 방식과 활용 사례를 다뤄보겠습니다!&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <category>cs</category>
      <category>프론트엔드</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/37</guid>
      <comments>https://dmlwls7094.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 7 Feb 2025 19:00:03 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] 타입스크립트 타입, 타입 명시</title>
      <link>https://dmlwls7094.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 타입스크립트의 type에 대해서 포스팅해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-04 오후 4.54.28.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GZZ8w/btsL7fXqn4K/jgJHIGgma8BriGdyRz8tIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GZZ8w/btsL7fXqn4K/jgJHIGgma8BriGdyRz8tIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GZZ8w/btsL7fXqn4K/jgJHIGgma8BriGdyRz8tIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGZZ8w%2FbtsL7fXqn4K%2FjgJHIGgma8BriGdyRz8tIK%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;490&quot; height=&quot;445&quot; data-filename=&quot;스크린샷 2025-02-04 오후 4.54.28.png&quot; data-origin-width=&quot;490&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;p data-ke-size=&quot;size16&quot;&gt;TypeScript는&amp;nbsp; Javascript compiler입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TS는 Strongly type 언어이고, JS에서 발생할 수 있는 오류를 미리 감지하고 경고합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말은 즉 TS에서 오류가 없다면 JS에서도 오류가 없다는 뜻입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript는 암묵적 Type와 명시적 Type를 모두 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Type는 변수를 선언할 때 명시적으로 지정해줘야 합니다. 만약 지정을 안 해준다면. 변수 선언 하고 난 뒤&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;처음&quot;으로 할당될 때를 기준으로 Type가 추론됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 할당된 변수의 Type와 다른 Type를 추후에 섞어서 쓰게 된다면 에러가 뜨게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 Type은 기본적으로 클론(:) 뒤에 기재하는 방식을 통해 명시적으로 지정합니다.&lt;/p&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;/p&gt;
&lt;pre id=&quot;code_1738656010923&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const name : String&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;예시처럼 변수 name은 string이 아닌 다른 Type는 가질 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TS는 JS의 리터럴 표현을 지원합니다. 숫자로 이루어진 Array를 정의하고 싶다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;number []와 같이 배열 리터럴을 통해 표현이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 리터럴을 통해 표기하면 가동석이 떨어지는 경우가 있는데. type 명령어를 통해 나만의 Type를 생성 한 뒤 이를 활용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;축약적으로 Type를 지정해 줄 수 있습니다. (Type Alias)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 리터럴로 Type 정의한 예시&lt;/p&gt;
&lt;pre id=&quot;code_1738656388900&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const person : {
    name : string, age : number, sex : string 
  } = {
  name : euijin, age : 27, sex : male
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Person이라는 type를 생성하여 변수 person의 type이 Person 임을 보여주는 예시&lt;/p&gt;
&lt;pre id=&quot;code_1738656489845&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Person = {
    name : string, age : number, sex : string 
  } 
  
const person : Person = {
   name : 'euijin', age : 27, sex : male
}&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;위 예제에서 type을 통해 생성된 Person은 type에 관한 정보를 담고 있는, TypeScript에서만 쓰이는 변수의 일종이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말은 TypeScript에서 type 키워드는 JS에서 const, let, var 키워드와 똑같은 기능을 수행합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 TypeScript의 가장 기본 개념인 타입과 타입을 명시하는 방법에 대해 포스팅해보았습니다.&lt;/p&gt;</description>
      <category>TS</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/36</guid>
      <comments>https://dmlwls7094.tistory.com/36#entry36comment</comments>
      <pubDate>Tue, 4 Feb 2025 17:11:22 +0900</pubDate>
    </item>
    <item>
      <title>Lighthouse 검색엔진최적화(SEO) 100점 만들기</title>
      <link>https://dmlwls7094.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 &lt;b&gt;LG 유플러스 유레카 SW 교육과정&lt;/b&gt;에서 진행했던 &lt;b&gt;융합 프로젝트&lt;/b&gt;를 리팩토링하면서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;검색엔진최적화(SEO) 100점 달성 과정&lt;/b&gt;을 정리해보려고 합니다.&lt;/p&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;b&gt;4조 나쵸팝콘콜라 프로젝트&lt;/b&gt;는 본선에 진출한 만큼, &lt;b&gt;서비스 품질을 높이는 리팩토링 과정&lt;/b&gt;을 진행하고있습니다..(금정이와 둘이..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에서도 &lt;b&gt;SEO 점수를 100점으로 올리는 것&lt;/b&gt;이 목표였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Google Lighthouse&lt;/b&gt; 기준 &lt;b&gt;SEO 100점 달성&lt;/b&gt;을 위해 여러 가지 최적화를 진행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 리팩토링 하기전 LightHouse 검색 엔진 최적화 점수 입니다 ㅠㅠ..&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;개선 전&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-29 오후 3.08.09.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhUbuk/btsL1ABFQla/yMeMLkV2ouXELyXWOvuHu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhUbuk/btsL1ABFQla/yMeMLkV2ouXELyXWOvuHu0/img.png&quot; data-alt=&quot;홈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhUbuk/btsL1ABFQla/yMeMLkV2ouXELyXWOvuHu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhUbuk%2FbtsL1ABFQla%2FyMeMLkV2ouXELyXWOvuHu0%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;418&quot; height=&quot;1166&quot; data-filename=&quot;스크린샷 2025-01-29 오후 3.08.09.png&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;1166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;홈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-29 오후 4.28.30.png&quot; data-origin-width=&quot;2838&quot; data-origin-height=&quot;1434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qO41N/btsL1C7FeCK/W78rvAoKkkPhlZ1F74vir0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qO41N/btsL1C7FeCK/W78rvAoKkkPhlZ1F74vir0/img.png&quot; data-alt=&quot;마이페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qO41N/btsL1C7FeCK/W78rvAoKkkPhlZ1F74vir0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqO41N%2FbtsL1C7FeCK%2FW78rvAoKkkPhlZ1F74vir0%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;749&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2025-01-29 오후 4.28.30.png&quot; data-origin-width=&quot;2838&quot; data-origin-height=&quot;1434&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마이페이지&lt;/figcaption&gt;
&lt;/figure&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;개선 후&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-30 오후 2.59.51.png&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wv9ou/btsL2TAhHXI/rf1iHJ4yK6prnStkYpEk2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wv9ou/btsL2TAhHXI/rf1iHJ4yK6prnStkYpEk2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wv9ou/btsL2TAhHXI/rf1iHJ4yK6prnStkYpEk2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWv9ou%2FbtsL2TAhHXI%2Frf1iHJ4yK6prnStkYpEk2K%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;1913&quot; height=&quot;916&quot; data-filename=&quot;스크린샷 2025-01-30 오후 2.59.51.png&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;916&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-29 오후 6.14.55.png&quot; data-origin-width=&quot;2830&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8nTse/btsL2QctrQK/IqFrZ0Kp0JjuCeSHuVrfpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8nTse/btsL2QctrQK/IqFrZ0Kp0JjuCeSHuVrfpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8nTse/btsL2QctrQK/IqFrZ0Kp0JjuCeSHuVrfpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8nTse%2FbtsL2QctrQK%2FIqFrZ0Kp0JjuCeSHuVrfpk%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;2830&quot; height=&quot;1530&quot; data-filename=&quot;스크린샷 2025-01-29 오후 6.14.55.png&quot; data-origin-width=&quot;2830&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지가 너무 많으면 글이 조잡해보여서 조금만 이미지 첨부하겠습니다. 나머지 페이지에서도 전부 비슷한 점수가 나왔는데요.&amp;nbsp; 어떻게 모든 페이지 100점을 적용 시켰는지 말씀 드리겠습니다.&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;우선 첫번째로 &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.html head 태그안에&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738318508505&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta name=&quot;description&quot; content=&quot;쿠키 V2.0 - 영화 리뷰 플랫폼 버전2&quot; /&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;size16&quot;&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;두번째,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;b&gt;모든 페이지에 적절한 &lt;/b&gt;&lt;span&gt;description&lt;/span&gt;&lt;b&gt; 메타 태그를 추가하는 것&lt;/b&gt;이었습니다. 이를 위해 &lt;span&gt;react-helmet-async&lt;/span&gt; 라이브러리를 활용하여, 페이지마다 &lt;b&gt;고유한 설명을 제공&lt;/b&gt;하도록 설정했습니다.&lt;/p&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;b&gt;설치&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738318688094&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# npm 사용 시
npm install react-helmet-async

# yarn 사용 시
yarn add react-helmet-async&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;b&gt;HelmetProvider로 전체 앱 감싸기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738318722961&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ReactDOM.createRoot(document.getElementById(&quot;root&quot;)).render(
  &amp;lt;HelmetProvider&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/HelmetProvider&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;size16&quot;&gt;&lt;b&gt;Helmet을 사용하여 페이지별 메타 태그 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738318564861&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   &amp;lt;Helmet&amp;gt;
        &amp;lt;title&amp;gt;마이페이지 | Cookie-V2.00&amp;lt;/title&amp;gt;
        &amp;lt;meta name=&quot;description&quot; content=&quot;쿠키 서비스의 마이페이지입니다.&quot; /&amp;gt;
      &amp;lt;/Helmet&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-31 오후 7.20.57.png&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTghlI/btsL26Hqfzw/ENCUm5X6RywnE0rC18kVtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTghlI/btsL26Hqfzw/ENCUm5X6RywnE0rC18kVtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTghlI/btsL26Hqfzw/ENCUm5X6RywnE0rC18kVtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTghlI%2FbtsL26Hqfzw%2FENCUm5X6RywnE0rC18kVtk%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;580&quot; height=&quot;74&quot; data-filename=&quot;스크린샷 2025-01-31 오후 7.20.57.png&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로,&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 내에서 &lt;b&gt;글자 크기가 너무 작거나, 글자와 글자 간의 간격(라인 간격, 자간)이 너무 좁을 경우&lt;/b&gt;, 접근성(Accessibility) 점수와 SEO 점수가 낮아질 수 있습니다. 이는 &lt;b&gt;사용자의 가독성을 저해하고 모바일 및 데스크톱 환경에서 불편함을 초래할 가능성이 있기 때문&lt;/b&gt;입니다.&lt;/p&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;b&gt;SEO 최적화는 단순한 점수 올리기가 아니라, 더 많은 사용자에게 도달하고 보다 나은 경험을 제공하기 위한 과정&lt;/b&gt;입니다. 작은 변화가 큰 차이를 만들 수 있으니, 앞으로도 지속적으로 신경 쓰며 개선해 나가면 좋겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Project issue</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/35</guid>
      <comments>https://dmlwls7094.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 31 Jan 2025 19:28:55 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트의 DOM(Document Object Model)</title>
      <link>https://dmlwls7094.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 자바스크립트의 기본 중에 기본인 &lt;b&gt;DOM&lt;/b&gt;에 대해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DOM(Document Object Model)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DOM(Document Object Model)&lt;/b&gt; 은 웹 문서의 구조화된 표현입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 프로그래밍 언어가 웹 페이지 내의 객체에 접근하고 조작할 수 있게 하는 인터페이스로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 웹페이지의 요소를 선택, 수정, 추가 또는 제거할 때 사용됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DOM의 주요 특징&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;트리 구조&lt;/b&gt; : DOM은 트리 구조로 표현되며, 각 노드는 웹페이지에서 문서, 요소, 속성, 텍스트, 주석 을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;라이브 특성&lt;/b&gt; : DOM은 라이브라는 특성이 있습니다. DOM에 대한 변경은 즉시 웹페이지에 반영됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;조작 가능&lt;/b&gt; : 자바스크립트를 사용하여 DOM 요소를 선택 수정 추가 제거 할수 있습니다.&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;b&gt;DOM 관련 메서드 및 속성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;요소 선택&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;document.getElementById(id) : 주어진 id 가진 요소를 반환시킵니다.&lt;/li&gt;
&lt;li&gt;document.getElementsByTagName(name) : 주어진 태그 이름을 가진 요소들의 목록을 반환합니다.&lt;/li&gt;
&lt;li&gt;document.getElementsByClassName(name) : 주어진 클래스 이름을 가진 요소들의 목록을 반환합니다.&lt;/li&gt;
&lt;li&gt;document.querySelector(selector) : 주어진 CSS 선택자와 일치하는 첫 번째 요소를 반환합니다.&lt;/li&gt;
&lt;li&gt;document.querySelectorAll(selector) : 주어진 CSS 선택자와 일치하는 모든 요소의 목록을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;요소 조작&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;element.textContent 또는 element.innerText: 요소의 텍스트 내용을 가져오거나 설정한다.&lt;/li&gt;
&lt;li&gt;element.innerHTML: 요소의 내부 HTML을 가져오거나 설정한다.&lt;/li&gt;
&lt;li&gt;element.setAttribute(name, value): 요소의 속성 값을 설정한다.&lt;/li&gt;
&lt;li&gt;element.getAttribute(name): 요소의 속성 값을 가져온다.&lt;/li&gt;
&lt;li&gt;element.appendChild(childElement): 요소에 자식 요소를 추가한다.&lt;/li&gt;
&lt;li&gt;element.removeChild(childElement): 요소에서 자식 요소를 제거한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 리스너&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;element.addEventListener(event, function): 요소에 이벤트 리스너를 추가함&lt;/li&gt;
&lt;li&gt;element.removeEventListener(event, function) : 요소에서 이벤트 리스너를 제거함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 )&lt;/p&gt;
&lt;pre id=&quot;code_1738045632537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let euijin = document.getElementById('euijin');

euijin.textcontent = 'euijin handsome';

euijin.addEventListener('onclick', function {
	alert('클릭 클릭!');
});&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;b&gt;웹 페이지 빌드 과정(CRP)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-28 오후 10.57.30.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rIevd/btsL0MJkVwR/I29yJ35AVmEjDoikExHpq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rIevd/btsL0MJkVwR/I29yJ35AVmEjDoikExHpq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rIevd/btsL0MJkVwR/I29yJ35AVmEjDoikExHpq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrIevd%2FbtsL0MJkVwR%2FI29yJ35AVmEjDoikExHpq0%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;1180&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2025-01-28 오후 10.57.30.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;CRP는 웹 브라우저가 HTML, CSS, JavaScript와 같은 웹 페이지의 리소스를 받아서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 화면에 페이지를 표시하는 과정을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;주요 단계&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DOM 트리 구축 (Constructing the DOM Tree)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 HTML을 받아와서 DOM 트리라는 구조화된 표현을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. CSSOM 트리 구축 (Constructing the CSSOM Tree)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 CSS를 받아와서 CSSOM 트리라는 구조화된 표현을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 렌더 트리 생성 (Render Tree Construction)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 트리와 CSSOM 트리는 합쳐서 렌더 트리를 생성합니다. 렌더 트리는 화면에 실제로 표시될&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드들만을 포함합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 레이아웃 (Layout)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더 트리가 생성되면, 브라우저는 각 노드의 위치와 크기를 계산하는 레이아웃 과정을 거칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 reflow 라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 페인팅 (Painting)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이아웃 단계 후 , 브라우저는 렌더 트리의 각 노드를 화면에 그리는 페인팅 과정을 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CRP 최적화&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRP를 최적화를 하기 위한 목적은 웹페이지를 가능한 빠르게 렌더링 하기 위해서 입니다.&lt;/p&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;b&gt;최적화 기법&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CSS와 JavaScript의 최소화 및 압축 : 파일의 크기를 줄여 빠른 로딩을 도와줍니다.&lt;/li&gt;
&lt;li&gt;인라인 CSS와 JavaScript의 사용 최소화 : 중요하지 않은 스타일이나 스크립트를 외부 파일로&lt;br /&gt;분리하여 초기 렌더링을 가속화&lt;/li&gt;
&lt;li&gt;비동기 스크립트 로딩 : async나 defer 속성을 이용하여 JavaScript의 실행을 지연시킴으로써 블로킹 방지&lt;/li&gt;
&lt;li&gt;중요한 CSS를 위쪽에 위치 : 페이지의 위쪽 부분을 빠르게 렌더링하려면 중요한 스타일을 HTML 문서의 상단에 위치 시켜야함.&lt;/li&gt;
&lt;li&gt;웹 폰트 최적화 : 웹 폰트의 로딩 지연을 방지하기 위해 필요한 스타일만 불러오거나, font-display 옵션을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;CSSOM&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-28 오후 11.27.01.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSCZr/btsL2AgnnjB/p2BKNvYX4YaL97Xiu2lBg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSCZr/btsL2AgnnjB/p2BKNvYX4YaL97Xiu2lBg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSCZr/btsL2AgnnjB/p2BKNvYX4YaL97Xiu2lBg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSCZr%2FbtsL2AgnnjB%2Fp2BKNvYX4YaL97Xiu2lBg1%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;1370&quot; height=&quot;592&quot; data-filename=&quot;스크린샷 2025-01-28 오후 11.27.01.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSSOM은 DOM의 CSS 버전으로 생각할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM이 HTML 문서의 구조화된 표현을 제공하는 것처럼, CSSOM은 CSS 스타일 시트의 구조화된 표현을&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;CSSOM의 주요 특징 및 개념&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 트리 구조 : CSSOM도 트리구조로 구성됩니다. 이 트리의 각 노드는 CSS 규칙을 나타내고,&lt;br /&gt;이 규칙들은 스타일 시트 내의 선택자. 속성 및 값에 해당됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 동적 : CSSOM도 DOM 처럼 동적입니다. 따라서 자바스크립트를 사용하여 실시간으로 CSSOM을 수정할 수 있고,&lt;br /&gt;화면에 즉시 반영됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 렌더링 블록 : 웹 브라우저가 페이지를 렌더링 할 때, CSSOM은 필수적입니다. 브라우저는 DOM과&lt;br /&gt;CSSOM을 합쳐서 렌더 트리를 생성하고, 이 트리를 기반으로 페이지의 레이아웃 및 페인트를 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 CSSOM이 완전히 생성되지 않으면 페이지 렌더링이 차단할수 있기 떄문에, CSS 자원 로딩 처리는 페이지의&lt;br /&gt;성능에 큰 영향을 미칠 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 자바스크립트으와의 상호 작용 : 자바스크립트를 사용하여 CSSOM에 접근하고 변경할 수 있습니다.&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;요약하면, DOM은 HTML 구조를, CSSOM은 스타일 구조를 나타내며, 두 요소는 페이지의 렌더링에 핵심적인 역할을 합니다. 효율적인 DOM/CSSOM 관리를 통해 성능 최적화가 가능합니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JS</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/34</guid>
      <comments>https://dmlwls7094.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 28 Jan 2025 23:36:32 +0900</pubDate>
    </item>
    <item>
      <title>자바 스크립트의 원시타입 그리고 참조 타입</title>
      <link>https://dmlwls7094.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 오늘은 자바스크립트의 원시타입 그리고 참조 타입의 차이에 대해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;JavaScript 변수 타입&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;자바스크립트의 원시(Primitive) 타입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 원시타입으로는 number, bigint, string, boolean, null, undefined, symbol&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 7개가 존재하며, 이들의 공통접은 object가 아니며 따로 메서드를 가지지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기서 symbol은 ES6에서 추가된 원시타입으로, 유일하고 변경 불가능한 값을 생성하는 데 사용됩니다.)&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;원시타입은 어떻게 작동할까요???&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 원시타입을 선언하면, 이는 스택에 저장됩니다.&amp;nbsp;&lt;br /&gt;스택이란, LIFO(Last In First Out) 구조를 가진 자료구조입니다. 저장된 원시타입은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식별자를 통해 접근할 수 있고, 원시 데이터와 함께 스택에 저장됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1738006360880&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const one = 10;

const two = 10;&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;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;같은 값을 가진 두 개의 변수가 선언 및 할당되었을 때,&lt;span&gt; o&lt;/span&gt;&lt;/span&gt;ne&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;값과 함께 스택에 푸시되고, 그 위에&lt;span&gt; t&lt;/span&gt;&lt;/span&gt;wo&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;span&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자바스크립트의 참조 타입&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조타입은 원시 타입을 제외한 타입들을 말합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체(Object)&lt;/li&gt;
&lt;li&gt;배열(Array)&lt;/li&gt;
&lt;li&gt;함수(Fuction)&lt;/li&gt;
&lt;li&gt;날짜(Date)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조타입은 객체를 가리키는 메모리 주소를 변수에 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말은 변수에는 객체의 실제 값이 아닌 해당 객체를 가리키는 위치가 저장이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 간에 참조복사가 이루어지며, 두 변수가 같은 객체를 참조하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JS</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/33</guid>
      <comments>https://dmlwls7094.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 28 Jan 2025 13:10:19 +0900</pubDate>
    </item>
    <item>
      <title>HTML 시멘틱 태그</title>
      <link>https://dmlwls7094.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 오늘은 html 시멘틱 태그에 대해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스팅하겠습니다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발 공부를 하면서 문서를 구조화하는 HTML 태그의 중요성을 느끼게 되었습니다. 특히 취업 준비를 위해 UI/UX 최적화와 접근성(Accessibility)에 대해 알아보던 중 **시맨틱 태그(Semantic Tag)**라는 개념이 눈에 들어왔습니다. HTML5에서 추가된 시맨틱 태그는 단순히 웹페이지의 구조를 정의하는 것뿐만 아니라, 검색 엔진 최적화(SEO), 접근성 향상, 유지 보수성에 있어서도 중요한 역할을 한다는 것을 알게 되었습니다. 그래서 시맨틱 태그의 필요성과 이를 활용하는 방법에 대해 깊이 알아보기로 했습니다.&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;b&gt;우선 시멘틱 태그란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 이름만으로 해당 태그가 담당하는 역할이나 의미를 명확히 알 수 있는 태그를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;lt;주요 시멘틱 태그&amp;gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;header&amp;gt; : 문서나 섹션의 머리글&lt;/li&gt;
&lt;li&gt;&amp;lt;footer&amp;gt; : 문서나 섹션의 바닥글&lt;/li&gt;
&lt;li&gt;&amp;lt;nav&amp;gt; : 내비게이션 링크를 그룹화&lt;/li&gt;
&lt;li&gt;&amp;lt;section&amp;gt; : 문서의 주제별 콘텐츠 섹션&lt;/li&gt;
&lt;li&gt;&amp;lt;article&amp;gt;: 독립적으로 배포 가능한 콘텐츠&lt;/li&gt;
&lt;li&gt;&amp;lt;aside&amp;gt;: 본문과 별개로 참조할 수 있는 콘텐츠&lt;/li&gt;
&lt;li&gt;&amp;lt;main&amp;gt;:문서의 주요 콘텐츠 영역&lt;/li&gt;
&lt;li&gt;&amp;lt;figure&amp;gt; 및 &amp;lt;figcaption&amp;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;스크린샷 2025-01-25 오후 4.46.33.png&quot; data-origin-width=&quot;1886&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4ZG6M/btsL18qtHsd/OytBUGdiMOVQTc1kzj4Vh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4ZG6M/btsL18qtHsd/OytBUGdiMOVQTc1kzj4Vh0/img.png&quot; data-alt=&quot;출처 : https://seo.tbwakorea.com/blog/what-is-semantic-tag/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4ZG6M/btsL18qtHsd/OytBUGdiMOVQTc1kzj4Vh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4ZG6M%2FbtsL18qtHsd%2FOytBUGdiMOVQTc1kzj4Vh0%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;661&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2025-01-25 오후 4.46.33.png&quot; data-origin-width=&quot;1886&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://seo.tbwakorea.com/blog/what-is-semantic-tag/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-25 오후 4.49.06.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPNAcE/btsL19CUhEM/kNFGPQZy2hjMj3KK9zW3A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPNAcE/btsL19CUhEM/kNFGPQZy2hjMj3KK9zW3A1/img.png&quot; data-alt=&quot;https://www.semrush.com/blog/semantic-html5-guide/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPNAcE/btsL19CUhEM/kNFGPQZy2hjMj3KK9zW3A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPNAcE%2FbtsL19CUhEM%2FkNFGPQZy2hjMj3KK9zW3A1%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;345&quot; height=&quot;408&quot; data-filename=&quot;스크린샷 2025-01-25 오후 4.49.06.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;1436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.semrush.com/blog/semantic-html5-guide/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시맨틱 태그가 중요한 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;b&gt;SEO 최적화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 엔진은 시맨틱 태그를 활용해 웹페이지의 콘텐츠 구조를 분석합니다. 적절한 시맨틱 태그를 사용하면 검색 엔진이 페이지의 내용을 더 잘 이해할 수 있어 검색 순위 상승에 유리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;b&gt;웹 접근성(Accessibility)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크린 리더와 같은 보조 기술은 시맨틱 태그를 통해 페이지의 구조를 사용자가 쉽게 이해할 수 있도록 돕습니다. 이는 장애를 가진 사용자들에게 웹을 더 친화적으로 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;b&gt;코드 가독성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 자체가 의미를 가지므로, 협업 과정에서 다른 개발자가 코드를 읽고 이해하기 쉽습니다. 유지 보수에도 큰 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;b&gt;미래 확장성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시맨틱 태그는 웹 표준을 준수하므로, 브라우저의 업데이트나 새로운 기술 등장 시에도 비교적 오래 사용할 수 있는 구조를 제공합니다.&lt;/p&gt;</description>
      <category>HTML</category>
      <author>의진이다람쥐</author>
      <guid isPermaLink="true">https://dmlwls7094.tistory.com/32</guid>
      <comments>https://dmlwls7094.tistory.com/32#entry32comment</comments>
      <pubDate>Sat, 25 Jan 2025 17:29:46 +0900</pubDate>
    </item>
  </channel>
</rss>