<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Front End Develop</title>
    <link>https://frontdev.tistory.com/</link>
    <description>영민 공간</description>
    <language>ko</language>
    <pubDate>Sat, 4 Jul 2026 12:18:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>F.E.D</managingEditor>
    <image>
      <title>Front End Develop</title>
      <url>https://tistory1.daumcdn.net/tistory/2794117/attach/aa31f12030a2404cafc028e2c8e2b1af</url>
      <link>https://frontdev.tistory.com</link>
    </image>
    <item>
      <title>2025 개발자 도구(DevTools) 새로운 기능 6가지</title>
      <link>https://frontdev.tistory.com/entry/2025-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%8F%84%EA%B5%ACDevTools-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-6%EA%B0%80%EC%A7%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2025년 크롬 개발자 도구(DevTools)&lt;/b&gt;는 웹 개발자들에게 더욱 강력한 도구를 제공하며, 디버깅과 최적화를 한층 더 쉽게 만들어 주고 있습니다. 이번 업데이트에서는 특히 &lt;b&gt;성능, 보안, 그리고 사용자 경험 개선&lt;/b&gt;에 초점을 맞춘 여러 기능이 추가되었습니다. 아래는 주요 기능과 이를 활용하는 방법을 소개합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. DOM 크기 최적화 (Optimize DOM Size)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DOM 트리가 너무 크면 페이지 성능이 저하될 수 있습니다.&lt;/b&gt; 크롬 DevTools의 새로운 기능인 &lt;b&gt;DOM 크기 최적화(Optimize DOM Size)&lt;/b&gt; 기능은 &lt;b&gt;DOM 요소 수와 깊이를 분석&lt;/b&gt;하고 &lt;b&gt;성능 병목현상을 일으키는 특정 노드를 바로 찾아 수정&lt;/b&gt;할 수 있게 도와줍니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;성능(Performance) &lt;/b&gt;패널에서 페이지 로드 기록을 시작합니다.&lt;/li&gt;
&lt;li&gt;기록이 완료되면&amp;nbsp;&lt;b&gt;Insights 탭&lt;/b&gt;에서 &lt;b&gt;DOM 크기 최적화(Optimize DOM Size)&lt;/b&gt; 인사이트를 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제를 일으키는 DOM 노드가 강조 표시&lt;/b&gt;되며, 클릭하면 &lt;b&gt;요소(Elements) &lt;/b&gt;패널로 이동해 직접 수정할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;1834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMCnx/btsMUyn1RHB/DK68uvUQOdudYWw9h1csUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMCnx/btsMUyn1RHB/DK68uvUQOdudYWw9h1csUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMCnx/btsMUyn1RHB/DK68uvUQOdudYWw9h1csUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMCnx%2FbtsMUyn1RHB%2FDK68uvUQOdudYWw9h1csUk%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;2062&quot; height=&quot;1834&quot; data-origin-width=&quot;2062&quot; data-origin-height=&quot;1834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 3rd Party 필터링&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제를 디버깅할 때, 타사 스크립트가 데이터를 복잡하게 만들 수 있습니다. 이제 &lt;b&gt;서드 파티 흐리게 표시(Dim 3rd Parties)&lt;/b&gt; 옵션을 통해 &lt;b&gt;타사 스크립트를 흐리게 표시&lt;/b&gt;하거나 숨겨, &lt;b&gt;1st-party 코드에만 집중&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;성능(Performance) &lt;/b&gt;&lt;/b&gt;패널에서 페이지 로드 기록을 시작합니다.&lt;/li&gt;
&lt;li&gt;설정 메뉴에서 &lt;b&gt;서드 파티 흐리게 표시(Dim 3rd Parties)&lt;/b&gt;&amp;nbsp;옵션을 활성화합니다.&lt;/li&gt;
&lt;li&gt;타사 스크립트를 제외한 데이터만 확인하며 &lt;b&gt;성능 병목현상을 분석&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPZk2O/btsMSEchqEM/saL4q4mQsK4kZBA5kFPN10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPZk2O/btsMSEchqEM/saL4q4mQsK4kZBA5kFPN10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPZk2O/btsMSEchqEM/saL4q4mQsK4kZBA5kFPN10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPZk2O%2FbtsMSEchqEM%2FsaL4q4mQsK4kZBA5kFPN10%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;2138&quot; height=&quot;1778&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. &lt;b&gt;개인 정보 보호 및 보안(&lt;/b&gt;Privacy and Security) 패널 개선&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호가 점점 중요해지는 가운데, 새로운 &lt;b&gt;개인 정보 보호 및 보안(Privacy and Security)&lt;/b&gt; 패널은 &lt;b&gt;3rd-party 쿠키 차단 시뮬레이션을 제공&lt;/b&gt;합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;개발자 도구(DevTools)&lt;/b&gt;에서 &lt;b&gt;개인 정보 보호 및 보안(Privacy and Security)&lt;/b&gt;&amp;nbsp;패널을 엽니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제어(Controls) 탭&lt;/b&gt;에서 &lt;b&gt;서드 파티 쿠키를 일시적으로 제한(Limit Third-Party Cookies)&lt;/b&gt; 옵션을 활성화합니다.&lt;/li&gt;
&lt;li&gt;페이지를 새로고침하여 쿠키 차단 후의 동작을 테스트하고, &lt;b&gt;차단된 쿠키 목록을 확인&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;1270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzbp4u/btsMS4n9IJ5/EQnyAGlwZP2Gcn57Tmt1D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzbp4u/btsMS4n9IJ5/EQnyAGlwZP2Gcn57Tmt1D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzbp4u/btsMS4n9IJ5/EQnyAGlwZP2Gcn57Tmt1D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzbp4u%2FbtsMS4n9IJ5%2FEQnyAGlwZP2Gcn57Tmt1D1%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;2146&quot; height=&quot;1270&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;1270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. CPU 쓰로틀링 개선&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU 쓰로틀링 설정&lt;/b&gt;에 &lt;b&gt;낮은 등급 모바일(Low-tier)&lt;/b&gt;또는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;중간 등급 모바일(Mid-tier&lt;span&gt;&amp;nbsp;&lt;/span&gt;Mobile Device) &lt;/b&gt;&lt;b&gt;시뮬레이션 옵션&lt;/b&gt;이 추가되었습니다. 이를 통해 실제 사용자 환경에 가까운 성능 테스트가 가능합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;개발자 도구(DevTools)&lt;/b&gt;의 &lt;b&gt;성능(Performance) 패널&lt;/b&gt;에서 설정 아이콘(톱니바퀴)을 클릭합니다.&lt;/li&gt;
&lt;li&gt;CPU 쓰로틀링 메뉴에서 &lt;b&gt;낮은 등급 모바일(Low-tier)&lt;/b&gt;또는&lt;b&gt; 중간 등급 모바일(Mid-tier Mobile Device)&lt;/b&gt; 옵션을 선택합니다.&lt;/li&gt;
&lt;li&gt;페이지를 새로고침하여 &lt;b&gt;느린 디바이스 환경에서의 성능 데이터를 분석&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2100&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdAQHk/btsMSR3HgHh/qH6mbCFFGigxzcbpjmr9h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdAQHk/btsMSR3HgHh/qH6mbCFFGigxzcbpjmr9h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdAQHk/btsMSR3HgHh/qH6mbCFFGigxzcbpjmr9h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdAQHk%2FbtsMSR3HgHh%2FqH6mbCFFGigxzcbpjmr9h0%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;2100&quot; height=&quot;794&quot; data-origin-width=&quot;2100&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. AI 기반 퍼포먼스 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI 어시스턴트&lt;/b&gt;가 &lt;b&gt;플레임 차트 데이터를 분석&lt;/b&gt;해 &lt;b&gt;최적화 제안을 제공&lt;/b&gt;합니다. &lt;b&gt;복잡한 데이터를 해석하고 구체적인 해결책을 제시&lt;/b&gt;해 &lt;b&gt;디버깅 시간을 단축&lt;/b&gt;시킵니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS3N1e/btsMT3IFmRm/rrQqsG2YchQilE8bHsCM1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS3N1e/btsMT3IFmRm/rrQqsG2YchQilE8bHsCM1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS3N1e/btsMT3IFmRm/rrQqsG2YchQilE8bHsCM1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS3N1e%2FbtsMT3IFmRm%2FrrQqsG2YchQilE8bHsCM1k%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;1868&quot; height=&quot;664&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;우선 이 설정을 사용하려면 환경 설정을 &lt;span style=&quot;color: #ee2323;&quot;&gt;영어&lt;/span&gt;로 변경 해야만 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2301&quot; data-origin-height=&quot;1824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZcdYz/btsMUOxvb1W/EoKkmobW2qoGkkbhKoSPY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZcdYz/btsMUOxvb1W/EoKkmobW2qoGkkbhKoSPY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZcdYz/btsMUOxvb1W/EoKkmobW2qoGkkbhKoSPY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZcdYz%2FbtsMUOxvb1W%2FEoKkmobW2qoGkkbhKoSPY0%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;2301&quot; height=&quot;1824&quot; data-origin-width=&quot;2301&quot; data-origin-height=&quot;1824&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;성능(Performance) &lt;/b&gt;&lt;/b&gt;패널에서 성능 테스트를 실행합니다.&lt;/li&gt;
&lt;li&gt;테스트 결과에서 &lt;b&gt;특정 결과 항목을 마우스 우측 마우스 클릭&lt;/b&gt; 해서 &lt;b&gt;Ask AI&lt;/b&gt; 메뉴를 통해 &lt;b&gt;최적화 제안을 확인&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;제안된 작업을 따라 성능 문제를 해결합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KyNAB/btsMT8b3pYj/cvJ63NknlUdduusEWTzkFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KyNAB/btsMT8b3pYj/cvJ63NknlUdduusEWTzkFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KyNAB/btsMT8b3pYj/cvJ63NknlUdduusEWTzkFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKyNAB%2FbtsMT8b3pYj%2FcvJ63NknlUdduusEWTzkFk%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;2592&quot; height=&quot;1678&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGEJmc/btsMS7ZmNuR/lCuaM7zLFLHcFXx1APzmck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGEJmc/btsMS7ZmNuR/lCuaM7zLFLHcFXx1APzmck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGEJmc/btsMS7ZmNuR/lCuaM7zLFLHcFXx1APzmck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGEJmc%2FbtsMS7ZmNuR%2FlCuaM7zLFLHcFXx1APzmck%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;2116&quot; height=&quot;1240&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 스크롤 가능한 영역 표시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요소(Elements)&lt;/b&gt; 패널에서 &lt;b&gt;overflow: auto&lt;/b&gt;&amp;nbsp;또는&amp;nbsp;&lt;b&gt;scroll&lt;/b&gt;&amp;nbsp;속성이 적용된 요소에 스크롤 뱃지가 표시됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 방법&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;개발자 도구(DevTools)&lt;/b&gt;의 &lt;b&gt;요소(Elements)&lt;/b&gt; 패널에서 DOM 구조를 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스크롤 가능한 요소 옆에 표시된 뱃지를 클릭&lt;/b&gt;하여 &lt;b&gt;해당 영역으로 바로 이동하거나 스타일 속성을 수정&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;1682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn0ivi/btsMTe5dmHT/QTTyjPRy5ENg8sY8I6zwlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn0ivi/btsMTe5dmHT/QTTyjPRy5ENg8sY8I6zwlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn0ivi/btsMTe5dmHT/QTTyjPRy5ENg8sY8I6zwlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn0ivi%2FbtsMTe5dmHT%2FQTTyjPRy5ENg8sY8I6zwlk%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;2022&quot; height=&quot;1682&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;1682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 크롬 DevTools 업데이트는 웹 개발자들에게 디버깅과 최적화를 위한 강력한 도구를 제공하며, 사용자 경험과 성능 개선에 큰 도움을 줍니다. 이러한 기능들을 활용해 더 빠르고 안정적인 웹사이트를 만들어보세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 영문 이미지는 출처를 참고 해보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://www.debugbear.com/blog/favourite-devtools-features-in-2025&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.debugbear.com/blog/favourite-devtools-features-in-2025&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742719031015&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Our Favorite DevTools Features of 2025 | DebugBear&quot; data-og-description=&quot;Discover the most powerful new developer tools features in Chrome 134 that will help you build faster websites and debug performance issues more effectively.&quot; data-og-host=&quot;www.debugbear.com&quot; data-og-source-url=&quot;https://www.debugbear.com/blog/favourite-devtools-features-in-2025&quot; data-og-url=&quot;https://www.debugbear.com/blog/favourite-devtools-features-in-2025&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kwz7N/hyYr1G2Hrl/41onyKKiPyKpIQRRMbFmZ1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/dDiJUH/hyYuldl5z2/9gZbrztgrbpOiPxGpGuXX1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/CALSn/hyYuk6Xs8w/yyNfVp4AQfx6ZF8R0FbeIK/img.png?width=3760&amp;amp;height=2080&amp;amp;face=0_0_3760_2080&quot;&gt;&lt;a href=&quot;https://www.debugbear.com/blog/favourite-devtools-features-in-2025&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.debugbear.com/blog/favourite-devtools-features-in-2025&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kwz7N/hyYr1G2Hrl/41onyKKiPyKpIQRRMbFmZ1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/dDiJUH/hyYuldl5z2/9gZbrztgrbpOiPxGpGuXX1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260,https://scrap.kakaocdn.net/dn/CALSn/hyYuk6Xs8w/yyNfVp4AQfx6ZF8R0FbeIK/img.png?width=3760&amp;amp;height=2080&amp;amp;face=0_0_3760_2080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Our Favorite DevTools Features of 2025 | DebugBear&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Discover the most powerful new developer tools features in Chrome 134 that will help you build faster websites and debug performance issues more effectively.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.debugbear.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>크롬업데이트</category>
      <category>2025 새로운 기능 데브툴</category>
      <category>2025크롬 개발자도구</category>
      <category>개발자도구</category>
      <category>개발자도구 성능</category>
      <category>데브툴 새로운 기능</category>
      <category>크롬 개발자도구</category>
      <category>크롬 디버거 새로운 기능</category>
      <category>크롬 새로운 기능</category>
      <category>크롬 성능</category>
      <category>크롬 성능탭 새로운 기능</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/205</guid>
      <comments>https://frontdev.tistory.com/entry/2025-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%8F%84%EA%B5%ACDevTools-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-6%EA%B0%80%EC%A7%80#entry205comment</comments>
      <pubDate>Sun, 23 Mar 2025 17:43:06 +0900</pubDate>
    </item>
    <item>
      <title>2024년 12월 3일</title>
      <link>https://frontdev.tistory.com/entry/2024%EB%85%84-12%EC%9B%94-3%EC%9D%BC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2024년이 끝나기전에 2024년을 회상하며..&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;2023년에 시작했던 것은 2024년에 마무리가 되고, 2021년에 시작했던 것은 현재 진행중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2015년에 처음 이 직업을 택하고 시작할 때처럼 설레임으로 가득하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2019년에 첫 이직을 통해서 많은 것을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년이면 이제 10년차다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10년이면 강산이 변한다고 하는데, 나는 여전히 2015년에 머물러 있다.&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;</description>
      <category>기타</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/204</guid>
      <comments>https://frontdev.tistory.com/entry/2024%EB%85%84-12%EC%9B%94-3%EC%9D%BC#entry204comment</comments>
      <pubDate>Tue, 3 Dec 2024 02:21:29 +0900</pubDate>
    </item>
    <item>
      <title>HTML5 &amp;lt;details&amp;gt; 태그를 사용해서 Q&amp;amp;A 만들기</title>
      <link>https://frontdev.tistory.com/entry/HTML5-details-%ED%83%9C%EA%B7%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-QA-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IE가 더 이상 서비스하지 않는 브라우저가 되고 나서, 우리는 다양한 HTML5 요소와 CSS를 사용해서 스타일링할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중에서 details 요소는 특히, IE에서 전혀 지원하지 않는 요소였는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;a style=&quot;background-color: #f6e199;&quot; href=&quot;https://caniuse.com/?search=details&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Can I Use(https://caniuse.com/?search=details)&lt;/b&gt;&lt;/a&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;details 요소를 사용해서 자주 사용하는 Q&amp;amp;A 컴포넌트를 만들어보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q&amp;amp;A는 주로 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;아코디언(Accordion)&lt;/b&gt;&lt;/span&gt;이라는 UI 컴포넌트로 만들게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696819440550&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;section class=&quot;accordion&quot;&amp;gt;
  &amp;lt;details&amp;gt;
    &amp;lt;summary class=&quot;question&quot;&amp;gt;Q. 궁금한 것이 있어요.&amp;lt;/summary&amp;gt;
    &amp;lt;div class=&quot;answer&quot;&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/details&amp;gt;
  &amp;lt;details&amp;gt;
    &amp;lt;summary class=&quot;question&quot;&amp;gt;Q. 궁금한 것이 있어요222.&amp;lt;/summary&amp;gt;
    &amp;lt;div class=&quot;answer&quot;&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다222. &amp;lt;br /&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/details&amp;gt;
  &amp;lt;details&amp;gt;
    &amp;lt;summary class=&quot;question&quot;&amp;gt;Q. 궁금한 것이 있어요333.&amp;lt;/summary&amp;gt;
    &amp;lt;div class=&quot;answer&quot;&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다333. &amp;lt;br /&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &amp;lt;br /&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/details&amp;gt;

&amp;lt;/section&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;HTML만으로도 블로그 문서에서도 이렇게 표현하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 화살표 있는 텍스트를 각각 클릭 해보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;section class=&quot;accordion&quot;&gt;
  &lt;details&gt;
    &lt;summary class=&quot;question&quot;&gt;Q. 궁금한 것이 있어요.&lt;/summary&gt;
    &lt;div class=&quot;answer&quot;&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
    &lt;/div&gt;
  &lt;/details&gt;
  &lt;details&gt;
    &lt;summary class=&quot;question&quot;&gt;Q. 궁금한 것이 있어요222.&lt;/summary&gt;
    &lt;div class=&quot;answer&quot;&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다222. &lt;br /&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
    &lt;/div&gt;
    &lt;/ul&gt;
  &lt;/details&gt;
  &lt;details&gt;
    &lt;summary class=&quot;question&quot;&gt;Q. 궁금한 것이 있어요333.&lt;/summary&gt;
    &lt;div class=&quot;answer&quot;&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다333. &lt;br /&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
      저의 대답은 이렇습니다. 저의 대답은 이렇습니다. &lt;br /&gt;
    &lt;/div&gt;
  &lt;/details&gt;

&lt;/section&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696819453951&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@charset &quot;utf-8&quot;;

:root {
  --left-padding: 35px;
  --arrow-width: 6px;
  --transition-duration: 300ms;
}

.accordion {
  height: 100%;
  padding: 50px 20px;
  color: #fff;
  line-height: 1.5;
}

details {
  width: 100%;
  max-width: 1024px;
  margin: 0 auto 10px;
  background: #c3c3c3;
  border-radius: 10px;
  overflow: hidden;
}

/* 기본 details-marker를 안보이도록 처리 */
details summary::-webkit-details-marker {
  display: block;
}

summary {
  display: block;
  position: relative;
  padding: 15px 15px 15px var(--left-padding);
  background: #222;
  cursor: pointer;
}

summary:before {
  content: &quot;&quot;;
  position: absolute;
  top: 50%;
  left: calc(var(--left-padding) / 2);
  margin-top: calc(var(--arrow-width) * -1);
  border-width: var(--arrow-width);
  border-style: solid;
  border-color: transparent transparent transparent #fff;
  transform-origin: calc(var(--arrow-width) / 2) 50%;
  transition: var(--transition-duration) transform ease;
}

details[open] &amp;gt; summary:before {
  transform: rotate(90deg);
}

details &amp;gt; .answer {
  padding: 15px var(--left-padding);
  background-color: #333;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS에서는 기본 HTML details 요소에서 &lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;summary::-webkit-details-marker&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;display: none;&lt;/b&gt;으로 해서 기존 HTML 네이티브 summary의 marker를 안보이도록 하고 ::before 가상 요소 선택자로 새롭게 만든 화살표를 사용합니다.&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;각각의 :root 변수는 화살표의 계산식을 조금 더 간편하게 유동적으로 할당할 수 있도록 도와줍니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://css-tricks.com/snippets/css/css-triangle/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://css-tricks.com/snippets/css/css-triangle/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696819561849&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;CSS Triangle | CSS-Tricks&quot; data-og-description=&quot;You can make them with a single div. It's nice to have classes for each direction possibility.&quot; data-og-host=&quot;css-tricks.com&quot; data-og-source-url=&quot;https://css-tricks.com/snippets/css/css-triangle/&quot; data-og-url=&quot;https://css-tricks.com/snippets/css/css-triangle/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bEZr85/hyT9NdDoFU/un9AiTlkuFKexvokMPceq0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=114_403_157_451,https://scrap.kakaocdn.net/dn/kLh4R/hyT9IXGUYr/kUcMU12fK2HMlyRgjVerxK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=114_403_157_451,https://scrap.kakaocdn.net/dn/bN9yVm/hyT9AZEw6i/1oK2XmaWGQz4gvBSgqn0Tk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=114_403_157_451&quot;&gt;&lt;a href=&quot;https://css-tricks.com/snippets/css/css-triangle/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://css-tricks.com/snippets/css/css-triangle/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bEZr85/hyT9NdDoFU/un9AiTlkuFKexvokMPceq0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=114_403_157_451,https://scrap.kakaocdn.net/dn/kLh4R/hyT9IXGUYr/kUcMU12fK2HMlyRgjVerxK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=114_403_157_451,https://scrap.kakaocdn.net/dn/bN9yVm/hyT9AZEw6i/1oK2XmaWGQz4gvBSgqn0Tk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=114_403_157_451');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CSS Triangle | CSS-Tricks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;You can make them with a single div. It's nice to have classes for each direction possibility.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;css-tricks.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;details[open]&lt;/b&gt;으로 해당 속성이 열리게 되었을 때 화살표를 &lt;b&gt;90deg&lt;/b&gt;로 회전(rotate)만 해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;abPPQgR&quot; data-user=&quot;yrbtnzxm-the-selector&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/yrbtnzxm-the-selector/pen/abPPQgR&quot;&gt; &amp;lt;details&amp;gt; and &amp;lt;summary&amp;gt; with animated arrow (no JS)&lt;/a&gt; by 김영민 (&lt;a href=&quot;https://codepen.io/yrbtnzxm-the-selector&quot;&gt;@yrbtnzxm-the-selector&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&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;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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과 CSS만으로도 이렇게 아코디언 UI를 만들 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript를 추가해서 부드럽게 컨텐츠 높이만큼 늘어나도록 할 수 있겠는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696822095595&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class QnA {
  constructor($element) {
    this.$element = $element;
    this.$summary = $element.querySelector('.question');
    this.$content = $element.querySelector('.answer');
   
    this.animation = null;  // animation 상태를 초기화
    this.isClosing = false; // 닫힌 상태인지
    this.isExpanding = false; // 열린 상태인지
    // css 변수에서 스타일을 가져오게 됨, 기본적으로 stirng이기 때문에 숫자형으로 변경
    this.CSSVariableTransition = Number(getComputedStyle(document.documentElement) 
    .getPropertyValue('--transition-duration').split('ms')[0]) || 300;
    this.$summary.addEventListener('click', (e) =&amp;gt; this.clickEvent(e));
  }

  clickEvent(e) {
    // 브라우저의 기본 동작을 막음
    e.preventDefault();
    /*
     * 만약, $element가 닫혀있거나(isClosing), open 속성이 false라면 oepnEvent로 열기
     * 만약, $element가 열려있거나(isExpanding), open 속성이 true라면 closeEvent로 닫기
     */
    if (this.isClosing || !this.$element.open) {
      this.openEvent();
    } else if (this.isExpanding || this.$element.open) {
      this.closeEvent();
    }
  }

  openEvent() {
    // 유동적으로 height를 조절하면서 부드럽게 열리도록 처리
    this.$element.style.height = `${this.$element.offsetHeight}px`; 
    // open상태를 강제로 true로 변경
    this.$element.open = true;
    // animation을 부여해서 확장하며 열리는 효과를 부여
    window.requestAnimationFrame(() =&amp;gt; this.expandEvent());
  }
  
  expandEvent() {
    // isExpanding 상태를 강제로 true로 변경
    this.isExpanding = true;
    // 현재 Height값을 저장
    const currentHeight = `${this.$element.offsetHeight}px`;
    // 현재 열려있는 Height값을 계산
    const expandHeight = `${this.$summary.offsetHeight + this.$content.offsetHeight}px`;
    
    // 이미 애니메이션이 진행중일 때는 취소한다. animation 내장 메서드 cancel 사용
    if (this.animation) {
      this.animation.cancel();
    }
    
    // animate 메서드 사용해서 부드럽게 열리도록 처리
    this.animation = this.$element.animate({
      // 현재 높이, 열려질 높이를 지정
      height: [currentHeight, expandHeight]
    }, {
      // CSS 변수에서 가져온 transition 값 할당
      duration: this.CSSVariableTransition,
      easing: 'ease-out'
    });
    // animation이 끝나게 되면 animation이 끝났다는 메서드 호출
    this.animation.onfinish = () =&amp;gt; this.onAnimationFinish(true);
    // animation이 취소 되면 animation이 취소되었으니 isExpanding을 강제로 false로 변경
    this.animation.oncancel = () =&amp;gt; this.isExpanding = false;
  }


  closeEvent() {
    this.isClosing = true;
    const currentHeight = `${this.$element.offsetHeight}px`;
    // summary의 높이 만큼 닫히도록 저장
    const closedHeight = `${this.$summary.offsetHeight}px`;
    
    if (this.animation) {
      this.animation.cancel();
    }
    
    this.animation = this.$element.animate({
      height: [currentHeight, closedHeight]
    }, {
      duration: this.CSSVariableTransition,
      easing: 'ease-out'
    });
    
    this.animation.onfinish = () =&amp;gt; this.onAnimationFinish(false);
    this.animation.oncancel = () =&amp;gt; this.isClosing = false;
  }
  // 애니메이션이 끝나면 초기화
  onAnimationFinish(isOpen) {
    this.$element.open = isOpen;
    this.animation = null;
    this.isClosing = false;
    this.isExpanding = false;
    this.$element.style.height = '';
  }
}

document.querySelectorAll('details').forEach(($element) =&amp;gt; {
  new QnA($element);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, Class 문법을 활용해서 각각의 $element를 정의 해줍니다.($를 붙이는 것은 element를 가리키는 암묵적인 룰입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 상태를 저장하고, CSS에서 변수를 가져와서 animation 할 때 초의 값으로 지정해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 값이 없을 때를 대비하여 300을 || (OR 연산자)를 사용해서 할당 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$summary 요소를 클릭하게 되면 clickEvent 메서드가 수행되도록 합니다.&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;그리고 details 요소들을 forEach로 순회하며 인스턴스를 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;KKbbbMZ&quot; data-user=&quot;yrbtnzxm-the-selector&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/yrbtnzxm-the-selector/pen/KKbbbMZ&quot;&gt; &amp;lt;details&amp;gt; 과 &amp;lt;summary&amp;gt; 를 사용, JavaScript를 첨가&lt;/a&gt; by 김영민 (&lt;a href=&quot;https://codepen.io/yrbtnzxm-the-selector&quot;&gt;@yrbtnzxm-the-selector&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&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;위와 같은 아코디언 UI를 만들어보면서 JavaScript를 더욱 즐겁게 공부합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://css-tricks.com/how-to-animate-the-details-element/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://css-tricks.com/how-to-animate-the-details-element/&lt;/a&gt;&lt;/p&gt;</description>
      <category>HTML</category>
      <category>details</category>
      <category>details Q&amp;amp;A</category>
      <category>details 사용</category>
      <category>details태그</category>
      <category>html details</category>
      <category>html5</category>
      <category>HTML5 Details</category>
      <category>Q&amp;amp;A</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/203</guid>
      <comments>https://frontdev.tistory.com/entry/HTML5-details-%ED%83%9C%EA%B7%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-QA-%EB%A7%8C%EB%93%A4%EA%B8%B0#entry203comment</comments>
      <pubDate>Mon, 9 Oct 2023 12:39:24 +0900</pubDate>
    </item>
    <item>
      <title>React의 미래: Create React App(CRA) 대신 Vite를 사용하자</title>
      <link>https://frontdev.tistory.com/entry/React%EC%9D%98-%EB%AF%B8%EB%9E%98-Create-React-App-%EC%82%AC%EC%9A%A9%EB%90%98%EC%A7%80-%EC%95%8A%EA%B3%A0-Vite%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 React 생태계에 몇 가지 중요한 변화가 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Create React App 지원 중단&lt;/b&gt;, &lt;b&gt;react.dev 출시&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Next.js 및 Remix와 같은 대체 프레임워크의 인기 증가&lt;/b&gt;가 포함됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Create React App 추천 X&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선 Create React App이 추천이 되지 않습니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Next.js 또는 Remix 등을 추천하고 있지만 클라이언트 사이드 핸들링만 하는 경우에는 Vite 또는 Parcel을 권유하고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;If you&amp;rsquo;re still not convinced, or your app has unusual constraints not served well by these frameworks and you&amp;rsquo;d like to roll your own custom setup, we can&amp;rsquo;t stop you&amp;mdash;go for it! Grab react and react-dom from npm, set up your custom build process with a bundler like Vite or Parcel, and add other tools as you need them for routing, static generation or server-side rendering, and more.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://react.dev/learn/start-a-new-react-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://react.dev/learn/start-a-new-react-project&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681534093620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Start a New React Project &amp;ndash; React&quot; data-og-description=&quot;The library for web and native user interfaces&quot; data-og-host=&quot;react.dev&quot; data-og-source-url=&quot;https://react.dev/learn/start-a-new-react-project&quot; data-og-url=&quot;https://react.dev/learn/start-a-new-react-project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjmMpY/hyShAVfOn4/itnRt3yz9oOvXwHjvZR67k/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567,https://scrap.kakaocdn.net/dn/MIA2G/hyShDqVjkA/v6K8CUOjerAR28QkmUrKxk/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567&quot;&gt;&lt;a href=&quot;https://react.dev/learn/start-a-new-react-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://react.dev/learn/start-a-new-react-project&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjmMpY/hyShAVfOn4/itnRt3yz9oOvXwHjvZR67k/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567,https://scrap.kakaocdn.net/dn/MIA2G/hyShDqVjkA/v6K8CUOjerAR28QkmUrKxk/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Start a New React Project &amp;ndash; React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The library for web and native user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;react.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://github.com/reactjs/react.dev/pull/5487#issuecomment-1409720741&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/reactjs/react.dev/pull/5487#issuecomment-1409720741&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681534264293&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Replace Create React App recommendation with Vite by t3dotgg &amp;middot; Pull Request #5487 &amp;middot; reactjs/react.dev&quot; data-og-description=&quot;Create React App is not a great recommendation to be making, especially for newer developers. As an educator, I run into countless issues w/ new React devs running into unnecessary issues due to th...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/reactjs/react.dev/pull/5487#issuecomment-1409720741&quot; data-og-url=&quot;https://github.com/reactjs/react.dev/pull/5487&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GkHh9/hyShKDzOlV/426XzbIAozB9SsNECWzPQK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/reactjs/react.dev/pull/5487#issuecomment-1409720741&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/reactjs/react.dev/pull/5487#issuecomment-1409720741&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GkHh9/hyShKDzOlV/426XzbIAozB9SsNECWzPQK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Replace Create React App recommendation with Vite by t3dotgg &amp;middot; Pull Request #5487 &amp;middot; reactjs/react.dev&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Create React App is not a great recommendation to be making, especially for newer developers. As an educator, I run into countless issues w/ new React devs running into unnecessary issues due to th...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Next.js 및 Remix 또는 Vite&lt;/b&gt;와&amp;nbsp;같은&amp;nbsp;대체&amp;nbsp;도구를&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;좋습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1681534271157&quot; class=&quot;applescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Vite 전역 설치
npm install -g vite

# 프로젝트 만들기
vite create my-react-app --template react
cd my-react-app

# 서버 구동
npm run dev&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;react.dev 출시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React&amp;nbsp;팀은&amp;nbsp;최근&amp;nbsp;React와&amp;nbsp;관련&amp;nbsp;문서를&amp;nbsp;위한&amp;nbsp;새로운&amp;nbsp;홈인&amp;nbsp;&lt;b&gt;react.dev&lt;/b&gt;를&amp;nbsp;출시했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://react.dev/&lt;/a&gt;&lt;br /&gt;새 사이트는 이전 React 문서의 업데이트된 버전이지만 많은 새로운 기능과 리소스로 크게 개선되었습니다.&lt;br /&gt;&lt;b&gt;react.dev&lt;/b&gt;의 눈에 띄는 기능 중 하나는 풍부한 다이어그램, 일러스트레이션 및 &lt;b&gt;600개 이상의 새로운 대화형 예제&lt;/b&gt;입니다.&lt;br /&gt;새로운 리소스를 통해 개발자는  시각화된 자료로 쉽게 예제를 구현할 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, &lt;b&gt;React를 배우기 시작한 새로운 개발자&lt;/b&gt;에게 도움이 많이 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;hooks&lt;/b&gt; 사용을 특히 강조를 많이하고 있습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1681534730558&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;React&quot; data-og-description=&quot;The library for web and native user interfaces&quot; data-og-host=&quot;react.dev&quot; data-og-source-url=&quot;https://react.dev/&quot; data-og-url=&quot;https://react.dev/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/trSaj/hyShJxTUxQ/SsfKtSDsTi1HEQLSXcFork/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567,https://scrap.kakaocdn.net/dn/mfrdw/hyShEQT4XM/DmfliCGmr6C8AKDSK2BZiK/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567&quot;&gt;&lt;a href=&quot;https://react.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://react.dev/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/trSaj/hyShJxTUxQ/SsfKtSDsTi1HEQLSXcFork/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567,https://scrap.kakaocdn.net/dn/mfrdw/hyShEQT4XM/DmfliCGmr6C8AKDSK2BZiK/img.png?width=1080&amp;amp;height=567&amp;amp;face=0_0_1080_567');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The library for web and native user interfaces&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;react.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Next.js 및 Remix와 같은 대체 프레임워크의 인기 증가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Next.js&lt;/b&gt;와 &lt;b&gt;Remix&lt;/b&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;&lt;b&gt;Next.js&lt;/b&gt;는 빠르고, SEO 친화적인 웹 애플리케이션을 쉽게 구축할 수 있게 해주는 &lt;b&gt;React용 서버 측 렌더링(SSR) 프레임워크&lt;/b&gt;입니다.&lt;br /&gt;여기에는 &lt;b&gt;자동 코드 분할, 최적화된 이미지 로드, TypeScript 및 CSS 모듈에 대한 기본 제공 지원과 같은 기능이 포함&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js를 사용하여 개발자는 빠르게 로드되고 뛰어난 사용자 경험을 제공하는 서버 렌더링 React 애플리케이션을 쉽게 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nextjs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nextjs.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681535145506&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Next.js by Vercel - The React Framework for the Web&quot; data-og-description=&quot;Used by some of the world's largest companies, Next.js enables you to create full-stack Web applications by extending the latest React features, and integrating powerful Rust-based JavaScript tooling for the fastest builds.&quot; data-og-host=&quot;nextjs.org&quot; data-og-source-url=&quot;https://nextjs.org/&quot; data-og-url=&quot;https://nextjs.org&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cMmqEQ/hyShIyZKQL/OFs95ay0334kmqx1L09pI1/img.png?width=2800&amp;amp;height=1600&amp;amp;face=0_0_2800_1600,https://scrap.kakaocdn.net/dn/CBQl9/hyShLCvh45/jPkiI93NPiEyd0k1SMkUlk/img.png?width=784&amp;amp;height=516&amp;amp;face=0_0_784_516,https://scrap.kakaocdn.net/dn/b2b1zt/hyShMBp4fz/ES8h9mZpikTIm9XTIjTVMK/img.png?width=621&amp;amp;height=485&amp;amp;face=0_0_621_485&quot;&gt;&lt;a href=&quot;https://nextjs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nextjs.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cMmqEQ/hyShIyZKQL/OFs95ay0334kmqx1L09pI1/img.png?width=2800&amp;amp;height=1600&amp;amp;face=0_0_2800_1600,https://scrap.kakaocdn.net/dn/CBQl9/hyShLCvh45/jPkiI93NPiEyd0k1SMkUlk/img.png?width=784&amp;amp;height=516&amp;amp;face=0_0_784_516,https://scrap.kakaocdn.net/dn/b2b1zt/hyShMBp4fz/ES8h9mZpikTIm9XTIjTVMK/img.png?width=621&amp;amp;height=485&amp;amp;face=0_0_621_485');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Next.js by Vercel - The React Framework for the Web&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Used by some of the world's largest companies, Next.js enables you to create full-stack Web applications by extending the latest React features, and integrating powerful Rust-based JavaScript tooling for the fastest builds.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nextjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1681535259449&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Next.js로 프로젝트 만들기
npx create-next-app@latest my-react-app
cd my-react-app

# 서버 구동
npm run dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Remix&lt;/b&gt;는 React 생태계에서 인기를 얻고 있는 또 다른 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Remix는 더 나은 &lt;b&gt;개발자 경험(DX)&lt;/b&gt;에 초점을 맞춘 웹 애플리케이션 구축에 대한 새로운 접근 방식입니다. &lt;br /&gt;내장된 linting, 고급 라우팅 및 서버리스 기능과 같은 기능이 포함되어 있어 고품질 React 애플리케이션을 빠르고 쉽게 구축할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Remix에는 또한 복잡한 프로젝트를 쉽게 구성하고 관리할 수 있는 고유한 파일 구조가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://remix.run/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://remix.run/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681535164375&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Remix - Build Better Websites&quot; data-og-description=&quot;Remix is a full stack web framework that lets you focus on the user interface and work back through web standards to deliver a fast, slick, and resilient user experience. People are gonna love using your stuff.&quot; data-og-host=&quot;remix.run&quot; data-og-source-url=&quot;https://remix.run/&quot; data-og-url=&quot;https://remix.run&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csseZC/hyShJ5LM13/cg1OKPqq59K9lXfUqc5zIk/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/bkh7G6/hyShIyZLSm/Sgh6DsaJyLkXyY4gj1odYK/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/beiVmP/hyShOlFOia/SOXHNQTYQU1HKpeMR9RswK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://remix.run/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://remix.run/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csseZC/hyShJ5LM13/cg1OKPqq59K9lXfUqc5zIk/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/bkh7G6/hyShIyZLSm/Sgh6DsaJyLkXyY4gj1odYK/img.jpg?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/beiVmP/hyShOlFOia/SOXHNQTYQU1HKpeMR9RswK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Remix - Build Better Websites&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Remix is a full stack web framework that lets you focus on the user interface and work back through web standards to deliver a fast, slick, and resilient user experience. People are gonna love using your stuff.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;remix.run&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1681535226857&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Remix로 새 프로젝트 만들기
npx create-remix@latest my-react-app
cd my-react-app

# 서버 구동
npm run dev&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;fin.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://blog.bitsrc.io/the-future-of-react-why-create-react-app-is-deprecated-and-hooks-are-the-future-83e8a087a325&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.bitsrc.io/the-future-of-react-why-create-react-app-is-deprecated-and-hooks-are-the-future-83e8a087a325&lt;/a&gt;&lt;/p&gt;</description>
      <category>SPA/REACT</category>
      <category>CRA</category>
      <category>cra deprecated</category>
      <category>react 미래</category>
      <category>react의 미래</category>
      <category>vite 사용</category>
      <category>리액트 cra</category>
      <category>리액트 vite</category>
      <category>리액트 미래</category>
      <category>리액트의 미래</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/202</guid>
      <comments>https://frontdev.tistory.com/entry/React%EC%9D%98-%EB%AF%B8%EB%9E%98-Create-React-App-%EC%82%AC%EC%9A%A9%EB%90%98%EC%A7%80-%EC%95%8A%EA%B3%A0-Vite%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90#entry202comment</comments>
      <pubDate>Sat, 15 Apr 2023 14:08:48 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 5.0 업데이트에서 달라진 것들 - Decorators</title>
      <link>https://frontdev.tistory.com/entry/Typescript-50-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%EC%97%90%EC%84%9C-%EB%8B%AC%EB%9D%BC%EC%A7%84-%EA%B2%83%EB%93%A4-Decorators</link>
      <description>&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#decorators&quot;&gt;Decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#const-type-parameters&quot;&gt;const&lt;span&gt;&amp;nbsp;&lt;/span&gt;Type Parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#supporting-multiple-configuration-files-in-extends&quot;&gt;Supporting Multiple Configuration Files in&lt;span&gt;&amp;nbsp;&lt;/span&gt;extends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#all-enums-are-union-enums&quot;&gt;All&lt;span&gt;&amp;nbsp;&lt;/span&gt;enums Are Union&lt;span&gt;&amp;nbsp;&lt;/span&gt;enums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#moduleresolution-bundler&quot;&gt;--moduleResolution bundler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#resolution-customization-flags&quot;&gt;Resolution Customization Flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #005da6;&quot; href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#verbatimmodulesyntax&quot;&gt;--verbatimModuleSyntax&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;decorators&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Decorators&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데코레이터는&amp;nbsp;클래스와&amp;nbsp;멤버를&amp;nbsp;재사용&amp;nbsp;가능한&amp;nbsp;방식으로&amp;nbsp;사용자&amp;nbsp;정의할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;해주는&amp;nbsp;곧&amp;nbsp;출시될&amp;nbsp;ECMAScript&amp;nbsp;기능입니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679331043951&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {
    name: string;
    constructor(name: string) {
        this.name = name;
    }

    greet() {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

const p = new Person(&quot;Ron&quot;);
p.greet();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;greet&lt;/b&gt;은 매우 간단하지만 훨씬 더 복잡한 것이라고 상상해 봅시다. 비동기 로직을 수행하고 재귀 함수가 있고, 부작용이 있을 수 있다고 생각 해봅시다. 그런 상황에서 디버깅을 위해서 &lt;b&gt;console.log()&lt;/b&gt;를 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1679331218226&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {
    name: string;
    constructor(name: string) {
        this.name = name;
    }

    greet() {
        console.log(&quot;LOG: Entering method.&quot;);

        console.log(`Hello, my name is ${this.name}.`);

        console.log(&quot;LOG: Exiting method.&quot;)
    }
}&lt;/code&gt;&lt;/pre&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;logMethod라는 함수를 작성할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1679331287469&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function loggedMethod(originalMethod: any, context: ClassMethodDecoratorContext) {
    const methodName = String(context.name);

    function replacementMethod(this: any, ...args: any[]) {
        console.log(`LOG: Entering method '${methodName}'.`)
        const result = originalMethod.call(this, ...args);
        console.log(`LOG: Exiting method '${methodName}'.`)
        return result;
    }

    return replacementMethod;
}

class Person {
    name: string;
    constructor(name: string) {
        this.name = name;
    }

    @loggedMethod
    greet() {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

const p = new Person(&quot;Ron&quot;);
p.greet();

// Output:
//
//   LOG: Entering method.
//   Hello, my name is Ron.
//   LOG: Exiting method.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;TypeScript는 메서드 데코레이터가 사용하는 컨텍스트 개체를 모델링하는 &lt;b&gt;ClassMethodDecoratorContext&lt;/b&gt;라는 유형을 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;addInitializer를 사용하여 생성자에서 바인딩을 호출하는 데코레이터를 작성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679331558828&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function bound(originalMethod: any, context: ClassMethodDecoratorContext) {
    const methodName = context.name;
    if (context.private) {
        throw new Error(`'bound' cannot decorate private properties like ${methodName as string}.`);
    }
    context.addInitializer(function () {
        this[methodName] = this[methodName].bind(this);
    });
}

class Person {
    name: string;
    constructor(name: string) {
        this.name = name;
    }

    @bound
    @loggedMethod
    greet() {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

const p = new Person(&quot;Ron&quot;);
const greet = p.greet;

// Works!
greet();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;@bound&lt;/b&gt; 및 &lt;b&gt;@loggedMethod&lt;/b&gt;라는 2개의 데코레이터를 사용 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;실행 순서는 &lt;b&gt;&quot;역순&quot;&lt;/b&gt; 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;또한,&amp;nbsp;&lt;/span&gt;logMethod가 데코레이터를 반환하도록 하고 메시지를 기록하는 방법을 사용자 정의할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679331737358&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function loggedMethod(headMessage = &quot;LOG:&quot;) {
    return function actualDecorator(originalMethod: any, context: ClassMethodDecoratorContext) {
        const methodName = String(context.name);
        function replacementMethod(this: any, ...args: any[]) {
            console.log(`${headMessage} Entering method '${methodName}'.`)
            const result = originalMethod.call(this, ...args);
            console.log(`${headMessage} Exiting method '${methodName}'.`)
            return result;
        }
        return replacementMethod;
    }
}

class Person {
    name: string;
    constructor(name: string) {
        this.name = name;
    }

    @loggedMethod(&quot;&quot;)
    greet() {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

const p = new Person(&quot;Ron&quot;);
p.greet();

// Output:
//
//    Entering method 'greet'.
//   Hello, my name is Ron.
//    Exiting method 'greet'.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;experimentalDecorators&lt;/b&gt;는&amp;nbsp;당분간&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;export 키워드 앞에 데코레이터를 추가할 수 있습니다.&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;pre id=&quot;code_1679333090363&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//  allowed
@register export default class Foo {
    // ...
}

//  also allowed
export default @register class Bar {
    // ...
}

//  error - before *and* after is not allowed
@before export @after class Bar {
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의&amp;nbsp;loggingMethod&amp;nbsp;및&amp;nbsp;바인딩된&amp;nbsp;데코레이터&amp;nbsp;예제는&amp;nbsp;의도적으로&amp;nbsp;단순하며&amp;nbsp;유형에&amp;nbsp;대한&amp;nbsp;많은&amp;nbsp;세부&amp;nbsp;정보를&amp;nbsp;생략합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력&amp;nbsp;데코레이터는&amp;nbsp;상당히&amp;nbsp;복잡할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;위의&amp;nbsp;logMethod의&amp;nbsp;올바른&amp;nbsp;유형&amp;nbsp;버전은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1679333194392&quot; class=&quot;stata&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function loggedMethod&amp;lt;This, Args extends any[], Return&amp;gt;(
    target: (this: This, ...args: Args) =&amp;gt; Return,
    context: ClassMethodDecoratorContext&amp;lt;This, (this: This, ...args: Args) =&amp;gt; Return&amp;gt;
) {
    const methodName = String(context.name);

    function replacementMethod(this: This, ...args: Args): Return {
        console.log(`LOG: Entering method '${methodName}'.`)
        const result = target.call(this, ...args);
        console.log(`LOG: Exiting method '${methodName}'.`)
        return result;
    }

    return replacementMethod;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This, Args 및 Return 유형 매개변수를 사용하여 this 유형, 매개변수 및 원래 메서드의 반환 유형을 별도로 모델링해야 했습니다.&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;b&gt;const type parameters&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;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679330996790&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Announcing TypeScript 5.0 - TypeScript&quot; data-og-description=&quot;Today we&amp;rsquo;re excited to announce the release of TypeScript 5.0! This release brings many new features, while aiming to make TypeScript smaller, simpler, and faster. We&amp;rsquo;ve implemented the new decorators standard, added functionality to better support ESM&quot; data-og-host=&quot;devblogs.microsoft.com&quot; data-og-source-url=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&quot; data-og-url=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bg1vtb/hyRZdmsSFt/PcK5HMpkC0UnGRtDSE46Qk/img.png?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500,https://scrap.kakaocdn.net/dn/sUGaG/hyR0jL6ZfH/WmwwOLpKiXF2J0dWeckpL1/img.png?width=1969&amp;amp;height=1852&amp;amp;face=0_0_1969_1852,https://scrap.kakaocdn.net/dn/VoPpp/hyRYZ2Pzz7/4MtsfaM67VofO6qjoaKGgK/img.png?width=2430&amp;amp;height=1456&amp;amp;face=0_0_2430_1456&quot;&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bg1vtb/hyRZdmsSFt/PcK5HMpkC0UnGRtDSE46Qk/img.png?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500,https://scrap.kakaocdn.net/dn/sUGaG/hyR0jL6ZfH/WmwwOLpKiXF2J0dWeckpL1/img.png?width=1969&amp;amp;height=1852&amp;amp;face=0_0_1969_1852,https://scrap.kakaocdn.net/dn/VoPpp/hyRYZ2Pzz7/4MtsfaM67VofO6qjoaKGgK/img.png?width=2430&amp;amp;height=1456&amp;amp;face=0_0_2430_1456');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Announcing TypeScript 5.0 - TypeScript&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Today we&amp;rsquo;re excited to announce the release of TypeScript 5.0! This release brings many new features, while aiming to make TypeScript smaller, simpler, and faster. We&amp;rsquo;ve implemented the new decorators standard, added functionality to better support ESM&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devblogs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Typescript</category>
      <category>TypeScript</category>
      <category>typescript 5</category>
      <category>typescript 5 달라진 것</category>
      <category>typescript 5업데이트</category>
      <category>typescript update 5</category>
      <category>타입스크립트</category>
      <category>타입스크립트 5</category>
      <category>타입스크립트 5 달라진 것들</category>
      <category>타입스크립트 5 업데이트</category>
      <category>타입스크립트 업데이트 5</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/201</guid>
      <comments>https://frontdev.tistory.com/entry/Typescript-50-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%EC%97%90%EC%84%9C-%EB%8B%AC%EB%9D%BC%EC%A7%84-%EA%B2%83%EB%93%A4-Decorators#entry201comment</comments>
      <pubDate>Sun, 9 Apr 2023 16:13:22 +0900</pubDate>
    </item>
    <item>
      <title>2023 17가지 UX/UI 트렌드</title>
      <link>https://frontdev.tistory.com/entry/2023-17%EA%B0%80%EC%A7%80-UXUI-%ED%8A%B8%EB%A0%8C%EB%93%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2022년에도 많은 일들이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년에도 UX/UI에 있어서 끊임없는 변화는 당연합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UX 디자인의 좋은 예를 따르고 복제하는 것이 필수적인 상황입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년 17가지 상위 UX/UI 트렌드와 새로운 트렌드를 확인해야 하는 이유를 살펴보시죠 : )&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 다크모드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올 해도 변함없이, 다크모드는 사랑받고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외관은&amp;nbsp;우아하고&amp;nbsp;세련되며&amp;nbsp;현대적입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰과&amp;nbsp;노트북으로&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;시간을&amp;nbsp;보내면서&amp;nbsp;다크&amp;nbsp;모드는&amp;nbsp;사용자&amp;nbsp;경험에서&amp;nbsp;중요한&amp;nbsp;역할을&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다크모드의 아름다움 외의 장점들에 대해서 살펴보시죠.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;장치가 OLED 또는 AMOLED 화면을 사용하는 경우에는 배터리가 절약 됩니다.&lt;/li&gt;
&lt;li&gt;텍스트 가독성 측면에서 좋습니다.&lt;/li&gt;
&lt;li&gt;밤에 장치를 사용하는 동안 눈의 피로를 줄일 수 있습니다.&lt;/li&gt;
&lt;li&gt;화면 눈부심 및 블루라이트를 최소화 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V7RKm/btr1Xxiq77z/AqNZDPm4FXndA5ZMhqkFU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V7RKm/btr1Xxiq77z/AqNZDPm4FXndA5ZMhqkFU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V7RKm/btr1Xxiq77z/AqNZDPm4FXndA5ZMhqkFU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV7RKm%2Fbtr1Xxiq77z%2FAqNZDPm4FXndA5ZMhqkFU1%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;1530&quot; height=&quot;1388&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Neumorphism(뉴모피즘)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스큐어모피즘(Skeuomorphism)은 대상을 원래 그대로의 모습으로 사실적으로 표현하는 기법을 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 스큐어모피즘과 new(새로운)의 합성어로 Neumorphism이 탄생 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스큐어모피즘 스타일의 아이콘과 뉴모피즘 스타일의 아이콘을 비교 해보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHX5ij/btr1UtujIkh/CliKwQbxB32SkmJoEn7Cr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHX5ij/btr1UtujIkh/CliKwQbxB32SkmJoEn7Cr1/img.png&quot; data-alt=&quot;매우 사실적인 스큐어모피즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHX5ij/btr1UtujIkh/CliKwQbxB32SkmJoEn7Cr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHX5ij%2Fbtr1UtujIkh%2FCliKwQbxB32SkmJoEn7Cr1%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;1744&quot; height=&quot;472&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;472&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/98Eb2/btr1YJCVTZA/KiSd4VBPKBooySCMYpCVOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/98Eb2/btr1YJCVTZA/KiSd4VBPKBooySCMYpCVOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/98Eb2/btr1YJCVTZA/KiSd4VBPKBooySCMYpCVOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F98Eb2%2Fbtr1YJCVTZA%2FKiSd4VBPKBooySCMYpCVOK%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;665&quot; height=&quot;228&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;부드러운 느낌의 UI 요소는 매우 편안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인&amp;nbsp;측면에서&amp;nbsp;아름답고&amp;nbsp;미래&amp;nbsp;지향적입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&amp;nbsp;2023년에는&amp;nbsp;Neumorphic&amp;nbsp;UI가&amp;nbsp;더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이&amp;nbsp;구현되는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGXhaG/btr2m2t8wSA/F2knbJ4uek40WMamVwY7kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGXhaG/btr2m2t8wSA/F2knbJ4uek40WMamVwY7kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGXhaG/btr2m2t8wSA/F2knbJ4uek40WMamVwY7kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGXhaG%2Fbtr2m2t8wSA%2FF2knbJ4uek40WMamVwY7kk%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;300&quot; height=&quot;462&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Animations&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자이너는 UI 애니메이션을 활용하여 정적 그래픽보다 흐름을 훨씬 더 잘 안내하여 사용자 경험을 향상시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년에는 UI와 제품 프로모션 모두에서 점점 더 많은 애니메이션이 등장할 것입니다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ux-ui-trends-animation.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42ZCh/btr2aIQA9qf/okWu9CM1UwldkUoPopdHkk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42ZCh/btr2aIQA9qf/okWu9CM1UwldkUoPopdHkk/img.gif&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://dribbble.com/shots/10865609-Travel-App-Concept&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42ZCh/btr2aIQA9qf/okWu9CM1UwldkUoPopdHkk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/42ZCh/btr2aIQA9qf/okWu9CM1UwldkUoPopdHkk/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;800&quot; height=&quot;600&quot; data-filename=&quot;ux-ui-trends-animation.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://dribbble.com/shots/10865609-Travel-App-Concept&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 진보된 마이크로 인터렉션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋아요, 리트윗 등 제스처 및 터치리스 컨트롤, IPhone 14 시리즈 이후의 다이내믹 아일랜드 등 고급 마이크로 인터렉션들이 트렌드가 되고 있고, 이는 2023년에 더 성장하고 다양해질 예정입니다.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 굵은 타이포그래피&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굵은 글꼴은 사용자의 관심을 끄는 가장 쉬운 방법 중 하나입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;2134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blQ2Pl/btr1UVw5dSV/u1JHOU8aFBoMem5Zw8U0l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blQ2Pl/btr1UVw5dSV/u1JHOU8aFBoMem5Zw8U0l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blQ2Pl/btr1UVw5dSV/u1JHOU8aFBoMem5Zw8U0l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblQ2Pl%2Fbtr1UVw5dSV%2Fu1JHOU8aFBoMem5Zw8U0l1%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;2338&quot; height=&quot;2134&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;2134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 부드러운 그라디언트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microsoft의 디자인 시스템과 macOS Big Sur에서 Apple의 새로운 디자인 접근 방식은 그래디언트 기반 디자인의 두 가지 큰 장점입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4a1Ic/btr114NwA5k/CevOwlZ5W8roqKs4p9a9G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4a1Ic/btr114NwA5k/CevOwlZ5W8roqKs4p9a9G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4a1Ic/btr114NwA5k/CevOwlZ5W8roqKs4p9a9G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4a1Ic%2Fbtr114NwA5k%2FCevOwlZ5W8roqKs4p9a9G1%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;396&quot; height=&quot;684&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ91WP/btr1T6eyh0b/k7zyPqrEbK4ndomC01kKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ91WP/btr1T6eyh0b/k7zyPqrEbK4ndomC01kKkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ91WP/btr1T6eyh0b/k7zyPqrEbK4ndomC01kKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ91WP%2Fbtr1T6eyh0b%2Fk7zyPqrEbK4ndomC01kKkk%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;1468&quot; height=&quot;750&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 3D는 어디에나 있다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3D&amp;nbsp;디자인은&amp;nbsp;지난&amp;nbsp;몇&amp;nbsp;년&amp;nbsp;동안&amp;nbsp;사용자를&amp;nbsp;끌어들였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리&amp;nbsp;소비에&amp;nbsp;대한&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;단점에도&amp;nbsp;불구하고&amp;nbsp;3D는&amp;nbsp;모바일&amp;nbsp;및&amp;nbsp;웹&amp;nbsp;응용&amp;nbsp;프로그램&amp;nbsp;모두에서&amp;nbsp;추세입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4016&quot; data-origin-height=&quot;1786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDHsqH/btr1Uutgy3x/ZFJLBsJNlqZGakSmd3VZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDHsqH/btr1Uutgy3x/ZFJLBsJNlqZGakSmd3VZKK/img.png&quot; data-alt=&quot;https://virtual.bbcmic.ro/?disc1=elite.ssd&amp;amp;amp;autoboot&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDHsqH/btr1Uutgy3x/ZFJLBsJNlqZGakSmd3VZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDHsqH%2Fbtr1Uutgy3x%2FZFJLBsJNlqZGakSmd3VZKK%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;4016&quot; height=&quot;1786&quot; data-origin-width=&quot;4016&quot; data-origin-height=&quot;1786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://virtual.bbcmic.ro/?disc1=elite.ssd&amp;amp;autoboot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 빈 페이지나 에러 페이지의 illustration&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류나 에러 페이지의 끔찍함과 무서움을 귀엽고 유머러스하게 풀어내기 위한 한 방법 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF0daw/btr1T5010a8/kvx9nlPa3vtOiUzTKvo1z1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF0daw/btr1T5010a8/kvx9nlPa3vtOiUzTKvo1z1/img.webp&quot; data-alt=&quot;출처 : https://dribbble.com/shots/6606110-404-Page-Not-Found&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF0daw/btr1T5010a8/kvx9nlPa3vtOiUzTKvo1z1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF0daw%2Fbtr1T5010a8%2Fkvx9nlPa3vtOiUzTKvo1z1%2Fimg.webp&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;800&quot; height=&quot;600&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://dribbble.com/shots/6606110-404-Page-Not-Found&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. 디자인 시스템&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Material, Ant, Fluent 등 다양한 디자인 시스템들이 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점점 더 많은 회사들이 통합 디자인 경험과 디자인 시스템 구축에 대해서 진지하게 생각 중입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2546&quot; data-origin-height=&quot;1950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/szsK3/btr1XP39yvb/uj9Y39rIv169BH7hiPkf6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/szsK3/btr1XP39yvb/uj9Y39rIv169BH7hiPkf6K/img.png&quot; data-alt=&quot;https://daisyui.com/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/szsK3/btr1XP39yvb/uj9Y39rIv169BH7hiPkf6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FszsK3%2Fbtr1XP39yvb%2Fuj9Y39rIv169BH7hiPkf6K%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;2546&quot; height=&quot;1950&quot; data-origin-width=&quot;2546&quot; data-origin-height=&quot;1950&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://daisyui.com/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10. 원격 및 가상 공간의 협업에 대한 UX&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격 및 가상 공간의 협업이 대두되던 2020년대에서 펜데믹의 영향으로 기하급수적으로 확산된 양상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시금 줄어들고는 있지만, 이 트렌드는 스테디한 상태가 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SHyJh/btr18EHs44C/bV00fNxmAaRJkMaHeJF8hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SHyJh/btr18EHs44C/bV00fNxmAaRJkMaHeJF8hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SHyJh/btr18EHs44C/bV00fNxmAaRJkMaHeJF8hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSHyJh%2Fbtr18EHs44C%2FbV00fNxmAaRJkMaHeJF8hK%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;518&quot; height=&quot;320&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;11. 증강 및 가상현실&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AR/VR 내에서 다양하고 흥미진진한 경험을 혁신하고 창출할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmp1qQ/btr2m3fvSBB/vOnaApBLo3dE8WawVe6KOK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmp1qQ/btr2m3fvSBB/vOnaApBLo3dE8WawVe6KOK/img.webp&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://www.roadtovr.com/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmp1qQ/btr2m3fvSBB/vOnaApBLo3dE8WawVe6KOK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmp1qQ%2Fbtr2m3fvSBB%2FvOnaApBLo3dE8WawVe6KOK%2Fimg.webp&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;1021&quot; height=&quot;580&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://www.roadtovr.com/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12. 음성 인터렉션과 터치하지 않는 인터렉션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팬데믹 이후 많은 사람들이 터치리스를 통한 인터렉션을 원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화장실을 이용할 때도 손을 대지 않고 모든 것을 사용할 수 있게끔 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스트 팬데믹 이후에도 이러한 트렌드는 계속되리라 생각됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;13. 사용자 온보딩 경험 향상&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 직전에 이미 로그인 한 부분들에 대해서 바로 사용할 수 있고, 수백만명이 화상회의 및 원격 작업을 함에 있어서 좋은 온보딩의 힘은 갈수록 강해지는 중입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;2100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9MoRf/btr1Y9ux9cR/tKLeFUkgi1PZAqpqsiQcFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9MoRf/btr1Y9ux9cR/tKLeFUkgi1PZAqpqsiQcFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9MoRf/btr1Y9ux9cR/tKLeFUkgi1PZAqpqsiQcFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9MoRf%2Fbtr1Y9ux9cR%2FtKLeFUkgi1PZAqpqsiQcFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;561&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;2100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;14. 원활한 인증&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점점 password를 일일이 다 타이핑하기 귀찮아 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생체 인식 로그인과 이미 로그인 된 상황 등에 집중하고 수요가 계속되고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZDuTD/btr134T1sHL/aqvLaF5KLg8ItvMKd6WOJ1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZDuTD/btr134T1sHL/aqvLaF5KLg8ItvMKd6WOJ1/img.webp&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://www.macrumors.com/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZDuTD/btr134T1sHL/aqvLaF5KLg8ItvMKd6WOJ1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZDuTD%2Fbtr134T1sHL%2FaqvLaF5KLg8ItvMKd6WOJ1%2Fimg.webp&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;1160&quot; height=&quot;747&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://www.macrumors.com/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;15. UX 작성 및 마이크로 카피&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드를&amp;nbsp;염두에&amp;nbsp;두고&amp;nbsp;작성된&amp;nbsp;특정&amp;nbsp;마이크로카피는&amp;nbsp;친근한&amp;nbsp;경험을&amp;nbsp;구축하는&amp;nbsp;데&amp;nbsp;큰&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UX&amp;nbsp;작성&amp;nbsp;및&amp;nbsp;마이크로카피는&amp;nbsp;전체&amp;nbsp;UX&amp;nbsp;디자인에서&amp;nbsp;중요한&amp;nbsp;역할을&amp;nbsp;하며&amp;nbsp;올해&amp;nbsp;그&amp;nbsp;기반을&amp;nbsp;유지할&amp;nbsp;것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2748&quot; data-origin-height=&quot;2086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCGQSt/btr1QyvHLnt/qUaeNMWzjlJZ3J9kQglLE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCGQSt/btr1QyvHLnt/qUaeNMWzjlJZ3J9kQglLE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCGQSt/btr1QyvHLnt/qUaeNMWzjlJZ3J9kQglLE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCGQSt%2Fbtr1QyvHLnt%2FqUaeNMWzjlJZ3J9kQglLE1%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;618&quot; height=&quot;469&quot; data-origin-width=&quot;2748&quot; data-origin-height=&quot;2086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;16. 개인화된 경험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어,&amp;nbsp;전자&amp;nbsp;상거래&amp;nbsp;사이트에서&amp;nbsp;개인화된&amp;nbsp;구매&amp;nbsp;권장&amp;nbsp;사항은&amp;nbsp;'필요하지&amp;nbsp;않습니다'라는&amp;nbsp;구매자&amp;nbsp;저항을&amp;nbsp;빠르게&amp;nbsp;극복합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI와&amp;nbsp;기계&amp;nbsp;학습의&amp;nbsp;부상으로&amp;nbsp;소프트웨어&amp;nbsp;제품에서&amp;nbsp;보다&amp;nbsp;개인화된&amp;nbsp;경험을&amp;nbsp;보게&amp;nbsp;될&amp;nbsp;것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnhV7p/btr1YJCWzes/s4nvKbNnFwjPm0nHngHo5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnhV7p/btr1YJCWzes/s4nvKbNnFwjPm0nHngHo5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnhV7p/btr1YJCWzes/s4nvKbNnFwjPm0nHngHo5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnhV7p%2Fbtr1YJCWzes%2Fs4nvKbNnFwjPm0nHngHo5k%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;2428&quot; height=&quot;642&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;17. 슈퍼앱의 부상&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;야놀자, 오늘의 집과 같은 소위 슈퍼 앱은 아시아 국가에서 엄청난 인기를 얻고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKbrD5/btr1XPQEUzR/4wHJjtnpy78vbt80QO0dgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKbrD5/btr1XPQEUzR/4wHJjtnpy78vbt80QO0dgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKbrD5/btr1XPQEUzR/4wHJjtnpy78vbt80QO0dgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKbrD5%2Fbtr1XPQEUzR%2F4wHJjtnpy78vbt80QO0dgk%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;624&quot; height=&quot;954&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceDPXb/btr1WmVtxHn/UZGl7mFekdym3Gy2lLecq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceDPXb/btr1WmVtxHn/UZGl7mFekdym3Gy2lLecq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceDPXb/btr1WmVtxHn/UZGl7mFekdym3Gy2lLecq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceDPXb%2Fbtr1WmVtxHn%2FUZGl7mFekdym3Gy2lLecq1%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;634&quot; height=&quot;331&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;630&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;h2 data-ke-size=&quot;size26&quot;&gt;왜 UX/UI 트렌드를 체크하는가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 트렌드가 지속적으로 등장하고 성장하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UX/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;따라서 지속적으로 animation과 디자인 등 최신 디자인 트렌드를 계속해서 섭취 해보세요 : )&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;fin.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://userguiding.com/blog/ux-ui-trends/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://userguiding.com/blog/ux-ui-trends/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678028331599&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;17 UX/UI Trends for 2023&quot; data-og-description=&quot;2022 has been a roller coaster ride. So many things happened that year and happened fast. With the rise of virtual and remote working culture, UX/UI trends have seen a drastic change throughout the year.&quot; data-og-host=&quot;userguiding.com&quot; data-og-source-url=&quot;https://userguiding.com/blog/ux-ui-trends/&quot; data-og-url=&quot;https://userguiding.com/blog/ux-ui-trends/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p3GhX/hyRQqZwRBF/ijuCYAKqjBKCbHQ4fzqKKk/img.jpg?width=950&amp;amp;height=450&amp;amp;face=0_0_950_450,https://scrap.kakaocdn.net/dn/dr2l18/hyRQhn5URo/ob4ctWQgJCVTSUTxb7A1ik/img.jpg?width=1196&amp;amp;height=628&amp;amp;face=0_0_1196_628,https://scrap.kakaocdn.net/dn/taeW8/hyRQu8JF2e/8MG9uUn2HvhGTRIJP94Mgk/img.jpg?width=950&amp;amp;height=450&amp;amp;face=0_0_950_450,https://scrap.kakaocdn.net/dn/bH52oL/hyRQv0RWc3/85i9MKUMLSsxxqNRap9Kdk/img.jpg?width=1196&amp;amp;height=628&amp;amp;face=0_0_1196_628&quot;&gt;&lt;a href=&quot;https://userguiding.com/blog/ux-ui-trends/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://userguiding.com/blog/ux-ui-trends/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p3GhX/hyRQqZwRBF/ijuCYAKqjBKCbHQ4fzqKKk/img.jpg?width=950&amp;amp;height=450&amp;amp;face=0_0_950_450,https://scrap.kakaocdn.net/dn/dr2l18/hyRQhn5URo/ob4ctWQgJCVTSUTxb7A1ik/img.jpg?width=1196&amp;amp;height=628&amp;amp;face=0_0_1196_628,https://scrap.kakaocdn.net/dn/taeW8/hyRQu8JF2e/8MG9uUn2HvhGTRIJP94Mgk/img.jpg?width=950&amp;amp;height=450&amp;amp;face=0_0_950_450,https://scrap.kakaocdn.net/dn/bH52oL/hyRQv0RWc3/85i9MKUMLSsxxqNRap9Kdk/img.jpg?width=1196&amp;amp;height=628&amp;amp;face=0_0_1196_628');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17 UX/UI Trends for 2023&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2022 has been a roller coaster ride. So many things happened that year and happened fast. With the rise of virtual and remote working culture, UX/UI trends have seen a drastic change throughout the year.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;userguiding.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>UI,UX,접근성,기본개념 등</category>
      <category>2023 trend</category>
      <category>2023 ui trend</category>
      <category>2023 ui ux</category>
      <category>2023 ui ux 트렌드</category>
      <category>2023 ui/ux</category>
      <category>2023 트렌드 ui/ux</category>
      <category>UI UX</category>
      <category>ui ux trend</category>
      <category>ui ux 트렌드</category>
      <category>ui/ux trend</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/199</guid>
      <comments>https://frontdev.tistory.com/entry/2023-17%EA%B0%80%EC%A7%80-UXUI-%ED%8A%B8%EB%A0%8C%EB%93%9C#entry199comment</comments>
      <pubDate>Mon, 6 Mar 2023 01:08:02 +0900</pubDate>
    </item>
    <item>
      <title>Docker에서 ElasticSearch로 Full-Text 검색하기(4)</title>
      <link>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B04</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B01&quot;&gt;Docker에서 ElasticSearch로 Full-Text 검색하기(1)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B02&quot;&gt;Docker에서 ElasticSearch로 Full-Text 검색하기(2)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker에서 ElasticSearch로 Full-Text 검색하기(3)&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;지난 시간에 이어서, 마지막으로 elasticSearch로 작성 된 App을 배포하고 사용해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App을 배포하기 전에 express로 클라이언트 route를 구성해서 browser에서 검색 결과를 바로 확인할 수 있도록 하고, 불필요한 코드를 정리 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;express를 설치해주세요.&lt;/p&gt;
&lt;pre id=&quot;code_1678012360930&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i express&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1678012251679&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const express = require(&quot;express&quot;);
const app = express();
const port = process.env.PORT || 3000;

app.listen(port, () =&amp;gt; {
  console.log(&quot;server connected&quot;);
});

app.get(&quot;/search&quot;, async (req, res) =&amp;gt; {
  const query = req.query.q;

  try {
    const results = await searchQuery(query);
    res.json(results);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: &quot;Internal sever error&quot; });
  }
});

const { Client } = require(&quot;elasticsearch&quot;);

const client = new Client({
  host: &quot;http://host.docker.internal:9200&quot;,
  log: &quot;trace&quot;,
});

const searchQuery = async function (query) {
  const { hits } = await client.search({
    index: &quot;indexing&quot;,
    body: {
      query: {
        fuzzy: {
          content: {
            value: query,
            fuzziness: &quot;AUTO&quot;,
          },
        },
      },
    },
  });
  return hits.hits ?? [];
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js 파일의 상단에 express를 호출하고, 3000 포트로 띄우는 코드를 삽입했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;route를 /search로 하여 /search?q=elk 와 같이 검색 했을 시에 searchQuery함수를 실행하여, 해당 fuzzy 검색 결과의 hits를 반환하도록 했습니다.&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;docker에 배포하기 위해서 host의 주소를 http://localhost:9200가 아닌 &lt;a href=&quot;http://host.docker.internal:9200&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://host.docker.internal:9200&lt;/a&gt;로 해줘야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1678012380247&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;dependencies&quot;: {
    &quot;elasticsearch&quot;: &quot;^16.7.3&quot;,
    &quot;express&quot;: &quot;^4.18.2&quot;
  },
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node index.js&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 package.json파일 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scripts는 하단 npm start가 실행될 수 있도록 설정 해두었습니다.&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;Docker에&amp;nbsp;Node.js&amp;nbsp;앱을&amp;nbsp;배포하려면&amp;nbsp;먼저&amp;nbsp;앱의&amp;nbsp;Docker&amp;nbsp;이미지를&amp;nbsp;빌드해야&amp;nbsp;합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는&amp;nbsp;필요한&amp;nbsp;구성을&amp;nbsp;지정하는&amp;nbsp;앱&amp;nbsp;디렉터리의&amp;nbsp;루트에&amp;nbsp;Dockerfile을&amp;nbsp;생성하여&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node app의 root에 &quot;Dockerfile&quot;을 생성하세요.&lt;/p&gt;
&lt;pre id=&quot;code_1678006037458&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Use the official Node.js image as the base image
FROM node:latest

# Set the working directory to /app
WORKDIR /app

# Copy the package.json and package-lock.json files to the container
COPY package*.json ./

# Install the app dependencies
RUN npm install

# Copy the rest of the app files to the container
COPY . .

# Set the environment variables for ElasticSearch
ENV ELASTICSEARCH_HOST=elasticsearch
ENV ELASTICSEARCH_PORT=9200

# Expose the port that the app will run on
EXPOSE 3000

# Start the app
CMD [&quot;npm&quot;, &quot;start&quot;]&lt;/code&gt;&lt;/pre&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;공식 Node.js 이미지를 기본 이미지로 지정&lt;/li&gt;
&lt;li&gt;작업 디렉토리를 /app으로 지정&lt;/li&gt;
&lt;li&gt;package.json 및 package.lock.json 파일을 컨테이너에 복사&lt;/li&gt;
&lt;li&gt;앱 종속성을 설치하는 명령어&lt;/li&gt;
&lt;li&gt;나머지 앱 파일들도 컨테이너에 복사&lt;/li&gt;
&lt;li&gt;호스트 및 포트에 대한 환경 변수 설정&lt;/li&gt;
&lt;li&gt;포트 설정&lt;/li&gt;
&lt;li&gt;노드 앱 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Docker 이미지를 빌드하려면 다음 명령어를 실행해보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1678006296951&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t docker-elk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-elk는 제가 생성한 node 앱의 폴더 명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-elk로 Docker image가 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 배포를 해보시죠.&lt;/p&gt;
&lt;pre id=&quot;code_1678006743247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ocker run -p 3000:3000 --name docker-elk --link elasticsearch:elasticsearch docker-elk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 하고 난 뒤에 localhost:3000/search?q=elk으로 접속하면 이전에 indexing으로 데이터 생성해두었던 것들이 검색되어 화면에 노출될 것입니다.&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;1278&quot; data-origin-height=&quot;1778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kflqz/btr1YJv0zri/Drcw9v7u0xx6dshcHOBakK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kflqz/btr1YJv0zri/Drcw9v7u0xx6dshcHOBakK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kflqz/btr1YJv0zri/Drcw9v7u0xx6dshcHOBakK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKflqz%2Fbtr1YJv0zri%2FDrcw9v7u0xx6dshcHOBakK%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;1278&quot; height=&quot;1778&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;1778&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;그 외에도 elasticsearch에서 데이터들을 확인할 수 있는 주소들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:9200/_cat/indices&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:9200/indexing(먼저 indexing으로 데이터를 생성해두었던 부분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:9200/_cluster/health?pretty=true(클러스터의 헬스체크)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:9200/indexing/_doc/_search(sarch시에 데이터 결과)&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;a href=&quot;https://github.com/oinochoe/docker_elk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/oinochoe/docker_elk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678017967456&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - oinochoe/docker_elk: docker_elk_example&quot; data-og-description=&quot;docker_elk_example. Contribute to oinochoe/docker_elk development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/oinochoe/docker_elk&quot; data-og-url=&quot;https://github.com/oinochoe/docker_elk&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJYUD5/hyRQxxqJft/JYcfnAWotlt83nxGfpuKyk/img.png?width=1200&amp;amp;height=600&amp;amp;face=922_118_1066_275&quot;&gt;&lt;a href=&quot;https://github.com/oinochoe/docker_elk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/oinochoe/docker_elk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJYUD5/hyRQxxqJft/JYcfnAWotlt83nxGfpuKyk/img.png?width=1200&amp;amp;height=600&amp;amp;face=922_118_1066_275');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - oinochoe/docker_elk: docker_elk_example&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;docker_elk_example. Contribute to oinochoe/docker_elk development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 입니다. 더 궁금한 사항은 언제든지 댓글로 남겨주세요 : )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fin.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&quot;&gt;https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&lt;/a&gt;&lt;/p&gt;</description>
      <category>SERVER DEVELOPMENT/Docker</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/198</guid>
      <comments>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B04#entry198comment</comments>
      <pubDate>Sun, 5 Mar 2023 19:39:06 +0900</pubDate>
    </item>
    <item>
      <title>Docker에서 ElasticSearch로 Full-Text 검색하기(3)</title>
      <link>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B03</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B01&quot;&gt;Docker에서 ElasticSearch로 Full-Text 검색하기(1)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B02&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker에서 ElasticSearch로 Full-Text 검색하기(2)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 시간에 이어서, 이번에는 elasticsearch의 검색 결과를 향상 시켜보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;elasticsearch는 검색 결과를 개선하기 위한 다양한 기능들을 제공합니다.&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;Full-text search : ElasticSearch는&amp;nbsp;복잡한&amp;nbsp;검색&amp;nbsp;쿼리를&amp;nbsp;처리하고&amp;nbsp;관련성이&amp;nbsp;높은&amp;nbsp;결과를&amp;nbsp;반환할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;강력한&amp;nbsp;전체&amp;nbsp;텍스트&amp;nbsp;검색&amp;nbsp;엔진을&amp;nbsp;제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;Fuzzy search : 퍼지&amp;nbsp;검색을&amp;nbsp;사용하면&amp;nbsp;용어&amp;nbsp;자체가&amp;nbsp;정확히&amp;nbsp;일치하지&amp;nbsp;않더라도&amp;nbsp;쿼리&amp;nbsp;용어와&amp;nbsp;유사한&amp;nbsp;용어를&amp;nbsp;검색할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;Autocomplete : ElasticSearch를&amp;nbsp;사용하여&amp;nbsp;자동&amp;nbsp;완성&amp;nbsp;기능을&amp;nbsp;구현하면&amp;nbsp;사용자가&amp;nbsp;원하는&amp;nbsp;콘텐츠를&amp;nbsp;빠르게&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;Synonyms : ElasticSearch는&amp;nbsp;동의어&amp;nbsp;사용을&amp;nbsp;지원하여&amp;nbsp;원래&amp;nbsp;쿼리에&amp;nbsp;포함되지&amp;nbsp;않았을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;관련&amp;nbsp;용어가&amp;nbsp;검색&amp;nbsp;결과에&amp;nbsp;포함되도록&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b4f56;&quot;&gt;Highlighting : ElasticSearch는&amp;nbsp;검색&amp;nbsp;결과를&amp;nbsp;강조&amp;nbsp;표시하는&amp;nbsp;데&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;사용자가&amp;nbsp;가장&amp;nbsp;관련성이&amp;nbsp;높은&amp;nbsp;콘텐츠를&amp;nbsp;빠르고&amp;nbsp;쉽게&amp;nbsp;식별할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Fuzzy Search와 Autocomplete 적용 하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;elasticsearch의 가장 유용한 기능 중 하나인 Fuzzy 검색 및 자동완성을 구현 해봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1678004346163&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Docker에서 ElasticSearch로 Full-Text 검색하기(2)에서의 기존 코드
const searchQuery = async function (query) {
  const { body } = await client.search({
    index: &quot;indexing&quot;,
    body: {
      query: {
        match: {
          content: query,
        },
      },
    },
  });
  return body.hits.hits;
};

// 변경
const searchQuery = async function (query) {
  const { body } = await client.search({
    index: &quot;indexing&quot;,
    body: {
      query: {
      	fuzzy: {
            content: {
              value: query,
              fuzziness: 'AUTO'
            },
        }
      },
    },
  });
  return body.hits.hits;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;elasticsearch에서 자동 완성을 구현하려면 &quot;completion&quot;을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 입력할 때마다 검색어에 대한 실시간 제안을 제공할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1678005776190&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const suggestData = async function (query) {
  const { body } = await client.search({
    index: &quot;indexing&quot;,
    body: {
      suggest: {
        suggest_title: {
          prefix: query,
          completion: {
            field: &quot;title.suggest&quot;,
          },
        },
      },
    },
  });

  return body.suggest.suggest_title[0].options.map((option) =&amp;gt; option.text);
};

suggestData(&quot;elk&quot;)
  .then((results) =&amp;gt; console.log(results))
  .catch((error) =&amp;gt; console.error(error));&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 시간에는 마지막으로 Docker에 해당 APP을 배포 해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&quot;&gt;https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&lt;/a&gt;&lt;/p&gt;</description>
      <category>SERVER DEVELOPMENT/Docker</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/197</guid>
      <comments>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B03#entry197comment</comments>
      <pubDate>Sun, 5 Mar 2023 17:44:01 +0900</pubDate>
    </item>
    <item>
      <title>Docker에서 ElasticSearch로 Full-Text 검색하기(2)</title>
      <link>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B02</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker에서 ElasticSearch로 Full-Text 검색하기(1)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 시간에 이어서, 이번에는 elasticsearch를 직접 사용해서 Full-Text 검색을 수행 해보도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1678003185581&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i elasticsearch
또는
yarn add elasticsearch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Docker 컨테이너로 띄워져 있는 ealsticsearch에 연결 해봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1678003252201&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const { Client } = require(&quot;elasticsearch&quot;);

const client = new Client({
  host: &quot;http://localhost:9200&quot;,
  log: &quot;trace&quot;,
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성하면 &lt;b&gt;elasticsearch&lt;/b&gt;의 새 인스턴스가 생성되고 호스트와 포트가 지정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅에 도움이 되도록 로그 수준을 trace로 지정 했습니다.&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;다음으로, 데이터를 인덱싱하고 Full-text 검색한 결과를 로그로 나타내볼 수 있는 함수를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1678003714239&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const indexingData = async function (index, body) {
  const { body: response } = await client.index({
    index: index,
    body: body,
  });
  return response;
};

indexingData(&quot;indexing&quot;, {
  title: &quot;Full-text 검색&quot;,
  content: &quot;elk 검색 결과에 대해서..&quot;,
})
  .then((response) =&amp;gt; console.log(response))
  .catch((error) =&amp;gt; console.error(error));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로, 검색 쿼리를 생성 해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1678003807426&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const searchQuery = async function (query) {
  const { body } = await client.search({
    index: &quot;indexing&quot;,
    body: {
      query: {
        match: {
          content: query,
        },
      },
    },
  });
  return body.hits.hits;
};
searchQuery(&quot;Searching with query&quot;)
  .then((results) =&amp;gt; console.log(results))
  .catch((error) =&amp;gt; console.error(error));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면, Searching with query를 포함하는 Full-Text 검색을 수행 합니다.&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;다음 장에서는 elasticsearch의 검색 결과를 향상 시키는 작업을 해볼 예정입니다 : )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&quot;&gt;https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&lt;/a&gt;&lt;/p&gt;</description>
      <category>SERVER DEVELOPMENT/Docker</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/196</guid>
      <comments>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B02#entry196comment</comments>
      <pubDate>Sun, 5 Mar 2023 17:12:42 +0900</pubDate>
    </item>
    <item>
      <title>Docker에서 ElasticSearch로 Full-Text 검색하기(1)</title>
      <link>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B01</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 중요한 세상에서 데이터를 효과적으로 검색하고 분석하는 능력은 비즈니스 모델에서 매우 중요한 요소가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;Full-Text&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6e199;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;검색은 사용자가 부분만 입력해도 전체 검색 결과를 낼 수 있는 기술입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker에서 Node.js 및 ElasticSearch로 Full-Text 검색을 사용하는 방법을 살펴 보도록 하겠습니다 : )&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Full-Text란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Full-Text란 매우 방대한 양의 문서에서 텍스트를 검색하는 데 사용되는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글과 같은 검색 엔진은 텍스트를 분석한 다음에 개별 용어와 단어로 인덱싱을 하고 사용자의 검색 쿼리에 따라서 인덱스를 통해 가장 관련성이 높은 문서를 결과로 보여줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ElasticSearch란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;ElasticSearch&lt;/b&gt;&lt;/span&gt;는 매우 수준 높은 텍스트 검색을 제공하는 분산 검색 엔진입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 집계, 자동완성 및 &lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;퍼지 검색&lt;/b&gt;&lt;/span&gt;과 같은 기능을 제공합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Docker를 사용하는 이유?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 마이크로 서비스들이 만들어지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;Docker&lt;/b&gt;&lt;/span&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;b&gt; 이식 가능성&lt;/b&gt;일 수 있겠지요 : )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접적으로 어떤 장점들이 있는지 보면 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;독립성(Isolation) : Docker&amp;nbsp;컨테이너는&amp;nbsp;애플리케이션과&amp;nbsp;해당&amp;nbsp;종속성을&amp;nbsp;기본&amp;nbsp;인프라에서&amp;nbsp;분리하여&amp;nbsp;애플리케이션이&amp;nbsp;다양한&amp;nbsp;환경에서&amp;nbsp;일관되게&amp;nbsp;실행되도록&amp;nbsp;합니다.&lt;/li&gt;
&lt;li&gt;휴대성(Portability) : Docker&amp;nbsp;컨테이너는&amp;nbsp;개발자의&amp;nbsp;노트북에서&amp;nbsp;프로덕션&amp;nbsp;서버로와&amp;nbsp;같이&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;환경&amp;nbsp;간에&amp;nbsp;쉽게&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;애플리케이션을&amp;nbsp;쉽게&amp;nbsp;배포할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;li&gt;효율성(Efficiency) : Docker&amp;nbsp;컨테이너는&amp;nbsp;가볍고&amp;nbsp;기존&amp;nbsp;가상&amp;nbsp;머신에&amp;nbsp;비해&amp;nbsp;리소스를&amp;nbsp;적게&amp;nbsp;사용하므로&amp;nbsp;애플리케이션을&amp;nbsp;배포하고&amp;nbsp;실행하는&amp;nbsp;데&amp;nbsp;더&amp;nbsp;효율적입니다.&lt;/li&gt;
&lt;li&gt;유연성(Flexibility) : Docker&amp;nbsp;컨테이너는&amp;nbsp;애플리케이션의&amp;nbsp;변화하는&amp;nbsp;요구&amp;nbsp;사항을&amp;nbsp;충족하기&amp;nbsp;위해&amp;nbsp;쉽게&amp;nbsp;확장&amp;nbsp;또는&amp;nbsp;축소할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너는 위와 같이 코드, 런타임, 시스템 도구, 라이브러리 및 설정을 포함하여 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 경량의 독립형 실행 가능 소프트웨어 패키지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f6e199; background-color: #666666;&quot;&gt;&lt;b&gt;각 컨테이너는 자체 환경에서 격리되고 실행되므로 애플리케이션과 해당 종속성이 기본 인프라에 대한 변경 사항의 영향을 받지 않도록 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, Docker를 사용하여 ElasticSearch를 설정하면 다양한 시스템 및 배포 환경에서 일관된 개발 환경을 쉽게 만들 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Docker에 ElasticSearch 설치하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.docker.com/desktop/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677998435711&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Docker Desktop&quot; data-og-description=&quot; &quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/desktop/&quot; data-og-url=&quot;https://docs.docker.com/desktop/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tVb7f/hyROHatKrt/u2JAQwDH5deCvpCmk9J1vk/img.png?width=129&amp;amp;height=128&amp;amp;face=0_0_129_128,https://scrap.kakaocdn.net/dn/qRj3h/hyRQw6ayUA/NRktdX91wW4KZkauLu24T0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://docs.docker.com/desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/desktop/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tVb7f/hyROHatKrt/u2JAQwDH5deCvpCmk9J1vk/img.png?width=129&amp;amp;height=128&amp;amp;face=0_0_129_128,https://scrap.kakaocdn.net/dn/qRj3h/hyRQw6ayUA/NRktdX91wW4KZkauLu24T0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커를 먼저 설치해주세요~ 환경에 따라서 Mac에서도 intel버전과 silicon으로 선택하는 방법으로 나뉩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음으로, 이미지를 다운로드 해주세요.&lt;/p&gt;
&lt;pre id=&quot;code_1677998516813&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.4&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;설치 되어있는지 확인은 다음 명령어로 해보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1677998558482&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;span&gt;elasticsearch용&lt;/span&gt; Docker 컨테이너를 만들고 실행시켜 보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1677998669186&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -e &quot;discovery.type=single-node&quot; --name elasticsearch -p 9200:9200 -p 9300:9300  docker.elastic.co/elasticsearch/elasticsearch:7.17.4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 포트 9200은 elasticsearch의 REST API를 위해서 사용되고, 포트 9300은 노드 간의 통신에 사용 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올바르게 동작하는지 다음 명령어로 확인하실 수 있어요.&lt;/p&gt;
&lt;pre id=&quot;code_1677998964484&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps

또는
http://localhost:9200/
에 접속&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어는 현재 실행중인 Docker 컨테이너를 나열 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2828&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q3aYF/btr1T5miXyF/DElfNbMRZgjU6N1vyQC0gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q3aYF/btr1T5miXyF/DElfNbMRZgjU6N1vyQC0gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q3aYF/btr1T5miXyF/DElfNbMRZgjU6N1vyQC0gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq3aYF%2Fbtr1T5miXyF%2FDElfNbMRZgjU6N1vyQC0gk%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;2828&quot; height=&quot;78&quot; data-origin-width=&quot;2828&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;이제, 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : https://voskan.host/2023/02/18/full-text-search-with-node-js-and-elasticsearch-on-docker/?mibextid=S66gvF&lt;/p&gt;</description>
      <category>SERVER DEVELOPMENT/Docker</category>
      <category>docker</category>
      <category>ElasticSearch</category>
      <category>Full-Text</category>
      <category>full-text search</category>
      <category>도커</category>
      <category>엘라스틱서치</category>
      <author>F.E.D</author>
      <guid isPermaLink="true">https://frontdev.tistory.com/195</guid>
      <comments>https://frontdev.tistory.com/entry/Docker%EC%97%90%EC%84%9C-ElasticSearch%EB%A1%9C-Full-Text-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B01#entry195comment</comments>
      <pubDate>Sun, 5 Mar 2023 16:56:32 +0900</pubDate>
    </item>
  </channel>
</rss>