<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>forestin_s2.log</title>
        <link>https://velog.io/</link>
        <description>.</description>
        <lastBuildDate>Sun, 10 Apr 2022 15:26:50 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>forestin_s2.log</title>
            <url>https://images.velog.io/images/forestin_s2/profile/bfc6c330-01e1-4a31-81c4-69cda544a762/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. forestin_s2.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/forestin_s2" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[package-lock.json 충돌 원인과 해결 방법]]></title>
            <link>https://velog.io/@forestin_s2/package-lock.json-%EC%B6%A9%EB%8F%8C-%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@forestin_s2/package-lock.json-%EC%B6%A9%EB%8F%8C-%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 10 Apr 2022 15:26:50 GMT</pubDate>
            <description><![CDATA[<h1 id="✅-package-lockjson은-무엇일까">✅ package-lock.json은 무엇일까?</h1>
<blockquote>
<p>package-lock.json is automatically generated for any operations where npm modifies either the node_modules tree, or package.json.</p>
</blockquote>
<p>   npm 공식 문서에는 위와 같이 나와있다. 즉, node-modules 트리나 package.json 수정될 때, 자동적으로 생성되는 것이다.</p>
<h1 id="-package-lockjson의-충돌-원인">⁉ package-lock.json의 충돌 원인</h1>
<p>위에서 제시된 것에서 알 수 있듯 크게 1) package.json의 내용이 다르거나 2) package.json은 같아도 node-modules가 다른 경우이다.</p>
<p>이를 이해하기 위해 package-lock.json이 생성되는 시점인 npm install의 과정을 알아보자.</p>
<blockquote>
<p>&quot;npm install&quot; -&gt; package.json을 바탕으로 node-modules 폴더 생성 및 패키지 설치 -&gt; node-modules 폴더의 정보를 package-lock.json에 담기</p>
</blockquote>
<p>2) package.json은 같아도 node-modules가 다른 경우는 크게 3가지가 있다.</p>
<p>① npm 버전이 다른 경우
② 의존성을 가진 패키지의 버전이 업그레이드 되는 경우
③ 의존성을 가진 패키지가 의존하는 패키지의 버전이 업그레이드 되는 경우</p>
<h1 id="👍🏻해결-방법">👍🏻해결 방법</h1>
<ol>
<li>package.json을 수정해서 npm install로 해결</li>
<li>--package-lock-only 옵션으로 해결</li>
<li>npm-merge-driver 툴로 해결</li>
</ol>
<p>!!! 협업을 하기 전, npm 버전을 미리 통일하자 !!!</p>
<h1 id="❗-주의할-점">❗ 주의할 점</h1>
<ol>
<li>package-lock.json은 형상관리에 포함시켜야 한다.</li>
</ol>
<p>충돌을 방지하기 위해 이 파일을 git ignore하면 되지 않을까 생각했다. 하지만,</p>
<p>이 파일은 팀에게 정확한 디펜던시 버전을 알려주고, 중복된 라이브러리를 검사해주는 등의 역할을 하기 때문에 올려야 한다.</p>
<ol start="2">
<li>package-lock.json을 삭제하지 말자..</li>
</ol>
<p>충돌을 해결하기 위해 이를 삭제하고, 다시 npm install을 하는 방식을 활용했었다. 하지만 이는
디펜던시 트리의 일부분을 의도치 않게 바꿀 수 있기 때문에 삭제하는 방식보다는 위에서 제시한 해결 방법을 활용해야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript로 그림판 만들기]]></title>
            <link>https://velog.io/@forestin_s2/%EA%B7%B8%EB%A6%BC%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@forestin_s2/%EA%B7%B8%EB%A6%BC%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 01 Sep 2021 04:35:51 GMT</pubDate>
            <description><![CDATA[<p><em>*본 포스트는 노마드코더 강의를 보고 정리하는 글입니다.</em></p>
<p><img src="https://images.velog.io/images/forestin_s2/post/4b7fd9f4-2b1a-4871-a0ee-02580b6e26fd/131255907-9e2ebe0f-5307-4758-91fd-cefc10b33214.gif" alt=""></p>
<p>canvas API로 그림판을 만들었어요! </p>
<blockquote>
<p><strong>Canvas API</strong>는 JavaScript와 HTML &lt; canvas &gt; 엘리먼트를 통해 그래픽을 그리기위한 수단을 제공합니다. <p>-<em>MDN</em></p>
</blockquote>
<h3 id="1-html">1. Html</h3>
<pre><code>&lt;body&gt;
    &lt;canvas id=&quot;jsCanvas&quot; class=&quot;canvas&quot;&gt;&lt;/canvas&gt;
    &lt;div class=&quot;controls&quot;&gt;
        &lt;div class=&quot;controls_range&quot;&gt;
            &lt;input type=&quot;range&quot; id=&quot;jsRange&quot; min=&quot;0.1&quot; max=&quot;5.0&quot; value=&quot;2.5&quot; step=&quot;0.1&quot;/&gt;
        &lt;/div&gt;
        &lt;div class=&quot;controls_btns&quot;&gt;
            &lt;button id=&quot;jsMode&quot;&gt;Fill&lt;/button&gt;
            &lt;button id=&quot;jsSave&quot;&gt;Save&lt;/button&gt;
        &lt;/div&gt;
        &lt;div class=&quot;controls_colors&quot; id=&quot;jsColors&quot;&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #2c2c2c;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: white;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #FF3B30;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #FF9500;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #FFCC00;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #4CD963;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #5AC8FA;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #0579FF;&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;controls_color jsColor&quot; style=&quot;background-color: #5856D6;&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;script src=&quot;app.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre><p>  먼저 html은 위와 같이 작성했습니다. 
  canvas 태그는 그림을 그리기 위한 판을 만든 것입니다. controls라는 영역 안에는 펜의 굵기(controls_range), 드로잉 방식과 저장 버튼(controls_btns), 색상(controls_colors)이 있어요.</p>
<p>  펜의 굵기를 조절할 때는 input의 속성값으로 type=&quot;range&quot;를 했습니다. min, max, value(기본값), step(얼만큼씩 움직일지)을 설정해 줍니다.</p>
<h3 id="2-vanillajs">2. vanillaJS</h3>
<p>  다음은 자바스크립트로 어떻게 구현했는지 알아볼까요?
  총 9개의 함수를 만들어서 구현했습니다.</p>
<h4 id="1-stoppainting-startpainting">1) stopPainting(), startPainting()</h4>
<pre><code>  //1. 그림 그리기를 멈추는 기능
function stopPainting() {
    painting = false;
}

//2. 그림 그리기를 하는 기능
function startPainting() {
    painting = true;
}

  canvas.addEventListener(&quot;mousedown&quot;, startPainting);
  canvas.addEventListener(&quot;mouseup&quot;, stopPainting);
  canvas.addEventListener(&quot;mouseleave&quot;, stopPainting);</code></pre><p>  캔버스는 document.getElementById 를 통해 canvas 변수명에 할당했습니다. 캔버스를 클릭할 때, 그림 그리기를 시작하고, 손을 떼면 멈추도록 구현했습니다. 또, 캔버스 밖으로 마우스가 나가면 그림 그리기를 멈추도록 했습니다. </p>
<h4 id="2-onmousemove">2) onMouseMove()</h4>
<pre><code>const ctx = canvas.getContext(&quot;2d&quot;);

//3. 마우스를 움직일 때, x,y좌표를 읽고 선을 그리는 기능
function onMouseMove(event) {
    const x = event.offsetX; //event 안에는 offset X,Y좌표를 가져올 수 있음
    const y = event.offsetY;
    if(!painting){
        ctx.beginPath();
        ctx.moveTo(x, y);
    } else {
        ctx.lineTo(x, y);
        ctx.stroke();
    }
}

canvas.addEventListener(&quot;mousemove&quot;, onMouseMove);</code></pre><p>마우스를 움직일 때, 선을 그리는 기능입니다.</p>
<p><strong>const ctx = canvas.getContext(&quot;2d&quot;);</strong> 
  이 코드에 관한 아래 설명을 확인해 주세요!</p>
<blockquote>
<p>&lt; canvas &gt; 요소는 <strong>getContext()</strong> 메서드를 이용해서, 랜더링 컨텍스트와 (렌더링 컨텍스트의) 그리기 함수들을 사용할 수 있습니다.  getContext() 메서드는 렌더링 컨텍스트 타입을 지정하는 하나의 파라메터를 가집니다.<p>-<em>MDN</em></p>
</blockquote>
<p> 그림을 그리기 위한 기본 설정인데, 우리는 기본적인 선을 그릴 것이기 때문에 &quot;2d&quot;로 파라메터를 지정해 줍니다.</p>
<blockquote>
<p>  <strong>beginPath()</strong>
새로운 경로를 만듭니다. 경로가 생성됬다면, 이후 그리기 명령들은 경로를 구성하고 만드는데 사용하게 됩니다.<p>  <strong>moveTo(x, y)</strong>
펜을  x와 y 로 지정된 좌표로 옮깁니다<p><strong>lineTo(x, y)</strong>
현재의 드로잉 위치에서 x와 y로 지정된 위치까지 선을 그립니다.<p><strong>stroke()</strong>
윤곽선을 이용하여 도형을 그립니다.<p>-<em>MDN</em></p>
</blockquote>
<p>  각 메소드에 대한 설명입니다!</p>
<p>  이 함수의 과정을 설명해 보자면,</p>
<p>  먼저 <strong>마우스의 X, Y좌표</strong>를 가져옵니다. 
  그림을 그리지 않는 상태일 때(!painting), <strong>펜의 새로운 경로</strong>를 만들고, 마우스가 움직이는대로 <strong>펜의 X, Y좌표를 옮겨</strong>줍니다.
  <em>(마우스를 클릭하는 순간 그 위치부터 그림을 그려야 하기 때문입니다.)</em>
  그림을 그리는 상태일 때(painting), 지정된 위치까지 <strong>선을 만들</strong>고, <strong>그림을 그립</strong>니다.
  <em>(stroke()이 없으면 그림이 안그려집니다!)</em></p>
<p>  마우스가 움직일 때, 이 기능을 사용해야 합니다. 따라서 
**  canvas.addEventListener(&quot;mousemove&quot;, onMouseMove);**
  로 구현했습니다.</p>
<h4 id="3-handlecolorclick">3) handleColorClick()</h4>
<p>  색상을 정하는 기능입니다.</p>
<pre><code>  const colors = document.getElementsByClassName(&quot;jsColor&quot;);

function handleColorClick(event) {
    const color = event.target.style.backgroundColor;
    ctx.strokeStyle = color;
    ctx.fillStyle = color;
}

  Array.from(colors).forEach(color =&gt; color.addEventListener(&quot;click&quot;, handleColorClick));
</code></pre><p>  색상은 여러가지가 있었죠. 이들을 배열로 묶어줍니다. forEach를 통해 배열에 있는 요소 하나하나에 접근해서 click이 되는 요소로 색상을 바꿔주는 과정입니다.
**  
   ctx.strokeStyle = color;
  ctx.fillStyle = color;**</p>
<p>  이 코드가 색상을 지정하는 코드입니다.</p>
<h4 id="4-handlerange">4) handleRange()</h4>
<pre><code>function handleRange(event) {
    ctx.lineWidth = event.target.value;
}

if(range) {
    range.addEventListener(&quot;input&quot;, handleRange);
}
</code></pre><p>  펜의 굵기를 조절하는 코드입니다. 
**  ctx.lineWidth = event.target.value;**
  를 통해 펜의 굵기를 설정했습니다.</p>
<h4 id="5-handlemodeclick-handlecanvasclick">5) handleModeClick(), handleCanvasClick()</h4>
<pre><code>// 6. 버튼 클릭하면 텍스트 변경되는 기능
 function handleModeClick(event) {
    if(filling) {
        filling = false;
        mode.innerText = &quot;Fill&quot;
    } else {
        filling = true;
        mode.innerText = &quot;Paint&quot;
    }
}

 //7. 캔버스 클릭하면 색 채워지는 기능 
  function handleCanvasClick() {
    if(filling) {
        ctx.fillRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);
    }
}
</code></pre><p>이 기능은 캔버스 위에 그림을 그릴 것이냐, 클릭하면 전체가 칠해지도록 할 것이냐를 고르는 기능입니다.</p>
<p>  버튼을 클릭하면 text가 변경되는 코드입니다. innerText로 구현할 수 있습니다.
  <img src="https://images.velog.io/images/forestin_s2/post/fdcd62f7-56e0-4604-9356-c16f650ef057/Animation2.gif" alt=""></p>
<p>**  ctx.fillRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);**</p>
<p>  캔버스의 크기만큼 채워진 직사각형을 만들겠다는 의미입니다. 즉, 캔버스 전체를 칠하는 것이죠.</p>
<h4 id="6-handlecm-handlesaveclick">6) handleCM(), handleSaveClick()</h4>
<pre><code>function handleCM(event) {
    event.preventDefault();
}

function handleSaveClick() {
    const image = canvas.toDataURL(&quot;image/jpeg&quot;);
    const link = document.createElement(&quot;a&quot;);
    link.href = image;
    link.download = &quot;paintJS[EXPORT]&quot;;
    link.click();
}

  canvas.addEventListener(&quot;contextmenu&quot;, handleCM);</code></pre><p>  마지막을 jpg 파일로 저장하는 코드입니다. contextmenu를 클릭하면, 즉, 우클릭을 막아줍니다. handleCM()이 그 코드입니다! 우리는 저장 버튼을 클릭해서 저장하게 할 것이기 때문에 우클릭을 방지합니다.</p>
<p>  handleSaveClick()이 함수가 jpg로 저장하는 코드입니다. 임의의 링크를 만들고, download 속성을 추가하면 다운이 가능합니다! 다운로드 속성에는 &quot;저장될 파일명&quot;을 정해줍니다.</p>
<p>  이렇게 하면 완성입니다! canvas API를 살펴보고, 도형을 만드는 기능, 텍스트 박스를 추가하는 기능 등을 추가해보면 더 좋을 것 같아요!! 더 많은 기능이 있으니 꼭 한 번 찾아보시는 걸 추천드려요😉</p>
<p>  포스트는 여기까지 하고, 전체 코드 올려두고 가겠습니다~</p>
<p><img src="https://images.velog.io/images/forestin_s2/post/f281fbf8-d864-4798-b285-44894abc2dfb/code.png" alt=""></p>
<p>  <em>*본 포스트는 노마드코더 강의를 보고 정리하는 글입니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript로 Todo List 만들기]]></title>
            <link>https://velog.io/@forestin_s2/%EC%98%A4%EB%8A%98%EC%9D%98-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@forestin_s2/%EC%98%A4%EB%8A%98%EC%9D%98-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Fri, 06 Aug 2021 12:02:45 GMT</pubDate>
            <description><![CDATA[<h2 id="1-프로젝트의-기능">1. 프로젝트의 기능</h2>
<h4 id="1-해야할-공부를-입력하고-enter누르면-리스트에-추가">1) 해야할 공부를 입력하고 enter누르면 리스트에 추가</h4>
<p>input에 할 일 입력하기 -&gt; enter키 누르면 -&gt; ouput 리스트에 태그 추가</p>
<h4 id="2-완료한-공부를-리스트에서-삭제하기-위해서-복습-질문에-답하기">2) 완료한 공부를 리스트에서 삭제하기 위해서 복습 질문에 답하기</h4>
<p>화살표를 클릭하면 -&gt; 복습.html로 이동 -&gt; localStorage에서 삭제</p>
<h4 id="3-야간모드">3) 야간모드</h4>
<p>달 아이콘을 클릭하면 -&gt; body의 클래스 day, night toggle -&gt; if 클래스 === night =&gt; html 요소를 야간 모드로 전환 </p>
<p>아래 내용은 코드 구현에 대한 것입니다!</p>
<h2 id="2-strict-mode">2. strict mode</h2>
<pre><code>(function () {

&#39;use strict&#39;;

...코드 생략(스크립트 전체)

}());</code></pre><p>먼저 스크립트에 strict mode를 설정했습니다. 
strict mode는 <strong>자바스크립트의 문법을 좀 더 엄격하게 검사하여 잠재적인 오류 발생을 줄이기 위한 목적</strong>으로 ES5부터 추가된 기능입니다.</p>
<p>strict mode는 스크립트 단위로 실행됩니다. 엄격 모드가 있는 것과 없는 것이 혼용되면 오류가 발생할 수 있습니다. 따라서 위 코드와 같이 <strong>즉시 실행 함수로 스크립트를 감싸고, 선두에 적용하는 것</strong>이 좋습니다.</p>
<h2 id="3-localstorage">3. localStorage</h2>
<p>투두리스트를 만들고, 새로고침을 하면 계속해서 초기화되는 문제가 있었습니다. 웹 브라우저에는 이 문제를 해결할 수 있는 localStorage가 존재하는데요. 
<img src="https://images.velog.io/images/forestin_s2/post/48576ba0-9aa4-466a-a75d-be7994268ed9/image.png" alt=""></p>
<p>개발자 도구에 application에 들어가보면 위와 같은 저장소를 확인할 수 있습니다. 이 저장소를 활용해서 투두리스트가 초기화되는 것을 막을 거예요.</p>
<pre><code>let inputLocal = localStorage.getItem(&#39;items&#39;)?JSON.parse(localStorage.getItem(&#39;items&#39;)):[];
localStorage.setItem(&#39;items&#39;, JSON.stringify(inputLocal));
let item = JSON.parse(localStorage.getItem(&#39;items&#39;));</code></pre><p>위 코드는 items라는 공간을 할당하는 것입니다. </p>
<blockquote>
<ul>
<li><strong>setItem(&#39;A&#39;, B)</strong>: A라는 공간에 B를 저장.</li>
</ul>
</blockquote>
<ul>
<li><strong>getItem(&#39;A&#39;)</strong>: A공간에 있는 것을 읽음.</li>
</ul>
<p>첫번째 줄은 items에 아무것도 없으면 [], 있으면 그것을 inputLocal에 할당하겠다는 의미입니다.</p>
<h2 id="4-create">4. Create</h2>
<pre><code>document.querySelector(&quot;.studyList&quot;).addEventListener(&quot;submit&quot;, Create);</code></pre><p>위 코드는 input에 값을 입력하고, enter키를 누르면 추가되는 것을 구현한 것입니다. Create은 직접 구현한 함수이고, 아래의 코드를 참고해 주세요!
document에서 studyList라는 클래스를 가져옵니다. 이 클래스는 input을 감싸고 있는 form을 의미합니다.</p>
<pre><code>if(input!=&quot;&quot;) {
    inputLocal.push(input);
    localStorage.setItem(&#39;items&#39;, JSON.stringify(inputLocal));
    item = JSON.parse(localStorage.getItem(&#39;items&#39;));
    document.querySelector(&quot;.input&quot;).value = &quot;&quot;;
  }</code></pre><p>input에 입력된 것이 있으면 push를 통해 localStorage에 값을 추가합니다. </p>
<h2 id="5-read">5. Read</h2>
<pre><code>var list = &quot;&quot;;
  for(var i=0; i&lt;inputLocal.length; i++) {
    list+=&quot;&lt;li&gt;&quot;+inputLocal[i]+&quot;&lt;span class=&#39;ReviewBtn&#39; id=&quot;+i+&quot;&gt;&quot;+&quot;→&quot;+&quot;&lt;/span&gt;&lt;/li&gt;&quot;;
  }
  document.querySelector(&quot;.output&quot;).innerHTML=list;</code></pre><p>위 코드는 화면에 보여주는 것에 대한 코드입니다.
저장소에서 가져온 요소들을 innerHTML을 통해 추가해줍니다.</p>
<blockquote>
<ul>
<li><strong>innerText가 아닌 innerHTML을 사용하는 이유</strong>
우리는 output이라는 영역에 li와 span 태그를 추가하고 싶은 것이죠. 만약, innerText를 사용하면 li와 span이 태그 형태가 아니라 문자열 형태로 추가가 됩니다.
span -&gt; /span 이런 식으로요!
따라서 innerHTML을 사용해서 태그를 추가합니다.</li>
</ul>
</blockquote>
<ul>
<li><strong>innerHTML의 단점</strong>
크게 3가지 단점이 있습니다. 1) 공격에 취약하다는 점, 2) 요소 노드의 모든 자식 노드를 제거하고, 새롭게 변경된다는 점, 3) 새로운 요소를 삽입할 때, 위치를 지정할 수 없다는 점입니다.<br>
이 프로젝트의 경우, localStorage를 활용하여 리스트 형태로 값을 저장하고, 리스트의 인덱스에 접근하여 화면에 보여주는 방식이기 때문에 2번과 3번으로 인한 문제는 없습니다. 따라서 innerHTML을 사용합니다.




</li>
</ul>
<h2 id="6-delete">6. Delete</h2>
<p>삭제할 때는 localStorage와 매치시켜서 지워줍니다. 삭제가 되기 전에 복습 페이지로 넘어가야 하기 때문에 그 부분을 먼저 실행하고, 지우는 부분을 구현했습니다. 아래 코드 참고해주세요!</p>
<pre><code>function Delete() {
  NextPage();
  var i = this.getAttribute(&quot;id&quot;);
  item.splice(i,1);
  inputLocal = item;
  localStorage.setItem(&#39;items&#39;, JSON.stringify(inputLocal));
  Read()
}</code></pre><p>NextPage() 함수가 다음 페이지로 넘어가는 함수입니다. 이 부분은 복습 페이지를 다른 html 파일로 만들고, 연결했습니다.</p>
<pre><code>function NextPage() {
  location.href = &quot;page/question.html&quot;;
}</code></pre><p>위 코드가 복습 페이지로 이동할 수 있는 코드입니다.</p>
<blockquote>
<ul>
<li><strong>location.href</strong>: html 파일 이동</li>
</ul>
</blockquote>
<p>다시 Delete 함수를 봅시다. 변수 i는 id라는 속성의 값을 저장하는 공간입니다. 즉, 몇 번째 리스트의 화살표인지를 확인하는 것입니다. splice를 통해 i에 할당된 인덱스 값에서부터 1개를 삭제하겠다는 것입니다. 선택된 항목이 삭제됩니다. 저장소에도 삭제된 것을 적용하기 위해 setItem으로 다시 설정해줍니다. </p>
<h2 id="7-야간모드">7. 야간모드</h2>
<p>야간모드도 새로고침이 되면 초기화되는 문제가 있었습니다. 또, 복습 페이지에도 같은 모드를 적용해야 하는데, 이러한 문제를 해결하기 위해서 한 번더 저장소를 이용했습니다. </p>
<pre><code>function NightAndDay() {
  document.querySelector(&quot;body&quot;).classList.toggle(&quot;night&quot;);
  let classLocal = localStorage.getItem(&#39;modes&#39;)?JSON.parse(localStorage.getItem(&#39;modes&#39;)):&quot;&quot;;
  classLocal=document.querySelector(&quot;body&quot;).classList.value;
  localStorage.setItem(&#39;modes&#39;, JSON.stringify(classLocal));
  LocalMode();
}

document.querySelector(&quot;.Night&quot;).addEventListener(&quot;click&quot;, NightAndDay);</code></pre><p>마지막 줄은 달 아이콘을 클릭하면 NightAndDay 함수가 실행되는 코드입니다.
야간모드를 구현할 때는 toggle을 사용했습니다. toggle은 클래스를 번갈아 실행하는 것입니다. 함께 알아두면 좋은 것들을 아래에서 확인해 주세요!</p>
<blockquote>
<ul>
<li>document.querySelector(&quot;body&quot;).classList.<strong>add(클래스명)</strong>
: 클래스를 추가
ex) &quot;day&quot; → &quot;day night&quot; (night이라는 클래스를 추가한다고 가정)</li>
</ul>
</blockquote>
<ul>
<li>document.querySelector(&quot;body&quot;).classList.<strong>remove(클래스명)</strong>
: 클래스를 제거
ex) &quot;day night&quot; → &quot;day&quot;</li>
<li>document.querySelector(&quot;body&quot;).classList.<strong>toggle(클래스명)</strong>
: 클래스를 번갈아
ex)&quot;day night&quot; → &quot;day&quot; → &quot;day night&quot; → ...</li>
</ul>
<p>이렇게 클래스명을 변화시킨 후, 이 클래스명을 저장소에 저장해 둡니다. 
복습 페이지에서는 이 mode를 참고해서 야간모드로 바꿉니다.
복습이 끝나고 다시 메인 페이지로 돌아왔을 때도 똑같이 mode가 적용되어야 겠죠? LocalMode() 가 그 내용을 담고 있습니다.</p>
<pre><code>function LocalMode() {
  let BodyClassName = JSON.parse(localStorage.getItem(&#39;modes&#39;));
  if(BodyClassName === &quot;day night&quot;) {
    document.querySelector(&quot;.dayTitle&quot;).classList.add(&quot;nightTitle&quot;);
    document.querySelector(&quot;.day&quot;).classList.add(&quot;night&quot;);
    document.querySelector(&quot;.output&quot;).classList.add(&quot;output-night&quot;);
    document.querySelector(&quot;.Night&quot;).classList.add(&quot;Day&quot;);
    document.querySelector(&quot;.input&quot;).classList.add(&quot;inputNight&quot;);
  } else {
    document.querySelector(&quot;.dayTitle&quot;).classList.remove(&quot;nightTitle&quot;);
    document.querySelector(&quot;.day&quot;).classList.remove(&quot;night&quot;);
    document.querySelector(&quot;.output&quot;).classList.remove(&quot;output-night&quot;);
    document.querySelector(&quot;.Night&quot;).classList.remove(&quot;Day&quot;);
    document.querySelector(&quot;.input&quot;).classList.remove(&quot;inputNight&quot;);
  }
}</code></pre><p>위 코드는 야간 모드로 스타일을 변화시키는 것입니다. add해서 스타일을 변경하고, 야간 모드가 풀리면 remove해서 원래 기본값인 day 모드로 변경합니다.</p>
<p><img src="https://images.velog.io/images/forestin_s2/post/8c472db4-148e-441a-9569-5d8b9071ef5e/code.png" alt="">
위 이미지는 메인화면 코드입니다.
<img src="https://images.velog.io/images/forestin_s2/post/9aeacd65-0a59-4f18-ba97-118dce8f785c/code2.png" alt="">
위 이미지는 복습 페이지의 코드입니다.</p>
<p><em>*모던 자바스크립트 Deep Dive 책을 참고하여 작성했습니다.</em></p>
]]></description>
        </item>
    </channel>
</rss>