<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>만능도우미</title>
    <link>https://ryurim.tistory.com/</link>
    <description>새로운 시작~모든정보들을 손쉽게 접할수 있는 블로그입니다. </description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 21:17:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dogdogdodo</managingEditor>
    <image>
      <title>만능도우미</title>
      <url>https://tistory1.daumcdn.net/tistory/5302137/attach/86ee22be24c146499c8098d9a8a93d17</url>
      <link>https://ryurim.tistory.com</link>
    </image>
    <item>
      <title>광양 매화축제 2026  </title>
      <link>https://ryurim.tistory.com/entry/%EA%B4%91%EC%96%91-%EB%A7%A4%ED%99%94%EC%B6%95%EC%A0%9C-2026-%F0%9F%8C%B8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-13 15;46;03.PNG&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEaE8y/dJMcabi9P3h/hns0l6woek0GF9stZOuYW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEaE8y/dJMcabi9P3h/hns0l6woek0GF9stZOuYW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEaE8y/dJMcabi9P3h/hns0l6woek0GF9stZOuYW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEaE8y%2FdJMcabi9P3h%2Fhns0l6woek0GF9stZOuYW0%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;740&quot; height=&quot;853&quot; data-filename=&quot;2026-03-13 15;46;03.PNG&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;180&quot; data-start=&quot;149&quot; data-section-id=&quot;11gsh5e&quot; data-ke-size=&quot;size26&quot;&gt;개화시기 &amp;middot; 축제 일정 &amp;middot; 주차 &amp;middot; 셔틀버스 총정리&lt;/h2&gt;
&lt;p data-end=&quot;228&quot; data-start=&quot;182&quot; data-ke-size=&quot;size16&quot;&gt;봄이 오면 전남에서 가장 먼저 꽃이 피는 곳이 바로 &lt;b&gt;광양 매화마을&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;290&quot; data-start=&quot;230&quot; data-ke-size=&quot;size16&quot;&gt;특히 섬진강과 매화가 함께 어우러지는 풍경 때문에&lt;br /&gt;매년 &lt;b&gt;수십만 명이 찾는 봄꽃 축제&lt;/b&gt;로 유명합니다.&lt;/p&gt;
&lt;p data-end=&quot;317&quot; data-start=&quot;292&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 광양 매화축제 방문 전에 꼭 알아야 할&lt;/p&gt;
&lt;p data-end=&quot;370&quot; data-start=&quot;319&quot; data-ke-size=&quot;size16&quot;&gt;✔ 매화 개화 시기&lt;br /&gt;✔ 축제 일정&lt;br /&gt;✔ 주차 정보&lt;br /&gt;✔ 셔틀버스&lt;br /&gt;✔ 방문 꿀팁&lt;/p&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;372&quot; data-ke-size=&quot;size16&quot;&gt;까지 한 번에 정리해 드립니다.&lt;/p&gt;
&lt;h1 data-end=&quot;408&quot; data-start=&quot;396&quot; data-section-id=&quot;lzinti&quot;&gt;광양 매화축제 일정&lt;/h1&gt;
&lt;p data-end=&quot;429&quot; data-start=&quot;410&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;2026 광양 매화축제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;507&quot; data-start=&quot;431&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;461&quot; data-start=&quot;431&quot; data-section-id=&quot;nslbw0&quot;&gt;기간 : &lt;b&gt;2026년 3월 13일 ~ 3월 22일&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;488&quot; data-start=&quot;462&quot; data-section-id=&quot;1q7pm8i&quot;&gt;장소 : 전남 광양시 &lt;b&gt;다압면 매화마을&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;507&quot; data-start=&quot;489&quot; data-section-id=&quot;e5cdmb&quot;&gt;입장 : &lt;span style=&quot;color: #2f2f2f; text-align: start;&quot;&gt;광양매화축제 입장료는 성인 6,000원, 청소년 5,000원&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;563&quot; data-start=&quot;509&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #2f2f2f; text-align: start;&quot;&gt;'관광지 연계 무료입장' 제도를 도입( &lt;span style=&quot;color: #2f2f2f; text-align: start;&quot;&gt;백운산자연휴양림, 섬진강별빛스카이 집라인, 주요 야영장(금천계곡&amp;middot;구봉산숲속&amp;middot;배알도별빛) 등 광양의 대표 관광 시설을 이용한 방문객에게는 광양매화축제 무료 입장 혜택이 제공)&lt;/span&gt;&lt;/span&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;2026-03-13 16;58;46.PNG&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBg1dA/dJMcacCl3Su/TbKrX5DRMkBD7LC9ykySW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBg1dA/dJMcacCl3Su/TbKrX5DRMkBD7LC9ykySW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBg1dA/dJMcacCl3Su/TbKrX5DRMkBD7LC9ykySW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBg1dA%2FdJMcacCl3Su%2FTbKrX5DRMkBD7LC9ykySW1%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;334&quot; height=&quot;616&quot; data-filename=&quot;2026-03-13 16;58;46.PNG&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;563&quot; data-start=&quot;509&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;583&quot; data-start=&quot;570&quot; data-section-id=&quot;alcar6&quot;&gt;광양 매화 개화 시기&lt;/h1&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;585&quot; data-ke-size=&quot;size16&quot;&gt;광양 매화는 벚꽃보다 먼저 피는 꽃입니다.&lt;/p&gt;
&lt;p data-end=&quot;618&quot; data-start=&quot;610&quot; data-ke-size=&quot;size16&quot;&gt;  개화 예상&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;683&quot; data-start=&quot;620&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;638&quot; data-start=&quot;620&quot; data-section-id=&quot;1p8bfqw&quot;&gt;개화 시작 : &lt;b&gt;3월 초&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;639&quot; data-section-id=&quot;okvgo4&quot;&gt;만개 시기 : &lt;b&gt;3월 중순&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;683&quot; data-start=&quot;659&quot; data-section-id=&quot;1dwpbyr&quot;&gt;절정 시기 : &lt;b&gt;3월 중순 ~ 하순&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;746&quot; data-start=&quot;685&quot; data-ke-size=&quot;size16&quot;&gt;특히 축제 기간과 만개 시기가 겹치면&lt;br /&gt;&lt;b&gt;매화마을 전체가 하얀 꽃으로 뒤덮이는 풍경&lt;/b&gt;을 볼 수 있습니다.&lt;/p&gt;
&lt;h1 data-end=&quot;765&quot; data-start=&quot;753&quot; data-section-id=&quot;ydn6d2&quot;&gt;광양 매화마을 특징&lt;/h1&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;767&quot; data-ke-size=&quot;size16&quot;&gt;광양 매화마을이 유명한 이유&lt;/p&gt;
&lt;p data-end=&quot;831&quot; data-start=&quot;784&quot; data-ke-size=&quot;size16&quot;&gt;✔ 약 &lt;b&gt;10만 그루 매화나무&lt;/b&gt;&lt;br /&gt;✔ 섬진강 전망&lt;br /&gt;✔ 산 전체가 매화꽃 풍경&lt;/p&gt;
&lt;p data-end=&quot;835&quot; data-start=&quot;833&quot; data-ke-size=&quot;size16&quot;&gt;특히&lt;/p&gt;
&lt;p data-end=&quot;859&quot; data-start=&quot;837&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;매화 + 섬진강 + 산 풍경&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;893&quot; data-start=&quot;861&quot; data-ke-size=&quot;size16&quot;&gt;이 함께 보이는 곳이라&lt;br /&gt;사진 촬영 명소로도 유명합니다.&lt;/p&gt;
&lt;h1 data-end=&quot;913&quot; data-start=&quot;900&quot; data-section-id=&quot;fahdpq&quot;&gt;광양 매화축제 주차장&lt;/h1&gt;
&lt;p data-end=&quot;936&quot; data-start=&quot;915&quot; data-ke-size=&quot;size16&quot;&gt;축제 방문 시 가장 중요한 정보입니다.&lt;/p&gt;
&lt;p data-end=&quot;947&quot; data-start=&quot;938&quot; data-ke-size=&quot;size16&quot;&gt;  주요 주차장&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;984&quot; data-start=&quot;949&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;961&quot; data-start=&quot;949&quot; data-section-id=&quot;1g1zukx&quot;&gt;매화마을 공영주차장&lt;/li&gt;
&lt;li data-end=&quot;972&quot; data-start=&quot;962&quot; data-section-id=&quot;8emegd&quot;&gt;둔치 임시주차장&lt;/li&gt;
&lt;li data-end=&quot;984&quot; data-start=&quot;973&quot; data-section-id=&quot;1vx8qs&quot;&gt;다압면 임시주차장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1044&quot; data-start=&quot;986&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 축제 기간에는 차량 통제가 많기 때문에&lt;br /&gt;&lt;b&gt;임시주차장 이용 후 셔틀버스 이동&lt;/b&gt;이 일반적입니다.&lt;/p&gt;
&lt;h1 data-end=&quot;1065&quot; data-start=&quot;1051&quot; data-section-id=&quot;5tz80b&quot;&gt;광양 매화축제 셔틀버스&lt;/h1&gt;
&lt;p data-end=&quot;1074&quot; data-start=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;축제 기간에는&lt;/p&gt;
&lt;p data-end=&quot;1090&quot; data-start=&quot;1076&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;셔틀버스 운영&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1094&quot; data-start=&quot;1092&quot; data-ke-size=&quot;size16&quot;&gt;보통&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1119&quot; data-start=&quot;1096&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1103&quot; data-start=&quot;1096&quot; data-section-id=&quot;42hvk1&quot;&gt;임시주차장&lt;/li&gt;
&lt;li data-end=&quot;1113&quot; data-start=&quot;1104&quot; data-section-id=&quot;g9ak71&quot;&gt;매화마을 입구&lt;/li&gt;
&lt;li data-end=&quot;1119&quot; data-start=&quot;1114&quot; data-section-id=&quot;2hct2g&quot;&gt;행사장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1134&quot; data-start=&quot;1121&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 순환 운행합니다.&lt;/p&gt;
&lt;p data-end=&quot;1185&quot; data-start=&quot;1136&quot; data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;차를 바로 매화마을까지 가져가는 것보다&lt;br /&gt;셔틀버스 이용이 훨씬 편합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-13 15;53;47.PNG&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnCos/dJMcacbgWeH/fSwBM1zNfYAyapQYGQC3n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnCos/dJMcacbgWeH/fSwBM1zNfYAyapQYGQC3n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnCos/dJMcacbgWeH/fSwBM1zNfYAyapQYGQC3n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnCos%2FdJMcacbgWeH%2FfSwBM1zNfYAyapQYGQC3n1%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;890&quot; height=&quot;629&quot; data-filename=&quot;2026-03-13 15;53;47.PNG&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-end=&quot;1207&quot; data-start=&quot;1192&quot; data-section-id=&quot;1m77hdb&quot;&gt;광양 매화축제 방문 꿀팁&lt;/h1&gt;
&lt;p data-end=&quot;1226&quot; data-start=&quot;1209&quot; data-ke-size=&quot;size16&quot;&gt;실제로 가보면 중요한 팁입니다.&lt;/p&gt;
&lt;p data-end=&quot;1279&quot; data-start=&quot;1228&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;평일 방문 추천&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;아침 9시 이전 도착&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;편한 신발 착용&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1318&quot; data-start=&quot;1281&quot; data-ke-size=&quot;size16&quot;&gt;매화마을은 &lt;b&gt;언덕이 많은 산길&lt;/b&gt;이라&lt;br /&gt;운동화 착용이 좋습니다.&lt;/p&gt;
&lt;h1 data-end=&quot;1341&quot; data-start=&quot;1325&quot; data-section-id=&quot;1u75naj&quot;&gt;광양 매화 여행 추천 코스&lt;/h1&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1343&quot; data-ke-size=&quot;size16&quot;&gt;광양 여행 추천 코스&lt;/p&gt;
&lt;p data-end=&quot;1408&quot; data-start=&quot;1356&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ 매화마을 산책&lt;br /&gt;2️⃣ 섬진강 전망대&lt;br /&gt;3️⃣ 청매실농원&lt;br /&gt;4️⃣ 섬진강 드라이브&lt;/p&gt;
&lt;p data-end=&quot;1412&quot; data-start=&quot;1410&quot; data-ke-size=&quot;size16&quot;&gt;특히&lt;/p&gt;
&lt;p data-end=&quot;1429&quot; data-start=&quot;1414&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;매화마을 전망대&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1442&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size16&quot;&gt;는 사진 명소입니다.&lt;/p&gt;
&lt;h1 data-end=&quot;1454&quot; data-start=&quot;1449&quot; data-section-id=&quot;2jf5ya&quot;&gt;총정리&lt;/h1&gt;
&lt;p data-end=&quot;1469&quot; data-start=&quot;1456&quot; data-ke-size=&quot;size16&quot;&gt;광양 매화축제 핵심 정보&lt;/p&gt;
&lt;p data-end=&quot;1498&quot; data-start=&quot;1471&quot; data-ke-size=&quot;size16&quot;&gt;  축제기간&lt;br /&gt;&amp;rarr; &lt;b&gt;3월 중순 약 10일&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1517&quot; data-start=&quot;1500&quot; data-ke-size=&quot;size16&quot;&gt;  장소&lt;br /&gt;&amp;rarr; 광양 매화마을&lt;/p&gt;
&lt;p data-end=&quot;1543&quot; data-start=&quot;1519&quot; data-ke-size=&quot;size16&quot;&gt;  특징&lt;br /&gt;&amp;rarr; &lt;b&gt;10만 그루 매화꽃&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1574&quot; data-start=&quot;1545&quot; data-ke-size=&quot;size16&quot;&gt;  교통&lt;br /&gt;&amp;rarr; &lt;b&gt;임시주차장 + 셔틀버스 이용&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1598&quot; data-start=&quot;1581&quot; data-ke-size=&quot;size16&quot;&gt;  봄꽃 여행을 계획한다면&lt;/p&gt;
&lt;p data-end=&quot;1633&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;광양 매화축제&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;구례 300리 벚꽃길&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1664&quot; data-start=&quot;1635&quot; 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;2026-03-13 17;05;10.PNG&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg6Yh9/dJMcaduqfeF/UclsCaic0MI1wRBD5HlYDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg6Yh9/dJMcaduqfeF/UclsCaic0MI1wRBD5HlYDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg6Yh9/dJMcaduqfeF/UclsCaic0MI1wRBD5HlYDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg6Yh9%2FdJMcaduqfeF%2FUclsCaic0MI1wRBD5HlYDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;382&quot; data-filename=&quot;2026-03-13 17;05;10.PNG&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/168</guid>
      <comments>https://ryurim.tistory.com/entry/%EA%B4%91%EC%96%91-%EB%A7%A4%ED%99%94%EC%B6%95%EC%A0%9C-2026-%F0%9F%8C%B8#entry168comment</comments>
      <pubDate>Fri, 13 Mar 2026 17:06:13 +0900</pubDate>
    </item>
    <item>
      <title>구례 300리 벚꽃축제 2026  </title>
      <link>https://ryurim.tistory.com/entry/%EA%B5%AC%EB%A1%80-300%EB%A6%AC-%EB%B2%9A%EA%BD%83%EC%B6%95%EC%A0%9C-2026-%F0%9F%8C%B8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 3월 12일 오전 10_52_38.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqxjiq/dJMcabXIyum/oHgCSV6q66AdLhxFBLfeLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqxjiq/dJMcabXIyum/oHgCSV6q66AdLhxFBLfeLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqxjiq/dJMcabXIyum/oHgCSV6q66AdLhxFBLfeLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqxjiq%2FdJMcabXIyum%2FoHgCSV6q66AdLhxFBLfeLK%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;1024&quot; height=&quot;1536&quot; data-filename=&quot;ChatGPT Image 2026년 3월 12일 오전 10_52_38.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-12 11;12;58.PNG&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpbz5E/dJMcaf6R9Hg/gfA7BgGKzKt2EWbku1std1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpbz5E/dJMcaf6R9Hg/gfA7BgGKzKt2EWbku1std1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpbz5E/dJMcaf6R9Hg/gfA7BgGKzKt2EWbku1std1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpbz5E%2FdJMcaf6R9Hg%2FgfA7BgGKzKt2EWbku1std1%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;874&quot; height=&quot;180&quot; data-filename=&quot;2026-03-12 11;12;58.PNG&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;171&quot; data-start=&quot;140&quot; data-section-id=&quot;11gsh5e&quot; data-ke-size=&quot;size26&quot;&gt;개화시기 &amp;middot; 축제 일정 &amp;middot; 주차 &amp;middot; 셔틀버스 총정리&lt;/h2&gt;
&lt;p data-end=&quot;246&quot; data-start=&quot;173&quot; data-ke-size=&quot;size16&quot;&gt;봄이 오면 전국에서 벚꽃 여행을 많이 찾는데&lt;br /&gt;남도에서 가장 유명한 벚꽃 명소 중 하나가 바로 &lt;b&gt;구례 300리 벚꽃길&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;348&quot; data-start=&quot;248&quot; data-ke-size=&quot;size16&quot;&gt;특히 섬진강을 따라 이어지는 벚꽃길은&lt;br /&gt;&lt;b&gt;약 129km에 달하는 전국 최대 규모 벚꽃길&lt;/b&gt;로 유명합니다.&lt;/p&gt;
&lt;p data-end=&quot;396&quot; data-start=&quot;350&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 &lt;b&gt;구례 300리 벚꽃축제 방문 전에 꼭 알아야 할 정보&lt;/b&gt;를 정리했습니다.&lt;/p&gt;
&lt;p data-end=&quot;448&quot; data-start=&quot;398&quot; data-ke-size=&quot;size16&quot;&gt;✔ 벚꽃 개화 시기&lt;br /&gt;✔ 축제 일정&lt;br /&gt;✔ 주차장 정보&lt;br /&gt;✔ 셔틀버스&lt;br /&gt;✔ 방문 꿀팁&lt;/p&gt;
&lt;p data-end=&quot;469&quot; data-start=&quot;450&quot; data-ke-size=&quot;size16&quot;&gt;이 글 하나만 보고 가셔도 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-12 11;13;04.PNG&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7NszN/dJMcad2fdkH/0KC22zC3g3nxP7APJ3IVdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7NszN/dJMcad2fdkH/0KC22zC3g3nxP7APJ3IVdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7NszN/dJMcad2fdkH/0KC22zC3g3nxP7APJ3IVdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7NszN%2FdJMcad2fdkH%2F0KC22zC3g3nxP7APJ3IVdK%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;742&quot; height=&quot;425&quot; data-filename=&quot;2026-03-12 11;13;04.PNG&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;519&quot; data-start=&quot;495&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;2026 구례 300리 벚꽃축제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;611&quot; data-start=&quot;521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;553&quot; data-start=&quot;521&quot; data-section-id=&quot;ufhhw3&quot;&gt;기간 : &lt;b&gt;2026년 3월 28일 ~ 3월 30일&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;554&quot; data-section-id=&quot;1b9i8bb&quot;&gt;장소 : 전남 구례군 일대&lt;/li&gt;
&lt;li data-end=&quot;611&quot; data-start=&quot;571&quot; data-section-id=&quot;u4z4jw&quot;&gt;주요 행사장
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;611&quot; data-start=&quot;584&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;596&quot; data-start=&quot;584&quot; data-section-id=&quot;ate1c4&quot;&gt;서시천 체육공원&lt;/li&gt;
&lt;li data-end=&quot;611&quot; data-start=&quot;599&quot; data-section-id=&quot;1mhry6g&quot;&gt;문척면 사성암 일대&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;698&quot; data-start=&quot;613&quot; data-ke-size=&quot;size16&quot;&gt;총 &lt;b&gt;3일간 진행되는 봄 축제&lt;/b&gt;이며 벚꽃길을 따라 다양한 프로그램이 열립니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-12 11;13;10.PNG&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXQU8x/dJMcad2fdlb/sBO65ktZKnk0JqEONSwr2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXQU8x/dJMcad2fdlb/sBO65ktZKnk0JqEONSwr2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXQU8x/dJMcad2fdlb/sBO65ktZKnk0JqEONSwr2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXQU8x%2FdJMcad2fdlb%2FsBO65ktZKnk0JqEONSwr2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;358&quot; data-filename=&quot;2026-03-12 11;13;10.PNG&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;729&quot; data-start=&quot;720&quot; data-ke-size=&quot;size16&quot;&gt;구례 벚꽃은 보통&lt;/p&gt;
&lt;p data-end=&quot;751&quot; data-start=&quot;731&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;3월 25일 ~ 4월 초&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;767&quot; data-start=&quot;753&quot; data-ke-size=&quot;size16&quot;&gt;사이에 가장 아름답습니다.&lt;/p&gt;
&lt;p data-end=&quot;836&quot; data-start=&quot;769&quot; data-ke-size=&quot;size16&quot;&gt;특히 축제 기간인 &lt;b&gt;3월 마지막 주가 만개 시기&lt;/b&gt;와 겹치는 경우가 많아&lt;br /&gt;매년 관광객이 많이 찾는 벚꽃 명소입니다.&lt;/p&gt;
&lt;h1 data-end=&quot;859&quot; data-start=&quot;843&quot; data-section-id=&quot;1fkq4ns&quot;&gt;구례 300리 벚꽃길 특징&lt;/h1&gt;
&lt;p data-end=&quot;875&quot; data-start=&quot;861&quot; data-ke-size=&quot;size16&quot;&gt;구례 벚꽃길이 특별한 이유&lt;/p&gt;
&lt;p data-end=&quot;943&quot; data-start=&quot;877&quot; data-ke-size=&quot;size16&quot;&gt;✔ 섬진강 따라 이어진 벚꽃길&lt;br /&gt;✔ 약 &lt;b&gt;129km 벚꽃 드라이브 코스&lt;/b&gt;&lt;br /&gt;✔ 자전거 &amp;middot; 산책 &amp;middot; 드라이브 가능&lt;/p&gt;
&lt;p data-end=&quot;948&quot; data-start=&quot;945&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;982&quot; data-start=&quot;950&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;960&quot; data-start=&quot;950&quot; data-section-id=&quot;hqaspo&quot;&gt;커플 벚꽃 여행&lt;/li&gt;
&lt;li data-end=&quot;971&quot; data-start=&quot;961&quot; data-section-id=&quot;1t142qd&quot;&gt;가족 봄 나들이&lt;/li&gt;
&lt;li data-end=&quot;982&quot; data-start=&quot;972&quot; data-section-id=&quot;1yjhu5g&quot;&gt;사진 촬영 명소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1038&quot; data-start=&quot;984&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-12 11;13;26.PNG&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btMnon/dJMcagY0E5U/L8MEhpGwdq6hSldaScURz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btMnon/dJMcagY0E5U/L8MEhpGwdq6hSldaScURz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btMnon/dJMcagY0E5U/L8MEhpGwdq6hSldaScURz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtMnon%2FdJMcagY0E5U%2FL8MEhpGwdq6hSldaScURz1%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;742&quot; height=&quot;455&quot; data-filename=&quot;2026-03-12 11;13;26.PNG&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-end=&quot;1291&quot; data-start=&quot;1278&quot; data-section-id=&quot;1ktyqdn&quot;&gt;구례 벚꽃축제 주차장&lt;/h1&gt;
&lt;p data-end=&quot;1318&quot; data-start=&quot;1293&quot; data-ke-size=&quot;size16&quot;&gt;축제 방문 시 가장 많이 검색하는 정보입니다.&lt;/p&gt;
&lt;p data-end=&quot;1333&quot; data-start=&quot;1320&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;주요 주차장&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1381&quot; data-start=&quot;1335&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ 서시천 체육공원 주차장&lt;br /&gt;2️⃣ 사성암 주차장&lt;br /&gt;3️⃣ 구례읍 공영주차장&lt;/p&gt;
&lt;p data-end=&quot;1449&quot; data-start=&quot;1383&quot; data-ke-size=&quot;size16&quot;&gt;축제 기간에는 &lt;b&gt;임시 주차장도 운영&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1493&quot; data-start=&quot;1451&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 벚꽃 만개 시기에는&lt;br /&gt;&lt;b&gt;주말 오전 10시 이후 만차&lt;/b&gt;가 많습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-12 11;13;43.PNG&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csmYSC/dJMcad2fdnT/xugicVFwZTJVkU5xeLFcUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csmYSC/dJMcad2fdnT/xugicVFwZTJVkU5xeLFcUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csmYSC/dJMcad2fdnT/xugicVFwZTJVkU5xeLFcUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsmYSC%2FdJMcad2fdnT%2FxugicVFwZTJVkU5xeLFcUK%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;724&quot; height=&quot;408&quot; data-filename=&quot;2026-03-12 11;13;43.PNG&quot; data-origin-width=&quot;282&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-end=&quot;1514&quot; data-start=&quot;1500&quot; data-section-id=&quot;r8d9ji&quot;&gt;구례 벚꽃축제 셔틀버스&lt;/h1&gt;
&lt;p data-end=&quot;1559&quot; data-start=&quot;1516&quot; data-ke-size=&quot;size16&quot;&gt;축제 기간에는&lt;br /&gt;주요 행사장 이동을 위한 &lt;b&gt;셔틀버스 운영&lt;/b&gt;이 검토됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1563&quot; data-start=&quot;1561&quot; data-ke-size=&quot;size16&quot;&gt;보통&lt;/p&gt;
&lt;p data-end=&quot;1600&quot; data-start=&quot;1565&quot; data-ke-size=&quot;size16&quot;&gt;  서시천 행사장&lt;br /&gt;  벚꽃길 관광 포인트&lt;br /&gt;  주차장&lt;/p&gt;
&lt;p data-end=&quot;1623&quot; data-start=&quot;1602&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 순환 운행하는 경우가 많습니다.&lt;/p&gt;
&lt;p data-end=&quot;1668&quot; data-start=&quot;1625&quot; data-ke-size=&quot;size16&quot;&gt;※ 매년 운영 노선은 달라질 수 있으니&lt;br /&gt;방문 전 구례군 홈페이지 확인 추천&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-12 11;13;36.PNG&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UUTcc/dJMcadnEPSs/v9xNMNYopiZK3Xv6hx43N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UUTcc/dJMcadnEPSs/v9xNMNYopiZK3Xv6hx43N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UUTcc/dJMcadnEPSs/v9xNMNYopiZK3Xv6hx43N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUUTcc%2FdJMcadnEPSs%2Fv9xNMNYopiZK3Xv6hx43N1%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;776&quot; height=&quot;437&quot; data-filename=&quot;2026-03-12 11;13;36.PNG&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-end=&quot;1690&quot; data-start=&quot;1675&quot; data-section-id=&quot;pb9yve&quot;&gt;구례 벚꽃축제 방문 꿀팁&lt;/h1&gt;
&lt;p data-end=&quot;1712&quot; data-start=&quot;1692&quot; data-ke-size=&quot;size16&quot;&gt;실제로 가보면 가장 중요한 팁입니다.&lt;/p&gt;
&lt;p data-end=&quot;1770&quot; data-start=&quot;1714&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;평일 방문 추천&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;아침 9시 이전 도착&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;벚꽃 드라이브 코스 이용&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1780&quot; data-start=&quot;1772&quot; data-ke-size=&quot;size16&quot;&gt;특히 추천 코스&lt;/p&gt;
&lt;p data-end=&quot;1826&quot; data-start=&quot;1782&quot; data-ke-size=&quot;size16&quot;&gt;  섬진강 벚꽃 드라이브&lt;br /&gt;  사성암 벚꽃 전망&lt;br /&gt;  서시천 벚꽃 산책&lt;/p&gt;
&lt;h1 data-end=&quot;1849&quot; data-start=&quot;1833&quot; data-section-id=&quot;p3h4xa&quot;&gt;구례 벚꽃 여행 추천 코스&lt;/h1&gt;
&lt;p data-end=&quot;1867&quot; data-start=&quot;1851&quot; data-ke-size=&quot;size16&quot;&gt;구례 벚꽃 여행 BEST 코스&lt;/p&gt;
&lt;p data-end=&quot;1930&quot; data-start=&quot;1869&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ 서시천 벚꽃길 산책&lt;br /&gt;2️⃣ 섬진강 벚꽃 드라이브&lt;br /&gt;3️⃣ 사성암 벚꽃 전망&lt;br /&gt;4️⃣ 화엄사 벚꽃&lt;/p&gt;
&lt;p data-end=&quot;1954&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size16&quot;&gt;하루 코스로도 충분히 즐길 수 있습니다.&lt;/p&gt;
&lt;h1 data-end=&quot;1965&quot; data-start=&quot;1961&quot; data-section-id=&quot;yim43j&quot;&gt;총정리&lt;/h1&gt;
&lt;p data-end=&quot;1985&quot; data-start=&quot;1967&quot; data-ke-size=&quot;size16&quot;&gt;구례 300리 벚꽃축제 핵심 정보&lt;/p&gt;
&lt;p data-end=&quot;2024&quot; data-start=&quot;1987&quot; data-ke-size=&quot;size16&quot;&gt;  축제기간&lt;br /&gt;&amp;rarr; &lt;b&gt;2026년 3월 28일 ~ 3월 30일&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2057&quot; data-start=&quot;2026&quot; data-ke-size=&quot;size16&quot;&gt;  장소&lt;br /&gt;&amp;rarr; 구례군 서시천체육공원 / 섬진강 벚꽃길&lt;/p&gt;
&lt;p data-end=&quot;2086&quot; data-start=&quot;2059&quot; data-ke-size=&quot;size16&quot;&gt;  주차&lt;br /&gt;&amp;rarr; 서시천체육공원 / 사성암 주차장&lt;/p&gt;
&lt;p data-end=&quot;2117&quot; data-start=&quot;2088&quot; data-ke-size=&quot;size16&quot;&gt;  특징&lt;br /&gt;&amp;rarr; &lt;b&gt;129km 전국 최대 벚꽃길&lt;/b&gt;&lt;/p&gt;</description>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/167</guid>
      <comments>https://ryurim.tistory.com/entry/%EA%B5%AC%EB%A1%80-300%EB%A6%AC-%EB%B2%9A%EA%BD%83%EC%B6%95%EC%A0%9C-2026-%F0%9F%8C%B8#entry167comment</comments>
      <pubDate>Thu, 12 Mar 2026 11:18:52 +0900</pubDate>
    </item>
    <item>
      <title>화담숲 예약  방법 총정리</title>
      <link>https://ryurim.tistory.com/entry/%ED%99%94%EB%8B%B4%EC%88%B2-%EC%98%88%EC%95%BD-%EB%B0%A9%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC</link>
      <description>&lt;div style=&quot;max-width: 800px; margin: auto; font-family: 'Noto Sans KR',sans-serif; line-height: 1.7; color: #333;&quot;&gt;
&lt;h2 style=&quot;text-align: center; border-bottom: 3px solid #2f7d5b; padding-bottom: 10px;&quot; data-ke-size=&quot;size26&quot;&gt;  화담숲예약 | 2026 봄 시즌 예약 방법 총정리&lt;/h2&gt;
&lt;p style=&quot;text-align: center; color: #666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br /&gt;&lt;!-- 개요 --&gt;
&lt;div style=&quot;background: #f3faf7; border-left: 6px solid #2f7d5b; padding: 20px; border-radius: 10px; margin-bottom: 25px;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 곤지암 화담숲 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곤지암에 위치한 &lt;b&gt;화담숲&lt;/b&gt;은 LG 상록재단이 운영하는 자연 수목원입니다.&lt;br /&gt;약 &lt;b&gt;5만 평 규모&lt;/b&gt;의 자연 친화적인 공간으로 사계절 내내 아름다운 풍경을 볼 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-end=&quot;191&quot; data-start=&quot;60&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;191&quot; data-start=&quot;60&quot; data-ke-size=&quot;size16&quot;&gt;화담숲은 &lt;b&gt;LG 상록재단이 공익사업의 일환으로 조성한 자연 수목원&lt;/b&gt;입니다.&lt;br /&gt;2006년 4월 조성 승인을 받아 경기도 광주시 도척면 도웅리에 약 &lt;b&gt;5만 평 규모로 조성&lt;/b&gt;되었으며, 정식 개원은 &lt;b&gt;2013년&lt;/b&gt;에 이루어졌습니다.&lt;/p&gt;
&lt;p data-end=&quot;272&quot; data-start=&quot;193&quot; data-ke-size=&quot;size16&quot;&gt;현재 화담숲에는 &lt;b&gt;16개의 테마정원과 약 4,000여 종의 국내외 식물&lt;/b&gt;이 전시되어 있어 계절마다 다양한 자연 풍경을 감상할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;356&quot; data-start=&quot;274&quot; data-ke-size=&quot;size16&quot;&gt;단순한 관광지가 아니라 &lt;b&gt;멸종 위기의 동식물을 복원하고 자연 생태계를 되살리는 연구와 보전 활동&lt;/b&gt;도 함께 이루어지는 공간이라는 점이 특징입니다.&lt;/p&gt;
&lt;p data-end=&quot;452&quot; data-start=&quot;358&quot; data-ke-size=&quot;size16&quot;&gt;자연을 보호하고 사람과 자연이 함께 공존하는 가치를 담은 곳으로,&lt;br /&gt;도심에서 벗어나 &lt;b&gt;자연의 아름다움을 느낄 수 있는 힐링 공간&lt;/b&gt;으로 많은 사람들이 찾고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 예약방법 --&gt;
&lt;div style=&quot;background: #f8f9ff; border-left: 6px solid #4b6cff; padding: 20px; border-radius: 10px; margin-bottom: 25px;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ 화담숲 예약 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화담숲은 방문객이 많기 때문에 &lt;b&gt;온라인 사전 예약&lt;/b&gt;이 필수입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NOL 사이트 온라인 사전 예매 ------------&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a style=&quot;background-color: #f9fcff; color: #737373; text-align: start;&quot; href=&quot;https://ader.naver.com/v1/IWTfZTxHdLfv-fyKE_gcnUu6yeaMP1-kCFypcNrb-1Y-BxH0hWDwKNevs90NDir9E2QUIag-O0wQgzKMiItZ_EHBVwDXFnSZbWhxHbZxa2pjHjVZyhHM304e0UZQ_5NSzFTNmnsSYdBFQAZ2sC28xPbnMmP0Oa7YQ2zuieskpR2rDPAiO60H_G36rjeNAPRCh30HV_JoHGlUBTIKqiHMtQ4sr4pD5kwOJR9GPdQ-wzRUw3F2GUL53bnyQUXhsU_N3R_HQcWX7kxqZo2nT9KgJiGlZFdKnH_ObKIrIdeX0u0OoaiTJJTB41EzmLJg5Vr8yOvyScYKB2jCtcDNHgAon5AlOCtObpJYImy_BVQK4HAlkFQPJiK39-l-6LoW-zjEFS_h056raUXME3K5Z3oYF99GcBpi8MbQysWfVV_9mQa0acXL7CMSHGGpkqyO_sgB4jq594mzG9bg3pp94dkTUm5onJMMM82liWLqWvmyBLYvkEl7lA4zQTePME112J5E?c=naver.search.pc.plsearch&amp;amp;t=0&quot;&gt;nol.yanolja.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;예약 오픈 : &lt;b&gt;3월 10일 오후 1시&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;인기 시즌은 빠르게 매진되므로 미리 준비 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hwadamsup.com/pc/ko/index&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hwadamsup.com/pc/ko/index&lt;/a&gt;&amp;nbsp; 화담숲 예매 사이트 바로가기&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;span style=&quot;color: #1a1a1a; font-size: 1.25em; letter-spacing: -1px; background-color: #ffffff;&quot;&gt;운영시간&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1a1a1a; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;09:00~17:00 (화~일,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;매주 월요일 휴원&lt;/b&gt;), 입장마감 17:00&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;!-- 모노레일 --&gt;
&lt;div style=&quot;background: #fff7f7; border-left: 6px solid #ff6b6b; padding: 20px; border-radius: 10px; margin-bottom: 25px;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 모노레일 예매 및 이용 구조&lt;/h2&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;1구간 : 약 5분&lt;/li&gt;
&lt;li&gt;2구간 : 약 10분&lt;/li&gt;
&lt;li&gt;전체 순환 코스 : 약 20분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 아이와 함께 방문한다면 모노레일 이용을 추천합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1a1a; text-align: start;&quot;&gt;모노레일은 노약자의 편리하고 안전한 관람을 위해 화담숲 서쪽 이끼원 입구-화담숲 정상-분재원&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1a1a; text-align: start;&quot;&gt;사이를 지나는 1,213m 순환선으로 전체 운행 소요시간은 약 20분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 벚꽃 --&gt;
&lt;div style=&quot;background: #fff5f9; border-left: 6px solid #ff7aa2; padding: 20px; border-radius: 10px; margin-bottom: 25px;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ 벚꽃 개화 시기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화담숲은 봄이 되면 벚꽃과 수선화가 동시에 피어 장관을 이룹니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벚꽃 만개 예상 : &lt;b&gt;4월 중순&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;수선화 : 벚꽃과 동시에 절정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진 촬영 명소로도 유명해 많은 사람들이 찾는 봄 여행지입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;75&quot; data-start=&quot;59&quot; data-section-id=&quot;oqqz9l&quot; data-ke-size=&quot;size23&quot;&gt;화담숲 벚꽃 개화 시기&lt;/h3&gt;
&lt;p data-end=&quot;168&quot; data-start=&quot;77&quot; data-ke-size=&quot;size16&quot;&gt;화담숲의 벚꽃은 보통 &lt;b&gt;4월 초부터 피기 시작해 4월 중순에 만개&lt;/b&gt;하는 경우가 많습니다.&lt;br /&gt;특히 날씨가 따뜻한 해에는 개화 시기가 조금 앞당겨질 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;303&quot; data-start=&quot;170&quot; data-ke-size=&quot;size16&quot;&gt;화담숲은 다양한 테마 정원과 산책로가 잘 조성되어 있어 &lt;b&gt;벚꽃과 함께 자연 풍경을 즐기기 좋은 장소&lt;/b&gt;로 유명합니다. 봄 시즌에는 벚꽃뿐만 아니라 &lt;b&gt;수선화, 진달래 등 다양한 봄꽃이 함께 피어&lt;/b&gt; 더욱 아름다운 풍경을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;352&quot; data-start=&quot;305&quot; data-ke-size=&quot;size16&quot;&gt;따라서 화담숲을 가장 예쁘게 즐기고 싶다면 &lt;b&gt;4월 중순 전후 방문을 추천&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 아이와 방문 --&gt;
&lt;div style=&quot;background: #f2f8ff; border-left: 6px solid #4c8bf5; padding: 20px; border-radius: 10px; margin-bottom: 25px;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 아이와 함께 방문시 참고 사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화담채 미디어 전시관 관람 추천&lt;/li&gt;
&lt;li&gt;아이와 함께 자연 체험 가능&lt;/li&gt;
&lt;li&gt;가족 나들이 장소로 인기&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;유모차 - 휠체어 관람 안내&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 화담숲 원내는 완만한 데크길로 이루어져 있어 유모차, 휠체어 이용 고객도 모노레일 탑승 없이 관람이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;204&quot; data-start=&quot;78&quot; data-ke-size=&quot;size16&quot;&gt;화담숲은 자연 속에서 산책하며 다양한 식물과 풍경을 즐길 수 있어 &lt;b&gt;아이와 함께 방문하기 좋은 가족 나들이 장소&lt;/b&gt;입니다. 다만 숲 전체가 넓고 경사가 있는 구간도 있기 때문에 몇 가지 참고하면 더 편하게 즐길 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;343&quot; data-start=&quot;206&quot; data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;모노레일 이용을 고려해보는 것이 좋습니다.&lt;/b&gt; 아이와 함께 긴 산책을 하기 어려울 수 있기 때문에 모노레일을 이용하면 편하게 숲을 둘러볼 수 있습니다. 특히 어린 아이가 있다면 이동 부담을 줄일 수 있어 많은 가족들이 이용하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;441&quot; data-start=&quot;345&quot; data-ke-size=&quot;size16&quot;&gt;또한 화담숲 안에는 &lt;b&gt;화담채 미디어 전시관&lt;/b&gt;이 있어 자연과 관련된 다양한 전시를 볼 수 있습니다. 아이들도 흥미롭게 볼 수 있는 공간이라 함께 들러보는 것을 추천합니다.&lt;/p&gt;
&lt;p data-end=&quot;568&quot; data-start=&quot;443&quot; data-ke-size=&quot;size16&quot;&gt;산책로는 대부분 잘 정비되어 있지만 유모차를 이용할 경우에는 &lt;b&gt;경사가 있는 구간이나 계단이 있는 곳도 있기 때문에 이동 경로를 미리 확인&lt;/b&gt;하는 것이 좋습니다. 편한 신발을 준비하고 여유 있게 산책을 즐기는 것이 좋습니다.&lt;/p&gt;
&lt;p data-end=&quot;649&quot; data-start=&quot;570&quot; data-ke-size=&quot;size16&quot;&gt;자연 속에서 꽃과 나무를 가까이에서 볼 수 있어 아이들에게도 좋은 경험이 되는 곳이라 &lt;b&gt;가족 나들이 장소로 많은 분들이 찾는 명소&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 결론 --&gt;
&lt;div style=&quot;background: #f7f7f7; border-left: 6px solid #444; padding: 20px; border-radius: 10px;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6️⃣ 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화담숲 방문의 핵심은 &lt;b&gt;사전 예약&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봄 시즌에는 벚꽃과 자연 풍경이 아름다워 &lt;b&gt;가족 나들이와 봄 여행지&lt;/b&gt;로 매우 추천되는 장소입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한국사람들은 유행을 좋아합니다. 3월에 유행은 단연코 화담숲이죠.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;225&quot; data-start=&quot;81&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;225&quot; data-start=&quot;81&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화담숲은 아름다운 자연을 가까이에서 느낄 수 있는 국내 대표 자연 수목원으로, 사계절마다 다른 풍경을 즐길 수 있는 힐링 여행지입니다. 특히 봄에는 벚꽃과 다양한 봄꽃이 함께 피어 사진 명소이자 가족 나들이 장소로 많은 사람들이 찾고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;379&quot; data-start=&quot;227&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한 약 5만 평 규모의 넓은 숲과 16개의 테마 정원이 조성되어 있어 자연 속에서 여유롭게 산책을 즐길 수 있다는 점도 큰 매력입니다. 숲을 편하게 둘러볼 수 있도록 모노레일 시설이 마련되어 있어 아이와 함께 방문하거나 부모님과 함께 여행하기에도 좋습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;478&quot; data-start=&quot;381&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무엇보다 화담숲은 단순한 관광지가 아니라 멸종 위기 동식물 보호와 자연 생태계 복원을 목표로 운영되는 공간이기 때문에 자연의 가치와 아름다움을 함께 느낄 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;529&quot; data-start=&quot;480&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자연 속에서 힐링하고 싶은 분들이라면 봄 나들이 명소로 화담숲 방문을 추천합니다.&lt;/b&gt;&lt;/p&gt;</description>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/166</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%99%94%EB%8B%B4%EC%88%B2-%EC%98%88%EC%95%BD-%EB%B0%A9%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC#entry166comment</comments>
      <pubDate>Thu, 12 Mar 2026 10:20:56 +0900</pubDate>
    </item>
    <item>
      <title>개인사업자 장기렌트 장점 (절세, 비용처리, 관리)</title>
      <link>https://ryurim.tistory.com/entry/%EA%B0%9C%EC%9D%B8%EC%82%AC%EC%97%85%EC%9E%90-%EC%9E%A5%EA%B8%B0%EB%A0%8C%ED%8A%B8-%EC%9E%A5%EC%A0%90-%EC%A0%88%EC%84%B8-%EB%B9%84%EC%9A%A9%EC%B2%98%EB%A6%AC-%EA%B4%80%EB%A6%AC</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목을 입력해주세요. (1).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jk4W7/dJMcaaqGdDg/uYvYzi3GfRSSPRGA3geFAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jk4W7/dJMcaaqGdDg/uYvYzi3GfRSSPRGA3geFAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jk4W7/dJMcaaqGdDg/uYvYzi3GfRSSPRGA3geFAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJk4W7%2FdJMcaaqGdDg%2FuYvYzi3GfRSSPRGA3geFAk%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;1080&quot; height=&quot;1080&quot; data-filename=&quot;제목을 입력해주세요. (1).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9147730077768880&quot;&gt;&lt;/script&gt;
&lt;!-- 헬퍼도우미-최상단 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-02-11 09;41;16.PNG&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCcrn/dJMcabpBU5f/3zeQfr8sMMKHYkqgkJ9W31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCcrn/dJMcabpBU5f/3zeQfr8sMMKHYkqgkJ9W31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCcrn/dJMcabpBU5f/3zeQfr8sMMKHYkqgkJ9W31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCcrn%2FdJMcabpBU5f%2F3zeQfr8sMMKHYkqgkJ9W31%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;877&quot; height=&quot;578&quot; data-filename=&quot;2026-02-11 09;41;16.PNG&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인사업자에게 차량은 단순한 이동수단이 아니라 매출 활동과 직결되는 핵심 자산이다. 하지만 차량을 직접 구매할 경우 세금, 유지비, 관리 부담이 상당하다. 2026년 현재 개인사업자 사이에서 장기렌트가 주목받는 이유는 절세 효과와 비용처리의 편의성, 그리고 차량 관리 부담을 크게 줄여주기 때문이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개인사업자 절세에 유리한 장기렌트 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장기렌트 차량은 소유권이 렌트사에 있기 때문에 개인사업자의 자산으로 잡히지 않는다. 이로 인해 취득세와 자동차세 부담이 없으며, 월 렌트료 전액을 필요경비로 처리할 수 있다. 렌트료에는 보험료와 정비비가 포함돼 있어 과세표준을 낮추는 데 효과적이다. 단, 연간 비용이 일정 금액을 초과할 경우 운행기록부 작성이 필요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;비용처리와 증빙 관리의 편의성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장기렌트는 매월 발행되는 세금계산서 또는 계산서만으로 비용 증빙이 가능해 세무 관리가 간편하다. 보험료, 수리비를 개별 관리할 필요가 없고, 일반과세자의 경우 조건에 따라 부가가치세 환급도 기대할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;차량 관리 부담을 줄여주는 실무적 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기 점검, 소모품 교체, 보험 처리 등 차량 관리 업무를 렌트사가 대행해주기 때문에 사업자는 본업에 집중할 수 있다. 계약 종료 시 차량 매각 부담 없이 반납 또는 재계약이 가능해 자금 계획 수립에도 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 기준으로 장기렌트는 개인사업자에게 절세, 비용관리, 운영 효율성을 동시에 제공하는 합리적인 차량 이용 전략이다.&lt;/p&gt;</description>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/165</guid>
      <comments>https://ryurim.tistory.com/entry/%EA%B0%9C%EC%9D%B8%EC%82%AC%EC%97%85%EC%9E%90-%EC%9E%A5%EA%B8%B0%EB%A0%8C%ED%8A%B8-%EC%9E%A5%EC%A0%90-%EC%A0%88%EC%84%B8-%EB%B9%84%EC%9A%A9%EC%B2%98%EB%A6%AC-%EA%B4%80%EB%A6%AC#entry165comment</comments>
      <pubDate>Mon, 9 Feb 2026 16:22:53 +0900</pubDate>
    </item>
    <item>
      <title>2026 장기렌트 장점 총정리 (세금절약, 유지비, 혜택)</title>
      <link>https://ryurim.tistory.com/entry/2026-%EC%9E%A5%EA%B8%B0%EB%A0%8C%ED%8A%B8-%EC%9E%A5%EC%A0%90-%EC%B4%9D%EC%A0%95%EB%A6%AC-%EC%84%B8%EA%B8%88%EC%A0%88%EC%95%BD-%EC%9C%A0%EC%A7%80%EB%B9%84-%ED%98%9C%ED%83%9D</link>
      <description>&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9147730077768880&quot;&gt;&lt;/script&gt;
&lt;!-- 헬퍼도우미-최상단 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6LiNx/dJMcagYIGFB/5QvisVJdyKIpelGf1wateK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6LiNx/dJMcagYIGFB/5QvisVJdyKIpelGf1wateK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6LiNx/dJMcagYIGFB/5QvisVJdyKIpelGf1wateK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6LiNx%2FdJMcagYIGFB%2F5QvisVJdyKIpelGf1wateK%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; alt=&quot;렌트차량사진&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;581&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차량을 구매하지 않고 이용하는 방식 중 장기렌트는 2026년 현재 가장 합리적인 선택지로 떠오르고 있다. 초기 비용 부담 없이 신차를 이용할 수 있고, 세금과 유지비 관리까지 간편해 개인과 사업자 모두에게 장점이 많다. 이 글에서는 장기렌트의 핵심 장점을 세금 절약, 유지비, 실질 혜택 중심으로 상세히 정리한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세금 절약 측면에서의 장기렌트 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장기렌트의 가장 큰 장점은 세금 구조에서 발생한다. 차량의 소유권이 렌트사에 있기 때문에 이용자는 차량을 자산으로 보유하지 않으며, 이에 따라 취득세와 재산세 부담이 발생하지 않는다. 2026년 기준 개인사업자나 프리랜서는 장기렌트 비용을 필요경비로 처리할 수 있다. 월 렌트료에는 차량 이용료뿐 아니라 보험료, 자동차세, 정비비가 포함돼 있어 비용 처리에 유리하며, 과세표준을 낮춰 종합소득세 절감 효과로 이어진다. 고가 차량일수록 장기렌트의 절세 효과는 더욱 커진다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유지비 부담을 줄여주는 구조적 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장기렌트는 자동차 보험, 자동차세, 정비비 등이 월 렌트료에 포함돼 있어 유지비 관리가 매우 편리하다. 보험료 상승이나 갑작스러운 정비 비용 걱정 없이 고정비 형태로 차량을 이용할 수 있으며, 렌트사가 차량 관리 전반을 대행해준다. 또한 계약 종료 시 차량 처분에 대한 부담이 없어 중고차 가격 하락이나 감가 손실을 걱정할 필요가 없다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실사용자에게 체감되는 실질 혜택&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장기렌트는 초기 비용 부담이 거의 없고, 신차를 월 렌트료만으로 이용할 수 있어 현금 흐름 관리에 유리하다. 2026년처럼 차량 기술 변화가 빠른 시기에는 계약 종료 후 최신 모델로 자연스럽게 전환할 수 있는 유연성도 큰 장점이다. 또한 일반 할부 구매 대비 신용도에 미치는 영향이 적어 향후 금융 계획 수립에도 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 기준으로 장기렌트는 세금 절약과 유지비 관리, 현금 흐름 안정성까지 고려한 합리적인 차량 이용 전략이다. 차량 관리 부담을 줄이고 예측 가능한 비용 구조를 원한다면 장기렌트는 충분히 검토할 가치가 있는 선택지다.&lt;/p&gt;</description>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/164</guid>
      <comments>https://ryurim.tistory.com/entry/2026-%EC%9E%A5%EA%B8%B0%EB%A0%8C%ED%8A%B8-%EC%9E%A5%EC%A0%90-%EC%B4%9D%EC%A0%95%EB%A6%AC-%EC%84%B8%EA%B8%88%EC%A0%88%EC%95%BD-%EC%9C%A0%EC%A7%80%EB%B9%84-%ED%98%9C%ED%83%9D#entry164comment</comments>
      <pubDate>Mon, 9 Feb 2026 15:04:49 +0900</pubDate>
    </item>
    <item>
      <title>상단에 닿았을 때 헤더 색 투명, 스크롤 내리면 헤더색 흰색으로 (feat. react custom hook)</title>
      <link>https://ryurim.tistory.com/entry/%EC%83%81%EB%8B%A8%EC%97%90-%EB%8B%BF%EC%95%98%EC%9D%84-%EB%95%8C-%ED%97%A4%EB%8D%94-%EC%83%89-%ED%88%AC%EB%AA%85-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%82%B4%EB%A6%AC%EB%A9%B4-%ED%97%A4%EB%8D%94%EC%83%89-%ED%9D%B0%EC%83%89%EC%9C%BC%EB%A1%9C-feat-react-custom-hook</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목_없는_아트워크 2.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wSAH4/btsmsRf7zOg/CGUl8yumorTkmyI2FB0MtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wSAH4/btsmsRf7zOg/CGUl8yumorTkmyI2FB0MtK/img.jpg&quot; data-alt=&quot;미리보기 방지용 크큭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wSAH4/btsmsRf7zOg/CGUl8yumorTkmyI2FB0MtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwSAH4%2FbtsmsRf7zOg%2FCGUl8yumorTkmyI2FB0MtK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;360&quot; data-filename=&quot;제목_없는_아트워크 2.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미리보기 방지용 크큭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Jul-04-2023 23-05-06.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdtZc8/btsmrFOlXwU/6vnTU0bTywUGPo14HN1fM0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdtZc8/btsmrFOlXwU/6vnTU0bTywUGPo14HN1fM0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdtZc8/btsmrFOlXwU/6vnTU0bTywUGPo14HN1fM0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bdtZc8/btsmrFOlXwU/6vnTU0bTywUGPo14HN1fM0/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;640&quot; height=&quot;268&quot; data-filename=&quot;Jul-04-2023 23-05-06.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 스크롤을 하단으로 내리면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더의 색이 흰색으로 변하고 다시 상단에 닿았을 땐 투명으로 변하는 것을 훅으로 구현해보았다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Scroll Event는 전체적인 스크롤에 반응한다. 이는 성능적으로 비효율적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;스크롤 이벤트에 쓰이는 documentElement.scrollTop과 documentElement.offsetHeight는 reflow를 일으켜서 성능상 좋지 않다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용한 것은 바로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Intersection_Observer_API&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Intersection Observer API&lt;/b&gt;&lt;/a&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intersection Observer API 는 루트 요소와 타겟 요소의 교차점을 관찰한다. 그리고 타겟 요소가 루트 요소와 교차하는지 아닌지를 구별하는 기능을 제공하고 있다. scroll 이벤트와 다르게 교차 시 &lt;b&gt;비동기적&lt;/b&gt;으로 실행되며 가시성 구분 시&amp;nbsp;&lt;b&gt;reflow 를 발생시키지 않는다!!!&lt;/b&gt; 여러모로 성능 상 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;리플로우&amp;rdquo;는 모든 엘리먼트의 위치와 길이 등을 다시 계산하는 것으로 문서의 일부 혹은 전체를 다시 렌더링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일&lt;span&gt; &lt;/span&gt;엘리먼트&lt;span&gt; &lt;/span&gt;하나를&lt;span&gt; &lt;/span&gt;변경해도&lt;span&gt;, &lt;/span&gt;하위&lt;span&gt; &lt;/span&gt;엘리먼트나&lt;span&gt; &lt;/span&gt;상위&lt;span&gt; &lt;/span&gt;엘리먼트&lt;span&gt; &lt;/span&gt;등에&lt;span&gt; &lt;/span&gt;영향을&lt;span&gt; &lt;/span&gt;미칠&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있다&lt;span&gt;.&lt;/span&gt;&lt;/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;이러한 이유로 Intersection Observer API 선택!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우선 커스텀 훅이다!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688480132609&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useEffect, useState } from 'react';

type UseIsVisibleReturnType = [(node: HTMLElement | null) =&amp;gt; void, boolean];

interface UseIsVisiblePropsType {
	options: {
		threshold: number; // 교차점이 어느정도 보여지는지에 따라
		rootMargin: string; // 어느시점부터 관찰을 시작할 것인지 기본값은 0px;
	};
	initialVisible: boolean; // 관찰대상의 초기 값 보인다면 true, 보이지 않는다면 false
}
const useIsVisible = (props: UseIsVisiblePropsType):UseIsVisibleReturnType =&amp;gt; {
	const { options, initialVisible } = props;
	const [visibleRef, setVisibleRef] = useState(null);
	const [isVisible, setIsVisible] = useState(initialVisible);

	useEffect(() =&amp;gt; {
		const observer = new IntersectionObserver(([entry]) =&amp;gt; {
			setIsVisible(entry.isIntersecting); //관찰중이면 true , 아니면 false
		}, options);

		if (visibleRef) { //관찰대상이 있을때만 실행
			observer.observe(visibleRef);
			return;
		}

		// Clean up function
		return () =&amp;gt; {
			if (visibleRef) { //관찰대상이 있을때만 실행
				observer.unobserve(visibleRef);
			}
		};
	}, [visibleRef]);


	const setRefCallback = (node) =&amp;gt; {
		setVisibleRef(node); // 관찰대상을 set해주는 부분
	};

	return [setRefCallback, isVisible]; 
};

export default useIsVisible;&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;pre id=&quot;code_1688480387444&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	const [visibleRef, isVisible] = useIsVisible({
		options: {
			rootMargin: '0px',
			threshold: 1.0, // visibleRef가 모두 보였을 때만 true
		},
		initialVisible: false,
	});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 리액트 훅을 호출!!!&lt;/p&gt;
&lt;pre id=&quot;code_1688480618427&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ImageWrap ref={visibleRef as HTMLElement}&amp;gt;
	{/*children 요소를 넣으면 됩니다.*/}
&amp;lt;/ImageWrap&amp;gt;
&amp;lt;Header isTop={isVisible as boolean}
onClick={() =&amp;gt; {
onClickClose(id);
}}&amp;gt;
	&amp;lt;Icon.Close color={isVisible ? '#fff' : '#000'} size='21' /&amp;gt;
&amp;lt;/Header&amp;gt;
                    
      const ImageWrap = styled.div`
		width: 100%;
		height: 230px;
		border-radius: 20px 20px 0 0;
		overflow: hidden;
		position: relative;
	`;
    const Header = styled.div&amp;lt;{ isTop: boolean }&amp;gt;`
		width: 100%;
		height: 57px;
		position: fixed;
		top: 0;
		left: 0;
		display: flex;
		align-items: center;
		justify-content: flex-end;
		z-index: 99;
		border-radius: 20px 20px 0 0;
		padding: 0 18px;
		box-sizing: border-box;
		background: ${({ isTop }) =&amp;gt; (isTop ? 'none' : '#fff')};
		transition: background 0.25s ease-out;
		cursor: pointer;
	`;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용은 참 쉽다! header는 fixed포지션으로 항상 고정되는 반면 ImageWrap은 스크롤을 내리면 사라진다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 점을 이용하여 간단하게 구현해보았다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의 기록 끝..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 꾸준히 다시 업로드하는 습관을 들이겠다!&lt;/p&gt;</description>
      <category>TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/163</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%83%81%EB%8B%A8%EC%97%90-%EB%8B%BF%EC%95%98%EC%9D%84-%EB%95%8C-%ED%97%A4%EB%8D%94-%EC%83%89-%ED%88%AC%EB%AA%85-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%82%B4%EB%A6%AC%EB%A9%B4-%ED%97%A4%EB%8D%94%EC%83%89-%ED%9D%B0%EC%83%89%EC%9C%BC%EB%A1%9C-feat-react-custom-hook#entry163comment</comments>
      <pubDate>Tue, 4 Jul 2023 23:26:04 +0900</pubDate>
    </item>
    <item>
      <title>[NextJS] styled-components  Prop `className` did not match.</title>
      <link>https://ryurim.tistory.com/entry/NextJS-styled-components-Prop-className-did-not-match</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;next js 를 13버전으로 업그이드 한 이후 이런 에러가 콘솔창에 떴다 !&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_1682514361196&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module.exports = {
	experimental: {
		forceSwcTransforms: true,
	},
	compiler: {
		styledComponents: true,
	},
};

//next.config.ts
파일에 아래의 값을 넣어주면 에러가 나지 않는다 !! 

	compiler: {
		styledComponents: true,
	},&lt;/code&gt;&lt;/pre&gt;</description>
      <category>TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/162</guid>
      <comments>https://ryurim.tistory.com/entry/NextJS-styled-components-Prop-className-did-not-match#entry162comment</comments>
      <pubDate>Wed, 26 Apr 2023 22:06:26 +0900</pubDate>
    </item>
    <item>
      <title>리액트 더보기 접기 기능구현</title>
      <link>https://ryurim.tistory.com/entry/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%8D%94%EB%B3%B4%EA%B8%B0-%EC%A0%91%EA%B8%B0-%EA%B8%B0%EB%8A%A5%EA%B5%AC%ED%98%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 TIL ..&amp;nbsp;  &amp;zwj;♀️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 초심으로 돌아가서 열심히 기록해야지 ! ☃️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Feb-08-2023 22-41-59.gif&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmc2aL/btrYyUhlYGl/Ks3Yu8G2UIgJOmM4vuJLkK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmc2aL/btrYyUhlYGl/Ks3Yu8G2UIgJOmM4vuJLkK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmc2aL/btrYyUhlYGl/Ks3Yu8G2UIgJOmM4vuJLkK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bmc2aL/btrYyUhlYGl/Ks3Yu8G2UIgJOmM4vuJLkK/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;802&quot; height=&quot;368&quot; data-filename=&quot;Feb-08-2023 22-41-59.gif&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더보기와 접기 기능은 의외로 간단했다!&lt;/p&gt;
&lt;pre id=&quot;code_1675864037048&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import styled from 'styled-components'; //styled 컴포넌트 임포트

// 1. text wrap을 하나 생성해줍니다.

const textRef = useRef(null); //실제 text의 높이를 계산하기 위한 ref
const [isMoreView, setIsMoreView] = useState(false); // 더보기 버튼의 여부
const [isShowText, setIsShowText] = useState(false); // 내용이 더 보여지고, 접기 버튼의 여부

//만약 높이가 100px이상이라면, 더보기 버튼 보여주기
useEffect(() =&amp;gt; {
		const contentHeight = textRef.current.clientHeight;
		if (contentHeight &amp;gt; 100) {
			setIsMoreView(true);
		} else {
			setIsMoreView(false);
		}
}, []);

//더보기 접기 버튼 클릭
	const onClickMoreDesc = () =&amp;gt; {
		setIsShowText((s) =&amp;gt; !s);
	};
    
&amp;lt;TextBox&amp;gt;
 &amp;lt;TextInner isShow={isShowText} maxHeight={`${textHeight}px`}&amp;gt;
 	&amp;lt;Text ref={textRef}&amp;gt;{text}&amp;lt;/Text&amp;gt;
 &amp;lt;/TextInner&amp;gt;
  {isMoreView ? (
    &amp;lt;MoreButton onClick={onClickMoreDesc}&amp;gt;
     {isShowText ? '접기' : '더보기'}
    &amp;lt;/MoreButton&amp;gt;
	) : null}
&amp;lt;/TextBox&amp;gt;

const TextBox = styled.div`
	width: 100%;
	height: auto;
	min-height: 54px;
	position: relative;
	box-sizing: border-box;
`;
const TextInner = styled.div&amp;lt;{ isShow: boolean; maxHeight: string }&amp;gt;`
	width: 100%;
	max-height: ${({ maxHeight }) =&amp;gt; maxHeight};
	position: relative;
	white-space: pre-wrap;
	overflow: hidden;
	${({ isShow }) =&amp;gt;
		isShow &amp;amp;&amp;amp;
		`
		max-height: none;
		overflow: hidden;
		-webkit-line-clamp: unset;
		-ms-overflow-style: none;
		padding: 5px 0;
		box-sizing: border-box;
		::-webkit-scrollbar {
			display: none;
		}`}
`;
const Text = styled.p`
	width: 100%;
	font-size: 15px;
	line-height: 25px;
	position: relative;
	display: -webkit-box;
	white-space: pre-wrap;
	word-break: break-all;

	@media (max-width: 1199px) {
		font-size: 14px;
		line-height: 22px;
	}
`;
const MoreButton = styled.button`
	width: auto;
	height: 22px;
	margin-top: 10px;
	text-decoration-line: underline;
	color: #6a6a6a;
	font-size: 14px;
	line-height: 22px;
	@media (max-width: 1199px) {
		font-size: 13px;
	}
`;&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;중요한건 실제 텍스트가 담길 p태그에는 max-height가 없어야 실제 높이를 잘 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p태그 부모태그에 max-height를 주어 overflow: hidden을 통해 감추고 있다가 더보기 버튼을 클릭하면 순간 max-height를 없애 내용물을 보여주는 스타일로 많은 것을 해결할 수 있는 기능이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/161</guid>
      <comments>https://ryurim.tistory.com/entry/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%8D%94%EB%B3%B4%EA%B8%B0-%EC%A0%91%EA%B8%B0-%EA%B8%B0%EB%8A%A5%EA%B5%AC%ED%98%84#entry161comment</comments>
      <pubDate>Wed, 8 Feb 2023 22:49:22 +0900</pubDate>
    </item>
    <item>
      <title>리액트에서 지도 @react-google-maps/api 라이브러리 사용하여 (TypeScript + Next 환경)</title>
      <link>https://ryurim.tistory.com/entry/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%97%90%EC%84%9C-%EC%A7%80%EB%8F%84-react-google-mapsapi-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-TypeScript-Next-%ED%99%98%EA%B2%BD</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 적어보는 TIL ... &amp;zwj;♀️&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;구글 api key 설정하는 글들은 많으니 생략하겠습니다.&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://developers.google.com/maps/documentation/javascript/tutorials&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리액트 환경에서 구글 map&lt;/a&gt; 자바스크립트 api 튜토리얼을 보고, 어떻게 해서든 구현하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 내가 구현해야되는 기능은 n초마다 나의 위치 정보를 서버에 갱신해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 주위 3km 반경에 있는 사람들의 좌표를 구글 맵에서 마커로 찍어주는 것이었다.&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;n초마다 내 위치를 갱신할때마다 나의 위치를 찍어주는 마커가 계속 생성되는 것이었다..ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ일요일 하루종일 고민하며 코드를 써내려갔지만, ㅠㅠ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 위치 정보를 제대로 반영하면, 지도가 깜빡거리는 문제가 발생했다 ㅎ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 자바스크립트 튜토리얼로는 해결할 수 없겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 내가 깐 라이브러리는 2개&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://react-google-maps-api-docs.netlify.app/#section-introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;react-google-maps/api라는 라이브러리&lt;/a&gt;당!&lt;/p&gt;
&lt;pre id=&quot;code_1672238910087&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -D @types/google.maps
npm i @react-google-maps/api&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;구글맵에서 발급받은 api key를 env 환경에 잘 저장해주고,&lt;/p&gt;
&lt;pre id=&quot;code_1672239015716&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {
	Circle,
	GoogleMap,
	Marker,
	useLoadScript,
} from '@react-google-maps/api';&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1672239266386&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Map = (props: PropsType) =&amp;gt; {
	

	const [center, setCenter] = useState({
		lat: 0,
		lng: 0,
	}); //map center
	const [myLocation, setMyLocation] = useState({
		lat: 0,
		lng: 0,
	});
	const [zoom, setZoom] = useState(14); //map zoom level
	
	const [map, setMap] = useState(null); //map state

	
	//map 스크립트에 key 넣어줌
	const { isLoaded } = useLoadScript({
		googleMapsApiKey: 이곳에 google api key를 넣어줍니다,
		id: 'google-map-script',
	});
    
	//지도 로드 되자마자 실행되는 함수
	const onLoad = useCallback((map) =&amp;gt; {
		const bounds = new window.google.maps.LatLngBounds(center);
		map.fitBounds(bounds);
		setMap(map);
	}, []);
	//지도 꺼졌을 때 실행되는 함수
	const onUnmount = useCallback((map) =&amp;gt; {
		setMap(null);
	}, []);


	//내위치로 돌아가기 버튼 클릭
	const onClickGeoLocation = () =&amp;gt; {
		if (navigator.geolocation) {
			navigator.geolocation.getCurrentPosition(
				async (position: GeolocationPosition) =&amp;gt; {
					const pos = {
						lat: position.coords.latitude,
						lng: position.coords.longitude,
					};
					setCenter(pos);
					setMyLocation(pos);
					setZoom(15);
					
				},
				(err) =&amp;gt; {
					console.log(err);
					popup.alert('위치 정보를 허용해주세요!');
				},
			);
		} else {
			// Browser doesn't support Geolocation
			popup.alert('브라우저에서 위치 정보를 허용해주세요!');
		}
	};

	
	//zoom change
	const mapZoomChange = () =&amp;gt; {
		setZoom(map?.getZoom()); //map zoom 확대 축소 이벤트 일어날 때마다 map의 줌레벨 setting
	};
	//지도 스타일링
	const containerStyle = {
		width: '100%',
		height: `100vh`,//화면에 지도가 꽉찬다. =&amp;gt; 싫다면 px로 조절
	};
	// 지도 옵션
	const options = {
		minZoom: 4,//최소줌 지도레벨
		maxZoom: 18,//최대줌 지도레벨
		mapTypeControl: false, //구글맵 왼쪽 상단 지도,위성 전환 버튼 비활성화
		panControl: false, //이동 컨트롤 비활성화
		zoomControl: false, //scaleControl
		scaleControl: false, //지도 축척을 제공하는 Scale 컨트롤 비활성화
		fullscreenControl: false, //full 스크린 비활성화
		streetViewControl: false, //pegMan아이콘 street view 비활성화
		gestureHandling: 'greedy', //한손가락으로 지도 이동
		clickableIcons: false, //기본 마커 인포 윈도우 비활성화
	};
	//3km반경 표시해주는 원 옵션
	const circleOptions = {
		strokeColor: '#C5F1E0',
		strokeOpacity: 0.5,
		strokeWeight: 0,
		fillColor: '#C5F1E0',
		fillOpacity: 0.5,
		radius: 3000,// =&amp;gt; 3km
	};

	return (
		&amp;lt;&amp;gt;
			&amp;lt;Styled.Wrap&amp;gt;
				
				{isLoaded ? (
					&amp;lt;&amp;gt;
						&amp;lt;GoogleMap
							mapContainerStyle={containerStyle}
							center={center}
							onUnmount={onUnmount}
							onLoad={onLoad}
							zoom={zoom}
							options={options}
							onZoomChanged={mapZoomChange}
							onClick={onClickAddMarker}&amp;gt;
							{zoom &amp;gt; 11 ? (
								&amp;lt;&amp;gt;
									&amp;lt;Marker
										position={myLocation}
										icon={'이미지 url'}
									/&amp;gt;
									&amp;lt;Circle
										center={myLocation}
										options={circleOptions}
										onClick={onClickAddMarker}
									/&amp;gt;
								&amp;lt;/&amp;gt;
							) : null}
							&amp;lt;Styled.MapFocusIconWrap onClick={onClickGeoLocation}&amp;gt;
								&amp;lt;Icon.Focus /&amp;gt;
							&amp;lt;/Styled.MapFocusIconWrap&amp;gt;
						&amp;lt;/GoogleMap&amp;gt;
					&amp;lt;/&amp;gt;
				) : null}
				
			&amp;lt;/Styled.Wrap&amp;gt;
			
		&amp;lt;/&amp;gt;
	);
};

export default Map;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게만 해준 뒤 geolocation 함수만 setInterval로 n초마다 실행시킨다면,, n초마다 나의 실시간 위치를 지도에서 띄워준다 !!&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/160</guid>
      <comments>https://ryurim.tistory.com/entry/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%97%90%EC%84%9C-%EC%A7%80%EB%8F%84-react-google-mapsapi-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-TypeScript-Next-%ED%99%98%EA%B2%BD#entry160comment</comments>
      <pubDate>Wed, 28 Dec 2022 23:56:14 +0900</pubDate>
    </item>
    <item>
      <title>Svelte -라우터 설정하기</title>
      <link>https://ryurim.tistory.com/entry/Svelte-%EB%9D%BC%EC%9A%B0%ED%84%B0-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우선 스벨트 프로젝트를 생성했으면 라우터도 깔아줍니다.!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에 아래의 명령어를 입력하여 깔기 !!&lt;/p&gt;
&lt;pre id=&quot;code_1665373296089&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; npm install --save svelte-spa-router&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app.svelte에 routing임포트해주기!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1665373508523&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script lang=&quot;ts&quot;&amp;gt;
  import routes from &quot;./routes&quot;;
  import Router from &quot;svelte-spa-router&quot;;
  import Header from &quot;./Header.svelte&quot;;
&amp;lt;/script&amp;gt;

&amp;lt;Header /&amp;gt;
&amp;lt;main&amp;gt;
  &amp;lt;Router {routes} /&amp;gt;
&amp;lt;/main&amp;gt;

&amp;lt;style&amp;gt;
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 src에 routes라는 폴더를 생성합니다 ~!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-10 오후 12.45.32.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceafy5/btrN9kJMzaj/5yZlQ0jwianYK4Ioz71oLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceafy5/btrN9kJMzaj/5yZlQ0jwianYK4Ioz71oLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceafy5/btrN9kJMzaj/5yZlQ0jwianYK4Ioz71oLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fceafy5%2FbtrN9kJMzaj%2F5yZlQ0jwianYK4Ioz71oLk%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;480&quot; height=&quot;660&quot; data-filename=&quot;스크린샷 2022-10-10 오후 12.45.32.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;src &amp;gt; routes &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Home.svelte&lt;/p&gt;
&lt;pre id=&quot;code_1665375835602&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;홈&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;src &amp;gt; routes &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Write.svelte&lt;/p&gt;
&lt;pre id=&quot;code_1665375858804&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;글쓰기&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src &amp;gt; routes &amp;gt; index.ts&lt;/p&gt;
&lt;pre id=&quot;code_1665375877670&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Home from &quot;./Home.svelte&quot;;
import Write from &quot;./Write.svelte&quot;;

export default {
  &quot;/&quot;: Home,
  &quot;/write&quot;: Write,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src &amp;gt; Header.svelte&lt;/p&gt;
&lt;pre id=&quot;code_1665375921704&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  // 깔끔한 해시 모드 경로 변경
  import { link } from &quot;svelte-spa-router&quot;;
&amp;lt;/script&amp;gt;

&amp;lt;header&amp;gt;
  &amp;lt;a use:link href=&quot;/&quot;&amp;gt;Home&amp;lt;/a&amp;gt;
  &amp;lt;a use:link href=&quot;/write&quot;&amp;gt;Write&amp;lt;/a&amp;gt;
&amp;lt;/header&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Oct-10-2022 13-26-08.gif&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyzGDH/btrOdgGRehU/uJkMnvYXh2gMIbktUqZRck/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyzGDH/btrOdgGRehU/uJkMnvYXh2gMIbktUqZRck/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyzGDH/btrOdgGRehU/uJkMnvYXh2gMIbktUqZRck/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/eyzGDH/btrOdgGRehU/uJkMnvYXh2gMIbktUqZRck/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;662&quot; height=&quot;638&quot; data-filename=&quot;Oct-10-2022 13-26-08.gif&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스벨트로 라우터하기 !..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 조금 헤맸당 ㅠㅠ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/159</guid>
      <comments>https://ryurim.tistory.com/entry/Svelte-%EB%9D%BC%EC%9A%B0%ED%84%B0-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0#entry159comment</comments>
      <pubDate>Mon, 10 Oct 2022 13:27:01 +0900</pubDate>
    </item>
    <item>
      <title>Svelte - Typescript Setup (타입스크립트로 프로젝트 생성)</title>
      <link>https://ryurim.tistory.com/entry/Svelte-Typescript-Setup-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1665373072043&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx degit sveltejs/template [프로젝트명]

cd [프로젝트명]
npm install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프젝에 타입스크립트 사용하기!&lt;/p&gt;
&lt;pre id=&quot;code_1665373129239&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node scripts/setupTypeScript.js
npm install --dev @tsconfig/svelte

npm run dev
로 프로젝트 시작&lt;/code&gt;&lt;/pre&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/158</guid>
      <comments>https://ryurim.tistory.com/entry/Svelte-Typescript-Setup-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1#entry158comment</comments>
      <pubDate>Mon, 10 Oct 2022 12:39:04 +0900</pubDate>
    </item>
    <item>
      <title>datepicker style 커스텀 + 토요일 일요일 색 바꾸기</title>
      <link>https://ryurim.tistory.com/entry/datepicker-style-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%86%A0%EC%9A%94%EC%9D%BC-%EC%9D%BC%EC%9A%94%EC%9D%BC-%EC%83%89-%EB%B0%94%EA%BE%B8%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-08 오후 11.29.40.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cisOmo/btrN8BK0vPU/O7UQzvaK7spcnEFg1MSfp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cisOmo/btrN8BK0vPU/O7UQzvaK7spcnEFg1MSfp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cisOmo/btrN8BK0vPU/O7UQzvaK7spcnEFg1MSfp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcisOmo%2FbtrN8BK0vPU%2FO7UQzvaK7spcnEFg1MSfp0%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;716&quot; height=&quot;644&quot; data-filename=&quot;스크린샷 2022-10-08 오후 11.29.40.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굉장히 못난이었던..데이트피커 달력을 커스텀하여 바꿔봤다.ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 하루 종일... 검색하고 찾아본 결과 완성했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비록 디자인과 약간 다르지만,,ㅠㅠ 똑같이 하고 싶었는데 라이브러리를 커스텀하기엔..쉽지 않았다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1665239491670&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useEffect, useState } from 'react';
import styled from 'styled-components';
import DatePicker, { registerLocale } from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';
import ko from 'date-fns/locale/ko';
import getYear from 'date-fns/getYear';
import getMonth from 'date-fns/getMonth';
import Icon from '../icon/base/Icon';

registerLocale('ko', ko);
const months = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];
const OneDateRange = (props) =&amp;gt; {
	const { startDate, onChange, endDate } = props;
	// 요일 반환
	const getDayName = (date) =&amp;gt; {
		return date.toLocaleDateString('ko-KR', { weekday: 'long' }).substr(0, 1);
	};
	// 날짜 비교시 년 월 일까지만 비교하게끔
	const createDate = (date) =&amp;gt; {
		return new Date(
			new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0),
		);
	};
	return (
		&amp;lt;&amp;gt;
			&amp;lt;DatePickerWrapper&amp;gt;
				&amp;lt;DatePicker
					minDate={new Date()}
					selected={startDate}
					onChange={onChange}
					startDate={startDate}
					endDate={endDate}
					selectsRange
					inline
					locale={ko}
					dateFormat={DATE_FORMAT}
					dateFormatCalendar={DATE_FORMAT_CALENDAR}
					popperPlacement='auto'
					dayClassName={(date) =&amp;gt;
						getDayName(createDate(date)) === '토'
							? 'saturday'
							: getDayName(createDate(date)) === '일'
							? 'sunday'
							: undefined
					}
					renderCustomHeader={({
						date,
						prevMonthButtonDisabled,
						nextMonthButtonDisabled,
						decreaseMonth,
						increaseMonth,
					}) =&amp;gt; (
						&amp;lt;HeaderDateBox&amp;gt;
							&amp;lt;DateTitle&amp;gt;
								{getYear(date)}. {months[getMonth(date)]}
							&amp;lt;/DateTitle&amp;gt;
							&amp;lt;BtnBox&amp;gt;
								&amp;lt;button
									onClick={decreaseMonth}
									disabled={prevMonthButtonDisabled}&amp;gt;
									&amp;lt;Icon.ArrowLeft
										size='12'
										color={prevMonthButtonDisabled ? '#ccc' : '#414141'}
									/&amp;gt;
								&amp;lt;/button&amp;gt;
								&amp;lt;button
									onClick={increaseMonth}
									disabled={nextMonthButtonDisabled}&amp;gt;
									&amp;lt;Icon.ArrowRight size='12' color='#414141' /&amp;gt;
								&amp;lt;/button&amp;gt;
							&amp;lt;/BtnBox&amp;gt;
						&amp;lt;/HeaderDateBox&amp;gt;
					)}
				/&amp;gt;
			&amp;lt;/DatePickerWrapper&amp;gt;
		&amp;lt;/&amp;gt;
	);
};

export default OneDateRange;
const DATE_FORMAT = 'yyyy년 MM월 dd일';
const DATE_FORMAT_CALENDAR = 'yyyy년 MM월';

const DatePickerWrapper = styled.div`
	position: relative;
	display: flex;
	align-items: start;
	width: 100%;
	padding: 0 18px;
	height: 349px;
	background-color: #fff;
	box-sizing: border-box;
	z-index: 2;
	justify-content: center;
	&amp;amp;.react-datepicker-wrapper {
		width: 100%;
		display: block;
		background-color: #fff;
	}
	&amp;amp; .react-datepicker {
		width: 339px;
		border: none;
		display: block;
		height: 303px;
		box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.08);
		border-radius: 14px;
		background-color: #fff;
	}
	&amp;amp; .react-datepicker__header {
		position: relative;
		width: 339px;
		height: 104px;
		border: none;
		padding: 20px 0 18px;
		border-radius: 14px 14px 0 0 !important;
		box-sizing: border-box;
		background-color: #fff;
	}
	&amp;amp; .react-datepicker__day {
		outline: none;
		font-weight: 400;
		font-size: 12px;
	}
	&amp;amp; .react-datepicker__day-names {
		white-space: nowrap;
		width: 100%;
		display: flex;
		justify-content: space-around;
		align-items: center;
		height: 32px;
		box-sizing: border-box;
		padding: 0 6px;
		&amp;amp; &amp;gt; div.react-datepicker__day-name:first-child {
			color: #eb5c34;
		}
		&amp;amp; &amp;gt; div.react-datepicker__day-name:last-child {
			color: #868686;
		}
	}
	&amp;amp; .react-datepicker__week &amp;gt; .saturday {
		color: #868686;
	}
	&amp;amp; .react-datepicker__week &amp;gt; .sunday {
		color: #eb5c34;
	}
	&amp;amp; .react-datepicker__week {
		white-space: nowrap;
		width: 100%;
		display: flex;
		justify-content: space-around;
		align-items: center;
	}
	&amp;amp; .react-datepicker__day-name,
	.react-datepicker__day,
	.react-datepicker__time-name {
		color: #000;
		width: 24px;
		height: 24px;
		line-height: 24px;
		margin-bottom: 6px;
		box-sizing: border-box;
		display: flex;
		align-items: center;
		justify-content: center;
		white-space: nowrap;
	}
	&amp;amp; .react-datepicker-time__header {
		text-overflow: ellipsis;
		white-space: nowrap;
		overflow: hidden;
	}
	&amp;amp; .react-datepicker__day--outside-month,
	.react-datepicker__week &amp;gt; .saturday .react-datepicker__day--disabled,
	.react-datepicker__week &amp;gt; .sunday .react-datepicker__day--disabled {
		opacity: 0.7;
		color: #ccc !important;
	}
	&amp;amp; .react-datepicker__day--selected {
		background: #00ce7c !important;
		color: #fff !important;
		border-radius: 50% !important;
	}
	&amp;amp; .react-datepicker__day--outside-month {
		opacity: 0.7;
	}
	&amp;amp; .react-datepicker__day--in-range {
		background: rgba(213, 255, 238, 0.5);
		color: #000;
	}
	&amp;amp; .react-datepicker__day--in-range:hover {
		border: 1px solid #00ce7c !important;
		background: #fff !important;
		color: #000 !important;
		border-radius: 50% !important;
	}
	&amp;amp; .react-datepicker__day--in-selecting-range:hover,
	.react-datepicker__day--in-selecting-range {
		background: rgba(213, 255, 238, 0.5) !important;
		color: #000 !important;
	}
	&amp;amp;.react-datepicker__day:hover {
		background: rgba(213, 255, 238, 0.5) !important;
		color: #000 !important;
	}
	&amp;amp; .react-datepicker__day--keyboard-selected:hover {
		background: var(--color-green) !important;
		color: #fff;
	}
	&amp;amp; .react-datepicker__day--keyboard-selected {
		background: #00ce7c !important;
		color: #fff !important;
		border-radius: 50% !important;
	}
`;
const HeaderDateBox = styled.div`
	display: flex;
	padding: 0 16px;
	box-sizing: border-box;
	width: 100%;
	align-items: center;
	justify-content: space-between;
	padding-bottom: 23px;
`;
const DateTitle = styled.div`
	font-weight: 500;
	font-size: 22px;
	line-height: 26px;
	letter-spacing: 0.02em;
	width: 100px;
	height: 26px;
	color: #000000;
`;
const BtnBox = styled.div`
	width: 48px;
	height: 24px;
	display: flex;
	&amp;amp; &amp;gt; button {
		width: 24px;
		height: 24px;
		display: flex;
		align-items: center;
		justify-content: end;
	}
`;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부 또 공부닷!&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/157</guid>
      <comments>https://ryurim.tistory.com/entry/datepicker-style-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%86%A0%EC%9A%94%EC%9D%BC-%EC%9D%BC%EC%9A%94%EC%9D%BC-%EC%83%89-%EB%B0%94%EA%BE%B8%EA%B8%B0#entry157comment</comments>
      <pubDate>Sat, 8 Oct 2022 23:33:17 +0900</pubDate>
    </item>
    <item>
      <title>[safari] NaN 에러</title>
      <link>https://ryurim.tistory.com/entry/safari-NaN-%EC%97%90%EB%9F%AC</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_IMG_5839.PNG&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM9nih/btrKIrSLaQB/GVdClLkgVMqMWziR0rGSI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM9nih/btrKIrSLaQB/GVdClLkgVMqMWziR0rGSI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM9nih/btrKIrSLaQB/GVdClLkgVMqMWziR0rGSI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM9nih%2FbtrKIrSLaQB%2FGVdClLkgVMqMWziR0rGSI0%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;1170&quot; height=&quot;2264&quot; data-filename=&quot;edited_IMG_5839.PNG&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 , 크롬에서는 괜찮은데 ... 날짜가 나오지 않고&amp;nbsp; ...NaN이 나오는 에러를 보았다..&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;new Date() &amp;lt;=안에 2022-03-11 이런 &quot;-&quot;형식의 날짜는 .. 사파리에서 인식을 못해 저런 에러를 뱉어낸다는 사실을 알아냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑똑한 구글은 저것도 날짜로 인식하는데 ㅠㅠ바보같은 사파리 .. &quot;/&quot; 이런 형태로 바꿔줘야 되었다..!&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;2022/03/11이런식의 날짜만 new Date()이 메소드에 들어갈 수 있었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 내가 선택한 것은 str.replace였다 !!!&lt;/p&gt;
&lt;pre id=&quot;code_1661598136254&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	const regexFor = /-/gi;
	const startDate = startAt.replace(regexFor, '/');
	const endDate = endAt.replace(regexFor, '/');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규식을 활용해 &quot;-&quot;가 들어간 모든 문자를 &quot;/&quot;로 대체해주겠다는 코드다 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 쉬웠던 것을 ..몇시간째....삽질만 한듯 ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부를 더 해야겠다 ..!&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/156</guid>
      <comments>https://ryurim.tistory.com/entry/safari-NaN-%EC%97%90%EB%9F%AC#entry156comment</comments>
      <pubDate>Sat, 27 Aug 2022 20:03:15 +0900</pubDate>
    </item>
    <item>
      <title>Warning: Each child in a list should have a unique &amp;quot;key&amp;quot; prop</title>
      <link>https://ryurim.tistory.com/entry/Warning-Each-child-in-a-list-should-have-a-unique-key-prop</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 TIL작성이다 ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 ..나태했던 나 자신을 돌아보며 이제 다시 꾸준히 TIL쓰기다 !!&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;우선 map돌리면 key값을 넣어주는 건 알고있었는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key값을 넣었는데도 자꾸 저 에러가 떠서 ...스트레스 받던 찰나..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-22 오후 8.52.45.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1oHWp/btrKhSRSzU9/AVvaXAFJ43z0f3P7Ukf2Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1oHWp/btrKhSRSzU9/AVvaXAFJ43z0f3P7Ukf2Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1oHWp/btrKhSRSzU9/AVvaXAFJ43z0f3P7Ukf2Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1oHWp%2FbtrKhSRSzU9%2FAVvaXAFJ43z0f3P7Ukf2Sk%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;970&quot; height=&quot;322&quot; data-filename=&quot;스크린샷 2022-08-22 오후 8.52.45.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;322&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;CommentList에 key넣어줬자나 !!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세히..보아야 된다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1661169330206&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	return (
		&amp;lt;&amp;gt;
			{data?.length &amp;gt; 0 ? (
				data?.map((v, idx) =&amp;gt; {
					return (
						&amp;lt;&amp;gt;
							{index ? (
								&amp;lt;Comment
									data={v}
									key={v.id}
									start={props.startDate}
									end={props.endDate}
									curPage={props.curPage}
									length={data?.length}
								/&amp;gt;
							) : (
								&amp;lt;div className='comment_content_wrap' key={v.memberKey}&amp;gt;
									&amp;lt;OtherComment data={v} /&amp;gt;
								&amp;lt;/div&amp;gt;
							)}
						&amp;lt;&amp;gt;
					);
				})
			) : (
				&amp;lt;NoData text='작성된 코멘트가 없습니다.' /&amp;gt;
			)}
		&amp;lt;/&amp;gt;
	);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 감싸준 빈태그에..key값을 넣어야되었던 것이었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;gt; &amp;lt;/&amp;gt;는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;React.Fragment&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;idx&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;와 같다!&lt;/span&gt;&lt;/div&gt;
&lt;/div&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;pre id=&quot;code_1661169375852&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	return (
		&amp;lt;&amp;gt;
			{data?.length &amp;gt; 0 ? (
				data?.map((v, idx) =&amp;gt; {
					return (
						&amp;lt;React.Fragment key={idx}&amp;gt;
							{index ? (
								&amp;lt;Comment
									data={v}
									key={v.id}
									start={props.startDate}
									end={props.endDate}
									curPage={props.curPage}
									length={data?.length}
								/&amp;gt;
							) : (
								&amp;lt;div className='comment_content_wrap' key={v.memberKey}&amp;gt;
									&amp;lt;OtherComment data={v} /&amp;gt;
								&amp;lt;/div&amp;gt;
							)}
						&amp;lt;/React.Fragment&amp;gt;
					);
				})
			) : (
				&amp;lt;NoData text='작성된 코멘트가 없습니다.' /&amp;gt;
			)}
		&amp;lt;/&amp;gt;
	);&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/155</guid>
      <comments>https://ryurim.tistory.com/entry/Warning-Each-child-in-a-list-should-have-a-unique-key-prop#entry155comment</comments>
      <pubDate>Mon, 22 Aug 2022 20:56:53 +0900</pubDate>
    </item>
    <item>
      <title>리액트 모달창 세로 스크롤 막기</title>
      <link>https://ryurim.tistory.com/entry/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%AA%A8%EB%8B%AC%EC%B0%BD-%EC%84%B8%EB%A1%9C-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%A7%89%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ모달창을 띄웠는데 !!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴수가 ?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Jul-30-2022 22-36-02.gif&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hfw5n/btrIyYS8Cuz/pPOyP4WXKGkgm7fFMzok9K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hfw5n/btrIyYS8Cuz/pPOyP4WXKGkgm7fFMzok9K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hfw5n/btrIyYS8Cuz/pPOyP4WXKGkgm7fFMzok9K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Hfw5n/btrIyYS8Cuz/pPOyP4WXKGkgm7fFMzok9K/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;1432&quot; height=&quot;660&quot; data-filename=&quot;Jul-30-2022 22-36-02.gif&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;660&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;height 값이 3000px이어서 ..위처럼 스크롤이 되는 끔찍한 ...현상이 발생되었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀..리 ~~~~~~~~~~~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웨..웨 !!웨그러는고야 !!!&lt;/p&gt;
&lt;pre id=&quot;code_1659188370179&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useEffect, useState } from &quot;react&quot;;
import styled from &quot;styled-components&quot;;

interface SearchProModalProps {
  filterIsOpen: boolean;
  setFiterIsOpen: any;
}
const SearchProModal = (props: SearchProModalProps) =&amp;gt; {
  const { filterIsOpen, setFiterIsOpen } = props;

  const tabTitle: string[] = [&quot;서비스&quot;, &quot;지역&quot;];

  const [openTab, setOpenTab] = useState&amp;lt;number&amp;gt;(0);

  const onClickTab = (idx: number) =&amp;gt; {
    setOpenTab(idx);
  };

  const ModalClose = () =&amp;gt; {
    setFiterIsOpen(!filterIsOpen);
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;BackDrop onClick={ModalClose} /&amp;gt;
      &amp;lt;ModalOutter&amp;gt;
        &amp;lt;ModalSearchBox&amp;gt;
          &amp;lt;FilterTitle&amp;gt;
            {tabTitle.map((title, idx) =&amp;gt; {
              return (
                &amp;lt;FilterLi
                  key={idx}
                  idx={idx}
                  openTab={openTab}
                  onClick={() =&amp;gt; {
                    onClickTab(idx);
                  }}
                &amp;gt;
                  {title}
                &amp;lt;/FilterLi&amp;gt;
              );
            })}
          &amp;lt;/FilterTitle&amp;gt;
          &amp;lt;button onClick={ModalClose} /&amp;gt;
        &amp;lt;/ModalSearchBox&amp;gt;
      &amp;lt;/ModalOutter&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default SearchProModal;

const BackDrop = styled.div`
  width: 100%;
  height: 100vh;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 999;
  background: rgba(0, 0, 0, 0.5);
`;

const ModalOutter = styled.div`
  width: 420px;
  height: 42.5rem;
  overflow-y: scroll;
  background: #fff;
  position: absolute;
  top: 8px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 9999;
`;
const ModalSearchBox = styled.div`
  width: 100%;
  height: 60px;
  padding: 10px 16px;
  display: flex;
  justify-content: space-between;
  align-items: center;

  &amp;amp; &amp;gt; button {
    width: 14px;
    height: 14px;
    background: url(&quot;data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAxOCAxOCI+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iYSIgZD0iTTkgNy44NjlMMTYuNDM0LjQzNGwxLjEzMiAxLjEzMkwxMC4xMyA5bDcuNDM1IDcuNDM0LTEuMTMyIDEuMTMyTDkgMTAuMTNsLTcuNDM0IDcuNDM1LTEuMTMyLTEuMTMyTDcuODcgOSAuNDM0IDEuNTY2IDEuNTY2LjQzNCA5IDcuODd6Ii8+CiAgICA8L2RlZnM+CiAgICA8dXNlIGZpbGw9IiMzMjMyMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgeGxpbms6aHJlZj0iI2EiLz4KPC9zdmc+Cg==&quot;)
      center;
  }
`;

const FilterTitle = styled.ul`
  width: 96px;
  height: 40px;
  font-size: 1rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-weight: 500;
`;
interface LiType {
  idx: number;
  openTab: number;
}
const FilterLi = styled.li&amp;lt;LiType&amp;gt;`
  height: 40px;
  padding: 0 2px;
  line-height: 40px;
  cursor: pointer;
  color: ${({ openTab, idx }) =&amp;gt; (idx === openTab ? &quot;#00c7ae&quot; : &quot;#323232&quot;)};
  border-bottom: ${({ openTab, idx }) =&amp;gt;
    idx === openTab ? `2px solid #00c7ae` : &quot;none&quot;};
`;&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;BackDrop에 .. overflow:hidden을 주어도 아무런 변화가 일어나지 않았다고 한다.  &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;pre id=&quot;code_1659188441942&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; useEffect(() =&amp;gt; {
    document.body.style.cssText = `
      position: fixed; 
      top: -${window.scrollY}px;
      overflow-y: scroll;
      width: 100%;`;
    return () =&amp;gt; {
      const scrollY = document.body.style.top;
      document.body.style.cssText = &quot;&quot;;
      window.scrollTo(0, parseInt(scrollY || &quot;0&quot;, 10) * -1);
    };
  }, []);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드만 넣어주면 해결된다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결된 모달창의 모습&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Jul-30-2022 22-36-51.gif&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8levU/btrICZXPwCn/ZbrbVb9MgKsHCAWK4J5kU1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8levU/btrICZXPwCn/ZbrbVb9MgKsHCAWK4J5kU1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8levU/btrICZXPwCn/ZbrbVb9MgKsHCAWK4J5kU1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b8levU/btrICZXPwCn/ZbrbVb9MgKsHCAWK4J5kU1/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;1438&quot; height=&quot;676&quot; data-filename=&quot;Jul-30-2022 22-36-51.gif&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나이스 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 오늘의 집 클론코딩에서 숨고 클론코딩으로 바뀌었고,,&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;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/154</guid>
      <comments>https://ryurim.tistory.com/entry/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%AA%A8%EB%8B%AC%EC%B0%BD-%EC%84%B8%EB%A1%9C-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%A7%89%EA%B8%B0#entry154comment</comments>
      <pubDate>Sat, 30 Jul 2022 22:42:39 +0900</pubDate>
    </item>
    <item>
      <title>xxx 타입스크립트(Element형식에 checked 속성이 없습니다. )</title>
      <link>https://ryurim.tistory.com/entry/xxx-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Element%ED%98%95%EC%8B%9D%EC%97%90-checked-%EC%86%8D%EC%84%B1%EC%9D%B4-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ㅎㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-28 오후 3.37.51.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnzfG/btrIsegX5JA/ISMRN7BLjO4C26XghnLxC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnzfG/btrIsegX5JA/ISMRN7BLjO4C26XghnLxC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnzfG/btrIsegX5JA/ISMRN7BLjO4C26XghnLxC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnzfG%2FbtrIsegX5JA%2FISMRN7BLjO4C26XghnLxC1%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;496&quot; height=&quot;245&quot; data-filename=&quot;스크린샷 2022-07-28 오후 3.37.51.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Element형식에 checked 속성이 없습니다. ^^ ;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;js파일을 tsx파일로 변환한 후 겪은 에러 메세지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결법은 간단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허나 나능 잘 모르기에 ㅠㅠ당황했당..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 코드&lt;/p&gt;
&lt;pre id=&quot;code_1659015689900&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  if (count === 3) {
        return (document.querySelector(
          &quot;.agree_check_wrap input[name='agree_all']&quot;,
        ).checked = true);
      }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결한 코드&lt;/p&gt;
&lt;pre id=&quot;code_1659015720581&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; const agreeAll = document.querySelector(
      &quot;.agree_check_wrap input[name='agree_all']&quot;,
    ) as HTMLInputElement | null;
    
 if (count === 3) {
        return (agreeAll.checked = true);
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트야 ..친해지자..ㅎ&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/153</guid>
      <comments>https://ryurim.tistory.com/entry/xxx-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Element%ED%98%95%EC%8B%9D%EC%97%90-checked-%EC%86%8D%EC%84%B1%EC%9D%B4-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4#entry153comment</comments>
      <pubDate>Thu, 28 Jul 2022 22:43:29 +0900</pubDate>
    </item>
    <item>
      <title>스택과 큐</title>
      <link>https://ryurim.tistory.com/entry/%EC%8A%A4%ED%83%9D%EA%B3%BC-%ED%81%90</link>
      <description>&lt;pre class=&quot;excel&quot; data-stringify-type=&quot;pre&quot;&gt;&lt;code&gt;let stack = [];
stack.push('1');
stack.push('2');
stack.push('3');

console.log(stack.pop()); // 3
console.log(stack.pop()); // 2
console.log(stack.pop()); // 1

Stack
1. stack 사이즈를 알 수 있는 function
=&amp;gt; return stack.length();
2. stack이 공백인지 알 수 있는 것
=&amp;gt; return stack.length() === 0;
3. stack의 제일 마지막 index에 있는
값을 가져오는 것.(pop이랑 다르게 그 값은 
없어지지 않음)
=&amp;gt; return stack[stack.length()-1];

let queue = [];
queue.push('1');
queue.push('2');
queue.push('3');
[1, 2, 3, ''] &amp;lt;= queue[i] == queue[front], i is the frist index of an array
           &amp;lt;= queue[queue.length-1] == queue[rear]
console.log(queue.shift());
// 1,  [2, 3] &amp;lt;= queue[front] == 2, queue[rear] == 3
console.log(queue.shift());
// 2, [3] &amp;lt;= queue[front] == 3, queue[rear] == 3
console.log(queue.shift())
// 3, [] &amp;lt;= queue[front] == 'error'

1. queue의 size
=&amp;gt; return queue.rear - 1;

2. queue가 공백인지 알 수 있는 방법
=&amp;gt; return front === rear 

3. queue의 배열이 full이다.
queue의 크기는 10으로 가정했다.
그렇다면... queue 내에 값의 개수가 10개로 꽉 채워졌는지
어떻게 알 수 있을까...? (front, rear를 사용해서, %)
=&amp;gt; (rear + 1) % 10 == front

4. queue의 맨 첫번째 값을 가져오는 것
=&amp;gt; return queue[front]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/152</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%8A%A4%ED%83%9D%EA%B3%BC-%ED%81%90#entry152comment</comments>
      <pubDate>Mon, 25 Jul 2022 21:09:40 +0900</pubDate>
    </item>
    <item>
      <title>REST API(Representational State Transfer)</title>
      <link>https://ryurim.tistory.com/entry/REST-APIRepresentational-State-Transfer</link>
      <description>&lt;h1&gt;REST API(Representational State Transfer)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;  REST(Representational State Transfer)의 약자로 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다. 즉 REST란 HTTP URI를 통해 자원을 명시하고, HTTP METHOD( POST / GET / PUT / DELETE )를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CRUD Operation이란&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말로 REST에서의 CRUD Operation 동작 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;CREATE : 데이터 생성 (POST)
READ : 데이터 조회 (GET)
UPDATE : 데이터 수정 (PUT)
DELETE : 데이터 삭제 (DELETE)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST 구성&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원 (Resource) - HTTP URI&lt;/li&gt;
&lt;li&gt;자원에 대한 행위 (Verb) - HTTP METHOD&lt;/li&gt;
&lt;li&gt;자원에 대한 행위의 내용 (Representations) - HTTP Message Pay Load&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST 특징&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 - 클라이언트 구조 ( Server - Client )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트와 서버는 서로 간에 완전히 독립적이어야 합니다. 클라이언트 쪽이 알아야 하는 유일한 정보는 요청된 리소스의 URI이며, 이는 다른 방법으로 서버와 상호작용 할 수 없습니다. 즉 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;무상태 ( Stateless )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업을 위한 상태정보를 다로 저장하고 관리하지 않습니다. 세션 정보나 쿠키 정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;캐시 처리 가능 ( Cacheable )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP라는 기존 웹 표준을 그대로 사용하기 때문에 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;계층화 ( Layered System )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;REST 서버는 다중 계층으로 구성될 수 있습니다. API 서버는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화, 사용자 인증 등을 추가하여 구조상의 유연성을 줄 수 있습니다.&lt;/li&gt;
&lt;li&gt;프록시, 게이트웨어 같은 네트워크 기반의 중간 매체를 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터페이스 일관성 ( Uniform Interface )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청이 어디에서 오는지와 무관하게 동일한 리소스에 대한 모든 API요청은 동일하게 보여야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;온디맨드 코드 ( Code-on-demand )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에서 소프트웨어 프로그래밍 코드를 클라이언트에 전송하여 클라이언트 기능을 일시적으로 확장하거나 사용자 지정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST API 디자인 가이드&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI는 정보의 자원을 표현해야 합니다. (리소스명은 동사보다는 명사를, 대문자보다는 소문자를 사용합니다.)&lt;/li&gt;
&lt;li&gt;자원에 대한 행위는 HTTP METHOD로 표현합니다.&lt;/li&gt;
&lt;li&gt;마지막에 슬래시(/)를 포함하지 않습니다.&lt;/li&gt;
&lt;li&gt;언더바 대신 하이폰을 사용합니다. ( _ &amp;rArr;X / - &amp;rArr; O)&lt;/li&gt;
&lt;li&gt;파일 확장자는 URI에 포함하지 않습니다. ( photo.jpg &amp;rArr; photo )&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;GET /members/delete/1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시는 REST를 제대로 적용하지 않은 URI입니다. URI는 자원을 표현하는 데 중점을 두어야 합니다. delete와 같은 행위에 대한 표현이 들어가면 안된다는 말입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;수정한 API&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;DELETE /members/1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원정보를 가져오는 URI&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;GET /members/show/1 (x)
GET /members/1 (o)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URI (&lt;b&gt;&lt;b&gt;Uniform&amp;nbsp;Resource&amp;nbsp;Identifier&lt;/b&gt;&lt;/b&gt;)&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URI란 인터넷에 있는 자원을 나타내는 유일한 주소입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI, URL(Uniform&amp;nbsp;Resource Locator), URN(Uniform&amp;nbsp;Resource&amp;nbsp;Name)의 차이는 아래 그림 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연관된 개념인 Scheme (Protocol) , Host (Domain) , Port, Path , Query String, Search, Fragment 는 아래 그림 참고&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST API의 파라미터&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;header 파라미터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보통 인증과 권한 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;path 파라미터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔드 포인트의 일부 {estateid}에는 각각 값이 들어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/estates/{estateid}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;query string 파라미터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔드 포인트에서 물음표 뒤에 등장하는 쿼리 파라미터는 아래의 형식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;/estates?query=맛집
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; path 파라미터는 특정 리소스를 정의할 필요가 있을 때, query 파라미터는 정렬 혹은 필터링이 필요할 때 사용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 메소드&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 메소드 ( 5가지 )&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;GET : 리소스 조회, URI가 가진 정보를 검색하기 위해 서버측에 요청하는 형태 &lt;br /&gt;POST : 요청 데이터 처리, 주로 데이터 등록에 사용&lt;br /&gt;PUT : 리소스를 대체, 해당 리소스가 없으면 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PATCH : 리소스를 일부만 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE : 리소스 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 메소드 ( 4가지 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HEAD : GET과 동일하지만 메시지 부분을 제외하고 상태 줄과 헤더만 반환, 웹 서버에서 헤더 정보 이외에는 어떤 데이터도 보내지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OPTIONS : 대상 리소스에 대한 통신 가능 옵션을 설명 (주로 CORS 에서 사용) 지원되는 메소드 종류를 확인 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정, 웹 서버에 프락시 기능을 요청할 때 사용됨&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;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 응답 코드 종류&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1XX : 정보전달: 요청을 받았고, 작업을 진행 중이라는 의미입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2XX : 성공 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3XX : 리다이렉션 : 이 요청을 완료하기 위해서는 리다이렉션이 이루어져야 한다는 의미입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4XX : 클라이언트 오류 (이 요청은 올바르지 않라는 의미입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5XX : 서버가 응답할 수 없다는 의미이며, 요청이 올바른지의 여부는 알 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/151</guid>
      <comments>https://ryurim.tistory.com/entry/REST-APIRepresentational-State-Transfer#entry151comment</comments>
      <pubDate>Thu, 21 Jul 2022 22:18:57 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 Array 고차함수 정리 2(sort / some/  every /find /findIndex)</title>
      <link>https://ryurim.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Array-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC-2sort-some-%08every-find-findIndex</link>
      <description>&lt;h1&gt; &amp;zwj;  1. Array.prototype.sort()&lt;/h1&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;&quot;&gt;배열의 요소를 적절하게 정렬한다. 원본 배열을 직접 변경하며 정렬된 배열을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 정렬 순서는 문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://d2.naver.com/helloworld/19187&quot;&gt;Unicode&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;코드 포인트 순서에 따른다. 배열의 요소가 숫자 타입이라 할지라도 배열의 요소를 일시적으로 문자열로 변환한 후, 정렬한다.&lt;/p&gt;
&lt;pre id=&quot;code_1657082351231&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//문자열
const fruits = ['Banana', 'Orange', 'Apple'];

// ascending(오름차순)
fruits.sort();
console.log(fruits); // [ 'Apple', 'Banana', 'Orange' ]

// descending(내림차순)
fruits.reverse();
console.log(fruits); // [ 'Orange', 'Banana', 'Apple' ]

//숫자
const points = [40, 100, 1, 5, 2, 25, 10];

points.sort();
console.log(points); // [ 1, 10, 100, 2, 25, 40, 5 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 문자열 &amp;lsquo;1&amp;rsquo;의 Unicode 코드 포인트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;U+0031, 문자열 &amp;lsquo;2&amp;rsquo;의 Unicode 코드 포인트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;U+0032이다. 따라서 문자열 &amp;lsquo;1&amp;rsquo;의 Unicode 코드 포인트 순서가 문자열 &amp;lsquo;2&amp;rsquo;의 Unicode 코드 포인트 순서보다 앞서므로 문자열 &amp;lsquo;1&amp;rsquo;과 &amp;lsquo;2&amp;rsquo;를 sort 메소드로 정렬하면 1이 2보다 앞으로 정렬된다. 하지만 10의 Unicode 코드 포인트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;U+0031U+0030이므로 2와 10를 sort 메소드로 정렬하면 10이 2보다 앞으로 정렬된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 경우, sort 메소드의 인자로 정렬 순서를 정의하는 비교 함수를 인수로 전달한다. 비교 함수를 생략하면 배열의 각 요소는 일시적으로 문자열로 변환되어 Unicode 코드 포인트 순서에 따라 정렬된다.&lt;/p&gt;
&lt;pre id=&quot;code_1657082462977&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const points = [40, 100, 1, 5, 2, 25, 10];

// 숫자 배열 오름차순 정렬
// 비교 함수의 반환값이 0보다 작은 경우, a를 우선하여 정렬한다.
// points.sort(function (a, b) { return a - b; });
// ES6 화살표 함수
points.sort((a, b) =&amp;gt; a - b);
console.log(points); // [ 1, 2, 5, 10, 25, 40, 100 ]

// 숫자 배열 내림차순 정렬
// 비교 함수의 반환값이 0보다 큰 경우, b를 우선하여 정렬한다.
// points.sort(function (a, b) { return b - a; });
// ES6 화살표 함수
 points.sort((a, b) =&amp;gt; b - a);
console.log(points); // [ 100, 40, 25, 10, 5, 2, 1 ]

// 숫자 배열에서 최대값 취득
console.log(points[0]); // 100&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;6-arrayprototypesomecallback-value-t-index-number-array-array--boolean-thisarg-any-boolean--es5&quot;&gt; &amp;zwj;  2. Array.prototype.some()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 내 일부 요소가 콜백 함수의 테스트를 통과하는지 확인하여 그 결과를 boolean으로 반환한다. IE 9 이상에서 정상 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백함수의 매개변수를 통해 배열 요소의 값, 요소 인덱스, 메소드를 호출한 배열, 즉 this를 전달 받을 수 있다. 원본배열은 변경하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1657082598325&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열 내 요소 중 10보다 큰 값이 1개 이상 존재하는지 확인
let res = [2, 5, 8, 1, 4].some(function (item) {
  return item &amp;gt; 10;
});
console.log(res); // false

res = [12, 5, 8, 1, 4].some(function (item) {
  return item &amp;gt; 10;
});
console.log(res); // true

// 배열 내 요소 중 특정 값이 1개 이상 존재하는지 확인
res = ['apple', 'banana', 'mango'].some(function (item) {
  return item === 'banana';
});
console.log(res); // true&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;7-arrayprototypeeverycallback-value-t-index-number-array-array--boolean-thisarg-any-boolean--es5&quot;&gt; &amp;zwj;  3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Array.prototype.every()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 내 모든 요소가 콜백함수의 테스트를 통과하는지 확인하여 그 결과를 boolean으로 반환한다. IE 9 이상에서 정상 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백함수의 매개변수를 통해 배열 요소의 값, 요소 인덱스, 메소드를 호출한 배열, 즉 this를 전달 받을 수 있다. 원본배열은 변경하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1657082733655&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열 내 모든 요소가 10보다 큰 값인지 확인
let res = [21, 15, 89, 1, 44].every(function (item) {
  return item &amp;gt; 10;
});
console.log(res); // false

res = [21, 15, 89, 100, 44].every(function (item) {
  return item &amp;gt; 10;
});
console.log(res); // true&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;7-arrayprototypeeverycallback-value-t-index-number-array-array--boolean-thisarg-any-boolean--es5&quot;&gt; &amp;zwj;  4. Array.prototype.find()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6에서 새롭게 도입된 메소드로 Internet Explorer에서는 지원하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 순회하며 각 요소에 대하여 인자로 주어진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;콜백함수를 실행하여 그 결과가 참인 첫번째 요소를 반환한다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;콜백함수의 실행 결과가 참인 요소가 존재하지 않는다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;undefined를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백함수의 매개변수를 통해 배열 요소의 값, 요소 인덱스, 메소드를 호출한 배열, 즉 this를 전달 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 filter는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;콜백함수의 실행 결과가 true인 배열 요소의 값만을 추출한 새로운 배열을 반환한다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;따라서 filter의 반환값은 언제나 배열이다. 하지만 find는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;콜백함수를 실행하여 그 결과가 참인 첫번째 요소를 반환&lt;/b&gt;하므로 find의 결과값은 해당 요소값이다. 원본 배열은 변경하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1657083013985&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = [
  { id: 1, name: 'Lee' },
  { id: 2, name: 'Kim' },
  { id: 2, name: 'Choi' },
  { id: 3, name: 'Park' }
];

// 콜백함수를 실행하여 그 결과가 참인 첫번째 요소를 반환한다.
let result = users.find(function (item) {
  return item.id === 2;
});

// ES6
// const result = users.find(item =&amp;gt; item.id === 2;);

// Array#find는 배열이 아니라 요소를 반환한다.
console.log(result); // { id: 2, name: 'Kim' }

// Array#filter는 콜백함수의 실행 결과가 true인 배열 요소의 값만을 추출한 새로운 배열을 반환한다.
result = users.filter(function (item) {
  return item.id === 2;
});

console.log(result); // [ { id: 2, name: 'Kim' },{ id: 2, name: 'Choi' } ]&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;7-arrayprototypeeverycallback-value-t-index-number-array-array--boolean-thisarg-any-boolean--es5&quot;&gt; &amp;zwj;  5. Array.prototype.findIndex()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6에서 새롭게 도입된 메소드로 Internet Explorer에서는 지원하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 순회하며 각 요소에 대하여 인자로 주어진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;콜백함수를 실행하여 그 결과가 참인 첫번째 요소의 인덱스를 반환한다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;콜백함수의 실행 결과가 참인 요소가 존재하지 않는다면 -1을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백함수의 매개변수를 통해 배열 요소의 값, 요소 인덱스, 메소드를 호출한 배열, 즉 this를 전달 받을 수 있다. 원본 배열은 변경하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657083086740&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = [
  { id: 1, name: 'Lee' },
  { id: 2, name: 'Kim' },
  { id: 2, name: 'Choi' },
  { id: 3, name: 'Park' }
];

// 콜백함수를 실행하여 그 결과가 참인 첫번째 요소의 인덱스를 반환한다.
function predicate(key, value) {
  return function (item) {
    return item[key] === value;
  };
}

// id가 2인 요소의 인덱스
let index = users.findIndex(predicate('id', 2));
console.log(index); // 1

// name이 'Park'인 요소의 인덱스
index = users.findIndex(predicate('name', 'Park'));
console.log(index); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://poiemaweb.com/js-array-higher-order-function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://poiemaweb.com/js-array-higher-order-function&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/147</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Array-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC-2sort-some-%08every-find-findIndex#entry147comment</comments>
      <pubDate>Wed, 6 Jul 2022 20:51:39 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 Array 고차함수 정리 1 (forEach / map/ filter /concat /reduce)</title>
      <link>https://ryurim.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Array-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC-1-forEach-map-filter-concat-reduce</link>
      <description>&lt;pre id=&quot;code_1656995806397&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;  고차 함수란 함수를 매개변수로 사용하거나 함수를 반환하는 함수입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt; &amp;zwj;  1. Array.prototype.forEach()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forEach() 메서드는 for문을 대체하는 고차 함수입니다. 반복문을 추상화하여 구현된 메서드이고 내부에서 주어진 배열을 순회하면서 연산을 수행합니다.&lt;span style=&quot;background-color: #f6e199;&quot;&gt; for문과는 다르게&amp;nbsp;break, continue를 사용할 수 없어서 배열의 모든 요소를 중단없이 순회한다는 특징을 갖고 있습니다.&lt;/span&gt; for문 보다는 성능이 좋지는 않지만 가독성이 더 좋고 함수형 프로그래밍에 부합하기 때문에 꼭 필요한 경우가 아니라면 for문을 대신하여 사용할 것이 권장됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1656996104213&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const&amp;nbsp;numberArr&amp;nbsp;=&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5];
let&amp;nbsp;total&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;
numberArr.forEach((item)&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;+=&amp;nbsp;item;
});
&amp;nbsp;
console.log(total);&amp;nbsp;//&amp;nbsp;15&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656996240327&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const items = ['item1', 'item2', 'item3'];
const copyItems = [];

// before
for (let i = 0; i &amp;lt; items.length; i++) {
  copyItems.push(items[i]);
}

// after
items.foreach((item)=&amp;gt;{
	copyItems.push(item);
})&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt; &amp;zwj;  2. Array.prototype.map()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map()&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;원본&amp;nbsp;배열은&amp;nbsp;변경되지&amp;nbsp;않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출 배열의 모든 요소에 대해 제공된 함수를 호출한 결과로 채워진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;새 배열을 만듭니다 .&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map은 배열에 속한 항목을 변환할 때 많이 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1656996581925&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array1 = [1, 4, 9, 16];

const map1 = array1.map(x =&amp;gt; x * 2);

console.log(map1);
// expected output: Array [2, 8, 18, 32]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt; &amp;zwj; &lt;span&gt; 3. &lt;/span&gt;Array.prototype.filter()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filter()&amp;nbsp;메서드는&amp;nbsp;주어진&amp;nbsp;배열을&amp;nbsp;순회하면서&amp;nbsp;콜백&amp;nbsp;함수의&amp;nbsp;반환값이&amp;nbsp;true에&amp;nbsp;해당하는&amp;nbsp;요소로만&amp;nbsp;구성된&amp;nbsp;새로운&amp;nbsp;배열을&amp;nbsp;생성하여&amp;nbsp;반환합니다.&amp;nbsp;map()&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;span style=&quot;background-color: #f6e199;&quot;&gt;filter는 어떤 조건을 만족하는 항목들만 골라서 새 배열로 만들어주는 함수&lt;/span&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 배열은 변하지 않고, 원하는 배열을 하나 더 만들 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1656997861079&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array_num = [0, 1, 2, 3, 4, 5];

const new_array = array_num.filter((array_item) =&amp;gt; {
	// 특정 조건을 만족할 때만 return 하면 됩니다!
	// return에는 true 혹은 false가 들어가야 해요.
	return array_item &amp;gt; 3;
});

console.log(new_array); //[4,5]&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt; &amp;zwj; &lt;span&gt;&lt;span&gt;&amp;nbsp; 4. &lt;/span&gt;&lt;/span&gt;Array.prototype.concat()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;concat은 배열과 배열을 합치거나 배열에 특정 값을 추가해주는 함수입니다. &lt;span data-token-index=&quot;1&quot; data-reactroot=&quot;&quot;&gt;원본 배열은 변하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656998078495&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array_num01 = [0, 1, 2, 3];
const array_num02 = [3, 4, 5];

const merge = array_num01.concat(array_num02);

// 중복 항목(숫자 3)이 제거되지 않은 채 합쳐져있습니다.
console.log(merge); //&amp;nbsp;[0, 1, 2, 3, 3, 4, 5];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;concat은 중복 항목을 제거해주지 않아요! &lt;/span&gt;다른 내장함수와 함께 사용해서 제거해야 합니다!&lt;/p&gt;
&lt;pre id=&quot;code_1656998286745&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array_num01 = [0, 1, 2, 3];
const array_num02 = [3, 4, 5];
// Set은 자바스크립트의 자료형 중 하나로, 
// 중복되지 않는 값을 가지는 리스트입니다. :)!
// ... &amp;lt;- 이 점 3개는 스프레드 문법이라고 불러요.
// 배열 안에 있는 항목들(요소들)을 전부 꺼내준다는 뜻입니다.
// 즉 [...array_num01]은 array_num01에 있는 항목을 전부 꺼내 
// 새로운 배열([] 이 껍데기가 새로운 배열을 뜻하죠!)에 넣어주겠단 말입니다!
const merge = [...new Set([...array_num01, ...array_num02])];

console.log(merge); //[0, 1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt; &amp;zwj;  5. Array.prototype.reduce()&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce()&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce() 메서드의 콜백 함수의 파라미터로는 이전 콜백 함수의 반환값, 주어진 배열의 현재 요소, 주어진 배열의 현재 인덱스, this(주어진 배열) 4개를 각각 순차적으로 전달할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;callback의 인자는 총 4개까지 가능해요.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;accumulator : 누적되는 값&lt;/li&gt;
&lt;li&gt;currentValue : 현재 값&lt;/li&gt;
&lt;li&gt;currentIndex : 현재 인덱스( initialValue가 없으면 1부터 시작해요.)&lt;/li&gt;
&lt;li&gt;Array : 원래 배열&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;return : 숫자&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657001303500&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const sum = [1, 2, 3, 4, 5].reduce(function (pre, cur) {
  return pre + cur;
}, 5);

console.log(sum); // 20
// 5 + 1 =&amp;gt; 6 + 2 =&amp;gt; 8 + 3 =&amp;gt; 11 + 4 =&amp;gt; 15 + 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;초기값을 전달하면 에러를 회피할 수 있습니다. 따라서 reduce를 호출할 때는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;언제나 초기값을 전달하는 것이 보다 안전합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce가 제일 어려운 고차함수인 것 같다 ㅠㅠ 많ㅎ이 쓰면서 익히는..수밖에..&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://freestrokes.tistory.com/115&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://freestrokes.tistory.com/115&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/js-array-higher-order-function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://poiemaweb.com/js-array-higher-order-function&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jhy979/Javascript-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@jhy979/Javascript-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/146</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Array-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC-1-forEach-map-filter-concat-reduce#entry146comment</comments>
      <pubDate>Tue, 5 Jul 2022 15:13:06 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스/자바스크립트] 체육복</title>
      <link>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B2%B4%EC%9C%A1%EB%B3%B5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 설명&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
제한사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 학생의 수는 2명 이상 30명 이하입니다.&lt;/li&gt;
&lt;li&gt;체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.&lt;/li&gt;
&lt;li&gt;여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.&lt;/li&gt;
&lt;li&gt;여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.&lt;/li&gt;
&lt;li&gt;여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
입출력 예nlostreservereturn
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;[2, 4]&lt;/td&gt;
&lt;td&gt;[1, 3, 5]&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;[2, 4]&lt;/td&gt;
&lt;td&gt;[3]&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;[3]&lt;/td&gt;
&lt;td&gt;[1]&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 #1&lt;br /&gt;1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 #2&lt;br /&gt;3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://hsin.hr/coci/archive/2009_2010/contest6_tasks.pdf&quot;&gt;출처&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 공지 - 2019년 2월 18일 지문이 리뉴얼되었습니다.&lt;br /&gt;※ 공지 - 2019년 2월 27일, 28일 테스트케이스가 추가되었습니다.&lt;br /&gt;※ 공지 - 2021년 7월 28일 테스트케이스가 추가되었습니다.&lt;br /&gt;※ 공지 - 2021년 8월 30일 테스트케이스가 추가되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이&lt;/p&gt;
&lt;pre id=&quot;code_1656942810433&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution =(n,lost,reserve)=&amp;gt;{
    let answer =0; //전체 학생 수 - 옷을 빌리지 못한 학생 수
   
    const noReserve = lost.sort((a,b)=&amp;gt; a-b).filter((v)=&amp;gt;!reserve.includes(v));
    //여벌의 옷이 없는 사람
    let hasReserve =reserve.sort((a,b)=&amp;gt;a-b).filter((v)=&amp;gt;!lost.includes(v));
    //여벌의 옷이 있는 사람


    //옷을 빌리지 못한 학생 수
    const finalStudent = noReserve.filter((l)=&amp;gt;{ //체육복을 도난당했으면서 여벌이 없는 학생 배열을 돌면서
        //체육복을 안도난당했고 여벌이 있는 사람들 중에 번호 차이가 1인 학생 번호를 찾는다. 
        const extraClothes = hasReserve.find((r)=&amp;gt; Math.abs(r-l)===1);
        if(!extraClothes) return lost;
        hasReserve = hasReserve.filter(r =&amp;gt; r !==extraClothes); //여벌의 옷이 있는 학생이 옷을 빌려준 학생이면 제거시킨다.
    });
    answer = n - finalStudent.length;
    return answer;
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**Math.abs()**함수는 주어진 숫자의 절대값을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;find()&lt;/b&gt;&amp;nbsp;메서드는 주어진 판별 함수를 만족하는&amp;nbsp;&lt;b&gt;첫 번째 요소&lt;/b&gt;의&amp;nbsp;&lt;b&gt;값&lt;/b&gt;을&amp;nbsp;반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filter는 참 같은 값(Truthy)만 반환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거짓같은 값 &amp;rArr; 예:&amp;nbsp;false,&amp;nbsp;0,&amp;nbsp;-0,&amp;nbsp;0n,&amp;nbsp;&quot;&quot;,&amp;nbsp;null,&amp;nbsp;undefined와&amp;nbsp;NaN&amp;nbsp;등 빼고 다 Truthy한 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lost 와 reserve 배열이 오름차순으로 주어지지 않을 케이스가 있기 때문에, sort 메서드로 오름차순 시켜줘야함.&lt;/p&gt;</description>
      <category>알고리즘 문제 풀이/프로그래머스</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/145</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B2%B4%EC%9C%A1%EB%B3%B5#entry145comment</comments>
      <pubDate>Mon, 4 Jul 2022 22:55:01 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스/자바스크립트] 실패율</title>
      <link>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%8C%A8%EC%9C%A8</link>
      <description>&lt;div data-challengeable-id=&quot;2470&quot; data-challengeable-type=&quot;algorithm&quot; data-algorithm-type=&quot;standard&quot; data-language=&quot;javascript&quot; data-user-id=&quot;417273&quot; data-interface-type=&quot;function&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;tour2&quot;&gt;
&lt;div&gt;문제 설명
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실패율&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0z6K1/btrGbueOaC5/jMok2NvlEczE5g2dcPZOAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0z6K1/btrGbueOaC5/jMok2NvlEczE5g2dcPZOAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0z6K1/btrGbueOaC5/jMok2NvlEczE5g2dcPZOAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0z6K1%2FbtrGbueOaC5%2FjMok2NvlEczE5g2dcPZOAk%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;350&quot; height=&quot;350&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실패율은 다음과 같이 정의한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.&lt;/p&gt;
제한사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지의 개수 N은&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;이상&lt;span&gt;&amp;nbsp;&lt;/span&gt;500&lt;span&gt;&amp;nbsp;&lt;/span&gt;이하의 자연수이다.&lt;/li&gt;
&lt;li&gt;stages의 길이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;이상&lt;span&gt;&amp;nbsp;&lt;/span&gt;200,000&lt;span&gt;&amp;nbsp;&lt;/span&gt;이하이다.&lt;/li&gt;
&lt;li&gt;stages에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;이상&lt;span&gt;&amp;nbsp;&lt;/span&gt;N + 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;이하의 자연수가 담겨있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.&lt;/li&gt;
&lt;li&gt;단,&lt;span&gt;&amp;nbsp;&lt;/span&gt;N + 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.&lt;/li&gt;
&lt;li&gt;스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은&lt;span&gt;&amp;nbsp;&lt;/span&gt;0&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 정의한다.&lt;/li&gt;
&lt;/ul&gt;
입출력 예Nstagesresult
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;[2, 1, 2, 6, 2, 4, 3, 3]&lt;/td&gt;
&lt;td&gt;[3,4,2,1,5]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;[4,4,4,4,4]&lt;/td&gt;
&lt;td&gt;[4,1,2,3]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #1&lt;br /&gt;1번 스테이지에는 총 8명의 사용자가 도전했으며, 이 중 1명의 사용자가 아직 클리어하지 못했다. 따라서 1번 스테이지의 실패율은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 번 스테이지 실패율 : 1/8&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 스테이지에는 총 7명의 사용자가 도전했으며, 이 중 3명의 사용자가 아직 클리어하지 못했다. 따라서 2번 스테이지의 실패율은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2 번 스테이지 실패율 : 3/7&lt;/li&gt;
&lt;/ul&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;3 번 스테이지 실패율 : 2/4&lt;/li&gt;
&lt;li&gt;4번 스테이지 실패율 : 1/2&lt;/li&gt;
&lt;li&gt;5번 스테이지 실패율 : 0/1&lt;/li&gt;
&lt;/ul&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;[3,4,2,1,5]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[4,1,2,3]&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1656588264363&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution(N, stages) {
    let answer = [];
    for(let i=1; i&amp;lt;=N; i++){
        ////Array.filter() : 조건을 만족하는 원소만 추출
        const stage = stages.filter((v)=&amp;gt; v &amp;gt;= i).length;
        const current =stages.filter((v)=&amp;gt; v===i).length;
        answer.push([i,current/stage]);
    };
    //answer의 2번째 원소기준으로 내림차순으로 정렬
    answer.sort((a,b)=&amp;gt;b[1]-a[1]);
    //Array.map() : 배열을 조건에 맞게 변환
    return answer.map((x)=&amp;gt;x[0]);
};
const N=5;
const stages=[2, 1, 2, 6, 2, 4, 3, 3];
console.log(solution(N,stages))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꾸준히 날마다 풀다보면 ㅠㅠ나도 문득 로직이 떠오르겠지 ? ㅠㅠ무한반복이다 ~!&lt;/p&gt;</description>
      <category>알고리즘 문제 풀이/프로그래머스</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/144</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%8C%A8%EC%9C%A8#entry144comment</comments>
      <pubDate>Thu, 30 Jun 2022 20:24:59 +0900</pubDate>
    </item>
    <item>
      <title>22.06.28 TIL NEXT.js + typescript: 초기세팅 (오늘의집 클론코딩 초기세팅)</title>
      <link>https://ryurim.tistory.com/entry/220628-TIL-NEXTjs-typescript-%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;next js 의 장점&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;검색앤진최적화(Search engine Optimization, SEO)&lt;/li&gt;
&lt;li&gt;빠른 첫페이지 로딩 &amp;amp; 새로고침시 화면 번쩍임 X&lt;/li&gt;
&lt;li&gt;pages폴더는 라우터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;next로 앱 설치&lt;/p&gt;
&lt;pre id=&quot;code_1656399968149&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn create next-app --typescript

or
npx create-next-app --typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create-react-app은 뒤에 파일명을 붙여줘야 되지만, next로 만들게 되면 이건 따로 안해줘도 된다 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 만들면서 이름 뭐로 할건지 물어보기 때문 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-28 오후 4.06.50.png&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTZ3ki/btrFYxqdBOQ/QiiMcVBJBfGbwLg3DC3W01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTZ3ki/btrFYxqdBOQ/QiiMcVBJBfGbwLg3DC3W01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTZ3ki/btrFYxqdBOQ/QiiMcVBJBfGbwLg3DC3W01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTZ3ki%2FbtrFYxqdBOQ%2FQiiMcVBJBfGbwLg3DC3W01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;580&quot; data-filename=&quot;스크린샷 2022-06-28 오후 4.06.50.png&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 파일들이 생겼다 ! 와우 신기 !&lt;/p&gt;
&lt;pre id=&quot;code_1656400117181&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add next react react-dom&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656400326047&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn start가 아닌 yarn dev로 localhost:3000을 실행시킬 수 있당..&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_1656400788334&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add --dev typescript @types/react @types/node&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 pages 안에 있는 _app.tsx는 아래와 같이 설정해주고,&lt;/p&gt;
&lt;pre id=&quot;code_1656400976000&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import '../styles/globals.css'
import type { AppProps } from 'next/app'

function MyApp({ Component, pageProps }: AppProps) {
  return &amp;lt;Component {...pageProps} /&amp;gt;
}

export default MyApp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1656400998867&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from &quot;react&quot;;
import Head from &quot;next/head&quot;;

export default function Home() {
  const [text, setText] = useState&amp;lt;string&amp;gt;(&quot;자바스크립트&quot;);

  setTimeout(() =&amp;gt; {
    setText(&quot;타입스크립트&quot;);
  }, 1000);

  return (
    &amp;lt;div className=&quot;container&quot;&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;span&amp;gt;{text} 적용 완료&amp;lt;/span&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 타입스크립트 적용 완료이다 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 오늘의집 클론코딩하며 ㅎㅎ열공빡공이다 !!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-28 오후 4.23.49.png&quot; data-origin-width=&quot;2866&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAOiZT/btrFUTBiHFx/PBRCCHUHKiiOJvQOegk9i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAOiZT/btrFUTBiHFx/PBRCCHUHKiiOJvQOegk9i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAOiZT/btrFUTBiHFx/PBRCCHUHKiiOJvQOegk9i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAOiZT%2FbtrFUTBiHFx%2FPBRCCHUHKiiOJvQOegk9i1%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;2866&quot; height=&quot;1034&quot; data-filename=&quot;스크린샷 2022-06-28 오후 4.23.49.png&quot; data-origin-width=&quot;2866&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의집 클론코딩..회의 사항..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용스택 : redux-toolkit / react-query / styled-components / typescript / next.js&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리덕스 툴킷 사용을 위해 패키지 설치&lt;/p&gt;
&lt;pre id=&quot;code_1656416444012&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add react-redux @types/react-redux @reduxjs/toolkit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타일드 컴포넌트 패키지 설치&lt;/p&gt;
&lt;pre id=&quot;code_1656416700306&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add styled-components @types/styled-components&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 쿼리 패키지 설치&lt;/p&gt;
&lt;pre id=&quot;code_1656416731856&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add react-query&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;h3 data-ke-size=&quot;size23&quot;&gt;api&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기는 항상 사용하던 Axios를 기본으로 할것 같다.api 폴더 하위엔 Axios Instance 와 각각 api 명세를 둘 생각이다.(추가적으로 React-query는 좀 스터디가 필요해보이고 필요성이 느껴진다면 적용할 생각이다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;components (Presentation Component)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Atomic Design Pattern&lt;/b&gt;➡️ 말 그래도 작은 단위의 컴포넌트를 재사용성이 강하고, 단단하게 잘 설계함으로서 점진적으로 지속적으로 개발하기 용이하게 하는 방식이다.아토믹 디자인은 원자(Atoms), 분자(Molecules), 유기체(Organisms), 템플릿(Templates), 페이지(Pages)로 효과적인 인터페이스 시스템을 만든다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  Atom(원자)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#Generic #Abstract&lt;/li&gt;
&lt;li&gt;원자은 진짜 말그대로 가장 작은 단위의 컴포넌트이다.&lt;/li&gt;
&lt;li&gt;원자는 어떠한 context가 주어지든지 이에 해당하는 컴포넌트가 생성될 수 있어야 한다.&lt;/li&gt;
&lt;li&gt;때문에 다양한 state를 다양하게 가지고 있어야하며 추상적이지만 최대한 포용할 수 있게 되어야 설계 되어야 한다. Ex) button: disabled, hover, different sizes, etc.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원자는 마진이나 위치값을 가지고 있지 않는다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  Molecule(분자)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#LittleComplex&lt;/li&gt;
&lt;li&gt;원자를 엮어 조금 복잡한 단위의 분자가 생성된다.&lt;/li&gt;
&lt;li&gt;분자는 분자만의 프로퍼티를 가지고 있을 수 있고 이를 활용해 원자에 기능을 만들어 줄 수도 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분자가 원자의 위치값을 지정하기도 한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  Organism(유기체)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#MoreComplex&lt;/li&gt;
&lt;li&gt;유기체는 분자를 엮어 만들어서 생성되고&amp;nbsp;&lt;b&gt;때로는 분자가 되지 않은 원자가 엮이기도 한다&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;유기체가 완성되면 컴포넌트가 최종 모습을 가지게 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하지만 여전히 contents에 따라 최대한 재사용성 높게 개발하는 것이 중요하다!&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유기체는 분자와 원자의 위치값을 조정한다!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  Template(템플릿)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#Layout #NoStyling&lt;/li&gt;
&lt;li&gt;템플릿은 만들어진 유기체와 컴포넌트의&amp;nbsp;&lt;b&gt;positions, placements&lt;/b&gt;을 정해주는 역할을 한다.&lt;/li&gt;
&lt;li&gt;단, 템플릿에는 Styling이나 Color는 들어가지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;템플릿의 역할은 페이지의 그리드를 정해주는 역할 뿐이다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  Page(페이지)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#Final&lt;/li&gt;
&lt;li&gt;페이지는 템플릿을 이용해서 각 그리드에 컴포넌트를 그려서 디스플레이한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Atomic Design 에서는 5개의 구분된 단계가 존재합니다.&lt;/li&gt;
&lt;li&gt;➡️ 디자인 요소들을 나누어 파악하고 이 요소들이 조합되는 과정을 통해서 디자인을 구성하는 방식을 의미합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MVC 디자인 패턴&lt;/b&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Model: 지식, Data 관리&lt;/li&gt;
&lt;li&gt;View: 시각적 표현, 화면 렌더링 &amp;amp; UI&lt;/li&gt;
&lt;li&gt;Controller: 사용자와 시스템 간 상호작용 담당, 데이터와 비즈니스 로직 사이의 상호동작(이벤트 핸들링)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 쿼리&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;- basic: react-query의 기본 기능(fetching)을 구현한 파일들을 담고 있습니다.
- pagination:react-query로 pagination을 구현한 파일들을 담고 있습니다.[다음장에서 다루겠습니다.]
- Server: Fetcher 파일에는 api 주소를 모두 저장하고 있는 파일입니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;styles&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Global Styles 폴더 (컴포넌트 개별 css 는 각 컴포넌트 폴더에 module로 관리한다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;types&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type 관리 폴더&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;utils&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-filename=&quot;스크린샷 2022-06-28 오후 8.47.08.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;1110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oD1w4/btrF0Ze6LrH/TbiZlOa2xqi9gKKww4Ioqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oD1w4/btrF0Ze6LrH/TbiZlOa2xqi9gKKww4Ioqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oD1w4/btrF0Ze6LrH/TbiZlOa2xqi9gKKww4Ioqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoD1w4%2FbtrF0Ze6LrH%2FTbiZlOa2xqi9gKKww4Ioqk%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;322&quot; height=&quot;1110&quot; data-filename=&quot;스크린샷 2022-06-28 오후 8.47.08.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;1110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴으로 하니 마니 논의하다가 결국 ㅠㅠ더 공부하자고 .. 그래도 컴포넌트 재사용을 위한 코드를 짜기로 약속했다 !!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Today-s-House&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;오늘의집클론코딩깃헙 &lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/143</guid>
      <comments>https://ryurim.tistory.com/entry/220628-TIL-NEXTjs-typescript-%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85#entry143comment</comments>
      <pubDate>Tue, 28 Jun 2022 16:24:45 +0900</pubDate>
    </item>
    <item>
      <title>22.06.27 TIL Call Stack</title>
      <link>https://ryurim.tistory.com/entry/220627-TIL-Call-Stack</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript는 단일 스레드 단일 동시(싱글스레드) 언어입니다. 이 말은 결국 한번에 하나의 싱글 콜 스택만을 가지고 있다는 말입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, 한 번에 하나의 작업 또는 한 번에 코드 조각을 처리할 수 있습니다.&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙, 큐와 같은 다른 부분과 함께 Javascript 동시성 모델을 구성 하는 단일 호출 스택 이 있습니다(V8 내부에서 구현됨).&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;코ㄹ스택.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUBqWA/btrFUjMe8zY/YueRbXYuGpllGo3x8JqOeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUBqWA/btrFUjMe8zY/YueRbXYuGpllGo3x8JqOeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUBqWA/btrFUjMe8zY/YueRbXYuGpllGo3x8JqOeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUBqWA%2FbtrFUjMe8zY%2FYueRbXYuGpllGo3x8JqOeK%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;500&quot; height=&quot;429&quot; data-filename=&quot;코ㄹ스택.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;1. 콜스택&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 우리가 있는 프로그램에서 함수 호출을 기록하는 데이터 구조입니다. 실행할 함수를 호출하면, 스택에 무언가를 push하고 함수에서 돌아올 때 스택의 맨 위에서 pop합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Jun-27-2022 21-30-01.gif&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNFZqv/btrFShPrXkt/mJdwycgWbO6T01Uv8DQSyk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNFZqv/btrFShPrXkt/mJdwycgWbO6T01Uv8DQSyk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNFZqv/btrFShPrXkt/mJdwycgWbO6T01Uv8DQSyk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dNFZqv/btrFShPrXkt/mJdwycgWbO6T01Uv8DQSyk/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;656&quot; height=&quot;348&quot; data-filename=&quot;Jun-27-2022 21-30-01.gif&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림에서 살펴보면, 파일을 실행하면서 먼저 모든 실행이 시작될 메인 함수를 찾습니다. 위의 그림의 경우 스택으로 push되는 console.log(bar(6))에서 시작합니다.&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;그 위에 있는 다음 프레임은 인수가 있는 함수 막대이며 다시 foo함수를 호추라여 다시 push 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택의 맨 위에 있고 즉시 반환되므로 스택에서 pop됩니다. 유사하게 막대가 pop되고, 마지막으로 콘솔문이 출력을 인쇄하여 팝 아웃됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-27 오후 9.34.09.png&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doymPc/btrFUjrVIAK/dOFozaKw6El8GfZAjhU4m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doymPc/btrFUjrVIAK/dOFozaKw6El8GfZAjhU4m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doymPc/btrFUjrVIAK/dOFozaKw6El8GfZAjhU4m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoymPc%2FbtrFUjrVIAK%2FdOFozaKw6El8GfZAjhU4m0%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;500&quot; height=&quot;205&quot; data-filename=&quot;스크린샷 2022-06-27 오후 9.34.09.png&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림을 통해 알 수 있는 것은 빨간색 오류 스택 추적입니다. 기본적으로 호출 스택의 현재 상태를 나타내며 함수에서 스택과 마찬가지로 위에서 아래로 실패한 위치를 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;2. 힙&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체는 메모리의 대부분 구조화되지 않은 영역인 힙에 할당됩니다. 변수와 객체에 대한 모든 메모리 할당은 여기 힙에서 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;3. 큐&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 런타임에는 처리할 메시지 목록과 실행할 관련 콜백 함수인 메시지 대기열이 포함되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택에 충분한 용량이 있으면 메시지가 대기열에서 꺼내어 관련 함수 호출로 구성되어 처리됩니다.&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;(ex) 사용자가 버튼을 클릭 =&amp;gt; 콜백기능이 제공되지 않음 =&amp;gt; 메시지가 대기열에 추가되지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;4.&amp;nbsp; 이벤트 루프&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 루프란 콜백이벤트 큐에서 하나씩 꺼내서 동작하는 루프를 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 루프 역할은 콜스택과 테스크 큐를 주시하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택이 비어있으면, 큐의 첫번째 콜백을 스택에 쌓아 효과적으로 실행할 수 있게 해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 35.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;1442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QZBPu/btrFVh1vbEk/tulrMXhhnOhESBpZB5xtJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QZBPu/btrFVh1vbEk/tulrMXhhnOhESBpZB5xtJK/img.png&quot; data-alt=&quot;자바스크립트 동작과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QZBPu/btrFVh1vbEk/tulrMXhhnOhESBpZB5xtJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQZBPu%2FbtrFVh1vbEk%2FtulrMXhhnOhESBpZB5xtJK%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;500&quot; height=&quot;557&quot; data-filename=&quot;Group 35.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;1442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자바스크립트 동작과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 싱글 스레드 기반 언어이기 때문에 한번에 하나씩 작업을 진행합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오잉 ? 자바스크립트가 사용되는 환경을 생각해보면 많은 작업이 동시에 처리되고 있음을 알 수 있습니다 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  자바스크립트 동작 과정 그림에서 각 요소의 역할은 무엇일까요 ?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 이벤트 루프를 이용하여 비동시 방식으로 동시성을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(자바스크립트 엔진에서 제공되는 것은 아니고 브라우저나 node.js에서 지원됩니다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 루프에서는 이벤트 발생시 호출되는 콜백 함수들을 테스크 큐에 전달하고 , 테스크 큐에 담겨있는 콜백 함수들을 콜스택에 넘겨줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323; background-color: #dddddd;&quot;&gt;이벤트 루프가 테스크 큐에서 콜스택으로 콜백함수를 넘겨주는 작업은 콜스택에 샇여있는 함수가 없을 때만 수행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스크 큐에서는 web api에서 비동기 작업들이 실행된 후 호출되는 콜백 함수들이 기다리는 공간입니다. (테스크 큐는 하나의 큐로 이루어지지 않았고 마이크로테스크 큐, 애니메이션 프레임 등 여러개의 큐로 이루어져 있습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web api는 브라우저에서 자체 지원하는 api로 DOM 이벤트, Ajax, setTimeout등의 비동기 작업등을 수행할 수 있도록 api를 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  런타임 환경에서 어떻게 비동기 코드가 실행되는 걸까요 ????&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 코드들이 실행될 때, web api가 지원하는 비동기 작업을 수행하는 코드가 실행된다고 생각해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드가 호출 스택에 쌓인 후 실행되면 자바스크립트 엔진은 비동기 작업을 web api에게 위임합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. web api는 해당 비동기 작업을 수행하고, 콜백 함수를 이벤트 루프를 통해서 테스크 큐에 넘겨주게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이벤트 루프는 콜스택에 쌓여있는 함수가 없을 때, 테스크 큐에서 대기하고 있던 콜백 함수를 콜스택으로 넘겨줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 콜스택에 쌓인 콜백함수가 실행되고 콜스택에서 제거 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://medium.com/@gaurav.pandvia/understanding-javascript-function-executions-tasks-event-loop-call-stack-more-part-1-5683dea1f5ec&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/@gaurav.pandvia/understanding-javascript-function-executions-tasks-event-loop-call-stack-more-part-1-5683dea1f5ec&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/142</guid>
      <comments>https://ryurim.tistory.com/entry/220627-TIL-Call-Stack#entry142comment</comments>
      <pubDate>Mon, 27 Jun 2022 22:38:55 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스/자바스크립트] 예산</title>
      <link>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%88%EC%82%B0</link>
      <description>&lt;div data-challengeable-id=&quot;836&quot; data-challengeable-type=&quot;algorithm&quot; data-algorithm-type=&quot;standard&quot; data-language=&quot;javascript&quot; data-user-id=&quot;417273&quot; data-interface-type=&quot;function&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;tour2&quot;&gt;
&lt;div&gt;문제 설명
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
제한사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.&lt;/li&gt;
&lt;li&gt;d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.&lt;/li&gt;
&lt;li&gt;budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
입출력 예
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;budget&lt;/td&gt;
&lt;td&gt;result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,3,2,5,4]&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[2,2,3,3]&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #1&lt;br /&gt;각 부서에서 [1원, 3원, 2원, 5원, 4원]만큼의 금액을 신청했습니다. 만약에, 1원, 2원, 4원을 신청한 부서의 물품을 구매해주면 예산 9원에서 7원이 소비되어 2원이 남습니다. 항상 정확히 신청한 금액만큼 지원해 줘야 하므로 남은 2원으로 나머지 부서를 지원해 주지 않습니다. 위 방법 외에 3개 부서를 지원해 줄 방법들은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1원, 2원, 3원을 신청한 부서의 물품을 구매해주려면 6원이 필요합니다.&lt;/li&gt;
&lt;li&gt;1원, 2원, 5원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.&lt;/li&gt;
&lt;li&gt;1원, 3원, 4원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.&lt;/li&gt;
&lt;li&gt;1원, 3원, 5원을 신청한 부서의 물품을 구매해주려면 9원이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3개 부서보다 더 많은 부서의 물품을 구매해 줄 수는 없으므로 최대 3개 부서의 물품을 구매해 줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #2&lt;br /&gt;모든 부서의 물품을 구매해주면 10원이 됩니다. 따라서 최대 4개 부서의 물품을 구매해 줄 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해설&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇개의 부서에 예산을 지원해줄 수 있는지 부서의 수를 구하라는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 해야될 것들을 논리적으로 말로 표현을 먼저 해야겠다 !! (춘님이 알려주신 방법 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1656146830074&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution(d, budget) {
    let sum =0; 
    let answer=0; 

    d.sort((a,b)=&amp;gt;a-b); //우선 정렬을 해줍니다.
    for(let i=0; i&amp;lt;d.length; i++){
        answer++; // 답을 우선 올려줍니다.
        sum += d[i] // sum 에 d의 합을 구합니다.

        if(sum &amp;gt; budget){
            answer--;
        }; //더하다가 만약에 합이 예산보다 크게 된다면, 답을 -1해라 !!
    }
    return answer;
    
}

const d=[1,3,2,5,4]
const budget=9;
console.log(solution(d, budget))​&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;나는 날마다 1문제씩 풀면서 감도 잡고 ,, !! 논리적으로 사고하는 방법도 터득해야겠다 !될때까지 무한반복이다 ~!&lt;/p&gt;</description>
      <category>알고리즘 문제 풀이/프로그래머스</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/141</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%88%EC%82%B0#entry141comment</comments>
      <pubDate>Sun, 26 Jun 2022 18:47:52 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 / 자바스크립트]K번째수</title>
      <link>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8K%EB%B2%88%EC%A7%B8%EC%88%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 설명&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.&lt;/li&gt;
&lt;li&gt;1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.&lt;/li&gt;
&lt;li&gt;2에서 나온 배열의 3번째 숫자는 5입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
제한사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;array의 길이는 1 이상 100 이하입니다.&lt;/li&gt;
&lt;li&gt;array의 각 원소는 1 이상 100 이하입니다.&lt;/li&gt;
&lt;li&gt;commands의 길이는 1 이상 50 이하입니다.&lt;/li&gt;
&lt;li&gt;commands의 각 원소는 길이가 3입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;입출력 예
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;commands&lt;/td&gt;
&lt;td&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1, 5, 2, 6, 3, 7, 4]&lt;/td&gt;
&lt;td&gt;[[2, 5, 3], [4, 4, 1], [1, 7, 3]]&lt;/td&gt;
&lt;td&gt;[5, 6, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.&lt;br /&gt;[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.&lt;br /&gt;[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;commands는 뭐지 ?ㅠㅠ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 commands의 1번째 배열 안에 있는 [2,5,3]이 각각의 i / j / k가 되는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1656034561887&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution(array, commands) {
    const answer =[]
    commands.map((v)=&amp;gt;{
        const range = array.slice(v[0] - 1 ,v[1]); 
        //0번째와 첫번째 사이로 배열을 자릅니다. 
        //slice (처음시작, end까지) 그런데 end는 미포함으로 -1해주지 않아도 됩니다.
        range.sort((a,b)=&amp;gt;a-b); // 오름차순으로 정렬해줍니다.
        answer.push(range[v[2]-1]) //3번째 수를 배열에 넣어줍니다.
        
    });
    return answer
}
const array=[1, 5, 2, 6, 3, 7, 4];
const commands=[[2, 5, 3], [4, 4, 1], [1, 7, 3]];
console.log(solution(array, commands));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slice()&lt;/b&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;메서드는 어떤 배열의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;begin&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;end&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;까지(&lt;/span&gt;end&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&amp;nbsp;미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환합니다. 원본 배열은 바뀌지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;자바스크립트는 0번째부터 시작하기에..항상 n번째를 구할 땐 -1을 해줘야된다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>알고리즘 문제 풀이/프로그래머스</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/140</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8K%EB%B2%88%EC%A7%B8%EC%88%98#entry140comment</comments>
      <pubDate>Sat, 25 Jun 2022 11:46:20 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스/자바스크립트]최대공약수와 최소공배수</title>
      <link>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98%EC%99%80-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 설명&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.&lt;/p&gt;
제한 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 수는 1이상 1000000이하의 자연수입니다.&lt;/li&gt;
&lt;/ul&gt;
입출력 예
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;[3, 12]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;[1, 10]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
입출력 예 설명
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #1&lt;br /&gt;위의 설명과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 예 #2&lt;br /&gt;자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제풀이&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 공약수 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;두 수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;A&lt;span style=&quot;color: #222426;&quot;&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;B&lt;span style=&quot;color: #222426;&quot;&gt;의 공통된 약수 중에 가장 큰 정수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 공배수 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;두 수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;A&lt;span style=&quot;color: #222426;&quot;&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;B&lt;span style=&quot;color: #222426;&quot;&gt;의 공통된 약수 중에 가장 작은 정수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;3의 약수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;➡️ 1, 2, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;12의 약수 ➡️ 1, 2, &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;, 4,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;, 12&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3, 12의 최대 공약수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;➡️ 3&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;color: #222426;&quot;&gt;6의 배수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;➡️ 3 , 6,&lt;span&gt; 9 ,&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;12&lt;/b&gt;&lt;/span&gt;, 15&amp;nbsp; ...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;12의 배수&lt;span style=&quot;color: #222426;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;➡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;12&lt;/span&gt;&lt;/b&gt;, 24, 36, 48 ...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6, 12의 최소 공배수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222426;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;➡️ 12&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;color: #000000;&quot;&gt;2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a&amp;gt;b)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;a와 b의 최대공약수는 b와 r의 최대공약수와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&quot;A &amp;gt; B 일때 A와 B의 최대공약수는 B와 나머지 R의 최대공약수와 같다.&quot;&lt;/b&gt;&lt;/i&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;1. 큰 수(A)를 작은 수(B)로 나눈다. ( A &amp;gt; B )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 나누는 수(B)를 나머지(R)로 계속 나눈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 나머지가 0이 나오면 나누는 수가 최대 공약수&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;color: #000000;&quot;&gt;최소공배수는 두 수를 곱한 후에 최대공약수로 나누면 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655960451790&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function solution(n, m) {
    const gcd =(a, b) =&amp;gt; a % b === 0 ? b : gcd(b, a % b); //최대공약수
    const lcm = (a, b) =&amp;gt; a * b / gcd(a, b); // 최소 공배수
    return [gcd(n, m), lcm(n, m)]
}

console.log(solution(3,12))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어렵당 ㅠㅠㅠㅠ수학공식 예전에는 재미있었는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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://window6kim.tistory.com/40&quot;&gt;https://window6kim.tistory.com/40&lt;/a&gt;&lt;/p&gt;</description>
      <category>알고리즘 문제 풀이/프로그래머스</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/138</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98%EC%99%80-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98#entry138comment</comments>
      <pubDate>Fri, 24 Jun 2022 15:02:13 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.23 TIL 리액트 18버전</title>
      <link>https://ryurim.tistory.com/entry/20220623-TIL-%EB%A6%AC%EC%95%A1%ED%8A%B8-18%EB%B2%84%EC%A0%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 18버전에서 추가된 사항은 자동 배치, 동시성 제어 기능, 서스펜스를 지원하는 새로운 서버 사이드 렌더링 아키텍처입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #030303;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;1️⃣ 자동배치 (Automatic Batching)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;배치란,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;리액트가 더 나은 성능을 위해 여러 개의 상태 업데이트를 한 번의 리렌더링(re-render)으로 묶는 작업&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;을 뜻합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655985280307&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ~React 17
ReactDOM.render(&amp;lt;App /&amp;gt;, container);

// React 18
const root = ReactDOM.createRoot(container);
root.render(&amp;lt;App /&amp;gt;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;eb6c&quot; data-selectable-paragraph=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이 변경은 단순하게 인터페이스만 바뀌는 것이 아닙니다.&lt;br /&gt;기존의&lt;span&gt;&amp;nbsp;&lt;/span&gt;render&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수는, 컴포넌트 트리를 React 17과 그 이전의 동작과 동일한 방식으로 동작합니다.&lt;br /&gt;새로운&lt;span&gt;&amp;nbsp;&lt;/span&gt;createRoot&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수는, 컴포넌트 트리를 동시성(Concurrent) 기능들과 자동 배치 등 React 18의 기능들이 동작하도록 합니다.&lt;/p&gt;
&lt;p id=&quot;7146&quot; data-selectable-paragraph=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;그러므로 React 18과 앞으로 나올 새로운 리액트의 기능들을 사용하기 위해서는 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;ReactDOM.createRoot&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 사용하도록 애플리케이션을 변경해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2️⃣ &amp;nbsp;동시성 제어 기능&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트에서&amp;nbsp;상태&amp;nbsp;업데이트는&amp;nbsp;항상&amp;nbsp;직접적인&amp;nbsp;상호&amp;nbsp;작용&amp;nbsp;반영에&amp;nbsp;반응하여&amp;nbsp;업데이트&amp;nbsp;되었습니다.&lt;br /&gt;&lt;br /&gt;리액트&amp;nbsp;모든&amp;nbsp;상태&amp;nbsp;업데이트에서&amp;nbsp;제어를&amp;nbsp;하기&amp;nbsp;위해서는&lt;br /&gt;setTimeout,&amp;nbsp;throttle,&amp;nbsp;debounce&amp;nbsp;등을&amp;nbsp;활용하는&amp;nbsp;것이&amp;nbsp;전부였습니다.&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;React&amp;nbsp;18부터는&amp;nbsp;startTransition&amp;nbsp;API를&amp;nbsp;제공함으로써,&amp;nbsp;&lt;br /&gt;업데이트를&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;&lt;/p&gt;
&lt;pre id=&quot;code_1655985066542&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useTransition } from 'react';

function TransitionTest() {
    const [isPending, startTransition] = useTransition();
    
    function handleChange(e) {
        const val = e.target.value;

        // 바로 보여줘야 하는(업데이트) 비지니스 로직
        setDataValue(val);

        // 다른 업데이트에 영향을 줄 수 있는 비지니스 로직을 감싼다.
        startTransition(() =&amp;gt; {
            // 느린 렌더링 또는 네트워크 로직이 들어 갈 수 있다.
            setDataQuery(val);
        });
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3️⃣ 서스펜스를 지원하는 새로운 서버 사이드 렌더링 아키텍처&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #030303;&quot;&gt;  Suspense&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1655969006048&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Profile(){
	const {data: profile, isLoading} = useQuery(&quot;profile&quot;, fn);
    if (isLoading){
    return &amp;lt;Loader/&amp;gt;;
    }
    return &amp;lt;div&amp;gt;Hello {profile.name}! Welcome! &amp;lt;/div&amp;gt;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 로딩 상태를 컴포넌트와 분리하는 것은 어떨까 ?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;Suspense를 사용하면 이러한 로딩 state를 잊어도 된다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655969085362&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Profile(){
	const {data: profile} = useQuery(&quot;profile&quot;, fn);
    
    return &amp;lt;div&amp;gt;Hello {profile.name}! Welcome! &amp;lt;/div&amp;gt;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시는 &lt;span style=&quot;background-color: #f9f9f9; color: #030303;&quot;&gt;Suspense를 사용한다면, &lt;/span&gt;이렇게 바뀔 수 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loading state는 어디로 갔을까요 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에는 컴포넌트 안에 있다가 18버전 서스펜스를 사용하게 된다면, 외부에 있게된다는 의미입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 40.jpg&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqUGIU/btrFAQbGwbC/lNxg2gk1sW71KGRRWFyR4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqUGIU/btrFAQbGwbC/lNxg2gk1sW71KGRRWFyR4K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqUGIU/btrFAQbGwbC/lNxg2gk1sW71KGRRWFyR4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqUGIU%2FbtrFAQbGwbC%2FlNxg2gk1sW71KGRRWFyR4K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2338&quot; height=&quot;1126&quot; data-filename=&quot;Group 40.jpg&quot; data-origin-width=&quot;2338&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 프로필 컴포넌트를 렌더링 할때 아래와 같이 렌더링 한다는 의미입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655969513861&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Suspense fallback={&amp;lt;Loader/&amp;gt;}&amp;gt;
	&amp;lt;Profile/&amp;gt;
&amp;lt;/Suspense&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 18버전을 이용할 때 Fetching 라이브러리는 리액트와 커뮤니케이션 하여서 컴포넌트 안에 데이터를 가져오는지의 여부를 알릴 수 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 안에 데이터를 가져오면, 리액트는 컴포넌트를 렌더링 하지 않는 대신 Loader를 suspense에 렌더링 하게 된다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이 터를 컴포넌트에 가져오지 않으면, 데이터와 함께 이미 있는 컴포넌트를 보여주게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트에서 if / else를 사용하여 로딩이 되었는지 안되었는지를 확인하는 것보다 훨씬 더 깔끔해진 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서버사이드 렌더링 지원&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;CSR vs SSR&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 사이드 렌더링과 서버사이드 렌더링을 알아보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;CSR&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저가 웹사이트에 입장하니 UI가 안보입니다. 우리는 유저에게 브라우저가 다운받을 js파일을 제공하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 리액트 코드가 들어있는 js파일을 실행하게 됩니다. 리액트가 실행될 때 리액트는 유저가 볼 수 있는 모든 HTML요소와 UI를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 인터넷이 느려서 js파일 다운로드가 느려지게 된다면 , 유저는 빈화면만 보게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSR&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저가 웹사이트에 들어오면,&amp;nbsp; 유저에게 응답하기 전에 서버에서 리액트를 실행합니다. 리액트는 UI를 렌더링하고 결과 HTML을 제공합니다. 그리고 해당 HTML을 유저에게 제공합니다. 이 시점에서 유저는 인터렉션이 없는 HTML파일만 가지고 있게 됩니다. (왜냐? 리액트가 브라우저에서 로딩이 되지 않았기 때문 !!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 여기에서는 하이드레이션(Hydration)이라는 프로세스가 존재하는데, 유저가 HTML을 수신한 뒤 리액트 코드가 있는 js파일도 브라우저에 의해 다운로드 되고 실행됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;하이드레이션은, 브라우저에서 HTML을 렌더링할 때 페이지의 컴파일된 HTML에 JavaScript 동작을 다시 추가하는 프로세스를 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점에서 리액트 js는 이미 존재하는 HTML과 동기화하여서 애플리케이션을 넘겨받아 인터렉티브하게 만들어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2022-06-23 오후 4.47.40.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbI8wu/btrFz3ij8uw/AiUg9R5ysTU8aptoCHcZHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbI8wu/btrFz3ij8uw/AiUg9R5ysTU8aptoCHcZHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbI8wu/btrFz3ij8uw/AiUg9R5ysTU8aptoCHcZHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbI8wu%2FbtrFz3ij8uw%2FAiUg9R5ysTU8aptoCHcZHK%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;1006&quot; height=&quot;473&quot; data-filename=&quot;edited_스크린샷 2022-06-23 오후 4.47.40.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;473&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;클라이언트 사이드 렌더링을 이용하면, js와 리액트가 로딩 될 때까지 유저는 빈화면만 보게 되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버사이드 렌더링을 이용하면 어떠한 UI는 볼 수 있는 상태이며, js 리액트 로딩이 끝나면 인터렉티브 해지게 됩니다.&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;예를들자면, posts가 로딩 되기전까지는 유저는 헤더 컴포넌트도 볼 수 없게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655970751732&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;APP&amp;gt;
	&amp;lt;Header /&amp;gt;
    	&amp;lt;Posts/&amp;gt;
&amp;lt;/APP&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 18버전에서는 suspense를 활용해서 이러한 문제를 해결해줍니다.&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;pre id=&quot;code_1655970929328&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;APP&amp;gt;
	&amp;lt;Header /&amp;gt;
    &amp;lt;Suspense fallback={&amp;lt;Loader /&amp;gt;}&amp;gt;
		&amp;lt;Posts/&amp;gt;
    &amp;lt;/Suspense&amp;gt;
&amp;lt;/APP&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;suspense로 posts컴포넌트를 감싸줍니다. 이때 HTML을 살펴보면 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655971021911&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
	&amp;lt;header&amp;gt; ... &amp;lt;/header&amp;gt;
    	&amp;lt;img src =&quot;loading.gif&quot;/&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;유저는 posts컴포넌트를 기다리지 않아도 헤더 컴포넌트를 바로 볼수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 api덕분에 posts가 서버사이트 렌더링을 끝낼 때 http스트림을 사용하여&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트는 Loader컴포넌트의 HTML을 브라우저에서 리액트가 로딩 되기도 전에&amp;nbsp; posts 컴포넌트의 결과 HTML로 대체한다는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655981823953&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
	&amp;lt;header&amp;gt; ... &amp;lt;/header&amp;gt;
    	&amp;lt;ul&amp;gt; ...&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 보면, img 태그가 ul태그로 대체 됩니다.&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;Suspence 덕분에 어플리케이션을 빠르게 렌더링 할 수 있다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 어플리케이션을 한번에 하이드레이션(Hydration)을 할 필요 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게다가 아직 Hydrate가 되지 않은 리액트 컴포넌트를 유저가 클릭하면, 리액트는 하던 Hydrate를 멈추고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저가 인터렉션 하기 원하는 컴포넌트를 우선적으로 Hydrate합니다.&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;찐 장점은 Sever Components 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Sever Components&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 컴포넌트는 백엔드에만 존재하는 리액트 js코드를 쓸 수 있게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 어느 컴포넌트가 브라우저가 렌더링할 컴포넌트인지 서버가 렌더링할 컴포넌트인지 둘 중 하나가 렌더링을 할지를 미리 선택할 수 있다는 것 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 유저는 js를 다운로드 받지 않아도 됩니다. 결과적으로 로딩 시간이 빨라지고 , ux도 향상됩니다.&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;또한 DB랑 직접적으로 커뮤니케이션 하는 리액트 컴포넌트가 생기게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 클라이언트 사이드 렌더링의 리액트에는 api를 호출하고 api는 서버에 있습니다. 그리고 서버가 DB랑 통신을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 직접적으로 DB랑 통신하면 보안적으로 문제가 됩니다.&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;하지만 컴포넌트가 서버 컴포넌트였다면 리액트 JS컴포넌트에서 SQL 쿼리를 수행할 수 있습니다.&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;파일 이름 끝네 .server.js를 추가하면 서버 컴포넌트가 되고 .client.js를 추가하면 클라이언트 컴포넌트가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 .js를 붙이면 서버, 클라이언트 모두가 렌더링 할 수 있는 컴포넌트가 됩니다.&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.youtube.com/watch?v=7mkQi0TlJQo&quot;&gt;https://www.youtube.com/watch?v=7mkQi0TlJQo /&lt;/a&gt;&lt;a href=&quot;https://medium.com/naver-place-dev/react-18%EC%9D%84-%EC%A4%80%EB%B9%84%ED%95%98%EC%84%B8%EC%9A%94-8603c36ddb25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/naver-place-dev/react-18%EC%9D%84-%EC%A4%80%EB%B9%84%ED%95%98%EC%84%B8%EC%9A%94-8603c36ddb25&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/139</guid>
      <comments>https://ryurim.tistory.com/entry/20220623-TIL-%EB%A6%AC%EC%95%A1%ED%8A%B8-18%EB%B2%84%EC%A0%84#entry139comment</comments>
      <pubDate>Thu, 23 Jun 2022 20:59:15 +0900</pubDate>
    </item>
    <item>
      <title>콜백 지옥을 해결하는 방법</title>
      <link>https://ryurim.tistory.com/entry/%EC%BD%9C%EB%B0%B1-%EC%A7%80%EC%98%A5%EC%9D%84-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;콜백 지옥을 해결하는 방법을 설명해보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;콜백지옥&lt;/b&gt;  &lt;/h3&gt;
&lt;div&gt;&lt;span&gt;콜백 지옥은 비동기 처리 로직을 위해 콜백 함수를 연속해서 사용할 때 발생하는 문제입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;콜백함수를 이용해서 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;비동기 처리를 해주다가 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;코드가 깊어지는 것을 말합니다.&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 콜백 지옥을 해결하는 방법에는 Promise 나 Async를 사용하는 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655957038659&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function taskA(a, b, cb) {
  setTimeout(() =&amp;gt; {
    const res = a + b;
    cb(res);
  }, 2000);
}

function taskB(a, cb) {
  setTimeout(() =&amp;gt; {
    const res = a * 2;
    cb(res);
  }, 2000);
}

function taskC(a, cb) {
  setTimeout(() =&amp;gt; {
    const res = a * -1;
    cb(res);
  }, 2000);
}

taskA(1, 2, (res_a) =&amp;gt; {
  taskB(res_a, (res_b) =&amp;gt; {
    taskC(res_b, (res_c) =&amp;gt; {
      console.log(&quot;taskC Result : &quot;, res_c);
    });
  });
});&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;콜백 함수는 주로 이벤트 처리나 서버 통신과 같은 비동기 작업을 제어 하기 위해 사용되지만 콜백 함수를 반복 해서 사용하게 되면, 들여 쓰기 수준이 감당할 수 없을 정도록 깊어지게 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;Promise&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;프라미스란 비동기 연산이 종료된 이후에 결과를 알기 위해 사용하는 객체입니다. 프라미스를 사용하면, 비동기 메서드를 마치 동기 메서드처럼 값을 반환할 수 있습니다. then()과 catch()문의 체이닝을 통해 값을 반환 받아올 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Promise : .then으로 함수실행순서를 정할 수 있다. 위의 callback 처럼 함수들이 많아질수록 작성하기가 어렵고 가독성이 떨어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;promise는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;언젠가 완료가 되는 작업의 결과값을 담는 상자와 같은 역할&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;을 합니다.&lt;br /&gt;콜백지옥을 해결하기 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;Promise는 다음 중 하나의 상태를 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대기 ( pending ) : 이행하지도 거부하지도 않은 초기 상태&lt;/li&gt;
&lt;li&gt;이행 ( fulfill ) : 연산 성공&lt;/li&gt;
&lt;li&gt;거부 ( reject ) : 연산 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1655957687669&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let firstPromise = new Promise((resolve, reject) =&amp;gt; {
  // 비동기작업이 성공인경우 resolve(...), 실패인경우 reject(...)를 호출
  setTimeout(() =&amp;gt; {
    resolve('성공~');
  }, 1000);
});

firstPromise.then((successMessage) =&amp;gt; {
  // successMessage는 위에서 resolve(...) 호출에 제공한 값
  console.log('우와!' + successMessage);
});

// 우와!성공~&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;Promise 기반 비동기적 함수를 호출하면 그 함수는 Promise 인스턴스를 반환한다.&lt;br /&gt;대기중인 promise는 값과 함께&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;성공(fulfilled)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;할 수도,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실패(rejected)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;할 수도 있다.&lt;br /&gt;이행되거나 거부될때 프로미스의&lt;span&gt;&amp;nbsp;&lt;/span&gt;then&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드에 의해 대기열 (큐) 에 추가된 처리기들이 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Promise는&lt;/span&gt;new Promise&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성자를 통해서 Promise 객체를 만들 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Promise 생성자 함수는 비동기 처리를 수행 할 콜백 함수를 인수로 전달 받는데, 이 콜백 함수는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;resolve&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;reject&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;함수를 인수로 전달받습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655957894391&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const promise = new Promise((resolve,reject) =&amp;gt; {
  // Promise 함수의 콜백함수내부에서 비동기 처리를 수행
  if(/*비동기처리성공*/ ){
    resolve('result');
  } else {/*비동기처리실패*/
    reject('fail result');
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Promise 생성자 함수가 인수로 전달받은 콜백함수내부에서 비동기처리를 수행한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;이 때 비동기처리가 성공하면 콜백함수의 인수로 전달받은 resolve함수를 호출하고, 실패하면 reject함수를 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;프로미스의 비동기 처리 상태가 변화하면 이에 따른 후속 처리를 해야한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;예를들어, 프로미스가 fulfilled상태가 되면 프로미스의 처리결과를 가지고 무언가를 해야하고, rejected상태가되면 프로미스의 처리결과(에러)를 가지고 에러처리를 해야한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;이를 위해 프로미스는 후속처리메서드 then, catch, finally를 제공한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;즉, 프로미스의 비동기 처리상태가 변화하면 후속처리메서드에 인수로 전달한 콜백함수가 선택적으로 호출된다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Promise.prototype.then&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;then 메서드는 두개의 콜백함수를 인수로 전달받는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;첫번째 콜백함수는 비동기처리가 성공했을 때 호출되는 성공 처리 콜백함수고, 두번째 콜백함수는 비동기처리가 실패했을 때 호출되는 실패 처리 콜백함수다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;then 메서드는 언제나 프로미스를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Promise.prototype.catch&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;catch 메서드는 한개의 콜백함수를 인수로 전달받는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;catch 메서드의 콜백함수는 프로미스가 rejected상태인 경우만 호출된다. (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;에러처리를 해줄 때 사용한다.&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;또한 then 메서드와 동일하게 동작하기때문에, 언제나 프로미스를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Promise.prototype.finally&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;finally 메서드는 한개의 콜백함수를 인수로 전달받는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;프로미스의 상태와 상관없이 무조건 한 번 호출된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;즉, finally메서드는 프로미스 상태와 상관없이 공통적으로 수행해야 할 처리내용이 있을 때 유용하다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Pending&lt;/b&gt;(대기)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래와 같이 Promise 객체를 생성하면 대기(Pending) 상태입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655958366819&quot; class=&quot;haxe&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Promise();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래와 같이 new Promise() 메서드 호출 시 콜백 함수를 선언할 수 있으며, 인자는 resolve와 reject입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655958366820&quot; class=&quot;coffeescript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Promise((resolve, reject) =&amp;gt; {});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Fulfilled&lt;/b&gt;(이행)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래와 같이 콜백 함수 인자인 resolve를 실행하면 이행된(Fulfilled) 상태입니다. 참고로, 이행된 상태를 다른 말로 완료된 상태라고도 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655958366820&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Promise(function(resolve, reject) {
  resolve();
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이행 상태가 되면 then()을 활용하여 결괏값을 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;async-await&quot;&gt;&lt;b&gt;async, await&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES8에서 도입된 async , await를 사용하면 비동기함수를 마치 동기적 코드인거처럼 동작하도록 구현할 수 있다.&lt;br /&gt;즉, 프로미스의 후속처리 메서드(then, catch, finally) 없이 마치 동기 처리처럼 프로미스가 처리결과를 반환하도록 구현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기함수는 항상 promise객체를 반환한다는 특징이 있다.&lt;br /&gt;async함수는 async키워드를 사용해 언제나 프로미스를 반환한다.&lt;br /&gt;async함수가 명시적으로 프로미스를 반환하지 않더도 async함수는 암묵적으로 반환값을 resolve하는 프로미스를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;async는 asynchronous의 줄임말로 비동기를 의미한다. 이 함수 안에 비동기적으로 실행될 부분(await)이 있다는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655958991350&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function test() {
    // logic
}

변수 = async() =&amp;gt; {
	// logic
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;await&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;는 async 안에서만 작동한다. await 키워드를쓰게되면 해당값이 반환 되기 전까지 기다리는 동안 async 내부 함수는 일시 중단이 된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;( 프로미스가 settled상태 ( 비동기처리가 수행된 상태 )가 될때까지 대기하다가 settled상태가 되면 프로미스가 resolve한 처리결과 값을 반환한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1655959049600&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function userInfo() {
  const url = 'https://koreanjson.com/users/1';
  return fetch(url)
    .then((res) =&amp;gt;{
    return res.json();
  })
}

function userTodo() {
  const url = 'https://koreanjson.com/todos/1';
  return fetch(url)
    .then((res) =&amp;gt; {
    return res.json(); 
  })
}

async function sumOfFetch() {
  const user = await userInfo();
  if(user.id === 1) {
   const todo = await userTodo();
   console.log(todo)
   return todo;
  }
}
sumOfFetch();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;async-await-예외처리-try-catch-문&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;async, await 예외처리 try catch 문&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;error 처리를 할 경우에는 정상적으로 동작 되었을 때 실행되는 부분을&lt;span&gt;&amp;nbsp;&lt;/span&gt;try&lt;span&gt;&amp;nbsp;&lt;/span&gt;문으로 감싸고 err가 발생 시 실행되는 부분을&lt;span&gt;&amp;nbsp;&lt;/span&gt;catch문으로 감싼다.&lt;/p&gt;
&lt;pre id=&quot;code_1655959032654&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function sumOfFetch() {
  try{
    const user = await userInfo();
    if(user.id === 1) {
    const todo = await userTodo();
    console.log(todo)
    return todo;
    }
  } catch (e) {
    console.error(e);
  }
}
sumOfFetch();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;async, await : 꼭 async 가 있어야 await 을 쓸 수 있고, promise 방법보다 작성하기 쉽고 가독성도 올라간다. 다만 아직 완전히 해결되는건 아니므로 callback과 promise를 적절히 섞어쓰면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://backback.tistory.com/319&quot;&gt;https://backback.tistory.com/319&lt;/a&gt; / &lt;a href=&quot;https://velog.io/@5o_hyun/%EC%BD%9C%EB%B0%B1%EC%A7%80%EC%98%A5%ED%95%B4%EA%B2%B0-Promise-async-await&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@5o_hyun/%EC%BD%9C%EB%B0%B1%EC%A7%80%EC%98%A5%ED%95%B4%EA%B2%B0-Promise-async-await&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/137</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%BD%9C%EB%B0%B1-%EC%A7%80%EC%98%A5%EC%9D%84-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry137comment</comments>
      <pubDate>Thu, 23 Jun 2022 13:38:58 +0900</pubDate>
    </item>
    <item>
      <title>런타임 vs 컴파일 타임</title>
      <link>https://ryurim.tistory.com/entry/%EB%9F%B0%ED%83%80%EC%9E%84-vs-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%ED%83%80%EC%9E%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;런타임(Runtime)과&amp;nbsp;컴파일타임(Compiletime)은&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;통해&amp;nbsp;기계어코드로&amp;nbsp;변환&amp;nbsp;되어&amp;nbsp;실행&amp;nbsp;가능한&amp;nbsp;프로그램이&amp;nbsp;되며,&amp;nbsp;이러한&amp;nbsp;편집&amp;nbsp;과정을&amp;nbsp;컴파일타임(Compiletime)&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;런타임(Runtime)이라고&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;런타임&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;런타임(Runtime)&lt;/u&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;은 컴파일 과정을 마친 프로그램이 사용자에 의해 실행될때의 환경 또는 시간이다. 예를 들자면 자바스크립트는 Web Browser에서 작동할때, Node.js에서 작동할때, Browser와 Node.js를 런타임이라 할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴파일 타임&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴파일타임(Compile time)은 먼저 컴파일에 대한 이해가 먼저인데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;컴파일은 원시코드에서 목적코드로 옮기는 과정을 말하며 일반적으로 사람이 이해하기 쉬운 자연어 형태(고수준 언어)를 기계어, 어셈블리어(저수준 언어)로 변역하는것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;컴파일타임&lt;/b&gt;&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이라는 것은 이렇게 프로그램을 위한 소스코드를 작성하고 이를 컴파일 하여 기계어코드로 변환하는 일련의 과정을 의미한다. 즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;컴파일이 진행되는 과정&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 컴파일타임이라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴파일타임 오류의 유형&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신택스 오류 : 신택스에러(Syntax&amp;nbsp;error)나&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;타입체크 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;런타임 오류의 유형&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0나누기 오류&lt;/li&gt;
&lt;li&gt;널(Null)참조 오류&lt;/li&gt;
&lt;li&gt;메모리 부족 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://spaghetti-code.tistory.com/35&quot;&gt;https://spaghetti-code.tistory.com/35&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://zunoxi.tistory.com/99?category=816528&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/136</guid>
      <comments>https://ryurim.tistory.com/entry/%EB%9F%B0%ED%83%80%EC%9E%84-vs-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%ED%83%80%EC%9E%84#entry136comment</comments>
      <pubDate>Wed, 22 Jun 2022 16:58:09 +0900</pubDate>
    </item>
    <item>
      <title>새로운 CSS Flexbox나 Grid를 사용해본 적이 있나요? 있다면, 설명해보세요.</title>
      <link>https://ryurim.tistory.com/entry/%EC%83%88%EB%A1%9C%EC%9A%B4-CSS-Flexbox%EB%82%98-Grid%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B8-%EC%A0%81%EC%9D%B4-%EC%9E%88%EB%82%98%EC%9A%94-%EC%9E%88%EB%8B%A4%EB%A9%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EB%B3%B4%EC%84%B8%EC%9A%94</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;새로운&amp;nbsp;CSS&amp;nbsp;Flexbox나&amp;nbsp;Grid를&amp;nbsp;사용해본&amp;nbsp;적이&amp;nbsp;있나요?&amp;nbsp;있다면,&amp;nbsp;설명해보세요.&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Flexbo&lt;/span&gt;&lt;span style=&quot;color: #212529;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #212529;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;b&gt;는 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #555555;&quot;&gt;&lt;b&gt;1차원으로 수평, 수직 영역 중 하나의 방향&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;으로만 레이아웃을 나눌 수 있습니다.&lt;/span&gt; Grid는&lt;span style=&quot;background-color: #f6e199; color: #555555;&quot;&gt;&lt;b&gt;&amp;nbsp;2차원으로 수평 수직을 동시에 영역&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;을 나눌 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;gird와 flex를 사용하면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f1f3f6; color: #000000;&quot;&gt;더 이상 플롯(float), 테이블 셀(table-cell) 디스플레이를 사용하지 않아도 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.25.25.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/seFil/btrFpFIevQ3/eaXFgCE0XudMSAZDX0pGCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/seFil/btrFpFIevQ3/eaXFgCE0XudMSAZDX0pGCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/seFil/btrFpFIevQ3/eaXFgCE0XudMSAZDX0pGCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FseFil%2FbtrFpFIevQ3%2FeaXFgCE0XudMSAZDX0pGCk%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;400&quot; height=&quot;259&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.25.25.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Flexbox&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Flex 컨테이너 안(태그 안)에 있는 item들의 방향을 결정하는데, 기본적으로는 row로 형성되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b1b1b;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어려운 정의 :&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flexbox 모델은 뷰포트(viewport) 및 엘리먼트 (elemnt) 크기가 동적이거나 알려지지(unknown) 않은 경우에도 문서 내의 엘리먼트간에 공간을 배치(layout), 정렬(align) 및 분산(distribute)하는 효율적인 방법을 제공한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655800121849&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
    display: flex;
  }
  .wrapper &amp;gt; div {
    background: #c4c4c4;
    width: 400px;
    height: 200px;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.36.25.png&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5HmkS/btrFoPksEeJ/uz8kJDTy9iEqXbAhwUiFek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5HmkS/btrFoPksEeJ/uz8kJDTy9iEqXbAhwUiFek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5HmkS/btrFoPksEeJ/uz8kJDTy9iEqXbAhwUiFek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5HmkS%2FbtrFoPksEeJ%2Fuz8kJDTy9iEqXbAhwUiFek%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;2872&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.36.25.png&quot; data-origin-width=&quot;2872&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flex-direction을 통해서 축을 바꿀 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, 기본적으로 되어있는 row 방향을 column으로 바꿀 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655800258927&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; .wrapper {
    display: flex;
    flex-direction: column;
  }
  .wrapper &amp;gt; div {
    background: #c4c4c4;
    width: 50px;
    height: 50px;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.30.44.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PG6IM/btrFmXDOYmI/o0ajctrfkuPJELWZCN4Ilk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PG6IM/btrFmXDOYmI/o0ajctrfkuPJELWZCN4Ilk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PG6IM/btrFmXDOYmI/o0ajctrfkuPJELWZCN4Ilk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPG6IM%2FbtrFmXDOYmI%2Fo0ajctrfkuPJELWZCN4Ilk%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;908&quot; height=&quot;574&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.30.44.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주축은&amp;nbsp;flex-direction에 의해 정의되며&amp;nbsp;4개의 값을 가질 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;row&lt;/li&gt;
&lt;li&gt;row-reverse&lt;/li&gt;
&lt;li&gt;column&lt;/li&gt;
&lt;li&gt;column-reverse&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;row&amp;nbsp;혹은&amp;nbsp;row-reverse를 선택하면&amp;nbsp;주축은&amp;nbsp;&lt;b&gt;인라인 방향&lt;/b&gt;으로&amp;nbsp;행을 따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;column&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&amp;nbsp;혹은&amp;nbsp;&lt;/span&gt;column-reverse&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&amp;nbsp;을 선택하면 주축은 페이지&amp;nbsp;상단에서&amp;nbsp;하단으로&amp;nbsp;&lt;/span&gt;&lt;b&gt;블록 방향&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;을&amp;nbsp;따릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;항목이 여러 행에 나열되도록 하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/flex-wrap&quot;&gt;flex-wrap&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성의 값을&amp;nbsp;&lt;/span&gt;wrap&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;으로 지정합니다. 그러면 항목이 하나의 행에 들어가지 않을 정도로 클 경우 다른 행에 배치됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655800657513&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
    display: flex;
    flex-wrap: wrap;
  }
  .wrapper &amp;gt; div {
    background: #c4c4c4;
    width: 400px;
    height: 200px;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.37.21.png&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIrtV4/btrFlFchpxN/ZHcm9fEViY4KK8mIOBlHH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIrtV4/btrFlFchpxN/ZHcm9fEViY4KK8mIOBlHH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIrtV4/btrFlFchpxN/ZHcm9fEViY4KK8mIOBlHH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIrtV4%2FbtrFlFchpxN%2FZHcm9fEViY4KK8mIOBlHH0%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;2860&quot; height=&quot;814&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.37.21.png&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;축약형_속성_flex-flow&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox#%EC%B6%95%EC%95%BD%ED%98%95_%EC%86%8D%EC%84%B1_flex-flow&quot;&gt;축약형 속성 flex-flow&lt;/a&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flex-direction&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&amp;nbsp;속성과&amp;nbsp;&lt;/span&gt;flex-wrap&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&amp;nbsp;속성을&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/flex-flow&quot;&gt;flex-flow&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;라는 축약 속성으로 합칠 수 있습니다. 첫 번째&amp;nbsp;값은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;flex-direction&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;이고 두 번째&amp;nbsp;값은&amp;nbsp;&lt;/span&gt;flex-wrap&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;위의 예시를 축약형 속성으로 나타낸 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655800752807&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
    display: flex;
    flex-flow: row wrap;
  }
  .wrapper &amp;gt; div {
    background: #c4c4c4;
    width: 400px;
    height: 200px;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가로 정렬은 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;justify-content&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세로 정렬은 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/align-items&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;align-items&lt;/a&gt;를 사용하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.43.46.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6hNJP/btrFmmXxeBE/YLj0SGMlboBVssJLmlRtV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6hNJP/btrFmmXxeBE/YLj0SGMlboBVssJLmlRtV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6hNJP/btrFmmXxeBE/YLj0SGMlboBVssJLmlRtV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6hNJP%2FbtrFmmXxeBE%2FYLj0SGMlboBVssJLmlRtV0%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;500&quot; height=&quot;437&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.43.46.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.43.00.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pl9cs/btrFoZNTXc8/M12tG1N9Xe8hyQGGebNoBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pl9cs/btrFoZNTXc8/M12tG1N9Xe8hyQGGebNoBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pl9cs/btrFoZNTXc8/M12tG1N9Xe8hyQGGebNoBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpl9cs%2FbtrFoZNTXc8%2FM12tG1N9Xe8hyQGGebNoBK%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;500&quot; height=&quot;434&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.43.00.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;616&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Grid&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;그리드는 수평선과 수직선이 교차해서 이루어진 집합체입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;- 하나의 집합체는 세로 열을 그리고 다른 하나는 가로 행을 정의합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;- 각 요소는 이러한 열과 행으로 된 라인을 따라 생성된 그리드에 배치할 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그리드 레이아웃(Grid Layout)&lt;/b&gt;은 페이지를 여러 주요 영역으로 나누거나, 크기와 위치 및 문서 계층 구조의 관점에서 HTML 기본 요소로 작성된 콘트롤 간의 관계를 정의하는 데 아주 탁월합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;테이블과 마찬가지로 그리드 레이아웃은 세로 열과 가로 행을 기준으로 요소를 정렬할 수 있습니다. 하지만, 테이블과 달리 CSS 그리드는 다양한 레이아웃을 훨씬 더 쉽게 구현할 수 있습니다. 예를 들어, 그리드 컨테이너 속 자식 요소를, 마치 CSS로 일일이 위치를 지정해 준 것처럼, 실제로 겹치게 층을 지면서 자리를 잡도록 각 요소의 위치를 지정해 줄 수도 있습니다.&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: #1b1b1b;&quot;&gt;는 요소에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;display: grid&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;display: inline-grid&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;를 선언하여 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;grid-template-columns속성을 이용하여 행을, grid-template-rows속성을 이용하여 열을 바꿀 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655786624252&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;wrapper&quot;&amp;gt;
  &amp;lt;div&amp;gt;One&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;Two&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;Three&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;Four&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;Five&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;이제&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.wrapper&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요소를 그리드 컨테이너로 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655786644951&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
  display: grid;
}
 .wrapper &amp;gt; div {
    height: 100px;
    background: #c4c4c4;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 1.51.02.png&quot; data-origin-width=&quot;2382&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAhp6r/btrFlFJjkLE/2lFjWH9iD2mNvoC26NTPj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAhp6r/btrFlFJjkLE/2lFjWH9iD2mNvoC26NTPj0/img.png&quot; data-alt=&quot;display : grid로만 지정했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAhp6r/btrFlFJjkLE/2lFjWH9iD2mNvoC26NTPj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAhp6r%2FbtrFlFJjkLE%2F2lFjWH9iD2mNvoC26NTPj0%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;2382&quot; height=&quot;1008&quot; data-filename=&quot;스크린샷 2022-06-21 오후 1.51.02.png&quot; data-origin-width=&quot;2382&quot; data-origin-height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;display : grid로만 지정했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1655787028153&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
  display: grid;
   grid-template-columns: 200px 200px 200px;
}

 .wrapper &amp;gt; div {
    height: 100px;
    background: #c4c4c4;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 1.52.17.png&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baGg52/btrFoB60zW0/w7EmQNkKiDRcCQkC3ukvLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baGg52/btrFoB60zW0/w7EmQNkKiDRcCQkC3ukvLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baGg52/btrFoB60zW0/w7EmQNkKiDRcCQkC3ukvLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaGg52%2FbtrFoB60zW0%2Fw7EmQNkKiDRcCQkC3ukvLK%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;2380&quot; height=&quot;754&quot; data-filename=&quot;스크린샷 2022-06-21 오후 1.52.17.png&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;754&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;grid-template-columns&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로퍼티를 추가하고 세로 열에 놓이게 될 트랙의 크기를 정의해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 200픽셀의 너비를 가진 세로 열 방향의 트랙 세 개를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 grid-template-columns 속성을 지정하면, width 값이 200px로 변경된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655787261392&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
  display: grid;
   grid-template-columns: 200px 200px 200px 200px 200px;
}

 .wrapper &amp;gt; div {
    height: 100px;
    background: #c4c4c4;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 200px을 5개 지정하게 되면, 세로로 나란히 놓여진 레이아웃이 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 1.53.50.png&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt9vhJ/btrFjXw9LMt/o6d10khkWIphdE4UAXFb71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt9vhJ/btrFjXw9LMt/o6d10khkWIphdE4UAXFb71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt9vhJ/btrFjXw9LMt/o6d10khkWIphdE4UAXFb71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt9vhJ%2FbtrFjXw9LMt%2Fo6d10khkWIphdE4UAXFb71%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;2372&quot; height=&quot;532&quot; data-filename=&quot;스크린샷 2022-06-21 오후 1.53.50.png&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;fr_단위&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout/Basic_concepts_of_grid_layout#fr_%EB%8B%A8%EC%9C%84&quot;&gt;fr 단위&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랙은 모든 종류의 길이&amp;nbsp;단위를 써서 정의할 수 있습니다. 또한, 그리드에는 유연한 크기의 그리드 트랙을 생성하는 데 사용할 수 있는 단위를 추가로 소개하고 있습니다. 새로 소개된&lt;span&gt;&amp;nbsp;&lt;/span&gt;fr&lt;span&gt;&amp;nbsp;&lt;/span&gt;단위는 그리드 컨테이너에 남아 있는 사용 가능한 공간의 일정 비율을 나타냅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1655799041960&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.11.08.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btOI41/btrFoA8QZWF/2qNXx2AZcU8YkqVBEk6EUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btOI41/btrFoA8QZWF/2qNXx2AZcU8YkqVBEk6EUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btOI41/btrFoA8QZWF/2qNXx2AZcU8YkqVBEk6EUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtOI41%2FbtrFoA8QZWF%2F2qNXx2AZcU8YkqVBEk6EUK%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;2880&quot; height=&quot;616&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.11.08.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1fr로 설정하니 이렇게 3개만 가로영역에 width값이 알맞게 지정되어 꽉 찬 것을 볼 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;repeat()_표기법으로_트랙_나열&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout/Basic_concepts_of_grid_layout#repeat()_%ED%91%9C%EA%B8%B0%EB%B2%95%EC%9C%BC%EB%A1%9C_%ED%8A%B8%EB%9E%99_%EB%82%98%EC%97%B4&quot;&gt;repeat()&lt;span&gt;&amp;nbsp;&lt;/span&gt;표기법으로 트랙 나열&lt;/a&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;많은 트랙을 포함하는 커다란 그리드는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;repeat()&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;표기법을 사용하여 트랙의 전체 또는 일부분을 반복해서 나열해 줄 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;위의 예시를 이러한 코드로 바꿀 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655799191885&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과값은 1fr이 3개 있는 것과 동일합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.11.08.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btOI41/btrFoA8QZWF/2qNXx2AZcU8YkqVBEk6EUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btOI41/btrFoA8QZWF/2qNXx2AZcU8YkqVBEk6EUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btOI41/btrFoA8QZWF/2qNXx2AZcU8YkqVBEk6EUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtOI41%2FbtrFoA8QZWF%2F2qNXx2AZcU8YkqVBEk6EUK%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;2880&quot; height=&quot;616&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.11.08.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1655799290082&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.wrapper {
    display: grid;
    grid-template-columns: repeat(5, 1fr 2fr);
  }&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;1fr&lt;span&gt;&amp;nbsp;&lt;/span&gt;크기의 트랙 다음에&lt;span&gt;&amp;nbsp;&lt;/span&gt;2fr&lt;span&gt;&amp;nbsp;&lt;/span&gt;크기 트랙이 위치하고, 이 형태가 5회 반복됩니다.&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.15.10.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkRQ3g/btrFpQCRTaK/FxNjFKKDxCv6FQXNMvquH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkRQ3g/btrFpQCRTaK/FxNjFKKDxCv6FQXNMvquH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkRQ3g/btrFpQCRTaK/FxNjFKKDxCv6FQXNMvquH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkRQ3g%2FbtrFpQCRTaK%2FFxNjFKKDxCv6FQXNMvquH0%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;2880&quot; height=&quot;230&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.15.10.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grid-auto-rows&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;를 사용하여 &lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;높이가 반드시 200픽셀이 되게 할수도 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655799784063&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; .wrapper {
    display: grid;
    grid-template-columns: repeat(5, 1fr 2fr);
    grid-auto-rows: 200px;
  }
  .wrapper &amp;gt; div {
    background: #c4c4c4;
    border: 1px solid #ccc;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.22.38.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHoEMw/btrFmX4KGWK/ON6Tgjmk6xBPvlfPHKWVzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHoEMw/btrFmX4KGWK/ON6Tgjmk6xBPvlfPHKWVzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHoEMw/btrFmX4KGWK/ON6Tgjmk6xBPvlfPHKWVzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHoEMw%2FbtrFmX4KGWK%2FON6Tgjmk6xBPvlfPHKWVzk%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;1548&quot; height=&quot;838&quot; data-filename=&quot;스크린샷 2022-06-21 오후 5.22.38.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 더 많은 자료는 아래 링크에 더 자세히 설명되어 있으니 참고해보시면 좋을 것 같습니다 ~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout/Basic_concepts_of_grid_layout&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout/Basic_concepts_of_grid_layout&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/135</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%83%88%EB%A1%9C%EC%9A%B4-CSS-Flexbox%EB%82%98-Grid%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B8-%EC%A0%81%EC%9D%B4-%EC%9E%88%EB%82%98%EC%9A%94-%EC%9E%88%EB%8B%A4%EB%A9%B4-%EC%84%A4%EB%AA%85%ED%95%B4%EB%B3%B4%EC%84%B8%EC%9A%94#entry135comment</comments>
      <pubDate>Tue, 21 Jun 2022 17:44:59 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.21 TIL 리액트 타입스크립트 적용하여 다크모드 만들기</title>
      <link>https://ryurim.tistory.com/entry/20220620-TIL-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%81%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8B%A4%ED%81%AC%EB%AA%A8%EB%93%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타!입!스크립트!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번쯤 써보고 싶었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Jun-21-2022 11-48-49.gif&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bARByK/btrFkplHDj9/HtKMKCEH9ueHZ1PJkqBmEk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bARByK/btrFkplHDj9/HtKMKCEH9ueHZ1PJkqBmEk/img.gif&quot; data-alt=&quot;타입스크립트로 간단한 다크모드 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bARByK/btrFkplHDj9/HtKMKCEH9ueHZ1PJkqBmEk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bARByK/btrFkplHDj9/HtKMKCEH9ueHZ1PJkqBmEk/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;1062&quot; height=&quot;692&quot; data-filename=&quot;Jun-21-2022 11-48-49.gif&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;타입스크립트로 간단한 다크모드 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 타입스크립트 설치&lt;/p&gt;
&lt;pre id=&quot;code_1655713440196&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn create react-app &quot;앱이름&quot; --template typescript&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_1655713500794&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save typescript @types/node @types/react @types/react-dom @types/jest&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1655713524995&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add typescript @types/node @types/react @types/react-dom @types/jest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 이렇게 타입스크립트로 설정된 채 리액트 앱이 만들어진 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-20 오후 5.34.04.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVeeP2/btrFiaWOY2q/k9t5rGPMdpfFBWFHOiV1oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVeeP2/btrFiaWOY2q/k9t5rGPMdpfFBWFHOiV1oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVeeP2/btrFiaWOY2q/k9t5rGPMdpfFBWFHOiV1oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVeeP2%2FbtrFiaWOY2q%2Fk9t5rGPMdpfFBWFHOiV1oK%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;322&quot; height=&quot;808&quot; data-filename=&quot;스크린샷 2022-06-20 오후 5.34.04.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1655714032076&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add @types/styled-components
yarn add styled-components&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-21 오전 11.50.49.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tGN1c/btrFjX4uEDB/9ynb0cs4nvIIxuHyhNHrLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGN1c/btrFjX4uEDB/9ynb0cs4nvIIxuHyhNHrLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGN1c/btrFjX4uEDB/9ynb0cs4nvIIxuHyhNHrLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGN1c%2FbtrFjX4uEDB%2F9ynb0cs4nvIIxuHyhNHrLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;184&quot; data-filename=&quot;스크린샷 2022-06-21 오전 11.50.49.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 src 안에 style안에 GlobalStyles.ts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;theme.ts를 만들어주었다.&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;GlobalStyles.ts&lt;/p&gt;
&lt;pre id=&quot;code_1655779957812&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { createGlobalStyle } from &quot;styled-components&quot;;

export const GlobalStyle = createGlobalStyle`
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    body,html{
      font-size:16px;
    }
    body {
        background: ${({ theme }: { theme: any }) =&amp;gt; theme.bgColor};
        margin: 0;
        padding: 0;
        transition: all 0.25s linear;
        color: ${({ theme }: { theme: any }) =&amp;gt; theme.textColor};
        box-sizing: border-box;
        font-family: 'Noto Sans KR', sans-serif;
        
    }
    button { 
        cursor: pointer;
        border: none;
        outline: none;
        color: ${({ theme }: { theme: any }) =&amp;gt; theme.bgColor};
        background-color: ${({ theme }: { theme: any }) =&amp;gt; theme.textColor};
    }
`;

export default GlobalStyle;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 theme:any로 타입을 지정해준다.&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;theme.ts&lt;/p&gt;
&lt;pre id=&quot;code_1655779992622&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export const lightTheme = {
  bgColor: &quot;#ffffff&quot;,
  textColor: &quot;#000000&quot;,
  toggleBorder: &quot;#FFF&quot;,
  gradient: &quot;linear-gradient(#39598A, #79D7ED)&quot;,
};

export const darkTheme = {
  bgColor: &quot;#060606&quot;,
  textColor: &quot;#FFFFFF&quot;,
  toggleBorder: &quot;#6B8096&quot;,
  gradient: &quot;linear-gradient(#091236, #1E215D)&quot;,
};

export const theme = {
  lightTheme,
  darkTheme,
};

export default theme;&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;styled.d.ts파일을 하나 생성해서 위의 타입을 지정해준다.&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;styled.d.ts&lt;/p&gt;
&lt;pre id=&quot;code_1655780047958&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import &quot;styled-components&quot;;

declare module &quot;styled-components&quot; {
  export interface DefaultTheme {
    bgColor: string;
    textColor: string;
    toggleBorder: string;
    gradient: string;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1655780077739&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from &quot;react&quot;;
import Home from &quot;./Home&quot;;
import { ThemeProvider } from &quot;styled-components&quot;;
import { lightTheme, darkTheme } from &quot;./style/theme&quot;;
import GlobalStyle from &quot;./style/GlobalStyles&quot;;
import styled from &quot;styled-components&quot;;

function App() {
  const [theme, setTheme] = useState(&quot;light&quot;);

  const isLight = theme === &quot;light&quot;;

  const toggleTheme = () =&amp;gt; {
    if (theme === &quot;light&quot;) {
      setTheme(&quot;dark&quot;);
    } else {
      setTheme(&quot;light&quot;);
    }
  };
  return (
    &amp;lt;React.Fragment&amp;gt;
      &amp;lt;ThemeProvider theme={theme === &quot;light&quot; ? lightTheme : darkTheme}&amp;gt;
        &amp;lt;GlobalStyle /&amp;gt;
        &amp;lt;Home /&amp;gt;

        &amp;lt;Btn onClick={toggleTheme}&amp;gt;{isLight ? &quot;Dark Mode&quot; : &quot;Light Mode&quot;}&amp;lt;/Btn&amp;gt;
      &amp;lt;/ThemeProvider&amp;gt;
    &amp;lt;/React.Fragment&amp;gt;
  );
}
const Btn = styled.button`
  width: 100px;
  position: fixed;
  top: 30px;
  right: 30px;
`;
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Home.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1655780092922&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import styled from &quot;styled-components&quot;;

const Home = () =&amp;gt; {
  return (
    &amp;lt;React.Fragment&amp;gt;
      &amp;lt;Header&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;H1&amp;gt;RYURIM&amp;lt;/H1&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/Header&amp;gt;
      &amp;lt;Section&amp;gt;내용&amp;lt;/Section&amp;gt;
    &amp;lt;/React.Fragment&amp;gt;
  );
};
const Header = styled.header`
  width: 100%;
  height: 70px;
  box-shadow: 0px -2px 50px rgba(0, 0, 0, 0.05);
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  position: fixed;
  top: 0;

  &amp;amp; &amp;gt; div {
    width: 80%;
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
  &amp;amp; &amp;gt; button {
    width: 100px;
  }
`;
const H1 = styled.h1`
  font-size: 1.25rem;
`;
const Section = styled.div`
  width: 100%;
  height: 600px;
  position: relative;
  text-align: center;
  top: 70px;
`;
export default Home;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;props로 타입을 지정해서 내려주는 게 꽤나 어려웠다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 버튼을 그냥 app.tsx에 넣었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 Home 컴포넌트에 넣으려고 했는데 ㅠㅠㅠㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prop를 내려주는 것을 연습해야겠다 !!&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/133</guid>
      <comments>https://ryurim.tistory.com/entry/20220620-TIL-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%81%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8B%A4%ED%81%AC%EB%AA%A8%EB%93%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0#entry133comment</comments>
      <pubDate>Tue, 21 Jun 2022 12:56:29 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.20 TIL 스레드란</title>
      <link>https://ryurim.tistory.com/entry/20220620-TIL-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%9E%80</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로세스가 뭔가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스는 운영체제로부터 자원을 할당받은 작업의 단위이다&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-스레드가-뭔가요&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EC%8A%A4%EB%A0%88%EB%93%9C%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;스레드가 뭔가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로그램 &amp;gt; 프로세스 &amp;gt; 스레드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-프로세스와-스레드는-어떤-차이가-있나요&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%A4-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%82%98%EC%9A%94&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;프로세스와 스레드는 어떤 차이가 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 면접관이 프로세스와 스레드의 차이가 궁금해서 물어볼까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니다. 기본적인 이유는 본문 맨 위에서 언급했듯 지원자가 프로그램, 프로세스, 스레드에 대한 기본 개념에 대해 잘 이해하고 있는지 확인하기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스와 스레드는 개념의 범위부터 다르다. 스레드는 프로세스 안에 포함되어 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 프로그램을 실행하는 순간 해당 파일이 컴퓨터 메모리에 올라가게 되고, 이 동적인 상태의 프로그램을 프로세스라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드는 프로세스를 구성하는 더 작은 실행 단위의 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스는 메모리에 올라갈 때 운영체제로부터 독자적인 시스템 자원을 할당 받는 반면, 스레드는 프로세스 내부에서 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-싱글-스레드와-멀티-스레드&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;싱글 스레드와 멀티 스레드&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bArxY6/btrFjxqW3Ja/Bo6UBT9xsn2PygX6b6PUsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bArxY6/btrFjxqW3Ja/Bo6UBT9xsn2PygX6b6PUsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bArxY6/btrFjxqW3Ja/Bo6UBT9xsn2PygX6b6PUsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbArxY6%2FbtrFjxqW3Ja%2FBo6UBT9xsn2PygX6b6PUsK%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;1280&quot; height=&quot;759&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-싱글-스레드&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;싱글 스레드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 프로세스에서 하나의 스레드 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 레지스터와 스택으로 표현.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-싱글-스레드의-장점&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9E%A5%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;싱글 스레드의 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자원 접근에 대한 동기화를 신경쓰지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러개의 스레드가 공유된 자원을 사용할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며, 이 작업은 프로그래머에게 많은 노력을 요구하고 많은 비용을 발생시킨다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업전환 작업을 요구하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업전환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-싱글-스레드의-단점&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EB%8B%A8%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;싱글 스레드의 단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 CPU를 활용하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나, 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개의 작업을 하나의 스레드로 처리하는 경우와, 두 개의 스레드로 처리하는 경우를 가정했을 때, 후자의 경우는 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행한다. 그래서 동시에 두 작업이 처리되는 것과 같이 느끼게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 오히여 두 개의 스레드로 작업한 시간이 싱글스레드로 작업한 시간보다 더 걸릴 수도 있는데, 그 이유는 스레드 간의 작업전환(context switching)에 시간이 걸리기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 단순히 CPU만을 사용하는 계산작업이라면, 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-멀티-스레드&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;멀티 스레드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 다수의 실행 단위로 나누어 실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 스레드가 고유의 레지스터와 스택으로 표현됨.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-멀티-스레드의-장점&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9E%A5%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;멀티 스레드의 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스의 작업전환보다 스레드의 작업전환이 더 빠르다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-멀티-스레드의-단점&quot; href=&quot;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EB%8B%A8%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;멀티 스레드의 단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 스레딩을 위해 운영체제의 지원이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드 스케쥴링을 신경써야 한다.&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://velog.io/@eunjin/OS-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9D%98%EB%AF%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@eunjin/OS-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9D%98%EB%AF%B8&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/134</guid>
      <comments>https://ryurim.tistory.com/entry/20220620-TIL-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%9E%80#entry134comment</comments>
      <pubDate>Tue, 21 Jun 2022 00:19:30 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.16 TIL ( 웹팩이란 )</title>
      <link>https://ryurim.tistory.com/entry/20220614-TIL-%EC%9B%B9%ED%8C%A9%EC%9D%B4%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;웹팩이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹팩이란 최신 프런트엔드 프레임워크에서 가장 많이 사용되는 모듈 번들러(Module Bundler)입니다.&lt;/li&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;모듈 번들러: 웹 애플리케이션을 구성하는 자원(HTML, CSS, Javscript, Images 등)을 모두 각각의 모듈로 보고 이를 조합해서 병합된 하나의 결과물을 만드는 도구를 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content--모듈이란&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/webpack.md#-%EB%AA%A8%EB%93%88%EC%9D%B4%EB%9E%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;모듈이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈이란 프로그래밍 관점에서 특정 기능을 갖는 작은 코드 단위를 의미합니다. 자바스크립트로 치면 아래와 같은 코드가 모듈입니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;//   math.js

function sum(a, b) {
  return a + b;
}

function substract(a, b) {
  return a - b;
}

const PI = 3.14;

export { sum, substract, PI };&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 math.js 파일은 아래와 같이 3가지 기능을 갖고 있는 모듈입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 숫자의 합을 구하는 sum() 함수&lt;/li&gt;
&lt;li&gt;두 숫자의 차를 구하는 substract() 함수&lt;/li&gt;
&lt;li&gt;원주율 값을 갖는 PI 상수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 성격이 비슷한 기능들을 하나의 의미있는 파일로 관리하면 모듈이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩에서 지칭하는 모듈이라는 개념은 위와 같이 자바스크립트 모듈에만 국한되지 않고 웹 애플리케이션을 구성하는 모든 자원을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션을 제작하려면 HTML, CSS, Javascript, Images, Font 등 많은 파일들이 필요하죠. 이 파일 하나하나가 모두 모듈입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content--모듈-번들링이란&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/webpack.md#-%EB%AA%A8%EB%93%88-%EB%B2%88%EB%93%A4%EB%A7%81%EC%9D%B4%EB%9E%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;모듈 번들링이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 애플리케이션을 구성하는 몇십, 몇백개의 자원들을 하나의 파일로 병합 및 압축 해주는 동작을 모듈 번들링이라고 합니다.&lt;/li&gt;
&lt;li&gt;파일들의 연관된 관계를 파악하여 파일들을 하나의 파일로 압축시켜주는 과정을 번들링 과정이라 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content--웹팩이-등장한-이유-웹팩-사용-시에-이점&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/webpack.md#-%EC%9B%B9%ED%8C%A9%EC%9D%B4-%EB%93%B1%EC%9E%A5%ED%95%9C-%EC%9D%B4%EC%9C%A0-%EC%9B%B9%ED%8C%A9-%EC%82%AC%EC%9A%A9-%EC%8B%9C%EC%97%90-%EC%9D%B4%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;웹팩이 등장한 이유 웹팩 사용 시에 이점&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 단위의 자바스크립트 모듈 관리의 필요성&lt;/li&gt;
&lt;li&gt;웹 개발 작업 자동화 도구&lt;/li&gt;
&lt;li&gt;웹 애플리케이션의 빠른 로딩 속도와 높은 성능&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content--웹-애플리케이션의-빠른-로딩-속도와-높은-성능&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/webpack.md#-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98-%EB%B9%A0%EB%A5%B8-%EB%A1%9C%EB%94%A9-%EC%86%8D%EB%8F%84%EC%99%80-%EB%86%92%EC%9D%80-%EC%84%B1%EB%8A%A5&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;웹 애플리케이션의 빠른 로딩 속도와 높은 성능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 특정 웹 사이트를 접근할 때 5초 이내로 웹 사이트가 표시되지 않으면 대부분의 사용자들은 해당 사이트를 벗어나거나 집중력을 잃게 됩니다.&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;뿐만 아니라 초기 페이지 로딩 속도를 높이기 위해 나중에 필요한 자원들은 나중에 요청하는 레이지 로딩(Lazy Loading)이 등장했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩은 기본적으로 필요한 자원은 미리 로딩하는게 아니라 그 때 그 때 요청하자는 철학을 갖고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩을 통해 모듈을 번들링하면, 해당 파일 들을 하나로 묶기 때문에 적은 HTTP 요청으로도 번들링 된 파일을 불러올 수 있습니다.&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://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/khakaa/prepare_frontend_interview/blob/main/CS.md#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/132</guid>
      <comments>https://ryurim.tistory.com/entry/20220614-TIL-%EC%9B%B9%ED%8C%A9%EC%9D%B4%EB%9E%80#entry132comment</comments>
      <pubDate>Thu, 16 Jun 2022 20:01:19 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.14 TIL ( 이벤트 전파 )</title>
      <link>https://ryurim.tistory.com/entry/20220614-TIL-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%ED%8C%8C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;이벤트 전파&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저에서 요소에 대한 event가 발생하면 해당 요소에 할당된 handler가 동작하게 됩니다.&lt;/li&gt;
&lt;li&gt;handler가 동작하면서 Bubbling과 Capturing이 발생하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/spQ8n/btrEPcNtKDB/Ep7S2Ld36WTRWx4d2khW01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/spQ8n/btrEPcNtKDB/Ep7S2Ld36WTRWx4d2khW01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/spQ8n/btrEPcNtKDB/Ep7S2Ld36WTRWx4d2khW01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FspQ8n%2FbtrEPcNtKDB%2FEp7S2Ld36WTRWx4d2khW01%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;441&quot; height=&quot;546&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;버블링&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;  bubbling은 특정 요소에서 event가 발생했을 때 상위 요소로 event가 전파되는 것을 의미합니다.
  HTML요소는 트리 형식으로 랜딩페이지에서 &amp;lt;Body /&amp;gt;가 최상위 요소가 됩니다. 
  그 밑으로 자식 요소들이 있게 됩니다.
  브라우저는 이벤트를 하위 컴포넌트에서 상위 컴포넌트로 전파시키는 방식을 뜻합니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-캡처링&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/event.md#%EC%BA%A1%EC%B2%98%EB%A7%81&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;캡처링&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;  bubbling은 특정 요소에서 event가 발생했을 때 하위 요소로 event가 전파되는 것을 의미합니다.
  즉, 이벤트가 발생한 element부터 자식들에게 순차적으로 이벤트가 전파되는 방식입니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content--event-중단방법-4가지&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/event.md#-event-%EC%A4%91%EB%8B%A8%EB%B0%A9%EB%B2%95-4%EA%B0%80%EC%A7%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;Event 중단방법 (4가지)&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1️⃣ event.preventDefault()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;event.preventDeafult()는 이벤트의 기본 동작을 중단시킵니다.&lt;/li&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;html의 태그들 중에서 a 태그 같은 경우엔 지정한 링크로 페이지를 이동하는데 이러한 동작을 중단시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;a 태그의 href 속성이 중단되어 페이지 이동이 일어나지 않지만, bubbling이 발생하여 이벤트 전파는 그대로 일어납니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2️⃣ event.stopPropagation()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;event.stopPropagation()은 이벤트 전파를 중단시킵니다.&lt;/li&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;bubbling 이나 capturing을 막아야하는 경우에 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;이벤트 전파가 중단되어 버블링이 발생하지 않지만 target의 기본 동작과 다른 event handler의 동작까지 막아주지는 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;따라서 target에 다른 event handler가 걸려있거나 기본 동작이 있는 경우에는 그대로 동작하게 됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;3️⃣ event.stopImmediatePropagation()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;event.stopImmediatePropagation()은 이벤트 전파를 중단시키고 다른 event handler의 동작도 막아줍니다.&lt;/li&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;따라서 target이 기본 동작을 가지고 있는 경우에 기본 동작만 일어나게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;event.stopImmediatePropagation()은 이벤트 전파를 중단하고 같은 target에 걸린 다른 handler의 동작도 중단시킵니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;4️⃣ return false
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;return false는 onclick handler에 사용했을 경우에 대하여 event.preventDefault()를 사용한 것과 같은 동작을 합니다.&lt;/li&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;따라서 이벤트 전파는 발생하지만 기본 동작은 중단되게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 블로그: &lt;a href=&quot;https://freestrokes.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://freestrokes.tistory.com/134&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/131</guid>
      <comments>https://ryurim.tistory.com/entry/20220614-TIL-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%ED%8C%8C#entry131comment</comments>
      <pubDate>Tue, 14 Jun 2022 21:21:08 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.13 TIL ( 브라우저가 렌더링 되는 과정 )</title>
      <link>https://ryurim.tistory.com/entry/20220613-TIL-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EA%B0%80-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%90%98%EB%8A%94-%EA%B3%BC%EC%A0%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;브라우저가 렌더링 되는 과정&lt;/h2&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 브라우저는 HTML, CSS, JS, 이미지, 폰트 등 리소스를 서버에 요청하고, 응답으로 받아온다.
2. 브라우저 렌더링 엔진은 받아온 HTML, CSS를 파싱해 DOM, CSSOM을 생성하고, 이들을 결합해 렌더 트리를 생성한다.
3. 브라우저 JS 엔진은 받아온 JS를 파싱해 AST를 생성하고, 바이트코드로 변환해 실행한다.
4. 렌더트리를 기반으로 HTML 요소의 레이아웃(위치, 크기)을 계산한다.
5. 화면에 HTML요소를 페인팅한다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-step-1-요청과-응답&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/react/browserRander.md#step-1-%EC%9A%94%EC%B2%AD%EA%B3%BC-%EC%9D%91%EB%8B%B5&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;STEP 1. 요청과 응답&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;브라우저는 우선 필요한 리소스(HTML, CSS, JS, 이미지, 폰트..)를 서버에 요청하고, 응답으로 받아와야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저에 있는 주소창이 그 역할을 한다.&lt;/li&gt;
&lt;li&gt;주소창에 URL을 입력하고 엔터키를 누르면, URL의 호스트 이름이 DNS(도메인 네임 서비스)를 통해 진짜 주소인 IP 주소로 변환되고, 이 IP 주소를 갖는 서버에게 요청을 보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-step-2-html-파싱-dom-생성--css-파싱-cssom-생성--렌더-트리-생성&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/react/browserRander.md#step-2-html-%ED%8C%8C%EC%8B%B1-dom-%EC%83%9D%EC%84%B1--css-%ED%8C%8C%EC%8B%B1-cssom-%EC%83%9D%EC%84%B1--%EB%A0%8C%EB%8D%94-%ED%8A%B8%EB%A6%AC-%EC%83%9D%EC%84%B1&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;STEP 2. HTML 파싱, DOM 생성&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;CSS 파싱, CSSOM 생성&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;렌더 트리 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;오직 텍스트로만 이루어진 HTML문서를 브라우저가 이해할 수 있는 형태인 DOM구조로 변환한다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;  &amp;zwj;  DOM은 Document Object Model의 줄임말인데, 우리말로는 문서 객체 모델이라 할 수 있다. 
  &amp;zwj;  말 그래도 문서를 &amp;rarr; 객체로 바꾼 모델이다. 
  &amp;zwj;  브라우저는 Javascript 언어만 알아듣는데, Javascript는 HTML의 태그나 속성들을 바로 다룰 수 없기 때문이다.
  &amp;zwj;  그렇기에 다룰 수 있는 형태인 '객체'로 바꿔주어야 한다. 
  &amp;zwj;  그래야 브라우저도 HTML 문서를 이해할 수 있게 된다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;앞서 html 파일을 파싱하다가 link, style 태그를 만나면 파싱을 잠시 멈추고 리소스 파일을 서버로 요청한다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;  &amp;zwj;  CSS 파일도 HTML과 마찬가지로 파싱을 한다. 
  &amp;zwj;  서버에서 받아온 2진수 파일을 문자열로 인코딩하고, 토큰 단위로 나누고, 노드를 생성하고, 트리를 만든다.
  &amp;zwj;  이렇게 파싱해 만든 트리는 CSSOM 이라고 한다.
 ❓ CSSOM : CSS Object Model의 줄임말이다. 
 ❓ 즉, CSS 문서를 객체 모델로 바꾼 것
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;서로 다른 속성들을 가진 독립적인 트리들인 DOM과 CSSOM 둘을 합치는 작업이 필요하다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt; &amp;zwj;  렌더 트리는 이름처럼 렌더링을 목적으로 만드는 트리이다. 
 &amp;zwj;  렌더링은 브라우저가 이제 진짜로 사용자에게 보여주기 위한 화면을
그리는 과정이기 때문에, 보이지 않을 요소들은 이 트리에 포함하지 않는다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-step-3-javascript-파싱&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/react/browserRander.md#step-3-javascript-%ED%8C%8C%EC%8B%B1&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;STEP 3. Javascript 파싱&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;Javascript 파싱은 브라우저 렌더링 엔진이 직접하지 않고, Javascript 엔진이 담당하게 된다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt; &amp;zwj;  JS엔진은 js파일의 코드를 파싱해서 컴퓨터가 이해할 수 있는 기계어로 변환하고 실행한다. 
 &amp;zwj;  좀 더 구체적으로 살펴보면, 먼저 단순한 텍스트 문자열인 코드를 토큰 단위로 분해한다. 
 &amp;zwj;  이렇게 분해된 토큰에 문법적인 의미와 구조가 더해져, AST(추상 구문 트리) 라는 트리가 완성된다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-step-4-레이아웃리플로우&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/react/browserRander.md#step-4-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83%EB%A6%AC%ED%94%8C%EB%A1%9C%EC%9A%B0&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;STEP 4. 레이아웃(리플로우)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;레이아웃은 요소의 기하학적인 속성들을 찾는 과정이다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt; &amp;zwj;  브라우저는 각 요소들이 전체 화면에서 어디에, 어떤 크기로 배치되어야 할 지 파악하기 위해 렌더트리의 맨 윗부분부터 아래로 내려가며 계산을 진행한다. 
 &amp;zwj;  모든 값들은 절대적인 단위인 px값으로 변환된다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-step-5-페인팅&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/react/browserRander.md#step-5-%ED%8E%98%EC%9D%B8%ED%8C%85&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;STEP 5. 페인팅&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;각각 정보를 가진 픽셀들이 모여 하나의 이미지, 화면을 구성하는 것이다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt; &amp;zwj;  페인팅은 이러한 픽셀들을 채워나가는 과정이다. 
 &amp;zwj;  따라서 이 과정을 마지막으로 우리는 단순한 텍스트에 불과했던 파일 내용들을 이미지화된 모습으로 브라우저 화면을 통해 볼 수 있게되는 것이다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content--리플로우-리페인트&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/react/browserRander.md#-%EB%A6%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-%EB%A6%AC%ED%8E%98%EC%9D%B8%ED%8A%B8&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;리플로우, 리페인트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리플로우 = 레이아웃 계산을 다시하는 것&lt;/li&gt;
&lt;li&gt;리페인트 = 새로운 렌더트리를 바탕으로 다시 페인트를 하는 것&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/130</guid>
      <comments>https://ryurim.tistory.com/entry/20220613-TIL-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EA%B0%80-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%90%98%EB%8A%94-%EA%B3%BC%EC%A0%95#entry130comment</comments>
      <pubDate>Mon, 13 Jun 2022 20:48:14 +0900</pubDate>
    </item>
    <item>
      <title>2022.06.12 TIL ( 프로토타입 )</title>
      <link>https://ryurim.tistory.com/entry/20220612-TIL-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;프로토타입의 이해&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트는 클래스라는 개념이 없습니다.&lt;/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;프로토타입은 객체를 참조하는 prototype 속성과 객체 멤버인 proto속성이 참조하는 숨은 링크가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content--상속-프로토타입-prototype&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/prototype.md#-%EC%83%81%EC%86%8D-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-prototype&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;상속, 프로토타입 prototype&lt;/h3&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt; &amp;zwj;  콘솔창에 있는 __proto__ 이것을 프로토타입이라고 한다.
 &amp;zwj;  proto 는 생성된 객체(new) 또는 json 객체에 존재한다. 
 &amp;zwj;  즉, 상위 객체를 나타내는 속성이다.
 &amp;zwj;  prototype(__proto__의 type)은 자바스크립트 생성자함수(클래스)에 속성 또는 메소드를 추가할때 사용하는 속성이다. 
 &amp;zwj;  객체생성시 prototype을 통해 정의된 속성 또는 메소드는 new 를 통해 객체생성시 공유한다.
 &amp;zwj;  자바스크립트 객체는 Prototype이라는 내부 프로퍼티가 존재한다.
 &amp;zwj;  거의 모든 객체가 생성 시점에 이 프로퍼티에 null이 아닌 값이 할당된다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;    const user={
        name:&quot;riri&quot;
    }
    user.name // &quot;riri&quot;
    user.hasOwnProperty('name'); // true
    user.hasOwnProperty('age'); // false
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content--함수와-객체의-내부-구조&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/prototype.md#-%ED%95%A8%EC%88%98%EC%99%80-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;함수와 객체의 내부 구조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트에서는 함수를 정의하고, 파싱단계에 들어가면 내부적으로 수행되는 작업이 있습니다.&lt;/li&gt;
&lt;li&gt;함수 멤버로 prototype속성이 있습니다.&lt;/li&gt;
&lt;li&gt;이 속성은 다른 곳에 생성된 함수이름의 프로토타입 객체를 참조합니다.&lt;/li&gt;
&lt;li&gt;프로토타입 객체 멤버인 constructor속성은 함수를 참조하는 내부 구조를 가집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content--프로토타입-객체란&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/prototype.md#-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EA%B0%9D%EC%B2%B4%EB%9E%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;프로토타입 객체란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content--프로토타입이란&quot; href=&quot;https://github.com/ryurim0109/TIL/blob/main/javascript/prototype.md#-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EC%9D%B4%EB%9E%80&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;프로토타입이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트에서 기본 데이터 타입을 제외한 모든 것이 객체입니다.&lt;/li&gt;
&lt;li&gt;객체가 만들어지기 위해서는 자신을 만드는 데 사용된 원형인 프로토타입 객체를 이용하여 객체를 만듭니다.&lt;/li&gt;
&lt;li&gt;이때 만들어진 객체 안에&lt;span&gt;&amp;nbsp;&lt;/span&gt; __proto__(비표준) 속성이 자신을 만들어낸 원형을 의미하는 프로토타입 객체를 참조하는 숨겨진 링크가 있습니다.&lt;/li&gt;
&lt;li&gt;이 숨겨진 링크를 프로토타입이라고 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&lt;a href=&quot;https://www.nextree.co.kr/p7323/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.nextree.co.kr/p7323/&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/129</guid>
      <comments>https://ryurim.tistory.com/entry/20220612-TIL-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85#entry129comment</comments>
      <pubDate>Sun, 12 Jun 2022 21:15:34 +0900</pubDate>
    </item>
    <item>
      <title>[항해99 96일차] 2022.06.10 TIL ( 항해99 수료 후기 )</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-96%EC%9D%BC%EC%B0%A8-20220610-TIL-%08%ED%95%AD%ED%95%B499-%EC%88%98%EB%A3%8C-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오눌은 항해 99를 수료하는날이다 ~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3월초에는 이날이 올까싶었지만, 놀랍게도 엄청 금방와버렸다 !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-10 오후 9.09.19.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnRDV/btrEt1tiM1b/f5ghORT0lUY8LNkZokiAb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnRDV/btrEt1tiM1b/f5ghORT0lUY8LNkZokiAb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnRDV/btrEt1tiM1b/f5ghORT0lUY8LNkZokiAb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrnRDV%2FbtrEt1tiM1b%2Ff5ghORT0lUY8LNkZokiAb1%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;400&quot; height=&quot;846&quot; data-filename=&quot;스크린샷 2022-06-10 오후 9.09.19.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;b&gt;항해를 통해 얻은 것들..&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;96일동안 많은 것을 배웠다. 항해99를 통해 어떻게 구글링하는지 ..를 나 스스로 깨닫고, 강의에 의존한 공부법이 아닌&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기주도적인 공부방법을 익힐 수 있었던 시간인 것 같다 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇보다도 좋은 동료들을 얻은 것 같다 !!!!!!  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-10 오후 8.38.56.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EALv6/btrEtly1Iqa/eZp6hii6uF602qxS9A96nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EALv6/btrEtly1Iqa/eZp6hii6uF602qxS9A96nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EALv6/btrEtly1Iqa/eZp6hii6uF602qxS9A96nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEALv6%2FbtrEtly1Iqa%2FeZp6hii6uF602qxS9A96nK%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;200&quot; height=&quot;604&quot; data-filename=&quot;스크린샷 2022-06-10 오후 8.38.56.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짜짠..나의 누적시간..ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밤을 샌적은 ,,두 세번 정도지만 그 당시엔 밤을 샐 정도로 몰입했고, 그만큼 프로젝트를 완성하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항해99를 통해 많은 프로젝트를 했었는데, 포기하지 않고 매번 제출을 잘했었다. ㅎ_ㅎ&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;월화수목금토 아침9시부터 저녁9시 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨처음 시작엔 어떻게 12시간씩 공부를 할 수 있지 ? 라는 생각이 들었지만 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 9시에 컴퓨터를 끈적은 거의 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 새벽 2시 3시 ?까지 코딩하고 다른 크루원들에게 모르는 건 물어보러다니고, 도와주고 ,,가끔 수다도 떨고 그랬던 것 같다.&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;3개월동안 쉴틈없이 공부했고, 항해를 통해 뭐든지 노력하면 된다..!를 깨닫게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할 수 있을까? 라는 기능들도 해낼 수 있어서 성취감을 얻을 수 있는 시간이었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하며 많은 멘토님들이 피드백해주는 시간도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시간은 소중했던 것 같다 ..ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 내가 뭘 잘못하고 있는지 앞으로 무엇을 해나가야될지 방향성을 잡아주시고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 해결하지 못한 문제들을 함께 고민해주셔서 너무 감사했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 나중에 도움을 줄 수 있는 개발자가 될 수 있도록 매일 매일 노력하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우리반 매니저님은 ㅠㅠ정말 잘 챙겨주셨다..&lt;/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;항해99는 끝났지만, 나는 취업하기전까지 그리고 취업해서도 열심히 개발공부를 해서 꾸준히 성장하고 싶다 !!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무한한 성장을 위해 ㅎㅎ앞으로 항해에서 몸에 익힌 공부습관으로 달려나가겠다 ~~~~~~!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 내 실력에 안주하지 않고 항상 겸손한 마음으로 공부하며 늘~~~~~~~~발전해나가야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/128</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-96%EC%9D%BC%EC%B0%A8-20220610-TIL-%08%ED%95%AD%ED%95%B499-%EC%88%98%EB%A3%8C-%ED%9B%84%EA%B8%B0#entry128comment</comments>
      <pubDate>Fri, 10 Jun 2022 21:18:19 +0900</pubDate>
    </item>
    <item>
      <title>[항해99 95일차] 2022.06.09 TIL ( 모의면접 준비 )</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-95%EC%9D%BC%EC%B0%A8-20220609-TIL-%08%EB%AA%A8%EC%9D%98%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 모의 면접 데이다 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8시에 있는 모의 면접을 위해..1분 자기소개를 준비해야겠다 ~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 쿼리 ? 리덕스 ? 상태관리 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머릿속에서 아직 제대로 정리가 되지 않았다 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  Redux 말고 다른 전역 상태관리 아는 것 하나와 차이점을 말해주세요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  전역상태관리툴 리액트 쿼리&lt;/b&gt;&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;zwj;  React Query의 기능을 간단하게 요약하여 정리해보면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트에서 서버 데이터의 캐시를 관리합니다.&lt;/li&gt;
&lt;li&gt;loading, error state를 관리합니다.&lt;/li&gt;
&lt;li&gt;pagination, infinite scroll도 쉽게 처리할 수 있도록 지원합니다.&lt;/li&gt;
&lt;li&gt;prefetching을 쉽게 처리할 수 있도록 지원합니다.&lt;/li&gt;
&lt;li&gt;error가 발생할 경우 자동으로 재시도합니다.&lt;/li&gt;
&lt;li&gt;request가 성공하거나 실패했을 때 각각 callback을 정의할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 이런 기능들은 React Query를 사용하지 않아도 모두 구현할 수 있기는 합니다. 하지만 React Query는 이 기능들을 모두 내장하고 있어 코드량을 줄일 수 있고 사용하기 편리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; React Query는 클라이언트와 서버의 중간 즈음에 위치하고 있는 듯한 느낌을 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 클라이언트에서 axois 나 ky 등을 이용하여 서버에 데이터를 요청하면 서버에 바로 요청이 전달되는 것이 아니라 React Query가 해당 요청을 관리하는 듯한 느낌을 받았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 데이터가 캐시에 존재한다면 캐시의 데이터를 클라이언트에 전달하고, prefetching을 활용하여 당장 화면에 출력하지 않는 데이터를 관리하기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;client-state-vs-server-state&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  Client state vs. Server state&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  React Query를 사용하려면 몇 가지 중요한 개념을 이해해야 합니다. 그 중 가장 처음에 등장하는 것이&lt;span&gt;&amp;nbsp;&lt;/span&gt;Client state vs Server state&lt;span&gt;&amp;nbsp;&lt;/span&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client state
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에서 받아 온 정보가 아니라 각 client에서만 관리하는 state&lt;/li&gt;
&lt;li&gt;사용자가 선택한 언어, theme 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Server state
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client가 Server에서 받아오는 모든 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; React Query는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Server state만을 관리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 처음에 이 정보를 접했을 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;그럼 Client state를 관리하는 무언가가 필요한거 아닌가?&lt;span&gt;&amp;nbsp;&lt;/span&gt;라고 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 하지만 실제로 사용해보니 Client state를 관리할 필요가 생기는 경우가 극히 드물었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b&gt; 리액트 쿼리 기본 사용법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  yarn 이나 npm 등을 이용하여 react-query 를 설치한 후에 src/component/App/App.tsx 파일에 다음과 같이 기본 코드를 추가합니다.&lt;/p&gt;
&lt;p id=&quot;queryclientprovider&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- &amp;zwj;  QueryClientProvider&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트 쿼리 사용을 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;QueryClientProvider&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 최상단에서 감싸주어야한다.&lt;/li&gt;
&lt;li&gt;쿼리 인스턴스를 생성 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;client={queryClient}&lt;span&gt;&amp;nbsp;&lt;/span&gt;작성해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654772120876&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { QueryClient, QueryClientProvider } from &quot;react-query&quot;;

const queryClient = new QueryClient();

export default function App() {
  return (
    &amp;lt;QueryClientProvider client={queryClient}&amp;gt;
      &amp;lt;Home /&amp;gt;
    &amp;lt;/QueryClientProvider&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;div data-language=&quot;tsx&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-language=&quot;tsx&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 쿼리가 아니라 컨텍스트 api와 리덕스의 차이점을 알야겠다..ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅠㅠ&lt;/p&gt;
&lt;div data-language=&quot;tsx&quot;&gt;참고 블로그:&lt;a href=&quot;https://blog.doitreviews.com/development/2021-08-27-react-query-tutorial-01/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.doitreviews.com/development/2021-08-27-react-query-tutorial-01/&lt;/a&gt;&lt;/div&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/127</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-95%EC%9D%BC%EC%B0%A8-20220609-TIL-%08%EB%AA%A8%EC%9D%98%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84#entry127comment</comments>
      <pubDate>Thu, 9 Jun 2022 20:38:37 +0900</pubDate>
    </item>
    <item>
      <title>[항해99 94일차] 2022.06.08 TIL ( 리액트 왜 사용하시나요 ? )</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-94%EC%9D%BC%EC%B0%A8-20220608-TIL-%08%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EC%8B%9C%EB%82%98%EC%9A%94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리액트를 왜 사용하는지에 대한.. 답들을 정리해보겠다 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;nbsp; 리액트 왜 사용하시나요&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Virtual DOM의 존재합니다. 리액트의 가장 큰 특징 중 하나이기도 합니다. 기존의 DOM은 페이지가 바뀔 때마다,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;새 HTML를 로드하면서 DOM 전체&lt;/b&gt;를 바꾸게 됩니다. Virtual Dom은 React 컴포넌트가 리턴하는 값에 의해 만들어져서 실제 보이고 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DOM과 비교해서 달라진 부분만 찾아내어 바꾸게&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;됩니다. 이러한 Virtual DOM 때문에 React에서 컴포넌트 단위의 개발이 가능하게 됩니다. React Native의 앱 개발 가능합니다. &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;개발을 하다보면 막히는 부분, 오류가 있는 부분이 생깁니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Vue에 비해 사용자가 많고&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;, facebook에서 만들어 계속되는 업데이트와 자료가 굉장히 방대합니다. &lt;/span&gt;&lt;b&gt;컴포넌트는 UI를 구성하는 개별적인 뷰 단위로 서로서,&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;UI 개발을 레고라고 한다면, 컴포넌트는 블록 역할을 하게 됩니다. 이러한 블록을 조립해 하나의 완성품을 만드는 것입니다. 이러한 컴포넌트들을 나눠놨기에 다른 부분, 또 다른 웹에서 재사용이 가능해집니다. 이는 생산성과 유지 보수를 용이하게 합니다. 브라우저 화면상에 보이는 하나하나의 버튼, 탭, 아이콘 등이 모두 컴포넌트라고 보면 됩니다. 이것들이 모여 하나의 뷰(VIEW)를 완성하게 됩니다.&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;zwj;  버츄얼 돔이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  리액트 네이티브로 앱 개발도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  수많은 커뮤니티로 막히는 부분을 찾아볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  공통된 컴포넌트들은 재사용이 용이하여 유지보수하기 딱 좋다.&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;이제 깃허브 TIL에 공부한 것을 꾸준히 더 올리러 가야겠다.&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://github.com/ryurim0109/TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TIL깃헙 &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;&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://gurtn.tistory.com/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gurtn.tistory.com/96&lt;/a&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/126</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-94%EC%9D%BC%EC%B0%A8-20220608-TIL-%08%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EC%8B%9C%EB%82%98%EC%9A%94#entry126comment</comments>
      <pubDate>Wed, 8 Jun 2022 15:24:23 +0900</pubDate>
    </item>
    <item>
      <title>부모에서 자식으로 이벤트상속방법</title>
      <link>https://ryurim.tistory.com/entry/%EB%B6%80%EB%AA%A8%EC%97%90%EC%84%9C-%EC%9E%90%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EC%83%81%EC%86%8D%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  부모에서 자식으로 이벤트상속방법&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;span&gt;&lt;/span&gt;이벤트 캡처링으로 부모에서 자식으로 이벤트를 상속할 수 있습니다. 이벤트 캡처링은 이벤트 버블링과 반대로 상위 요소에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;하위 요소로 탐색하며 이벤트를 전파&lt;/b&gt;하는 방식입니다. (부모 -&amp;gt; 자식)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;event-delegation에-대해-설명하세요&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;event delegation(이벤트 위임)에 대해 설명하세요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  특정 요소 하나하나를 개별적으로 이벤트를 부여하는 것이 아니라, 하나의 부모에 이벤트를 등록하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;부모가 이벤트를 위임하는 방식&lt;/b&gt;을 이벤트 위임이라고 합니다. 이 방법은 동적인 요소들에 대한 처리가 수월하며 이벤트 핸들러를 더 적게 등록해 주기 때문에 메모리도 절약할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;하위 요소에 각각 이벤트를 붙이지 않고 상위 요소에서 하위 요소의 이벤트들을 제어하는 방식입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;면접을 위해 계속 무한 반복이다아아아~!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/125</guid>
      <comments>https://ryurim.tistory.com/entry/%EB%B6%80%EB%AA%A8%EC%97%90%EC%84%9C-%EC%9E%90%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EC%83%81%EC%86%8D%EB%B0%A9%EB%B2%95#entry125comment</comments>
      <pubDate>Wed, 8 Jun 2022 15:15:26 +0900</pubDate>
    </item>
    <item>
      <title>이벤트 버블링이란 / 이벤트버블링을 막는 방법 /이벤트버블링 활용 방법</title>
      <link>https://ryurim.tistory.com/entry/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EC%9D%B4%EB%9E%80-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%B2%84%EB%B8%94%EB%A7%81%EC%9D%84-%EB%A7%89%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%B2%84%EB%B8%94%EB%A7%81-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  이벤트 버블링이란&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;span style=&quot;color: #313130;&quot;&gt;이벤트 버블링은 특정 화면 요소에서 이벤트가 발생했을 때 해당 이벤트가 더 상위의 화면 요소들로 전달되어 가는 특성을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #313130;&quot;&gt;HTML요소는 트리 형식으로 랜딩페이지에서 &amp;lt;Body /&amp;gt;가 최상위 요소가 됩니다. 그 밑으로 자식 요소들이 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #313130;&quot;&gt;브라우저는 이벤트를 하위 컴포넌트에서 상위 컴포넌트로 전파시키는 방식을 뜻합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;이벤트 버블링이란 한 요소에 이벤트가 발생하면 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작하고 최상단의 부모 요소를 만날 때까지 반복되면서 핸들러가 동작하는 현상을 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.20.25.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPvVs/btrEhpUGZVy/RrRhNRHHpjHeMLqTqqr70K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPvVs/btrEhpUGZVy/RrRhNRHHpjHeMLqTqqr70K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPvVs/btrEhpUGZVy/RrRhNRHHpjHeMLqTqqr70K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPvVs%2FbtrEhpUGZVy%2FRrRhNRHHpjHeMLqTqqr70K%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;1600&quot; height=&quot;1228&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.20.25.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  이벤트버블링을&amp;nbsp;막는&amp;nbsp;방법&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;event.stopPropagation()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트의 전파를 원하지 않을 경우 이벤트 객체의 메서드인&amp;nbsp; &amp;nbsp;event.stopPropagation()를 사용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;button&amp;gt;을 클릭해도&lt;span&gt;&amp;nbsp;&lt;/span&gt;body.onclick은 동작하지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1654665300235&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onclick=&quot;alert(`버블링은 여기까지 도달하지 못합니다.`)&quot;&amp;gt;
  &amp;lt;button onclick=&quot;event.stopPropagation()&quot;&amp;gt;클릭해 주세요.&amp;lt;/button&amp;gt;
&amp;lt;/body&amp;gt;&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;div&gt;&lt;b&gt;&lt;span&gt;  event.stopImmediatePropagation()&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  한 요소의 특정 이벤트를 처리하는 핸들러가 여러개인 상황에서, 핸들러 중 하나가 버블링을 멈추더라도 나머지 핸들러는 여전히 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;event.stopPropagation()은 위쪽으로 일어나는 버블링은 막아주지만, 다른 핸들러들이 동작하는 건 막지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;버블링을 멈추고, 요소에 할당된 다른 핸들러의 동작도 막으려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;event.stopImmediatePropagation()을 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이 메서드를 사용하면 요소에 할당된 특정 이벤트를 처리하는 핸들러 모두가 동작하지 않습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;✅ 꼭 필요한 경우를 제외하곤 버블링을 막지 마세요!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;버블링은 유용합니다. 버블링을 꼭 멈춰야 하는 명백한 상황이 아니라면 버블링을 막지 마세요. 아키텍처를 잘 고려해 진짜 막아야 하는 상황에서만 버블링을 막으세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;event.stopPropagation()은 추후에 문제가 될 수 있는 상황을 만들어낼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;b&gt;문제가 발생할만한 시나리오를 살펴봅시다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ 중첩 메뉴를 만들었다 가정합시다. 각 서브메뉴(submenu)에 해당하는 요소에서 클릭 이벤트를 처리하도록 하고, 상위 메뉴의 클릭 이벤트 핸들러는 동작하지 않도록&lt;span&gt;&amp;nbsp;&lt;/span&gt;stopPropagation을 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ 사람들이 페이지에서 어디를 클릭했는지 등의 행동 패턴을 분석하기 위해, window내에서 발생하는 클릭 이벤트 전부를 감지하기로 결정합니다. 분석 시스템을 도입하기로 합니다. 그런데 이런 분석 시스템의 코드는 클릭 이벤트를 감지하기 위해 document.addEventListener('click'&amp;hellip;) 을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;3️⃣ stopPropagation로 버블링을 막아놓은 영역에선 분석 시스템의 코드가 동작하지 않기 때문에, 분석이 제대로 되지 않습니다. 안타깝게도&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;stopPropagation을 사용한 영역은 &lt;b&gt;죽은 영역(dead zone)&lt;/b&gt;이 되어버립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  이벤트 버블링을 막아야 하는 경우는 거의 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;버블링을 막아야 해결되는 문제라면 커스텀 이벤트 등을 사용해 문제를 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &amp;zwj; &lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;핸들러의&lt;span&gt;&amp;nbsp;&lt;/span&gt;event&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체에 데이터를 저장해 다른 핸들러에서 읽을 수 있게 하면, 아래쪽에서 무슨 일이 일어나는지를 부모 요소의 핸들러에게 전달할 수 있으므로, 이 방법으로도 이벤트 버블링을 통제할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &lt;span&gt; 이벤트버블링&amp;nbsp;활용&amp;nbsp;방법&lt;/span&gt;&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;하위 요소에 각각 이벤트를 붙이지 않고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;상위 요소에서 하위 요소의 이벤트들을 제어&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;하는 방식으로 이벤트 버블링을 활용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;이것을 이벤트 위임이라고도 말할 수 있습니다.&amp;nbsp; 이벤트 버블링을 응용하여 &lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;부모 엘리먼트에 리스너를 위임하여 부착하면, 리스너의 개수를 1개로 줄여 최적화할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;span style=&quot;background-color: #ffffff; color: #111827;&quot;&gt;참고 블로그 : &lt;a href=&quot;https://sangjuntech.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sangjuntech.tistory.com/22&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@tlatjdgh3778/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@tlatjdgh3778/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/bubbling-and-capturing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.javascript.info/bubbling-and-capturing&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/124</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EC%9D%B4%EB%9E%80-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%B2%84%EB%B8%94%EB%A7%81%EC%9D%84-%EB%A7%89%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%B2%84%EB%B8%94%EB%A7%81-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95#entry124comment</comments>
      <pubDate>Wed, 8 Jun 2022 11:36:49 +0900</pubDate>
    </item>
    <item>
      <title>메모이제이션이란?</title>
      <link>https://ryurim.tistory.com/entry/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98%EC%9D%B4%EB%9E%80</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  메모이제이션이란?&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  메모이제이션은&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #111827;&quot;&gt;컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술입니다. 동적 계획법의 핵심이 되는 기술입니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  리액트에서 제공하는 메모이제이션 기법은 아래 메소드들을 통해서 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  React.memo(컴포넌트), useCallback(() =&amp;gt; { 함수 그 자체... }, []), useMemo(() =&amp;gt; 함수의 리턴 값, [])&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt; &lt;span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;react의 메소드들은 어떤식으로 메모이제이션을 하고 있을까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  React.memo()는 props의 값으로 변경을 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;zwj;  useCallback()과&amp;nbsp; useMemo()는 dependency 배열 내부의 값으로 변경사항을 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;React.memo()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  컴포넌트 자체를 메모이제이션합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;  &amp;zwj;  &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;자체적으로 props값을 비교&lt;/span&gt;해서 달라진 부분이 없다면 리액트 DOM에서 비교 작업이 들어가지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1654615427539&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;


 const Post = React.memo((props) =&amp;gt; {
   console.log(&quot;in post&quot;);
   return (
     &amp;lt;React.Fragment&amp;gt;
       ...
     &amp;lt;/React.Fragment&amp;gt;
   );
 });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;useCallback()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 함수 자체를 메모이제이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 자바스크립트에서 함수는 객체로 취급되기 때문에 리렌더링이 일어날 때마다 새로운 함수가 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 자식 컴포넌트의 불필요한 리렌더링을 막기 위해선 useCallback()으로 감싸줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;  &amp;zwj; &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;deps에 들어있는 의존성 값&lt;/span&gt;이 변경되지 않는다면 이전에 생성한 함수의 참조 값을 반환해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1654615513934&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const [value, setValue] = useState(0);

const test = useCallback(() =&amp;gt; {
	console.log(value) // 0
	setValue(prevValue =&amp;gt; prevValue +  1)
}, [])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;useMemo()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  함수의 리턴 값을 메모이제이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;  &amp;zwj;  &lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;deps에 들어있는 의존성 값&lt;/b&gt;&lt;/span&gt;이 변경되지 않는다면 메모이제이션 된 값을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;위 함수들의 공통점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; 리렌더링이 자주 일어나지 않는다면 굳이 사용할 필요가 없습니다. (메모리에 불필요하게 남아있을 필요 ❌)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; props나&amp;nbsp; state가 변경되는 경우가 대부분일 경우 굳이 비교 작업이 계속할 필요가 없기 때문에 사용하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj; state나 props의 값이 어느 정도 적당히 변경되는 경우 사용해주면 좋을 것 같습니다.&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/123</guid>
      <comments>https://ryurim.tistory.com/entry/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98%EC%9D%B4%EB%9E%80#entry123comment</comments>
      <pubDate>Wed, 8 Jun 2022 00:26:08 +0900</pubDate>
    </item>
    <item>
      <title>이벤트 위임</title>
      <link>https://ryurim.tistory.com/entry/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  이벤트 위임이란&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;이벤트 버블링을 응용하여 부모 엘리먼트에 리스너를 위임하여 부착하면, 리스너의 개수를 1개로 줄여 최적화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p id=&quot;이벤트-위임의-동작&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;이벤트 위임의 동작&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너에 하나의 핸들러를 할당합니다.&lt;/li&gt;
&lt;li&gt;핸들러의 event.target 을 사용해 이벤트가 발생한 요소가 어디인지 알아냅니다.&lt;/li&gt;
&lt;li&gt;원하는 요소에서 이벤트가 발생했다고 확인되면 이벤트를 핸들링합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;이벤트-위임의-장점&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;이벤트 위임의 장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요소를 추가하거나 제거할 때 해당 요소에 할당된 핸들러를 추가하거나 제거할 필요가 없기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;코드가 짧아집니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;동적인 엘리먼트에 대한 이벤트 처리가 수월하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DOM 수정이 쉬워짐&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 상위 엘리먼트에서만 이벤트 리스너를 관리하기 때문에 하위 엘리먼트는 자유롭게 추가 삭제할 수 있다.&lt;/li&gt;
&lt;li&gt;이벤트 핸들러 관리가 쉽다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 핸들러를 할당하지 않아도 되기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;초기화가 단순해지고 메모리가 절약&lt;/b&gt;됩니다.&lt;/li&gt;
&lt;li&gt;메모리 누수 가능성도 줄어든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;이벤트-위임의-단점&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;이벤트 위임의 단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이벤트 위임을 사용하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이벤트가 반드시 버블링&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;되어야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버블링 되지 않는 일부 이벤트가 존재함.&lt;/li&gt;
&lt;li&gt;낮은 레벨에 할당한 핸들러엔 event.stopPropagation()를 쓸 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컨테이너 수준에 할당된 핸들러가 모든 하위 컨테이너에서 발생하는 이벤트에 응답해야함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 작업 부하가 늘어날 수 있습니다.&lt;/li&gt;
&lt;li&gt;이런 부하는 무시할만한 수준이므로 실제로는 잘 고려하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;리액트에서의-이벤트-위임&quot; data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;리액트에서의 이벤트 위임&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트에서는 자체 이벤트 시스템을 갖고 있어서, 이미 document 최상단에서 이벤트를 잡아 자체적으로 처리(리액트 v16.0)&lt;/li&gt;
&lt;li&gt;참고: 리액트 v17.0에서, 이벤트 리스너를 document에 붙이는 것이 아니라 리액트가 관리하기 시작하는 div에 붙이는 것으로 바뀜.&lt;/li&gt;
&lt;li&gt;이벤트 위임을 통한 성능상의 이득은 없다고 봐도 무방.&lt;/li&gt;
&lt;li&gt;각 돔 노드에 빈 이벤트 리스너가 달려있기는 하지만, iOS 와 사파리 브라우저를 호환하기 위한 대비책.(동작하지 않는 no-op 함수가 똑같이 바인딩되어 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/122</guid>
      <comments>https://ryurim.tistory.com/entry/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84#entry122comment</comments>
      <pubDate>Wed, 8 Jun 2022 00:09:28 +0900</pubDate>
    </item>
    <item>
      <title>SEO란?</title>
      <link>https://ryurim.tistory.com/entry/SEO%EB%9E%80</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  SEO란&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  SEO(Search Engin Optimization: 검색엔진최적화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버나 구글같은 검색 엔진에 뭔가를 검색했을 때, 내가 만든 사이트가 검색 결과에 더 잘 보이게 하기 위한 과정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색을 하면, 검색 엔진이 내 사이트 내용물(메타 태그, html 내용 ...)을 한 번 훑어가고(크롤링), 내용물에 특정한 인덱스 같은 걸 만듭니다. 그리고 이 인덱스 같은걸 검색 결과에 보여줍니다. 검색 엔진 최적화는 검색 엔진이 내 사이트를 크롤링할 때 정보를 더 잘 가져갈 수 있도록 도와주는 과정이기도 합니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEO에서 얘기 하는 것은 구글의 검색엔진이 찾을 수 있고, 이해할 수 있는 사이트를 만들라는 것이다. 그렇게 하기 위해서는 아래의 요건들을 체크해볼 필요가 있습니다.&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;  robots.txt&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  robots.txt파일은 크롤러가 사이트에 요청할 수 있는 페이지/파일과 요청할 수 없는 페이지/파일을 검색엔진 크롤러에 알려 주는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  모바일 친화적인 페이지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &amp;zwj; &lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;반응형으로 개발을 할 때에는 모바일 퍼스트전략으로 진행을 하는 것이 좋습니다. 왜 ? 동일한 환경에서 모바일 퍼스트 전략을 사용하여 개발한 웹 사이트는 그렇지 않은 사이트보다 빨리 로드될 것입니다. (그 차이가 미미할지라도.. 물론 인터넷 속도가 매우 느린 환경에서는 이 차이가 명확하게 보이겠지만,) css는 상위에서부터 css를 읽고, 엘리먼트에 속성을 적용하고, 같은 엘리먼트에 새로운 속성을 적용하는 선택자가 나타나면 명시도 점수를 계산하여 점수가 높거나 점수가 같은 경우에는 하위에 있는 속성이 상위에 있는 속성을 덮어씁니다. 이런 경우 모바일 퍼스트 전략을 사용한 사이트는 데스크탑에서만 필요한 css는 읽지 않게 되므로 받아오는 데이터가 더 적어질 것이고 그만큼 속도가 더 빠를 것입니다. (데스크탑은 데이터 패킷 단위로 금액을 지불하는것도 아니고, 속도 자체도 모바일 환경보다 더 빠르기 때문에 이런 환경을 생각하지 않아도 된다.)&lt;/p&gt;
&lt;h3 id=&quot;3-적절한-meta태그-사용&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  적절한 meta태그 사용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;zwj; &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;meta&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그는 HTML 문서의&lt;span&gt;&amp;nbsp;&lt;/span&gt;head요소 안에 들어간다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;meta태그는 여러가지 정보를 제공할 수 있는데, 데이터의 성격을 정의하거나 문서를 설명하는 정보를 담고 있다.&lt;br /&gt;앞선 포스팅중 HTML tags에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;meta태그에 대해서 작성한 적이 있지만, 다시 한번 설명하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;meta태그는&lt;span&gt;&amp;nbsp;&lt;/span&gt;name과&lt;span&gt;&amp;nbsp;&lt;/span&gt;content특성을 함께 사용해서 문서의 메타데이터를 제공할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;keyword&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 웹페이지의 홍보수단으로 검색 키워드를 지정 가능하며 ,로 구분하여 선언한다.&lt;/li&gt;
&lt;li&gt;subject&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 문서의 제목정보&lt;/li&gt;
&lt;li&gt;description&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 웹페이지 요약 정보, 제작자 정보(autuor), 저작권 정보(copyright)&lt;/li&gt;
&lt;li&gt;author&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 문서의 저작자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의&lt;span&gt;&amp;nbsp;&lt;/span&gt;metatag는 검색결과에 노출되는 내용을 정의하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;사이트맵 파일을 제공&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span&gt;&amp;nbsp;&lt;b&gt;정확한 계층구조가 포함되도록 설계&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;유효한 HTML (시멘틱 마크업)을 사용할 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  올바르고(시맨틱) 오류가 없도록 HTML을 작성한다. HTML과 CSS를 제대로 사용한다면 콘텐츠와 디자인이 분리되므로 페이지를 더 빠르게 렌더링 및 로드할 수 있다. (W3C에서 제공하는 유효성 검사기를 통해서 사이트를 검사하는 것을 추천한다.) 단, 시맨틱한 엘리먼트를 사용하여 HTML을 작성한다고 하여도 색인생성에 큰 영향을 미치지는 않는다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;이미지, 동영상, 구조화 된 데이터에 관한 권장사항을 준수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;이미지-최적화&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  이미지 최적화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 내에 중요한 텍스트 삽입하지 않는다. : 제목과 같은 중요한 요소를 디자인을 위해서 이미지로 만들경우 일부 사용자가 접근하기 어려우며, 번역도구가 작동하지 않으므로 중요한 내용은 이미지가 아닌 텍스트로 작성해야 한다.&lt;/li&gt;
&lt;li&gt;구체적인 제목, 캡션, 파일 이름, 텍스트를 추가한다.&lt;/li&gt;
&lt;li&gt;구체적인 대체 텍스트를 사용한다. : 대체 텍스트를 누락하거나, 유인 키워드를 반복하여 사용하는 것은 좋지 않으며, 정확하고 구체적인 대체 텍스트를 작성하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;구글에서는 CSS 이미지(background)는 색인을 생성하지 않으므로 이미지에 의미가 있는 마크업을 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;동영상-최적화&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &amp;zwj; &lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;동영상 최적화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 노출 : 썸네일 이미지와 동영상 파일의 링크가 반드시 필요하다. (또한 동영상이 사용자가 동영상을 볼 수 있는 공개 페이지에 있어야한다.)&lt;/li&gt;
&lt;li&gt;고급 노출 : 동영상 미리보기, 도영상 길이, 동영상 날짜, 제공업체 정보, 사용자 국가 또는 검색기기에 따른 검색결과 제한 기능 등이 있으면 동영상과 관련된 추가 기능을 제공할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b&gt; &amp;lt;title&amp;gt; / &amp;lt;alt&amp;gt;속성이 구체적이고 명확한지 확인&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;이미지보다-텍스트를-사용하여-콘텐츠를-전달한다&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  이미지보다 텍스트를 사용하여 콘텐츠를 전달한다.&lt;/p&gt;
&lt;p id=&quot;10-etc&quot; 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 id=&quot;페이지-색인-생성-개선하기&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  페이지 색인 생성 개선하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 제목은 짧고 의미있게 만든다.&lt;/li&gt;
&lt;li&gt;페이지의 주제를 전달하는 페이지 제목을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;단순한-url-구조-유지하기&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  단순한 URL 구조 유지하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 사이트의 URL 구조를 최대한 단순하게 유지하고, 콘텐츠를 정리하여 URL을 이해하기 쉬운 방식으로 구성하는 것이 좋다.&lt;/p&gt;
&lt;p id=&quot;브라우저-호환성&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  브라우저 호환성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능한 많은 브라우저에서 테스트를 하고, 각 브라우저에서 동일한 사용자 경험을 얻을 수 있는지 확인해야한다.&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/121</guid>
      <comments>https://ryurim.tistory.com/entry/SEO%EB%9E%80#entry121comment</comments>
      <pubDate>Tue, 7 Jun 2022 23:32:35 +0900</pubDate>
    </item>
    <item>
      <title>Angular와 React의 차이점</title>
      <link>https://ryurim.tistory.com/entry/Angular%EC%99%80-React%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  Angular와&amp;nbsp;React의&amp;nbsp;차이점 &lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Angular란 타입스크립트 기반 오픈소스 프레임 워크이며, 구글 앵귤러 팀이 만들었습니다. 양방향 바인딩이 지원되며 RxJs(Reactive Extensions For JavaScript)로 스트림을 통한 비동기 처리 방식을 지원합니다. 라우팅, 상태관리, 폼 유효성 등 필요한 도구를 모아 놓은 올인원 프레임워크입니다. 리액트보다 배울 것이 많고, 어려운 편으로 러닝커브가 큽니다. 가볍고 빠른 작업을 해야되는 프로젝트보다 큰 프로젝트에 사용하기 적합합니다. 허나 지금은 지원이 중단된 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  리액트는 자바스크립트 라이브러리로 페이스북에서 처음 만들어졌습니다. 버츄얼 돔을 지원하고, 단방향 바인딩이 지원됩니다. SPA방식으로 진행한다면 검색엔진 노출에 관련된 문제를 생각 했을 때 SSR을 염두한 Next.js를 사용하여 해결할 수 있습니다. UI를 구성하는 개별적인 뷰 단위인 컴포넌트 단위로 작성하여 생산성과 유지보수에 도움이 됩니다. JSX(자바스크립트 확장 문법)을 사용하여 컴포넌트를 생성 할 수 있다. React Native를 이용하여 앱 개발까지 가능하게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/120</guid>
      <comments>https://ryurim.tistory.com/entry/Angular%EC%99%80-React%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry120comment</comments>
      <pubDate>Tue, 7 Jun 2022 22:32:19 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트란 ?</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-94%EC%9D%BC%EC%B0%A8-20220608-TIL-%08%EB%A9%B4%EC%A0%91-%EB%8C%80%EB%B9%84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;타입스크립트란&amp;nbsp;&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;자바스크립트에 정적 타입을 부여한 언어입니다. 타입스크립트는 자료형을 명시하는 방식을 지원하고 일반 자바스크립트로 컴파일 됩니다. 대규모의 리펙토링을 할 때 유지보수를 용이하게 할 수 있게 도와주며 자바스크립트를 사용할 때보다 에러는 적어집니다. 자료형이 있는 자바스크립트의 상위 집합이라고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;  상위집합 그게 뭐지 ?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;타입스크립트 파일에 일반 자바스크립트를 작성해도 되며 오류가 발생하지 않음을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; 타입스크립트 동작 과정&lt;/b&gt;❓&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 개발자가 &lt;b&gt;타입스크립트&lt;/b&gt;로 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 작성한 타입스크립트 코드는 &lt;b&gt;타입스크립트 컴파일러&lt;/b&gt;를 통해 파싱하여 &lt;b&gt;타입스크립트 AST코드&lt;/b&gt;로 변환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 타입검사기를 통하여 파싱된 타입스크립트 AST코드의 &lt;b&gt;타입을 체크&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;타입스크립트 AST코드&lt;/b&gt;를 &lt;b&gt;자바스크립트 코드&lt;/b&gt;로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1-4) 과정은 &lt;b&gt;타입스크립트 컴파일러&lt;/b&gt;에 의해 수행 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 자바스크립트 코드를 &lt;b&gt;자바스크립트 AST코드&lt;/b&gt;로 파싱합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 자바스크립트 AST는 &lt;b&gt;바이트 코드&lt;/b&gt;로 변환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 런타임이라는 실행환경에서 바이트 코드를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5-7)과정은 &lt;b&gt;자바스크립트 런타임&lt;/b&gt;에 의해 수행 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☑️ 타입스크립트를 브라우저에서 실행시키려면 자바스크립트 코드로 변환하여 수행되어야 합니다.&lt;/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;span&gt;☑️&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;타입스크립트는 컴파일 단계에서 타입을 검사하여 사전에 오류 발견이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  AST(Abstract Syntax tree): 추상화 문법 트리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  프로그래밍 언어를 컴파일러를 통해 파싱하여 AST의 자료 구조형태의 코드로 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt; &lt;/span&gt;&lt;/b&gt;컴파일러(Complier)이란?&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;-  &amp;zwj; &amp;nbsp;프로그래밍 언어(고급언어)를 컴퓨터가 이해 할 수 있는 기계어로 변환시키는 과정을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;인터프리터(Interpreter)란?&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;-  &amp;zwj; &lt;/span&gt;프로그래밍 언어(고급언어)를 컴파일 변환 없이 바로 사용하는 언어를 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;트랜스 파일러(Transplier)란?&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;-  &amp;zwj; &lt;/span&gt;한 언어로 작성된 소스코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는것을 말한다&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;ex) 바벨 (ES6+ 코드를 ES5로 트랜스 파일한다), Typescript(Type+Javascript -&amp;gt; javascript)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;타입스크립트 특징&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-  &amp;zwj;  타입스크립트는 컴파일 언어이자 &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정적인 타입(Static Type)이다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;자바스크립트에서는 어떤 타입을 반환하는지에 대해 명시하지 않는 동적 타입이였다. 이에 반해 타입스크립트는 컴파일 단계에서 타입을 체크하며, 정적타입으로써 타입에 대해 명시를 하여 발생하는 오류에 대해서 사전에 줄여준다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;[예시] 동적 타입(js)과 정적 타입(ts)의 비교 예시&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// javascript (동적타입)
const sum = (a, b) =&amp;gt; {
    return a + b;
}
sum('10', '20');  // 1020
// or
sum(10, 20); // 30 

// Typescript(정적타입)
const sum = (a: number, b: number) =&amp;gt; {
    return a + b;
}

sum(10, 20); // 30&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;-  &amp;zwj;  객체지향 프로그래밍&lt;/b&gt;을 지원한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;타입스크립트는 ES6에서 새롭게 사용된 문법을 포함하고 있으며 클래스, 인터페이스, 상속, 모듈 등과 같은 객체 지향 프로그래밍 패턴을 제공한다.&lt;/blockquote&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;zwj;  자바스크립트의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;슈퍼셋&lt;/b&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cleRDf/btrEdSWOd9X/1AQP8HzPZIjaVHGDktKmx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cleRDf/btrEdSWOd9X/1AQP8HzPZIjaVHGDktKmx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cleRDf/btrEdSWOd9X/1AQP8HzPZIjaVHGDktKmx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcleRDf%2FbtrEdSWOd9X%2F1AQP8HzPZIjaVHGDktKmx0%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;445&quot; height=&quot;445&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;슈퍼셋은 상위 확장을 말하며, 타입스크립트는 자바스크립트의 모든 기능을 사용 가능하며 이외에 타입스크립트 만의 클래스, 인터페이스등 객체지향 프로그래밍 패턴이 모두 사용 가능한것을 의미한다.&lt;/blockquote&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;b&gt; &lt;b&gt;&lt;span&gt; &amp;nbsp;타입스크립트 기본 자료형&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;boolean : true / false&lt;/li&gt;
&lt;li&gt;number : 10진 16진 2진 8진 리터럴을 지원&lt;/li&gt;
&lt;li&gt;string : 텍스트 형태의 데이터 저장하는 데 사용&lt;/li&gt;
&lt;li&gt;Array : 배열&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1654607357932&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	function ex(arg:Array&amp;lt;{label:string,value:string}&amp;gt;){
    	//작업 수행
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;object : 객체 , 원시 자료형이 아닌 모든 자료형 값&lt;/li&gt;
&lt;li&gt;튜플 : 배열의 원소에 자료형을 정의&lt;/li&gt;
&lt;li&gt;enum : 숫자 집합에 이름을 부여&lt;/li&gt;
&lt;li&gt;any : 특정 변수의 값이 무엇이든 될 수 있음&lt;/li&gt;
&lt;li&gt;void : 자료형이 없음&lt;/li&gt;
&lt;li&gt;null undefined : 유용하지 않음, null 및 undefined값만 할당 할수 있기 때문&lt;/li&gt;
&lt;li&gt;never : 절대 발생하지 않는 값, ex) 항상 오류를 발생시키는 함수 / 반환 아예 하지 않을 때&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발지식</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/119</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-94%EC%9D%BC%EC%B0%A8-20220608-TIL-%08%EB%A9%B4%EC%A0%91-%EB%8C%80%EB%B9%84#entry119comment</comments>
      <pubDate>Tue, 7 Jun 2022 21:40:00 +0900</pubDate>
    </item>
    <item>
      <title>[항해99 92일차] 2022.06.06 TIL ( 지원주차 시작 ~!)</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-92%EC%9D%BC%EC%B0%A8-20220606-TIL-%08%EC%A7%80%EC%9B%90%EC%A3%BC%EC%B0%A8-%EC%8B%9C%EC%9E%91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기나긴 여정도 아니지만, 공부하는데 오랜 시간을 보냈었던 3개월을 끝마침 하는 주차가 다가왔다.&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;지난주 토요일 6월4일에 결혼식이 있던 탓에 ㅠㅠ TIL을 3일 (?)동안 제대로 적지 못하였다. ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다시 시작이닷 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 내가 5주동안 했던 프로젝트를 정리해보겠다 ..!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;메타태그 ver1.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CIMG3/btrD4Vzs9R5/ZpGqQ3vKu8FlxU04a9P1r0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CIMG3/btrD4Vzs9R5/ZpGqQ3vKu8FlxU04a9P1r0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CIMG3/btrD4Vzs9R5/ZpGqQ3vKu8FlxU04a9P1r0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCIMG3%2FbtrD4Vzs9R5%2FZpGqQ3vKu8FlxU04a9P1r0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;400&quot; data-filename=&quot;메타태그 ver1.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;zwj;♀️ 오싹? 어떤 서비스인가요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  오싹은 오피스와 공유 오피스를 지도에서 한눈에 모아볼 수 있는 정보제공 플랫폼입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;zwj;♀️ 오싹에서 어떤 역할을 맡으셨나요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  부리더였습니다. 메인 지도 기능 , 필터 , 무한스크롤 , 전반적인 뷰작업(메인, 지도, 검색리스트, 시작, 마이페이지) , 프로필 수정 ,좋아요 기능, 회원 탈퇴, CI/CD구축, 카카오 로그인, https 배포를 맡았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;nbsp;오싹이 더 궁금하시다면 ?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;깃허브 링크 : &lt;a href=&quot;https://github.com/Ossack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Ossack&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654489869138&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;Ossack&quot; data-og-description=&quot;오피스 정보 제공 웹사이트 프로젝트. Ossack has 3 repositories available. Follow their code on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Ossack&quot; data-og-url=&quot;https://github.com/Ossack&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dLmLUE/hyOFy0r4FT/boCoRUSks9UK3pIeKicju1/img.png?width=146&amp;amp;height=146&amp;amp;face=0_0_146_146,https://scrap.kakaocdn.net/dn/c8hJSG/hyOEeidk64/9WEsl5cx7rASUug6ible4K/img.jpg?width=720&amp;amp;height=390&amp;amp;face=0_0_720_390,https://scrap.kakaocdn.net/dn/C9BND/hyOEaz9OUb/QKWup5jrchzUKy8ECpQ4U1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=0_0_460_460&quot;&gt;&lt;a href=&quot;https://github.com/Ossack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Ossack&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dLmLUE/hyOFy0r4FT/boCoRUSks9UK3pIeKicju1/img.png?width=146&amp;amp;height=146&amp;amp;face=0_0_146_146,https://scrap.kakaocdn.net/dn/c8hJSG/hyOEeidk64/9WEsl5cx7rASUug6ible4K/img.jpg?width=720&amp;amp;height=390&amp;amp;face=0_0_720_390,https://scrap.kakaocdn.net/dn/C9BND/hyOEaz9OUb/QKWup5jrchzUKy8ECpQ4U1/img.jpg?width=460&amp;amp;height=460&amp;amp;face=0_0_460_460');&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;Ossack&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오피스 정보 제공 웹사이트 프로젝트. Ossack has 3 repositories available. Follow their code 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;오싹..하다..&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르고 에러를 만나는 과정은 정말 힘들었지만, 그 과정을 버티고 이겨내고 해결하는 곳에서 오는 성취감이 너무 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;못해결한 문제들은 잠을 잘 때도 생각나고, 해결할 때까지 계속 그 문제만 생각했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이력서도 슬슬 쓰고, 면접준비도 해야되기 때문에 ! 다시 기초적인 원리부터 다시 공부다 !!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;50문 50답&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;/b&gt; &lt;b&gt;상태관리를 왜 할까요? 그리고 평소 state 관리는 어떻게 하시나요❓&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;span style=&quot;color: #191919;&quot;&gt;서로 다른 두 컴포넌트에 같은 데이터가 필요하다고 할 때, 각 컴포넌트가 부모자식 관계로 되어있지 않은 이상, 각 컴포넌트 간의 직접적인 데이터 전달은 어렵다. 데이터를 부모 컴포넌트로 보내고, 다시 그 데이터가 필요한 컴포넌트로 전달해야한다. 하지만 이렇게&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;props driling&lt;/span&gt;이 많아지면 이 props가 어디에서 왔는지 확인하기 정말 어려워진다. 그렇기에 상태관리를 할 때, 리덕스로 관리를 하고 있다. 자식 컴포넌트에게는 props로 데이터를 내려주고, 멀리있는 컴포넌트들은 리덕스 스토어에 저장되어있는 데이터를 꺼내서 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;리액트를 사용하는 이유&amp;nbsp; ❓&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;리액트는 화면의 한 부분을 컴포넌트 라는 단위로 나누어서 관리할 수 있다. 대규모 웹 애플리케이션에서 컴포넌트의 역할과 기능에 따라 따로 관리하기 용이하며, 반복되는 부분을 공통적인 부분으로 분리하여 재사용성을 높여준다. 또 컴포넌트의 화면을 구성한다면 블록 쌓기처럼 컴포넌트를 쌓아서 빠르고 효율적으로 화면을 구성할 수 있다. 잘 만 사용한다면 반복적인 코드를 줄여주고, 더 빠르게 코딩을 할 수 있겠다는 생각으로 사용했다 ! 무엇보다도 이전부터 프론트 엔드 하면 가장 먼저 떠오르는 라이브러리는 리액트였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;Redux가 무엇인가요, 왜 Redux를 사용하시나요&lt;/b&gt; &lt;b&gt;❓&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;리덕스란 전역 상태 저장소이다. (별도로 있는 데이터)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장된 데이터를 App 이 가져다 쓰고, 자식들도 가져다 쓰는 것이다. 부모의 state를 간섭하는 것이 아니라서 유용하게 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;아래로 전달해주기 위해 쓸데없는 데이터를 가지고 있는 props driling을 해결해주기 위해 리덕스를 사용한다.&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: #555555;&quot;&gt;오늘은 여기까지&amp;nbsp; &amp;nbsp;ㅠㅠ결혼식의 여파가 오늘까지당..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;너무 힘들군 ㅠㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;내일부터 다시 빡공이닷!!&lt;/span&gt;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/117</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-92%EC%9D%BC%EC%B0%A8-20220606-TIL-%08%EC%A7%80%EC%9B%90%EC%A3%BC%EC%B0%A8-%EC%8B%9C%EC%9E%91#entry117comment</comments>
      <pubDate>Mon, 6 Jun 2022 20:38:41 +0900</pubDate>
    </item>
    <item>
      <title>[항해99 88일차] 2022.06.02 TIL (자바스크립트 개념 공부 2)</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-88%EC%9D%BC%EC%B0%A8-20220602-TIL-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9C%EB%85%90-%EA%B3%B5%EB%B6%80-2</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; 모던 스크립트 0장 자바스크립트 기초 &lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;07 ) 함수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;함수는 온갖 계산과 작업을 수행하는 데 쓰이는 매우 중요한 도구이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654169492855&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function greet(name){
	console.log(&quot;hello&quot; + name);
};

greet(&quot;ryurim&quot;)
// hello ryurim&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;여기에서 중요한 점은 원시 자료형이 함수에 전달될 때는 참조가 아니라 값의 형태로 전달된다는 점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 해당 값에 대한 변경 사항이 전역적으로 반영되지 않음을 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 원시 자료형이 아닌 객체나 배열을 함수에 전달할 때는 참조로 전달된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(해당 값에 대한 수정 사항이 원래의 객체에 반영된다는 말)&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_1654170571209&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const greet = function greet(name){
	console.log(&quot;hello&quot; + name);
};

greet(&quot;ryurim&quot;)
// hello ryurim&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 함수 표현식을 사용하여 익명함수를 만들 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654170625308&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const greet = function (name){
	console.log(&quot;hello&quot; + name);
};

greet(&quot;ryurim&quot;)
// hello ryurim&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 화살표 함수를 사용하여 선언할 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1654170659976&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const greet = (name)=&amp;gt;{
	console.log(&quot;hello&quot; + name);
};

greet(&quot;ryurim&quot;)
// hello ryurim&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;08 ) 함수 스코프와 this키워드의 이해&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 스코프란 변수에 접근할 수 있는 위치를 제어한다. 전역 스코프를 가지는 변수는 코드의 어느 곳에서나 접근할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 스코프를 가지는 변수는 변수가 선언된 블록 내부에서만 접근할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 &lt;b&gt;블록&lt;/b&gt;은 함수, 루프, 혹은 중괄호로 구분되는 모든 영역을 의미한다.&lt;/p&gt;
&lt;pre id=&quot;code_1654170884975&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myInt = 1;
if(myInt ===1 ){
	let secondInt = 2;
    console.log(secondInt);
    //2
};
 console.log(secondInt);
 //secondInt is not defined&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;&lt;b&gt;this&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654170990557&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const myCar = {
	color:&quot;red&quot;,
    logColor: function(){
    	console.log(this.color);
    },
};
myCar.logColor();
//red&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this의 값은 함수가 호출되는 방식에 따라 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예에서 함수는 객체의 메서드로 호출 되었다. (this키워드가 myCar개체를 참조한다는 것은 자명하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654171290536&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function logThis(){
	console.log(this);
};
logThis();
//window{...}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수는 전역 범위에서 호출했으므로 this값은 window객체를 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트릭트 모드('use strict')로 설정하면 실수로 window객체를 참조하는 것을 방지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄격한 규칙 중에는 전역 객체의 값을 window객체 대신에 undefined로 설정하는 규칙이 있어서, 전역 범위로 정의된 this 키워드의 값도 undefined가 된다.&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;this값을 수종으로 설정하고자 할 때는 .bind()를 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1654171517735&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const myCar = {
	color:&quot;red&quot;,
    logColor: function(){
    	console.log(this.color);
    },
};

const ungetColor = myCar.logColor;
console.log(ungetColor());
//undefined
const getColor = ungetColor.bind(myCar);
//red&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ungetColor를 호출하면 this.color를 찾으려고 하지만, 전역 범위의 this가 호출되기 때문에 그 값은 window객체가 되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 객체에는 color가 없으므로 결과는 undefined 가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.bind()를 사용하면 해결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/116</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-88%EC%9D%BC%EC%B0%A8-20220602-TIL-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9C%EB%85%90-%EA%B3%B5%EB%B6%80-2#entry116comment</comments>
      <pubDate>Thu, 2 Jun 2022 21:08:21 +0900</pubDate>
    </item>
    <item>
      <title>[항해99 87일차] 2022.06.01 TIL (자바스크립트 개념 공부)</title>
      <link>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-87%EC%9D%BC%EC%B0%A8-20220601-TIL-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9C%EB%85%90-%EA%B3%B5%EB%B6%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;대략적으로 프로젝트가 마무리 되고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 혼자 공부중이다. 프로젝트 유지 보수 하면서 자바스크립트 공부하고 이력서를 작성했다. !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모던 자바스크립트를 읽고있는 내용을 조금 정리 해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꾸준히 공부하는 것이 .. 중요하니까 !! 매일 매일 블로그에 정리해야지!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 모던 스크립트 0장 자바스크립트 기초 &lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;01 ) 변수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수는 값을 담기 위한 공간이다. ES6이전에는 var로 변수를 선언했었지만, var는 문제가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘날에는 let const로 변수를 선언한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-01 오후 9.36.54.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WcT2x/btrDLXw2scf/utklW0byjKIFV3pWEFI6h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WcT2x/btrDLXw2scf/utklW0byjKIFV3pWEFI6h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WcT2x/btrDLXw2scf/utklW0byjKIFV3pWEFI6h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWcT2x%2FbtrDLXw2scf%2FutklW0byjKIFV3pWEFI6h1%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;1052&quot; height=&quot;178&quot; data-filename=&quot;스크린샷 2022-06-01 오후 9.36.54.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔창에 const를 재 선언하면 오류가 난다 !!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const로 선언한 변수에는 새 값을 할당할 수 없다.&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;다만, var, let은 변수에 값을 재할당 할 수 있다.&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;var , let , const 모두 다른 소스에서 읽을 수 있는 내용임에도 불구하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;호이스팅&lt;/b&gt;의 대상이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호이스팅이란&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;코드가 실행하기 전 변수선언/함수선언 이 해당 스코프&lt;/span&gt;의&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;최상단으로 끌어 올려진 것 같은 현상을 말한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var 대신 let을 사용해야 하는 이유는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 배운것으로 토대로 이야기해보자면 ,, var TDZ에 없기 때문에 오류 찾는데에 굉장히 어렵기 때문에 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수가 선언될때까지 TDZ에 있는 let을 사용해야 된다.&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;let const의 적절한 사용법이 무엇일까 ?책의 저자는 값을 재할당해야 하는 상황이 아니라면 항상 const를 써야된다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 나중에 코드를 디버그하지 않고 실수로 재할당 하려고 할 때 오류가 발생하므로, 잘못된 변수를 참조했다는 사실을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;02 ) 변수 명명법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수명은 숫자로 시작할 수 없고, 변수명에는 공백 기호 마침표가 들어갈 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 이름을 선택할 때 가장 권장하는 방식은 변수 이름 자체가 변수를 설명할 수 있게 하는 방식이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두문자어, 약어 의미없는 이름은 사용하지말자 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 이름을 짓는 가장 일반적인 두가지 방법으로는 카맬 케이스(camelCase)와 스네이크 케이스(snake_case)가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 중 어느 방식을 쓰든 간에 일관성을 유지하고 선택을 고수하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;03 ) 자료형&lt;/b&gt;&lt;/h4&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;자바스크립트에는 총 7개의 자료형이 있다. 6개는 원시 자료형이고 나머지 하나는 객체다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원시 자료형&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체가 아닌 자료형으로, 매서드를 가지지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String : 문자열 (텍스트 데이터 ex 주소)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;number : 숫자 (숫자로 된 값 , 정수만을 표현하는 자료형은 따로 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null : 널 (값이 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;boolean : 불리언 (참, 거짓)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;undefined : 정의되지 않음 (정의되지 않은 값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;symbol : 심벌 (고유하고 변경할 수 없는 값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;04 ) 객체&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체는 여러 속성의 모음을 저장하는 데 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈객체 생성 하는 방법에는 두 가지가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1654091186617&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const car = new Object();
const car ={};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 방법이 더 일반적으로 사용되는 데 이를 &lt;span style=&quot;color: #ee2323;&quot;&gt;객체 리터럴&lt;/span&gt;이라고도 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;점 표기법을 사용하여 객체 car에 속성을 추가 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654091365482&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;car.color =&quot;red&quot;;
console.log(car)
// {color:&quot;red&quot;}&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_1654091534100&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const car ={
	color:&quot;red&quot;,
    wheels:4,
}

console.log(car['color'])
// red&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;05 ) 객체의 복사&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원시 자료형과는 달리 객체를 복사할 때는 참조 방식이 쓰인다.&lt;/p&gt;
&lt;pre id=&quot;code_1654091760638&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let car ={
	color:&quot;red&quot;,
};

let secondCar = car&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;secondCar는&amp;nbsp;&lt;/b&gt;그 자체로 객체가 아니라 car에 대한 참조, 즉 주소를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;car를 수정하면, secondCar도 수정이 된다.&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;자바스크립트에서 객체의 복사본을 만드는 빠른 방법 중 하나는 Object.assign()을 사용하는 방법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1654091959432&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let car ={
	color:&quot;red&quot;,
};

let secondCar = Object.assign({},car);

car.wheels = 4;

console.log(car);
//{color:&quot;red&quot;, wheels:4}
console.log(secondCar);
//{color:&quot;red&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;06 ) 배열&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체는 키 / 값 쌍에 데이터를 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열은 순서대로 값을 저장하는 객체이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 인덱스는 0부터 시작한다.&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;array.length : 배열의 길이를 확인&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array.push() : 배열의 끝에 새 값을 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array.unshift(): 배열의 시작에 새 값을 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array.pop() : 배열의 끝에서 값 하나를 제거&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array.shift() : 배열의 시작에서 값 하나를 제거&lt;/p&gt;</description>
      <category>TIL/2022 TIL</category>
      <author>dogdogdodo</author>
      <guid isPermaLink="true">https://ryurim.tistory.com/115</guid>
      <comments>https://ryurim.tistory.com/entry/%ED%95%AD%ED%95%B499-87%EC%9D%BC%EC%B0%A8-20220601-TIL-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9C%EB%85%90-%EA%B3%B5%EB%B6%80#entry115comment</comments>
      <pubDate>Wed, 1 Jun 2022 23:03:17 +0900</pubDate>
    </item>
  </channel>
</rss>