<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>koooky35_b.log</title>
        <link>https://velog.io/</link>
        <description>해봐야 아는 사람</description>
        <lastBuildDate>Sun, 14 Aug 2022 14:14:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>koooky35_b.log</title>
            <url>https://velog.velcdn.com/images/koooky35_b/profile/6196bb03-f048-4687-a096-f74ceef4f1bb/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. koooky35_b.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/koooky35_b" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[하드코딩 그만!!]]></title>
            <link>https://velog.io/@koooky35_b/%ED%95%98%EB%93%9C%EC%BD%94%EB%94%A9-%EA%B7%B8%EB%A7%8C</link>
            <guid>https://velog.io/@koooky35_b/%ED%95%98%EB%93%9C%EC%BD%94%EB%94%A9-%EA%B7%B8%EB%A7%8C</guid>
            <pubDate>Sun, 14 Aug 2022 14:14:47 GMT</pubDate>
            <description><![CDATA[<p>처음에는 아래부분을 전부 슬라이드 마다 하나씩 타이틀 이미지등을 줘서 코드를 썼는데 생각 해보니까 모든것이 반복 되고 있고 하드코딩 그자체여서 왜 map메서드를 쓸 생각을 못했는지 의문이었다. 
<img src="https://velog.velcdn.com/images/koooky35_b/post/eb13db16-06bc-496c-b74c-12ba023dc326/image.png" alt=""></p>
<p>값으로 들어갈 부분들을 따로 백엔드에서 받아올 필요는 없을 것 같아서 mock data로 만들어 주었다!
<img src="https://velog.velcdn.com/images/koooky35_b/post/48759225-59c0-4074-a484-7295dd88698c/image.png" alt=""></p>
<p>너무나 당연하고 간단한건데 Styled component로 형태가 살짝 혼란스러워서 기존에 하던 것도 잊은 것 같다. 이전 코드가 남아 있으면 좋았텐데 아쉽다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Styled component 실제 활용]]></title>
            <link>https://velog.io/@koooky35_b/Styled-component-%EC%8B%A4%EC%A0%9C-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@koooky35_b/Styled-component-%EC%8B%A4%EC%A0%9C-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Sun, 14 Aug 2022 13:15:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/koooky35_b/post/00aaa77b-f1bb-401d-8b0e-cf3f9a53b948/image.png" alt="">
<img src="https://velog.velcdn.com/images/koooky35_b/post/110b6ee6-93b3-464e-9f6c-c674c402ca98/image.png" alt=""></p>
<p> 아직까지 엄청나게 편하다는 느낌을 받지 못했지만 조금 적응 된 것 같다!
props로 값을 받아오거나 할 수 있지만 아직 그렇게까지 활용은 하지 못했고 이번 프로젝트때는 공통된 색깔을 theme을 활용한게 전부이다! 
다음에는 조금더 다양하게 적용 해볼 수 있으면 좋겠다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 2차 프로젝트 회고록]]></title>
            <link>https://velog.io/@koooky35_b/wecode-2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@koooky35_b/wecode-2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Fri, 12 Aug 2022 05:41:02 GMT</pubDate>
            <description><![CDATA[<p> 2차 프로젝트는 식물을 사고파는 커머스 사이트 겸 커뮤니티 사이트인 싱그러운집을 클론코딩하게 되었다.<a href="https://www.shouse.garden/main/main.html">링크텍스트</a>
 </br>
 파트: 네브,메인,푸터,로그인</p>
 </br>
 제한된 시간에 1차 프로젝트보다 더 시간이 없었기에 원본 사이트에서 많은 부분이 삭제되었고 결국엔 커뮤니티사이트를 구현하게 되었다. 기능들이 없어지다 보니까 페이지 레이아웃 자체도 바뀌게 되어서 대략적인 레이아웃을 팀원들끼리 맞춰서 노션 페이지에 공유하였다.


<p> <img src="https://velog.velcdn.com/images/koooky35_b/post/b6c19944-5a0f-4a2f-972e-a06febc2d1ea/image.png" alt=""></p>
<p> 2차프로젝트에서는 조건부렌더링을 많이 써보고 싶어서 로그인페이지를 자원해서 맡게되었다. 외부 Api를 사용해서 구현한다고 공지해주셔서 그러려니 하고 있었는데 실제로 하다보니까 공식문서를 참고해서 잘 적용하는게 중요한 파트였다!</p>
<p> <img src="https://velog.velcdn.com/images/koooky35_b/post/7e2eef24-ee69-4a4e-baeb-fbb2945e2eed/image.png" alt=""></p>
<h2 id="로그인">로그인</h2>
<p> _<strong>카카오 로그인 Rest Api를 이용</strong>_하기 위해서 kakao developers 사이트를 참고하여서 대략적인 흐름을 잡을 수 있었다!! </p>
<p> 사용자 입장에서 편하게 이용하던 카카오로그인 기능을 직접 활용해본덕에 조금 더 흥미를 가지고 공부 할 수 있었다. </p>
<p> 그리고 인가코드를 받아올때 내가 지정한 uri로 오는데 크때 바뀌는 url 값을 활용하여서 화면의 구성에 변화를 주었다. 1차 프로젝트에서 useParams hook을 이용하였는데 url안에 정말 많은 객체가 있고 활용할 수 있는 메서드가 있다는 것을 알 수 있었고 get메서드로 인가코드를 유연하게 관리할 수 있었다.</p>
<p> 또 인가코드로 카카오가 가지고 있는 사용자의 정보에 접근할 수 있기때문에 환경변수에 따로 관리를 해주어야 했다.
 </br></p>
<h4 id="글쓰기-막기">글쓰기 막기</h4>
<p> 코드 자체는 간단하지만 로그인 여부에따라서 사용자가 이용할 수 있는 서비스가 달라야 하는점을 여러방면으로 생각을 하면서 코드를 써야하는구나를 생각하게 된 코드이다!
 </br>
 <img src="https://velog.velcdn.com/images/koooky35_b/post/1f86c5a4-56ba-4be8-8c12-49b585aa1833/image.png" alt="">
<img src="https://velog.velcdn.com/images/koooky35_b/post/190be098-addd-4282-aacd-b0cd2e229c75/image.png" alt=""></p>
<h2 id="slick-slider">slick slider</h2>
<p> 슬라이더의 아래쪽에 페이지가 변할때마다 해당 페이지 숫자가 나타나게 하는 부분의 코드이다!
 라이브러리를 처음 이용해봐서 내장되어있는 기능을 쓸 생각을 못하고 직접 기능을 넣으려고 시도했는데 공식문서에 원하는 부분이 있어서 멘토님의 도움을 받아서 적용법을 배웠다!
 이번에 slick slider를 써보면서 공식문서를 어떻게 보고 코드에 직접 적용하는지 알게 되었다!</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/d719bc68-afa5-47e7-a1c5-ad9d5ec2823f/image.png" alt="">
<img src="https://velog.velcdn.com/images/koooky35_b/post/809c8765-226c-4dee-b864-537953349e79/image.png" alt=""></p>
<p> 라이브러리를 처음 써봐서 어떻게 내가 원하는 레이아웃과 기능을 사용하는데 시간이 많이 걸려서 과연 라이브러리가 편리한게 맞을까 의문이 들었는데 사용에 적응하니까 왜 쓰는지 알 수 있었다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git Rebase]]></title>
            <link>https://velog.io/@koooky35_b/Git-Rebase</link>
            <guid>https://velog.io/@koooky35_b/Git-Rebase</guid>
            <pubDate>Sun, 07 Aug 2022 13:22:30 GMT</pubDate>
            <description><![CDATA[<p>Git rebase란?
두 개의 공통 base를 가진 branch에서 한개 branch의 base를 다른 최신 branch의 커밋으로 base를 옮기는 작업. 베이스를 다시 설정하는 작업을 뜻한다.</p>
<p>rebase 순서</p>
<p>새로한 작업을 모두 마치고</p>
<ol>
<li>git checkout main </li>
<li>git pull origin main</li>
<li>git checkout feature/이름</li>
<li>git rebase -i main</li>
<li>가장 오래된 commit을 pick</li>
<li>나머지는 squash 한다</li>
<li>esc → :wq로 창을 빠져나온다</li>
<li>메시지는 하나만 남기도 다 삭제한다</li>
<li>esc → :wq로 창을 빠져나온다</li>
<li>git push origin feature/이름</li>
</ol>
<p>순서가 꼬였을때는 <code>git push origin feature/login -f</code> -f 명령어로 강제로 푸쉬한다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[slick-slider ]]></title>
            <link>https://velog.io/@koooky35_b/slick-slider</link>
            <guid>https://velog.io/@koooky35_b/slick-slider</guid>
            <pubDate>Sun, 07 Aug 2022 08:40:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://react-slick.neostack.com/">링크텍스트</a></p>
<p>현재 프로젝트의 원본 사이트의 슬라이더가 위의 슬라이더와 비슷해서 활용 해 보았다.</p>
<pre><code>npm install react-slick --save</code></pre><p>우선 설치를 해주어야 한다.
그리고 공식 페이지에 있는 코드를 복사해서 붙여넣기 해주었다.</p>
<pre><code>import Slider from &quot;react-slick&quot;;

export default class SimpleSlider extends Component {
  render() {
    const settings = {
      dots: true,
      infinite: true,
      speed: 500,
      slidesToShow: 1,
      slidesToScroll: 1
    };
    return (
      &lt;div&gt;
        &lt;h2&gt; Single Item&lt;/h2&gt;
        &lt;Slider {...settings}&gt;
          &lt;div&gt;
            &lt;h3&gt;1&lt;/h3&gt;
          &lt;/div&gt;
          &lt;div&gt;
            &lt;h3&gt;2&lt;/h3&gt;
          &lt;/div&gt;
          &lt;div&gt;
            &lt;h3&gt;3&lt;/h3&gt;
          &lt;/div&gt;
          &lt;div&gt;
            &lt;h3&gt;4&lt;/h3&gt;
          &lt;/div&gt;
          &lt;div&gt;
            &lt;h3&gt;5&lt;/h3&gt;
          &lt;/div&gt;
          &lt;div&gt;
            &lt;h3&gt;6&lt;/h3&gt;
          &lt;/div&gt;
        &lt;/Slider&gt;
      &lt;/div&gt;
    );
  }
}</code></pre><p>원래는 위와 같은 코드였는데 styledComponent를 쓰기위해서 아래와 같이 작성 해주었다. 같은 부분이 다섯번 반복되기때문에 map메서드를 사용하여서 값을 변화해 주려고 한다 (아직 구현중)<img src="https://velog.velcdn.com/images/koooky35_b/post/844e6275-344e-4baf-9401-28275a041e88/image.png" alt=""></p>
<p>그리고 기본적으로 내장되어 있는 페이지를 나타내는 점을 없애고 화살표를 보이게 했고, 원본 홈페이지와 같이 점 대신에 페이지가 변할때마다 숫자를 변하도록 만들어줄 예정이다 (구현중)
<img src="https://velog.velcdn.com/images/koooky35_b/post/99bdbad6-1952-4f17-9512-ca08f7ed7b49/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/085316c5-89ff-4ec7-b770-d0b98ae85c8d/image.png" alt=""></p>
<p>라이브러리가 간단하다고 하는데 실제로 내가 볼 수 있는 코드가 적어서 어떻게 동작 하는지를 알기가 어렵고 설정을 변경할 수 있는 옵션들을 내가 찾지 못하는건지 공식문서가 아닌 블로그를 다 찾아서 옵션을 바꿔줘야 하는 부분이 좀 번거로웠지만 어떻게 쓰는지 감을 잡을 수 있었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카카오 로그인 REST API ]]></title>
            <link>https://velog.io/@koooky35_b/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-REST-API</link>
            <guid>https://velog.io/@koooky35_b/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-REST-API</guid>
            <pubDate>Sun, 07 Aug 2022 07:58:13 GMT</pubDate>
            <description><![CDATA[<p>많은 로그인 api가 있지만 카카오가 제일 문서 정리가 잘 되어 있다고 해서 이번 프로젝트에는 카카오 로그인 rest api를 이용하게 되었다. </p>
<p>일단 전체적인 흐름을 정리하자면
</br>
1.프론트엔드에서 사용자에게 로그인/동의 확인을 받은후 카카오로 인가코드를 요청
2.카카오에서 확인후 프론트엔드로 인가코드를 넘김
3.프론트엔드는 받은 인가코드를 백엔드로 전달
4.백엔드는 받은 인가코드와 프론트엔드가 사용한 Redirect URI를 카카오로 전달하여 토큰을 요청
5.카카오에서 확인후 토큰을 백엔드로 전달
6.백엔드에서는 카카오서 받은 토큰을 활용하여 우리 서비스 전용 토큰을 발행
7.백엔드는 발행한 전용토큰을 프론트로 전달하고
8.토큰 확인후 로그인 됐으면 서비스를 이용할 수 있도록 화면을 전환
</br></p>
<p>위의 과정을 위해서는 우선 kakao developers에 등록을 해야 한다.
</br>
<a href="https://developers.kakao.com/">링크텍스트</a>
1.kakao developers(위의 링크)에 들어간다
2. 오른쪽 상단의 내 애플리케이션을 누른 후 로그인을 한다.
3. 애플리케이션 추가하기를 누르고 앱 이름 사업자명을 적어준다. (나는 프로젝트명을 두 군데에 적어주었다)
4. 사용자에게 받아올 정보를 정해서 설정해 준다
<img src="https://velog.velcdn.com/images/koooky35_b/post/07903a77-4ec1-4b80-b389-2cfe50b9e193/image.png" alt="">
5.Redirect URI를 설정해 준다. 설정한 주소로 인가 코드를 받아오기 때문에 프론트엔드에서 접근할 수 있는 localhost:3000으로 설정을 해주어야 한다. 나는 <a href="http://localhost:3000/kakaoLogin">http://localhost:3000/kakaoLogin</a> 주소로 설정했다.
<img src="https://velog.velcdn.com/images/koooky35_b/post/3c2c2bcf-41c3-4433-8f56-c91be9532944/image.png" alt=""></p>
<p>1.인가 코드 받기
<img src="https://velog.velcdn.com/images/koooky35_b/post/eeb97426-3bf3-4396-941d-99d551291385/image.png" alt=""></p>
<p>위의 과정을 통해 인가 코드를 받아온다.</p>
<pre><code>const params = new URL(document.URL).searchParams;</code></pre><p>URL객체를 이용하여 현재 주소의 searchParams의 객체를 params변수에 넣어주고 </p>
<pre><code>const code = params.get(&#39;code&#39;);</code></pre><p>searchParams안에 있는 get 메서드를 이용하여 파라미터의 code키의 값을 가져온다.</p>
<p>카카오에 인가코드를 요청하는 링크에는 kakao developer에 등록 하면서 받았던 REST API키와, 내가 등록한 Redirect URI를 넣어준다.</p>
<p>이때 REST_API_KEY는 누가 API를 요청하는지에대한 정보가 담겨 있기때문에 보안에 신경써야 한다고 한다! 그래서 환경변수에 넣어서 관리를 해준다고 한다. 그래서 최상위 루트에 .env파일을 만들어서 값을 따로 관리 해준다. (사실 환경변수가 왜 key값을 암호화 하는데 쓰이는건지는 모르겠다.)</p>
<ul>
<li>변수명의 시작은 꼭 REACT_APP으로 시작 해야하고 값을 따옴표 등으로 감싸지 않아야 한다. 그리고 따로 import 해주지 않아도 사용할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/7e95d9c5-9134-4947-baac-e5cd156a948e/image.png" alt=""></p>
<ul>
<li><p>로그인 버튼을 눌렀을때 현재 페이지 URL을 인가코드 요청 URL로 변경되도록 하였고, 카카오의 로그인 요청 창이 뜨면서 사용자가 동의를 하면 동의한 정보가 카카오로 가고 내가 지정한 Redirect URI로 code 값이 담겨져서 온다.
<img src="https://velog.velcdn.com/images/koooky35_b/post/144e36ee-44ed-4f12-bfd5-296d3b629c8a/image.png" alt=""></p>
</li>
<li><p>그리고 코드 값이 있으면 코드를 담아서 백엔드에 보내면 token을 보내주고 토큰이 있고 없고에따라 화면이 전환 되도록하였다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/1a48e89c-fef4-4add-927a-ebcc0396167c/image.png" alt=""></p>
<ul>
<li>백엔드와 통신 할때 REST_API_KEY와 REDIRECT_ID를 통일해야 한다.</br>

</li>
</ul>
<p>백엔드 멘토님은 공식문서를 보고 혼자서 코드를 짜보라고 하셨지만 절대로 할 수 없을 것 같아서 여러 블로그를 참고하였다. 코드만 보았을땐 단순한 것 같은데 스스로 다 하기는 쉽지 않은 것 같다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[통신 ]]></title>
            <link>https://velog.io/@koooky35_b/%ED%86%B5%EC%8B%A0</link>
            <guid>https://velog.io/@koooky35_b/%ED%86%B5%EC%8B%A0</guid>
            <pubDate>Sun, 31 Jul 2022 14:57:17 GMT</pubDate>
            <description><![CDATA[<pre><code>  useEffect(() =&gt; {
    fetch(&#39;http://10.58.7.204:8000/users/likes&#39;, {
      method: &#39;GET&#39;,
      headers: { Authorization: localStorage.getItem(&#39;jwt&#39;) },
    })
      .then(response =&gt; response.json())
      .then(data =&gt; setLikes(data.product_ids));
  }, []);</code></pre><p>백엔드에서 데이터를 받아올때는 따로 전해줘야할 정보가 없기 때문에 body부분이 필요 없다.</p>
<pre><code>  const addCart = product =&gt; {
    fetch(&#39;http://10.58.7.204:8000/carts&#39;, {
      method: &#39;POST&#39;,
      headers: {
        Authorization: localStorage.getItem(&#39;jwt&#39;),
      },
      body: JSON.stringify({
        product_id: product,
        quantity: 1,
      }),
    }).then(response =&gt; response.json());
  };</code></pre><p>장바구니에 담길 상품의 정보를 전달 해야하기때문에 body부분에 백엔드에서 요청한 정보를 담아준다</p>
<pre><code>let login = () =&gt; {
    fetch(&#39;http://10.58.6.107:8000/users/login&#39;, {
      method: &#39;POST&#39;,
      body: JSON.stringify({
        email: id, 
        password: pw, 
        //아이디혹은 이메일,페스워드 로그인시 필요한 정보 보내고
      }),
    })
      .then(response =&gt; response.json())
      .then(response =&gt; {
        if (response.USER_NAME) {
          localStorage.setItem(&#39;jwt&#39;, response.TOKEN);
          // 토큰 로컬스터리지에 삽입
          navigate(&#39;/main-eokhwa&#39;);
          ///이후 페이지 이동

        }
      });
  };</code></pre><p>최초 로그인 후에는 아직 토큰 값이 없기 때문에 받은 토큰 값을 저장할 이름을 setItem 함수에 담아서 저장한다.</p>
<p>아직 외워서 쓰기에는 헷갈리기때문에 다음 통신때 참고해야겠다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[styled-component]]></title>
            <link>https://velog.io/@koooky35_b/styled-component</link>
            <guid>https://velog.io/@koooky35_b/styled-component</guid>
            <pubDate>Sun, 31 Jul 2022 12:29:03 GMT</pubDate>
            <description><![CDATA[<h1 id="설치하기">설치하기</h1>
<blockquote>
<p>npm install styled-components
import styled from &quot;styled-components&quot;;</p>
</blockquote>
<h1 id="사용방법">사용방법</h1>
<pre><code>// App.js

const App = () =&gt; {
  return (
    &lt;&gt;
      &lt;Button&gt;Button&lt;/Button&gt;
      &lt;NewButton&gt;New Button&lt;/NewButton&gt;
    &lt;/&gt;
  );
};

const Button = styled.button`      
  margin: 20px;
  padding: 20px;
  border: none;
  background-color: yellow;
  font-size: 20px;
`;

const NewButton = styled(Button)`  
  color: white;
  background-color: purple;
`;

export default App;</code></pre></br>
```
// Elements

<p><button class="sc-bczRLJ jgCBVB">Button</button>   // 1
<button class="sc-bczRLJ sc-gsnTZi jgCBVB hXQPTY">New Button</button> // 2</p>
<pre><code>먼저 선언된 버튼의 속성을 가져오고 거기에 스타일을 더 더해서 사용하는 것도 가능하다
&lt;/br&gt;
</code></pre><p>// App.js</p>
<p>import React, { useState } from &#39;react&#39;;
import styled, { css } from &#39;styled-components&#39;;</p>
<p>const App = () =&gt; {
  const [changeColor, setChangeColor] = useState(false);</p>
<p>  const handleChanageColor = () =&gt; {
    setChangeColor(!changeColor);
  };</p>
<p>  return (
    &lt;&gt;
      <Button onClick={handleChanageColor} primary={changeColor}>
        Button
      </Button>
    &lt;/&gt;
  );
}</p>
<p>const Button = styled.button<code>padding: 20px;
  margin: 10px;
  border: none;
  background-color: ${(props) =&gt; (props.primary ? &quot;purple&quot; : &quot;pink&quot;)}; // 1</code>;                         </p>
<p>export default App;</p>
<pre><code>
props를 이용하여 동적으로 스타일링을 할 수 있다
&lt;/br&gt;
</code></pre><p>// App.js</p>
<p>import { Link } from &#39;react-router-dom&#39;;
;import styled from &#39;styled-components&#39;;</p>
<p>const App = () =&gt; {
  return <CartLink to="/cart">장바구니</CartLink>;
};</p>
<p>const CartLink = styled(Link)<code>color: red;</code>;</p>
<p>export default App;</p>
<p>// Elements</p>
<p><a class="sc-eCYdqJ gubPie" href="/cart">장바구니</a></p>
<pre><code>
Link, 아이콘 등과 같이 외부 라이브러리의 컴포넌트도 import하여 스타일리을 확장해서 사용 가능하다
&lt;/br&gt;
</code></pre><p>import React from &#39;react&#39;;
import styled from &#39;styled-components&#39;;
import Slider from &#39;react-slick&#39;;
import &#39;slick-carousel/slick/slick.css&#39;;
import &#39;slick-carousel/slick/slick-theme.css&#39;;</p>
<p>const Main = () =&gt; {
  return (
    <Carousel>
      // slick 코드
    </Carousel>
  );
};</p>
<p>const Carousel = styled(Slider)<code>.slick-slide {
      // slick 커스텀 스타일
    }</code>;</p>
<p>export default Main;</p>
<pre><code>
최대한 컴포넌트화 하여서 사용해야 하지만, 외부 라이브러리를 사용하여 정해진 스타일을 변경 해야 할때는 네스팅을 이용한다
&lt;/br&gt;
</code></pre><p>// src/styles/GlobalStyle.js</p>
<p>import React from &#39;react&#39;
import { createGlobalStyle } from &#39;styled-components&#39;</p>
<p>const GlobalStyle = createGlobalStyle`</p>
<ul>
<li>{
box-sizing: border-box;
font-family: &#39;Noto Sans KR&#39;, sans-serif;
}
`</li>
</ul>
<p>export default GlobalStyle;</p>
<pre><code></code></pre><p>// index.js</p>
<p>import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom/client&#39;;
import { ThemeProvider } from &#39;styled-components&#39;;
import Router from &#39;./Router&#39;;
import GlobalStyle from &#39;./styles/GlobalStyle&#39;;</p>
<p>const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));
root.render(
  <ThemeProvider>
    <GlobalStyle />
    <Router />
  </ThemeProvider>
);</p>
<pre><code>전역에서 사용되는 css스타일은 createGlobalStyle 함수를 통해 컴포넌트를 생성할 수 있다.
&lt;/br&gt;
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 프로젝트 2주차 (전반적인 회고)]]></title>
            <link>https://velog.io/@koooky35_b/wecode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-2%EC%A3%BC%EC%B0%A8-%EC%A0%84%EB%B0%98%EC%A0%81%EC%9D%B8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@koooky35_b/wecode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-2%EC%A3%BC%EC%B0%A8-%EC%A0%84%EB%B0%98%EC%A0%81%EC%9D%B8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 31 Jul 2022 07:24:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>처음에는 지금까지 배웠던 기능들을 활용하면 될 것 같아서 간단할 것 같다고 생각했던 부분들이 백엔드와의 통신에 대한 개념이 없는 상태에서 적용하려고 했더니 프로젝트 후반부로 갈수록 수정할 부분이 많이 생겨서 조급 해졌던 점이 많이 아쉬웠다.</p>
</blockquote>
</br>

<p><img src="https://velog.velcdn.com/images/koooky35_b/post/9b4938fb-34cd-4429-a759-e7ebd1c98465/image.gif" alt="">
</br></p>
<p><a href="https://www.youtube.com/watch?v=znviVvNpcWo">링크텍스트</a>
</br></p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/e511fcdd-7f47-4028-b320-4ba3156f7e12/image.png" alt="">
<img src="https://velog.velcdn.com/images/koooky35_b/post/f4da5a1d-6e58-4550-93f3-fba1302f7ec2/image.png" alt=""></p>
<p>setCards 부분에 들어오는 데이터의 형태를 인지하지 못해서 map함수가 실행 되지 않아서 오류를 해결하는데 너무 많은 시간을 쏟았고 멘토님의 도움으로 해결 했을때는 조금 어이가 없었다... 내가 받을 파일들이 어떤 형태인지 꼭 인지하고 잊을 것 같으면 주석으로라도 남겨서 많은 시간을 쓰지 않도록 주의 해야겠다고 생각했다.</br></p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/0e2619a3-f9f7-4a42-bae7-d282279aba0f/image.png" alt=""></p>
<p>query parameter로 받을 값들을 value 값들로 설정하여 거의 값들이 고정됐는데 추후에 어떤 값이 유동적으로 변할 수 있도록 코드를 수정하고 싶다!</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/4c277ae6-8a55-4887-af25-9fbd1d9e5360/image.png" alt="">
<img src="https://velog.velcdn.com/images/koooky35_b/post/f47205da-43e9-4fbb-a85d-741eeb77c9bb/image.png" alt=""></p>
<p>백엔드와 통신을 하기 전에는 그냥 화면상에서 하트를 누르면 색이 바뀌게 하면 됐는데, 로그인한 후에 누른 하트의 정보를 백엔드로 넘겨 줘야 했고, 넘겨준 값을 내가 다시 받아와야 했는데 그런 개념이 없어서 코드를 새롭게 추가했어야 했다.</br>
토큰이 있고 없고를 먼저 확인하고 전체 하트에서 하트가 눌린 제품의 id값을 가져와서 하트의 색이 바뀔 수 있도록 조건을 넣어주었다.</br> 그리고 클릭이 됐을때 화면에 바로 하트의 색이 바뀔 수 있게 따로 조건을 넣어 주었다.</br></p>
<p>통신을 해보면서 데이터를 주고받는 개념을 잡을 수 있어서 2차 프로젝트 때는 많이 헤매지 않을 수 있을 것 같다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 동적라우팅 실습]]></title>
            <link>https://velog.io/@koooky35_b/wecode-%EB%8F%99%EC%A0%81%EB%9D%BC%EC%9A%B0%ED%8C%85-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@koooky35_b/wecode-%EB%8F%99%EC%A0%81%EB%9D%BC%EC%9A%B0%ED%8C%85-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Sun, 24 Jul 2022 10:23:24 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>동적 라우팅</p>
<ul>
<li>라우트 경로에 특정 값을 넣어 해당 페이지로 이동할 수 있게 하는것</li>
</ul>
</li>
<li><p>path parameter</p>
<ul>
<li><p>url경로에서 달라지는 부분을 저장하는 매개 변수를 Path Parameter라고 한다.</p>
<p>&lt;Route path=&#39;/product/:id&#39; element={<ProductDetail />} /&gt;</p>
<p>라우터에는 위와 같이 정의한다.
:는 path parameter가 올 것이라는 것을 알리는 것이고
id는 해당 파라미트의 이름을 변수처럼 지정해 준것이다 (id가 아닌 원하는 다른 이름이 와도 된다)</p>
</li>
</ul>
</li>
</ol>
<p>   <img src="https://velog.velcdn.com/images/koooky35_b/post/6b400ab4-d919-4f89-b136-1184a4ba0b9d/image.png" alt=""></p>
<pre><code>fetch 함수로 처음에는 모든 데이터를 다 받아온다 </code></pre><p>   <img src="https://velog.velcdn.com/images/koooky35_b/post/631ace6a-c0ad-4b38-a91e-772bd549c1c1/image.png" alt=""></p>
<pre><code>하나의 카드를 클릭하면 해당 카드의 디테일 페이지로 이동할 수 있도록 onClick 이벤트를 걸어준다.
id는 CardList에서 props로 받아온 값들을 구조분해 할당 해주었다.</code></pre><p>   <img src="https://velog.velcdn.com/images/koooky35_b/post/550c81aa-281a-4394-a388-36f8204729c6/image.png" alt=""></p>
<p>   <img src="https://velog.velcdn.com/images/koooky35_b/post/02ec51b0-aa31-46bf-abad-db343c36a482/image.png" alt=""></p>
<p>   useParams 훅은 Router 에 등록해준 path parameter 정보를 담고 있는 객체를 반환한다.
  여기서 params.id에는 params객체의 key로 id를 지정하여 해당 id 값을 가져온다.</p>
<p>  <img src="https://velog.velcdn.com/images/koooky35_b/post/6572f0f4-e82c-40b7-a417-3424844b9bea/image.png" alt=""></p>
<p>  의존성 배열에 params.id 를 넣어주지 않으면 페이지 랜더링이 되지 않아서 Previous, Next 버튼을 눌러 주어도 새로운 데이터를 받아오지 않아 페이지에 변화가 없다</p>
<p> <img src="https://velog.velcdn.com/images/koooky35_b/post/58ab76ca-cad1-4e18-af2a-65007ec41e6a/image.png" alt=""></p>
<p>  첫랜더링시 무조건 리턴이 되면 이전에 남아 있던 정보가 잠시 보이는 시간이 있기때문에 조건을 걸어준다(조건부렌더링)</p>
<p>   전체적인 흐름을 살펴보면</p>
<ol>
<li>Router에 이동하고자 하는 페이지에 가기위한 조건 path parmeter를 지정한다.</li>
<li>useNavigate함수로 이동하려고 하는 페이지 링크로 변경해 준다.</li>
<li>이동한 페이지에서 useParams 함수를 써서 지정해준 Path Parameter 객체값을 받아온다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 프로젝트 1주차 (2)]]></title>
            <link>https://velog.io/@koooky35_b/wecode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1%EC%A3%BC%EC%B0%A8-2</link>
            <guid>https://velog.io/@koooky35_b/wecode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1%EC%A3%BC%EC%B0%A8-2</guid>
            <pubDate>Sun, 24 Jul 2022 09:15:26 GMT</pubDate>
            <description><![CDATA[<p> <img src="https://velog.velcdn.com/images/koooky35_b/post/bf662ff9-b477-41fa-baa3-f11f93289e94/image.png" alt=""></p>
<p><img src="blob:https://velog.io/27e0527a-513a-4c0e-872f-70ccfbdd329f" alt="업로드중.."></p>
<p>카드를 hover하면 반투명한 배경이 이미지 앞으로 뒤에있는 이미지는 크기가 약간 커지는 효과가 원본 사이트에 있어서 구현 해보려고 했다.
hover처음에는 해당 이미지에 직접 hover를 줬는데 전혀 먹히지 않았는데 카드를 감싸고 있는 부모 컨테이너에 효과를 줘야했다. 그리고 이미지가 커지기는 했는데 부모 컨테이너 안에서 커지는게 아니라 범위를 넘어서 커져서 부모 컨테이너에 overflow:hidden을 줬더니 원하는 범위 내에서 사이즈 변겨이 있었다.
overflow:hidden은 float 기능을 쓸때만 사용 해봤는데 이번 기회에 다른 사용법을 익힐 수 있었다 
그리고 카트와 하트 아이콘이 시간차를 두고 올라올 수 있도록 transition을 줘서 따로 올라오게 효과를 줬다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 1주차 프로젝트 (1)]]></title>
            <link>https://velog.io/@koooky35_b/wecode-1%EC%A3%BC%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1</link>
            <guid>https://velog.io/@koooky35_b/wecode-1%EC%A3%BC%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1</guid>
            <pubDate>Sun, 24 Jul 2022 09:00:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/koooky35_b/post/6f63bd78-e625-4c78-8326-93cf55c5a977/image.png" alt=""></p>
<p>썸네일에 있는 장바구니 아이콘을 누르면 데이터베이스로 제품id와 수량을 DB로 넘겨서 사이드에 있는 마이페이지로 장바구니에 담은 상품 정보가 담기게 된다.
아직은 로그인과 연동이 되지 않아서 토큰값을 상단에 먼저 넣어 주었다.</p>
<p>(실제 화면은 현재 볼 수가 없는 상태여서 사진은 추후에 추가 예정/ 다른 통신을 하게되면 더 추가 예정 )</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[몬스터과제 리뷰]]></title>
            <link>https://velog.io/@koooky35_b/filter</link>
            <guid>https://velog.io/@koooky35_b/filter</guid>
            <pubDate>Sun, 17 Jul 2022 13:10:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/koooky35_b/post/0329c1fa-a61a-4bbb-85b0-50b2fa197b84/image.png" alt=""></p>
<ol>
<li><p>fetch를 이용하여 데이터를 받아와서 그 데이터를 setMonsters에 전해주어 배열인 monsters에 할 당해 주었다.</p>
</li>
<li><p>filter 메서드를 사용하여서 monsters 배열안에 있는 객체를 monster라는 매개변수로 받아왔다.</p>
</li>
<li><p>객체안의 name이라는 키를 전부 소문자로 바꿔주었다. 그리고 소문자인 이름들이 사용자사 적은 문자를 포함 하고 있으면 return 해주도록 했다. </p>
<pre><code>return monster.name.toLowerCase().includes(userInput); </code></pre></li>
</ol>
<p>*나는 소문자로 바꿔주는 식과 return 되는 값을 한번에 적어주고 싶었는데 왜인지 오류가 발생했다. 아직까지 뭐가 문제인지는 모르겠다
<img src="https://velog.velcdn.com/images/koooky35_b/post/b95fa0ff-157f-4257-9a5f-56b9bba478e8/image.png" alt=""></p>
<ol>
<li>부모 컴포넌트에서 정의해준 변수와 함수를 자식 컴포넌트에서 쓰려면 전달을 해주어야 한다.
전달 해주는 값과 이름을 같게 해주어서 알기 쉽게한다.</li>
<li>props는 값을 객체로 전달 되기때문에 handleChange={handleChange}와 같은 형태의 객체에 값을 할당하는 것처럼 식을 적어준다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/59718bbc-82e8-4312-a30d-eb822dc12610/image.png" alt=""></p>
<ol>
<li>자식 컴포넌트에서 값을 사용할때는 props.key의 형태로 적어서 사용한다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/a8e1c412-1e02-4781-a81d-5dc36cd01078/image.png" alt=""></p>
<ol>
<li>map메서드는 배열의 요소를 지정한 조건에 맞추어 반복해주는데 이때 동적인 데이터의 경우 요소가 삭제되거나 추가될 수가 있는데 이때 key값으로 고유한 값을 주어 정보가 엉키지 않게 해 준다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mock data]]></title>
            <link>https://velog.io/@koooky35_b/Mock-data</link>
            <guid>https://velog.io/@koooky35_b/Mock-data</guid>
            <pubDate>Thu, 14 Jul 2022 01:20:45 GMT</pubDate>
            <description><![CDATA[<p>데이터에는 정적인 데이터와 동적인 데이터가 있다.</p>
<p>동적인데이터: 백앤드로부터 받아야 하며, 지속적으로 변경되는 데이터를 뜻한다 (댓글 등)</p>
<p>정적인데이터: 상수데이터라고도 하며, 변하지 않는 데이터를 뜻한다 (footer 등)
</br>
</br>
mock data란?</p>
<ul>
<li><p>샘플 데이터, 실제로 api에서 받아오는 데이터가 아닌 프론트엔드 개발자가 개발 진행중 필요에 의해 샘플로 만들어 본 데이터를 뜻 한다. (백엔드에서 데이터를 당장 가져올 수 없는 경우에 미리 만들어서 기능을 테스트 해 볼수 있다)</p>
<p>→ mock data 사용이유 : </p>
</li>
<li><p>모든 코드를 적으면 코드 가독성이 좋지 않고 수정이 힘들어진다.</p>
</li>
<li><p>상수데이터 + Array.map() 조합으로 간결하게 코드 표현이 가능하다.
유지 보수가 용이해집니다.</p>
</li>
</ul>
<p>→mock data 데이터 관리: </p>
<ul>
<li>상수데이터는 js파일로 분리하거나, 파일내의 하단부에 선언하여 사용할 수 있다.</li>
<li>변하지 않는 데이터라는 것을 표시하기 위해서 “대문자+snake case”를 이용하여
변수의 이름을 짓는다</li>
<li>별도로 분리시 export/import를 통해서 사용하고, js파일은 import하는 컴포넌트에서 접근하기 쉬운 가까운곳에 생성한다.</li>
</ul>
</br>
→상수데이터 사용방법

<ul>
<li>animalData.js<pre><code>const ANIMAL_LIST = [
{
  id: 1,
  userName: &#39;기린&#39;,
  content: &#39;아프리카에 사는 목이 긴 동물&#39;,
},
{
  id: 2,
  userName: &#39;팽귄&#39;,
  content: &#39;남극에 사는 귀여운 동물&#39;,
},
{
  id: 3,
  userName: &#39;두더지&#39;,
  content: &#39;눈이 잘 안보이는 동물&#39;,
}
];
</code></pre></li>
</ul>
<p>export default ANIMAL_LIST;</p>
<pre><code>
&lt;/br&gt;

- AnimalList.js</code></pre><p>import React from &#39;react&#39;;
import Comment from &#39;./Comment/Comment&#39;;
import ANIMAL_LIST from &#39;./commentData&#39;;
import &#39;./CommentList.scss&#39;;</p>
<p>function AnimalList() {
  return (
    <div className="animalList">
      <h1>댓글</h1>
      <ul>
        {ANIMAL_LIST.map(animal =&gt; {
          return (
            <Comment
              key={animal.id}
              name={animal.userName}
              comment={animal.content}
            />
          );
        })}
      </ul>
    </div>
  );
}</p>
<p>export default AnimalList;</p>
<pre><code>
&lt;/br&gt;

- mock data 생성
    - animalData.json</code></pre><pre><code>[</code></pre><p>   {
    id: 1,
    userName: &#39;기린&#39;,
    content: &#39;아프리카에 사는 목이 긴 동물&#39;,
  },
  {
    id: 2,
    userName: &#39;팽귄&#39;,
    content: &#39;남극에 사는 귀여운 동물&#39;,
  },
  {
    id: 3,
    userName: &#39;두더지&#39;,
    content: &#39;눈이 잘 안보이는 동물&#39;,
  }
]</p>
<pre><code>
mock data 위치: public &gt; data &gt; commentData.json 
&lt;/br&gt;
- mock data호출</code></pre><p>import React, { useState, useEffect } from &#39;react&#39;;
import Comment from &#39;./Comment/Comment&#39;;
import &#39;./CommentList.scss&#39;;</p>
<p>function AnimalList() {
  const [animalList, setAnimalList] = useState([]);</p>
<p>  useEffect(() =&gt; {
    fetch(&#39;<a href="http://localhost:3000/data/animalData.json&#39;">http://localhost:3000/data/animalData.json&#39;</a>, {
      method: &#39;GET&#39; // GET method는 기본값이라서 생략이 가능합니다. 
    })<br>      .then(res =&gt; res.json()) // 백엔드에서 받아온 파일을 js가 읽을 수 있는json 파일로 바꿔준다
      .then(data =&gt; {          //받아온 파일을 어떻게 사용할지 적어준다
        setAnimalList(data);
      });
  },[])</p>
<p>  return (
    <div className="animalList">
      <h1>Main Page</h1>
      <ul>
      animalList[0].map(animal =&gt; {
          return (
            <Animal
              key={animal.id}
              name={animal.userName}
              comment={animal.content}
            />
      )}
      </ul>
    </div>
  );
}</p>
<p>export default AnimalList;</p>
<pre><code>
&lt;/br&gt;

- 조건부렌더링

처음 useState의 값이 빈 배열이고, 빈배열은 truthy한 값이기 때문에 map함수가 실행이된다. 
undefined인 값을 map함수로 돌리게 되면 오류를 일으키기때문에 조건을 걸어주어야 한다
</code></pre><p>if(animalList &amp;&amp; animalList.map() //animalList 가 true이면 map()을 실행해라
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useEffect]]></title>
            <link>https://velog.io/@koooky35_b/useEffect</link>
            <guid>https://velog.io/@koooky35_b/useEffect</guid>
            <pubDate>Mon, 11 Jul 2022 04:48:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>useEffect </li>
</ol>
</blockquote>
<ul>
<li><p>React는 props,state를 재료로 jsx문법을 통해 화면에 ui를 그려내는 라이브러리이다.
ui를 그려낼시 props,state 외에도 데이터를 받아오거나 DOM에 직접 접근하여 기능을 구현해야 하는 경우가 있는데, 이럴 경우를  side effect가 있다라고 한다.</p>
</br></li>
<li><p><em>- side effect의 단점*</em></p>
<pre><code>   1. alert창과 같이 동작이 끝나지 않으면 다음 화면이 랜더링 되지않는 block rendering현상이 있다
   2. state가 변경될때마다 동작이 실행되는 always trigger 현상이 있다. 예로는 화면이 바뀔때마다 큰 용량의 같은 데이터를 받어오게 되면 서버과부화가 발생하게 된다.
   &lt;/br&gt;

      ** mount : 컴포넌트가 최소로 화면에 그려졌을때**</code></pre><p>  useEffect는 최소 mount 시에는 무조건 한번은 실행이 된다.</p>
  </br>


</li>
</ul>
<p>**  - side effect의 해결법 **</p>
   </br>
         1. block rendering 해결법



<pre><code>useEffect(()=&gt; {
console.log(&quot;effect!&quot;)})

-&gt; 컴포넌트가 랜더된 후에 실행이 되기때문에
랜더링을 막지 않는다.</code></pre>   </br>

<pre><code>2. always trigger 해결법


useEffect(()=&gt; {
console.log(&quot;Wow!&quot;)}, [a])

-&gt; 배열안의 값이 변할때 함수를 실행한다
-&gt; 배열 값이 비어있으면 최초 1회 mount 후에 절대로 실행 되지 않는다
&lt;api받아오기, nav바와 같이 한번 받아 오면 값이 변하지 않는 경우에 사용&gt;</code></pre>  </br>



<p>  clear Effect</p>
  </br>

<pre><code> useEffect(()=&gt; {
    const interval = setInterval(() =&gt; {
        console.log(&quot;interval!&quot;);
}, 500);
return () =&gt; {
clearInterval(interval);
};       -&gt;unmount 시에 실행된다
}, []);  -&gt;mount시에 실행된다 </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[States ]]></title>
            <link>https://velog.io/@koooky35_b/States-e7x8s9in</link>
            <guid>https://velog.io/@koooky35_b/States-e7x8s9in</guid>
            <pubDate>Sun, 10 Jul 2022 12:22:40 GMT</pubDate>
            <description><![CDATA[<h1 id="states">States</h1>
<ol>
<li>state</li>
</ol>
<p>let[글제목, 글제목변경] = useState([”a”, “b”, “c”]);</p>
<p>let copy = 글제목</p>
<p>copy[0] = “A”;</p>
<p>글제목변경(copy);</p>
<p>state 변경 함수 </p>
<p>→ 내용이 같으면 바꾸지 않는다</p>
<p>→ array가 담긴 변수는 주소를 저장하고 있다 그래서</p>
<p>글제목 변경을 해도 주소값이 변한적이 없기때문에 </p>
<p>state에 변화는 없다.</p>
<p>let copy = […글제목];</p>
<p>copy[0] = “A”;</p>
<p>글제목변경(copy);</p>
<p>array나 object의 경우 내용 변경을 하고 싶을 시 […state명]을 꼭 써준다</p>
<ol>
<li><p>component</p>
</li>
<li><p>function()을 만들고 </p>
<p> -다른 함수 밖에 만든다</p>
<p> -이름은 영어 대문자로 시작한다</p>
</li>
</ol>
<ol>
<li>return()안에 html담기</li>
<li>&lt;함수명&gt;&lt;/함수명&gt; 쓰기</li>
</ol>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/6908b072-e137-45ce-9928-f72f9fc17561/image.png" alt=""></p>
<p>시작과 끝이 같은 태그로 감싸져 있어야 한다</p>
<div></div>로 감싸주고 의미없는 태그를 쓰고 싶지 않을 경우에는 <></> 빈태그로 감싸주면 된다

<p>component 사용 된는 곳 </p>
<ul>
<li>반복적인 html 축약할 때</li>
<li>큰 페이지들</li>
<li>자주 변경되는 것들</li>
</ul>
<p>너무 많이 만들면 가져다 쓰기 힘들어 진다</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/6629fd1b-4214-4627-887a-cf424f82123b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/011de8b2-7315-4b61-8098-0a11ed9432c9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/4a025eb6-2baa-4424-98ee-4cc836712b91/image.png" alt=""></p>
<p>조건식으로 모달창을 열고 닫을 수 있다</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/b39a6e1a-c9d3-4fd0-aea2-d694e53bacd5/image.png" alt=""></p>
<ol>
<li>map()</li>
</ol>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/e926e8e0-faca-47e8-af0e-807c387ab0be/image.png" alt=""></p>
<p>[1,2,3]map(function()){</p>
<p>console.log(1)</p>
<p>}</p>
<p>→ 1,1,1 1이 세번 콘솔로그에 찍힘 (array 자료안의 갯수만큼 반복)</p>
<p>[1,2,3]map(function(a)){</p>
<p>console.log(a)</p>
<p>}</p>
<p>→ 1,2,3이 찍힘 (파라미터는 array 안의 자료를 뜻함)</p>
<p>[1,2,3]map(function(a)){</p>
<p>return ‘123’</p>
<p>}</p>
<p>→[’123’, ‘123’, ‘123’] 이 찍힘 (array 안의 자료를 자료의 수만큼 반복하여 배열로 만들어 준다)</p>
<blockquote>
<blockquote>
<p>array 자료의 갯수만큼 함수안의 코드를 실행해준다</p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<p>매개변수는 array안에 있는자료를 뜻하고 그자료를 바탕으로 동작을 실행한다</p>
</blockquote>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git, Github ]]></title>
            <link>https://velog.io/@koooky35_b/Git-Github</link>
            <guid>https://velog.io/@koooky35_b/Git-Github</guid>
            <pubDate>Thu, 07 Jul 2022 01:58:15 GMT</pubDate>
            <description><![CDATA[<p><strong>git이란?</strong>
-&gt; 공식 명칭은 분산 버전 관리 시스템(vsc)로 프로젝트 파일의 변경 사항을 추적하는 시스템을 말 한다.
-&gt;장점: 여러 사람이 함께 작업하고 프로젝트 단위로 협업을 할 때 파일을 효율 적으로 관리 할 수 있다.</p>
<p>*<em>repositories
*</em></p>
<p>-&gt; Git을 관리하는 프로젝트 저장소를 말한다.(폴더 개념)
-&gt; 종류로는 rocal repository, Remote repository가 있으며, 각각 본인의 컴퓨터에 저장된 저장소와, 내컴퓨터가 아닌 외부버전의 프로젝트 저장소를 뜻한다.</p>
<p><strong>사용법</strong></p>
<ol>
<li>새 저장소를 만들고 git으로 관리를 하려면 터미널에 &quot;프로젝트 폴더로 이동 후&quot;<blockquote>
<p>git inint </p>
</blockquote>
</li>
</ol>
<p>이라는 명령어를 입력 해준다. 이 명령어는 프로젝트 폴더 내에 .git 디렉토리를 생성하고, git은 현재 저장소에 대한 모든 변경사항을 추적/관리 한다.</p>
<ol start="2">
<li>repository의 현재 상태 확인</li>
</ol>
<blockquote>
<p>git status </p>
</blockquote>
<p>명령어를 입력하여 현재 repository의 상태를 확인할 수 있다.
-&gt; git으로 추적 관리 되고 있지 않은 파일이 있다면 staging area에 추가해서 git으로관리 할 수 있도록 해주어야 한다</p>
<ol start="3">
<li>프로젝트 폴더에 </li>
</ol>
<blockquote>
<p>git add </p>
</blockquote>
<p>라는 명령어를 입력하여 원하는 파일들을 staging area로 추가 해줄 수 있다. 주로</p>
<blockquote>
<p>git add . </p>
</blockquote>
<p>명령어를 사용하면 모든 파일과 폴더를 한번에 staging area에 추가 할 수 있다.</p>
<ol start="4">
<li>commit 남기기 (커밋이란 프로젝트의 현재 상태를 메세지와 함께 남기는 것으로, 프로젝트 코드의 변경 사항을 확인하여 프로젝트 진행 상황을 효율적으로 관리 할 수 있게 해준다)<blockquote>
<p>git commit -m &quot;commit message&quot;</p>
</blockquote>
</li>
</ol>
<p>위의 명령어를 통해서 레파지토리의 변경 사항을 메모하고 파일들을 커밋한다.</p>
<ol start="5">
<li>커밋 내용 확인하기<blockquote>
<p>git log</p>
</blockquote>
</li>
</ol>
<p>프로젝트의 커밋 내용을 확인 하려면 위의 명령어를 입력하면 된다</p>
<ol start="6">
<li>.gitignore </li>
</ol>
<p>stagin area에 추가하고 싶지 않거나 git으로 관리 하지 않아도 되는 파일은 .gitignore 폴더에 넣어주면 된다.
</br></p>
<p><strong>git명령어 요약</strong></p>
<p>git init -새 저장소 생성 </p>
<p>git status - 상태확인</p>
<p>git add files.js -staging area에 파일 추가</p>
<p>git add . - 전부 추가</p>
<p>git commit -m “Commit message” -커밋 남기기</p>
<p>git log - 커밋 내용 확인하기
</br></p>
<p><strong># Branch</strong></p>
<p>git branch - 모든 브렌치 확인</p>
<p>git branch &lt;새 브랜치 이름&gt; -branch 만들기</p>
<p>git checkout &lt;브랜치 이름&gt; - 브랜치 전환</p>
<p>git checkout -b &lt;새 브랜치 이름&gt; - 브랜치 생경과 동시에 이동</p>
<p>git merge <branch-name> - 브랜치 병합하기</p>
<p>git branch -d <branch-name> -브랜치 삭제하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Router,Sass]]></title>
            <link>https://velog.io/@koooky35_b/React-RouterSass</link>
            <guid>https://velog.io/@koooky35_b/React-RouterSass</guid>
            <pubDate>Tue, 05 Jul 2022 13:36:23 GMT</pubDate>
            <description><![CDATA[<p>routing이란?</p>
<ul>
<li>다른경로(url주소)에 따라 다른 view를 보여주눈 것</li>
<li>React-router는 리액트 라우팅 기능을 위해 가장 많이 사용되는 라이브러리</li>
<li>React는 따로 가지고 있지 않다(그래서 라이브러리로 구분된다)</li>
</ul>
<ol>
<li><p>SPA가 무엇인지 설명할 수 있다.</p>
<ul>
<li>페이지가 한개인 애플리케이션</li>
</ul>
</li>
<li><p><strong><code>react-router-dom</code></strong>를 이용해 <strong><code>Routes Component</code></strong>를 구현할 수 있다.
 a. react-router 설치</p>
<pre><code> npm install react-router-dom (터미널에 작성)</code></pre><p> b. src 폴더에 Router.js파일을 만들어서 아래의 내용을 작성 해 준다</p>
<p> <img src="https://velog.velcdn.com/images/koooky35_b/post/6f4fd20b-5d02-41cb-a378-f116d32cb7da/image.png" alt="">
 c. index.js에서 Router파일을 import 해주고 라우팅 적용을 해 준다.
 <img src="https://velog.velcdn.com/images/koooky35_b/post/e8ceb680-0666-483a-be9b-aae3545d94ac/image.png" alt=""></p>
<ol start="3">
<li><p><strong><code>react-router-dom</code></strong>에서 <strong><code>Routing</code></strong>을 하는 방법 2가지와 차이점에 대해 설명할 수 있다.</p>
<ul>
<li>방법에는 <code>&lt;Link&gt;</code>를 이용하는 방법과 useNavigate로 구현하는 방법 두가지가 있다.</li>
</ul>
</li>
<li><p><strong><code>&lt;Link&gt; Component</code></strong> 와 <strong><code>&lt;a&gt; tag</code></strong> 의 차이점에 대해 설명할 수 있다.</p>
<ul>
<li><code>&lt;a&gt;</code> 서버에 요청하여 페이지를 새로고침 함 (외부사이트로 이동)<link> 서버에 요청하지 않음(프로젝트 페이지 내에서 페이지 전환)
</br>
a. ```Link to="/sign" ```  를 이용 하여서 이동할 위치를 적어준다 
</br>
→클릭시 바로 이동하는 로직 구현 시에 사용

</li>
</ul>
</li>
</ol>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/2bb72447-615f-4cd9-b8e1-714d5cb8dfd5/image.png" alt=""></p>
<pre><code>      b. useNavigate 훅을 실행하면 페이지 이동을 할 수 있게 해주는 함수를 반환한다.
      →페이지 전환 시 추가로 처리해야 하는 로직이 있는 경우 useNavigate 훅을 활용</code></pre><p>  <img src="https://velog.velcdn.com/images/koooky35_b/post/4ed26741-8650-4c05-8ab0-4f59131ee47f/image.png" alt="">
<img src="https://velog.velcdn.com/images/koooky35_b/post/75b7fe5e-ad95-40c0-af29-c2382d189a73/image.png" alt=""></p>
<ol start="5">
<li><strong><code>css</code></strong> 전처리기의 역할에 대해 설명할 수 있다.<ul>
<li>css가 가질 수 있는 불리한 점을 해결하기 위해서 만들어짐.
 -&gt;반복적으로 사용되는 부분을 변수로 처리하여 재활용성을 높여준다.</li>
</ul>
</li>
<li><strong><code>sass</code></strong>에서 제공하는 문법을 이용하여 <strong><code>css</code></strong>파일을 <strong><code>scss</code></strong>파일로 변환할 수 있다.<ol>
<li>npm install sass (터미널에 작성)
→node-modules 폴더에 sass폴더가 생성된다</li>
<li>.css파일 확장자를 .scss로 바꾼다 
→import 구문도 모두 수정한다.</li>
<li>Nesting 기능을 적용한다</li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSX]]></title>
            <link>https://velog.io/@koooky35_b/JSX</link>
            <guid>https://velog.io/@koooky35_b/JSX</guid>
            <pubDate>Sun, 03 Jul 2022 13:35:20 GMT</pubDate>
            <description><![CDATA[<h3 id="1-jsx란">1. jsx란</h3>
<ul>
<li>js의 확장 문법이다 (웹 브라우저는 읽을 수 없다)</li>
<li>js파일이 jsx코드를 포함하고 있으면 파일을 컴파일 해 주어야 한다.</li>
<li>js의 요소들처럼 다루어 진다</br>

</li>
</ul>
<h3 id="2-표현식">2. 표현식</h3>
<pre><code>    - const h1 = &lt;h1&gt;Hello world&lt;/h1&gt;; 
    →html 혹은 js 처럼 보이지만 js 파일 안에서 작동하는 jsx문법이다
    - const panda = &lt;img src=&#39;images/panda.jpg&#39; alt=&#39;panda&#39; width=&#39;500px&#39; height=&#39;500px&#39; /&gt;; </code></pre><p>   → html문법처럼 요소를 가질 수 있다.</p>
<ul>
<li><p>가독성을 위해서 줄바꿈을 해 주어야하고, 여러줄의 경우에는 ()안에 넣어주어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/fc8c1049-81be-4bc0-a5fb-d0cf9f9f6f64/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>jsx표현식의 첫 번째 여는 태그와 마지막 닫는 태그는 동일한 jsx요소에 속해야 한다 (첫번 째 코드는 작동을 하지만 두번 째 코드는 작동하지 않는다)<br><img src="https://velog.velcdn.com/images/koooky35_b/post/e5348434-2a99-4aec-91d4-afe2da0b53f1/image.png" alt=""><br><img src="https://velog.velcdn.com/images/koooky35_b/post/d34fe5c1-7f01-4a06-84d0-62be5eac0f70/image.png" alt=""></br>

</li>
</ul>
<h3 id="3-랜더링-방법">3. 랜더링 방법</h3>
<ul>
<li>랜더링 표현식을 넣어주어야 화면에 표시된다.<br><img src="https://velog.velcdn.com/images/koooky35_b/post/48a2082b-8bdc-4140-b6f6-2b8519896707/image.png" alt=""><br>ReactDOM.render()는 제일 많이 사용되는 jsx를 랜더링하는 방법이다. ()의 첫번째 요소로는 꼭 jsx의 표현식 또는 jsx표현식으로 평가되는 변수를 써야하고 두번째 요소에는 html의 어디 부분에 코드를 넣어줄지를 적는다.</br>

</li>
</ul>
<h3 id="4-class-vs-classname">4. class vs className</h3>
<ul>
<li>JSX는 주로 HTML과 같은 문법을 쓰지만, 속성으로 class대신 className을 써준다<br><img src="https://velog.velcdn.com/images/koooky35_b/post/b83d3619-c39e-4f3b-8ec3-7b88682d3163/image.png" alt=""></br>

</li>
</ul>
<h3 id="5--self-closing-tag">5.  Self-Closing tag</h3>
<ul>
<li>HTML에서는 self-closing tag에 “/”를 적어도 안적어도 되지만 JSX에서는 꼭 적어 주어야 한다.</br>

</li>
</ul>
<h3 id="6-계산식">6. 계산식</h3>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/0a16f508-fdfa-4063-adf9-a6e428180e54/image.png" alt=""></p>
<ul>
<li>{}를 써 주지 않으면 텍스트로 인식한다</br>

</li>
</ul>
<h3 id="7-변수">7. 변수</h3>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/fd335ad2-b23e-4dd1-a066-e908329c1ebb/image.png" alt=""></p>
<ul>
<li>{}를 사용하면 밖에 선언된 변수에도 접근 할 수 있다</br>

</li>
</ul>
<h3 id="8-조건문">8. 조건문</h3>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/6548f31d-78d6-45e4-9dc6-3bda57f8b4d9/image.png" alt=""></p>
<ul>
<li>JSX에서는 조건문으로 삼항연산자를 사용한다</li>
<li>A ? b: c A가 true라면 b, 아니라면 c를 실행한다</br>

</li>
</ul>
<h3 id="9-conditionals">9. Conditionals: &amp;&amp;</h3>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/a4f568e4-27d7-4567-bacd-e332613bc7eb/image.png" alt=""></p>
<ul>
<li>&amp;&amp;의 왼쪽에 있는 식이 true일 때, &amp;&amp;의 오른쪽에 있는 식이 랜더 된다.</br>

</li>
</ul>
<h3 id="10-map">10. map()</h3>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/f4f60673-3fdd-47e0-94a7-61c19318a1c1/image.png" alt=""></p>
<ul>
<li>위의 코드는 배열 Strings를 li의 새로운 배열로 반환한다. </br>

</li>
</ul>
<h3 id="11-keys">11. Keys</h3>
<ul>
<li>JSX에서 list를 만들려면 keys가 필요하다.<ul>
<li>key는 JSX 속성의 이름이다. 속성의 값은 고유해야 한다. html에서의 id 속성과 비슷하다.(꼭 사용해야 하는건 아니다)<ul>
<li>key는 랜더링 할 다음 아이템을 확인하기 위해서 key 속송을 사용한다</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/9567f3bc-0e9f-4f37-8d26-2eb5f4d80c05/image.png" alt="">
  고유한 키값을 주기 위해서 map()을 사용하고 매개변수로 i를 주었다</p>
<h3 id="12-jsx를-사용하지-않아도-react를-작성할-수-있다">12. JSX를 사용하지 않아도 React를 작성할 수 있다</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 2주차 테스트]]></title>
            <link>https://velog.io/@koooky35_b/wecode-2%EC%A3%BC%EC%B0%A8-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@koooky35_b/wecode-2%EC%A3%BC%EC%B0%A8-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Sun, 03 Jul 2022 10:36:54 GMT</pubDate>
            <description><![CDATA[<ol>
<li>짝수인지 판별하는 함수 <code>isEven</code>을 작성 주세요
<img src="https://velog.velcdn.com/images/koooky35_b/post/4d51e258-3f1e-4082-a9df-abc1664a99de/image.png" alt=""></li>
</ol>
<pre><code>- 나머지 값을 가지고 판단하면 된다.!</code></pre></br>
</br>

<ol start="2">
<li><p><code>calculateTotal</code> 함수를 작성하세요.</p>
<p> 팁과 세금을 제외한 식사값이 주어졌을때, <code>calculateTotal</code> 함수는 팁과 세금이 포함된 총 식사값을 반환합니다.</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/6f9a0ae5-a158-40a3-bbbe-aae6bf49a6ba/image.png" alt=""></p>
</li>
</ol>
<pre><code>- 금액에 세금과 팁 값을 계산한 값을 더 했다.</code></pre></br>
</br>


<ol start="3">
<li><p><code>getPrefix</code> 함수를 작성하세요.</p>
<p>문자열이 주어졌을때, <code>-</code>를 기준으로 앞에 있는 문자열을 반환하세요.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/d10fad69-de03-43c3-8f92-7bd5fe66a9ba/image.png" alt=""></p>
<pre><code>- split()을 이용하여 “-”를 기준으로 문자열 만들고 첫번째 오는 값을 return 했다.
    - 내장함수를 많이 공부해야겠다는 생각을 했다.</code></pre></br>
</br>

<p>4.<code>getFind</code> 함수를 작성하세요.</p>
<p>문자와 문자열이 주어졌을때, <code>getFind</code> 함수는 주어진 문자열에서 주어진 문자가 나타나는 첫번째 위치를 반환합니다.</p>
<p><strong>Notes:</strong> 문자열의 첫번째 문자는 인덱스 값 <code>0</code> 을 가집니다. 만약 문자열에 해당 문자가 여러번 나타나면, 첫번째로 나타나는 위치를 반환해야 합니다. 만약 문자가 문자열에 존재하지 않는다면, <code>-1</code> 을 반환해야 합니다.</p>
<p><strong>중요!!</strong> <code>indexOf</code> 함수를 사용하지 마세요.</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/17ade65d-95ea-4edf-a532-5c745bd1a46c/image.png" alt=""></p>
<ul>
<li>if문에 else를 꼭 쓰려고 해서 원하는 답이 안나오는 경우가 있어서 꼭 주의 해야겠다!!!</br>
</br>

</li>
</ul>
<p>5.<code>find_longest_word</code> 함수를 만들어 주세요.</p>
<p>주어진 리스트안에 있는 단어중 가장 긴 단어를 찾을수 있도록 함수를 완성해주세요.</p>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/e23eb2f1-42de-4858-8c96-936a308805bd/image.png" alt=""></p>
<ul>
<li>뭐가 하고 싶었던 걸까,,? 변수 a는 필요가 없었는데 굳이 만들어서 괜히 머리만 아팠다</li>
<li>아래는 다시 써본 코드!</li>
</ul>
<p><img src="https://velog.velcdn.com/images/koooky35_b/post/1b3ce55c-0baf-4208-b921-c7c49661e344/image.png" alt=""></p>
<p>if문 쓸때 else를 꼭 쓰려는 강박을 버리자</p>
]]></description>
        </item>
    </channel>
</rss>