<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Debelloper</title>
    <link>https://bellori.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 20 Jul 2026 17:12:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>BELLORI</managingEditor>
    <image>
      <title>Debelloper</title>
      <url>https://tistory1.daumcdn.net/tistory/6672476/attach/6333e5b36c3e4425a47def8587640ff1</url>
      <link>https://bellori.tistory.com</link>
    </image>
    <item>
      <title>&amp;quot;remote: Repository not found.&amp;quot; 에러 해결</title>
      <link>https://bellori.tistory.com/entry/remote-Repository-not-found-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xjDaM/btsGkt2fyap/HgPWWLx4fkLzPPncYEi0m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xjDaM/btsGkt2fyap/HgPWWLx4fkLzPPncYEi0m1/img.png&quot; data-alt=&quot;push 진행 시 에러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xjDaM/btsGkt2fyap/HgPWWLx4fkLzPPncYEi0m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxjDaM%2FbtsGkt2fyap%2FHgPWWLx4fkLzPPncYEi0m1%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;982&quot; height=&quot;56&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;push 진행 시 에러&lt;/figcaption&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;학습용으로 private 저장소를 만들고 push를 하려니까 에러가 났다.&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;먼저 $ git remote -v 로 확인을 해보았다. url도 정상적으로 잘 들어가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색을 해보니 $&amp;nbsp;git&amp;nbsp;remote&amp;nbsp;set-url&amp;nbsp;origin&amp;nbsp;&lt;a href=&quot;https://계정이름@github.com/~~~&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://계정이름@github.com/~~~&lt;/a&gt; 로 remote url을 새로 세팅해보라는 글이 있어 혹시 몰라 다시 세팅 후 push를 시도해 보았지만 에러는 그대로였다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JIj5G/btsGkvltgZ5/xxOeU9XWOzKhNzs5H9bbs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JIj5G/btsGkvltgZ5/xxOeU9XWOzKhNzs5H9bbs0/img.png&quot; data-alt=&quot;제어판 &amp;amp;gt; 사용자 계정 &amp;amp;gt; 자격 증명 관리자 &amp;amp;gt; Windows 자격 증명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JIj5G/btsGkvltgZ5/xxOeU9XWOzKhNzs5H9bbs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJIj5G%2FbtsGkvltgZ5%2FxxOeU9XWOzKhNzs5H9bbs0%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;994&quot; height=&quot;300&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제어판 &amp;gt; 사용자 계정 &amp;gt; 자격 증명 관리자 &amp;gt; Windows 자격 증명&lt;/figcaption&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;Windows 자격 증명에 들어가면 '일반 자격 증명'이라고 되어있는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트를 확인해보면 git:https://github.com으로 되어있는 증명이 확인되는데 펼쳐보면 아래와 같이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VrQhr/btsGkngInpF/KiR8lIyGzcQqKMB6OBTE50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VrQhr/btsGkngInpF/KiR8lIyGzcQqKMB6OBTE50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VrQhr/btsGkngInpF/KiR8lIyGzcQqKMB6OBTE50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVrQhr%2FbtsGkngInpF%2FKiR8lIyGzcQqKMB6OBTE50%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;888&quot; height=&quot;234&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;234&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;저기 사용자 이름에 붉은색으로 마킹한 곳에 적혀있는 사용자 이름과 내가 push하려는 저장소가 있는 github 계정 이름과 불일치하여 push가 되지 않았다.&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-origin-width=&quot;626&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDfoJ0/btsGmvkiIl9/dwv2A8P5U2d03Ov0qdjvok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDfoJ0/btsGmvkiIl9/dwv2A8P5U2d03Ov0qdjvok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDfoJ0/btsGmvkiIl9/dwv2A8P5U2d03Ov0qdjvok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDfoJ0%2FbtsGmvkiIl9%2Fdwv2A8P5U2d03Ov0qdjvok%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;626&quot; height=&quot;539&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;539&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;해당 자격 증명을 제거하고 다시 push를 시도하니 github에 다시 로그인을 하라고 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 원인을 알았으니 사용자 이름과 github 계정 이름과 일치하게끔 로그인 하니 정상적으로 push가 되었다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>dev</category>
      <category>development</category>
      <category>git</category>
      <category>Github</category>
      <category>개발</category>
      <category>에러</category>
      <category>트러블슈팅</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/33</guid>
      <comments>https://bellori.tistory.com/entry/remote-Repository-not-found-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0#entry33comment</comments>
      <pubDate>Thu, 4 Apr 2024 11:03:31 +0900</pubDate>
    </item>
    <item>
      <title>UX 향상을 위한 Skeleton 라이브러리 사용하기 (React &amp;amp; Tailwind CSS)</title>
      <link>https://bellori.tistory.com/entry/React-Tailwind-CSS%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-Skeleton-UI-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Situation&lt;/b&gt;&lt;/h2&gt;
&lt;div id=&quot;mttContainer&quot; class=&quot;notranslate&quot; style=&quot;transform: translate(35px, 8px);&quot; aria-expanded=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경찰청 공공 API를 활용한 분실물/유실물 찾기 서비스 제작 프로젝트 진행 중 메인 화면에 거슬리는 것이 하나 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주인을 찾아요 아래에 최근 습득물을 보여주는 UI가 서버에서 데이터를 받아오는 동안 화면에 보이지 않았다가 뒤늦게 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0.gif&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV3fev/btsFJsvXNIz/r219KrqdKwktqFAaAHcWK0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV3fev/btsFJsvXNIz/r219KrqdKwktqFAaAHcWK0/img.gif&quot; data-alt=&quot;기다리면 갑자기 UI가 나타남&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV3fev/btsFJsvXNIz/r219KrqdKwktqFAaAHcWK0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bV3fev/btsFJsvXNIz/r219KrqdKwktqFAaAHcWK0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;517&quot; data-filename=&quot;0.gif&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기다리면 갑자기 UI가 나타남&lt;/figcaption&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Task&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 나름 사용자를 위해서 만든 기능인지라, 저곳에 무언가가 있다는 것을 사용자에게 인식시켜 줄 필요가 있었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Action&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBh4i9/btsFIvfoRs1/59KfnPdwT3XK3sq8HLWPkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBh4i9/btsFIvfoRs1/59KfnPdwT3XK3sq8HLWPkK/img.png&quot; data-alt=&quot;출처: Tailwind CSS 공홈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBh4i9/btsFIvfoRs1/59KfnPdwT3XK3sq8HLWPkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBh4i9%2FbtsFIvfoRs1%2F59KfnPdwT3XK3sq8HLWPkK%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;361&quot; height=&quot;149&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: Tailwind CSS 공홈&lt;/figcaption&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;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;데이터가 비동기적으로 로드되는 동안 사용자에게 빈 화면을 보여주는 대신, 컨텐츠가 로드될 위치에 스켈레톤 스크린(skeleton screens)이라고 불리는 플레이스홀더를 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 플레이스홀더는 일반적으로 컨텐츠의 형태와 유사한 라인, 사각형, 원 등으로 구성되어 있고 애니메이션 효과를 통해 데이터가 로딩 중임을 나타낸다. &lt;br /&gt;&lt;br /&gt;스켈레톤&amp;nbsp;라이브러리의&amp;nbsp;주요&amp;nbsp;목적은&amp;nbsp;사용자&amp;nbsp;경험(UX)을&amp;nbsp;향상시키는&amp;nbsp;것이다.&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;따라서 현재 문제를 해결하기 위해서는 가장 안성맞춤인 셈이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;23.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F8dbg/btsFLtUHmXQ/ppV6ZgaCKOnlwDlWgPk6vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F8dbg/btsFLtUHmXQ/ppV6ZgaCKOnlwDlWgPk6vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F8dbg/btsFLtUHmXQ/ppV6ZgaCKOnlwDlWgPk6vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF8dbg%2FbtsFLtUHmXQ%2FppV6ZgaCKOnlwDlWgPk6vK%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;349&quot; height=&quot;154&quot; data-filename=&quot;23.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;154&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;스켈레톤 스크린은 실제 컨텐츠의 레이아웃과 유사하게 디자인해서 UI의 일관성을 유지해야 한다.&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;Skeleton.tsx&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710251134615&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Skeleton: React.FC = () =&amp;gt; {
  return (
    &amp;lt;div className=&quot;mb-12px flex h-140px w-335px items-center justify-between rounded-20px bg-white pl-20px pr-10px shadow&quot;&amp;gt;
      &amp;lt;div className=&quot;flex-grow space-y-3&quot;&amp;gt;
        &amp;lt;div className=&quot;h-26px w-128px animate-pulse rounded bg-slate-200&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div className=&quot;h-21px w-61px animate-pulse rounded-full bg-slate-200&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div className=&quot;h-16px w-46px animate-pulse rounded bg-slate-200&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div className=&quot;h-16px w-77px animate-pulse rounded bg-slate-200&quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div
        className={`animate-shimmer h-120px w-120px animate-pulse rounded-14px bg-slate-200`}
      &amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Skeleton;&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;ske.gif&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3LcsB/btsFJ7kzgQa/roKO01umWKkIYpAUoKUKV1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3LcsB/btsFJ7kzgQa/roKO01umWKkIYpAUoKUKV1/img.gif&quot; data-alt=&quot;완성된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3LcsB/btsFJ7kzgQa/roKO01umWKkIYpAUoKUKV1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b3LcsB/btsFJ7kzgQa/roKO01umWKkIYpAUoKUKV1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;148&quot; data-filename=&quot;ske.gif&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;148&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;꽤 비슷한 모양으로 레이아웃을 짰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션이 작동 중임을 알려주기 위해서 Tailwind CSS에서 제공하는 &lt;a href=&quot;https://tailwindcss.com/docs/animation#pulse&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;animation-pulse&lt;/a&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;그 다음은 이렇게 완성한 Skeleton 컴포넌트를 적용시킬 일만 남았다.&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;SwiperItem.tsx&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710251574374&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
import { useEffect, useState } from 'react';
import Skeleton from './Skeleton';

...

const SwiperItem: React.FC = () =&amp;gt; {
  ...
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() =&amp;gt; {
    (async () =&amp;gt; {
      setIsLoading(true);
      ...
      setIsLoading(false);
    })();
  }, []);

  if (isLoading) {
    return &amp;lt;Skeleton /&amp;gt;;
  }

  return (
    ... // Swiper가 적용될 코드
  );
};

export default SwiperItem;&lt;/code&gt;&lt;/pre&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;useState를 사용하여 상태를 관리하고 비동기 통신 코드에서 setter 함수에 true로 지정하고 데이터 통신을 다 받아오면 setter 함수에 false 값을 지정하였다.&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;그 아래에 if문을 사용하여 isLoading이 true인 경우 Skeleton 컴포넌트를 내뱉도록 하였다.&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;이렇게 하면 스켈레톤 UI가 실제 UI가 들어갈 자리를 차지하고 있다가 데이터를 다 받아오면 setter 함수에 의해 false가 되어 스켈레톤 UI는 사라지고 실제 UI가 들어간다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Result&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ske2.gif&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1bsCF/btsFJGAI22S/lYFm07Mu8VLKEmvNy9z9Gk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1bsCF/btsFJGAI22S/lYFm07Mu8VLKEmvNy9z9Gk/img.gif&quot; data-alt=&quot;스켈레톤 UI가 적용된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1bsCF/btsFJGAI22S/lYFm07Mu8VLKEmvNy9z9Gk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/1bsCF/btsFJGAI22S/lYFm07Mu8VLKEmvNy9z9Gk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;528&quot; data-filename=&quot;ske2.gif&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스켈레톤 UI가 적용된 모습&lt;/figcaption&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;레이아웃을 일치시켜 이질감을 없애는 데 신경을 썼다.&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;</description>
      <category>Development</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/31</guid>
      <comments>https://bellori.tistory.com/entry/React-Tailwind-CSS%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-Skeleton-UI-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0#entry31comment</comments>
      <pubDate>Tue, 12 Mar 2024 23:03:19 +0900</pubDate>
    </item>
    <item>
      <title>이전 상태(previous state) 기반 업데이트</title>
      <link>https://bellori.tistory.com/entry/%EC%9D%B4%EC%A0%84-%EC%83%81%ED%83%9Cprevious-state-%EA%B8%B0%EB%B0%98-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8</link>
      <description>&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;이는 React에게 상태 값을 단순히 교체하는 대신 &amp;ldquo;이전 상태&amp;rdquo;를 기반으로 무언가를 수행하도록 지시하는 방법이다.&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;예를 들어 장바구니의 담겨있는 동일 상품을 하나가 아닌 여러 개를 사고 싶어 + 버튼을 통해 이전 수량에서 1씩 추가를 해야 한다고 가정을 해보자.&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;상품 데이터가 있는 json 파일을 먼저 만들어준다.&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;[product.json]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;{
  &quot;id&quot;: &quot;nf-uni-padding&quot;,
  &quot;imageSrc&quot;: &quot;NFPadding.jpg&quot;,
  &quot;imageAlt&quot;: &quot;검정색 노스페이스 남여공용 패딩&quot;,
  &quot;name&quot;: &quot;노스페이스 패딩&quot;,
  &quot;birthday&quot;: &quot;2022-1-21&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 노스페이스 패딩 제품이 장바구니에 담겨있다고 가정하고 수량을 추가해보는 부분만 구현해보자.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;import { useState } from 'react';
import { getStaticImage } from '../utils'; // 이미지 경로 설정 함수
import productData from '../data/product.json';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 상태 관리를 위해 useState 를 불러온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ getStaticImage 유틸 함수는 인수에 파일명을 넣어주면 images 폴더에 저장되어 있는 이미지 중 일치하는 이미지를 가져오는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 위에서 만든 상품 정보가 담겨있는 json 파일을 productData 이름으로 가져와서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const [product, setProduct] = useState(0);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 초깃값은 0으로 설정해주고 state 변수 이름은 product 로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(상품의 개수가 담겨있는 거라 네이밍이 적절치 않지만 예제로 만든거니 대충 넘어가자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 상품 개수를 업데이트 해주는 setter 함수의 이름은 setProduct 로 설정한다.&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 class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const handleIncreaseProduct = () =&amp;gt; {
  setProduct(product + 1);
};&lt;/code&gt;&lt;/pre&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;귀찮은 사용자가 있다는 가정을 하고 학습에 대한 이해를 위해 2개씩 늘리는 코드를 작성하였다고 가정해보자.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const handleDoubleIncreaseProduct = () =&amp;gt; {
  setProduct(product + 1); // 0 + 1
  setProduct(product + 1); // 0 + 1
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 이 핸들러는 setProduct(product + 1); 를 두 번 호출하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 만약 해당 함수를 실행할 경우 product 의 값이 2가 아닌 1로 표시된다.&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;이 문제는 새로운 값 업데이트의 주의사항에서 다룬 내용과 비슷한데 setter 함수를 호출해도 이미 실행 중인 코드의 상태 변수가 업데이트 되지 않기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 각 호출은 setProduct(1) 이 되는 것이다.&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;이 문제를 해결하려면 다음 상태 대신 setProduct 에 업데이트 함수를 전달하면 된다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const handleDoubleIncreaseProduct = () =&amp;gt; {
  setProduct((product) =&amp;gt; product + 1); // setProduct(0 =&amp;gt; 1)
  setProduct((product) =&amp;gt; product + 1); // setProduct(1 =&amp;gt; 2)
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 해당 코드는 이전 상태 를 기반으로 업데이트를 시도한다. 다시 말해 여러 번 상태를 업데이트 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ (product) product + 1 이 함수는 업데이트 함수이다.&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;이 안에서는 보류 상태(pending state)를 가져와서 다음 상태를 계산한다.&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;그리고 나서 다음 렌더링 중에 동일한 순서로 호출한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 (product) product + 1 은 보류 상태로 0을 받고 다음 상태로 1을 반환한다.&lt;/li&gt;
&lt;li&gt;그 다음 (product) product + 1 은 보류 상태로 1을 받고 다음 상태로 2를 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정으로 대기 중인 다른 업데이트가 없어 React는 결국 현재 상태(current state)로 2를 저장하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;return (
	&amp;lt;&amp;gt;
    &amp;lt;figcaption&amp;gt;
      &amp;lt;img
        height={250}
        width={250}
        src={getStaticImage(productData.imageSrc)}
        alt={productData.imageAlt}
      /&amp;gt;
      &amp;lt;span&amp;gt;수량 {product}&amp;lt;/span&amp;gt;
      &amp;lt;button
        type=&quot;button&quot;
        aria-label=&quot;상품 수량 1 증가&quot;
        onClick={handleIncreaseProduct}
      &amp;gt;
        1개씩 더 담기 +
      &amp;lt;/button&amp;gt;
      &amp;lt;button
        type=&quot;button&quot;
        aria-label=&quot;상품 수량 2 증가&quot;
        onClick={handleDoubleIncreaseProduct}
      &amp;gt;
        2개씩 더 담기 +
      &amp;lt;/button&amp;gt;
    &amp;lt;/figcaption&amp;gt;
  &amp;lt;/&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;span 요소에는 장바구니에 담긴 상품의 수량이 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 버튼은 onClick 이벤트를 걸어 handleIncreaseProduct 핸들러를 참조한다.&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;두 번째 버튼에도 마찬가지도 onClick 이벤트를 걸어 handleDoubleIncreaseProduct 핸들러를 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(상품이 2개씩 증가)&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;span data-token-index=&quot;0&quot;&gt;[렌더링 결과]&lt;/span&gt; &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;ㅋㅋ.gif&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AA8Jx/btsEeMIima0/OmwElP0SI6fHK9CY9QGlPK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AA8Jx/btsEeMIima0/OmwElP0SI6fHK9CY9QGlPK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AA8Jx/btsEeMIima0/OmwElP0SI6fHK9CY9QGlPK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/AA8Jx/btsEeMIima0/OmwElP0SI6fHK9CY9QGlPK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;291&quot; data-filename=&quot;ㅋㅋ.gif&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;291&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;[JSX 파일 전체 코드]&lt;/p&gt;
&lt;pre id=&quot;code_1706633770685&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from 'react';
import { getStaticImage } from '../utils'; // 이미지 경로 설정 함수
import productData from '../data/product.json';

function Cart() {
    const [product, setProduct] = useState(0);

    const handleIncreaseProduct = () =&amp;gt; {
      setProduct(product + 1);
    };
    
    const handleDoubleIncreaseProduct = () =&amp;gt; {
      setProduct((product) =&amp;gt; product + 1); // setProduct(0 =&amp;gt; 1)
      setProduct((product) =&amp;gt; product + 1); // setProduct(1 =&amp;gt; 2)
    };
    
    return (
        &amp;lt;&amp;gt;
        &amp;lt;figcaption&amp;gt;
          &amp;lt;img
            height={250}
            width={250}
            src={getStaticImage(productData.imageSrc)}
            alt={productData.imageAlt}
          /&amp;gt;
          &amp;lt;span&amp;gt;수량 {product}&amp;lt;/span&amp;gt;
          &amp;lt;button
            type=&quot;button&quot;
            aria-label=&quot;상품 수량 1 증가&quot;
            onClick={handleIncreaseProduct}
          &amp;gt;
            1개씩 더 담기 +
          &amp;lt;/button&amp;gt;
          &amp;lt;button
            type=&quot;button&quot;
            aria-label=&quot;상품 수량 2 증가&quot;
            onClick={handleDoubleIncreaseProduct}
          &amp;gt;
            2개씩 더 담기 +
          &amp;lt;/button&amp;gt;
        &amp;lt;/figcaption&amp;gt;
      &amp;lt;/&amp;gt;
    );
}

export default Cart;&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;a href=&quot;https://react.dev/reference/react/useState#updating-state-based-on-the-previous-state&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://react.dev/reference/react/useState#updating-state-based-on-the-previous-state&lt;/a&gt;&lt;/p&gt;</description>
      <category>Development</category>
      <category>development</category>
      <category>ECMAScript</category>
      <category>javascript</category>
      <category>JS</category>
      <category>react</category>
      <category>개발</category>
      <category>리액트</category>
      <category>자바스크립트</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/28</guid>
      <comments>https://bellori.tistory.com/entry/%EC%9D%B4%EC%A0%84-%EC%83%81%ED%83%9Cprevious-state-%EA%B8%B0%EB%B0%98-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8#entry28comment</comments>
      <pubDate>Wed, 31 Jan 2024 01:51:23 +0900</pubDate>
    </item>
    <item>
      <title>React의 작동 흐름 (공식 문서 해설)</title>
      <link>https://bellori.tistory.com/entry/React%EC%9D%98-%EC%9E%91%EB%8F%99-%ED%9D%90%EB%A6%84-%EA%B3%B5%EC%8B%9D-%EB%AC%B8%EC%84%9C-%ED%95%B4%EC%84%A4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2052&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laRON/btsD4rMvIGN/2C4MyksNrEUxVZicXp98lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laRON/btsD4rMvIGN/2C4MyksNrEUxVZicXp98lK/img.png&quot; data-alt=&quot;React의 작동 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laRON/btsD4rMvIGN/2C4MyksNrEUxVZicXp98lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaRON%2FbtsD4rMvIGN%2F2C4MyksNrEUxVZicXp98lK%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;417&quot; height=&quot;428&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2052&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;React의 작동 흐름&lt;/figcaption&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;React의 작동 흐름은 크게 네 가지 단계로 나누어진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mount: 컴포넌트가 새롭게 생성되는 단계이다. 컴포넌트 함수가 실행되고 결과물로 나온 Element들이 가상 DOM에 삽입되고 실제 DOM을 업데이트하기까지의 과정이다.&lt;/li&gt;
&lt;li&gt;Trigger: 렌더링을 유발한다. 앱 시작 초기 또는 state의 변경이 있을 때(re-render)에 해당한다.&lt;/li&gt;
&lt;li&gt;Render: 브라우저 DOM에 반영될 요소를 계산하는 단계이다. 브라우저 DOM에 업데이트 하기 전에 가상돔을 조작하여 업데이트할 모양을 만들어 내는 단계이다. 가상돔을 통해 업데이트를 미리 실행하는 이유는 브라우저 DOM을 직접 조작하는 비용(repaint, reflow)가 크기 때문이다. 초기 렌더라면 루트 컴포넌트를 호출하여 전체 엘리먼트에 대한 가상돔을 만들지만, Re-render의 경우 이전 렌더와 비교하여 변화가 있는 컴포넌트를 호출한다.&lt;/li&gt;
&lt;li&gt;Commit: Render 단계를 통해 호출된 컴포넌트들이 브라우저 DOM에 적영되는 단계이다. Render 단계에서 변화가 있던 부분만 DOM에 마운트되고 라이프 사이클을 실행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 React의 작동 흐름은 사용자와 상호작용하며 동적으로 UI를 업데이트 한다.&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;a href=&quot;https://react.dev/learn/render-and-commit&quot;&gt;참고&lt;/a&gt;)&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는 고객(사용자)의 요청을 접수하고 주문을 전달하는 웨이터로 비유한다.&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;UI를 요청하고 제공하는 프로세스는 크게 세 단계로 구성된다.&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-origin-width=&quot;2000&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ben1R/btsD3pn54Qo/aVbMSpIWQdoCGVBlDHkpw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ben1R/btsD3pn54Qo/aVbMSpIWQdoCGVBlDHkpw0/img.png&quot; data-alt=&quot;Illustrated by Rachel Lee Nabors&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ben1R/btsD3pn54Qo/aVbMSpIWQdoCGVBlDHkpw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBen1R%2FbtsD3pn54Qo%2FaVbMSpIWQdoCGVBlDHkpw0%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;578&quot; height=&quot;205&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Illustrated by Rachel Lee Nabors&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계, 렌더링 트리거 (&lt;b&gt;Triggering&lt;/b&gt;&amp;nbsp;a render) : 손님의 주문을 받고 주방으로 전달&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트가 렌더링이 되는 이유는 두 가지가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기 렌더링&lt;/b&gt;&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;createRoot 대상 DOM 노드를 호출한 뒤 render 메서드를 사용하여 해당 컴포넌트를 렌더링 한다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// Greeting.jsx
const Greeting = () =&amp;gt; {
	return &amp;lt;h1&amp;gt;환영합니다!&amp;lt;/h1&amp;gt;
}

export default Greeting;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// main.jsx
import Greeting from './Greeting.jsx';
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';

const root = createRoot(document.getElementById(&quot;root&quot;));

root.render(
	&amp;lt;StrictMode&amp;gt;
		&amp;lt;Greeting /&amp;gt;
	&amp;lt;/StrictMode&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-origin-width=&quot;2000&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm7zHh/btsEaNOvXhZ/VXkeaGki6AfSSaJpse1JBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm7zHh/btsEaNOvXhZ/VXkeaGki6AfSSaJpse1JBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm7zHh/btsEaNOvXhZ/VXkeaGki6AfSSaJpse1JBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm7zHh%2FbtsEaNOvXhZ%2FVXkeaGki6AfSSaJpse1JBK%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;2000&quot; height=&quot;642&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;642&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;컴포넌트 또는 상위 항목의 state가 업데이트 되어 다시 렌더링(리렌더)를 하는 경우&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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-origin-width=&quot;2000&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u1NXb/btsEbzPLoYB/ObRQhMwfuUwwnKXemPnoO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u1NXb/btsEbzPLoYB/ObRQhMwfuUwwnKXemPnoO1/img.png&quot; data-alt=&quot;Illustrated by Rachel Lee Nabors&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u1NXb/btsEbzPLoYB/ObRQhMwfuUwwnKXemPnoO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu1NXb%2FbtsEbzPLoYB%2FObRQhMwfuUwwnKXemPnoO1%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;560&quot; height=&quot;216&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Illustrated by Rachel Lee Nabors&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트가 처음 렌더링 되면 set 함수를 통해 state를 업데이트하여 추가 렌더링을 트리거 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트의 state를 업데이트하면 렌더링이 자동으로 큐(queue)에 추가된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계, 컴포넌트 렌더링 (&lt;b&gt;Rendering&lt;/b&gt;&amp;nbsp;the component) : 주방에서 주문한 음식을 준비&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React가 구성 요소를 렌더링하는 단계이다.&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;ㄴ &amp;ldquo;렌더링&amp;rdquo;은 React가 컴포넌트를 호출하는 것이다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// Greeting.jsx
const Greeting = () =&amp;gt; {
  return (
    &amp;lt;section&amp;gt;
      &amp;lt;h1&amp;gt;환영합니다!&amp;lt;/h1&amp;gt;
      &amp;lt;DuckImage /&amp;gt;
      &amp;lt;DuckImage /&amp;gt;
      &amp;lt;DuckImage /&amp;gt;
    &amp;lt;/section&amp;gt;
  );
};

const DuckImage = () =&amp;gt; {
  return (
    &amp;lt;img
      src=&quot;https://www.shutterstock.com/image-vector/cute-cartoon-rubber-duck-vector-600nw-2276837591.jpg&quot;
      alt=&quot;DuckImage&quot;
      width=&quot;50px&quot;
      height=&quot;50px&quot;
      style={{
        margin: 8,
      }}
    /&amp;gt;
  );
};

export default Greeting;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b11nRw/btsD9A9J1Ny/Be8C93dEkWXNQIL14Dzy1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b11nRw/btsD9A9J1Ny/Be8C93dEkWXNQIL14Dzy1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b11nRw/btsD9A9J1Ny/Be8C93dEkWXNQIL14Dzy1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb11nRw%2FbtsD9A9J1Ny%2FBe8C93dEkWXNQIL14Dzy1k%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;189&quot; height=&quot;129&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기 렌더링 시 React는 루트 컴포넌트를 호출한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 &amp;lt;section&amp;gt; &amp;lt;h1&amp;gt; &amp;lt;img&amp;gt; 세 개의 태그에 대한 DOM 노드를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이후의 렌더링에서 React는 렌더를 트리거한 상태 업데이트의 함수 컴포넌트를 호출한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 렌더링을 하는 동안 React는 이전 렌더링 이후 변경된 속성이 있는지 계산한다.&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;업데이트된 컴포넌트가 다른 컴포넌트를 반환하면 React는 그 다음에 해당 컴포넌트를 렌더링하고 만약 그 컴포넌트도 무언가를 반환하면 그 다음에 렌더링하는 식이다.&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;이 프로세스는 중첩된(nesting) 컴포넌트가 없을 때까지 반복되고 React는 화면에 정확히 어떤 내용을 표시해야 하는지 파악하게 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계, DOM에 커밋 (&lt;b&gt;Committing&lt;/b&gt;&amp;nbsp;to the DOM) : 테이블 위에 주문한 음식을 배치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 DOM에 변경 사항을 커밋한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 컴포넌트를 렌더링(호출)한 후 React는 DOM을 수정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기 렌더링의 경우&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 appendChild() DOM API를 사용하여 생성된 모든 DOM 노드를 화면에 배치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ appenChild() 메서드는 노드를 특정 부모 노드의 자식 노드 리스트 중 마지막 자식으로 붙이는 메서드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;재렌더링(re-renders)의 경우&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 렌더링할 때 React는 DOM이 최신 렌더링 출력과 일치하도록 최소한의 필수 작업을 적용한다.&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;React는 렌더링 간에 차이가 있는 경우에만 DOM 노드를 변경한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;브라우저 렌더링&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링이 완료되고 React가 DOM을 업데이트 한 후 브라우저는 화면을 다시 칠한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로세스를 &amp;ldquo;브라우저 렌더링&amp;rdquo;이라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAIWDL/btsEbGuAxrb/WFgNpqVuYOCBykupWLOVrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAIWDL/btsEbGuAxrb/WFgNpqVuYOCBykupWLOVrk/img.png&quot; data-alt=&quot;Illustrated by Rachel Lee Nabors&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAIWDL/btsEbGuAxrb/WFgNpqVuYOCBykupWLOVrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAIWDL%2FbtsEbGuAxrb%2FWFgNpqVuYOCBykupWLOVrk%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;489&quot; height=&quot;318&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Illustrated by Rachel Lee Nabors&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development</category>
      <category>development</category>
      <category>ECMAScript</category>
      <category>javascript</category>
      <category>JS</category>
      <category>react</category>
      <category>개발</category>
      <category>리액트</category>
      <category>자바스크립트</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/27</guid>
      <comments>https://bellori.tistory.com/entry/React%EC%9D%98-%EC%9E%91%EB%8F%99-%ED%9D%90%EB%A6%84-%EA%B3%B5%EC%8B%9D-%EB%AC%B8%EC%84%9C-%ED%95%B4%EC%84%A4#entry27comment</comments>
      <pubDate>Tue, 30 Jan 2024 03:02:23 +0900</pubDate>
    </item>
    <item>
      <title>웹 컴포넌트(Web Component) API - 슬롯(Slot)</title>
      <link>https://bellori.tistory.com/entry/%EC%9B%B9-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8Web-Component-API-%EC%8A%AC%EB%A1%AFSlot</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Web Component&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 컴포넌트는 코드들을 캡슐화하여 재사용 가능한 커스텀 엘리먼트를 생성하고 웹 앱에서 활용할 수 있도록 해주는 다양한 기술들의 모음이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;슬롯(Slot)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 컴포넌트의 여러 기술들 중 HTML 템플릿에는 &amp;lsquo;template&amp;rsquo;과 &amp;lsquo;slot&amp;rsquo; 엘리먼트가 있다.&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;HTML &amp;lsquo;slot&amp;rsquo; 요소는 웹 컴포넌트 사용자가 자신만의 마크업으로 채워 별도의 DOM 트리를 생성하고 컴포넌트와 함께 표현할 수 있는 웹 컴포넌트 내부의 placeholder이다.&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;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;template id=&quot;my-component&quot;&amp;gt;
	&amp;lt;slot name=&quot;header&quot;&amp;gt;&amp;lt;/slot&amp;gt;
	&amp;lt;slot name=&quot;footer&quot;&amp;gt;&amp;lt;/slot&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ 템플릿 작성&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;my-component&amp;gt;
	&amp;lt;h1 slot=&quot;header&quot;&amp;gt;이것은 외부에서 넘어온 헤더입니다.&amp;lt;/h1&amp;gt;
  &amp;lt;footer slot=&quot;footer&quot;&amp;gt;이것은 외부에서 넘어온 푸터입니다.&amp;lt;/footer&amp;gt;
&amp;lt;/my-component&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴ slot의 name 속성을 활용해 해당 위치에 외부 콘텐츠를 넘길 수 있다.&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-origin-width=&quot;2000&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujUzC/btsDW9Sgr5I/K1ULk66FJkgHjuQkxqoNpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujUzC/btsDW9Sgr5I/K1ULk66FJkgHjuQkxqoNpk/img.png&quot; data-alt=&quot;자바스크립트 없이 HTML만으로 작성한 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujUzC/btsDW9Sgr5I/K1ULk66FJkgHjuQkxqoNpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujUzC%2FbtsDW9Sgr5I%2FK1ULk66FJkgHjuQkxqoNpk%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;2000&quot; height=&quot;835&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자바스크립트 없이 HTML만으로 작성한 코드&lt;/figcaption&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-origin-width=&quot;2000&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpCUDa/btsDZLQEG9a/Z4vLQZpUUz2LDJ8n2kcgC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpCUDa/btsDZLQEG9a/Z4vLQZpUUz2LDJ8n2kcgC0/img.png&quot; data-alt=&quot;랜더링 된 화면 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpCUDa/btsDZLQEG9a/Z4vLQZpUUz2LDJ8n2kcgC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpCUDa%2FbtsDZLQEG9a%2FZ4vLQZpUUz2LDJ8n2kcgC0%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;2000&quot; height=&quot;417&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;417&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;p data-ke-size=&quot;size16&quot;&gt;template는 브라우저가 태그의 내용은 인식하지만 화면에 랜더링 하지 않는다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>development</category>
      <category>fe</category>
      <category>front-end</category>
      <category>HTML</category>
      <category>slot</category>
      <category>Web</category>
      <category>개발</category>
      <category>슬롯</category>
      <category>웹</category>
      <category>프론트엔드</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/26</guid>
      <comments>https://bellori.tistory.com/entry/%EC%9B%B9-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8Web-Component-API-%EC%8A%AC%EB%A1%AFSlot#entry26comment</comments>
      <pubDate>Thu, 25 Jan 2024 17:40:55 +0900</pubDate>
    </item>
    <item>
      <title>프레그먼트(Fragments)</title>
      <link>https://bellori.tistory.com/entry/%ED%94%84%EB%A0%88%EA%B7%B8%EB%A8%BC%ED%8A%B8Fragments</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트를 만들 때 아래와 같은 에러를 본 적이 있을 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;Adjacent JSX elements must be wrapped in an enclosing tag.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;Did you want a JSX fragment &amp;lt;&amp;gt;...&amp;lt;/&amp;gt;?&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;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const App = () &amp;rArr; {
 return (
  &amp;lt;div&amp;gt;one&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;two&amp;lt;/div&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;JSX 문법으로 작성된 내용이 아래와 같이 해석이 되기 때문이다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;return (
 React.createElement('div', {}, &quot;one&quot;)
 React.createElement('div', {}, &quot;two&quot;)
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XvJPY/btsDWT89PJn/nbhLaaIW27vfkwQ8kS8GMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XvJPY/btsDWT89PJn/nbhLaaIW27vfkwQ8kS8GMK/img.png&quot; data-alt=&quot;VSCode 파싱 에러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XvJPY/btsDWT89PJn/nbhLaaIW27vfkwQ8kS8GMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXvJPY%2FbtsDWT89PJn%2FnbhLaaIW27vfkwQ8kS8GMK%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;600&quot; height=&quot;85&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VSCode 파싱 에러&lt;/figcaption&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;React 컴포넌트는 하나의 최상위 엘리먼트만 렌더링을 할 수 있기 때문에 2개 이상의 엘리먼트가 감싸지지 않고 작성될 경우 에러 문구를 보여준다.&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;이를 해결하기 위해 가장 일반적인 방법은 div로 묶는 방법인데 단순히 감쌀 목적으로 &amp;lt;div&amp;gt;를 사용하는 것은 적절치 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이를 해결하기 위해 Fragment를 사용한다.&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의 Fragment는 웹 표준에서의 &amp;lt;template&amp;gt;과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 표준에서의 &amp;lt;template&amp;gt;도 실제 렌더링이 되지 않는 것처럼 &amp;lt;fragment&amp;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;&amp;lt;div&amp;gt;one&amp;lt;/div&amp;gt;, &amp;lt;div&amp;gt;two&amp;lt;/div&amp;gt; 이 두 개 요소를 렌더링 해야한다고 가정해보자.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;div className=&quot;app&quot;&amp;gt;
      &amp;lt;div&amp;gt;one&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;two&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l94O5/btsDRaEBgGV/c2fY2l2OAhl2XZi5qx31S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l94O5/btsDRaEBgGV/c2fY2l2OAhl2XZi5qx31S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l94O5/btsDRaEBgGV/c2fY2l2OAhl2XZi5qx31S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl94O5%2FbtsDRaEBgGV%2Fc2fY2l2OAhl2XZi5qx31S1%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;136&quot; height=&quot;96&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;div 지옥이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여기서 fragment를 사용한다면 어떻게 될까?&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import { Fragment } from 'react';

function App() {
  return (
    &amp;lt;Fragment&amp;gt;
      &amp;lt;div&amp;gt;one&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;two&amp;lt;/div&amp;gt;
    &amp;lt;/Fragment&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;116&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPEL3c/btsDWtQpZuu/q3HkJDCsIPtcutLc6k70Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPEL3c/btsDWtQpZuu/q3HkJDCsIPtcutLc6k70Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPEL3c/btsDWtQpZuu/q3HkJDCsIPtcutLc6k70Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPEL3c%2FbtsDWtQpZuu%2Fq3HkJDCsIPtcutLc6k70Kk%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;116&quot; height=&quot;63&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;116&quot; data-origin-height=&quot;63&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;DOM에 Fragment는 렌더링 되지 않고 JSX 문법을 지키면서 요소들을 그룹화 해서 렌더링 할 수 있다.&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;Fragment는 단축 문법을 지원하는데 위의 에러 메시지처럼 &amp;lt;&amp;gt; &amp;hellip; &amp;lt;/&amp;gt;이다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;div&amp;gt;one&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;two&amp;lt;/div&amp;gt;
    &amp;lt;/&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;116&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPEL3c/btsDWtQpZuu/q3HkJDCsIPtcutLc6k70Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPEL3c/btsDWtQpZuu/q3HkJDCsIPtcutLc6k70Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPEL3c/btsDWtQpZuu/q3HkJDCsIPtcutLc6k70Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPEL3c%2FbtsDWtQpZuu%2Fq3HkJDCsIPtcutLc6k70Kk%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;116&quot; height=&quot;63&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;116&quot; data-origin-height=&quot;63&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 Fragment를 사용하는 것은 불필요한 부모 Element를 추가하지 않고 여러 Element들을 그룹화 하는데 사용되며, 공식적으로 권장되는 방법이다.&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;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;0&quot;&gt;Did you want a JSX fragment &amp;lt;&amp;gt;...&amp;lt;/&amp;gt;?&lt;/span&gt;&lt;/b&gt; 라고 친절히 Fragment에 대한 힌트를 제공해주고 있다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>development</category>
      <category>ECMAScript</category>
      <category>javascript</category>
      <category>JS</category>
      <category>react</category>
      <category>개발</category>
      <category>리액트</category>
      <category>자바스크립트</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/24</guid>
      <comments>https://bellori.tistory.com/entry/%ED%94%84%EB%A0%88%EA%B7%B8%EB%A8%BC%ED%8A%B8Fragments#entry24comment</comments>
      <pubDate>Thu, 25 Jan 2024 01:58:50 +0900</pubDate>
    </item>
    <item>
      <title>크롬 확장 프로그램 충돌로 인한 레이아웃 깨짐 문제 해결</title>
      <link>https://bellori.tistory.com/entry/HTMLCSS-%ED%81%AC%EB%A1%AC-%ED%99%95%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%B6%A9%EB%8F%8C%EB%A1%9C-%EC%9D%B8%ED%95%9C-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EA%B9%A8%EC%A7%90-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Situation&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA2ap1/btsDhN2IxgJ/h6qqgnVTvJDr6FgRb6g2D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA2ap1/btsDhN2IxgJ/h6qqgnVTvJDr6FgRb6g2D1/img.png&quot; data-alt=&quot;로그인 페이지 아이디 입력란 레이아웃 깨짐 문제 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA2ap1/btsDhN2IxgJ/h6qqgnVTvJDr6FgRb6g2D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA2ap1%2FbtsDhN2IxgJ%2Fh6qqgnVTvJDr6FgRb6g2D1%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;377&quot; height=&quot;405&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;405&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;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XX7fx/btsC9y663RR/ymlDB3oqUD6C4t0ZlsLO5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XX7fx/btsC9y663RR/ymlDB3oqUD6C4t0ZlsLO5k/img.png&quot; data-alt=&quot;회원가입 페이지 아이디 및 이름 입력란 레이아웃 깨짐 문제 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XX7fx/btsC9y663RR/ymlDB3oqUD6C4t0ZlsLO5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXX7fx%2FbtsC9y663RR%2FymlDB3oqUD6C4t0ZlsLO5k%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;463&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;463&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;p data-ke-size=&quot;size16&quot;&gt;회원가입 페이지도 마찬가지로 아이디와 이름 입력란만&amp;nbsp; 레이아웃이 깨지는 현상이 발생하였다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Task&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 페이지와 회원가입 페이지의 레이아웃 깨짐 현상을 해결하여 원하는 스타일이 나오도록 해야했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Action&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9cRGg/btsC7nkwjzk/d8tWwU6QqURiRADRCsFvnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9cRGg/btsC7nkwjzk/d8tWwU6QqURiRADRCsFvnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9cRGg/btsC7nkwjzk/d8tWwU6QqURiRADRCsFvnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9cRGg%2FbtsC7nkwjzk%2Fd8tWwU6QqURiRADRCsFvnk%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;294&quot; height=&quot;109&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;109&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;그대로다.&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;세 번째 시도해 본 방법은 css의 우선순위를 높여 보는 것이였다.&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;네 번째 시도해 본 방법은 크롬, 파이어폭스, 웨일, 엣지 총 4개의 각 브라우저에 접속해서 확인해 보는 것이였다.&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;다섯 번째 시도해 본 방법은 맥OS에서 접속해 보는 것이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥OS에서 사파리로 접속 시 문제가 없으나, 크롬으로 접속하면 레이아웃이 깨졌다.&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;원인을 도무지 알 수 없어 설치된 확장 프로그램을 하나씩 꺼보았다.&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-origin-width=&quot;416&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM14Uw/btsDhzXKeSs/8wyskjVUCrTeQ3RDRj9D5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM14Uw/btsDhzXKeSs/8wyskjVUCrTeQ3RDRj9D5k/img.png&quot; data-alt=&quot;Grid Layout System&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM14Uw/btsDhzXKeSs/8wyskjVUCrTeQ3RDRj9D5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM14Uw%2FbtsDhzXKeSs%2F8wyskjVUCrTeQ3RDRj9D5k%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;416&quot; height=&quot;180&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Grid Layout System&lt;/figcaption&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;이녀석을 끄고 확인하면 레이아웃이 정상으로 돌아왔고 다시 키면 레이아웃이 깨지는 것이였다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8VCZe/btsC8V2lX0A/TDsZ8oO0E66oK8BayeUs5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8VCZe/btsC8V2lX0A/TDsZ8oO0E66oK8BayeUs5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8VCZe/btsC8V2lX0A/TDsZ8oO0E66oK8BayeUs5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8VCZe%2FbtsC8V2lX0A%2FTDsZ8oO0E66oK8BayeUs5K%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;241&quot; height=&quot;74&quot; data-origin-width=&quot;241&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디와 비밀번호 input 영역을 감싸고 있는 div의 클래스가 element 없이 단순하게 input-wrapper로 되어있는 부분이 거슬렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스명을 login-input-wrapper로 수정하고 css 코드도 수정된 클래스명으로 고쳐보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6J54l/btsDfkttI4c/kthiz6xlnmDWnhUboGBYGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6J54l/btsDfkttI4c/kthiz6xlnmDWnhUboGBYGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6J54l/btsDfkttI4c/kthiz6xlnmDWnhUboGBYGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6J54l%2FbtsDfkttI4c%2Fkthiz6xlnmDWnhUboGBYGK%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;392&quot; height=&quot;403&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;403&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;p data-ke-size=&quot;size16&quot;&gt;회원가입 코드도 마찬가지로 input 영역을 감싸고 있는 div의 클래스를 확인해 보았다.&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-origin-width=&quot;277&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y02e4/btsC9opI6b6/yve23h4TWZ6PkeZghgTeA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y02e4/btsC9opI6b6/yve23h4TWZ6PkeZghgTeA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y02e4/btsC9opI6b6/yve23h4TWZ6PkeZghgTeA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY02e4%2FbtsC9opI6b6%2Fyve23h4TWZ6PkeZghgTeA0%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;277&quot; height=&quot;47&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;47&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;여기도 마찬가지로 form-input-wrapper, label-wrapper 등 단순하게 되어있는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;register-input-wrapper, register-label-wrapper로 수정하였고 다시 회원가입 페이지를 확인해 보았다.&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-origin-width=&quot;506&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGkbhC/btsDflZZPTy/sQkzoxzPeiE6eCnY4WUk6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGkbhC/btsDflZZPTy/sQkzoxzPeiE6eCnY4WUk6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGkbhC/btsDflZZPTy/sQkzoxzPeiE6eCnY4WUk6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGkbhC%2FbtsDflZZPTy%2FsQkzoxzPeiE6eCnY4WUk6K%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;506&quot; height=&quot;463&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;463&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;h2 data-ke-size=&quot;size26&quot;&gt;Result&lt;/h2&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;이를 통해서 느낄 수 있었던 부분은 BEM 패턴 방식을 사용했더라면 이런 문제가 발생하지 않았을 거라는 생각이 들었고 클래스명을 대충 짓지 않도록 신경을 조금 더 써야겠다는 생각이 들었다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>Coding</category>
      <category>CSS</category>
      <category>development</category>
      <category>HTML</category>
      <category>Sass</category>
      <category>scss</category>
      <category>개발</category>
      <category>코딩</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/20</guid>
      <comments>https://bellori.tistory.com/entry/HTMLCSS-%ED%81%AC%EB%A1%AC-%ED%99%95%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%B6%A9%EB%8F%8C%EB%A1%9C-%EC%9D%B8%ED%95%9C-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EA%B9%A8%EC%A7%90-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0#entry20comment</comments>
      <pubDate>Tue, 9 Jan 2024 21:40:50 +0900</pubDate>
    </item>
    <item>
      <title>웹 요소의 속성을 가져오거나 수정하는 방법</title>
      <link>https://bellori.tistory.com/entry/%EC%9B%B9-%EC%9A%94%EC%86%8C%EC%9D%98-%EC%86%8D%EC%84%B1%EC%9D%84-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B1%B0%EB%82%98-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;style&amp;quot;:1,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:1}&quot;&gt;&lt;b&gt;웹 요소의 속성을 가져오거나 수정하는 getAttribute(), setAttribute(), removeAttribute() 메서드 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:0,&amp;quot;style&amp;quot;:101,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;font&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;.AppleSDGothicNeoI-Regular&amp;quot;,&amp;quot;pointSize&amp;quot;:0},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;웹&lt;/span&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:0,&amp;quot;style&amp;quot;:101,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt; 요소를 문서에 삽입할 때 태그 속성을 함께 사용하면 DOM 트리에 속성 노드가 추가되면서 속성값이 저장된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;font&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;.AppleSDGothicNeoI-Regular&amp;quot;,&amp;quot;pointSize&amp;quot;:0},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;이&lt;/span&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt; 때 속성에 접근하려면 getAttribute() 메서드를 사용하고 접근한 속성의 값을 바꾸려면 setAttribute() 메서드를 사용하면 된다.&lt;/span&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;속성 자체를 삭제하고 싶다면 removeAttribute() 메서드를 사용하면 된다.&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;pre id=&quot;code_1703580302357&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;getAttribute, setAttribute&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;img src=&quot;./img/duck.jpg&quot; alt=&quot;오리 사진&quot; id=&quot;image&quot; /&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&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 data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;간단한 위 예시 코드를 활용하여 알아보자&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; getAttribute() 메서드&lt;/b&gt;&lt;/h2&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;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[구문] &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;element.getAttribute(&amp;ldquo;속성명&amp;rdquo;)&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxkWBi/btsCK8eNAM8/N9bnoIwqXAJJjGhwkLoH1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxkWBi/btsCK8eNAM8/N9bnoIwqXAJJjGhwkLoH1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxkWBi/btsCK8eNAM8/N9bnoIwqXAJJjGhwkLoH1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxkWBi%2FbtsCK8eNAM8%2FN9bnoIwqXAJJjGhwkLoH1k%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;346&quot; height=&quot;82&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;82&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;이미지 요소를 담은 변수에 .getAttribute() 메서드를 활용하여 alt 속성 값과 id 속성 값을 반환한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DPH0m/btsCy6QScJA/VAxquDzT56tgBBD3boSM70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DPH0m/btsCy6QScJA/VAxquDzT56tgBBD3boSM70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DPH0m/btsCy6QScJA/VAxquDzT56tgBBD3boSM70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDPH0m%2FbtsCy6QScJA%2FVAxquDzT56tgBBD3boSM70%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;170&quot; height=&quot;78&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;78&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zv6Uy/btsCyICIBZX/ik682Auzk5CX15BT8Jz3zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zv6Uy/btsCyICIBZX/ik682Auzk5CX15BT8Jz3zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zv6Uy/btsCyICIBZX/ik682Auzk5CX15BT8Jz3zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZv6Uy%2FbtsCyICIBZX%2Fik682Auzk5CX15BT8Jz3zk%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;326&quot; height=&quot;41&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;setAttribute() 메서드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getAttribute() 메서드를 통해 값을 확인했다면 확인한 값에 대한 설정을 바꿀 수도 있다.&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;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[구문]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;element.setAttribute(&amp;ldquo;속성명&amp;rdquo;, &amp;ldquo;값&amp;rdquo;)&lt;/span&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:1}&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;b&gt;[설명]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getAttribute() 메서드를 통해 얻은 alt 속성의 값을 변경해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJCp6X/btsCJj2YRC5/Mbykcp356NRUNgkRy9E6vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJCp6X/btsCJj2YRC5/Mbykcp356NRUNgkRy9E6vk/img.png&quot; data-alt=&quot;반환값은 undefined이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJCp6X/btsCJj2YRC5/Mbykcp356NRUNgkRy9E6vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJCp6X%2FbtsCJj2YRC5%2FMbykcp356NRUNgkRy9E6vk%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;395&quot; height=&quot;161&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;반환값은 undefined이다.&lt;/figcaption&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;기존에 alt 속성에 있었던 '오리 사진'이라는 값이 setAttribute() 메서드를 통해 &quot;귀여운 오리사진&quot;으로 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 빈값으로 두고 싶다면 두 번째 인자를 &quot;&quot;으로 두면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;removeAttribute() 메서드&lt;/b&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[구문]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;element.removeAttribute(&amp;ldquo;속성명&amp;rdquo;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 변경한 alt 값 자체가 마음에 안 들어서 이 속성(attribute) 자체를 삭제하려고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9chAN/btsCAhkPnMJ/tUskFKIJD0CAnh8uY4ksJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9chAN/btsCAhkPnMJ/tUskFKIJD0CAnh8uY4ksJK/img.png&quot; data-alt=&quot;반환값은 undefined이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9chAN/btsCAhkPnMJ/tUskFKIJD0CAnh8uY4ksJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9chAN%2FbtsCAhkPnMJ%2FtUskFKIJD0CAnh8uY4ksJK%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;578&quot; height=&quot;194&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;반환값은 undefined이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 있었던 alt 값 자체가 제거된 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Development</category>
      <category>DOM</category>
      <category>ECMAScript</category>
      <category>ES</category>
      <category>javascript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/17</guid>
      <comments>https://bellori.tistory.com/entry/%EC%9B%B9-%EC%9A%94%EC%86%8C%EC%9D%98-%EC%86%8D%EC%84%B1%EC%9D%84-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B1%B0%EB%82%98-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry17comment</comments>
      <pubDate>Wed, 27 Dec 2023 23:15:02 +0900</pubDate>
    </item>
    <item>
      <title>웹 요소의 내용을 수정하는 방법</title>
      <link>https://bellori.tistory.com/entry/%EC%9B%B9-%EC%9A%94%EC%86%8C%EC%9D%98-%EB%82%B4%EC%9A%A9%EC%9D%84-%EC%88%98%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;style&amp;quot;:1,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:1}&quot;&gt;웹 요소의 내용을 수정하는 innerText, innerHTML 프로퍼티&lt;/span&gt;&lt;/b&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;style&amp;quot;:1,&amp;quot;writingDirection&amp;quot;:1}}&quot;&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;style&amp;quot;:101,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;요소(element)는 객체기 때문에 innerText 프로퍼티나 innerHTML 프로퍼티를 이용하여 웹 요소의 내용도 수정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[예시]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1703580657742&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;innerText, innerHTML&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;p id=&quot;test&quot;&amp;gt;hello, world!&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;innerText 프로퍼티&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;innerText 프로퍼티는 요소의 텍스트 콘텐츠를 설정하거나 반환한다.&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;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[구문]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;- get 방식 : element.innerText&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;ㄴ &quot;let text = element.innerText&quot;와 같이변수에 담아 활용해도 무방하다.&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 data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;- set 방식 : element.innerText = &quot;내용&quot;&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;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[설명]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 코드에서 #test id 값을 가진 p 태그의 텍스트 노드 값을 가져와보자 (get 방식)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CKCKt/btsCy7Cf5ql/ViedCDUsAWleavYzfVdAf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CKCKt/btsCy7Cf5ql/ViedCDUsAWleavYzfVdAf0/img.png&quot; data-alt=&quot;get 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CKCKt/btsCy7Cf5ql/ViedCDUsAWleavYzfVdAf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCKCKt%2FbtsCy7Cf5ql%2FViedCDUsAWleavYzfVdAf0%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;276&quot; height=&quot;44&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;get 방식&lt;/figcaption&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;다음으로는 텍스트 노드 값을 설정해보자 (set 방식)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ee3v/btsCF8zPWgd/gUFjqJhbCbdnYV5QU2DKP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ee3v/btsCF8zPWgd/gUFjqJhbCbdnYV5QU2DKP1/img.png&quot; data-alt=&quot;set 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ee3v/btsCF8zPWgd/gUFjqJhbCbdnYV5QU2DKP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ee3v%2FbtsCF8zPWgd%2FgUFjqJhbCbdnYV5QU2DKP1%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;397&quot; height=&quot;40&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;set 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tH4db/btsCztLZOTF/2JHFxwyUkEEMs6dqcIUh41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tH4db/btsCztLZOTF/2JHFxwyUkEEMs6dqcIUh41/img.png&quot; data-alt=&quot;hello, world! -&amp;amp;gt; hello, JavaScript로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tH4db/btsCztLZOTF/2JHFxwyUkEEMs6dqcIUh41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtH4db%2FbtsCztLZOTF%2F2JHFxwyUkEEMs6dqcIUh41%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;133&quot; height=&quot;44&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hello, world! -&amp;gt; hello, JavaScript로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;할당 연산자를 통해 값을 새로 설정하면 기존에 있던 모든 하위 노드가 제거되고 하나의 새 텍스트 노드로 대체된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; innerHTML 프로퍼티 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;innerHTML 프로퍼티는 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;요소의 HTML 콘텐츠(내부 HTML)를 설정하거나 반환한다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[구문]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;- get 방식 : element.innerHTML&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㄴ &quot;let text = element.innerHTML&quot; 과 같이 변수에 담아 활용해도 무방하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;- set 방식 : element.innerHTML = &quot;내용&quot;&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;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;[설명]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get 방식으로 하게 될 경우 innerText와 큰 차이가 없어보일 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCrpBp/btsCLpOj9Ya/qkuWaILkk8pvti28mBZKfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCrpBp/btsCLpOj9Ya/qkuWaILkk8pvti28mBZKfk/img.png&quot; data-alt=&quot;get 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCrpBp/btsCLpOj9Ya/qkuWaILkk8pvti28mBZKfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCrpBp%2FbtsCLpOj9Ya%2FqkuWaILkk8pvti28mBZKfk%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;269&quot; height=&quot;43&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;get 방식&lt;/figcaption&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;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;set 방식에서 차이를 확인할 수 있다.&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 data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;먼저 text 노드를 넣는 것도 반환값이 똑같고 문서 내에서도 변경사항을 똑같이 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEreM1/btsCCzLvNbN/7nxq6K4NnEkvRCUyjpUZ60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEreM1/btsCCzLvNbN/7nxq6K4NnEkvRCUyjpUZ60/img.png&quot; data-alt=&quot;text 노드만 넣었을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEreM1/btsCCzLvNbN/7nxq6K4NnEkvRCUyjpUZ60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEreM1%2FbtsCCzLvNbN%2F7nxq6K4NnEkvRCUyjpUZ60%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;405&quot; height=&quot;44&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;text 노드만 넣었을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;135&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DnsU1/btsCKqzXLrZ/i7FjPNpjquegtPuQHsDn9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DnsU1/btsCKqzXLrZ/i7FjPNpjquegtPuQHsDn9k/img.png&quot; data-alt=&quot;hello, world! -&amp;amp;gt; hello, JavaScript로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DnsU1/btsCKqzXLrZ/i7FjPNpjquegtPuQHsDn9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDnsU1%2FbtsCKqzXLrZ%2Fi7FjPNpjquegtPuQHsDn9k%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;135&quot; height=&quot;37&quot; data-origin-width=&quot;135&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hello, world! -&amp;gt; hello, JavaScript로 변경&lt;/figcaption&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;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;innerHTML 프로퍼티는 HTML 태그까지 반영하여 표시하기 때문에 innerText 프로퍼티와 차이점을 보여준다.&lt;/span&gt;&lt;b&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;&quot;hello, world&quot;를 &quot;hello, JavaScript&quot;로 변경하면서 굵은 글씨 효과를 주기 위해 &amp;lt;b&amp;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 data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1},&amp;quot;fontHints&amp;quot;:0}&quot;&gt;먼저 innerText 프로퍼티로 태그까지 넣어 시도해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GmkaA/btsCyzeIfBH/UrI6c6E4rnZD75hvV3D0g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GmkaA/btsCyzeIfBH/UrI6c6E4rnZD75hvV3D0g0/img.png&quot; data-alt=&quot;innerText로 태그채로 넣었을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GmkaA/btsCyzeIfBH/UrI6c6E4rnZD75hvV3D0g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGmkaA%2FbtsCyzeIfBH%2FUrI6c6E4rnZD75hvV3D0g0%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;355&quot; height=&quot;64&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;innerText로 태그채로 넣었을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V45Hr/btsCzsfftcR/hGUR4wh7OVJ6WeiQXB7LZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V45Hr/btsCzsfftcR/hGUR4wh7OVJ6WeiQXB7LZ0/img.png&quot; data-alt=&quot;text 노드에 태그채로 표시됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V45Hr/btsCzsfftcR/hGUR4wh7OVJ6WeiQXB7LZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV45Hr%2FbtsCzsfftcR%2FhGUR4wh7OVJ6WeiQXB7LZ0%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;203&quot; height=&quot;48&quot; data-origin-width=&quot;203&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;text 노드에 태그채로 표시됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGwXl/btsCJi3f6PX/PKXPMvBLdDsdR9txPldAs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGwXl/btsCJi3f6PX/PKXPMvBLdDsdR9txPldAs1/img.png&quot; data-alt=&quot;태그로 인식하지 못함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGwXl/btsCJi3f6PX/PKXPMvBLdDsdR9txPldAs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGwXl%2FbtsCJi3f6PX%2FPKXPMvBLdDsdR9txPldAs1%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;266&quot; height=&quot;23&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;23&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;p data-ke-size=&quot;size16&quot;&gt;이렇게 태그가 적용되지 않고 text 노드에 태그채로 들어가서 원하는 결과를 얻어낼 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자도구에서도 text node로 인식하여 검정색 글씨로 보여준다.&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;다음으로 innerHTML 프로퍼티로 태그까지 넣어 시도해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6w2J5/btsCCxmAFRU/ecOhUZ8bQoIGCjfirz7FKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6w2J5/btsCCxmAFRU/ecOhUZ8bQoIGCjfirz7FKK/img.png&quot; data-alt=&quot;innerHTML로 태그채로 넣었을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6w2J5/btsCCxmAFRU/ecOhUZ8bQoIGCjfirz7FKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6w2J5%2FbtsCCxmAFRU%2FecOhUZ8bQoIGCjfirz7FKK%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;344&quot; height=&quot;52&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;innerHTML로 태그채로 넣었을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;143&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUAHZ/btsCyIQd9Hn/24tW5u24HBSKpYjHz95d61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUAHZ/btsCyIQd9Hn/24tW5u24HBSKpYjHz95d61/img.png&quot; data-alt=&quot;&amp;amp;lt;b&amp;amp;gt; 태그가 적용되어 표시됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUAHZ/btsCyIQd9Hn/24tW5u24HBSKpYjHz95d61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUAHZ%2FbtsCyIQd9Hn%2F24tW5u24HBSKpYjHz95d61%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;143&quot; height=&quot;39&quot; data-origin-width=&quot;143&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;b&amp;gt; 태그가 적용되어 표시됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duF36y/btsCDhqhTWb/0MqxNlG4IIS0ExgqNDxkb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duF36y/btsCDhqhTWb/0MqxNlG4IIS0ExgqNDxkb1/img.png&quot; data-alt=&quot;태그로 인식함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duF36y/btsCDhqhTWb/0MqxNlG4IIS0ExgqNDxkb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduF36y%2FbtsCDhqhTWb%2F0MqxNlG4IIS0ExgqNDxkb1%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;173&quot; height=&quot;47&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;47&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;p data-ke-size=&quot;size16&quot;&gt;innerText로 시도했던 것과 다르게 우리가 원하는 결괏값을 얻어낼 수 있었고 개발자도구에서 확인하였을 때에도 정상적으로 태그로 인식하여 굵은 글씨가 적용되었다.&lt;span data-tt=&quot;{&amp;quot;paragraphStyle&amp;quot;:{&amp;quot;alignment&amp;quot;:4,&amp;quot;writingDirection&amp;quot;:1}}&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Development</category>
      <category>DOM</category>
      <category>ECMAScript</category>
      <category>ES</category>
      <category>innerHTML</category>
      <category>innerText</category>
      <category>javascript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/16</guid>
      <comments>https://bellori.tistory.com/entry/%EC%9B%B9-%EC%9A%94%EC%86%8C%EC%9D%98-%EB%82%B4%EC%9A%A9%EC%9D%84-%EC%88%98%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry16comment</comments>
      <pubDate>Tue, 26 Dec 2023 17:25:13 +0900</pubDate>
    </item>
    <item>
      <title>DOM에 접근하는 다양한 방법</title>
      <link>https://bellori.tistory.com/entry/DOM%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94-%EB%8B%A4%EC%96%91%ED%95%9C-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DOM에 접근하기&lt;/b&gt;&lt;/h2&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;CSS에서 id, class, html 태그(&amp;lt;p&amp;gt;, &amp;lt;h1&amp;gt; 등)를 선택자(selector)라고 하는데 이 선택자를 사용해서 DOM에 접근하는 여러가지 방법이 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;getElementById()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id는 문서 내에서 유일하기 때문에 특정 요소를 빠르게 찾을 때 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메서드는 주어진 문자열과 일치하는 id 속성을 가진 요소를 찾고, 지정된 값을 가진 요소 객체를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호 안에는 id명이 들어간다.&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;bellori라는 id 값을 가진 요소에 접근하려면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1703519203295&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.getElementById(&amp;ldquo;bellori&amp;rdquo;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;getElementsByClassName()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class의 경우 id와 다르게 2개 이상의 복수로 사용될 수 있어 반환하는 요소가 2개 이상일 수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 메서드의 이름에서도 알 수 있듯이 Element가 아닌 s 복수형을 사용하여 Elements이다.&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;&quot;bright&quot;라는 class 이름을 가신 요소를 모두 찾으려면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1703520083535&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.getElementsByClassName(&amp;ldquo;bright&amp;rdquo;)&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;이 메서드를 사용하게 되면 class 이름이 같은 DOM 요소들이 HTMLCollection이라고 하는 숫자로 된 키 값을 가진 객체에 저장되는데 배열과 비슷하고 배열처럼 사용할 수 있지만 배열은 아니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TJdPp/btsCzIV48qD/IbBjXPNuSxNfUEs7yJqIw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TJdPp/btsCzIV48qD/IbBjXPNuSxNfUEs7yJqIw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TJdPp/btsCzIV48qD/IbBjXPNuSxNfUEs7yJqIw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTJdPp%2FbtsCzIV48qD%2FIbBjXPNuSxNfUEs7yJqIw1%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;640&quot; height=&quot;228&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;getElementsByTagName()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메서드의 경우 getElementsByClassName() 메서드와 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id나 class가 별도로 없다면 HTML 태그로 찾는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것도 class처럼 2개 이상의&amp;nbsp;복수로 사용될 수 있어 반환하는 요소가 2개 이상일 수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 반환되는 값도 HTMLCollection 형태로 저장된다.&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;웹 문서에서 &amp;lt;p&amp;gt; 태그를 사용한 모든 요소에 접근하려면 다음과 같이 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1703522142382&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.getElementsByTagName(&amp;ldquo;p&amp;rdquo;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;querySelector(), querySelectorAll()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 getElementById(), getElementsByClassName(), getElementsByTagName() &lt;span&gt;메서드&lt;/span&gt; &lt;span&gt;모두&lt;/span&gt; &lt;span&gt;반환값이&lt;/span&gt; HTMLElement &lt;span&gt;객체이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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&gt;id 선택자처럼 반환값이 하나라면 querySelector()를 사용하고, class 선택자나 태그 이름을 사용하여 여러 값이 한꺼번에 반환될 경우에는 querySelectorAll() 메서드를 사용한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;querySelector() 메서드로 class나 tag 로 접근하지 못하는 것은 아니다. 다만, 2개 이상 요소가 있다면 첫 번째 요소만 반환한다.&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;&lt;b&gt;[예시]&lt;/b&gt;&lt;br /&gt;css와 동일하게 괄호 안에는 id 이름 앞에는 # 을 붙이고 class 이름 앞에는 .을 붙인다.&lt;br /&gt;태그는&amp;nbsp;기호&amp;nbsp;없이&amp;nbsp;태그명만&amp;nbsp;쓰면&amp;nbsp;된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1703522579301&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.querySelector(&quot;#bellori&quot;) // id 선택
document.querySelectorAll(&quot;.bright&quot;) // class 선택
document.querySelectorAll(&quot;p&quot;) // html 태그 선택&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&gt;이 두 메서드의 반환값은 한 개라면 노드이거나 여러 개인 경우 노드 리스트(Node List)라는 유사배열을 반환한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Development</category>
      <category>DOM</category>
      <category>ECMAScript</category>
      <category>ES</category>
      <category>javascript</category>
      <category>JS</category>
      <category>문서객체모델</category>
      <category>자바스크립트</category>
      <author>BELLORI</author>
      <guid isPermaLink="true">https://bellori.tistory.com/15</guid>
      <comments>https://bellori.tistory.com/entry/DOM%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94-%EB%8B%A4%EC%96%91%ED%95%9C-%EB%B0%A9%EB%B2%95#entry15comment</comments>
      <pubDate>Tue, 26 Dec 2023 01:47:19 +0900</pubDate>
    </item>
  </channel>
</rss>