<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jiseon-han.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 19 Jun 2022 12:37:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jiseon-han.log</title>
            <url>https://images.velog.io/images/jiseon-han/profile/b992f50c-ac20-4f84-8785-6ba5562f4fa2/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jiseon-han.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jiseon-han" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[크롬 무료 익스텐션]]></title>
            <link>https://velog.io/@jiseon-han/%ED%81%AC%EB%A1%AC-%EB%AC%B4%EB%A3%8C-%EC%9D%B5%EC%8A%A4%ED%85%90%EC%85%98</link>
            <guid>https://velog.io/@jiseon-han/%ED%81%AC%EB%A1%AC-%EB%AC%B4%EB%A3%8C-%EC%9D%B5%EC%8A%A4%ED%85%90%EC%85%98</guid>
            <pubDate>Sun, 19 Jun 2022 12:37:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>니꼬쌤의 <a href="https://youtu.be/QnwMhUlyhkA">무료 익스텐션 TOP 10개 추천한다</a> 에서 추천하는 익스텐션 링크를 모아둔 글입니다.</p>
</blockquote>
<h3 id="colorzilla"><a href="https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=ko">ColorZilla</a></h3>
<p>동일한 색상 코드 추출하는 도구. 클론 코딩 시 유용.
<img src="https://velog.velcdn.com/images/jiseon-han/post/a0f54918-7f64-4154-bb80-81f61dad7b57/image.png" alt=""></p>
<h3 id="momentum"><a href="https://chrome.google.com/webstore/detail/momentum/laookkfknpbbblfpciffpaejjkokdgca?hl=ko">Momentum</a></h3>
<p>새탭 오픈 시 배경 그림 및 시간, 간단한 todo 작성할 수 있는 익스텐션.
<img src="https://velog.velcdn.com/images/jiseon-han/post/1f25a202-e848-4e97-af6e-e10d35a724e1/image.png" alt=""></p>
<h3 id="cssviewer"><a href="https://chrome.google.com/webstore/detail/cssviewer/ggfgijbpiheegefliciemofobhmofgce?hl=ko">CSSViewer</a></h3>
<p>원하는 요소의 css를 볼 수 있음</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/68395fac-8661-4a92-a137-1e646f29540d/image.png" alt=""></p>
<h3 id="jsonviewer"><a href="https://chrome.google.com/webstore/detail/jsonviewer/khbdpaabobknhhlpglenglkkhdmkfnca?hl=ko">JSONViewer</a></h3>
<p>json을 보기 편하게 보여주는 뷰어. REST API 사용 시 유용.</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/d7e6d224-633a-438a-a7f0-47eab894d90a/image.png" alt=""></p>
<h3 id="react-developer-tools"><a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko">React Developer Tools</a></h3>
<p>react를 사용하는 웹사이트에서 어떻게 마운트되고 state, props값 등을 볼 수 있음. <strong>리액트 개발자 필수 도구 ⭐️</strong></p>
<h3 id="whatfont"><a href="https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm?hl=ko">WhatFont</a></h3>
<p>웹사이트에서 사용하는 폰트를 찾아서 알려줌</p>
<h3 id="page-ruler-redux">Page Ruler Redux</h3>
<p> 웹사이트에서 줄자 사용 가능</p>
<h3 id="builtwith-technology-profiler"><a href="https://chrome.google.com/webstore/detail/builtwith-technology-prof/dapjbgnjinbpoindlpdmhochffioedbn?hl=ko">BuiltWith Technology Profiler</a></h3>
<p>웹사이트가 어떤 스택, 플러그인등을 사용하는지 알려줌</p>
<h3 id="altair-graphql-client"><a href="https://chrome.google.com/webstore/detail/altair-graphql-client/flnheeellpciglgpaodhkhmapeljopja?hl=ko">Altair GraphQL Client</a></h3>
<p>GraphQL 개발 시 테스트로 많은 쿼리를 보내야 하거나 할 때 유용.</p>
<h3 id="apollo-client-devtools"><a href="https://chrome.google.com/webstore/detail/apollo-client-devtools/jdkknkkbebbapilgoeccciglkfbmbnfm?hl=ko">Apollo Client Devtools</a></h3>
<p>어플 데이터의 state 알려줌. 캐쉬, 쿼리, 뮤테이션의 정보 확인 가능.
<strong>graph.apollo 개발자라면 설치 필수⭐️</strong></p>
<blockquote>
<p><a href="https://chrome.google.com/webstore/category/extensions?hl=ko">크롬 웹 스토어 바로가기 👉</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹사이트 개발 시 유용한 디자인 무료 툴 5가지]]></title>
            <link>https://velog.io/@jiseon-han/%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B0%9C%EB%B0%9C-%EC%8B%9C-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EB%94%94%EC%9E%90%EC%9D%B8-%EB%AC%B4%EB%A3%8C-%ED%88%B4-5%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@jiseon-han/%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B0%9C%EB%B0%9C-%EC%8B%9C-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EB%94%94%EC%9E%90%EC%9D%B8-%EB%AC%B4%EB%A3%8C-%ED%88%B4-5%EA%B0%80%EC%A7%80</guid>
            <pubDate>Sun, 12 Jun 2022 12:08:25 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>엘리님의 <a href="https://www.youtube.com/watch?v=0Pwxh1XL-Fk">웹사이트, 모바일 앱 디자인 무료 툴 5가지 | 사이드 프로젝트 꿀템 🍯🐝</a>를 정리한 글입니다 :)</p>
</blockquote>
<h1 id="❶-색상-팔레트---color-space">❶ 색상 팔레트 - Color Space</h1>
<p> <a href="https://mycolor.space/">사이트 바로가기 👉</a></p>
<p>색상 컬러 팔레트를 쉽게 만들 수 있는 사이트.
웹사이트의 주요 키 컬러를 입력하면, 컬러 팔레트 추천해줌 👍
<img src="https://velog.velcdn.com/images/jiseon-han/post/afaeed5a-a0db-4700-80fb-6964cd6fcee7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/6b6b4c38-0adb-4fa1-8788-e6801df43387/image.png" alt=""></p>
<h1 id="❷-그레디언트---css-gradient">❷ 그레디언트 - CSS Gradient</h1>
<p> <a href="https://cssgradient.io/">사이트 바로가기 👉</a></p>
<p>원하는 그레디언트를 시각적으로 쉽게 만들고 해당 그레디언트의 코드를 가져올 수 있음</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/8f56be77-66a8-4e48-9202-a81d02d761bc/image.gif" alt=""></p>
<h1 id="❸-꼬불-꼬불-선나누기---shape-divider">❸ 꼬불 꼬불 선나누기 - Shape Divider</h1>
<p> <a href="https://www.shapedivider.app/">사이트 바로가기 👉</a></p>
<p> 비스듬하거나, 꼬불꼬불한 divider svg를 만들어주는 사이트.
 원하는 모양 만든 후 svg를 감싼 html과 css로 복사하거나 svg로 다운로드 가능.
 <img src="https://velog.velcdn.com/images/jiseon-han/post/c2219485-bacc-4a40-9b5c-1b6ac24127bb/image.png" alt=""><img src="https://velog.velcdn.com/images/jiseon-han/post/65413a90-8a76-4286-a82e-3baab954394d/image.png" alt=""></p>
<h1 id="❹-다양한-svg--haikei">❹ 다양한 SVG -Haikei</h1>
<p> <a href="https://haikei.app/">사이트 바로가기 👉</a></p>
<p> 추상적인 모양의 svg, png 다운로드 가능.
 컬러, 방향, 사이즈, shape등 변경 가능.</p>
<p> <img src="https://velog.velcdn.com/images/jiseon-han/post/eb3326b4-c00c-4c1c-b38e-eb0953fc6774/image.png" alt=""></p>
<h1 id="❺-이쁜-배경-이미지---cool-backgrounds">❺ 이쁜 배경 이미지 - Cool Backgrounds</h1>
<p> <a href="https://coolbackgrounds.io/">사이트 바로가기 👉</a></p>
<p> 다양한 모양의 background 이미지 다운로드 가능.</p>
<p> <img src="https://velog.velcdn.com/images/jiseon-han/post/0e78bdab-99bc-4f0b-9819-4d82c518464e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[앞으로 유용할 css ]]></title>
            <link>https://velog.io/@jiseon-han/%EC%95%9E%EC%9C%BC%EB%A1%9C-%EC%9C%A0%EC%9A%A9%ED%95%A0-css</link>
            <guid>https://velog.io/@jiseon-han/%EC%95%9E%EC%9C%BC%EB%A1%9C-%EC%9C%A0%EC%9A%A9%ED%95%A0-css</guid>
            <pubDate>Sun, 29 May 2022 13:09:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>니콜라스쌤의 <a href="https://youtu.be/kkiLBF_YerM">CSS의 미래를 알려드림. feat. 구글 I/O</a>을 보고 정리한 글입니다.</p>
</blockquote>
<h1 id="color-mix">color-mix</h1>
<p>브라우저에서 색상 혼합 기능.
<img src="https://velog.velcdn.com/images/jiseon-han/post/b6387d1f-796f-4fa0-bea8-e1a460c36e63/image.png" alt=""></p>
<p>브랜드 색상으로부터 색상을 도출하는데 유용.
<img src="https://velog.velcdn.com/images/jiseon-han/post/56969fe9-be61-421d-9d9b-fb5df557b033/image.png" alt=""></p>
<h1 id="accent-color">accent-color</h1>
<p>html요소의 색상 변경.
<img src="https://velog.velcdn.com/images/jiseon-han/post/39bdac9e-220c-4e29-963b-427f4e4d5cc0/image.png" alt="">
<img src="https://velog.velcdn.com/images/jiseon-han/post/a63fd387-ce92-44d6-9eb0-1fca1bd037ea/image.gif" alt=""></p>
<h1 id="color-contrast">color-contrast</h1>
<p>브라우저가 생각하는 대비되는 색상 골라줌.</p>
<pre><code class="language-css">.box{
    background-color: red;
    color: color-constrast(red);
}
</code></pre>
<p>기본은 검은색, 흰색중 선택.</p>
<p>원하는 컬러 리스트 중 브라우저가 선택 할 수 있음</p>
<pre><code class="language-css">color: color-constrast(blue vs pink, yellow, green);</code></pre>
<p>-&gt; 배경색상은 blue, pink, yellow, green중 blue와 가장 대비되는 색상 선택</p>
<h1 id="inert">inert</h1>
<p>페이지 섹션을 고정. (html 속성)
inert 속성을 가진 html 요소는 클릭, 포커스 등을 수신하지 않고 멈춤.</p>
<p>사용 예시 )</p>
<ul>
<li>유저가 한번 클릭한 버튼 얼리고 싶을 때</li>
<li>양식 전송 후 유저가 다른 곳 클릭하지 않도록 유도 할 때</li>
</ul>
<pre><code class="language-html">&lt;form inert&gt;
  &lt;input type=&quot;...&quot;/&gt;
  &lt;button&gt; save &lt;/button&gt;
&lt;/form&gt;
</code></pre>
<h1 id="has">:has()</h1>
<p>부모 요소에 특정 자식이 있는지 여부에 따라 부모 요소 스타일 적용.
ex)
<img src="https://velog.velcdn.com/images/jiseon-han/post/88e0557e-a1ed-4820-966b-768b77cbc4f6/image.png" alt=""></p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:has#browser_compatibility">현재(2022.05) 사파리에서만 사용 가능</a></p>
<h1 id="viewport-units">Viewport Units</h1>
<ul>
<li>lvh : 가장 큰 viewport 높이 (네비게이션 없는 화면 크기)</li>
<li>svh : 가장 작은 viewport 높이 (네비게이션이 있는 화면 크기)</li>
<li>dvh : 동적 viewport 높이 (네비게이션 표시 여부에 따라 달라짐)
<img src="https://velog.velcdn.com/images/jiseon-han/post/81498d27-7e17-4939-a2b8-abc769964141/image.png" alt=""></li>
</ul>
<h1 id="nest">@nest</h1>
<p>부모 루틴 안에 자식 루틴 넣어서 짜기</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/903a26c6-07f3-4c8e-8001-939bbac95dc2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/d89cf350-5c56-4a1e-b040-8d2d2cfacd9c/image.png" alt=""></p>
<h1 id="scope">@scope</h1>
<p>스타일 범위를 지정하거나 자신만의 버블로 분리 가능</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/3f9855b9-fc85-4fb0-95ce-bb57f117f872/image.png" alt="테마에 따른 스타일 분리"></p>
<h1 id="container">@container</h1>
<p>전체 페이지의 넓이 혹은 부모 요소에 대응
ex)</p>
<pre><code class="language-css">header{
    container-name : header-container;
}


@container header-container(min-width: 600px){
    nav {
        display: flex;
    }
}
</code></pre>
<p>-&gt; header-container의 최소 너비가 600px 일때 네비게이션의 display 속성은 flex임.</p>
<h1 id="custom-media">@custom-media</h1>
<p>미디어 쿼리 변수를 만들어 재사용 가능</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/41aa69bd-bca1-4c52-b1de-6cb8a86f3ad4/image.png" alt="">
다크모드, 라이트모드, 가로모드, 세로모드등에 대한 변수 만들고</p>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/52c649af-ea38-419c-ba6a-160b8d5dbb9a/image.png" alt=""></p>
<p>미디어 쿼리에서 재사용</p>
<blockquote>
<p>현재 브라우저에 따라 지원하는 기능도 있지만 아직 지원하지 않는 기능들도 있으니 알아만 두는 걸로...⭐️</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker 정리]]></title>
            <link>https://velog.io/@jiseon-han/docker-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jiseon-han/docker-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 22 May 2022 13:16:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>엘리님의 &quot;<a href="https://youtu.be/LXJhA3VWXFA">도커 한방에 정리 🐳 (모든 개발자들이 배워보고 싶어 하는 툴!) + 실습</a>&quot;을 보고 일부 내용을 정리한 내용입니다</p>
</blockquote>
<h1 id="도커란-🐳">도커란? 🐳</h1>
<p>어플리케이션을 패키징 할 수 있는 툴.
어플리케이션을 구동하는데 필요한 모든 것을 도커 컨테이너 안에 담아놨다.</p>
<table>
<thead>
<tr>
<th><img src="https://images.velog.io/images/jiseon-han/post/623b3132-0069-4d1d-91ea-f9a61a0f7f7a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.52.59.png" alt=""></th>
<th><img src="https://images.velog.io/images/jiseon-han/post/ee0f0046-97dc-4606-8dec-2fd485857a52/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.54.31.png" alt=""></th>
</tr>
</thead>
</table>
<h4 id="도커-컨테이너-사용-시-장점👍">도커 컨테이너 사용 시 장점👍</h4>
<ul>
<li>어플리케이션을 구동하기 위한 런타임 환경에 필요한 모든것들을 어떤 pc에서도 언제든지 동일하게 구동 가능</li>
<li>다른 pc에서 버전으로 인한 문제 발생 x</li>
<li>다른 pc 환경 설정 및 변경에 대한 번거로움 줄여줌</li>
</ul>
<h1 id="vm과-도커의-차이🔍">VM과 도커의 차이🔍</h1>
<p><strong>VM</strong></p>
<ul>
<li>무거운 운영체제 포함</li>
<li>시작하는 데 오래걸림</li>
<li>컴퓨터, 운영체제, infrastructure 리소스를 많이 잡아먹을 수 있음</li>
</ul>
<p><strong>👉 차이점</strong></p>
<ul>
<li>vm은 운영체제 포함</li>
<li>도커 컨테이너는 운영체제 미포함</li>
</ul>
<p><img src="https://images.velog.io/images/jiseon-han/post/df47538e-ddc7-46fa-b65e-b4766a3473e4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.04.30.png" alt="vm_vs_container"></p>
<p>컨테이너 구동시 컨테이너 엔진 필요
컨테이너 엔진이 host os에 접근해서 필요한 것들을 처리
컨테이너 엔진 중 가장 많이 사용되는게 &quot;도커&quot;</p>
<h1 id="도커의-3대-구성요소-순서">도커의 3대 구성요소! (순서)</h1>
<blockquote>
<p>도커의 큰그림 : 컨테이너를 만들고, 구동하고 배포한다</p>
</blockquote>
<h2 id="1️⃣-dockerfile">1️⃣ dockerfile</h2>
<p>컨테이너를 어떻게 만들어야 되는지에 대한 설명서</p>
<h4 id="구성-요소">구성 요소</h4>
<ul>
<li>copy files : 어플리케이션을 구동하기 위해 꼭 필요한 파일 종류</li>
<li>install dependencies : 필요한 라이브러리, 프레임워크등 외부 디펜던시 명시</li>
<li>set environment variables : 환경 변수 설정</li>
<li>run setup scripts: 구동하는 스크립트</li>
</ul>
<h2 id="2️⃣-image">2️⃣ image</h2>
<p>실행되고 있는 어플리케이션의 상태를 스냅샷해서 만들어 둔것.</p>
<h2 id="3️⃣-container">3️⃣ container</h2>
<p>캡쳐해둔 이미지를 고립된 환경에서 개별적인 파일 시스템 안에서 실행 할 수 있는것.
컨테이너 안에서 어플리케이션이 동작한다.</p>
<h1 id="도커-이미지-배포하는-과정-🔄">도커 이미지 배포하는 과정 🔄</h1>
<p>깃, 깃허브와 비슷한 관계
<img src="https://images.velog.io/images/jiseon-han/post/142d457f-6eab-46a4-9189-ad79e446bcd4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.22.20.png" alt=""></p>
<h3 id="컨테이너-레지스트리이미지를-공유할-수-있는">컨테이너 레지스트리(이미지를 공유할 수 있는)</h3>
<h4 id="public">public</h4>
<ul>
<li>dockerhub</li>
<li>red hat quary.io</li>
<li>github packages</li>
</ul>
<h4 id="private">private</h4>
<ul>
<li>aws</li>
<li>google cloud</li>
<li>microsoft azure</li>
</ul>
<h2 id="🐳-정리-🐳">🐳 정리 🐳</h2>
<ul>
<li>로컬 머신에 도커 설치</li>
<li>서버에 도커설치</li>
</ul>
<ol>
<li>어플리케이션을 구동하는데 필요한 도커파일 작성</li>
<li>이미지 만들기</li>
<li>컨테이너 레지스트리에 push</li>
<li>server에 pull</li>
<li>컨테이너 실행</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jiseon-han/post/cd897fe1-3989-4b35-ad3b-500b03b97310/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[next.js 스크롤 복원 막기]]></title>
            <link>https://velog.io/@jiseon-han/%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%B3%B5%EC%9B%90-%EB%A7%89%EA%B8%B0</link>
            <guid>https://velog.io/@jiseon-han/%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%B3%B5%EC%9B%90-%EB%A7%89%EA%B8%B0</guid>
            <pubDate>Sun, 15 May 2022 13:38:46 GMT</pubDate>
            <description><![CDATA[<h2 id="이슈🐞">이슈🐞</h2>
<p>구현 중 페이지에서 모달 컴포넌트 닫기 버튼 클릭시 모달이 닫히면서 스크롤이 상단으로 올라가버리는 버그 발생.</p>
<p>항상 발생하는것이 아닌 간헐적으로 발생함. 주로 처음 사이트 접속 후 실행하면 발생하며, 이후 잘 발생안함.</p>
<h3 id="try1">try1</h3>
<p><code>window.history.scrollRestoration = &#39;manual&#39;</code> 을 사용</p>
<pre><code class="language-js">//스크롤 복원 비활성화
if (history.scrollRestoration) {
  window.history.scrollRestoration = &#39;manual&#39;;
}</code></pre>
<blockquote>
<p> <a href="https://blog.coderifleman.com/2016/11/28/scroll-restoration-property-of-history">https://blog.coderifleman.com/2016/11/28/scroll-restoration-property-of-history</a></p>
</blockquote>
<h4 id="🔍-historyscrollrestoration">🔍 History.ScrollRestoration?</h4>
<p>기록 탐색 시 사용할 스크롤 위치 복원 기능의 기본값을 웹에 지정.</p>
<ol>
<li><code>auto</code> : 사용자의 스크롤 위치 장소로 복원</li>
<li><code>manual</code> : 스크롤 복원x. 사용자가 직접 스크롤 해야됨.</li>
</ol>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Web/API/History/scrollRestoration">MDN-ScrollRestoration</a></p>
</blockquote>
<p>→ 적용전보다는 빈도가 줄어든 느낌이나, 가끔씩 계속 발생함.</p>
<hr>
<h3 id="try2">try2</h3>
<h4 id="routerpush의-scroll-옵션-사용">router.push의 scroll 옵션 사용</h4>
<p>router.push 사용시 scroll: false를 설정해서 스크롤 막을 수 있음.</p>
<pre><code class="language-js">router.push(&#39;/url&#39;, undefined, { scroll: false });</code></pre>
<blockquote>
<p><a href="https://stackoverflow.com/questions/65902664/next-js-router-push-without-scrolling-to-the-top">https://stackoverflow.com/questions/65902664/next-js-router-push-without-scrolling-to-the-top</a></p>
</blockquote>
<p>→  근데 이러면 history에 계속 쌓임</p>
<hr>
<h3 id="try3">try3</h3>
<p><code>router.beforePopState()</code> 를 사용</p>
<pre><code class="language-jsx"> router.beforePopState((state) =&gt; {
    state.options.scroll = false
    return true
  })</code></pre>
<blockquote>
<p><a href="https://nextjs.org/docs/api-reference/next/router#routerbeforepopstate">https://nextjs.org/docs/api-reference/next/router#routerbeforepopstate</a>
<a href="https://developer.mozilla.org/en-US/docs/web/api/window/popstate_event">https://developer.mozilla.org/en-US/docs/web/api/window/popstate_event</a></p>
</blockquote>
<p>→ 이후 발생안함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구글링 검색 방법🧚‍♀️]]></title>
            <link>https://velog.io/@jiseon-han/%EA%B5%AC%EA%B8%80%EB%A7%81-%EA%B2%80%EC%83%89-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@jiseon-han/%EA%B5%AC%EA%B8%80%EB%A7%81-%EA%B2%80%EC%83%89-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sat, 07 May 2022 14:24:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>드림코딩 by 엘리님의 &quot;<a href="https://www.youtube.com/watch?v=By_qxt0SZlI">구글링 잘하는법 꿀팁 🍯 (코딩의 시작과 끝은 뭐다? 탁월한 개발자 되는 방법)</a>&quot;을 보고 정리한 글입니다.
영상 보시는걸 추천합니다!👍</p>
</blockquote>
<h1 id="키워드-선별하기">키워드 선별하기</h1>
<p>관련된 예제나 구현코드등을 보고 싶을 때 -&gt; 명확한 키워드로 검색하는것이 좋음</p>
<p>ex) drag and drop 구현시</p>
<div style="background:#eee;padding:2rem;border-radius:0.6rem">
<icon style="opacity:0.7;">🤨</icon><br/>
How can I add drag-and-drop feature to my website

<p><icon style="opacity:0.7;">👍</icon>
implement drag and drop html javascript</p>
</div>

<p>위에보단 아래처럼 검색하는게 더 좋다.</p>
<table>
<thead>
<tr>
<th>검색 방법 1</th>
<th>검색 방법 2</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/jiseon-han/post/ef682d6a-3e1a-4181-90b0-5ac3538ab351/image.png" alt=""></td>
<td><img src="https://velog.velcdn.com/images/jiseon-han/post/baf0a8ee-644d-4d5f-8f65-43bc3f49c9cb/image.png" alt=""></td>
</tr>
</tbody></table>
<h1 id="exact-match">exact match</h1>
<p>에러 메세지 검색 등 정확한 검색어 매칭 시 사용하면 좋음</p>
<p>구글은 단어 하나라도 포함되어있는 기사나 블로그 보여주므로</p>
<p>에러 메세지 전체가 포함된 검색 결과를 얻고 싶을 때 <code>&quot;&quot;</code>붙여서 검색.</p>
<p>ex) docker &quot;mysql exited with code 137&quot;
-&gt; <code>mysql exited with code 137</code> 전부가 포함된 내용만 검색됨</p>
<table>
<thead>
<tr>
<th>exact match 전</th>
<th>exact match 후</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/jiseon-han/post/d2cc761e-4714-412f-8be6-04e835038207/image.png" alt=""></td>
<td><img src="https://velog.velcdn.com/images/jiseon-han/post/48f668eb-e0f6-439c-a47a-626ac85fbec0/image.png" alt=""></td>
</tr>
</tbody></table>
<h1 id="-exclude">-exclude</h1>
<p>특정 키워드 검색 결과에서 제외시키는 기능.
제외할 키워드 앞에 <code>-</code> 붙여서 검색.</p>
<p>ex)
store javascript date object in mysql -php
-&gt; php 제외되고 검색됨.</p>
<h1 id="siteurl">site:url</h1>
<p>특정 url에서 검색하고 싶을 때
<code>site:url 검색어</code> 로 검색</p>
<p>ex)stack overflow에서 만 검색하고 싶을 때</p>
<div style="background:#eee;padding:2rem;border-radius:0.6rem">
  <icon style="opacity:0.7;">🤨</icon><br/>
🔍 detect click outside element in react

<p><icon style="opacity:0.7;">👍</icon>
🔍 site:stackoverflow.com detect click outside element in react</p>
</div>


<h1 id="기간-설정">기간 설정</h1>
<p>특정 기간 전/후로 올라온 내용만 보고 싶을 때</p>
<ul>
<li>before:date : date 날짜 전에 올라온 내용만 검색</li>
<li>after:date : date 날짜 이후 올라온 내용만 검색 </li>
</ul>
<p>ex)
site:stackoverflow.com CSS center a div vertically <span style="background:#BDEEC6;padding:0px 5px;">after:2020</span>
-&gt; 2020년 이후 데이터만 나옴</p>
<p>키워드에 포함 안시키고 검색 후 <code>tools &gt; Any time</code> 날짜 범위 조정 가능
<img src="https://velog.velcdn.com/images/jiseon-han/post/75baeac2-af5e-4a10-9e7a-b6e5d8b121f7/image.png" alt=""></p>
<blockquote>
<p><a href="https://support.google.com/websearch/answer/134479?hl=en">How to search on Google</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 간단 정리 - any, unknown, never]]></title>
            <link>https://velog.io/@jiseon-han/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-any-unknown-never</link>
            <guid>https://velog.io/@jiseon-han/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-any-unknown-never</guid>
            <pubDate>Sun, 27 Feb 2022 14:23:38 GMT</pubDate>
            <description><![CDATA[<h3 id="any">any</h3>
<ul>
<li>타입검사 항상 만족</li>
<li>의도치 않은 사이드 이펙트 발생할 수 있음 (의도치 않은 형 변환이나 전혀 예상하지 못한 의도되지 않은 타입의 값이 대입되는 등)</li>
</ul>
<p>ex)</p>
<pre><code class="language-ts">let a: any;
a = 123; // a에 숫자 할당

let str: string = a; // string = any 이므로 에러 발생하지 않음.

a = {}; //na에 object 할당
const b = a-1 // 에러 발생하지 않음</code></pre>
<h3 id="unknown">unknown</h3>
<ul>
<li>unknown 타입엔 모든 자료 다 집어넣을 수 있음</li>
<li>자료집어넣어도 타입은 그대로 unknown이다.</li>
<li>모든 타입의 공통적인 연산밖에 할 수 없음</li>
</ul>
<pre><code class="language-ts">let a: unknown;
a = 123;

let str: string = a; // 🚨Error. 타입이 지정된 변수에 할당 못함
const b = a-1; // 🚨Error. - 는 number에 대한 연산이므로 안됨.

// 할당하기 위해서는 아래와 같이 타입을 명시필요.
let str2: string = (a as string);</code></pre>
<blockquote>
<p> any와 unknown 차이🤔? 
any는 의도치 않은 사이드 이펙트 발생할 수 있으나 unknown은 최소의 공통적인 연산만 가능하므로 <strong>any 보다 unknown이 좀더 안전한 편</strong></p>
</blockquote>
<h3 id="never">never</h3>
<ul>
<li>모든 타입의 하위 타입</li>
<li>never 타입에는 할당 못함.</li>
</ul>
<pre><code class="language-ts">//1. 함수 반환값 never로 사용하는 경우 : 타입 추론 예외 제거
function throwError(errorMsg: string): never { 
  throw new Error(errorMsg); 
} 



//2. 특정 타입 값을 할당 받지 못하게 할때 : T가 string이면 never를 반환해서 NonString 타입을 사용하는 변수에 string타입이 올 경우 문제를 발생시킴
type NonString&lt;T&gt; = T extends string ? never : T;

const a: NonString&lt;number&gt; = 1 //ok
const b: NonString&lt;boolean&gt; = true // ok
const c: NonString&lt;string&gt; = &#39;1&#39; //🚨Error.
</code></pre>
<blockquote>
<p><a href="https://velog.io/@moonheekim0118/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-any-unknown-%EA%B7%B8%EB%A6%AC%EA%B3%A0-never-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90">[타입스크립트] any, unknown 그리고 never 의 차이점</a>
<a href="https://xo.dev/typescript-unknown-any-never/">TypeScript의 unknown, any 그리고 never</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[typescript 간단 정리 - typeof, keyof, mapped type]]></title>
            <link>https://velog.io/@jiseon-han/typescript-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-Generic</link>
            <guid>https://velog.io/@jiseon-han/typescript-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-Generic</guid>
            <pubDate>Sun, 13 Feb 2022 12:29:59 GMT</pubDate>
            <description><![CDATA[<h2 id="typeof-연산자">typeof 연산자</h2>
<p><code>typeof A</code> → A(변수/함수등)의 type을 반환</p>
<pre><code class="language-ts">let str = &quot;hello&quot;
let str2: typeof str = &quot;hi&quot; 
// === let str2: string =&quot;hi&quot;</code></pre>
<h2 id="keyof-연산자">keyof 연산자</h2>
<p><code>keyof A</code> → A의  모든 프로퍼티의 키값을 union 형태로 반환</p>
<pre><code class="language-tsx">interface Todo {
    id: number
    text: string
}

type Keys = keyof Todo
// === type Keys = &#39;id&#39; | &#39;text&#39;

let a: Keys = &#39;id&#39;
a = &#39;text&#39;
a = &#39;ids&#39; // 🚨ERROR!
a = &#39;id&#39; | &#39;text&#39; // 🚨ERROR!</code></pre>
<h2 id="mapped-type-in-연산자">Mapped Type (in 연산자)</h2>
<p>기존 타입을 새로운 타입으로 변환</p>
<pre><code class="language-ts">type Test = &#39;A&#39; | &#39;B&#39; | &#39;C&#39;
type MappedTest = {
    [key in Test] : number;
}
const data:MappedTest = { A:1, B:2, C:3 }
const data1:MappedTest = { A:1, B:2 } // 🚨ERROR!</code></pre>
<blockquote>
<p><a href="https://itchallenger.tistory.com/170">https://itchallenger.tistory.com/170</a>
<a href="https://medium.com/harrythegreat/typescript-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-7ae8a786fb20">https://medium.com/harrythegreat/typescript-유틸리티-클래스-파헤치기-7ae8a786fb20</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[typescript 간단 정리 - Generic]]></title>
            <link>https://velog.io/@jiseon-han/typescript-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-Generic-z3tbcuoe</link>
            <guid>https://velog.io/@jiseon-han/typescript-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-Generic-z3tbcuoe</guid>
            <pubDate>Sun, 06 Feb 2022 12:31:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>코딩앙마😈 님의 <a href="https://ssocoit.tistory.com/211">6.제네릭</a> 을 보고 정리한 내용입니다.</p>
</blockquote>
<h1 id="generic🤔">Generic🤔?</h1>
<p>선언 시 타입 매개변수로 작성하고, 생성 시점에 타입 결정.
함수, 클래스, 인터페이스에서 사용 가능</p>
<h2 id="함수에서-제네릭">함수에서 제네릭</h2>
<pre><code class="language-ts">// 배열의 사이즈 구하는 함수 정의 시 배열값들의 타입을 다양하게 받고 싶을 경우
function getSize(x : (number| string )[]) : number{
  return x.length;
}
getSize([1,2,3]) // 3
getSize([&#39;a&#39;,&#39;b&#39;]) // 2
getSize([true, false, true]) //🚨ERROR! (boolean 타입 없음)

// -&gt; union type으로 작성하기엔 예외사항 생길때마다 추가해줘야함.
// -&gt; Generic으로 설정하여 생성 시점에 타입 결정

function getSize&lt;T&gt;(x : T[]) : number{
  return x.length;
}
// ** T: 타입 파라미터로, 특정 타입 전달받아 함수에서 사용 가능.
// 커스텀 타입도 설정 가능.

getSize([1,2,3]) // 3
getSize([&#39;a&#39;,&#39;b&#39;]) // 2
getSize([true, false, true]) // 3
</code></pre>
<h2 id="인터페이스-제네릭">인터페이스 제네릭</h2>
<pre><code class="language-ts">interface Mobile&lt;T&gt;{
   name: string;
   price : number;
   option: T;
}

// 생성 시점에 타입 파라미터 
type Option = {color: string, coupon: boolean}
//커스텀 옵션도 가능
const m1: Mobile&lt;Option&gt; = {
    name : &#39;s21&#39;,
      price: 1000,
      option :{ color: &#39;red&#39;, coupon: false}
}

const m2: Mobile&lt;string&gt; = {
    name : &#39;s20&#39;,
      price: 900,
      option :&#39;good&#39;
}
</code></pre>
<h2 id="generic-에-extends-사용하기">generic 에 extends 사용하기</h2>
<pre><code class="language-ts">
interface User{
    name: string
      age: number
}

interface Car{
      name: string
      color: string
}
interface Book {
    price: number
}

const user:User ={name : &#39;a&#39;, age: 10}
const car:Car = {name: &#39;bmw&#39;, color: &#39;red&#39;}
const book:Book = {price:3000}

function showName&lt;T&gt;(data :T) : string{ 
  return data.name;   // 🚨ERROR! T에 name이 있다고 장담할 수 없음
}
showName(user);
showName(car); 


// showName에서 에러가 발생하지 않도록 T를 extends해줌
function showName&lt;T extends {name:string}&gt;(data :T) : string{ 
  return data.name; // 🙆‍♀️
}

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[신기한 HTML 태그 5개]]></title>
            <link>https://velog.io/@jiseon-han/%EC%8B%A0%EA%B8%B0%ED%95%9C-HTML-%ED%83%9C%EA%B7%B8-5%EA%B0%9C</link>
            <guid>https://velog.io/@jiseon-han/%EC%8B%A0%EA%B8%B0%ED%95%9C-HTML-%ED%83%9C%EA%B7%B8-5%EA%B0%9C</guid>
            <pubDate>Mon, 17 Jan 2022 11:45:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>니꼬샘의 <strong>개발자 99%가 모르는 신박한 HTML 태그 5개!</strong> 강의를 보고 정리한 내용입니다.
<a href="https://youtu.be/EMOlLLTAZMs">강의보러가기👉</a></p>
</blockquote>
<h1 id="1-progress--meter">1. progress &amp; meter</h1>
<h2 id="progress">progress</h2>
<pre><code class="language-html">    &lt;progress value=&quot;50&quot; max=&quot;100&quot;&gt;&lt;/progress&gt;</code></pre>
<img width=400 src="https://images.velog.io/images/jiseon-han/post/8dded01d-053a-41ba-86c0-27cdcfa13276/progress_example.mov.gif"/>


<h2 id="meter">meter</h2>
<pre><code class="language-html">&lt;meter value=&quot;10&quot; min=&quot;0&quot; max=&quot;100&quot; low=&quot;20&quot; high=&quot;65&quot; optimum=&quot;15&quot;&gt;&lt;/meter&gt;</code></pre>
<img width="300" src="https://images.velog.io/images/jiseon-han/post/509658c9-fc08-4932-9a82-bf2c99b71979/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.48.49.png"/>

<blockquote>
<p><strong>meter와 progress 차이 ✨</strong>
meter는 속성에 따라 값이 높고 낮을때 색상을 다르게 설정하여 작업의 진행 상태를 표현할 수 있지만, progress는  값의 상태만 전달.</p>
</blockquote>
<h1 id="2-detail--summary">2. detail &amp; summary</h1>
<p>유저의 클릭으로 정보를 보여주고 숨기는 패턴 적용 가능</p>
<pre><code class="language-html">&lt;details&gt;
    &lt;summary&gt;클릭 전 볼 수 있는 영역&lt;/summary&gt;
    &lt;span&gt;클릭 후에만 표시되는 영역&lt;/span&gt;
&lt;/details&gt;</code></pre>
<img width="300" src="https://images.velog.io/images/jiseon-han/post/fbd727d0-cf39-4986-aa21-6b4b05ab5c7d/%E1%84%92%E1%85%AA%E1%84%86%E1%85%A7%E1%86%AB%20%E1%84%80%E1%85%B5%E1%84%85%E1%85%A9%E1%86%A8%202022-01-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.12.42.mov.gif"/>

<blockquote>
<details>
    <summary style="font-style:italic; font-weight: bold; color:#0C6C72">css로 유저의 클릭 여부에 따라 스타일 변경 할 때 🔖</summary>
      <pre>
      details[open]{
        background-color: #cdedfd;
    }
      </pre>
</blockquote>
</details>





<h1 id="3-달력-날짜-선택기">3. 달력, 날짜 선택기</h1>
<p>input 태그의 type으로 설정 가능. 브라우저마다 UI 다름.</p>
<pre><code class="language-html">&lt;input type=&quot;date&quot;/&gt;
&lt;input type=&quot;week&quot;/&gt;
&lt;input type=&quot;month&quot;/&gt;
&lt;input type=&quot;time&quot;/&gt;</code></pre>
<p>type=date 일때 : <input type="date"/>
type=week 일때 : <input type="week"/>
type=month 일때 : <input type="month"/>
type=time 일때 : <input type="time"/></p>
<h1 id="4-picture">4. picture</h1>
<p>유저의 장치나 환경에 따라 각기 다른 버전의 이미지 표시하거나 브라우저가 이미지 포맷 지원하지 않을 때 다른 포맷 제공할 수 있음.
picture태그는 img태그, source 태그와 함께 사용됨.</p>
<blockquote>
<p><strong>장점 💡</strong>
환경에 맞는 이미지를 다운로드 해서 보여줄 수 있으므로, 페이지 로딩 속도를 높일 수 있음.</p>
</blockquote>
<pre><code class="language-html">&lt;picture&gt;
    &lt;source srcset=&quot;src/01.jpeg&quot; media=&quot;(min-width:1200px)&quot;/&gt;
    &lt;source srcset=&quot;src/02.jpeg&quot; media=&quot;(min-width:900px)&quot;/&gt;
    &lt;source srcset=&quot;src/03.jpeg&quot; media=&quot;(min-width:500px)&quot;/&gt;
    &lt;img src=&quot;src/04.jpeg&quot; /&gt;
&lt;/picture&gt;</code></pre>
<ul>
<li>media 사이즈에서 각 해당 이미지 보여줌</li>
<li>img태그는 default 이미지. 브라우저가 picture, source태그 미지원시 사용.</li>
</ul>
<h1 id="5-datalist">5. datalist</h1>
<p>javascript 없이 <strong>auto complete(자동완성)🔥</strong> 사용 가능. 입력에 따른 필터 기능 제공.</p>
<blockquote>
<p><strong>주의사항</strong>
input의 list와 datalist의 id는 동일해야됨</p>
</blockquote>
<pre><code class="language-html">&lt;label for=&quot;movie&quot;&gt;What is your favourite movie?&lt;/label&gt;
&lt;input type=&quot;text&quot; list=&quot;movie-options&quot;/&gt;

&lt;datalist id=&quot;movie-options&quot;&gt;
  &lt;option value=&quot;Dune&quot;/&gt;
  &lt;option value=&quot;Dark waters&quot;/&gt;
  &lt;option value=&quot;The Artist&quot;/&gt;
  &lt;option value=&quot;The Avengers&quot;/&gt;
  &lt;option value=&quot;Iron Man&quot;/&gt;
  &lt;option value=&quot;Iron Man II&quot;/&gt;
  &lt;option value=&quot;Matrix&quot;/&gt;
&lt;/datalist&gt;</code></pre>
<img width=400 src="https://images.velog.io/images/jiseon-han/post/b85ccc6a-8815-4b8e-80a8-dfcba407c8f4/%E1%84%92%E1%85%AA%E1%84%86%E1%85%A7%E1%86%AB%20%E1%84%80%E1%85%B5%E1%84%85%E1%85%A9%E1%86%A8%202022-01-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.03.42.mov.gif"/>
]]></description>
        </item>
        <item>
            <title><![CDATA[vs code 디버깅 사용하기]]></title>
            <link>https://velog.io/@jiseon-han/%EB%94%94%EB%B2%84%EA%B9%85-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@jiseon-han/%EB%94%94%EB%B2%84%EA%B9%85-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 16 Jan 2022 13:16:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>드림코딩 by 엘리님의 <strong>코딩의 시작과 끝, 디버깅 | 실력있는 개발자의 필수 무기 🐛🐞</strong> 강의를 보고 간략하게 정리한 내용입니다. 강의 보시는걸 추천합니다.👍
<a href="https://www.youtube.com/watch?v=IwC-BVM2_YQ&amp;list=RDCMUC_4u-bXaba7yrRz_6x6kb_w&amp;index=27">강의 보러 가기 👉</a></p>
</blockquote>
<h1 id="디버깅이란">디버깅이란?</h1>
<p>현재 상황에서 예상 상황 or 원하는 상황으로의 차이를 좁혀가는 것.
*<em>디버깅에서 가장 중요한것 : 문제를 정의하는 것💥 *</em></p>
<p><img src="https://images.velog.io/images/jiseon-han/post/a4847378-db39-455e-8e9f-b2aac7524a97/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.12.50.png" alt=""></p>
<h1 id="vs-code-디버거-사용법">VS code 디버거 사용법</h1>
<ul>
<li>확인하고 싶은 지점에 break point 설정
<img src="https://images.velog.io/images/jiseon-han/post/56759e2a-e7a7-4e4a-83d6-b5d0475bbc03/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.16.46.png" alt=""></li>
</ul>
<h3 id="메뉴">메뉴</h3>
<ul>
<li><strong>VARIABLES</strong> : 변수 값 확인 가능. 지역, 전역변수로 분리되어있다. _<span style="color: grey;">(더블클릭하여 변수값 수정 가능)</span>_</li>
<li><strong>WATCH</strong> :  확인하고 싶은 변수 혹은 코드를 추가하여 값을 확인할 수 있다._<span style="color: grey;"> (+ 아이콘 선택해서 추가)</span>_</li>
<li>*<em>CALL STACK *</em>: 함수가 어떤 순서로 실행되는지 확인 가능</li>
<li><strong>LOADED SCRIPTS</strong>: 함께 로딩 된 모든 스크립트에 대해 확인 가능</li>
<li><strong>BREAKPOINTS</strong> : 선택한 break point 확인 및 활성화/비활성화 가능</li>
</ul>
<h3 id="액션">액션</h3>
<p><img src="https://images.velog.io/images/jiseon-han/post/a89c85ec-21fa-4039-a5bb-ce2b45eb65bb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.29.40.png" alt=""></p>
<ol>
<li><strong>continue</strong> : 다음 break point로 실행</li>
<li><strong>step over</strong> : 현 지점에서 한줄씩 실행. (함수 실행 시 함수 안의 동작 확인하지 않음)</li>
<li><strong>step into</strong> : 정의한 함수 안의 동작 실행 시</li>
<li><strong>step out</strong>: 함수 바깥으로 이동 시</li>
<li><strong>restart</strong>: 재시작</li>
<li><strong>stop</strong> : 디버거 중지</li>
</ol>
<h1 id="꿀팁">꿀팁</h1>
<h3 id="특정-조건에-만족할-때만-break-point-실행하는-방법">특정 조건에 만족할 때만 break point 실행하는 방법</h3>
<p>break point 마우스 우클릭 &gt; Edit break point... &gt; 조건 입력
<img src="https://images.velog.io/images/jiseon-han/post/1fe6c7a1-d11c-40f3-b45c-38b9a7ac9739/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.53.51.png" alt="i가 5일때 멈추기"></p>
<blockquote>
<p>조건뿐 아니라, 로그도 확인할 수 있음.
Edit break point 실행시 <code>Expression</code>, <code>Hit count</code>, <code>Log Message</code> 중 원하는 조건 선택하여 적용하면됨.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 함수 표현식과 함수 선언 간단 비교]]></title>
            <link>https://velog.io/@jiseon-han/JS-%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9D%EA%B3%BC-%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8</link>
            <guid>https://velog.io/@jiseon-han/JS-%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9D%EA%B3%BC-%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8</guid>
            <pubDate>Sun, 09 Jan 2022 10:58:55 GMT</pubDate>
            <description><![CDATA[<p><code>function a() {}</code>와 <code>var a = function(){}</code>의 차이는 무엇인가?</p>
<h1 id="함수-표현식">함수 표현식</h1>
<pre><code class="language-js">var a = function(){
    //...
}
//화살표 함수로도 표현 가능
var a = () =&gt; {
    //...
}</code></pre>
<ul>
<li>해당 라인에 도달할 때만 정의됨.</li>
<li>함수 선언과 다르게 호이스팅 되지 않음.</li>
</ul>
<h1 id="함수-선언">함수 선언</h1>
<pre><code class="language-js">function a() {
    //...
}
</code></pre>
<ul>
<li>함수 선언은 그 선언을 둘러싼 함수의 최상부나 저역 범위로 끌어올려짐(호이스팅).</li>
</ul>
<h1 id="함수-표현식과-함수-선언-차이">함수 표현식과 함수 선언 차이</h1>
<ul>
<li>함수 표현식은 호이스팅되지 않고 함수 선언은 호이스팅 된다.</li>
</ul>
<pre><code class="language-js">// TypeError: a is not a function
a();

var a = function(){
    console.log(&#39;aaa&#39;);
}
![](https://images.velog.io/images/jiseon-han/post/c1c3c3a3-849e-48c1-899e-0b7e44dbe53c/image.png)
//outputs: bbb
b();

function b() {
    console.log(&#39;bbb&#39;);
}
</code></pre>
<p><img src="https://images.velog.io/images/jiseon-han/post/7a35c49a-b8fb-487f-83df-3a82adbbed2e/image.png" alt="함수표현식">
<img src="https://images.velog.io/images/jiseon-han/post/85357b66-1fa5-4173-a1c3-43d0f1b69bb3/image.png" alt="함수 선언"></p>
<blockquote>
<p>🔖 <strong>참고</strong>
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/function">MDN 함수 표현식</a>
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/function">MDN 함수 선언</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[콘솔 로그 활용하기]]></title>
            <link>https://velog.io/@jiseon-han/%EC%BD%98%EC%86%94-%EB%A1%9C%EA%B7%B8-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jiseon-han/%EC%BD%98%EC%86%94-%EB%A1%9C%EA%B7%B8-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 02 Jan 2022 08:39:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>엘리님의 &quot;콘솔 로그 제대로 쓰고 있을까? 🤔&quot; 강의 내용을 정리한 페이지입니다.
<a href="https://youtu.be/KxsVV5jbJe4">강의 보러 가기🔖</a></p>
</blockquote>
<h1 id="log-level">log level</h1>
<h2 id="consoleloglog">console.log(&#39;log&#39;)</h2>
<ul>
<li>가로 안의 값을 출력할 때 사용</li>
<li>개발단계에서 주로 사용된다.</li>
<li>배포 시 왠만하면 삭제</li>
</ul>
<h2 id="consoleinfoinfo">console.info(&#39;info&#39;)</h2>
<ul>
<li>특정 정보 출력 시 사용</li>
<li>배포 시 왠만하면 삭제(정말 필요한 정보는 남겨둘 수 있음)</li>
</ul>
<h2 id="consolewranwran">console.wran(&#39;wran&#39;)</h2>
<ul>
<li>경보 단계에서 사용</li>
</ul>
<h2 id="consoleerrorerror">console.error(&#39;error&#39;)</h2>
<ul>
<li>예상하지 못한 에러, 시스템 에러 등을 출력 시 사용</li>
</ul>
<p style="color:#aaa">[브라우저에서 실행 결과]</p>

<p><img src="https://images.velog.io/images/jiseon-han/post/173b9959-7253-46c1-a488-6b6a4961dcdb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.06.49.png" alt="브라우저 실행 결과"></p>
<blockquote>
<p><strong>log level로 구분해서 사용하는 이유💡</strong>
log, info의 경우 배포 시 출력하지 않거나, 로그 파일로 남겨두지 않는등 설정할 수 있고, wraning, error의 경우에만 어떤 특별한 동작을 하도록 만들 수 있기 때문에 레벨에 따라 정확한 함수 사용하는것이 좋음.</p>
</blockquote>
<h1 id="유용한-console-함수">유용한 console 함수</h1>
<h2 id="assert">assert</h2>
<p>특별한 조건이 거짓일 때만 출력할 수 있도록 하는 함수</p>
<pre><code class="language-js">console.assert(2===3, &#39;not same!&#39;);
console.assert(2===2, &#39;same!&#39;);

//result
&gt; Assertion failed: not same!</code></pre>
<p><img src="https://images.velog.io/images/jiseon-han/post/7dd55bdb-9205-4ca2-9229-d948a26f2da4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.08.21.png" alt="브라우저 실행 결과"></p>
<h2 id="pring-object">pring object</h2>
<p>object에 대해 가독성 있게 출력하는 방법 3가지</p>
<pre><code class="language-js">const dog = {type: &#39;🐶&#39;, name : &#39;츄츄&#39;, owner :{name : &#39;ellie&#39;}};

console.log(dog);
console.table(dog);
console.dir(dog, {colors: false, depth: 0});</code></pre>
<p><img src="https://images.velog.io/images/jiseon-han/post/a46fb1d5-3c5e-4928-bfc1-caa87024e41e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.21.58.png" alt="node에서 실행 결과"> </p>
<ul>
<li><code>table</code>로 출력시 가독성 있게 출력 가능</li>
<li><code>dir</code> 출력 시 깊이 있게 중첩된 오브젝트 표현 상세 조절 시 사용 가능 <em>(옵션값으로 데이터 보여줄 지 여부 줄 수 있음)</em></li>
</ul>
<blockquote>
<p><strong>❓ 크롬 브라우저</strong><em>-버전 96.0.4664.110(공식 빌드) (arm64)-</em><strong>로 실행 시 dir의 옵션값 동작이 다름</strong>
<img src="https://images.velog.io/images/jiseon-han/post/0adb6cc2-f78f-49b0-a380-f64c3e1d8956/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.44.45.png" alt="크롬 브라우저에서 실행 결과"></p>
</blockquote>
<h2 id="measuring-time">measuring time</h2>
<p>내가 작성한 코드를 실행하는데 얼마나 시간이 걸렸는지 측정할 때 사용</p>
<pre><code class="language-js">console.time(&#39;for loop&#39;);
for(let i = 0; i &lt;10 ; i++) {
  i++;
}
console.timeEnd(&#39;for loop&#39;);</code></pre>
<p><img src="https://images.velog.io/images/jiseon-han/post/934dd249-9995-4e64-836d-3020262b37d5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.31.27.png" alt="실행 결과"></p>
<h2 id="counting">counting</h2>
<p>특정한 함수가 몇번 실행되었는지 알고 싶을 때</p>
<pre><code class="language-js">//🙅‍♀️ : 특정 변수 만들어야됨
let count = 0;
function a(){ count++;}
a();
a();
a();
console.log(`함수는 ${count}번 실행됨`);

// 🙆‍♀️
function a(){ 
    console.count(&#39;a function&#39;)
}
a();
a();
console.countReset(&#39;a function&#39;); // count 초기화
a();</code></pre>
<p><img src="https://images.velog.io/images/jiseon-han/post/28459c37-b458-44fa-a34e-9f81b4b344cb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.33.33.png" alt="counting 실행 결과"></p>
<h2 id="trace">trace</h2>
<p>해당 함수가 어디서 호출되었는지 알 수 있음.
이벤트 리스너, 비동기적 수행된 함수등에서 어디에서 누가 호출했는지 알고싶을 때 유용</p>
<pre><code class="language-js">function f1() {
    f2();
}
function f2() {
    f3();
}
function f3() {
      console.trace();
    console.log(&#39;hi :)&#39;);
}

f1();</code></pre>
<p><img src="https://images.velog.io/images/jiseon-han/post/0683561b-12c1-41db-b181-c93f7b321420/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.35.47.png" alt="실행 결과"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<script> 태그 위치]]></title>
            <link>https://velog.io/@jiseon-han/script-%ED%83%9C%EA%B7%B8-%EC%9C%84%EC%B9%98</link>
            <guid>https://velog.io/@jiseon-han/script-%ED%83%9C%EA%B7%B8-%EC%9C%84%EC%B9%98</guid>
            <pubDate>Sat, 25 Dec 2021 15:08:21 GMT</pubDate>
            <description><![CDATA[<h4 id="1-head-태그에-위치한다">1. <code>&lt;head/&gt;</code> 태그에 위치한다.</h4>
<p>ex)</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  ...
  &lt;script src=&quot;index.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  ...
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>장점) 웹사이트가 완벽한 형태로 보여짐.
<strong>단점) script 파일이 dom을 조작한다면 문제가 발생할 수 있다.</strong></p>
<blockquote>
<p><strong>why🤔?</strong>
html 파싱중 script태그 만날경우 파싱을 멈추고 script의 다운 및 실행 후 html 파싱을 이어서 진행하므로 존재하지 않는 DOM요소에 접근하게 될 수 있음.</p>
</blockquote>
<p>또한, script 파일이 크고 무거울 경우 파일을 다운로드 및 실행하는 HTML 파싱을 하단 만 상태를 보여주고 있으므로 ux에 안좋다.</p>
<h4 id="2-body-태그에-위치한다">2. <code>&lt;body/&gt;</code> 태그에 위치한다.</h4>
<p>ex)</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  ...
&lt;/head&gt;
&lt;body&gt;
  ...
  &lt;script src=&quot;index.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>장점) HTML 파싱 중단으로 인해 발생되는 문제는 해결.
<strong>단점) 사용자가 의미있는 컨텐츠를 보기 위해 js가 필수라면 HTML이 먼저 보여지는게 의미가 없어짐</strong>.</p>
<h4 id="3-head-위치하지만-async-옵션-추가한다">3. <code>&lt;head/&gt;</code> 위치하지만 async 옵션 추가한다.</h4>
<p>ex)</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  ...
  &lt;script async src=&quot;index.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  ...
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><code>async</code> : script다운시에는 파싱하고 실행할 때만 html 파싱 잠시 중단.</p>
<p>장점) fetching(다운로드)시에도 병렬적으로 HTML paisng 되므로 1보단 속도 단축 
단점) 결국 파싱 중 멈추긴하므로 dom조작 시 문제 발생할 수 있음. <strong>script 파일이 여러개일 경우 순서 상관없이 빨리 받는 파일 실행하므로 순서 영향 있는 경우 문제 발생</strong></p>
<h4 id="4-head-위치하지만-defer-옵션-추가한다">4. <code>&lt;head/&gt;</code> 위치하지만 defer 옵션 추가한다.</h4>
<p>ex)</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  ...
  &lt;script defer src=&quot;index.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  ...
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><code>defer</code> : script다운은 HTML 파싱중에 받고, 실행은 HTML파싱 끝나고 함.</p>
<p>장점) 다운로드와 파싱이 병렬적이므로 속도는 body태그에 넣은것보다 빠르며, html 파싱 완료 후 실행되므로 dom 조작 시에 문제 발생 안함.</p>
<h3 id="참고-🔖">참고 🔖</h3>
<blockquote>
<p><a href="https://jae04099.tistory.com/entry/HTML-script-%ED%83%9C%EA%B7%B8%EB%8A%94-%EC%96%B4%EB%94%94%EC%97%90-%EC%9C%84%EC%B9%98-%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C">[HTML] script 태그는 어디에 위치 해야 할까?</a>
<a href="https://hhh270.tistory.com/28">JS 삽입 위치에 대한 차이(head or body)</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[vs code 탭 크기 및 자동 정렬 안됨]]></title>
            <link>https://velog.io/@jiseon-han/vs-code-%ED%83%AD-%ED%81%AC%EA%B8%B0-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@jiseon-han/vs-code-%ED%83%AD-%ED%81%AC%EA%B8%B0-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Fri, 17 Dec 2021 13:35:50 GMT</pubDate>
            <description><![CDATA[<p>vscode의 tab size는 기본이 4이다. 평소에 2로 설정해두는데 제대로 동작하지 않는 문제가 발생했다.
<img src="https://images.velog.io/images/jiseon-han/post/539cd01e-41bc-45bf-acd0-3c76203ebeac/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.30.32.png" alt="정렬 및 탭 사이즈 이상">위의 이미지 처럼 탭 사이즈가 4로 설정되고, 저장 시 코드정렬도 동작하지 않는다.</p>
<p><strong>현재 setting.json 👇</strong> <img src="https://images.velog.io/images/jiseon-han/post/90f547ce-3667-46ab-beab-439ff3ca1ea3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.33.08.png" alt="setting.json 설정 상태"></p>
<blockquote>
<p>setting.json 파일 여는 방법 (mac os 기준)
<code>command</code> + <code>,</code>  → Settings 파일의 우측 상단 아이콘 클릭!
<img src="https://images.velog.io/images/jiseon-han/post/f0cb5bdc-ab4b-4dd5-a169-7fdd1f856f5f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.35.03.png" alt="setting.json 아이콘"></p>
</blockquote>
<p>vscode 우측 하단 Spaces를 4 -&gt; 2로 변경.</p>
<table>
<thead>
<tr>
<th>변경 전 spaces:4</th>
<th>변경 후 space:2</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://images.velog.io/images/jiseon-han/post/12c1a889-4f6a-4338-8c3e-0a67f861be73/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.08.59.png" alt=""></td>
<td><img src="https://images.velog.io/images/jiseon-han/post/6f534537-9c7a-495b-ae1c-cd6dceaab113/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.40.38.png" alt="Spaces:2로 변경후"></td>
</tr>
</tbody></table>
<p>-&gt; <code>indent-rainbow</code> 익스텐션은 제대로 보이나, 저장시 정렬 및 포맷 변경은 안되고 있음. </p>
<blockquote>
<p><a href="https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow">indent-rainbow</a> : 탭 영역 4가지 색으로 구분해주는 익스텐션. 추천합니다👍</p>
</blockquote>
<p><a href="https://github.com/microsoft/vscode/issues/28277#issuecomment-307976101">다른 익스텐션 문제인가..?</a> -&gt; 익스텐션 충돌일 수 있을거 같아서 vscode <strong>restart and update!</strong></p>
<p>-&gt; 자동 정렬되어 저장되었으나 다시 수정하면 자동 정렬 안됨....;;;</p>
<h3 id="🔔-알림을-확인하자">🔔 알림을 확인하자....!</h3>
<p><img src="https://images.velog.io/images/jiseon-han/post/211b39a5-b8a5-47e1-9a00-74229d3f616c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.20.23.png" alt="알림을 확인하자...!"></p>
<p>configure 설정 후 setting.json 확인
<img src="https://images.velog.io/images/jiseon-han/post/c5f73d68-a19e-42a4-b281-e7f62c67b817/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.22.42.png" alt="html defaultFormatter 설정">
설마 defaultFormatter....? 
<img src="https://images.velog.io/images/jiseon-han/post/1cdc73bb-1133-4d02-8921-e10d8225a66e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.47.png" alt="">
DefaultFormatter가 None이네.......</p>
<p>DefaultFormatter를 Prettier로 변경<img src="https://images.velog.io/images/jiseon-han/post/a5950872-168e-4ee1-ac5b-392f048fe49b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.27.54.png" alt="">
<strong>setting.json 👇</strong> 
<img src="https://images.velog.io/images/jiseon-han/post/2ba85534-b2f7-48bb-ba46-fb8e30297ea6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.27.22.png" alt=""></p>
<p>** 자동 정렬 잘됨...! 💥**
<img src="https://images.velog.io/images/jiseon-han/post/df2a812e-ca9d-4df5-8ea1-506c27a49ce3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-17%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.38.04.png" alt=""></p>
<blockquote>
<p><strong>참고</strong>
 <a href="https://stackoverflow.com/questions/36251820/visual-studio-code-format-is-not-using-indent-settings">spaces 변경 방법</a> 
<a href="https://torbjorn.tistory.com/643">Default Formatter Prettier로 변경하는 방법</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS]클로저]]></title>
            <link>https://velog.io/@jiseon-han/JS%ED%81%B4%EB%A1%9C%EC%A0%80</link>
            <guid>https://velog.io/@jiseon-han/JS%ED%81%B4%EB%A1%9C%EC%A0%80</guid>
            <pubDate>Thu, 09 Dec 2021 13:35:38 GMT</pubDate>
            <description><![CDATA[<h1 id="클로저란">클로저란?</h1>
<p>상위 스코프의 식별자를 참조하고, 중첩 함수가 외부함수의 생명주기보다 오래 살아남는 경우, 중첩함수를 클로저라고 한다.</p>
<blockquote>
<p>💡 <strong>스코프?</strong> 
정의된 변수를 사용할 수 있는 범위. 자바스크립트는 함수 스코프이다. 
즉, 함수 안에 정의된 변수는 함수 안에서만 유효하고, 함수 외부에서는 유효하지 않음.</p>
</blockquote>
<pre><code class="language-javascript">// 클로저 예시
function outer() { //외부 함수
    const a = 1;
    const b = 2;

    return function inner() { //중첩 함수. 클로저
        console.log(a); //외부함수(상위 스코프)의 식별자 참조
    }
}

const bar = outer();
bar();
</code></pre>
<p>아래의 경우 inner 함수는 클로저가 아니다</p>
<pre><code class="language-javascript">// 상위 스코프의 어떤 식별자도 참조하지 않음
function outer() { //외부 함수
    const a = 1;
    const b = 2;

    return function inner() { //중첩 함수.
        const c = 3;
        console.log(c);
    }
}

const bar = outer();
bar();

// 상위 스코프의 식별자 참조하지만, 중첩함수가 반환되지 않음
// (외부 함수의 생명주기가 중첩함수보다 길 경우)
function outer() { //외부 함수
    const a = 1;
    const b = 2;

    function inner() { //중첩 함수. 클로저였지만 outer보다 먼저 소멸
        console.log(a); 
    }
    inner();
}
outer();
</code></pre>
<blockquote>
<p><a href="https://github.com/junh0328/prepare_frontend_interview/blob/main/JS.md#%ED%81%B4%EB%A1%9C%EC%A0%80">자바스크립트-기술면접-클로저-정리</a>
<a href="https://youtu.be/MbYShFxp-j0">자바스크립트 클로저? 간단히 핵심만 파악하기</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[ES Modules]]></title>
            <link>https://velog.io/@jiseon-han/ES-Module</link>
            <guid>https://velog.io/@jiseon-han/ES-Module</guid>
            <pubDate>Sat, 04 Dec 2021 15:01:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>니꼬쌤의 ES Modules 강의 내용을 정리한 페이지입니다.
영상이 7분 안되니 강의 보시는 걸 추천해요.🧚‍♀️
<a href="https://youtu.be/WUirHxOBXL4">니콜라스쌤의 유튜브 강의👍</a></p>
</blockquote>
<h3 id="named-exports">Named Exports</h3>
<ul>
<li>많은 것들을 export / import 하고 싶을 때 사용</li>
</ul>
<p>ex)</p>
<pre><code class="language-js">// math.js
export const plus = (a,b) =&gt; a+b;
export const minus = (a,b) =&gt; a-b;
export const divide = (a,b) =&gt; a/b;


// main.js
import { plus } from &#39;./math&#39;;
</code></pre>
<blockquote>
<p><strong>주의사항🔥</strong>
<strong>import 시 사용하는 이름</strong>은 반드시 <strong>export된 이름</strong>과 같아야 한다.</p>
</blockquote>
<p>위의 예시에서 plus 대신 add로 import하여 사용할 수 없음.</p>
<pre><code class="language-js">// main.js
import { add } from &#39;./math&#39;; // 🙅‍♀️
</code></pre>
<p>만약 plus를 add로 이름을 바꾸고 싶다면 <code>as</code>를 사용해서 바꾸면 사용 가능.</p>
<pre><code class="language-js">import {plus as add} from &#39;./math&#39;; // 🙆‍♀️

add(2,2);</code></pre>
<h3 id="default-exports">Default Exports</h3>
<p>각 파일마다 단 <strong>한개</strong>만 존재. -&gt; import 하기 더 간단함.</p>
<pre><code class="language-js">// db.js
const connectToDB = () =&gt; {/*magic*/};
export default connectToDB;

//main.js
import connect from &#39;./db&#39;;
</code></pre>
<p>→ 한개의 파일에서 모든걸 export 하고 모든걸 import 하게 할 수 있음.</p>
<pre><code class="language-js">// math.js
const plus = (a,b) =&gt; a+b;
const minus = (a,b) =&gt; a-b;
const divide = (a,b) =&gt; a/b;
export default {plus, minus, divide};

// main.js
import math from &#39;./math&#39;;

math.plus(2,2);
</code></pre>
<p>named export와 달리 <strong>원하는 이름으로 변경 가능</strong></p>
<p>ex)</p>
<pre><code class="language-js">import myMath from &#39;./math&#39;;

myMath.plus(2,2);</code></pre>
<h4 id="✍️named-exports와-default-exports가-섞여있는-경우">✍️named exports와 default exports가 섞여있는 경우</h4>
<pre><code class="language-js">//db.js
const connectToDB = () =&gt; {/*magic*/};
export const getUrl = () =&gt; {/*magic*/};
export default connectToDB;

//main.js
import connect, {getUrl} from &#39;./db&#39;;</code></pre>
<h3 id="star-import-">Star Import (*)</h3>
<ul>
<li>모든 exported된 내용을 import 하고 싶을 때<pre><code class="language-js">// math.js
export const plus = (a,b) =&gt; a+b;
export const minus = (a,b) =&gt; a-b;
export const divide = (a,b) =&gt; a/b;

</code></pre>
</li>
</ul>
<p>// main.js
import * as myMath from &#39;./math&#39;;
myMath.plus(2,2);
myMath.minus(2,2);</p>
<pre><code>

#### 🔥 로딩을 빠르게 하는 방법
1. **필요한 것만 import** 하기
→ 예제의 math.js 사용 시 named export로 사용하는게 나음.
2. **Dynamic Import** 사용하기


**🤔 Dynamic Import?**


import 방식은 파일의 위에서부터 모든걸 import 함.
유저가 사용하든 안하든 웹사이트의 모든 코드를 몽땅 다운로드 하므로 로딩 느려짐.
→ Dynamic Import를 사용하여 실제 유저가 사용할 모듈만 import하기

ex) 
```js
async function doMath() {
    const math = await import(&#39;./math&#39;);
    math.plus(2,2);
}

btn.addEventListener(&#39;click&#39;, doMath);
</code></pre><p>→ 유저가 버튼 클릭할때마다 모듈 로딩.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[윈도우 맥북처럼 꾸미기]]></title>
            <link>https://velog.io/@jiseon-han/%EC%9C%88%EB%8F%84%EC%9A%B0-%EB%A7%A5%EB%B6%81%EC%B2%98%EB%9F%BC-%EA%BE%B8%EB%AF%B8%EA%B8%B0</link>
            <guid>https://velog.io/@jiseon-han/%EC%9C%88%EB%8F%84%EC%9A%B0-%EB%A7%A5%EB%B6%81%EC%B2%98%EB%9F%BC-%EA%BE%B8%EB%AF%B8%EA%B8%B0</guid>
            <pubDate>Mon, 29 Nov 2021 13:14:58 GMT</pubDate>
            <description><![CDATA[<h1 id="-oh-my-posh-설정하기">#. oh-my-posh 설정하기</h1>
<p>윈도우의 powershell의 설정을 oh-my-zsh 설정과 비슷하게 보이도록 <code>oh my posh</code> 설정하는 방법</p>
<p><img src="https://images.velog.io/images/jiseon-han/post/f7b3e035-373a-4b68-9518-a75bd16415be/carbon.svg" alt=""></p>
<p>참고 링크</p>
<blockquote>
<p><a href="https://docs.microsoft.com/ko-kr/windows/terminal/tutorials/powerline-setup">https://docs.microsoft.com/ko-kr/windows/terminal/tutorials/powerline-setup</a>
<a href="https://daddyprogrammer.org/post/14536/windows-powershell-oh-my-posh/">https://daddyprogrammer.org/post/14536/windows-powershell-oh-my-posh/</a></p>
</blockquote>
<h1 id="-윈도우-ctrl-window-alt-기능-순서-변경하기">#. 윈도우 ctrl, window, alt 기능 순서 변경하기</h1>
<p>맥 키보드 순서와 동일하도록 windows - alt - ctrl (mac에서는 control-option-command)
레지스트리 파일 만들어서 실행하면됨</p>
<pre><code>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] “Scancode Map”=hex:00,00,00,00,\
00,00,00,00,\
04,00,00,00,\
38,00,5b,e0,\
1d,00,38,00,\
5b,e0,1d,00,\
00,00,00,00</code></pre><p>참고링크</p>
<blockquote>
<p><a href="http://hopark.kr/change-scancode-map/">http://hopark.kr/change-scancode-map/</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[moment 주차 표현 방법]]></title>
            <link>https://velog.io/@jiseon-han/moment-%EC%A3%BC%EC%B0%A8-%ED%91%9C%ED%98%84-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@jiseon-han/moment-%EC%A3%BC%EC%B0%A8-%ED%91%9C%ED%98%84-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Thu, 26 Aug 2021 13:57:17 GMT</pubDate>
            <description><![CDATA[<p>antdesign의 RangePicker 사용 시 format을 YYYY-wo로 설정 시 년도가 맞지않는 이슈 발생.</p>
<p>ex) 날짜를 2019.12.30로 선택할 경우 <code>2020년 1주</code>로 표현되길 원하나, <code>2019년 1주</code>로 보임.</p>
<p>-&gt; antd의 WeeklyPicker 확인 시 년도 정상적으로 보임. 라이브러리 확인 결과 <code>gggg-wo</code>로 처리하고 있음. </p>
<blockquote>
<p><a href="https://github.com/ant-design/ant-design/blob/3.x-stable/components/date-picker/WeekPicker.tsx#L23">ant design WeekPicker component</a></p>
</blockquote>
<h4 id="-gggg와-yyyy의-차이는">#. gggg와 yyyy의 차이는?</h4>
<p>gggg는 week year로 yyyy wo 형식으로 사용 시 주차랑 상관 없이 해당 날짜의 년도를 그대로 가져옴. 그래서 2019.12.30 선택시</p>
<ul>
<li>yyyy-wo : 2019-1주차</li>
<li>gggg-wo : 2020-1주차</li>
</ul>
<p>로 표현됨.</p>
<blockquote>
<p><a href="https://momentjs.com/docs/#/parsing/string-format/">moment string-format</a></p>
</blockquote>
<hr>
<p>서버에서 처리하는 주차 계산방식과 moment에서 처리되는 주차 계산방식이 다른 현상 발생</p>
<p>ex) 2020.12.30일에 대해</p>
<ul>
<li>서버 : 2020년 53주차</li>
<li>moment : 2021년 1주차</li>
</ul>
<p>년도 변경 시 주차 계산방식이 다르므로, <code>moment.updateLocale</code> 을 사용하여 주차 계산 방식 변경</p>
<ul>
<li><h4 id="서버의-주차-계산-방식">서버의 주차 계산 방식</h4>
<p>주의 시작 요일은 일요일, YYYY년 1주차는 1월 3일을 포함해야됨</p>
</li>
<li><h4 id="moment-week-설정-변경">moment week 설정 변경</h4>
</li>
</ul>
<pre><code>moment.updateLocale(&#39;ko&#39;, {
    week:{
        dow : 0, // 한 주의 시작 요일은 일요일(0)
        doy: 4 //  연도의 첫 주는 1월 3일을 포함해야 될 경우. (계산 식: 7+dow-3)
    }
})</code></pre><blockquote>
<p><a href="https://momentjs.com/docs/#/customization/dow-doy/">https://momentjs.com/docs/#/customization/dow-doy/</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[npm install 시 ESOCKETTIMEDOUT 에러 발생]]></title>
            <link>https://velog.io/@jiseon-han/npm-install-%EC%8B%9C-ESOCKETTIMEDOUT-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D</link>
            <guid>https://velog.io/@jiseon-han/npm-install-%EC%8B%9C-ESOCKETTIMEDOUT-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D</guid>
            <pubDate>Mon, 31 May 2021 13:57:50 GMT</pubDate>
            <description><![CDATA[<p>git clone 후 npm install 실행 중 에러 발생</p>
<pre><code>error An unexpected error occurred: &quot;https://...: ESOCKETTIMEDOUT&quot;.</code></pre><p><code>npm(yarn) install --network-timeout 1000000</code>
설정 후 다시 시도</p>
<p><code>...unexpected end of file...</code> 에러 발생.</p>
<p>캐시 삭제 후 시간을 <code>6000000</code>로 바꿔서 다시 실행
-&gt; 설치 완료</p>
<hr>
<h3 id="cache-삭제-방법">#.cache 삭제 방법</h3>
<h4 id="npm">npm</h4>
<p><code>npm cache verify</code> or <code>npm cache clean --force</code></p>
<h4 id="yarn">yarn</h4>
<p><code>yarn cache clean</code></p>
<h4 id="-참고">#. 참고</h4>
<blockquote>
<p><a href="https://velog.io/@kmp1007s/yarn%EC%9C%BC%EB%A1%9C-expo-cli-%EC%84%A4%EC%B9%98-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0">https://velog.io/@kmp1007s/yarn%EC%9C%BC%EB%A1%9C-expo-cli-%EC%84%A4%EC%B9%98-%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</a>
<a href="https://stackoverflow.com/questions/52135815/yarn-is-having-troubles-with-the-network-connection">https://stackoverflow.com/questions/52135815/yarn-is-having-troubles-with-the-network-connection</a></p>
</blockquote>
<blockquote>
<p><a href="https://icerabbit.tistory.com/78!%5B%5D(https://images.velog.io/images/jiseon-han/post/2ab49415-7d30-4f3e-9e2b-48d41215e199/TIL-2.jpg)">https://icerabbit.tistory.com/78![](https://images.velog.io/images/jiseon-han/post/2ab49415-7d30-4f3e-9e2b-48d41215e199/TIL-2.jpg)</a>
<a href="https://stackoverflow.com/questions/55157862/npm-cache-clean-v-s-npm-cache-verify">https://stackoverflow.com/questions/55157862/npm-cache-clean-v-s-npm-cache-verify</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>