<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jinah2754.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요:)</description>
        <lastBuildDate>Sun, 10 Oct 2021 06:36:28 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. jinah2754.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minimal_time" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[AWS배포 후에 다음과 같은 오류가 생기면 해결방법]]></title>
            <link>https://velog.io/@minimal_time/AWS%EB%B0%B0%ED%8F%AC-%ED%9B%84%EC%97%90-%EB%8B%A4%EC%9D%8C%EA%B3%BC-%EA%B0%99%EC%9D%80-%EC%98%A4%EB%A5%98%EA%B0%80-%EC%83%9D%EA%B8%B0%EB%A9%B4-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@minimal_time/AWS%EB%B0%B0%ED%8F%AC-%ED%9B%84%EC%97%90-%EB%8B%A4%EC%9D%8C%EA%B3%BC-%EA%B0%99%EC%9D%80-%EC%98%A4%EB%A5%98%EA%B0%80-%EC%83%9D%EA%B8%B0%EB%A9%B4-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 10 Oct 2021 06:36:28 GMT</pubDate>
            <description><![CDATA[<p>터미널 오류 창, VS오류 창
<img src="https://images.velog.io/images/minimal_time/post/580f6a88-a6aa-462c-96da-4e556e1b022f/image.png" alt=""></p>
<p><em><strong>build faild, compile error의 경우 기존의 코드와 새로운 코드의 충돌 확률이 높음.</strong></em></p>
<p>[aws 배포 전] 
branch merge를 취소 =&gt; (branch에서) master pull =&gt; master  push =&gt; 충돌 검토 확인 =&gt; (master에서) master merge하면 됨.</p>
<p>[aws 배포 후 충돌 확인]
우선순위: 1. 실서버 충돌 돌려놓기 2. github master 충돌 해결 순으로 하기</p>
<p>실서버 충돌 돌려놓는 방법:
파일질라는 FTP 서버에 접속 =&gt; aws 서버에 업로드 된 파일을 폴더 형식으로 확인 가능 =&gt; 충돌 난 파일 확인하고 수정해서 바로 업로드 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 가로 넓이(setW) 사용시 주의사항]]></title>
            <link>https://velog.io/@minimal_time/React-%EA%B0%80%EB%A1%9C-%EB%84%93%EC%9D%B4setW-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD</link>
            <guid>https://velog.io/@minimal_time/React-%EA%B0%80%EB%A1%9C-%EB%84%93%EC%9D%B4setW-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD</guid>
            <pubDate>Sun, 10 Oct 2021 06:34:03 GMT</pubDate>
            <description><![CDATA[<pre><code>// 화면 resize
   $(window).resize(()=&gt;{
       setW($(&#39;#app&#39;).width());
   });


   useEffect(()=&gt; {
       setW($(&#39;#app&#39;).width());
   },[]);</code></pre><p>화면 넓이 값을 가져오기 위해서 w(가로넓이)를 사용할 때 setW($(‘#app’)) 무조건 기준은 ‘#app’으로 넣을 것 전체 클래스나 아이디를 주어도 되지만 값이 0이 나올경우 무의미해짐. 따라서 전체를 아우르는 ‘app’을 사용할 것</p>
<p>useEffect를 주는 이유: 화면 resize의 경우 첫번째값을 가져오지 않음.(화면 크기를 조정해야 값을 측정할 수 있음) 따라서 useEffect로 한번 실행되었을 때 첫값을 가져오도록 사용해야함.</p>
<p>참고페이지: event.page.js, main_slideBanner.js</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[map함수 사용 시 <Fragment>태그로 key prop 오류 해결👍🏻]]></title>
            <link>https://velog.io/@minimal_time/map%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9-%EC%8B%9C-Fragment%ED%83%9C%EA%B7%B8%EB%A1%9C-key-prop-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@minimal_time/map%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9-%EC%8B%9C-Fragment%ED%83%9C%EA%B7%B8%EB%A1%9C-key-prop-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Sat, 25 Sep 2021 08:04:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/minimal_time/post/02306f14-85ac-4c51-b0a5-02a7f47206ef/%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-09-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.03.08.png" alt=""></p>
<p>위와 같은 에러가 발생하였다.
간단하게 map안에 key={idx}를 상위태그에 넣으면 되지만
전체를 감싸는 div를 넣으면 div영역으로 인해 메뉴바 스타일에 영향이 갔다.</p>
<p>그러던 중 벨로포트님의 인프런 강의를 듣다가 나처럼 스타일 관련 설정을 하면서 코드가 꼬이게 되는 것을 방지하기 위해 <strong>Fragment</strong>라는 것을 사용한다는걸 알게 되었다.</p>
<pre><code class="language-js">import React, { useEffect, useState, Fragment } from &quot;react&quot;;</code></pre>
<p>imprt에 fragment를 추가하고 fragment 태그로 전체를 감싼 후 key={idx}를 넣어주었더니 오류가 해결되었다! </p>
<pre><code class="language-js">{keyprop.map((raw,idx)=&gt;{
return(
&lt;Fragment key={idx}&gt;
....

&lt;/Fragment&gt;
</code></pre>
<p>콘솔에 더 이상 오류가 안떠서 마음이 편해졌다.
<img src="https://images.velog.io/images/minimal_time/post/4114f655-572c-4150-b80b-2125010246ca/image.png" alt=""></p>
<p>참고 블로그: <a href="https://react-anyone.vlpt.us/03.html">https://react-anyone.vlpt.us/03.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1차 프로젝트(더 반찬 클론)🙌]]></title>
            <link>https://velog.io/@minimal_time/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%8D%94-%EB%B0%98%EC%B0%AC-%ED%81%B4%EB%A1%A0</link>
            <guid>https://velog.io/@minimal_time/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%8D%94-%EB%B0%98%EC%B0%AC-%ED%81%B4%EB%A1%A0</guid>
            <pubDate>Sun, 25 Apr 2021 15:11:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>프로젝트 주제: <a href="https://www.thebanchan.co.kr/main/initMain.action">더 반찬</a> =&gt; 고기 반찬 페이지 클론</p>
</blockquote>
<ul>
<li>프로젝트 참여: 인원 6명 (프론트 엔드 3명, 백엔드 3명)</li>
<li>프로젝트 기간: 2021.04.12 ~ 2021.04.23</li>
<li>개발기관 및 소속: wecode 부트캠프</li>
</ul>
<blockquote>
<p><strong>&lt;팀원들과 원활한 소통을 위해 활용한 방식들&gt;</strong></p>
</blockquote>
<ul>
<li>Scrum 스크럼 진행 방식에 대해서 논의하며, Trello tool 을 적극 활용👍</li>
<li>Standup Meeting - 매일 아침 11시 미팅을 통해 어제 한 일, 오늘 할 일, blocker 세 가지를 공유하며 팀원들과 미팅 진행 +점심 메뉴도 함께 논의 후 결정🤞</li>
<li>Communication - 팀원들과 궁금한 점이나 소통이 필요한 경우 올바른 방법을 통해 의견을 주고 받으며 해결👏</li>
<li>Git - 기본적인 Flow에 따라 Git을 사용할 수 있으며, brach를 생성하고 올바른 이름과 내용을 commit message를 작성😉</li>
</ul>
<p><img src="https://images.velog.io/images/minimal_time/post/cf9402e5-09a5-4448-966c-8dde7a2361f6/image.png" alt=""></p>
<p>&lt;소개🤞&gt; 더 반찬은 소셜 커머스로 소셜 미디어와 온라인 미디어를 활용하는 전자상거래 사이트이다. 신선한 반찬을 중간 유통과정을 줄여 소비자에게 적당한 가격과 좋은 품질로 제공하고 있으며, 현재 정기 구독 서비스를 진행 할 만큼 성장성이 기대되는 회사이기도 하다.</p>
<p>&lt;더 반찬 클론 이유👀&gt; 더 반찬을 클론하기로 한 이유는 먼저 UI/UX 요소가 많은 커머스 사이트에서 사용하는 디자인이였고, 이는 곧 회사에서 인재를 채용 할 때 고객 관점에서 사이트를 만들어 보았는가의 핵심이라고 생각했다. 또한 아직 공부를 하는 입장에서 어려운 기능을 구현하는 것보다 기초 베이스를 최대한 활용할 수 있는 단계의 사이트를 구현해보는 경험이 필요하다고 생각했다.</p>
<blockquote>
<p><strong>✔ 사용한 기술 스택</strong>
<strong>🐶 FrontEnd
-javscript
-react
-html
-scss
-css
🐼 BackEnd
-python
-django
-Bcrypt
-Jwt
-Mysql</strong></p>
</blockquote>
<hr>
<h3 id="담당역할-category-page-레이아웃-제작-및-기능구현😎">담당역할: Category Page 레이아웃 제작 및 기능구현😎</h3>
<p><strong>1단계</strong>: React를 이용하여 페이지 레이아웃과 nav바 제작 <img src="https://images.velog.io/images/minimal_time/post/f41808bc-fb3c-46a3-b7ad-7aff8f6d5490/image.png" alt=""></p>
<p><strong>2단계</strong>: Category nav바 기능구현 및 Pagination 적용
<img src="https://images.velog.io/images/minimal_time/post/57bcb56e-faa0-4e26-983f-8da00dea6114/image.png" alt=""></p>
<p><strong>3단계</strong>: 백엔드와 통신완료 및 팀원들과의 충돌해결✨
<img src="https://images.velog.io/images/minimal_time/post/48a0dabb-b512-4a3a-9b0e-4bf5aeaa644b/image.png" alt=""></p>
<blockquote>
<h3 id="✔완성된-categoey-페이지">✔완성된 Categoey 페이지</h3>
<p><img src="https://images.velog.io/images/minimal_time/post/afcacf5a-2529-4c29-9db7-1338eae62dbf/%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC.gif" alt=""></p>
</blockquote>
<h2 id="1차-프로젝트-후-배운-점😁">1차 프로젝트 후 배운 점😁</h2>
<p><strong>:: CRA &amp; Router</strong></p>
<hr>
<ul>
<li><input checked="" disabled="" type="checkbox"> CRA를 이용하여 프로젝트 초기 세팅을 혼자서도 어느 정도 할 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> Routes.js에 라우트를 추가할 수 있다.</li>
</ul>
<p><strong>:: React</strong></p>
<hr>
<ul>
<li><input checked="" disabled="" type="checkbox"> Pages, Components의 차이점을 알고 어디에 어떤 컴포넌트를 만들어야 하는지 안다.</li>
<li><input checked="" disabled="" type="checkbox"> event handler를 정의해서 특정 이벤트에 부여할 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> 자식컴포넌트에서 부모컴포넌트에 어떻게 데이터를 넘겨야 하는지 알고 있다.</li>
<li><input checked="" disabled="" type="checkbox"> map 메서드를 사용, jsx 리턴하여 목록을 구현할 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> fetch나 axios를 사용하여 백앤드 api를 호출하고, 응답받은 데이터를 활용하여 화면을 그려줄 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> 로그인 사용자의 token을 왜 localStorage에 저장 하는지 설명할 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> children 개념을 이용하여 컴포넌트를 재사용 할 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> query string이나, path로 동적 라우팅을 구현할 수 있다.</li>
</ul>
<p><strong>:: SCSS</strong></p>
<hr>
<ul>
<li><input checked="" disabled="" type="checkbox"> scss를 왜 사용하는지 이해하고 있다.</li>
<li><input checked="" disabled="" type="checkbox"> nesting 기능을 활용하여 스티일링을 구성할 수 있다.</li>
<li><input checked="" disabled="" type="checkbox"> scss 의 variable / extend / mixin / &amp; 등 여러기능을 자유자재로 사용할 수 있다.</li>
</ul>
<h3 id="프로젝트를-하면서-가장-마음에-들었던-코드🙏">프로젝트를 하면서 가장 마음에 들었던 코드🙏</h3>
<pre><code>import React, { Component } from &#39;react&#39;;
import { withRouter } from &#39;react-router-dom&#39;;
import LeftSortBox from &#39;./Component/LeftSortBox&#39;;
import RightSortBox from &#39;./Component/RightSortBox&#39;;
import Product from &#39;./Component/Product&#39;;
import { API } from &#39;../../config&#39;;
import &#39;./Category.scss&#39;;
import Nav from &#39;../Nav/Nav&#39;;
import NavCategory from &#39;../Nav/NavCategory&#39;;
const LIMIT = 8;

class Category extends Component {
  constructor() {
    super();
    this.state = {
      display: false,
      productBoxData: [],
    };
  }

  componentDidMount() {
    this.getAllCategoriesData();
  }

  getAllCategoriesData = () =&gt; {
    fetch(`${API}/products?category=소`)
      .then(res =&gt; res.json())
      .then(data =&gt; {
        this.setState({
          productBoxData: data.result,
        });
      });
  };

  handleClick = id =&gt; {
    const offset = 2;
    const query = `limit=${LIMIT}&amp;offset=${offset}`;
    fetch(`${API}/products?sub_category=${id}&amp;&amp;${query}`)
      .then(res =&gt; res.json())
      .then(data =&gt; {
        this.setState({
          productBoxData: data.result,
        });
      });
  };

  clickHandler = filter =&gt; {
    fetch(`${API}/products/filter?category=소&amp;filter=${filter}`)
      .then(res =&gt; res.json())
      .then(data =&gt; {
        this.setState({
          productBoxData: data.result,
        });
      });
  };

  sortHandler = () =&gt; {
    this.setState({ display: !this.state.display });
  };

  basketHandler = e =&gt; {
    fetch(`${API}/orders/cart`, {
      method: &#39;POST&#39;,
      body: JSON.stringify({
        user_id: 1,
        quantity: 1,
        id: e.target.id,
      }),
    })
      .then(res =&gt; res.json())
      .then(error =&gt; console.log(error));
  };

  render() {
    const { productBoxData } = this.state;
    return (
      &lt;div className=&quot;category&quot;&gt;
        &lt;Nav /&gt;
        &lt;NavCategory /&gt;
        &lt;div className=&quot;categoryListWrap&quot;&gt;
          &lt;div className=&quot;categoryPageTitle&quot;&gt;
            &lt;div className=&quot;categoryTitle&quot;&gt;
              &lt;img src=&quot;/images/meatimg/cow.jpg&quot; alt=&quot;cow img&quot; /&gt;
            &lt;/div&gt;
            &lt;div className=&quot;sortBox&quot;&gt;
              &lt;div className=&quot;leftcategoryType&quot;&gt;
                &lt;ul className=&quot;categoryType&quot;&gt;
                  {LeftSortBox.map((category, idx) =&gt; (
                    &lt;li
                      className=&quot;categoryInner&quot;
                      key={idx}
                      onClick={() =&gt;
                        idx === 0
                          ? this.getAllCategoriesData()
                          : this.handleClick(category.name)
                      }
                    &gt;
                      &lt;span&gt;{category.name}&lt;/span&gt;
                    &lt;/li&gt;
                  ))}
                &lt;/ul&gt;
              &lt;/div&gt;
              &lt;div className=&quot;lightCategoryTypeActive&quot;&gt;
                &lt;button className=&quot;rightSortText&quot; onClick={this.sortHandler}&gt;
                  인기순&amp;nbsp;
                  &lt;i className=&quot;fas fa-chevron-down&quot;&gt;&lt;/i&gt;
                &lt;/button&gt;
                {this.state.display &amp;&amp; (
                  &lt;ul className=&quot;categorySort&quot;&gt;
                    {RightSortBox.map((category, id) =&gt; {
                      return (
                        &lt;li
                          className=&quot;&quot;
                          key={id}
                          onClick={() =&gt; this.clickHandler(category.filter)}
                        &gt;
                          {category.filter}
                        &lt;/li&gt;
                      );
                    })}
                  &lt;/ul&gt;
                )}
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div className=&quot;productBody&quot;&gt;
          {productBoxData.map((data, idx) =&gt; {
            return (
              &lt;Product
                basketHandler={this.basketHandler}
                id={data.id}
                key={idx}
                data={data}
              /&gt;
            );
          })}
        &lt;/div&gt;
      &lt;/div&gt;
    );
  }
}

export default withRouter(Category);</code></pre><p>이제는 map함수를 완벽히 이해했고, Product의 컴포넌트를 ProductBox, ProductCart, ProductImg, ProductTag, ProductText로 나누어 재활용 할 수 있게 된 점이 가장 성장한 부분이라고 느꼈다. 처음에는 state와 setState를 이용한 자식 컴포넌트 관리에 어지러움을 느꼈었는데 어느정도 개념이 잡힌 것 같아 다음 프로젝트엔 더 잘 활용할 수 있을 것 같다. 페이지네이션 개념과 동적 라우팅으로 nav의 기능구현을 할 때 React의 개념도 잡고 Git을 이용한 협업 능력이 향상된 걸 몸소 느낀 잊지못할 1차 프로젝트였다😎</p>
<h3 id="1차-프로젝트-느낀점🤗"><strong>&lt;1차 프로젝트 느낀점🤗&gt;</strong></h3>
<p>너무나도 좋은 분들을 만나 2주동안 서로가 배려하고 아껴주는 게 느껴져서 다음 프로젝트에 헤어지는 게 아쉬울 정도였다😢 코딩에 대한 이해도가 높아 배울점이 많고, 다른 팀원들을 항상 도와주면서 잘 웃어주던 <strong>민석님</strong>, 더 나은 사람이 되고 싶다며 솔선수범으로 팀원들을 배려해주는 <strong>재영님</strong>, 어디를 가든 사람들에게 긍정적인 에너지를 주고 프론트와 소통하기 위해 자주 찾아오고 말해주던 <strong>지원님</strong>, 묵묵히 팀원들을 뒤에서 챙겨주고 자신의 일을 끝까지 책임지고 해내는 <strong>동헌님</strong>, 언제나 프론트를 배려해서 데이터를 구상해주시고 사람이 참 좋다!라는 생각이 드는 <strong>서준님</strong>😊</p>
<p>힘들어도 함께여서 좋았고, 모두들 서로에게 도움이 되기 위해 노력했던 2주간의 시간은 개발자로서 어떤 팀원이 되어야하는지 배우는 소중한 시간이었다. 내가 느꼈던 행복감과 유대감을 같은 팀원들도 느꼈다고 확신하기에 <strong>앞으로도 겸손하고 서로에게 배울점을 찾는 사람 좋은 개발자</strong>가 되고 싶다. 
(모두들 너무 감사했고 The Meet팀 수고 많으셨습니다 우리 다시 만나요!!(❁´◡`❁))</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[pagination(paging)🙌]]></title>
            <link>https://velog.io/@minimal_time/paginationpaging</link>
            <guid>https://velog.io/@minimal_time/paginationpaging</guid>
            <pubDate>Thu, 22 Apr 2021 06:58:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Pagination(Paging)이란?
백엔드에서 가지고 있는 데이터를 한 화면에 전부 보여줄 수 없는 경우에 사용하는 것으로 일정 길이로 끊어서 전달한다.
ex) 흔히 인스타에 피드를 내리다보면 보이는 로딩이 이러한 경우이다.</p>
</blockquote>
<h3 id="백엔드와-미리-정해야하는-limit과-offset🐒">백엔드와 미리 정해야하는 Limit과 Offset🐒</h3>
<p>출처: 위코드 수업
<img src="https://images.velog.io/images/minimal_time/post/5babe039-a6a8-4e42-aa43-614a325f63f9/%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-04-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.53.57.png" alt="">
<img src="https://images.velog.io/images/minimal_time/post/0448c2e2-06d6-47aa-bb7b-99ff72b2d2d5/%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-04-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.56.54.png" alt="">
<strong>limit =  한 페이지에 보여줄 데이터
offset = 데이터가 시작하는 위치</strong></p>
<p>프론트엔드에서 offset은 변하는 값이고 limit은 상수로 정해서, 
ex) const limit = 10을 정해주고 offset은 클릭할때마다 새로운 offset으로 업데이트 시켜주면 된다!</p>
<p>Pagination은 프론트엔드, 백엔드 양쪽에서 모두 알아야 한다.
왜냐하면 위와 같이 데이터를 얼마나 자를지 얼마나 보여줄지를 서로 상의해야하기 때문이다.</p>
<p>위코드 1차 프로젝트 기능구현 중 가장 인상 깊었던 기능은 역시 페이지네이션이였던 것 같다. 쿼리 스트링을 이용하고 limit과 offset에 대한 개념이 없었을 첫 프로젝트에 당연히도 이를 미리 정하지 않아서 처음엔 당황했지만.. 역시 방법은 있었기에 페이지 네이션으로 원하는 데이터를 잘라서 받을 수 있었다!💪</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 공부하면서 느낀점👀✔]]></title>
            <link>https://velog.io/@minimal_time/React-%EA%B3%B5%EB%B6%80%ED%95%98%EB%A9%B4%EC%84%9C-%EB%8A%90%EB%82%80%EC%A0%90</link>
            <guid>https://velog.io/@minimal_time/React-%EA%B3%B5%EB%B6%80%ED%95%98%EB%A9%B4%EC%84%9C-%EB%8A%90%EB%82%80%EC%A0%90</guid>
            <pubDate>Sat, 17 Apr 2021 13:18:23 GMT</pubDate>
            <description><![CDATA[<p>위코드에서 공부한 지 5주차를 넘어가는 주말👏
React를 공부하면서 느낀점을 짧게나마 작성해보고자 한다.</p>
<p><strong>React 어렵다! 그런데 재밌다!😎</strong></p>
<p>반복되는 코드들이 분명 있는데 그 부분을 캐치하는 눈을 기르는 순간 코딩을 하는 재미가 있달까?
하지만 처음엔 당연히 애매모호한 기분과 어디가 어디인지 모르는 황량한 사막 한 가운데이 있는 기분이 든다.</p>
<p>✨중요한 건 다른 사람의 코드를 많이 읽어보고 위코드에서 제공해주는 노션 페이지를 자주 읽어봐야한다는 점이다.</p>
<p>*<em>직접 코드를 작성하고 코드를 읽는 작업이 도움이 되었다🙏
*</em>
나 역시도 개념이 부족하다고 생각하여 React 공식문서를 찾아 개념 공부를 다시 하려고 했지만 오히려 이해하기가 더 어려웠다.</p>
<p><strong>그러니 다 이해할 수 있다는 욕심을 내려놓고 천천히 읽어보고, 자주 따라 쳐보고, 데이터가 잘 들어왔는지 console.log()도 많이 쳐보면서 눈에 익힌다는 기분으로 접근하는 걸 추천한다!👍</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 함수 정리]]></title>
            <link>https://velog.io/@minimal_time/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@minimal_time/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 17 Apr 2021 12:53:17 GMT</pubDate>
            <description><![CDATA[<p>sort.((a,b)) =&gt; a+b); 오름차순
sort.((a,b)) =&gt; a-b); 내림차순</p>
<p>reduce.((a,b) =&gt; a+b); 배열의 모든 값 더하기
reduce((a,b) =&gt; a-b); 배열의 모든 값 빼기</p>
<p>parseInt() 문자열을 정수로 바꾸는 함수</p>
<p>splice
<img src="https://images.velog.io/images/minimal_time/post/44bac3eb-2656-4768-95f2-25371841fa45/image.png" alt="">
사진 자료 출처: <a href="https://hianna.tistory.com/396">https://hianna.tistory.com/396</a></p>
<blockquote>
<p>split:
String.prototype.split()
split() 메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.
const str = &#39;The quick brown fox jumps over the lazy dog.&#39;;</p>
</blockquote>
<p>const words = str.split(&#39; &#39;);
console.log(words[3]);
// expected output: &quot;fox&quot;</p>
<p>const chars = str.split(&#39;&#39;);
console.log(chars[8]);
// expected output: &quot;k&quot;</p>
<p>const strCopy = str.split();
console.log(strCopy);
// expected output: Array [&quot;The quick brown fox jumps over the lazy dog.&quot;]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[
React 불변성에 관하여]]></title>
            <link>https://velog.io/@minimal_time/React-%EB%B6%88%EB%B3%80%EC%84%B1%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@minimal_time/React-%EB%B6%88%EB%B3%80%EC%84%B1%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Sat, 17 Apr 2021 12:50:23 GMT</pubDate>
            <description><![CDATA[<p>React는 사소한 변경에도 모든 컴포넌트가 렌더링을 행하기 때문에 성능저하를 일으킬 수 있다.
그렇기 때문에 불변성을 보장할 수 있는 방법으로 개발 해야한다👏</p>
<p>&lt;불변성을 위해 알면 좋은 것&gt;</p>
<h4 id="1-reactpurecomponent">1. React.PureComponent</h4>
<pre><code>class Pure extends React.PureComponent {
    render()
         return &lt;div&gt;{this.props.message}&lt;/div&gt;;
     }
 }
</code></pre><p> 변경되는 데이터가 모두 원시값이거나 불변성을 보장할 수 있다면 React.PureComponent를 사용할 수 있다.</p>
<p> 참고 사이트🙏:
 렌더링: <a href="https://medium.com/vingle-tech-blog/react-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f255d6569849">https://medium.com/vingle-tech-blog/react-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f255d6569849</a>
 리터럴: <a href="https://asfirstalways.tistory.com/21">https://asfirstalways.tistory.com/21</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Westagram 프로젝트 마무리👏
(백엔드와 첫 통신🟡)]]></title>
            <link>https://velog.io/@minimal_time/Westagram-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%88%EB%AC%B4%EB%A6%AC%EB%B0%B1%EC%97%94%EB%93%9C%EC%99%80-%EC%B2%AB-%ED%86%B5%EC%8B%A0</link>
            <guid>https://velog.io/@minimal_time/Westagram-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%88%EB%AC%B4%EB%A6%AC%EB%B0%B1%EC%97%94%EB%93%9C%EC%99%80-%EC%B2%AB-%ED%86%B5%EC%8B%A0</guid>
            <pubDate>Wed, 07 Apr 2021 11:19:59 GMT</pubDate>
            <description><![CDATA[<h1 id="🚀프로젝트-소개">🚀프로젝트 소개</h1>
<hr>
<blockquote>
<p><strong>1. 주제</strong>
React.js를 사용한 Instagram clone
CRA를 사용한 초기 세팅
4명의 팀원들이 공동 component, scss 사용 및 관리
git을 사용한 첫 번째 협업</p>
</blockquote>
<blockquote>
<p><strong>2. 기간</strong>
2021.03.29~2021.04.07</p>
</blockquote>
<blockquote>
<p><strong>3. 적용 기술</strong>
HTML,CSS
JavaScript(ES6+)
React.js
SCSS
Git</p>
</blockquote>
<blockquote>
<p><strong>4. 주요 기능</strong></p>
</blockquote>
<ul>
<li>로그인, 메인 페이지 레이아웃</li>
<li>id, pw 입력 시 로그인 버튼 활성화 기능 =&gt; 아이디: &quot;@&quot;포함 8글자 이상, 비밀번호: 8글자 이상</li>
<li>댓글 내용 입력 후 Enter press, 혹은 게시 버튼 클릭 시 댓글 추가 기능</li>
</ul>
<h1 id="로그인-페이지🐾">로그인 페이지🐾</h1>
<p>✔️ Westagram페이지를 react로 구현하면서 많은 시행착오를 겪었다.
수많은 에러 메세지를 보면서 하나하나 천천히 뜯어보던 한 주 동안의 시간이 주마등 처럼 지나가고
인스타그램을 클론한 게 너무 신기했다.</p>
<blockquote>
<p>&lt;React로 구현한 로그인 페이지&gt;<br><img src="https://images.velog.io/images/minimal_time/post/3a6d87df-7046-4ab1-b06d-d0ba9c7759e7/ezgif.com-gif-maker.gif" alt=""></p>
</blockquote>
<p>이메일과 비밀번호를 작성 시 로그인에 버튼 색깔이 들어간다.
이메일의 경우 &quot;@&quot;가 들어가야하고 이메일, 비밀번호 8자 이상 작성해야 버튼에 색깔이 들어오도록
구현했다.👍</p>
<p>이 과정에서 React와 기존 방식인 DOM으로 javascript를 작성하던 방식의 차이를 체감했고,
더 간결하면서도 코드를 읽는 가독성을 높여주었다.</p>
<p>특히나 handleIdInput와 handlePwInputdml 중복 값을 어떻게 더 줄일 수 있을까 동기와 고민하던 시간이 큰 도움이 되었다.</p>
<h3 id="⏰인상-깊었던-refactoring-check-time⏰">⏰인상 깊었던 Refactoring Check Time⏰</h3>
<pre><code>// 처음 코드
handleIdInput = (event) =&gt; {
    this.setState({
      idInputValue: `${event.target.value}`,
    });
  };

  handlePwInput = (event) =&gt; {
    this.setState({
      pwInputValue: `${event.target.value}`,
    }); 
  };
  ------------------------------------------
  // 두 번째 코드
   handleInput = (e) =&gt; {
    const{ className } = e.target;
    const { value } =e.target;
    className === &quot;email_password&quot;
      ? this.setState({
        idInputValue: value,
      })
      :this.setState({
        pwInputValue: value,
      });
  }

</code></pre><ul>
<li>비구조화 할당을 통해 긴 코드를 간결하게 쓸 수 있었다. 
React를 사용해 볼 수록 react는 중복되는 값들을 재사용할 수 있게 만든다는 것에 있다는 생각이 들었다.</li>
</ul>
<ul>
<li>가독성 부분에서도 중복되는 값을 줄여서 한 결 편안하고 깔끔하게 정리할 수 있었다.
코드를 작성해보고 줄일 수  있는 값들은 줄이면서 가독성을 높이는 데 집중하는 시간이 필요한 것 같다.</li>
</ul>
<h1 id="팀-작업-느낀점🌷">팀 작업 느낀점🌷</h1>
<p>CRA초기 세팅시간에 단비님, 주영님, 새미님과 함께 common,reset.scss를 작성하면서 구글 폰트와 폰트어썸 링크, 버튼 색 변수 지정, 레이아웃을 공유 하면서 어떤 부분을 함께할지 공유하였다. 이야기를 나누면 나눌수록 &#39;협업을 한다는 게 이런 기분이구나&#39;를 알게 되어 좋았다🙌
가장 좋아했던 시간은 서로의 코드를 리뷰해주는 시간이었다.
람마다 성격이 다르듯이 코딩도 스타일이 다 다르기 때문에 많은 코드를 읽어보면 각자의 스타일이 보여서 재미있었다.
이런 방식도 사용할 수 있구나!하는 생각의 폭이 넓어지는 기분이었다👍</p>
<p>혼자서 git commit을 할 때는 github에 저장한다는 느낌만 들었는데 팀과 함께 master을 두고 각자의
branch를 만들고 VS터미널로만 git add ., commit -m&quot;&quot;, push를 하는 과정에서 막연히 두려웠던 터미널 사용법에 재미도 들고 다른 사람들의 활동 기록들도 공유할 수 있어서 참신하다는 생각이 들었다.
(어떻게 이런 효율적인 프로세스를 생각한 걸까?🤔)
짧은 시간이었지만 팀으로 작업하면 할 수록 코딩이 더 살아난다는 기분이 들었다🙏</p>
<h1 id="대망의-백엔드와의-통신의-날🤸♀️">대망의 백엔드와의 통신의 날🤸‍♀️</h1>
<h1 id="🎉what-you-will-learn">🎉What You Will Learn</h1>
<hr>
<p>✔️ 브라우저에서 로그인 관리를 할 수 있다.
✔️ 프론트와 백앤드의 통신을 구체적으로 이해한다.
✔️ 코드를 직접 치기 전에 POST MAN 을 사용해서 백앤드 api 호출 테스트를 해볼 수 있다.
✔️ access token과 JWT의 개념을 이해하고 말로 설명할 수 있다.
✔️ access token을 왜 사용해야하는지 알고, 프론트에서 어떻게 관리하는지 안다.</p>
<blockquote>
<p>성공적으로 로그인Page에서 백엔드와의 api를 호출한 화면🤞
 우측 개발자도구 하단에 console.log로 MESSAGE와 Token 출력,
 로그인 실패 시: 1. 이메일, 비밀번호 값이 맞지 않을 때<img src="https://images.velog.io/images/minimal_time/post/372fbbf0-924c-459a-be07-0d012eda264a/image.png" alt="">
2. 회원정보가 불일치 할 때<img src="https://images.velog.io/images/minimal_time/post/29a3efd6-7c71-4886-a9ab-98e1bcf9945b/image.png" alt="">
3. 백엔드와 키가 맞지 않을 때:<img src="https://images.velog.io/images/minimal_time/post/1a74e59d-bf44-418f-a16c-682a6064acb6/image.png" alt="">
 로그인 성공 시: 토큰도 잘 출력되었다 흐-뭇👏<img src="https://images.velog.io/images/minimal_time/post/2236aba6-659b-44ec-8187-813285a21fef/image.png" alt="">
토큰 저장 확인: <img src="https://images.velog.io/images/minimal_time/post/67a076b4-d564-4968-8d88-1074a03e938c/image.png" alt=""></p>
</blockquote>
<h1 id="백엔드와의-첫-api통신-느낀점🎉">백엔드와의 첫 API통신 느낀점🎉</h1>
<p>백엔드 개발자인 윤형님과 하나하나 통신이 될 때마다 박수를 쳤다😎👏👏
코딩으로 화합을 한다면 이런 기분인건가 느낀 소중한 날이었다.
<strong>개발자는 혼자가 아니라 여럿이해야 기쁨이 배가 되는 것 같다.</strong>
내가 만든 사이트에 데이터가 출력되는 기쁨은 해보지 않으면 모를 것 같다.
위코드 생활 3주차 체력적으로 힘듦은 있지만 후회하지 않는다고 확신한다.</p>
<p>Westagram 작은 프로젝트였지만 다음 프로젝트에 기본을 다져주는 소중한 시간이었다🙏</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 정리(slice, split, join, toString)]]></title>
            <link>https://velog.io/@minimal_time/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A0%95%EB%A6%ACslice-split-join-toString</link>
            <guid>https://velog.io/@minimal_time/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A0%95%EB%A6%ACslice-split-join-toString</guid>
            <pubDate>Tue, 06 Apr 2021 10:33:07 GMT</pubDate>
            <description><![CDATA[<h2 id="slice">slice</h2>
<blockquote>
<p>slice는 slice() 메서드는 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환합니다. 원본 배열은 바뀌지 않습니다.</p>
</blockquote>
<ul>
<li>slice예제<pre><code>let fruits = [&#39;Banana&#39;, &#39;Orange&#39;, &#39;Lemon&#39;, &#39;Apple&#39;, &#39;Mango&#39;]
let citrus = fruits.slice(1, 3)
// fruits contains [&#39;Banana&#39;, &#39;Orange&#39;, &#39;Lemon&#39;, &#39;Apple&#39;, &#39;Mango&#39;]
// citrus contains [&#39;Orange&#39;,&#39;Lemon&#39;]</code></pre></li>
</ul>
<h2 id="split">split</h2>
<blockquote>
<p>split() 메서드는 문자열을 배열로 만들어 반환함.</p>
</blockquote>
<ul>
<li>split 예제<pre><code>const str = &#39;The quick brown fox jumps over the lazy dog.&#39;;
const words = str.split(&#39; &#39;);
console.log(words[3]);
// expected output: &quot;fox&quot;
const chars = str.split(&#39;&#39;);
console.log(chars[8]);
// expected output: &quot;k&quot;
const strCopy = str.split();
console.log(strCopy);
// expected output: Array [&quot;The quick brown fox jumps over the lazy dog.&quot;]</code></pre></li>
</ul>
<h2 id="join">join</h2>
<blockquote>
<p>join() 메서드는 원소를 모두 붙여 문자열로 반환합니다.</p>
</blockquote>
<ul>
<li>join의 예제<pre><code>var a = [&#39;바람&#39;, &#39;비&#39;, &#39;불&#39;];
var myVar1 = a.join();      // myVar1에 &#39;바람,비,불&#39;을 대입
var myVar2 = a.join(&#39;, &#39;);  // myVar2에 &#39;바람, 비, 불&#39;을 대입
var myVar3 = a.join(&#39; + &#39;); // myVar3에 &#39;바람 + 비 + 불&#39;을 대입
var myVar4 = a.join(&#39;&#39;);    // myVar4에 &#39;바람비불&#39;을 대입</code></pre></li>
</ul>
<h2 id="tostring">toString</h2>
<blockquote>
<p>toString() 메서드는 지정된 배열 및 그 요소를 나타내는 문자열을 반환합니다.</p>
</blockquote>
<ul>
<li>toString()예제<pre><code>const array1 = [1, 2, &#39;a&#39;, &#39;1a&#39;];
console.log(array1.toString());
// expected output: &quot;1,2,a,1a&quot;</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Code Kata 공부법📚 (Developing algorithmic thinking skills)]]></title>
            <link>https://velog.io/@minimal_time/Code-Kata-%EA%B3%B5%EB%B6%80%EB%B2%95-Developing-algorithmic-thinking-skills</link>
            <guid>https://velog.io/@minimal_time/Code-Kata-%EA%B3%B5%EB%B6%80%EB%B2%95-Developing-algorithmic-thinking-skills</guid>
            <pubDate>Tue, 06 Apr 2021 02:29:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>wecode에서 오전 10시 ~ 11시는 Code Kata시간을 보내고 있다.
react 진도에 급급해서 약간 붕 뜬 기분으로 javascript문법을 공부하던 중
같은 팀이 된 종호님 덕분에 어떤 태도로 문제를 생각하고 대해야하는지 배우게 되었다🙏
(정말 wecode 19기 기수분들, 멘토분들 한 분 한 분에게 배울 점들도 많고,
열심히 공부하는 분위기가 너무나도 좋다😍)</p>
</blockquote>
<p>&lt;열심히 종이에 적어가며 공부한 흔적📕&gt;
<img src="https://images.velog.io/images/minimal_time/post/b514f95c-8295-488d-bf1b-56361536ba32/iOS%20%EC%9D%B4%EB%AF%B8%EC%A7%80.jpg" alt=""></p>
<h4 id="갓종호님의-추천-알고리즘-문제-접근-순서⏰">갓종호님의 추천 알고리즘 문제 접근 순서⏰</h4>
<ol>
<li><p>먼저 <strong>문제를</strong> <strong>정확하게 집중력있게 읽고</strong> 머릿속으로 어떻게 풀릴지 생각해 본다.</p>
</li>
<li><p>머릿속으로 생각한 결과를 <strong>종이에다가</strong> 끄적여 본다. (바로 코딩해보는 건 NO NO~❌)</p>
</li>
<li><p>로직이 맞는거 같으면 <strong>연필로 더 구체화해 본다.</strong>(종이에다 코딩문법 작성)</p>
</li>
<li><p>이제! 코드를 컴퓨터에 구현해 본다. 
여기서 중요한 점은 <strong>어려운 문법보다는 아는 게 적더라도 기본 문법으로 작성해 본다.</strong>
(배열, 객체, for문, if문 등...)</p>
</li>
<li><p>작성한 코드 중간 중간 console.log로 값이 잘 들어왔는지 확인해 본다😎
이 과정에서 중요한 건 <strong>내가 종이에 쓴 로직 값과 비교해서 스스로 수정이 가능하다!</strong>
(스스로 작성한 로직과 값을 비교하며 수정하는 과정이 무척 무척이나!! 중요하다고 갓종호님이 말해주셨다!)</p>
</li>
<li><p>위의 과정을 반복하면 50%~100%의 확률의 정답률과 성장할 수 있다!</p>
</li>
</ol>
<p>+)위의 문제뿐만 아니라 해당 문제와 유사한 문제들을 구글링을 통해 다양하게 풀어보는 것도 추천하셨다! <strong>검색어) 000 테스트 케이스</strong></p>
<hr>
<blockquote>
<p>처음에는 알고리즘적인 사고를 하기 쉽지 않기 때문에 조용한 곳에서 (몰입할 수 있는 장소에서) 한 시간 이상 고민해보는 걸 추천한다👍 필자의 경우 매일 저녁 잠들기 전에 문제를 고민해보는 시간을 가지기로 다짐했다🔥</p>
</blockquote>
<hr>
<p>고민하는 시간도 정답을 맞추는 시간도 너무나도 재미있고 뿌듯한 과정인 것 같다.
공부하면 할 수록 개발자라는 직업은 참 매력적이라는 생각이든다.
과제 속도에 조금 조급했지만, 앞으로도 블로그에 내 생각을 더 담고 차근차근 나아가더라도
하루에 1%씩 성장한다는 마음으로 꾸준히 노력해야겠다!</p>
<p>알고리즘에 강하고  REACT에도 강한 개발 마스터가 되자! 화이팅🥰🎉</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript] 문자열을 합치는 3가지 방법]]></title>
            <link>https://velog.io/@minimal_time/Javascript-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%ED%95%A9%EC%B9%98%EB%8A%94-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@minimal_time/Javascript-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%ED%95%A9%EC%B9%98%EB%8A%94-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 04 Apr 2021 13:24:28 GMT</pubDate>
            <description><![CDATA[<h4 id="1--연산자">1. &#39;+&#39; 연산자</h4>
<pre><code>const str = &#39;Hello&#39; + &#39; &#39; + &#39;world&#39;;

document.writeln(str); // Hello world
</code></pre><p>결과: Hello world**</p>
<h4 id="2-concat-함수">2. concat() 함수</h4>
<p>const result = &#39;Hello&#39;.concat(&#39; &#39;, &#39;world&#39;, &#39;!&#39;);</p>
<p>document.write(result); // Hello world!</p>
<p>결과: Hello world**</p>
<h3 id="3join-함수">3.join() 함수</h3>
<pre><code>const str1 = [&#39;Hello&#39;, &#39;world&#39;].join();
const str2 = [&#39;Hello&#39;, &#39;world&#39;].join(&#39;🔥&#39;);

document.write(str1);
document.write(&#39;&lt;br&gt;&#39;);
document.write(str2);
</code></pre><p>Hello,world
Hello🔥world</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Code Kata] JavaScript 문제]]></title>
            <link>https://velog.io/@minimal_time/Code-Kata-JavaScript-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@minimal_time/Code-Kata-JavaScript-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Fri, 02 Apr 2021 04:09:22 GMT</pubDate>
            <description><![CDATA[<h3 id="문제📕">문제📕</h3>
<p><strong>로마자에서 숫자로 바꾸기</strong></p>
<blockquote>
<p>1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
로마 숫자를 숫자로 표기하면 다음과 같습니다.
Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다.
III = 3
XII = 12
XXVII = 27
입니다.
그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
뒤의 숫자에서 앞의 숫자를 빼주면 됩니다.
9는 IX입니다.
I는 V와 X앞에 와서 4, 9
X는 L, C앞에 와서 40, 90
C는 D, M앞에 와서 400, 900</p>
</blockquote>
<h3 id="해결-방안🌸">&lt;해결 방안🌸&gt;</h3>
<blockquote>
<p>function romanToNum(s){
  const numTable =
  {
    &#39;I&#39;:1,
    &#39;V&#39;:5,
    &#39;X&#39;:10,
    &#39;L&#39;:50,
    &#39;C&#39;:100,
    &#39;D&#39;:500,
    &#39;M&#39;:1000
  }
  let sum = 0;
  for(i=0; i&lt;s.length; i++){
    if(numTable[s[i]]&lt;numTable[s[i+1]]){
      sum = sum - numTable[s[i]]
      console.log(sum); // 결과 값: -1
    }else{
      sum = sum + numTable[s[i]]
      console.log(sum); // 결과 값: 9
    }
  }
  return sum
}
romanToNum(&#39;IX&#39;);
//결과 값: 9</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[reverse 함수 문제]]></title>
            <link>https://velog.io/@minimal_time/reverse-%ED%95%A8%EC%88%98-%EB%AC%B8</link>
            <guid>https://velog.io/@minimal_time/reverse-%ED%95%A8%EC%88%98-%EB%AC%B8</guid>
            <pubDate>Tue, 30 Mar 2021 02:14:31 GMT</pubDate>
            <description><![CDATA[<h3 id="문제🙌">문제🙌</h3>
<blockquote>
<p>reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.</p>
</blockquote>
<p>x: 숫자
return: 뒤집어진 숫자를 반환!</p>
<p>예들 들어,
x: 1234
return: 4321</p>
<p>x: -1234
return: -4321</p>
<p>x: 1230
return: 321</p>
<pre><code>const reverse = x =&gt; {
  stringNum = x.toString().split(&#39;&#39;).reverse()
  if(x &lt; 0){
    stringNum.pop();
    stringNum.unshift(&#39;-&#39;);
  } return Number(stringNum.join(&#39;&#39;))
}
console.log(reverse(-1234))

module.exports = { reverse };</code></pre><p>if문에서 if(string[string.length-1] === &#39;-&#39;) 대신해서
x&lt;0보다 작다를 넣어보니 결과값이 같았다!🙏</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체의 키를 변수로 접근하기 Assignment]]></title>
            <link>https://velog.io/@minimal_time/%EA%B0%9D%EC%B2%B4%EC%9D%98-%ED%82%A4%EB%A5%BC-%EB%B3%80%EC%88%98%EB%A1%9C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0-Assignment</link>
            <guid>https://velog.io/@minimal_time/%EA%B0%9D%EC%B2%B4%EC%9D%98-%ED%82%A4%EB%A5%BC-%EB%B3%80%EC%88%98%EB%A1%9C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0-Assignment</guid>
            <pubDate>Sat, 27 Mar 2021 14:08:04 GMT</pubDate>
            <description><![CDATA[<h1 id="assignment🐾">Assignment🐾</h1>
<h3 id="아래-설명을-읽고-getexamresult-함수를-구현하세요">아래 설명을 읽고 <code>getExamResult</code> 함수를 구현하세요.</h3>
<p>인자 <code>scores</code> 는 다음과 같은 객체입니다. 객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다. 객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.</p>
<ul>
<li>&#39;A+&#39;, &#39;A&#39;, &#39;B+&#39;, &#39;B&#39;, &#39;C+&#39;, &#39;C&#39;, &#39;D+&#39;, &#39;D&#39;, &#39;F&#39;</li>
</ul>
<pre><code class="language-jsx">{
  &#39;생활속의회계&#39;: &#39;C&#39;,
  &#39;논리적글쓰기&#39;: &#39;B&#39;,
  &#39;독일문화의이해&#39;: &#39;B+&#39;,
  &#39;기초수학&#39;: &#39;D+&#39;,
  &#39;영어회화&#39;: &#39;C+&#39;,
  &#39;인지발달심리학&#39;: &#39;A+&#39;,
}</code></pre>
<p>인자 <code>requiredClasses</code> 는 다음과 같이 문자열로 된 배열입니다.</p>
<pre><code class="language-jsx">[&#39;영어회화&#39;, &#39;기초수학&#39;, &#39;공학수학&#39;, &#39;컴퓨터과학개론&#39;]</code></pre>
<p>다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요.</p>
<ol>
<li><p><code>scores</code> 객체가 가지고 있는 키들은 새로운 객체에 포함되어야 합니다. 단, 그 값들은 다음 원리에 따라 숫자로 바뀌어 할당되어야 합니다.</p>
<ul>
<li>A+ =&gt; 4.5</li>
<li>A =&gt; 4</li>
<li>B+ =&gt; 3.5</li>
<li>B =&gt; 3</li>
<li>C+ =&gt; 2.5</li>
<li>C =&gt; 2</li>
<li>D+ =&gt; 1.5</li>
<li>D =&gt; 1</li>
<li>F =&gt; 0</li>
</ul>
</li>
<li><p><code>requiredClasses</code> 배열의 요소로는 존재하지만, <code>scores</code>의 키로는 존재하지 않는 항목이 있다면, 해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체과 리턴됩니다. 요소간 순서는 다를수 있지만, 채점에 무관합니다.</p>
<pre><code class="language-jsx"> {
   &#39;생활속의회계&#39;: 2,
   &#39;논리적글쓰기&#39;: 3,
   &#39;독일문화의이해&#39;: 3.5,
   &#39;기초수학&#39;: 1.5,
   &#39;영어회화&#39;: 2.5,
   &#39;인지발달심리학&#39;: 4.5,
   &#39;공학수학&#39;: 0,
   &#39;컴퓨터과학개론&#39;: 0,
 }</code></pre>
<p>&lt;문제풀이 과정&gt;
<img src="https://images.velog.io/images/minimal_time/post/5cf4c548-c5d9-44e7-9c3a-c0889ffc7b88/start.jpg" alt=""><img src="https://images.velog.io/images/minimal_time/post/98cbeb28-5ad4-4286-96fc-e5301736b8ba/therest.jpg" alt=""></p>
</li>
</ol>
<p>여기서 requiredClasses의 과목들과 scores과목들을 합치는 과정을 이해하는게 중요했다. for문에서 requiredClasses[i]로 반복하면서 점수가 0인 값들도 result[key]에 넣어줌으로써 모든 과목들이 들어갈 수 있었다!
재미있는 개발생활👍👍🔥</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Array 실수 줄이기😅]]></title>
            <link>https://velog.io/@minimal_time/Array-%EC%8B%A4%EC%88%98-%EC%A4%84%EC%9D%B4%EA%B8%B0</link>
            <guid>https://velog.io/@minimal_time/Array-%EC%8B%A4%EC%88%98-%EC%A4%84%EC%9D%B4%EA%B8%B0</guid>
            <pubDate>Wed, 24 Mar 2021 01:12:18 GMT</pubDate>
            <description><![CDATA[<p>Replit문제를 풀던 중 문법은 맞다고 확신했지만 계속 틀리다는 메세지가 떠서 30분은 이 문제만 잡고 있었 던 것 같다.</p>
<h2 id="assignment👍">&gt;Assignment👍</h2>
<p>-addFirstAndLast 함수를 작성해주세요.
-addFirstAndLast 함수에 주어진 인자 myArray는 숫자 값으로만 이루어진 array 입니다.
-addFirstAndLast 함수에 주어진 인자 myArray 의 첫번째 element와 마지막 element의 값을 더한 값을 리턴해주세요.
-만일 myArray에 한 개의 요소만 있다면 해당 요소의 값을 리턴해 주시고 요소가 없는 비어있는 array라면 0을 리턴해주세요.</p>
<h3 id="작성한-코드">&lt;작성한 코드&gt;</h3>
<p><img src="https://images.velog.io/images/minimal_time/post/29967010-00a8-492e-a6a0-9475c9f1b90f/image.png" alt=""></p>
<h3 id="결과">&lt;결과&gt;</h3>
<p><img src="https://images.velog.io/images/minimal_time/post/5efdb146-6e75-41d3-a623-1dd392fec78d/image.png" alt=""></p>
<p>기대한 값이 7이고 반환된 값이 14라고해서 무척이나 당황했다ㅠㅠ
어디서 에러가 났는지도 못찾던 상황에서 Array의 순서를 바꿔보았다.</p>
<h4 id="일반적인-상황을-맨-마지막에-두고-예외적인-상황부터-차근차근-다시-넣어보았다😉">일반적인 상황을 맨 마지막에 두고 예외적인 상황부터 차근차근 다시 넣어보았다😉</h4>
<h3 id="재작성한-코드">&lt;재작성한 코드&gt;</h3>
<pre><code>function addFirstAndLast(myArray) {
  if(myArray.length === 1){
    return myArray[0];
  }
  else if(myArray.length === 0){
    return 0;
  }
  else if(myArray.length){
    return myArray[0]+myArray[myArray.length-1];
  }
}
</code></pre><h3 id="결과-1">&lt;결과&gt;</h3>
<p><img src="https://images.velog.io/images/minimal_time/post/eab2b395-404a-4606-85cc-57c73c581ff2/image.png" alt=""></p>
<p>역시 순서가 틀렸던 것이다....😭 30분 이상을 고생한 결과 
이제는 코드를 짤 때 <strong>순서를 우선적으로 고려</strong>해야한다는 것을 깨닫는 소중한 시간이었다😎</p>
<p>어렵지만 재미있는 코드생활인 것 같다🌷</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 음료 페이지를 모델링🙌]]></title>
            <link>https://velog.io/@minimal_time/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EC%9D%8C%EB%A3%8C-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%A5%BC-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@minimal_time/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EC%9D%8C%EB%A3%8C-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%A5%BC-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Mon, 22 Mar 2021 12:06:50 GMT</pubDate>
            <description><![CDATA[<p>스타벅스 음료 페이지를 보고 모델링 해보는 시간을 가졌다.
<img src="https://images.velog.io/images/minimal_time/post/1ed4c95e-af50-41f3-a4dd-81349b158844/image.png" alt=""></p>
<p>사용한 도구 : <a href="https://aquerytool.com/">Aquery ERD tools</a>  (가입 필수)</p>
<p>먼저 데이터 중심을 생각해가며 데이터 구조를 잡아보았다👍
중심으로 product(음료)로 잡고 데이터 구성을 만들어갔다.</p>
<p>PK(Primary Key) : PK는 테이블에서 오직 한개만 존재할 수 있으며, 유일성을 보장한다고 생각하면 된다.
FK(Foreign Key)
둘을 나누는 이유는 데이터의 중복을 최소화 하기 위해서다!
우유가 들어가는 커피 종류가 많으면 우유를 FK로 생각하면 편하다!</p>
<p>여기서 헷갈렸던 방향 개념을 PK는 고유의 번호를 가진 Id(INT)로
PK이는 받는 데이터, FK는 주는 데이터라고 생각하면 좀 더 편하다.</p>
<p>데이터 타입은 Id의 경우 INT 문자나 이미지의 경우 VARCHAR를 사용했다.
(길이가 변할 수 있는 값은 VARCHAR를 사용하자!)</p>
<p>&lt;결과&gt;</p>
<p><img src="https://images.velog.io/images/minimal_time/post/5d7e2076-24a2-48f3-9098-bf7eb4e703ea/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발자 도구_(Console)를 공부해보자!]]></title>
            <link>https://velog.io/@minimal_time/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%8F%84%EA%B5%ACConsole%EB%A5%BC-%EA%B3%B5%EB%B6%80%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@minimal_time/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%8F%84%EA%B5%ACConsole%EB%A5%BC-%EA%B3%B5%EB%B6%80%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Fri, 19 Mar 2021 04:22:18 GMT</pubDate>
            <description><![CDATA[<h3 id="🥨--프레즐팀---console-panel">🥨  프레즐팀 - <code>Console</code> panel</h3>
<ul>
<li><p><code>Console</code> 패널의 기능은?
= 자바스크립트가 돌아가는 환경을 보여준다.  자바스크립트를 입력했을 때 브라우저에서 바로바로 확인할 수 있도록 해준다.
<img src="https://images.velog.io/images/minimal_time/post/2df801ff-8782-4aac-9a20-50b0d61b0bf1/image.png" alt=""></p>
</li>
<li><p>화면을 새로고침 해도 <code>console</code> 내용이 지워지지 않고 남게 하는 방법은?
= 콘솔 설정에서 Preserve log를 체크해주면 된다.
<img src="https://images.velog.io/images/minimal_time/post/983e0026-410c-4bab-8cd4-e2d3ad4c1993/image.png" alt=""></p>
</li>
<li><p>콘솔에 기록된 로그를 모두 지울 때 사용하는 메소드는?</p>
<p>  = console.clear();  OR clear();
화면을 새로고침하면 기존의 선언된 변수는 초기화 된다.
하지만 clear을 사용할 경우 기존에 선언된 변수는 남아있고, console창에 기록들만 사라진다.</p>
</li>
</ul>
<ul>
<li><p>콘솔에서 <code>Warnings</code> , <code>Errors</code> 내용을 제외하고 보는 방법은?
  = 콘솔 설정에 있는 Default levels 에서 Warnings, Errors체크를 해제하면 된다.</p>
<p>  <img src="https://images.velog.io/images/minimal_time/post/88145ffd-fb9e-42bf-8f3b-606169c28af0/image.png" alt=""></p>
</li>
<li><p>다른 패널(ex. Elements panel)에서 Console Panel 같이 보는 방법은?</p>
<p>= esc를 누르면 밑에 console창을 올리거나 내릴 수 있다🙌
<img src="https://images.velog.io/images/minimal_time/post/76f49e35-90a9-4a23-8951-263f4abf2a47/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[🔥HTML/CSS - Weegle 검색바 만들기]]></title>
            <link>https://velog.io/@minimal_time/HTMLCSS-Weegle-%EA%B2%80%EC%83%89%EB%B0%94-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@minimal_time/HTMLCSS-Weegle-%EA%B2%80%EC%83%89%EB%B0%94-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 18 Mar 2021 02:43:50 GMT</pubDate>
            <description><![CDATA[<p>간단해보였지만 2시간 이상 붙들고 있었던 검색바 만들기😭
역시 이론공부와 실기를 병행하면서 적용해보는 연습을 해야겠다는 생각이 들었다. (쥬륵...😤)</p>
<p>&lt;내가 원하는 모습&gt;
<img src="https://images.velog.io/images/minimal_time/post/b74ad984-7b97-49c1-88f4-17623a86922a/image.png" alt=""></p>
<p>&lt;지금 내 모습&gt;
<img src="https://images.velog.io/images/minimal_time/post/3ba0c508-9813-41f6-a2be-8bf624875fa0/image.png" alt=""></p>
<p>왼쪽 상단을 보면 이미지가 매우 작게 있다🤔
<del>아니 난 너를 건들적이 없는데 왜....??</del></p>
<p>문제를 해결하기 위해 구글링을 해보기로 했다!😄🙏</p>
<p><img src="https://images.velog.io/images/minimal_time/post/071bc956-45c9-480f-89c8-b570793ffce0/image.png" alt="">
<img src="https://images.velog.io/images/minimal_time/post/c558c4e2-82b4-4b48-a65e-eecebe7eac29/image.png" alt=""></p>
<p>🤸‍♀️위의 문제를 해결하기 위해 먼저 구글 검사를 시도해보았다🤸‍♀️</p>
<p><img src="https://images.velog.io/images/minimal_time/post/33f37eae-e02f-463c-b7dd-bfb98b1a8aeb/image.png" alt=""></p>
<p><img src="img/95163201-34411c00-075c-11eb-9987-d6301acb4dab.png" 
alt style="width: 630px;"></p>
<p>구글 검사요소로 확인해보고 width: 600px을 추가해서 크기를 키워주기로 했다!🔥</p>
<p>결국 width값과 padding-left로 중앙으로 갔지만
코드가 예쁘다는 생각이 들지 않아서 다른 방법을 모색해보았다!</p>
<p>그런데 개념적으로 img는 block요소인 줄 알았는데 inline요소라는 걸 알게되서 text-align: center;로 손쉽게 중앙으로 옮길 수 있었다....</p>
<p>기초 개념을 단단히 잡아야겠다!!😭</p>
<p>결과물 뿌듯하다!!!🎉🌷😉</p>
<p><img src="https://images.velog.io/images/minimal_time/post/90e4aeb0-7335-4ea7-b0d4-44d967302ff2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[wecode_HTML/CSS]
Semantic Web, Semantic Tags]]></title>
            <link>https://velog.io/@minimal_time/wecodeHTMLCSSSemantic-Web-Semantic-Tags</link>
            <guid>https://velog.io/@minimal_time/wecodeHTMLCSSSemantic-Web-Semantic-Tags</guid>
            <pubDate>Tue, 16 Mar 2021 07:52:24 GMT</pubDate>
            <description><![CDATA[<h1 id="semantic-web🤖">Semantic Web🤖</h1>
<blockquote>
<p>시맨틱 웹 은 &quot;의미론적인 웹&quot;으로 <strong>기계가 의미(Semantic)를 파악하고 사용자의 요구에 적합한 결과를 서비스 가능하도록 하는 것</strong>으로 기계가 이해할 수 있는 형태로 제작된 웹을 의미합니다.</p>
</blockquote>
<h4 id="q-두-예시-중-검색엔진에서-웹-문서의-중요한-제목으로-인식되는-것은">Q. 두 예시 중 검색엔진에서 웹 문서의 중요한 제목으로 인식되는 것은?</h4>
<pre><code class="language-jsx">&lt;!--예시 1--&gt;
&lt;font size=&quot;10&quot;&gt;&lt;b&gt;Semantic Web&lt;/b&gt;&lt;/font&gt;

&lt;!--예시 2--&gt;
&lt;h1&gt;Semantic Web&lt;/h1&gt;</code></pre>
<h4 id="a-컴퓨터가-인식하는-언어는-2번째입니다">A. 컴퓨터가 인식하는 언어는 <strong>2번째</strong>입니다.</h4>
<p>예시 1의 요소는 의도가 명확하지 않은데 비해, 
예시2는  header(제목) 중 가장 상위 레벨이라는 의미를 내포하고 있어서 개발자가 의도한 요소를 나타냅니다.</p>
<blockquote>
<p>코드의 가독성이 높고 유지보수에도 용이합니다.</p>
</blockquote>
<h1 id="semantic-tag👩">Semantic Tag👩</h1>
<blockquote>
<p>브라우저,검색엔진, 개발자 모두에게 콘텐츠의 의미를 명확히 설명하는 역할을 의미합니다.</p>
</blockquote>
<p>HTML 요소는 non-semantic 요소와 semantic 요소로 구분할 수 있습니다.</p>
<ul>
<li><p>*<em>non-semantic 요소: *</em>div, span 등이 있으며 이들 태그는 content에 대하여 어떤 설명도 하지 않습니다.</p>
</li>
<li><p>*<em>semantic 요소: *</em>form, table, img 등이 있으며 이들 태그는 content의 의미를 명확히 설명합니다.</p>
</li>
</ul>
<p>Semantic Elements</p>
<ul>
<li>section  문서에서 세션을 정의할 때 사용합니다.</li>
<li>header  헤더</li>
<li>nav  내비게이션</li>
<li>aside  사이드에 위치하는 공간을 의미</li>
<li>article  본문의 주 내용이 들어가는 공간 의미</li>
<li>footer footer</li>
</ul>
<blockquote>
<p>Q. &quot;사이트에 이미지를 넣는 방법은 두 가지가 있습니다. img 태그를 사용하는 것, div 태그에 background-image 속성을 추가하는 것. 
두 가지 방법의 차이점과 각각 어떠한 경우에 사용하면 좋은지 설명해보세요.&quot;</p>
</blockquote>
<h4 id="--img-태그를-사용하는-경우😎">- img 태그를 사용하는 경우😎</h4>
<pre><code>&lt;img alt=&quot;HTML&quot; src=&quot;https://www.w3schools.com/whatis/img_js.png&quot;&gt;

//img태그의 경우 가장 많이 사용되며,  html에서 &lt;img&gt; 태그로 이미지를 생성합니다.</code></pre><h4 id="--background-image를-사용하는-경우😁">- background-image를 사용하는 경우😁</h4>
<pre><code>.bg-img {
  background-image: url(&quot;https://upload.wikimedia.org/wikipedia/commons/
thumb/6/61/HTML5_logo_and_wordmark.
svg/1280px-HTML5_logo_and_wordmark.svg.png&quot;);
}
//태그가 아니라 css를 이용해 이미지를 생성하는 것입니다</code></pre><blockquote>
<p>-차이점-
img 태그에는 alt=&quot;&quot; 로 이미지에 대한 설명을 넣을 수 있어 SEO에 노출되는 용도로 사용이 가능합니다. 
그에 반해 <strong>background-image는 이미지에 대한 정보를 가지고 있지 않습니다. **
의미가 있는(ex) 글과 함께 있어야 하는 관련된 이미지라면 **img 태그</strong>를 사용하고 background-image는 <strong>순전히 &#39;장식&#39;</strong>으로 할 때 사용하는 것이 좋습니다.</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>