<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>newasborn.log</title>
        <link>https://velog.io/</link>
        <description>codesign</description>
        <lastBuildDate>Fri, 16 Dec 2022 12:45:21 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>newasborn.log</title>
            <url>https://velog.velcdn.com/images/newas_born/profile/7915bcdb-9c3f-46f7-8155-5a30c174cd15/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. newasborn.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/newas_born" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 35일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-35%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-35%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 16 Dec 2022 12:45:21 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-16">📅 학습 일자 : 22. 12. 16</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[특강] 애자일 방법론</strong></li>
<li><strong>[특강] 협력사 채용 설명회 _ 트릿지</strong></li>
<li><strong>[특강] 리액트 숙련 과제 리뷰</strong></li>
<li><strong>[자습] 코딩테스트 풀이 영상</strong></li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-애자일agile-방법론">▣ 애자일(Agile) 방법론</h2>
<ul>
<li><p><strong>사전 정의</strong></p>
<ul>
<li>소프트웨어 개발 방법론의 하나로, 처음부터 끝까지 계획을 수립하고 개발하는 폭포수 (Waterfall) 방법론과는 달리 개발과 함께 즉시 피드백을 받아서 유동적으로 개발하는 방법</li>
</ul>
</li>
<li><p><strong>애자일 도구</strong></p>
<ul>
<li>git, gitHub, 노션, 현업에서는 JIRA</li>
</ul>
</li>
<li><p><strong>애자일 방법 적용해보기</strong></p>
<ul>
<li><strong>프로젝트 시</strong><ul>
<li><strong>Scrum</strong>
  : 하나의 프로젝트를 작은 주기(sprint)로 개발 및 검토를 하며, 효율적인 협업 방법을 제시하는 프레임워크</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>            ※ sprint : 팀이 일정량의 작업을 완료하는 시간이 정해진 짧은 기간

        - **주요 내용**
            - 개발 주기마다 적용할 기능이나 개선에 대한 목록을 제공하라.
                - 해당 주기에 목표를 작성하지 않으면, 기능 목록의 목적을 잃게 된다.
            - 솔루션에 포함할 기능과 개선에 대한 우선 순위를 부여한다.
            - 개발 주기는 1~4주 정도로 정하고 개발 주기마다 실제 동작할 수 있는 결과를 제공하라.
                - 주기가 너무 짧으면 개발(분석/설계/개발/테스트) 할 수 있는 시간이 부족, 너무 길면 느슨해지고 재작업의 양이 늘어나기 때문에 필요에 따라 조율할 것.
            - 매일 15분 정도(정해놓은 시간) Scrum meeting을 가질 것.
            - 항상 팀을 우선으로 생각하기
                - 본인 업무보다 더 급한 이슈가 생겼을 때 서로 도와주기
        - **진행 항목**
            - **칸반 보드(Kanban Board)**

                 : 작업을 시각적으로 업무 상태, 흐름을 보여주는 게시판

                - To do, doing, done
            - **일일 스크럼(Daily Scrum)** 
             : 매일 어제 한일, 오늘 할일, 해결해야 할 장애/문제 요소를 공유
            - **스프린트 계획 회의(Sprint Planning Meeting)**

                **:** 스프린트 목표와 스프린트 백로그를 계획하는 회의

            - **스프린트 백로그(Sprint Backlog)**

                 **:** 각각의 스프린트 목표에 도달하기 위해 필요한 작업 목록

            - **스프린트 리뷰(Sprint Review)** 
            : 스프린트 마지막날 개발자가 개발한 내용을 Stakeholder, 고객, 제품 책임자에게 시연하고 검토
            - **스프린트 회고(Sprint Retrospective)**
             : 스프린트 마지막날 좋았던 점, 개선할 점을 도출하고 더 나은 방향으로 개선

- 프로그래밍 언어 학습시
    - 무엇을 만들지 생각하며 튜토리얼을 읽을 것.
        - 처음부터 끝까지 읽는 것이 아니라, 큰 맥락을 잡고 작은 단위의 기능을 구현해나가면서 추가적으로 필요한 부분들을 같이 공부해나갈 것
    - 표준 라이브러리 소스 코드를 읽을 것
        - 양질의 코드를 많이 봐야, 좋은 코드를 작성할 수 있다.
    - 코드를 작성하면서, 필요할 경우 다른 자료의 코드를 부분적으로 가져와 적용해볼 것.</code></pre><br/>

<h2 id="▣-특강-협력사-채용-설명회-_-트릿지">▣ <strong>[특강] 협력사 채용 설명회 _ 트릿지</strong></h2>
<ul>
<li><p><strong>회사를 고를 때 기준으로 삼을 부분</strong></p>
<ul>
<li>멘토가 있는지</li>
<li>개발자의 역할이 중요한 회사인지</li>
<li>개인의 성장 가능성이 있는지</li>
</ul>
</li>
<li><p>신입은 어느 정도의 기술을 갖추어야 할까요?</p>
<ul>
<li><p>신입 개발자가 갖추어야 될 부분은 어떤 언어를 ‘사용’할 줄 아느냐가 아니라,</p>
<p>  (프론트엔드의 경우, HTML, CSS, 자바스크립트, 리액트, 타입스크립트 정도면 충분)</p>
<p>  엔지니어어의 자질이 있는 지가 중요하다. 문제를 풀어갈 때 문제 본질에 대한 호기심과 문제가 무엇인지에 대한 정의를 내릴 줄 아는 것. </p>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="▣-특강-리액트-숙련-과제-리뷰">▣ <strong>[특강] 리액트 숙련 과제 리뷰</strong></h2>
<ul>
<li><strong>과제 개선하기</strong><ul>
<li>기능 디테일<ul>
<li>유효성 검사 - 내용과 제목 각각에 대한 유효성 체크</li>
<li>삭제 시 알림창으로 한 번 더 확인하기 (window-confirm)</li>
</ul>
</li>
<li>디자인<ul>
<li>헤더, 푸터 추가</li>
</ul>
</li>
<li>구조 개선<ul>
<li>lable과 input 합쳐보기</li>
<li>margin도 컴포넌트 스타일로 분리하기</li>
</ul>
</li>
<li>문서 정리<ul>
<li>주석으로 컴포넌트 이력 남기기</li>
<li>css in js여도 파일 따로 분리하기</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li><h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
</li>
<li><p>하드코딩한 부분 리팩토링</p>
<ul>
<li>투두리스트의 투두를 필터링하기.</li>
</ul>
</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>애자일 방법론</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 리액트 숙련 과제 리뷰 강의</li>
<li>스파르타 코딩클럽 - 트릿지 채용설명회</li>
<li>스파르타 코딩클럽 - 애자일 방법론 강의</li>
<li><a href="https://www.atlassian.com/ko/agile/scrum/sprints">스크럼 스프린트 - 알아야 할 모든 것</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 34일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-34%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-34%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 16 Dec 2022 04:22:05 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-15">📅 학습 일자 : 22. 12. 15</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[과제] 리덕스로 투두리스트 만들기</strong></li>
<li><strong>[특강] react lifecycle - 미수강</strong></li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-과제-리덕스로-투두리스트-만들기">▣ [과제] 리덕스로 투두리스트 만들기</h2>
<h3 id="■-프로젝트-세팅-2">■ 프로젝트 세팅 2</h3>
<ul>
<li><p><strong>라이브러리, 패키지 추가</strong></p>
<ul>
<li><p><strong>styled-componnets 사용하기</strong></p>
<ul>
<li><p><strong>styled-components</strong> : CSS in JS - Js 코드로 CSS 코드 작성할 수 있는 패키지</p>
<ul>
<li><p><strong>설치</strong></p>
<ul>
<li>VScode 플러인 설치 : vscode-styled-compponents</li>
<li>터미널 : <code>yarn add styled-components</code></li>
</ul>
</li>
<li><p><strong>사용</strong></p>
<ul>
<li><p>컴포넌트 파일 : <code>import styled from &quot;styled-components&quot;;</code></p>
</li>
<li><p>코드 작성 예시</p>
<pre><code class="language-jsx">  import styled from &quot;styled-components&quot;;

  // 1. styled키워드를 사용해서 컴포넌트 생성
  // ※ styled. 뒤에는 어떤 html 태그로 생성할지 지정해준다. (form이면 form으로 하는 등.)
  const StBox = styled.div`
      // css 코드 작성방식과 동일하게 작성
    width: 100px;
    height: 100px;
    border: 1px solid red;
    margin: 20px;
  `;

  const App = () =&gt; {
      // 2. 생성한 styled-components를 JSX에서 html 태그처럼 사용
    return &lt;StBox&gt;박스&lt;/StBox&gt;;
  };

  export default App;</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>- **react-router-dom 사용하기**
    - **react-router-dom** : 구분된 페이지를 구현할 수 있게 해주는 패키지, ( SPA를 구현할 수 있다. )
        - **설치**
            - 터미널 :  `yarn add react-router-dom`
        - **사용**
            - 연결할 페이지 컴포넌트 파일 생성 - 예) Home, About…
            - Router.js 파일 : `import { BrowserRouter, Route, Routes } from &quot;react-router-dom&quot;;`
                - 코드 기본 양식

                    ```jsx
                    import React from &quot;react&quot;;
                    import { BrowserRouter, Route, Routes } from &quot;react-router-dom&quot;;

                    // 2. Router 함수 작성 
                    //BrowserRouter를 Router로 감싸는 이유는, 
                    //SPA의 장점인 새로고침시 화면깜빡임이 되지 않게 해주기 위함이다. 
                    const Router = () =&gt; {
                      return (
                        &lt;BrowserRouter&gt;
                          &lt;Routes&gt;
                          &lt;/Routes&gt;
                        &lt;/BrowserRouter&gt;
                      );
                    };

                    export default Router;
                    ```

                - 페이지 컴포넌트 Route 설정 - 코드 예시

                    ```jsx
                    import React from &quot;react&quot;;
                    import { BrowserRouter, Route, Routes } from &quot;react-router-dom&quot;;
                    import Home from &quot;../pages/Home&quot;;
                    import About from &quot;../pages/About&quot;;

                    const Router = () =&gt; {
                      return (
                        &lt;BrowserRouter&gt;
                          &lt;Routes&gt;
                                    {/* 
                                            Route의 react-router-dom 지원 props 중
                                            1. path는 사용하고싶은 &quot;주소&quot; 넣어주기
                                            2. element는 해당 주소로 이동했을 때 보여주려는 컴포넌트 넣어주기
                                     */}
                            &lt;Route path=&quot;/&quot; element={&lt;Home /&gt;} /&gt;
                            &lt;Route path=&quot;about&quot; element={&lt;About /&gt;} /&gt;
                          &lt;/Routes&gt;
                        &lt;/BrowserRouter&gt;
                      );
                    };

                    export default Router;
                    ```

            - App.js 파일 : Router.js import

                ```jsx
                import React from &quot;react&quot;;
                import Router from &quot;./shared/Router&quot;;

                function App() {
                  return &lt;Router /&gt;;
                }

                export default App;
                ```</code></pre><h3 id="■-react-router-dom-hooks--api">■ react-router-dom Hooks &amp; API</h3>
<ul>
<li><p><strong>요소의 이벤트 발생시 페이지 이동 구현</strong></p>
<ul>
<li><p><strong>useNavigate</strong></p>
<ul>
<li><p>컴포넌트 파일 주요 코드</p>
<pre><code class="language-jsx">  import { useNavigate } from &quot;react-router-dom&quot;;

  const Home = () =&gt; {
    const navigate = useNavigate();

    return (
      &lt;button onClick={() =&gt; { navigate(&quot;/works&quot;); }}&gt;
        works로 이동
      &lt;/button&gt;
    );
  };</code></pre>
</li>
</ul>
</li>
<li><p><strong>Link</strong></p>
<ul>
<li><p>컴포넌트 파일 주요 코드</p>
<pre><code class="language-jsx">  import { Link } from &#39;react-router-dom&#39;;

  const Home = () =&gt; {

      return 
      &lt;Link to=&quot;/contact&quot;&gt;contact 페이지로 이동하기&lt;/Link&gt;
  };
  export default Works;
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>Dynamic Routes와 useParam</strong></p>
<ul>
<li><p><strong>Dynamic Routes(동적 라우팅)</strong> : path에 id와 같은 유동적인 값을 넣어 특정 페이지로 이동하는 기능 구현의 방법</p>
</li>
<li><p>react-router-dom 에 이어서..</p>
<pre><code class="language-jsx">  import React from &quot;react&quot;;
  import { BrowserRouter, Route, Routes } from &quot;react-router-dom&quot;;
  import Home from &quot;../pages/Home&quot;;
  import About from &quot;../pages/About&quot;;

  const Router = () =&gt; {
    return (
      &lt;BrowserRouter&gt;
        &lt;Routes&gt;
          &lt;Route path=&quot;/&quot; element={&lt;Home /&gt;} /&gt;
          &lt;Route path=&quot;about&quot; element={&lt;About /&gt;} /&gt;
                  {/* 추가한 코드 기본 예시 */}
                  &lt;Route path=&quot;about/:id&quot; element={&lt;About /&gt;} /&gt;
                  {/* 추가한 코드 변형 예시 */}
          &lt;Route path=&quot;about/:id&quot; element={&lt;Item /&gt;} /&gt;
        &lt;/Routes&gt;
      &lt;/BrowserRouter&gt;
    );
  };

  export default Router;</code></pre>
</li>
</ul>
</li>
</ul>
<pre><code>- **useParam** : 라우터 사용시 파라미터 정보를 가져와 활용하게 해주는 hook
    - 예제에서는 path값을 가져와 path의 id값을 조회할 수 있게 해주었다.
    - 코드 예시
        - Home.jsx - 이동 전 화면 컴포넌트 : Link를 사용해 data 배열의 id를 path뒤에 붙여주었다.

            ```jsx
            import { Link } from &#39;react-router-dom&#39;;

            const data = [
              { id: 1, todo: &#39;리액트 배우기&#39; },
              { id: 2, todo: &#39;노드 배우기&#39; },
            ];

            function Home() {
              return (
                &lt;div&gt;
                  {data.map((work) =&gt; {
                    return (
                      &lt;div key={work.id}&gt;
                        &lt;Link to={`/works/${work.id}`}&gt;
                          &lt;span&gt; Go to: {work.todo}&lt;/span&gt;
                        &lt;/Link&gt;
                      &lt;/div&gt;
                    );
                  })}
                &lt;/div&gt;
              );
            }

            export default Home;
            ```

        - Work.jsx - 이동한 컴포넌트 : useParams로 path값의 id와 data의 id를 비교하여 같은 데이터를 찾았다.

            ※ 아래 코드에서는 path의 id의 값이 문자형이기 때문에 parseInt를 사용했지만,

             id를 uuid로 생성한다면 parseInt를 사용하지 않고 비교해도 된다. 

            ```jsx
            import React from &#39;react&#39;;
            import { useParams } from &#39;react-router-dom&#39;;

            const data = [
              { id: 1, todo: &#39;리액트 배우기&#39; },
              { id: 2, todo: &#39;노드 배우기&#39; },
            ];

            function Work() {
              const param = useParams();
              const work = data.find((work) =&gt; work.id === parseInt(param.id));
              return &lt;div&gt;{work.todo}&lt;/div&gt;;
            }

            export default Work;
            ```

            - 프로젝트에서 작성한 코드

                ```jsx
                const Detail = () =&gt; {
                    // store에 저장한 state 데이터를 가져와 사용함
                  const globalTodo = useSelector((state) =&gt; state.todos.todos);
                  const param = useParams();
                  const item = globalTodo.find((elem) =&gt; elem.id === param.id);

                  return (
                      &lt;StDetail key={item.id}&gt;
                        ID: &lt;StIdContent&gt; {item.id}&lt;/StIdContent&gt;
                        &lt;StDetailTitle&gt;제목: {item.title}&lt;/StDetailTitle&gt;
                        &lt;StDetailContent&gt;내용: {item.content}&lt;/StDetailContent&gt;
                      &lt;/StDetail&gt;
                  );
                };
                ```</code></pre><hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>하드코딩한 부분 리팩토링 - 아직 해결 전…</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>하드코딩한 부분 리팩토링<ul>
<li>투두리스트의 투두를 필터링하기.</li>
</ul>
</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li><strong>[특강] react lifecycle</strong></li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 리액트 숙련 강의</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 33일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-33%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-33%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 14 Dec 2022 15:26:33 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-14">📅 학습 일자 : 22. 12. 14</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[과제] 리덕스로 투두리스트 만들기</strong></li>
<li><strong>[특강] 좋은 개발자의 비밀</strong></li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-과제-리덕스로-투두리스트-만들기">▣ [과제] 리덕스로 투두리스트 만들기</h2>
<h3 id="■-프로젝트-세팅">■ 프로젝트 세팅</h3>
<ul>
<li>프로젝트 폴더 생성</li>
<li>리액트 프로젝트 세팅<ul>
<li><strong>CRA 사용</strong><ul>
<li>터미널 :   <code>yarn create-react-app .</code><ul>
<li>. 대신 폴더명을 넣어, 프로젝트 폴더 생성과정을 동시에 해도 된다.<ul>
<li><code>yarn create-react-app 프로젝트폴더명</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>라이브러리, 패키지 추가<ul>
<li><strong>Styled-commponents</strong><ul>
<li>터미널 :  <code>yarn add styled-components</code></li>
<li>컴포넌트 파일 : <code>import styled from &quot;styled-components&quot;;</code></li>
</ul>
</li>
<li><strong>redux 설치</strong><ul>
<li>터미널 : <code>yarn add redux react-redux</code><ul>
<li>= yarn add redux
yarn add react-redux</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="■-폴더-구조-세팅">■ 폴더 구조 세팅</h3>
<ul>
<li><p><strong>1) 기본 폴더 구조 생성</strong>
  <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/619e0266-2198-42d5-b9d4-671b88b3b2ac/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221214%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221214T152348Z&X-Amz-Expires=86400&X-Amz-Signature=15b85ff2326a142da72caca3df5849c2f694296ad98f7d8515478356126e9cd0&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
</li>
<li><p><strong>2) src/configStore.js</strong></p>
<p>  <code>src/configStore.js</code> 에 아래 코드 입력</p>
<pre><code class="language-jsx">  import { createStore } from &quot;redux&quot;;
  import { combineReducers } from &quot;redux&quot;;

  /*
  1. createStore()
  리덕스의 가장 핵심이 되는 스토어를 만드는 메소드(함수) 입니다. 
  리덕스는 단일 스토어로 모든 상태 트리를 관리한다고 설명해 드렸죠? 
  리덕스를 사용할 시 creatorStore를 호출할 일은 한 번밖에 없을 거예요.
  */

  /*
  2. combineReducers()
  리덕스는 action —&gt; dispatch —&gt; reducer 순으로 동작한다고 말씀드렸죠? 
  이때 애플리케이션이 복잡해지게 되면 reducer 부분을 여러 개로 나눠야 하는 경우가 발생합니다. 
  combineReducers은 여러 개의 독립적인 reducer의 반환 값을 하나의 상태 객체로 만들어줍니다.
  */

  const rootReducer = combineReducers({}); 
  const store = createStore(rootReducer); 

  export default store;</code></pre>
</li>
<li><p><strong>3) index.js</strong></p>
</li>
</ul>
<pre><code>디렉토리의 가장 최상단에 있는 `index.js`에 아래 코드 입력

```jsx
// 원래부터 있던 코드
import React from &quot;react&quot;;
import ReactDOM from &quot;react-dom/client&quot;;
import App from &quot;./App&quot;;
import reportWebVitals from &quot;./reportWebVitals&quot;;

// 우리가 추가할 코드
import store from &quot;./redux/config/configStore&quot;;
import { Provider } from &quot;react-redux&quot;;

const root = ReactDOM.createRoot(document.getElementById(&quot;root&quot;));
root.render(

    //App을 Provider로 감싸주고, configStore에서 export default 한 store를 넣어줍니다.
  &lt;Provider store={store}&gt; 
    &lt;App /&gt;
  &lt;/Provider&gt;
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
```</code></pre><h2 id="▣-특강-좋은-개발자의-비밀">▣ [특강] 좋은 개발자의 비밀</h2>
<ul>
<li>궁금한 부분을 질문할 때, 내가 작업한 코드/공부한 내용 정리와 문제를 해결하기 위해 시도한 방법들과 그 결과들을 정리해서 물을 것.</li>
<li>에러메세지를 만났을 때, 바로 검색을 하지말고 먼저 에러 메세지를 읽고 고민한 흔적을 글로 남겨볼 것.</li>
<li>내가 만들어낸 것에 대한 스토리텔링을 TIL, WIL에 녹여라. 미래의 내가 봤을 때도 도움이 되고 포트폴리오에도 도움이 된다.</li>
<li>실생활에서 필요한 서비스 중에서도 시도해볼만한 작은 프로젝트를 찾아서 만들어보라.<ul>
<li>예) 코로나 방문 QR코드 이미지 바로가기 어플</li>
</ul>
</li>
<li>프로젝트를 할 때는, 실제 서비스되고 있는 웹/앱의 기능을 자세히 살펴보고 참고해보라. 생각보다 구현해야할 기능이 많다.<ul>
<li>예) 아이디 찾기, 장기간 미방문 고객에게 메일링 서비스 등</li>
</ul>
</li>
<li>자료 공유가 활발한 영어권의 글, 코드 작성법을 많이 볼 것.<ul>
<li><a href="http://medium.com">medium.com</a> 추천</li>
</ul>
</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>리덕스로 투두리스트를 만드려니까 에러의 연속이다.<ul>
<li>제대로 해결된 게 없어서,, 해결을 하면서 해결방법을 정리해야겠다.</li>
</ul>
</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>리덕스로 투두리스트 만들기</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>리덕스로 투두리스트 만들기</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 리액트 숙련 강의</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 32일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-32%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-32%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 13 Dec 2022 13:45:24 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-13">📅 학습 일자 : 22. 12. 13</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><p><strong>[강의] 리액트 숙련</strong></p>
<p>  9~완강</p>
</li>
</ul>
<ul>
<li><strong>[특강]</strong> <strong>React 심화과정 _ Redux 복습</strong></li>
<li><strong>[과제] 알고리즘 문제 풀기</strong></li>
<li><strong>[과제] 리액트 미니 투두리스트</strong></li>
<li><strong>[자습] 리액트 입문 과제 클론 - 과정 정리</strong></li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-알고리즘-문제-풀기">▣ 알고리즘 문제 풀기</h2>
<ul>
<li><a href="https://velog.io/@newas_born/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-regex-regular-expression">정규표현식 (regex / regular expression)</a></li>
</ul>
<h2 id="▣-리액트">▣ 리액트</h2>
<h3 id="■-숙련-과제시---입문-주차-과제-과정-참고하기">■ 숙련 과제시 - 입문 주차 과제 과정 참고하기</h3>
<p><img src="https://velog.velcdn.com/images/newas_born/post/488105c1-babf-4ef7-b967-b183c3628f1e/image.png" alt=""></p>
<h3 id="■-redux-시작하기">■ Redux 시작하기</h3>
<ul>
<li>숙련 주차 전체 복습 중..</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li><h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
</li>
<li><p>리덕스로 투두리스트 만들기</p>
</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>리덕스로 투두리스트 만들기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규표현식 (regex / regular expression)]]></title>
            <link>https://velog.io/@newas_born/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-regex-regular-expression</link>
            <guid>https://velog.io/@newas_born/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-regex-regular-expression</guid>
            <pubDate>Tue, 13 Dec 2022 13:43:37 GMT</pubDate>
            <description><![CDATA[<h2 id="정규표현식-regex--regular-expression">정규표현식 (regex / regular expression)</h2>
<hr>
<p>: 문자열에서 특정 문자 조합(패턴)을 찾기 위해 사용하는 형식의 언어이다.</p>
<p><code>**/pattern/flags**</code></p>
<p>: / / 안에 원하는 패턴을 작성하며, 뒤에 flag 옵션을 더할 수 있다. </p>
<h2 id="패턴-작성-문법">패턴 작성 문법</h2>
<h3 id="groups-and-ranges">Groups and ranges</h3>
<table>
<thead>
<tr>
<th>Character</th>
<th>뜻</th>
</tr>
</thead>
<tbody><tr>
<td></td>
<td></td>
</tr>
<tr>
<td>()</td>
<td>그룹</td>
</tr>
<tr>
<td>[]</td>
<td>문자셋, 괄호안의 어떤 문자든</td>
</tr>
<tr>
<td>[^]</td>
<td>부정 문자셋, 괄호안의 어떤 문가 아닐때</td>
</tr>
<tr>
<td>(?:)</td>
<td>찾지만 기억하지는 않음</td>
</tr>
</tbody></table>
<h3 id="quantifiers">Quantifiers</h3>
<table>
<thead>
<tr>
<th>Character</th>
<th>뜻</th>
</tr>
</thead>
<tbody><tr>
<td>?</td>
<td>없거나 있거나 (zero or one)</td>
</tr>
<tr>
<td>*</td>
<td>없거나 있거나 많거나 (zero or more)</td>
</tr>
<tr>
<td>+</td>
<td>하나 또는 많이 (one or more)</td>
</tr>
<tr>
<td>{n}</td>
<td>n번 반복</td>
</tr>
<tr>
<td>{min,}</td>
<td>최소</td>
</tr>
<tr>
<td>{min,max}</td>
<td>최소, 그리고 최대</td>
</tr>
</tbody></table>
<h3 id="boundary-type">Boundary-type</h3>
<table>
<thead>
<tr>
<th>Character</th>
<th>뜻</th>
</tr>
</thead>
<tbody><tr>
<td>\b</td>
<td>단어 경계</td>
</tr>
<tr>
<td>\B</td>
<td>단어 경계가 아님</td>
</tr>
<tr>
<td>^</td>
<td>문장의 시작</td>
</tr>
<tr>
<td>$</td>
<td>문장의 끝</td>
</tr>
</tbody></table>
<h3 id="character-classes">Character classes</h3>
<table>
<thead>
<tr>
<th>Character</th>
<th>뜻</th>
</tr>
</thead>
<tbody><tr>
<td>\</td>
<td>특수 문자가 아닌 문자</td>
</tr>
<tr>
<td>.</td>
<td>어떤 글자 (줄바꿈 문자 제외)</td>
</tr>
<tr>
<td>\d</td>
<td>digit 숫자</td>
</tr>
<tr>
<td>\D</td>
<td>digit 숫자 아님</td>
</tr>
<tr>
<td>\w</td>
<td>word 문자</td>
</tr>
<tr>
<td>\W</td>
<td>word 문자 아님</td>
</tr>
<tr>
<td>\s</td>
<td>space 공백</td>
</tr>
<tr>
<td>\S</td>
<td>space 공백 아님</td>
</tr>
</tbody></table>
<h2 id="플래그">플래그</h2>
<table>
<thead>
<tr>
<th>플래그</th>
<th>설명</th>
<th>해당 속성</th>
</tr>
</thead>
<tbody><tr>
<td>d</td>
<td>부분 문자열 일치에 대해 인덱스 생성.</td>
<td>hasIndices</td>
</tr>
<tr>
<td>g</td>
<td>전역 탐색.</td>
<td>global</td>
</tr>
<tr>
<td>i</td>
<td>대소문자를 구분하지 않음.</td>
<td>ignoreCase</td>
</tr>
<tr>
<td>m</td>
<td>여러 줄에 걸쳐 탐색.</td>
<td>multiline</td>
</tr>
<tr>
<td>s</td>
<td>개행 문자가 .과 일치함.</td>
<td>dotAll</td>
</tr>
<tr>
<td>u</td>
<td>&quot;unicode&quot;, 패턴을 유니코드 코드 포인트의 시퀀스로 간주함.</td>
<td>unicode</td>
</tr>
<tr>
<td>y</td>
<td>&quot;접착&quot; 탐색, 대상 문자열의 현재 위치에서 탐색을 시작함.</td>
<td>sticky</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="자바스크립트에서-정규표현식-사용">자바스크립트에서 정규표현식 사용</h3>
<table>
<thead>
<tr>
<th>메서드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>exec()</td>
<td>문자열에서 일치하는 부분을 탐색합니다. 일치 정보를 나타내는 배열, 또는 일치가 없는 경우 null을 반환</td>
</tr>
<tr>
<td>test()</td>
<td>문자열에 일치하는 부분이 있는지 확인합니다. true 또는 false를 반환</td>
</tr>
<tr>
<td>match()</td>
<td>캡처 그룹을 포함해서 모든 일치를 담은 배열을 반환합니다. 일치가 없으면 null을 반환</td>
</tr>
<tr>
<td>matchAll()</td>
<td>캡처 그룹을 포함해서 모든 일치를 담은 반복기를 반환</td>
</tr>
<tr>
<td>search()</td>
<td>문자열에서 일치하는 부분을 탐색합니다. 일치하는 부분의 인덱스, 또는 일치가 없는 경우 -1을 반환</td>
</tr>
<tr>
<td>replace()</td>
<td>문자열에서 일치하는 부분을 탐색하고, 그 부분을 대체 문자열로 변경</td>
</tr>
<tr>
<td>replaceAll()</td>
<td>문자열에서 일치하는 부분을 모두 탐색하고, 모두 대체 문자열로 변경</td>
</tr>
<tr>
<td>split()</td>
<td>정규 표현식 또는 문자열 리터럴을 사용해서 문자열을 부분 문자열의 배열로 나눔</td>
</tr>
</tbody></table>
<p>📗 <strong>예제</strong></p>
<pre><code class="language-jsx">** 기본적으로 플래그는 gm으로 설정하여 실습함. 

* 기본 탐색
/Hi/gm

**&lt; Groups and ranges &gt;**

* Hi 또는 Hello 찾기
/Hi|Hello/gm

* 그룹으로 지정하여 찾기
/(Hi/Hello)/gm
// 위에서 |만 사용하여 찾았을 때와 달리, 찾은 결과값이 그룹으로 지정된 것을 확인 가능
/(Hi|Hello)|(And)/gm
// Hi와 Hello는 그룹 1에 해당 그룹 2는 undefined, And는 그룹 1은 undefined, 그룹 2에 해당

* grey, gray 찾기 1
/gr(e|a)y/gm

* grey, gray 찾기 2 : 찾아진 값을 그룹으로 보이지 않도록 탐색
/gr(?:e|a)y/gm

* grey, gray 찾기 3 : 해당하는 문자를 집합체처럼 처리해서 []안에 넣어준다.
/gr[ea]y/gm
/gr[a-f]y/gm
/gr[ead]y/gm

* 어떤 문자열이든 a-z, A-Z, 0-9까지, 모두 만족하는 문자 찾기
/[a-z]/gm
/[A-Z]/gm
/[0-9]/gm
/[a-zA-Z0-9]/gm

** 조건에 해당하지 않는 경우 찾기
/[^a-zA-Z0-9]/gm

**&lt; Quantifiers &gt;**

* a가 있는 경우와 없는 경우
/gra?y/gm

* a가 있거나 없거나 많은 경우
/gra*y/gm

* a가 하나만 있거나 많이 있는 경우
/gra+y/gm

* a가 최소 2개 최대 3개까지 있는 경우 / 최소만 지정해도 된다.
/gra{2,3}y/gm
/gra{2,}y/gm

**&lt; Boundary-type &gt;**

* 특정 문자열에서 단어의 시작부분에 있는 Ya 만 선택할 때
/\bYa/gm

* 특정 문자열에서 단어의 뒤에 Ya 만 선택할 때
/Ya\b/gm

** 위와 반대의 케이스 단어의 뒤에 쓰이지 않는 Ya 만 선택할 때 : Ya만 있는 단어는
Ya로 끝나는 단어이기도 하므로 선택되지 않는다!
/Ya\B/gm

* 문장의 시작과 끝에 있는 Ya를 선택할 때
** 시작
/^Ya/gm
** 끝
/Ya$/gm
*** 이때 플래그의 멀티라인 m을 선택하지 않으면, 전체적인 문장에서 찾지 않게 된다. 
: 전체 데이터 끝에 있는 Ya만 검색됨.
/Ya$/g

**&lt; Character classes &gt;**

* 특수문자 . (등등)을 찾을 경우
/\./gm
/\[\]/gm

*** 활용 예제 ***

1. 전화번호를 찾을 경우 : -, . , 공백으로 나눠져있음

1) 간단식
/\d\d\d-\d\d\d\d-\d\d\d\d/gm
2) 패턴 만들기 2가지 방식
/\d{2,3}[-. ]\d{3}[-. ]\d{4}/gm
/[0-9]{2,3}[-. ][0-9]{3}[-. ][0-9]{4}/gm

2. 이메일을 찾을 경우
// 나의 풀이
/[a-zA-Z0-9-.]{2,}\@\w{2,}\.[a-zA-Z0-9-.]{2,}/gm
// 선생님 풀이
/[a-zA-Z0-9._+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.]+/gm

3. 유튜브 주소 뒤에 아이디 값만 찾기

1) 패턴의 데이터 찾기.
/(https?:\/\/)?(www\.)?youtu.be\/([a-zA-Z0-9-]{11})/gm
// 소괄호를 이용하여 만들었기 때문에 데이터가 매칭된 것을 살펴보면, 그룹으로 나눠진 것을 
// 확인할 수 있다. 

2) 원하는 데이터는 아이디 값이므로, 앞의 주소 패턴 그룹은 제외해준다. 
/(?:https?:\/\/)?(?:www\.)?youtu.be\/([a-zA-Z0-9-]{11})/gm

*** 자바스크립트에서 활용해보기

const regex = /(?:https?:\/\/)?(?:www\.)?youtu.be\/([a-zA-Z0-9-]{11})/
// undefined
const url = &#39;https://www.youtu.be/-ZClicWm0zM&#39;
// undefined
url.match(regex)
// * 함수로 매칭되는 데이터를 호출하면, 결과값이 배열로 리턴된다.
// 인덱스 0번에는 매칭되는 데이터 전체의 문자열,
// **인덱스 1번에는 매칭되는 그룹의 데이터가 들어있다.** 
// (2) [&#39;https://www.youtu.be/-ZClicWm0zM&#39;, &#39;-ZClicWm0zM&#39;, index: 0, input: &#39;https://www.youtu.be/-ZClicWm0zM&#39;, groups: undefined]
// 0 : &quot;https://www.youtu.be/-ZClicWm0zM&quot;
// 1 : &quot;-ZClicWm0zM&quot;
// groups : undefined
// index : 0
// input : &quot;https://www.youtu.be/-ZClicWm0zM&quot;
// length : 2
// [[Prototype]] : Array(0)

const result = url.match(regex);
//undefined
result[1];
//&#39;-ZClicWm0zM&#39;</code></pre>
<hr>
<h3 id="🔗--출처"><strong>🔗  출처</strong></h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=t3M6toIflyQ&amp;list=PLv2d7VI9OotSn1ThdDeqvBx8QuRSd01qv">드림코딩 유튜브</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D">위키-정규표현식</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions">MDN-정규표현식</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 31일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-31%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-31%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 12 Dec 2022 15:27:19 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-12">📅 학습 일자 : 22. 12. 12</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><p><strong>[강의] 리액트 숙련</strong></p>
<p>  5 ~ 8 수강</p>
</li>
<li><p><strong>[특강]</strong> <strong>React 심화과정 _ Redux 복습</strong></p>
</li>
<li><p><strong>[과제] 알고리즘 문제 풀기</strong></p>
</li>
<li><p><strong>[자습] 리액트 강의 - 유데미</strong></p>
</li>
<li><p>**[자습] 리액트 입문 과제 클론 **</p>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-알고리즘-문제-풀기">▣ 알고리즘 문제 풀기</h2>
<p><strong><a href="https://codechacha.com/ko/javascript-remove-spaces-in-string/">JavaScript - 문자열 공백 제거, 3가지 방법</a></strong></p>
<h2 id="▣-리액트">▣ 리액트</h2>
<h3 id="■-uuid-생성">■ uuid 생성</h3>
<ul>
<li><p><strong>uuid 패키지 다운</strong></p>
<ul>
<li><p><strong>npm 경우</strong></p>
<p>  <code>npm install uuid</code></p>
</li>
<li><p><strong>yarn 경우</strong></p>
<p>  <code>yarn add uuid</code></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>사용하는 컴포넌트 파일에서 import</strong></p>
<p>  <code>import {v4 as uuidv4} from ‘uuid’;</code></p>
</li>
</ul>
<ul>
<li><p><strong>적용하려는 코드에서 함수 실행하여 uuid 생성</strong></p>
<p>  <code>uuidv4( )</code></p>
</li>
</ul>
<h3 id="■-redux">■ Redux</h3>
<ul>
<li><strong>Redux가 필요한 이유?</strong><ul>
<li>state가 props라는 이름으로 전달되며 (props Drilling) 계속 변경되는 이력을 관리할 수 없고, 또 어디에서 사용하는지 파악하기 어렵기 때문에, 상태를 관리해줄 도구가 필요하다.</li>
<li>Redux를 사용하면, state를 전역에서 접근이 가능하기 때문에 &#39;중앙 관리소&#39;라고 생각하면 된다. </li>
<li>state가 오직 Redux에서만 관리된다. (변경, 수정, 생성)</li>
<li>자체적인 문서가 된다.</li>
<li>문제 발생 시 원인을 빠르게 찾을 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/newas_born/post/bd397f2f-15c2-4c98-8c98-82458e73f8d7/image.gif" alt=""></p>
<blockquote>
<p>👉 기존에 많은 컴포넌트에서 참조하고, 관리/수정됐던 <strong>state</strong>
<strong>store라는 저장소</strong>에 <strong>모아놓고 관리</strong>하자!</p>
</blockquote>
<ul>
<li><strong>Store</strong> : state, state들을 관리할 수 있는 메서드(reducer)가 들어있다. </li>
<li><strong>Reducer</strong> : state를 변경하는 함수들(메서드)</li>
</ul>
<ul>
<li><p>UI(컴포넌트) → Dispatch</p>
<ul>
<li>UI에서 이벤트 핸들러를 통해 Dispatch에게 요청을 하면, Dispatch는 Store가 해석할 수 있는 형태인 Action 객체 형태로 들고가서 처리가 되도록 요청해야 된다.</li>
<li>UI가 Store에게 요청을 하는 방법이 바로 Dispatch이다.</li>
</ul>
</li>
<li><p>Dispatch → Store</p>
<ul>
<li>Store는 Dispatch에게 전달받은 Action을 기반으로, Reducer안에 정의된 방법으로 state를 갱신한다.</li>
</ul>
</li>
<li><p>Store → UI</p>
<ul>
<li>변경된 state를 UI(컴포넌트)에 전달되면, 다시 랜더링이 되면서 변경된 내용으로 화면이 그려지게 된다.</li>
</ul>
</li>
<li><p><strong>state의 구분</strong>
state -&gt; 컴포넌트 단위
state -&gt; 전역 (global)</p>
</li>
</ul>
<ol>
<li>전역 state -&gt; redux store에 있는 state</li>
<li>컴포넌트 state -&gt; 컴포넌트에서 관리되는 state</li>
</ol>
<blockquote>
<p>👉 모든 state가 store에서 관리된다?
    - No!  지역적으로 관리하는 state도 있을 수 있다.</p>
</blockquote>
<ul>
<li><p><strong>store를 만드는 과정</strong></p>
<ul>
<li><p>리듀서들을 정의 해놓은 파일</p>
<ul>
<li>modules / counter.js (예시: counter라는 리듀서일 경우)</li>
</ul>
<ol>
<li><p>Action value를 상수로 만들어준다.</p>
<ul>
<li><p>Action value는 Action 이 무슨 일을 할지를 결정하는 정보의 결합이다. (type과 payload)</p>
</li>
<li><p>파일 상단에 선언하며, 대문자로 표기, 의미를 알아볼 수 있도록 이름을 짓는다.</p>
<pre><code>const PLUS_ONE = &#39;PLUS_ONE&#39;;

</code></pre></li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<pre><code>    2. Action Creator를 만든다. 

        ```jsx
        export const plusOne = () =&gt; {
          return {
            type: PLUS_ONE,
          };
        };
        ```

    3. 리듀서는 state와 action을 갖는다. 
        - action의 type을 기준으로 어떤 state를 반환할 지 결정한다.

        ```jsx
        // 초기 상태값
        const initialState = {
          number: 0,
        };

        // 리듀서
        const counter = (state = initialState, action) =&gt; {
          switch (action.type) {
            case PLUS_ONE: // case에서도 문자열이 아닌, 위에서 선언한 상수를 넣어줍니다.
              return {
                number: state.number + 1,
              };
            case MINUS_ONE: // case에서도 문자열이 아닌, 위에서 선언한 상수를 넣어줍니다.
              return {
                number: state.number - 1,
              };
            default:
              return state;
          }
        };
        ```


- store 설정 파일
    - config / configStore.js
    1. (리듀서 생성 파일에서 불러온) reducer를 묶어준다. : 하나로 모아서 store에 모아주는 방식

        `const rootReducer = **combineReducers**({ counter });`

    2. 만든 reducer를 통해 store를 생성한다.

        `const store = createStore(rootReducer);`

    3. 생성한 store를 내보낸다.

        `export default store;`</code></pre><blockquote>
<p>👉 export 와 export default
<strong>export</strong>
                        1. 복수의 개체가 있는 라이브러리 형태의 모듈에서 가져오기 할 때 사용된다.
            2. 특정 개체만 가져오는게 가능하다.
            3. 원하는 이름으로 import가 불가능하다.
                        <strong>export default</strong>
                        1. 일반적으로 해당 모듈엔 <strong>하나의 개체(변수, 클래스, 함수 등)</strong>만 있다는 의미로 받아들여진다.
                        2. 따라서 해당 모듈의 전체 개체를 export 한다는 의미를 갖는다.
                        3. 원하는 이름으로 import가 가능하다. (ex. import 원하는이름 from &quot;경로&quot;)</p>
</blockquote>
<ul>
<li>UI (컴포넌트)</li>
</ul>
<ol start="7">
<li><p>UI(컴포넌트)에서 필요한 Action Creator를 import하여 dispatch 메서드로 사용한다. </p>
<pre><code class="language-jsx">    &lt;button onClick={() =&gt; {dispatch(plusOne()); }}&gt;
    +1
    &lt;/button&gt;</code></pre>
</li>
</ol>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>아직 리액트로 프로젝트를 만드는 것이 어렵다. 리액트 숙련 과제 시작하기 전에, 배워가는 내용들 최대한 정리하고 복습 중이다.</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>리액트 - 배운 내용 활용하여 새로운 기능 구현하기</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>리액트 숙련 수업 자료와 비교해서 위 내용 추가 정리하기</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - [특강] React 심화과정 _ Redux</li>
<li><a href="https://hanamon.kr/redux%EB%9E%80-%EB%A6%AC%EB%8D%95%EC%8A%A4-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/">Redux(리덕스)란? (상태 관리 라이브러리)</a></li>
<li><a href="https://redux.js.org/tutorials/essentials/part-1-overview-concepts">Redex의 개요와 개념</a></li>
<li><a href="https://quark21.tistory.com/314">[React]export와 export default의 차이</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 6주차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-6%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-6%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 11 Dec 2022 15:11:35 GMT</pubDate>
            <description><![CDATA[<h2 id="🗓️-학습일자--22125-129">🗓️ <strong>학습일자 : 22.12.5~ 12.9</strong></h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[일일과제] 알고리즘 문제 풀기</strong></li>
<li><strong>[과제] 리액트로 Todo list 만들기</strong></li>
<li><strong>[자습] 리액트 추가 학습 - 유데미 Section 3~5</strong></li>
<li><strong>[자습] 리액트 추가 학습 - 생활코딩</strong></li>
<li><strong>[특강] 리액트 Todo list 과제 리뷰</strong></li>
<li><strong>[특강] JS 자주 사용 되는 ES6 문법 살펴보기</strong></li>
<li><strong>[특강]</strong> <strong>React 심화과정 _ Redux</strong></li>
<li><strong>[원격] 리액트 입문주차</strong></li>
<li><strong>[원격] 리액트 실무 기초</strong></li>
<li><strong>[원격] 리액트 숙련주차</strong></li>
</ul>
<hr>
<h3 id="💡-배운-내용"><strong>💡</strong> 배운 내용</h3>
<ul>
<li><p><strong>[과제] 리액트로 Todo list 만들기</strong></p>
<ul>
<li><p>리액트 강의 들은지 얼마 되지않아 주어진 과제라서 엄청난 압박감을 느꼈다.</p>
</li>
<li><p>최대한 내 힘을 많이 쏟아 과제를 끝내고 싶어서 리액트 공부에 욕심 부리다가,</p>
<p>  막상 과제는 시간에 쫓겨서 겨우 내게 되었다. </p>
</li>
<li><p>기능 구현은 했지만, 기본적인 주석이나 컴포넌트 설계 등에 신경쓰지 못해 너무 아쉬웠다.</p>
</li>
<li><p>과제 리뷰 강의에서도 기본적인 부분부터 신경쓸 것을 강조하셨다.</p>
<ul>
<li>주석, 필수적인 기능 (예: input창에 입력값이 없으면 입력이 되지 않도록 처리, 입력값이 없으면 사용자에게 경고창으로 메시지 전달하기 등)</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>[특강]</strong> <strong>React 심화과정 _ Redux</strong></p>
<ul>
<li>리액트 숙련주차에서 배우게될 리덕스에 대해, 특강이 진행되었다.</li>
<li>특강 전에 리덕스에 대한 기본 개념을 간단하게 공부하고, 숙련주차 강의를 어느 정도 범위까지는 듣고서 특강을 들었더니 설명에 대한 이해가 더욱 잘됐다.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>[강의] 리액트 실무 기초</strong><ul>
<li>기존에 지급되었던 리액트 강의도 호기심에 보게 되었는데, 강사님의 목소리 톤도 또렷하고 설명하는 방식도 명쾌하게 잘해주시는 것이었다..</li>
<li>그래서 처음엔 1~2강의만 봐야지하고, 꽤나 많은 분량을 보게되었다.</li>
<li>리액트 숙련 주차에 들어가더라도, 이 강의를 종종 찾아와서 이어 보도록 해야겠다.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="✅-이번-주-학습-목표-점검">✅ 이번 주 학습 목표 점검</h3>
<ul>
<li><p><strong>잘한 것은?</strong></p>
<ul>
<li>어렵지만, 이해하는 것을 포기하지 않고 계속 자료를 찾아봤던 것.</li>
</ul>
</li>
<li><p><strong>잘못한 것은?</strong></p>
<ul>
<li>과제에 대한 중요성을 망각하고, 시간에 쫓겨 결국 제출할 때가 되어선 기본적인 요구사항을 못 지킨 것.</li>
</ul>
</li>
</ul>
<h3 id="🗓️-다음-주-학습-계획">🗓️ 다음 주 학습 계획</h3>
<ul>
<li><p>[내배캠] 주요 일정</p>
<ul>
<li>알고리즘 문제풀기 - 프로그래머스 단계별 풀어보기</li>
<li>[과제] 리액트 숙련 개인과제</li>
<li>[원격] 리액트 숙련</li>
<li>[특강] 리액트 숙련 개인과제 리뷰</li>
<li>[특강] 좋은 개발자가 되기 위한 비밀</li>
<li>[특강] 리액트 life cycle</li>
<li>[특강] 협력사 특강_트릿지</li>
<li>[특강] CS 기초</li>
</ul>
</li>
<li><p>[셀프] 추가 학습</p>
<ul>
<li><p>[실시간] 자바스크립트 심화 복습</p>
</li>
<li><p>[자습] 리액트 강의 - 유데미</p>
</li>
<li><p>이월 미진행 항목</p>
<ul>
<li>[특강] CS 기초 : HTTP - 박민수 튜터님</li>
<li>[강의] Git</li>
<li>보충 학습 + TIL 보충하기<ul>
<li>알고리즘 - 정렬</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="🎯-다음-주-학습-목표">🎯 다음 주 학습 목표</h3>
<ul>
<li>리액트 적응하기 - 예제 연습 많이 해보기, 리덕스 익히기</li>
</ul>
<hr>
<h3 id="🗨️-생각-정리">🗨️ 생각 정리</h3>
<ul>
<li><strong>해결해야할 문제/남아있는 의문</strong><ul>
<li>블로그 이전 - 현재 벨로그에서 티스토리로 옮겨갈지..</li>
<li>프로젝트시 기획단에서 해야할 목록과 방식들 정리</li>
</ul>
</li>
<li><strong>어떻게 개선할까?</strong><ul>
<li>벨로그와 티스토리 각각의 장단점 다시 비교해보고, 최종적으로 선택하기 - 옮길 거면 빨리 옮겨야된다…</li>
<li>웹 사이트 기획 입문 책에서 자료 얻기, 기타 블로그 등 추가적인 자료 더 찾아보기</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 30일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-30%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-30%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 11 Dec 2022 13:15:59 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-09">📅 학습 일자 : 22. 12. 09</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><p><strong>[강의] 리액트 숙련</strong></p>
<p>  1 ~ 6 수강</p>
</li>
<li><p><strong>[특강]</strong> <strong>React 심화과정 _ Redux</strong></p>
</li>
<li><p>**[과제] 알고리즘 문제 풀기 **</p>
</li>
<li><p><strong>[자습] 리액트 강의 - 유데미 Chapter 3 복습</strong></p>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-알고리즘-문제-풀기">▣ 알고리즘 문제 풀기</h2>
<h3 id="■-set">■ <strong>Set</strong></h3>
<ul>
<li>정의<ul>
<li>중복된 값은 제외하고 유일한 값만 담아, 유사배열 형태로 반환하는 생성자 함수</li>
<li>원시 값, 객체 참조 등 자료형에 관계 없이 저장할 수 있다.</li>
</ul>
</li>
<li>생성 : new Set ( )</li>
<li>메서드 : add, delete, has, size<ul>
<li>has 는 값의 포함여부 체크, size는 배열의 length와 같은 역할</li>
</ul>
</li>
</ul>
<p>👉 <strong>new Set도 전개복사, Array.from으로 배열 전환이 가능하다!</strong></p>
<p><strong>예제)</strong></p>
<pre><code class="language-jsx">// 1
let mySet = new Set( );
mySet.add(1, 5, 5) // Set(1, 5)

// 2 
let my_string = &quot;people&quot;
let c = [...new Set(my_string)].join(&#39;&#39;) // &#39;peol&#39;
</code></pre>
<h2 id="▣-리액트">▣ 리액트</h2>
<h3 id="■-state와--props">■ <strong>State와  props</strong></h3>
<ul>
<li><p><strong>공통점</strong></p>
<ul>
<li>둘다 일반 자바스크립트 객체이며, 렌더링 결과물에 영향을 주는 정보를 갖고있다.</li>
</ul>
</li>
<li><p><strong>차이점</strong></p>
<ul>
<li><p>props는 함수의 매개변수처럼 컴포넌트에 전달되지만,</p>
<p>  state는 함수 내에 선언된 변수처럼 컴포넌트 안에서 관리된다. </p>
</li>
</ul>
</li>
</ul>
<h3 id="■-state-상태-끌어올리기">■ <strong>State (상태) 끌어올리기</strong></h3>
<ul>
<li><p>리액트에서는 기본적으로 단방향 (부모 → 자식, 하향식 데이터 흐름) 데이터 흐름을 갖는다.</p>
<p>  그렇기 때문에, 하위 컴포넌트는 상위 컴포넌트로부터 전달받은 데이터의 형태나 타입이 무엇인지만 알 수 있다. </p>
<p>  즉, 하위 컴포넌트가 전달받은 데이터가 state인지 직접 입력한 내용인지 알 수 없는 것이다.</p>
</li>
<li><p><strong>상위 컴포넌트의 ‘상태 변경 함수’ 그 자체를 하위 컴포넌트로 전달하고, 이 함수를 하위 컴포넌트가 실행하는 것이다.</strong></p>
</li>
<li><p>동일한 데이터에 대한 변경사항을 여러 컴포넌트에 반영해야할 경우가 있다.</p>
<p>  이 경우 가장 가까운 공통 조상으로 state를 끌어올리는 것이 좋다. </p>
</li>
<li><p>다른 컴포넌트 간에 존재하는 state를 동기화시키려고 하는 것보다, 하향식 데이터 흐름을 지키는 것을 권장한다.</p>
</li>
</ul>
<p><strong>예제)</strong> </p>
<ol>
<li>부모와 자식 컴포넌트가 하나씩 존재하는 트리 구조에서, 상태를 변경시킬 수 있는 메서드가 존재한다고 가정해보자.</li>
</ol>
<pre><code class="language-jsx">import { useState } from &#39;react&#39;;

export default function ParentComponent() {
  const [value, setValue] = useState(&#39;바꿀값&#39;);
  const handleChangeValue = () =&gt; {
    setValue(&#39;달라진 값&#39;);
  }

  return (
    &lt;div&gt;
      &lt;div&gt;값은 {value} 입니다.&lt;/div&gt;
      &lt;ChildComponent /&gt;
    &lt;/div&gt;
  )
}

function ChildComponent() {
  const handleClick = () =&gt; {
    // 이 버튼을 이용해 부모의 상태를 바꿔보기.
  }
  return &lt;button onClick={handleClick}&gt;값 변경&lt;/button&gt;
}</code></pre>
<ol>
<li><p>부모 컴포넌트에서 상태를 변경하는 함수는 handleChangeValue이며, 전달은 props로 한다.</p>
<p> ※ 전달할 때 <strong>handleButtonClick라는 함수 이름은 자식 컴포넌트에서 사용할 이름이다.</strong> </p>
</li>
</ol>
<pre><code class="language-jsx">function ParentComponent() {
  const [value, setValue] = useState(&#39;바꿀값&#39;);
  const **handleChangeValue** = () =&gt; {
    setValue(&#39;달라진 값&#39;);
  }

  return (
    &lt;div&gt;
      &lt;div&gt;값은 {value} 입니다.&lt;/div&gt;
      &lt;ChildComponent **handleButtonClick={handleChangeValue}** /&gt;
    &lt;/div&gt;
  )
}</code></pre>
<ol>
<li><p><strong>자식 컴포넌트에서는</strong> 고차함수에서 인자로 받은 함수를 실행하는 것 처럼, </p>
<p> <strong>props로 전달받은 함수를 컴포넌트 내에서 실행</strong>할 수 있게 된다. </p>
<p> 다음의 상태변경함수 <strong>handleButtonClick( ) 은 버튼을 클릭했을 때, 콜백함수로 실행된다.</strong> </p>
</li>
</ol>
<pre><code class="language-jsx">function ChildComponent({ **handleButtonClick** }) {
  const handleClick = () =&gt; {
        // 인자로 받은 상태 변경 함수를 실행
    **handleButtonClick()**
  }
  return &lt;button onClick={**handleClick**}&gt;값 변경&lt;/button&gt;
}</code></pre>
<p>👉 <strong>브라우저 실행 이미지</strong> </p>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/49e070e5-6b4f-4978-9164-57152f6ab821/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221211%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221211T131256Z&X-Amz-Expires=86400&X-Amz-Signature=d30dd1095a4a3f41ee0e6e9d6b88f32312d08f441a0c24874df1369e705de3ee&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/994f3bf2-ac53-4e2b-ba84-66e5871eac84/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221211%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221211T131306Z&X-Amz-Expires=86400&X-Amz-Signature=4350a5f470f044058b7443d21a81e92635ccba69083caec32ea7669eea64f024&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li><p>해야할 공부가 산더미지만, 마음만 급하고 제대로 소화시키면서 따라가지 못하는 기분이었다.</p>
<p>  이런 상황에서, 같은 팀원분들이 도움되는 조언을 전해주셨다. 마음이 지쳐가던 차라, 진심으로 고마움을 느꼈다.  </p>
</li>
<li><p>리액트를 공부하고 있는 시점에, 어려움을 느낀다면 그 어려움이 자바스크립트가 약해서 어려운건지 아니면 리액트 자체가가 어려운 것인지 잘 구분하라.</p>
</li>
<li><p>과제로 주어지는, 혹은 프로젝트를 진행할 때 필요한 코드들을 조립해서 완성하는 것은 틀린 방법이 아니다. 필요한 부분을 잘 검색해서 답을 찾을 능력을 갖추면 된다.</p>
</li>
<li><p>이 말을 들으니 이 전에 드림코딩에서 들었던 조언이 생각났다. 이 세상에는 나에게 필요한 모든 리소스가 존재한다. 단지 아직 내가 찾지 못한 것 뿐이다. resourceful한(지략이 풍부한) 사람이 될 것.</p>
</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>state</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>리덕스</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li><a href="https://velopert.com/3528">리덕스(Redux)를 왜 쓸까? 그리고 리덕스를 편하게 사용하기 위한 발악 (i)</a></li>
<li><a href="https://react.vlpt.us/redux/">리덕스</a></li>
<li><a href="https://ko.reactjs.org/docs/faq-state.html#what-is-the-difference-between-state-and-props">컴포넌트 State</a></li>
<li><a href="https://ko.reactjs.org/docs/lifting-state-up.html">State 끌어올리기</a></li>
<li><a href="https://velog.io/@bcdy19/React-State-%EC%83%81%ED%83%9C-%EB%81%8C%EC%96%B4%EC%98%AC%EB%A6%AC%EA%B8%B0">React - State 상태 끌어올리기</a></li>
<li><a href="https://nychicken.tistory.com/9">[React] React 시작하기(8) - state 끌어올리기</a></li>
<li>프로그래머스 코딩테스트 - 중복된 문자 제거</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 29일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-29%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-29%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 08 Dec 2022 12:39:23 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-08">📅 학습 일자 : 22. 12. 08</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[강의] 자바스크립트 심화</strong><ul>
<li>Chap 5. 클로저</li>
</ul>
</li>
<li><strong>[과제] 알고리즘 문제 풀기</strong></li>
<li><strong>[자습] 리액트 강의 - 유튜브</strong></li>
<li><strong>[자습] 리액트 입문과제 todolist 개선하기</strong></li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h3 id="▣-자습-리액트-강의---유튜브">▣ [자습] 리액트 강의 - 유튜브</h3>
<ul>
<li>리액트 숙련 과정 강의를 듣기 전에, 리액트 기초를 다지는 추가 영상 자료로 공부했다.<ul>
<li>리마인드<ul>
<li><strong>props와 state의 차이점</strong><ul>
<li>props는 컴포넌트를 사용하는 외부자를 위한 데이터</li>
<li>state는 컴포넌트를 만드는 내부자를 위한 데이터</li>
</ul>
</li>
<li><strong>state</strong><ul>
<li>state를 만드는 useState 함수는 배열을 리턴하고, 배열의 0번째 값은 상태의 값을 읽을 때 쓰는 데이터가 들어가고, 1번째 값은 0번째(상태의 값)값을 변경할 때 사용하는 함수이다.</li>
<li>메인 작업 파일 App.js의 App 컴포넌트는 1번밖에 실행되지 않기 때문에 state를 이용해 상태를 감지하여, state의 변경이 일어나면 다시 실행되도록 한다.<ul>
<li>state값이 업데이트 → App 컴포넌트(함수) 재실행</li>
<li>변수는 잠시 저장할 용도로만 사용할 것.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li><p><strong>리액트 입문과제 todolist 개선하기</strong></p>
</li>
<li><p>[[React] Each child in a list should have a unique &quot;key&quot; prop.] (<a href="https://velog.io/@newas_born/React-Each-child-in-a-list-should-have-a-unique-key-prop">https://velog.io/@newas_born/React-Each-child-in-a-list-should-have-a-unique-key-prop</a>)</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] Each child in a list should have a unique "key" prop.]]></title>
            <link>https://velog.io/@newas_born/React-Each-child-in-a-list-should-have-a-unique-key-prop</link>
            <guid>https://velog.io/@newas_born/React-Each-child-in-a-list-should-have-a-unique-key-prop</guid>
            <pubDate>Thu, 08 Dec 2022 12:24:34 GMT</pubDate>
            <description><![CDATA[<h2 id="⛔-문제-상황">⛔ 문제 상황</h2>
<ul>
<li><p><strong>작업 내용</strong></p>
<ul>
<li>리액트 Todolist 만들기 과제</li>
</ul>
</li>
<li><p><strong>에러 메시지</strong></p>
<p>  <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/3b02003b-6708-4b4e-8181-dd12fd740557/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221208%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221208T122239Z&X-Amz-Expires=86400&X-Amz-Signature=d5387ea799b6af36f4846f990c7de9251c9e4d83a58b929d25ff2a8cc43bd90a&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
</li>
</ul>
<ul>
<li><p><strong>에러 발생 코드</strong></p>
<pre><code class="language-jsx">  &lt;div className=&#39;list-container&#39;&gt;
        {todos.map((todo) =&gt; {
          if (todo.isDone === false) {
            return &lt;TodoList todos={todos} setTodos={setTodos} /&gt;;
          }
        })}
  &lt;/div&gt;</code></pre>
</li>
</ul>
<hr>
<h2 id="🔎-원인과-해결">🔎 원인과 해결</h2>
<h3 id="⚠️-에러-원인">⚠️ <strong>에러 원인</strong></h3>
<ul>
<li>react에서는 map() 메서드 사용시 배열의 각 Item마다 독립적인 key 값을 설정해야 된다.</li>
<li>하지만, 에러가 발생한 코드에서는 key prop과 관련해 세팅을 해주지 않았다.</li>
</ul>
<p>👉  리액트는 자동으로 생성한 태그의 경우,
리액트가 태그들을 추적해야되는 근거로써 약속된 프롭 key를 부여함으로써 성능을 높여 동작하게 한다.</p>
<h3 id="🔐-해결-방법">🔐 해결 방법</h3>
<ul>
<li>todo 목록이 세팅될 때 key값으로 uuid가 들어가도록 지정</li>
<li>각각의 todo li를 화면에 그려주는 작업시 key값도 같이 들어가도록 지정</li>
</ul>
<pre><code class="language-jsx">setTodos([
      ...todos,
      {
        title: input,
        content: content,
        isDone: false,
        key: uuidv4(),
      },
    ]);
------------------------

&lt;div className=&#39;list-container&#39;&gt;
      {todos.map((todo) =&gt; {
        if (todo.isDone === false) {
          return (
            &lt;TodoList todos={todos} setTodos={setTodos} **key={todo.key}** /&gt;
          );
        }
})}</code></pre>
<hr>
<h3 id="🔗-참고">🔗 참고</h3>
<ul>
<li><a href="https://itprogramming119.tistory.com/entry/React-Warning-Each-child-in-a-list-should-have-a-unique-key-prop-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95">Each-child-in-a-list-should-have-a-unique-key-prop-해결-방법</a></li>
<li><a href="https://crong-dev.tistory.com/47">[Warning: Each child in a list should have a unique &quot;key&quot; prop.] 에러 해결</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 28일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-28%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-28%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 07 Dec 2022 13:24:44 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-07">📅 학습 일자 : 22. 12. 07</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[과제] 알고리즘 문제 풀기</strong></li>
<li><strong>[과제] 리액트로 Todo list 만들기</strong></li>
<li><strong>[특강] 리액트 Todo list 과제 리뷰</strong></li>
<li><strong>[자습] 리액트 추가 학습</strong></li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-리액트-과제-리뷰">▣ 리액트 과제 리뷰</h2>
<ul>
<li><p>화면 리렌더링 기준은 useState 함수로 묶여있는 값(state)이 setState로 변경될 때이다.</p>
</li>
<li><p>state는 사용자가 직접 변경이 불가능하다.</p>
<ul>
<li>state 변경을 하고 싶을 경우 useState 함수를 사용해 setState값이 변경되어 state값에 전달되게 한다.</li>
</ul>
</li>
<li><p>component 태그 사이의 요소값을 children 키워드로 접근할 수 있다.</p>
<ul>
<li>예) &lt; Header &gt; 여기는 children입니다. &lt; /Header &gt;</li>
</ul>
</li>
<li><p>리액트 파일 확장자는 js, jsx 둘다 가능하지만, 컴포넌트가 들어가면 jsx로 사용하는게 맞다.</p>
</li>
</ul>
<h2 id="▣-리액트의-state와-리렌더링">▣ 리액트의 State와 리렌더링</h2>
<h3 id="■-state">■ State</h3>
<ul>
<li><p><strong>state란?</strong></p>
<ul>
<li>컴포넌트 내부에서 변경이 일어나는 값</li>
<li>개발자가 의도한 동작에 의해 변경할 수 있고, 사용자의 입력에 따라 새로운 값으로 변경될 수 있다.</li>
<li>state 값이 변경되고 리 렌더링이 필요한 경우에 리액트가 자동으로 계산하여 변경된 부분을 렌더링 한다.</li>
</ul>
</li>
<li><p><strong>state 만들기</strong></p>
<ul>
<li><p>state를 만들 때는 <strong><code>useState()</code></strong>를 사용한다.</p>
<aside>
👉 state 값을 직접 변경하게 되면, 리액트가 component를 다시 렌더링 할 타이밍을 알아차리지 못한다.

</aside>


</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>state 변경하기</strong></p>
<ul>
<li><p>state를 변경할 때는 반드시 <strong><code>setValue(바꾸고 싶은 값)</code></strong>를 사용한다.</p>
<ul>
<li><p>state 값을 개발자가 직접 변경해서는 안된다!</p>
<p>👉 <strong>setValue( ) 함수를 사용시 변경할 값을 직접 넣거나, 함수를 넣을 수 있다.</strong> </p>
</li>
</ul>
</li>
<li><p>함수를 넣는 경우, 함수가 리턴하는 값으로 state가 변경된다.</p>
</li>
<li><p>현재 값을 기반으로 state를 변경할 경우 함수를 넣는 방법이 적합하다.</p>
</li>
<li><p><em>1) setState 내에 변경할 값을 넣기*</em></p>
<pre><code class="language-jsx">const [count, setCount] = useState(0);
setCount(count + 1);</code></pre>
<p>2<strong>)  setState에 함수를 넣기</strong></p>
<pre><code class="language-jsx">const [count, setCount] = useState(0);</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="■-리렌더링-조건">■ 리렌더링 조건</h3>
<ol>
<li><strong>state(상태) 변경이 있을 때</strong><ul>
<li>리액트는 state 변경이 감지되면 리렌더링 한다.</li>
<li>상태를 변경한다는 것은 setState함수를 실행할 때, 리액트 <strong>트리거</strong>가 업데이트된다는 것을 의미한다.<ul>
<li>트리거 : 이벤트에 반응해 <strong>자동으로 실행</strong> 되는 작업</li>
</ul>
</li>
</ul>
</li>
<li><strong>새로운 props가 들어올 때</strong><ul>
<li>부모 컴포넌트로부터 새 props가  들어오면 자식 컴포넌트도 리렌더링 된다.</li>
</ul>
</li>
<li><strong>기존 props가 업데이트 됐을 때</strong><ul>
<li>부모 컴포넌트로부터 받은 props가 변경되면 props 값을 받은 자식 컴포넌트도 리렌더링 된다.</li>
</ul>
</li>
<li><strong>부모 컴포넌트가 리렌더링 될 때</strong><ul>
<li>부모 컴포넌트가 업데이트되어 리렌더링 되면, 자식 컴포넌트도 리렌더링 된다.</li>
</ul>
</li>
</ol>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>과제를 하다가 에러가 발생했을 때,  에러 문구를 검색해서 빨리 처리하고 넘기느라 정리를 못했다. 추후 동일한 상황을 위해 에러 해결 부분을 정리하자..</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>todolist 과제 - 컴포넌트로 분리해서 기능 구현하기</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>참고자료 내용 다시 정독하기</li>
<li>todolist 과제 기능 보완하기</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 리액트 todolist 과제 리뷰 특강</li>
<li><a href="https://velog.io/@surim014/react-rerender#react%EB%8A%94-%EC%96%B8%EC%A0%9C-%EB%A6%AC%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%90%A0%EA%B9%8C%EC%9A%94">(번역) React는 컴포넌트를 언제 다시 리렌더링 할까요?</a></li>
<li><a href="https://seungddak.tistory.com/109">[react] 리렌더링이 되는 조건들 살펴보기</a></li>
<li><a href="https://lakelouise.tistory.com/260">리액트 State란?</a></li>
<li><a href="https://fromnowwon.tistory.com/103">리액트 재렌더링 조건 &amp; 렌더링 성능 최적화 방법</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 27일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-27%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-27%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 06 Dec 2022 13:00:10 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-06">📅 학습 일자 : 22. 12. 06</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><p><strong>[과제] 알고리즘 문제 풀기</strong></p>
</li>
<li><p><strong>[강의] 자바스크립트 심화</strong></p>
<ul>
<li>Chap-04. callback</li>
</ul>
<p>🚩 <strong>학습 목표</strong></p>
<ul>
<li>Chap-04. 개념 이론에 익숙해지기</li>
</ul>
</li>
<li><p><strong>[강의] 리액트 입문주차</strong></p>
<ul>
<li>14 ~ 끝 </li>
<li>컴포넌트</li>
</ul>
</li>
<li><p><strong>[강의] 리액트 실무 기초</strong></p>
<ul>
<li>1주차 완강</li>
</ul>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-알고리즘-문제-풀기">▣ <strong>알고리즘 문제 풀기</strong></h2>
<ul>
<li><p>오늘 과제로 주어진 문제는 배열 메서드로 풀었지만, 이차 배열 만드는 방법 정리해 봄.</p>
</li>
<li><p><strong>이차 배열 만들기</strong></p>
<ul>
<li><p><strong>new Array( ) + for loop 사용하기</strong></p>
<pre><code class="language-jsx">  let arr = new Array(5)
  console.log(arr) // (5) [empty × 5] 

  for(let i = 0; i &lt; arr.length; i++){
      arr[i] = new Array(2);
  }

  console.log(arr)

  // (5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
  // 0: (2) [empty × 2]
  // 1: (2) [empty × 2]
  // 2: (2) [empty × 2]
  // 3: (2) [empty × 2]
  // 4: (2) [empty × 2]
</code></pre>
</li>
<li><p><strong>생성 함수 만들기</strong></p>
<pre><code class="language-jsx">  function create2DArray(rows, columns){
      let arr = new Array(rows);
      for (let i = 0; i &lt; rows; i++){
          arr[i] = new Array(columns)
      }
      return arr;
  }

  create2DArray(5, 2)

  // (5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
  // 0: (2) [empty × 2]
  // 1: (2) [empty × 2]
  // 2: (2) [empty × 2]
  // 3: (2) [empty × 2]
  // 4: (2) [empty × 2]</code></pre>
</li>
<li><p><strong>Array 객체에 배열 생성함수 추가</strong> - innerArray를 생성, 초기값 지정 가능</p>
<pre><code class="language-jsx">  Array.matrix = function(m, n, initial) {
      let a, i, j, mat = [];
      for (i = 0; i &lt; m; i += 1) {
          a = [];
          for(j = 0; j &lt; n; j += 1){
              a[j] = initial;
          }
          mat[i] = a;
      }
      return mat;
  };

  let arr = Array.matrix(5, 2, 0)

  arr

  // (5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
  // 0: (2) [0, 0]
  // 1: (2) [0, 0]
  // 2: (2) [0, 0]
  // 3: (2) [0, 0]
  // 4: (2) [0, 0]</code></pre>
</li>
<li><p><strong>ES6 최신 문법</strong></p>
<pre><code class="language-jsx">  **const arr1 = Array.from(Array(5), () =&gt; new Array(2))**

  arr1

  // (5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
  // 0: (2) [empty × 2]
  // 1: (2) [empty × 2]
  // 2: (2) [empty × 2]
  // 3: (2) [empty × 2]
  // 4: (2) [empty × 2]

  **const arr2 = Array.from(Array(5), () =&gt; Array(2).fill(0))**

  arr2

  // (5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
  // 0: (2) [0, 0]
  // 1: (2) [0, 0]
  // 2: (2) [0, 0]
  // 3: (2) [0, 0]
  // 4: (2) [0, 0]</code></pre>
</li>
</ul>
</li>
</ul>
<br>

<h2 id="▣-리액트-기초">▣ 리액트 기초</h2>
<br>

<ul>
<li><p>리액트에서는 JSX 문법을 사용해서 ‘리액트요소’를 만들고 요소를 DOM에 렌더링 시켜준다.</p>
<ul>
<li>리액트에서는 HTML파일이 딱 1개이다. 그래서 뷰를 그리는 내용이 JSX문법에 의해 자바스크립트에 들어간다.</li>
</ul>
</li>
<li><p><strong>JSX란?</strong> 간단히 말해 HTML을 품은 자바스크립트다.</p>
<br>
</li>
<li><p><strong>JSX 규칙</strong></p>
<ol>
<li><p>태그는 꼭 닫아주기</p>
<p>예) </p>
<ul>
<li>input 태그를 닫지 않고 넣을 경우 &gt; Unterminated JSX contents 에러 발생</li>
</ul>
<pre><code class="language-jsx">function App() {
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;input type=&#39;text&#39;&gt;
    &lt;/div&gt;
  );
}</code></pre>
<p><img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/74abe6a2-a720-4eb4-b8cc-4c3e4ba43ba7/_2020-10-04__10.52.29.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/74abe6a2-a720-4eb4-b8cc-4c3e4ba43ba7/_2020-10-04__10.52.29.png"></p>
<ul>
<li>수정 - 아래와 같이 잘 닫아주기</li>
</ul>
<pre><code class="language-jsx">&lt;input type=&#39;text&#39;/&gt;</code></pre>
</li>
<li><p>무조건 1개의 엘리먼트를 반환하기 (return)</p>
<ul>
<li><p>하나보다 많아도 적거나 없어도 안되며, 없을 경우 null이라도 넣어줘야 된다.</p>
<pre><code class="language-jsx">  function App() {
    return null;
  }</code></pre>
</li>
</ul>
</li>
</ol>
</li>
</ul>
<pre><code>    예) 

    - return 아래에 p태그를 하나 추가 &gt; Parsing error 에러 발생

        ```jsx
        return (
            &lt;p&gt;안녕하세요! 리액트 반입니다 :)&lt;/p&gt;

            &lt;div className=&quot;App&quot;&gt;
              &lt;input type=&#39;text&#39;/&gt;
            &lt;/div&gt;
          );
        ```

        ![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/04414c10-53cc-456f-8b3c-0812b7adf7b0/_2020-10-04__10.59.09.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/04414c10-53cc-456f-8b3c-0812b7adf7b0/_2020-10-04__10.59.09.png)


    - 수정 - 하나의 div 태그로 감싸주기

        ```jsx
        return (
            &lt;div className=&quot;App&quot;&gt;
              &lt;p&gt;안녕하세요! 리액트 반입니다 :)&lt;/p&gt;
              &lt;input type=&#39;text&#39;/&gt;
            &lt;/div&gt;
          );
        ```


 3. JSX에서 javascript 값을 가져오려면?
    - { } 중괄호를 쓴다!

    ```jsx
        const cat_name = &#39;perl&#39;;
    // return 부분만 복사해서 붙여넣고 크롬 브라우저로 돌아가 새로고침 해봅시다.
        return (
          &lt;div&gt;
            hello {cat_name}!
          &lt;/div&gt;
        );
    ```


    👉 값을 가져올 때 뿐만 아니라, map, 삼항연산자 등 자바스크립트 문법을 JSX 안에 쓸 때도 {}를 이용할 수 있다.



    ```jsx
    import React from &#39;react&#39;;
    import logo from &#39;./logo.svg&#39;;
    import &#39;./App.css&#39;;

    function App() {
      const number = 1;

      return (
        &lt;div className=&quot;App&quot;&gt;
          &lt;p&gt;안녕하세요! 리액트 반입니다 :)&lt;/p&gt;
          {/* JSX 내에서 코드 주석은 이렇게 씁니다 :) */}
          {/* 삼항 연산자를 사용했어요 */}
          &lt;p&gt;{number &gt; 10 ? number+&#39;은 10보다 크다&#39;: number+&#39;은 10보다 작다&#39;}&lt;/p&gt;
        &lt;/div&gt;
      );
    }

    export default App;
    ```

    - 리턴 안에서는 if문을 사용하지 못한다. 대신 삼항 연산자를 사용해야된다.

        ```jsx
        function App() {
          let name = &#39;hoesu&#39;;

          return (
            &lt;div className=&#39;App&#39;&gt;
              {name !== &#39;1&#39; ? name : 1}
            &lt;/div&gt;
          );
        }
        ```

 4. class 대신 className!
    - JSX로 작성하는 태그 내에서 클래스 명을 정해줄 땐 속성 값을 class대신 className으로 사용. 
     id는 그냥 id로 사용.

    ```jsx
    &lt;div className=&quot;App&quot; id=&quot;header-box&quot;&gt;
    ```

 5. 인라인으로 style 주기


    👉 html 태그에 인라인으로 style 넣던 방식에서 조금 다르다.
    css 문법 대신 json 형식으로 넣어주면 끝!



    - HTML

    ```html
    &lt;p style=&quot;color: orange; font-size: 20px;&quot;&gt;orange&lt;/p&gt;
    ```

    - JSX
        - 리액트에서 자바스크립트를 넣고 싶을 경우 기본적으로 { } 중괄호를 사용하고, string이 아닌 객체로 넘겨줘야된다.
        - 그렇기 때문에 {{ }} 중괄호가 중첩된 형태

    ```jsx
    // 중괄호를 두 번 쓰는 이유? 딕셔너리도 자바스크립트기 때문.
    // 스타일 사용법 1 
    &lt;p style={{color: &#39;orange&#39;, fontSize: &#39;20px&#39;}}&gt;orange&lt;/p&gt;

    // 스타일 사용법 2 : 스타일 딕셔너리를 변수로 만들고 사용!
    function App() {
      const styles = {
        color: &#39;orange&#39;,
        fontSize: &#39;20px&#39;
      };

      return (
        &lt;div className=&quot;App&quot;&gt;
          &lt;p style={styles}&gt;orange&lt;/p&gt;
        &lt;/div&gt;
      );
    }
    ```</code></pre><hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>리액트 - 오늘 리액트 입문 강의를 다 듣고, 같은 강의를 한번 더 복습하려다 이전에 지급된 리액트 실무 기초 강의를 들었다.  아직 어렵긴 하지만, 상호보완적인 설명들과 예제들을 연습하면서 좀더 이해가 된 듯하다.</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>component</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>component 구조 그리기</li>
<li>상위 component와 하위 component 관계</li>
<li>리렌더링 조건</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 자바스크립트 심화 강의</li>
<li>스파르타 코딩클럽 - 리액트 입문주차 강의</li>
<li>스파르타 코딩클럽 - 리액트 리액트 실무 기초 강의</li>
<li><a href="https://gent.tistory.com/296">[JavaScript] 자바스크립트 2차원 배열 선언 및 사용법</a></li>
<li><a href="https://www.daleseo.com/react-hooks-use-state/">React Hooks: useState 사용법</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 26일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-26%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-26%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 05 Dec 2022 13:23:14 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-05">📅 학습 일자 : 22. 12. 05</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><p><strong>[과제] 알고리즘 문제 풀기</strong></p>
<ul>
<li>오늘부터 과제로 1일 1문제씩 주어진다. 권장 문제 풀고 추가로 더 풀기.</li>
</ul>
</li>
<li><p><strong>[특강] JS 자주 사용 되는 ES6 문법 살펴보기</strong></p>
</li>
<li><p><strong>[강의] 자바스크립트 심화</strong></p>
<ul>
<li><p>Chap-04. callback</p>
<p>🚩 <strong>학습 목표</strong></p>
</li>
<li><p>Chap-04. 개념 이론에 익숙해지기</p>
</li>
</ul>
</li>
<li><p><strong>[강의] 리액트 입문주차</strong></p>
<ul>
<li>1 ~ 13까지 수강<ul>
<li>내용 : 시작하기 ~ component, JSX 문법, props, state</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-알고리즘-문제-풀기">▣ <strong>알고리즘 문제 풀기</strong></h2>
<ul>
<li>문제를 풀다가 구조분해할당 복습이 필요했는데, 마침 오늘 진행될 JS 문법 특강시 내용이 포함되어있다.</li>
<li>듣고 정리하기.</li>
</ul>
<h2 id="▣-자바스크립트-심화">▣ <strong>자바스크립트 심화</strong></h2>
<ul>
<li>실행 컨텍스트</li>
</ul>
<h2 id="▣-js---유용한-es6-문법">▣ JS - <strong>유용한 ES6 문법</strong></h2>
<ul>
<li><p><strong>객체</strong></p>
<ul>
<li><p>변수에 할당한 값을 오브젝트의 key값으로 설정하는 법</p>
</li>
<li><p><strong>변수명을 오브젝트에서 [ ] 로 감싸면, 변수명에 할당된 변수가 key값이 된다.</strong></p>
<p>```jsx</p>
</li>
<li><p><em>const a = &#39;age&#39;;*</em></p>
<p>const obj1 = {
 id : 1,
 name : &#39;momo&#39;,
 &#39;my name&#39; : &#39;모모미&#39;,
 <strong>[a] : 3, 
   // a가 key값이 되는게 아니라, 변수 a에 할당된 &#39;age&#39; 가 key값이 된다.</strong> 
}</p>
<p>console.log(obj1)
// {id: 1, name: &#39;momo&#39;, my name: &#39;모모미&#39;, <strong>age: 3</strong>}</p>
<pre><code>
</code></pre></li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>배열의 구조분해 할당</strong></p>
<pre><code class="language-jsx">  const arr1 = [1, &#39;모모&#39;, 3];

  &gt; 변수에 하나씩 할당
  const myId = arr1[0];
  const myName = arr1[1];
  const myAge = arr1[2];

  console.log(myId)
  console.log(myName)
  console.log(myAge)

  &gt; 구조분해할당으로 간견할게 할당
  const [myId, myName, myAge] = arr1

  console.log(myId
  console.log(myName)
  console.log(myAge)

  ** 필요한 부분만 꺼내오는 것도 가능하다. 
  (기본적으로 필요하지 않아도 기재를 해주되, 정말 필요없을 경우
  없다는 의미로 **&#39;_&#39; 언더바 기호를 사용해서 표기**한다. )

  const [myId, _, myAge] = arr1</code></pre>
</li>
</ul>
<ul>
<li><p><strong>객체의 구조분해 할당</strong></p>
<pre><code class="language-jsx">  const obj = {
  id: 1,
  name: &#39;모모&#39;,
  age: 25,
  habit: &#39;coding&#39;,
  };

  &gt; 변수에 하나씩 할당
  const name = [obj.name](http://obj.name/);
  const id = [obj.id](http://obj.id/);
  const age = obj.age;
  const habit = obj.habit;

  &gt; 구조분해할당으로 간견할게 할당
  const { name, id, age, habit } = obj;

  console.log(name)
  console.log(id)

  ** 필요한 부분만 꺼내오는 것도 가능하다. 
  const { id, habit } = obj;</code></pre>
</li>
</ul>
<h2 id="▣-리액트-입문-강의">▣ 리액트 입문 강의</h2>
<ul>
<li><strong>리액트 시작하기</strong>
<a href="https://velog.io/@newas_born/%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0">프로젝트 세팅</a></li>
</ul>
<h3 id="07-props-part1">07. Props Part1</h3>
<ul>
<li><p><strong>props란 ?</strong></p>
<ul>
<li><p>컴포넌트 간의 정보를 교류하기 위한 수단</p>
</li>
<li><p>자식 컴포넌트가 <strong>부모 컴포넌트로부터 받아온 데이터묶음</strong></p>
</li>
<li><p>props는 부<strong>모에서 자식 방향으로만 전달</strong>할 수 있다.</p>
<p>예제 ) props로 값 전달하기</p>
<pre><code class="language-jsx">
</code></pre>
</li>
</ul>
</li>
</ul>
<pre><code>import React from &quot;react&quot;;

function App() {
  return &lt;GrandFather /&gt;;
}

function GrandFather() {
  return &lt;Mother /&gt;;
}

function Mother() {
    const name = &#39;정숙씨&#39;;
  **return &lt;Child motherName={name} /&gt;; // Child 컴포넌트에 props로 name을 전달했다.**
}

function Child(**props**){
    console.log(props) // {motherName: &#39;정숙씨&#39;}
    return &lt;div&gt;연결 성공&lt;/div&gt;
}

export default App;

```

예제 ) props로 받은 값을 화면에 렌더링하기

```jsx
// src/App.js

import React from &#39;react&#39;;

function App() {
  return &lt;GrandFather /&gt;;
}

function GrandFather() {
  return &lt;Mother /&gt;;
}

function Mother() {
  const name = &#39;정숙씨&#39;;
  return &lt;Child motherName={name} /&gt;;
}

function Child(props) {
  // console.log(props.motherName);
  // return &lt;div&gt;연결성공&lt;/div&gt;
  **return &lt;div&gt;{props.motherName}&lt;/div&gt;;**
}

export default App;
```</code></pre><ul>
<li><p><strong>props Drilling &gt; 내용 보강하기</strong></p>
<p>  <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/70efa174-8624-4781-a82a-bf6e4f361eb0/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221205%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221205T130106Z&X-Amz-Expires=86400&X-Amz-Signature=dd04c336e8a6dd0f00c01f04155daf5dc21affaa3640167909aa71572ee1e6ed&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<ul>
<li>React에서 props로 컴포넌트간 데이터를 전달할 때 해당 데이터가 필요없는 컴포넌트에도 어쩔 수 없이 데이터가 전달해주어야 할 때가 있다. 위 그림에서 컴포넌트 A의 데이터를 컴포넌트 C로 전달하기 위해선 사이에 있는 컴포넌트 B를 거쳐야하는 것처럼 말이다. 이것이 Props Drilling(혹은 Threading)이다.</li>
</ul>
</li>
</ul>
<br>

<ul>
<li>해결방법<pre><code>  - children : layout component를 만들 때 자주 사용.</code></pre></li>
</ul>
<pre><code class="language-jsx">          import React from &#39;react&#39;;

          function User(props) {
            return &lt;div&gt;{props.children}&lt;/div&gt;;
          }

          function App() {
            return &lt;User&gt;안녕하세요&lt;/User&gt;;
          }
          export default App;</code></pre>
 <br>   



<ul>
<li><strong>PropTypes와 함께 하는 타입 검사 &gt; 내용 보강하기</strong><ul>
<li>앱의 크기가 커짐으로써 늘어나는 버그를 잡기 위해, 타입 검사 기능을 활용할 수 있다.</li>
</ul>
</li>
</ul>
<pre><code class="language-jsx">    import PropTypes from &#39;prop-types&#39;;

    class Greeting extends React.Component {
      render() {
        return (
          &lt;h1&gt;Hello, {this.props.name}&lt;/h1&gt;
        );
      }
    }

    Greeting.propTypes = {
      name: PropTypes.string
    };</code></pre>
<hr>
<h3 id="🎯-문제와-해결">🎯 문제와 해결</h3>
<ul>
<li>없음</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>state</li>
<li>prop types</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li><strong>props Drilling</strong></li>
<li><strong>PropTypes</strong></li>
<li><strong>state</strong></li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 자바스크립트 심화 강의</li>
<li>스파르타 코딩클럽 - 리액트 입문주차 강의</li>
<li><a href="https://www.youtube.com/watch?v=fKjJIzvBJcg">자바스크립트 객체 정리하기 1편 (자바스크립트 객체, 구조분해할당)</a></li>
<li><a href="https://slog.website/post/13">React에서 Prop Drilling과 해결 방법</a></li>
<li><a href="https://yceffort.kr/2020/10/react-prop-drilling-may-slow-down">Prop drilling 해결을 위해 context를 사용하기 전에 구조를 생각해보자.</a></li>
<li><a href="https://study-ihl.tistory.com/166">Props Drilling</a></li>
<li><a href="https://www.daleseo.com/react-prop-types/">PropTypes로 React 입력 타입 체크하기</a></li>
<li><a href="https://ko.reactjs.org/docs/typechecking-with-proptypes.html#gatsby-focus-wrapper">PropTypes와 함께 하는 타입 검사</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 설치 및 프로젝트 생성]]></title>
            <link>https://velog.io/@newas_born/%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@newas_born/%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 05 Dec 2022 13:19:24 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p><strong>기본 세팅</strong></p>
</li>
<li><p>크롬, VSCODE, git 설치</p>
</li>
</ul>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/ca581069-8008-478e-bb03-b6a9e77a5f28/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221205%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221205T125807Z&X-Amz-Expires=86400&X-Amz-Signature=66030c3516877581cc4be0af7b18dcabb4c8231549e5f0e84629f748a079a417&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<h3 id="--nodejs-설치--자바스크립트를-실행할-플랫폼">- <strong>node.js 설치</strong> : 자바스크립트를 실행할 플랫폼</h3>
<ul>
<li><a href="https://nodejs.org/ko/">node 홈페이지</a> - LTS로 설치 후 설치 및 버전 확인<pre><code>  - 터미널 창 명령어 실행
      - ```node -v```</code></pre></li>
</ul>
<h3 id="--패키지-매니저-설치">- <strong>패키지 매니저 설치</strong></h3>
<ul>
<li>많은 서드파티 패키지들의 집합소 , 둘 다 &quot;프론트엔드 의존성&quot;을 관리하기 위한 &quot;패키지 매니저&quot;</li>
</ul>
<pre><code>👉 두 가지 중 성능적으로 개선된 yarn 사용

- npm (Node Package Manager)
- **yarn** **설치하기**
    - 터미널 - 명령어 실행
        - 설치 : npm install -g yarn
        - 설치 확인 : yarn -v</code></pre><h3 id="--vscode-확장-프로그램">- <strong>VSCODE 확장 프로그램</strong></h3>
<ul>
<li><strong>Prettier - Code formatter</strong> 설치<pre><code>  - 설정 - JSON으로 열기 - 우측 상단 아이콘 클릭
  - &quot;editor.defaultFormatter&quot;:&quot;esbenp.prettier-vscode” 추가
  - 다시 설정창으로 이동 - 검색창 format on save 입력 - format on save 체크박스 체크
      - 파일 저장할 때마다 프리티어를 적용해준다.</code></pre></li>
</ul>
<h3 id="--프로젝트-시작하기">- <strong>프로젝트 시작하기</strong></h3>
<ul>
<li><strong>CRA로 프로젝트 생성하기</strong><pre><code>  - **CRA** (**Create React App) 란?**
      - 리액트 프로젝트를 하기 위해 필요한 여러 프로그램을 자동으로 설치해주는 도구</code></pre></li>
</ul>
<p>  **  1. 프로젝트 생성**</p>
<pre><code class="language-bash">                ls #현재 파일 위치

                cd 폴더이름 #리액트 프로젝트를 생성하고 싶은 폴더로 이동 
                                      # 폴더로 직접 들어가서 폴더 내에서 우클릭하여 터미널 열어도 됨.

                yarn create react-app 폴더명(프로젝트명) #프로젝트 생성!</code></pre>
<p>  **  2. 생성한 폴더로 이동
        -  VSCODE에서 폴더를 열어도 된다. **</p>
<pre><code class="language-bash">                cd **폴더명(프로젝트명)** # 생성한 **폴더명(프로젝트명)**</code></pre>
<p>  **  3. 프로젝트 구동 - VSCODE 터미널 창에 명령어 입력 **</p>
<pre><code class="language-bash">                yarn start # 프로젝트 구동!</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 5주차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-5%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-5%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 04 Dec 2022 12:06:31 GMT</pubDate>
            <description><![CDATA[<h2 id="--학습일자--221128--122--"><strong>- 학습일자 : 22.11.28 ~ 12.2 -</strong></h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li>팀 프로젝트 발표</li>
<li>팀 프로젝트 회고/ 마무리</li>
<li>[기타] 주특기 입문 발제</li>
<li>[기타] 새로운 팀 편성</li>
<li>[기타] 티맥스 소프트 채용 설명회</li>
<li>[강의] 자바스크립트 심화</li>
<li>[특강] DOM 기초 - 최원장 튜터님</li>
<li>[특강] CS _ OSI 7계층 - 김태선 튜터님</li>
<li>[과제] javascript 퀴즈</li>
<li>[자습] 알고리즘 문제 풀기 - 프래그래머스</li>
<li>[자습] 리액트 강의 - 유데미</li>
<li>주말 스터디 모임 - 리액트로 Todolist 만들어보기</li>
</ul>
<hr>
<h3 id="💡-배운-내용"><strong>💡</strong> 배운 내용</h3>
<ul>
<li><p>[기타] 티맥스 소프트 채용 설명회</p>
<ul>
<li><p>이번 티맥스 채용설명회에서 개발 분야라도 파트가 다양하게 나누어지고, 또 각 파트의 역할을 엿볼 수 있었다. 개발사를 고객층으로 하는 기업이기 때문에, QA 파트에서는 더욱 더 전문성 있는 인재를 원하고 있었다. ‘바닐라 아이스크림에 알러지가 있는 자동차’ 일화를 예시로 QA 파트에 적합한 인재에 대해 설명해주신 부분이 흥미로웠다. <strong>본질적인 문제파악하기를 좋아하는 것, 깊이 연구하고 책임감있게 끝까지 파고들 수 있는 사람.</strong></p>
<p>  이런 <strong>인재성</strong>에 대한 내용은 단지 QA 파트가 아닌 <strong>개발이라는 직군</strong> 자체에 해당한다는 생각이 들었다. </p>
</li>
</ul>
</li>
</ul>
<ul>
<li>[특강] DOM 기초 - 최원장 튜터님<ul>
<li>우리가 (HTML, CSS, Javascript로 브라우저에 보이도록) 하는 것이 다 DOM이었음을..<ul>
<li>이전에 DOM에 대해서 가볍게 공부를 했었는데, 이 기초 강의를 통해 다시 한 번 맥락을 짚어가며 정리할 수 있는 시간이 되었다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>[강의] 자바스크립트 심화</p>
<ul>
<li><ol>
<li><p>데이터 타입, 2. 실행 컨텍스트, 3. this</p>
<ul>
<li>주특기 리액트 과정을 들어가기 앞서, 자바스크립트 심화 강의는 반드시 들어야 된다고 안내되었었다.</li>
<li>강의 챕터 5개 영역 중 1. 데이터 타입, 2. 실행 컨텍스트, 3. this 까지 듣고 유데미의 리액트 강의를 들었는데, 모든 챕터를 다 듣고 리액트를 들은 것이 아님에도 확실히 많은 도움이 되었다.</li>
</ul>
<p>※ 이번 주 진행되기로 했던 리액트 강의는 전체 학생의 자바스크립트 소화 정도에 의해 다음 주로 연기되었다. </p>
</li>
</ol>
</li>
</ul>
</li>
<li><p>[자습] 리액트 강의 - 유데미</p>
<ul>
<li>리액트 시작하기<ul>
<li>리액트는 컴포넌트가 전부이다.</li>
<li>리액트는 간단하게 사용자 인터페이스를 구축하는 자바스크립트 라이브러리다.</li>
<li>자바스크립트 라이브러리 중 리액트는 비교적 가벼운 작업에, 앵귤러는 내장기능이 많아 큰 작업에 유용하며, 뷰는 리액트 + 앵귤러라고 생각하면 된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="✅-이번-주-학습-목표-점검">✅ 이번 주 학습 목표 점검</h3>
<ul>
<li><strong>잘한 것은?</strong><ul>
<li>강의를 수강하는데 진도가 더디게 나가고 있지만, 특강과 채용설명회를 빠지지 않고 들은 것.<ul>
<li>녹화본이 올라온다고 나중에 들을 것으로 미루다가 아예 들을 수 없을 정도로 연기되고 있는 특강들이 있다.</li>
</ul>
</li>
<li>자바스크립트 심화 강의 잘 소화 시키기<ul>
<li>한 챕터씩 한 번 듣고 나서, 다시 들으며 범위를 작게 잡아 정리해나가는 중이다.</li>
</ul>
</li>
</ul>
</li>
<li><strong>잘못한 것은?</strong><ul>
<li>기록을 효율적이게 하지 못해서, 일정에 차질이 생긴 것.<ul>
<li>중점적인 내용만 정리하자니, 복습할 때 정리본을 보더라도 큰 도움이 되지 않는 것 같아 내용 정리하는데 너무 힘을 쏟을 때가 많았다.</li>
</ul>
</li>
<li>자습 시간에 보충 해야될 부분 마치기<ul>
<li>내배캠 주요 일정과 더불어, 필요한 공부가 추가되다보니 내배캠 알고리즘 강의와 GIT 강의 그리고 CS 특강에 대한 수강을 하나도 진행하지 못했다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="🗓️-다음-주-학습-계획">🗓️ 다음 주 학습 계획</h3>
<ul>
<li><p>[내배캠] 주요 일정</p>
<ul>
<li>[원격] 리액트 입문</li>
<li>[과제] 리액트 입문 개인과제</li>
<li>[원격] 리액트 숙련</li>
<li>알고리즘 문제풀기 - 프로그래머스 단계별 풀어보기</li>
<li>[특강] CS 기초 - 정영훈 튜터님</li>
<li>[특강] 리액트 입문_과제리뷰</li>
<li>[특강] 리액트 숙련_redux</li>
</ul>
</li>
<li><p>[셀프] 추가 학습</p>
<ul>
<li><p>[실시간] 자바스크립트 심화 복습</p>
</li>
<li><p>[자습] 리액트 강의 - 유데미</p>
</li>
<li><p>이월 미진행 항목</p>
<ul>
<li>[특강] CS 기초 : HTTP - 박민수 튜터님</li>
<li>[강의] Git</li>
<li>보충 학습 + TIL 보충하기<ul>
<li>알고리즘 - 정렬</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="🎯-다음-주-학습-목표">🎯 다음 주 학습 목표</h3>
<ul>
<li>리액트 시작하는 단계 - 세팅 정리</li>
<li>리액트 - 문법, 컴포넌트 구성과 흐름 파악하기</li>
</ul>
<hr>
<h3 id="🗨️-생각-정리">🗨️ 생각 정리</h3>
<ul>
<li><p><strong>해결해야할 문제/남아있는 의문</strong></p>
<ul>
<li>효율적이게 기록을 정리하는 방식</li>
</ul>
</li>
<li><p><strong>어떻게 개선할까?</strong></p>
<ul>
<li><p>초반부에 TIL 정리하던 것처럼, 당일에 배운 모든 것을 정리하려고 하지말아야 한다.</p>
<p>  이번 자바스크립트 심화 강의를 들으며 정리한 것처럼 당일 진행한 일정은 모두 기록하되, 범위를 적게 설정하여 정리할 것. </p>
</li>
<li><p>틈틈이 다른 블로그 등 잘 정리된 표본을 찾아서 적용해보기.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 25일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-25%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-25%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 02 Dec 2022 13:46:04 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-02">📅 학습 일자 : 22. 12. 02</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[자습] 알고리즘 문제 풀기</strong><ul>
<li>최대공약수와 최소공배수 다시 풀기</li>
</ul>
</li>
<li><strong>[과제] javascript 퀴즈</strong></li>
<li>**[특강] CS _ OSI 7계층 **</li>
</ul>
<p> 🚩 <strong>학습 목표</strong></p>
<pre><code>- 내가 했던 것들이 DOM이었음을 깨닫기.</code></pre><ul>
<li><p><strong>[강의] 자바스크립트 심화</strong></p>
<ul>
<li>Chap-03. this</li>
</ul>
<p>🚩 <strong>학습 목표</strong></p>
<ul>
<li>개념 이론에 익숙해지기</li>
</ul>
<p>✅ <strong>체크 리스트</strong></p>
<ul>
<li><input checked="" disabled="" type="checkbox"> Chap-01-6,7 정리</li>
</ul>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-알고리즘-문제-풀기">▣ <strong>알고리즘 문제 풀기</strong></h2>
<ul>
<li>오늘부터 팀원분들하고 오전 9 ~ 11시까지는 알고리즘 문제 푸는 시간으로 정했다.</li>
<li>확실히 혼자서 일정을 짜고 진행하는 것보다는, 같은 시간에 (같은 문제는 아니더라도) 같은 과제를 한다는 게 꽤나 의지되는 느낌이었다.</li>
<li>우리 팀에는 실력자 분이 계셔서, 문제 푸는 모습도 화면 공유로 엿볼 수 있었는데 상당한 도움이 되었다.</li>
</ul>
<h2 id="▣-javascript-퀴즈">▣ <strong>javascript 퀴즈</strong></h2>
<ul>
<li><p>얼마 전 수업 진행 방식에 대해 개선될 수 있도록 학생측에서 운영진 측으로 건의된 내용이 취합되었고,</p>
<p>  그동안 습득한 내용을 체크할 수 있는 장치 단계가 추가 되었다. </p>
<p>  처음이라 그런지 아직은 퀴즈 수준이 평이했다. </p>
</li>
</ul>
<h2 id="▣-자바스크립트-심화">▣ 자바스크립트 심화</h2>
<h3 id="1-6-불변-객체">1-6. 불변 객체</h3>
<p>◼️ <strong>불변 객체로 만들기</strong></p>
<ul>
<li><strong>불변 객체</strong> : 가변일 수 밖에 없는 참조형 데이터 타입들을 변하지 않는 객체로 만든 것</li>
</ul>
<pre><code class="language-jsx">    const obj = { vaule: 1 }
    const newObj = obj;

    newObj.vaule = 2;

    console.log(obj.vaule); // 2
    console.log(obj === newObj); // true</code></pre>
<ul>
<li>객체는 원본 객체 프로퍼티와 사본 객체  프로퍼티가 모두 동일한 참조형 데이터의 주소를 가리키고 있다.<br>  그렇기 때문에, 단순하게 할당하는 방식으로 복사를 하면, 사본 객체의 프로퍼티를 변경하면 원본 객체 프로퍼티까지 같이 변경되는 문제가 있다. </li>
</ul>
<h3 id="참조형-데이터가-저장된-프로퍼티를-복사할-대-그-주솟값만-복사하는-방법">참조형 데이터가 저장된 프로퍼티를 복사할 대 그 주솟값만 복사하는 방법</h3>
<p><strong>1. 얕은 복사</strong> (<strong>shallow copy)</strong></p>
<ol>
<li>for in 문 - 재귀적 수행</li>
<li>... spread 연산자 - 전개 복사</li>
</ol>
<p><strong>2. 깊은 복사 (deep copy)</strong>
    - 객체 내부의 모든 값들을 전부 복사하는 방법</p>
<ol>
<li><p><strong>JSON 객체 메서드</strong></p>
<ul>
<li><p>JSON 객체의 stringify( ), parse( ) 활용 : 이 방법은 다른 방법들에 비해 성능이 좋지 않고, JSON.stringify( ) 메서드는 함수를 만났을 때 undefined로 처리된다는 문제점이 있다.</p>
</li>
<li><p>JSON.stringify( ) : 객체를 JSON 문자열로 변환 (기본 데이터타입의 문자열 아님. { } 까지도 다 문자열로 변환된다. )</p>
</li>
<li><p>JSON.parse( ) : JSON 문자열 JavaScript 값이나 객체로 생성</p>
</li>
</ul>
</li>
</ol>
<pre><code>    ```jsx
    console.log(JSON.stringify({ x: 5, y: 6 })); //  &#39;{&quot;x&quot;:5,&quot;y&quot;:6}’

    const json = &#39;{&quot;result&quot;:true, &quot;count&quot;:42}&#39;;
      const obj = JSON.parse(json);

      console.log(obj.count); // 42
      console.log(obj.result); // true
      console.log(obj); // { result: true, count: 42 }
    ```


![Untitled](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/bd9dda6a-7826-426a-803b-90a72bdd461e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230115%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20230115T070232Z&amp;X-Amz-Expires=86400&amp;X-Amz-Signature=da60690914141f5c01c8c8a0ad2cdb7b4ec9fb57a9fc55ba5a78a402050b45ae&amp;X-Amz-SignedHeaders=host&amp;response-content-disposition=filename%3D%22Untitled.png%22&amp;x-id=GetObject)</code></pre><ol start="2">
<li><strong>재귀적 수행</strong> <ul>
<li>객체의 프로퍼티 중 <strong>기본형 데이터는 그대로 복사</strong> + <strong>참조형 데이터는 다시 그 내부의 프로퍼티를 복사</strong></li>
</ul>
</li>
</ol>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/a324f9ac-b10f-45a4-a313-ebf870ab70c9/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230115%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230115T070250Z&X-Amz-Expires=86400&X-Amz-Signature=0ca5df3a6e730a5d53d0601b1ecd56b3c4962f8bf51f929cb0fdac7b931b84db&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<h3 id="1-7-null과-undefined">1-7. null과 undefined</h3>
<ul>
<li><p>둘 다 없음을 의미한다.</p>
</li>
<li><p><strong>undefined</strong></p>
<ul>
<li><p>사용자가 지정할 수도 있으나, <strong>자바스크립트 엔진에서 자동으로 부여하는 경우가 많다.</strong></p>
<ul>
<li>변수에 값이 지정되지 않은 경우, 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때.</li>
<li>변수나 객체 등에 . 이나 [ ] 로 접근하려 할 때, 해당 데이터가 존재하지 않는 경우</li>
<li>함수에 return문이 없거나, 호출되지 않는 함수의 실행 결과.</li>
</ul>
<p>👉 사용자가 할당한 것인지, 자바스크립트 엔진이 반환한 것인지 구분할 수 없다. </p>
</li>
</ul>
</li>
<li><p><strong>null</strong></p>
<ul>
<li><p>값이 없다는 것을 ‘명시적’으로 표현할 때 사용한다.</p>
<p>👉 <strong>값이 없음을 명시적으로 표현할 땐</strong> <strong>undefined가 아닌 null 로 사용할 것!!</strong></p>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>문제 없었음</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>OSI</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>OSI</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - 자바스크립트 심화 강의</li>
<li><a href="http://www.tcpschool.com/json/json_datatype_string">JSON  기본 - 문자열</a></li>
<li><a href="https://overcome-the-limits.tistory.com/271">[자바스크립트] 불변 객체 (feat 코어 자바스크립트)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 24일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-24%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-24%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 01 Dec 2022 11:57:17 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-12-01">📅 학습 일자 : 22. 12. 01</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><strong>[특강] DOM 기초 - 최원장 튜터님</strong></li>
</ul>
<pre><code>🚩 **학습 목표**

- 내가 했던 것들이 DOM이었음을 깨닫기.</code></pre><ul>
<li><p><strong>[강의] 자바스크립트 심화</strong></p>
<ul>
<li>Chap-01. 데이터 타입</li>
<li>Chap-02. 실행 컨텍스트</li>
<li>Chap-03. this</li>
</ul>
<p>🚩 <strong>학습 목표</strong></p>
<ul>
<li>개념 이론에 익숙해지기</li>
</ul>
<p>✅ <strong>체크 리스트</strong></p>
<ul>
<li><input checked="" disabled="" type="checkbox"> chapter 1~2  복습</li>
</ul>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-dom-기초">▣ DOM 기초</h2>
<ul>
<li><p><strong>DOM(Document Object Model)</strong></p>
<ul>
<li>DOM은 브라우저에만 내장된 API</li>
</ul>
</li>
<li><p>DOM을 알기 위해, 웹페이지가 브라우저에 보이는 과정을 살펴보면서 시작해보자.</p>
<ol>
<li><p>브라우저(클라이언트)에서 서버에 HTML을 요청 ( URL 주소를 입력하거나, 웹 페이지의 버튼 등을 누르는 등) </p>
</li>
<li><p>브라우저의 렌더링 엔진이 받아온 HTML을 파싱(parsing: 구문 분석)하여 DOM을 생성한다. </p>
<ul>
<li><p>DOM이 담당하는 두 가지 기능</p>
<ol>
<li><p><strong>HTML 문서에 대한 모델 구성</strong></p>
<ul>
<li>HTML을 한 줄씩 읽으면서 문서의 <strong>모든 것을 (심지어 그것이 주석이더라도)</strong> 자바스크립트가 HTML에 접근할 수 있는 노드(오브젝트)로 만든다.</li>
<li>이때 모델은 객체의 트리로 구성되는데 이것을 <strong>DOM tree</strong> 라 한다.<ul>
<li>태그 → 노드 → 트리 구조 형성</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>HTML 문서 내의 각 요소에 접근 / 수정</strong></p>
<ul>
<li><strong>DOM의 모든 노드</strong>는 노드 간 이동, 수정 등을 가능하게 해주는 <strong>메서드와 속성(property)을 가지고 있다.</strong></li>
</ul>
<p>※ HTML 태그의 속성은 attribute라고 함.</p>
<p>※ method는 호출의 주체가 있다. 예) <strong>person</strong>.getAge( )
함수는 혼자서 실행된다. 예) getAge( )</p>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
<pre><code>        ![Untitled](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/f3c3dc64-c587-4d18-be98-1499123c873a/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221201%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20221201T115406Z&amp;X-Amz-Expires=86400&amp;X-Amz-Signature=9556b073da60c7f9ec3389a86269fe76011aae98c34795a3c85dccdc1ae2f92a&amp;X-Amz-SignedHeaders=host&amp;response-content-disposition=filename%3D%22Untitled.png%22&amp;x-id=GetObject)

    - **DOM 탐색과 접근**

        ![Untitled](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/59896bc1-5e0d-480f-9399-31e371636b05/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221201%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20221201T115425Z&amp;X-Amz-Expires=86400&amp;X-Amz-Signature=25b20e7149baadd5746a6fa54000f6cb7060965d6c89b9c8705f603b26bae231&amp;X-Amz-SignedHeaders=host&amp;response-content-disposition=filename%3D%22Untitled.png%22&amp;x-id=GetObject)

        - **노드 트리의 가장 상위에는 단 하나의 root node를 가진다.**

        ![Untitled](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/9bf10884-420b-43a0-9c9f-27cd101c7b21/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221201%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20221201T115448Z&amp;X-Amz-Expires=86400&amp;X-Amz-Signature=bb8bb4b6166841a1c180394508d05b2e26ded0af3af8cc25c0320cd18e3a8fb7&amp;X-Amz-SignedHeaders=host&amp;response-content-disposition=filename%3D%22Untitled.png%22&amp;x-id=GetObject)

        - **루트 노드를 제외한 모든 노드는 단 하나의 parent node를 가진다**.

        ![Untitled](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/d7012460-f608-4c3a-9d07-9f9a881caafb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221201%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20221201T115506Z&amp;X-Amz-Expires=86400&amp;X-Amz-Signature=f333ee1b2271172333c970138d5eff6322c151431f507b7a3669d62db631e105&amp;X-Amz-SignedHeaders=host&amp;response-content-disposition=filename%3D%22Untitled.png%22&amp;x-id=GetObject)

        - 부모 노드(parent node) 하위에는 **자식 노드(childe node)**가 위치하며, 자식 노드는 여러 개가 될 수 있기 때문에 접근하기 위해서는 **인덱스 번호**를 붙여준다.</code></pre><blockquote>
<p>🔎 <strong>node</strong> vs <strong>element</strong></p>
</blockquote>
<ul>
<li>자바스크립트의 DOM을 다루다보면 자주 접할 수 있는 node와 element의 차이점은 ? 
DOM 문서는 node의 계층적인 구조로 이루어진다. 이 때 node는 요소(element), 텍스트, 주석 등등을 다 포함하고 있으며 element는 node의 유형 중 하나인 것이다. 
주로, &lt; p &gt;, &lt; div &gt; 같은 태그를 사용해서 작성된 노드를 말한다.<br> 
우리가 자바스크립트에서 DOM을 탐색하고 조작할 때는, node의 다른 형태인 주석이나 텍스트보다 주로 element를 조작하는 경우가 많다.<br> 
DOM을 조작하는 방법에는 node를 탐색하는 방법과 element를 탐색하는 방법이 있는데
element를 탐색하는 방법을 사용하면 주석이나 텍스트 등을 제외한 element만을 탐색할 수 있기 때문에 DOM을 조작할 때는 주로 element를 탐색하는 방법을 많이 사용한다. <br> </li>
<li><em>- node를 탐색하는 방법*</em> : <code>parentNode</code> , <code>nextSibling</code>, <code>childNodes</code> …</li>
<li><em>- element를 탐색하는 방법*</em> : <code>getElementsByTagName</code>, <code>getElementsByClassName</code>, <code>getElementById</code> , <code>querySelector</code> …</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>없음</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>어렵다기보다 관련된 질문들이 생겨서, 자료들 더 찾아봤다.</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>DOM , CSSOM, Render tree</li>
<li>얕은 복사 깊은 복사</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li>스파르타 코딩클럽 - DOM 기초 특강</li>
<li><a href="https://hianna.tistory.com/711">[Javascript] node와 element의 차이</a></li>
<li><a href="https://poiemaweb.com/js-dom">5.31 DOM 문서 객체 모델(Document Object Model)</a></li>
<li><a href="https://hyojin96.tistory.com/m/entry/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%A0%8C%EB%8D%94%EB%A7%81-%EA%B3%BC%EC%A0%95-Render-Tree%EC%99%80-DOM-Tree%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90">브라우저의 렌더링 과정 &amp; Render Tree와 DOM Tree의 차이점</a></li>
<li><a href="https://ko.javascript.info/basic-dom-node-properties">주요 노드 프로퍼티</a></li>
<li><a href="https://lifeandit.tistory.com/70">DOM Node란무엇인가 그리고 DOM Element와의 차이점은?</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 23일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-23%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-23%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 01 Dec 2022 02:59:34 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-11-30">📅 학습 일자 : 22. 11. 30</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li><p>[기타] 새로운 팀 편성</p>
<ul>
<li>팀 OT</li>
</ul>
</li>
<li><p>[강의] 자바스크립트 심화</p>
<ul>
<li><p>Chap-01. 데이터 타입</p>
</li>
<li><p>Chap-02. 실행 컨텍스트</p>
<p>🚩 <strong>학습 목표</strong></p>
</li>
<li><p>자바스크립트의 데이터 종류에 대해 이야기할 수 있고, 각각 메모리에 어떻게 저장되고 사용 되고, 수거 되는지를 이해 할 수 있다.</p>
<p>✅ <strong>체크 리스트</strong></p>
</li>
<li><p>학습 목표 달성</p>
</li>
<li><p>자바스크립트 문법 중, 주요 개념<code>(데이터의 메모리 저장 구조)</code>에 대해 다음 질문에 답할 수 있어요</p>
<ul>
<li><input checked="" disabled="" type="checkbox"> <code>var a = 3;</code> 이 메모리에 저장되는 과정을 설명</li>
<li><input checked="" disabled="" type="checkbox"> <code>a = 7;</code> 이 되었을 때, 3이 더 이상 사용되지 않을 때 무슨일이 일어나는지 설명</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<br>

<h2 id="▣-새로운-팀-편성">▣ 새로운 팀 편성</h2>
<ul>
<li><p>이번 주차는 3주 강의 수강, 1주 프로젝트 총 4주간에 걸쳐서 길게 진행이 된다.</p>
<p>  이전보다 긴 기간을 함께 할 팀이어서 편성 전까지 걱정이 많았는데, 다행히도 성실하고 긍정적인 영향력이 있는 분들을 만났다. 나도 좋은 기운을 전달할 수 있게 더 분발해서, 시너지효과가 커지도록 해보자. </p>
</li>
</ul>
<br>

<h2 id="▣-자바스크립트-심화">▣ 자바스크립트 심화</h2>
<h3 id="1-5-기본형데이터와-참조형데이터2"><strong>1-5. 기본형데이터와 참조형데이터2</strong></h3>
<ul>
<li><p><strong>변수 복사의 비교</strong></p>
<ul>
<li><p><strong>기본형 데이터</strong></p>
<pre><code class="language-jsx">  var a = 10;
  var b = a;</code></pre>
<p>  <img src="https://velog.velcdn.com/images/newas_born/post/29064387-4b8b-4f98-81fb-9f9c774d1480/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- **참조형 데이터**

    ```jsx
    var obj1 = { c: 10, d: &#39;ddd&#39; };
    var obj2 = obj1;
    ```

    ![](https://velog.velcdn.com/images/newas_born/post/86a69899-6462-4470-8125-98c6c6186338/image.png)</code></pre><blockquote>
<p> 🔎 보통 설명할 때, 기본형은 값을 복사하고, 참조형은 주솟값을 복사한다고 하나 엄밀히 따지면 자바스크립트의 모든 데이터 타입은 참조형 데이터일 수 밖에 없다.<br>        단지 기본형은 주솟값을 복사하는 과정이 한 단계, 참조형은 기본형보다 한 단계 더 거친다는 것의 차이다.</p>
</blockquote>
  <br>      

<ul>
<li><p><strong>변수 복사 후 값이 변경되는 경우 (객체의 프로퍼티가 변경되는 경우)</strong></p>
<ul>
<li><p><strong>기본형 데이터</strong></p>
<pre><code class="language-jsx">
var a = 10;
var b = a;</code></pre>
</li>
<li><p><em>b = 15;*</em></p>
<pre><code>
![](https://velog.velcdn.com/images/newas_born/post/b254a455-9e96-4a01-abac-9b74bdbebb35/image.png)


</code></pre></li>
</ul>
</li>
</ul>
<blockquote>
<p>  👉 <strong>리마인드</strong><br>    - 변수기 때문에, 변수영역의 값이 바뀌는 것. 상수면 변수 영역의 값이 바뀔 수 없다!! 상수와 변수의 구분.
    - 데이터 영역이 바뀌느냐 안바뀌느냐의 차이는 불변과 가변의 구분.</p>
</blockquote>
<ul>
<li><p><strong>참조형 데이터</strong></p>
<pre><code class="language-jsx">  var obj1 = { c: 10, d: &#39;ddd&#39; };
  var obj2 = obj1;

  **obj2.c = 20;**</code></pre>
<p>  <img src="https://velog.velcdn.com/images/newas_born/post/e8e9b472-2cd3-41f8-bfcc-7a27caee28c8/image.png" alt=""></p>
</li>
</ul>
<pre><code>👉 **복사했으면, 복사한 값은 원본에 영향이 없어야된다. 하지만..**

- a!== b ?
    - b는 다른 데이터를 바라보고 있다! 그러므로 다르다!
- obj1 !== obj2 ?
    - obj1과 obj2가 같이 가리키고 있던 obj1 위한 영역의 7103 값을 obj2 프로퍼티에 다른 값을 할당하면서 바꾸어 버렸다!

        그러므로 연결되어있던 obj1(복사 원본)까지 같아져버렸다.

    - **그렇기 때문에 참조형 데이터를 가변하다고 한다.**</code></pre><hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>기초 수준과는 달리, 심화 수준에서는 깊이 배우는 거라 좀더 관련 자료를 찾아볼 부분이 많았다. 그래서 범위를 줄여서 정리해나가고 있다.</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>기본형과 참조형 둘다 주소값을 가리키고 있는데, 이 부분이 보통 기본형은 값을 넣는다고 되어 있어 헷갈렸다. 하지만 엄밀히 따져서는 둘다 참조형 데이터라고 한다.</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>얕은 복사, 깊은 복사</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li><strong><a href="https://velog.io/@lky9303/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EA%B0%9D%EC%B2%B4%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98">자바스크립트의 객체(메모리 할당, 가비지 컬렉션)</a></strong></li>
<li><strong><a href="https://velog.io/@imjkim49/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EC%A0%95%EB%A6%AC">자바스크립트- 데이터 타입 정리</a></strong></li>
<li><a href="https://galid1.tistory.com/661">javascript - [코어자바스크립트] javascript 의 메모리와 데이터 할당 (데이터 할당의 자유와 효율성)</a></li>
<li><a href="https://poiemaweb.com/js-data-type-variable">5.6 Data type &amp; Variable 데이터 타입과 변수</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 22일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-22%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-22%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 30 Nov 2022 00:09:35 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-학습-일자--22-11-29">📅 학습 일자 : 22. 11. 29</h2>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li>[기타] 주특기 입문 발제<ul>
<li>자바스크립트 심화, 리액트 학습 안내</li>
</ul>
</li>
<li>[강의] 자바스크립트 심화<ul>
<li>Chap-01. 데이터 타입</li>
<li>Chap-02. 실행 컨텍스트</li>
</ul>
</li>
</ul>
<hr>
<p>   🚩 <strong>학습 목표</strong></p>
<ul>
<li><p>자바스크립트의 데이터 종류에 대해 이야기할 수 있고, 각각 메모리에 어떻게 저장되고 사용 되고, 수거 되는지를 이해 할 수 있다.</p>
<p>✅ <strong>체크 리스트</strong></p>
<ul>
<li>학습 목표 달성</li>
<li>자바스크립트 문법 중, 주요 개념<code>(데이터의 메모리 저장 구조)</code>에 대해 다음 질문에 답할 수 있어요<ul>
<li><input checked="" disabled="" type="checkbox"> <code>var a = 3;</code> 이 메모리에 저장되는 과정을 설명</li>
<li><input checked="" disabled="" type="checkbox"> <code>a = 7;</code> 이 되었을 때, 3이 더 이상 사용되지 않을 때 무슨일이 일어나는지 설명</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="💡-배운내용"><strong>💡</strong> 배운내용</h1>
<h2 id="▣-주특기-입문-발제">▣ 주특기 입문 발제</h2>
<ul>
<li>프로젝트시 역할 분담<ul>
<li>못하더라도, 작은 기능이라도 맡아서 할 것.
잘하는 사람만 거의 맡아서 진행하지말고, 1명이 1인분을 할 수 있도록 해야한다.</li>
</ul>
</li>
<li>자바스크립트 공부시<ul>
<li>실행 컨텍스트 - 자바스크립트 문맥, 현재 자바스크립트의 눈이 어디에 향해있는지.</li>
<li>강의 듣고, 강의자료 추가학습의 모던 자바스크립트 튜토리얼 학습하기 -&gt; 반복하기</li>
<li>이해 안가도 포기하지말고 계속 반복해서 학습할것.</li>
<li>리액트 숙련 가기전에, 리액트 입문을 배우는 거고, 리액트 입문을 배우기 위해 자바스크립트 심화를 배우는 것.</li>
</ul>
</li>
</ul>
<p><strong>🏃‍♀️ 긴 기간 몰입하기 위해서, 미래를 잘 설계하고 긍정적인 결과를 기대하자. 그래야 지치지않는다.</strong></p>
<h2 id="▣-자바스크립트-심화">▣ 자바스크립트 심화</h2>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/43ba0ed2-9872-4593-bcac-1037e7f6b761/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221130%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221130T145328Z&X-Amz-Expires=86400&X-Amz-Signature=34dcd02e7299d20dd03fd81a63c5927de5f89b86b9652079fc32302196aff218&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<h3 id="1-2-데이터-타입의-종류">1-2. 데이터 타입의 종류</h3>
<ul>
<li><p>데이터 타입 : 프로그래밍 언어에서 사용할 수 있는 데이터의 종류를 말한다.</p>
<ul>
<li>자바스크립트의 데이터 타입은 크게 기본형(premitive type)와 참조형(object/reference type)으로 나뉜다.<ul>
<li>기본형 : 숫자, 문자열, boolean, null, undefined, Symbol(ES6에서 추가)</li>
<li>참조형 : 객체 - 배열, 함수, Date, 정규표현식, Map, Set</li>
</ul>
</li>
</ul>
</li>
<li><p>기본형과 참조형의 차이점</p>
<ul>
<li><p>복제의 방식</p>
<p>  <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/aaa5a006-99e0-4718-8ebe-ffe3b4feeca7/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221130%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221130T145348Z&X-Amz-Expires=86400&X-Amz-Signature=72dadc5f7f29ef3aafa6d57e1a334944142d27fd05898ee488059e088a755508&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<p>  <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/94ebce95-25df-4127-99b6-e51387d94e8a/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221130%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221130T145429Z&X-Amz-Expires=86400&X-Amz-Signature=60623e8f314d86a7b9d71329f1df0224f54c9dbf71c5b4cc5fb695cd0ee2d41e&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
</li>
</ul>
</li>
<li><p>기본형 : 값이 담긴 주소값을 바로 복제</p>
</li>
<li><p>참조형 : 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값 복제</p>
</li>
</ul>
<br>

<p>🔎 <strong>데이터 타입 이해를 위한 배경 지식</strong></p>
<ol>
<li>메모리와 데이터 <ul>
<li>코드에서 사용되는 모든 데이터는 메모리에 저장하고 참조할 수 있어야 한다.</li>
<li>컴퓨터는 모든 데이터를 0 또는 1로 바꿔 기억하며, 하나의 메모리 조각을 비트라고 한다.</li>
<li>모든 데이터는 byte(8bit) 단위의 식별자인 메모리 주소값을 통해서 서로 구분이 된다.<ul>
<li>bit 단위로 구분이 되면 너무 비효율 적이기 때문에 새로운 단위인 byte를 사용한  것<ul>
<li>1 bit = 8 byte</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>식별자와 변수<ul>
<li>변수 : 변할 수 있는 데이터</li>
<li>식별자 : 어떤 데이터를 식별하는 데 사용하는 이름, 변수명<br>

</li>
</ul>
</li>
</ol>
<h3 id="1-3-데이터-할당">1-3. 데이터 할당</h3>
<ul>
<li>변수 선언과 할당의 구조</li>
</ul>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/f4d11bac-5e48-4b3d-a7e6-97b0db29613a/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221201%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221201T002239Z&X-Amz-Expires=86400&X-Amz-Signature=152d5e64cd3bbbb87ed8fe2504ab4958f691afd2104c11b7e83b370576a460cb&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<p>자바스크립트는 변수명이 할당된 주소에 직접 데이터를 저장하지 않는다. </p>
<ul>
<li>변수는 변수 영역에, 데이터는 데이터 영역에, 오브젝트는 오브젝트 영역에 할당이 된다고 생각하면 쉽다.</li>
</ul>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/fd2ad3fb-e8f9-4818-95fa-b077720865d6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221130%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20221130T145629Z&X-Amz-Expires=86400&X-Amz-Signature=c2ee019322408d6223a8e9e3ed58e95d6425c446c0d1434b34f95b4cb64e5304&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<ol>
<li><p><strong>변수 선언</strong> - 변수 영역에 변수명이 저장됨</p>
<p> <code>var a;</code></p>
</li>
<li><p><strong>데이터 할당</strong> - 데이터 영역에서 ‘abc’라는 값을 찾아보고 있으면 그 데이터의 주소를, 없다면 새로 할당한 데이터의 주소를 변수명의 변수에 저장한다. </p>
<pre><code class="language-jsx"> var a;
 a = &#39;abc&#39;;

 var a=&#39;abc&#39;;</code></pre>
</li>
<li><p><strong>데이터 변경</strong> - 새로 할당하는 값 ‘def’라는 값에 대해 2번 과정을 거친다. 이 때, 이전에 할당했던 값 ‘abc’는 이제 어떤 식별자와도 연결되어 있지 않기 때문에, 가비지 컬렉션이라는 자동 메모리 관리 방법에 의해 자동 해제 된다. </p>
<p> 단, 메모리에서 언제 해제될지는 예측할 수 없다. </p>
<pre><code class="language-jsx"> var a;
 a = &#39;abc&#39;;
 var a=&#39;abc&#39;;
 a = &#39;def&#39;</code></pre>
</li>
</ol>
<br>

<p>👉 <strong>변수 영역에 값을 직접 대입하지 않는 이유는?</strong></p>
<p> <strong>(= 변수영역과 데이터영역을 나누는 이유)</strong></p>
<ol>
<li><p>자유로운 데이터 변환을 위해</p>
<ul>
<li>이미 입력한 문자열이 길어진다면, 처음 차지한 데이터 영역에서 확장해야 되기 때문에, 옆에 있는 다른 데이터들까지 이동하게 해야 된다.</li>
</ul>
</li>
<li><p>메모리의 효율적인 관리를 위해</p>
<ul>
<li><p>반복되는 데이터를 여러 번 저장해야될 경우</p>
<p>  ※ 숫자형 = 8byte, 주소 공간의 크기 = 2byte</p>
<ul>
<li><p>예) ‘5’ 를 800개 저장한다면</p>
<ol>
<li><p>변수 영역에 값을 바로 할당한다고 할 때</p>
<p> 8byte * 500개 = 4000byte</p>
</li>
<li><p>데이터 영역에 값을 저장 후 해당 주소를 변수 공간에 입력할 때</p>
<p> 2byte * 500 + 8byte = 1008byte</p>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>어려워서 반복해서 강의를 듣고, 다른 자료들을 찾아봤다.</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>메모리 관점에서의 데이터 할당</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>얕은 복사, 깊은 복사 연습하기.</li>
</ul>
<hr>
<h3 id="🔗-출처-및-참고자료">🔗 출처 및 참고자료</h3>
<ul>
<li><strong><a href="https://velog.io/@lky9303/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EA%B0%9D%EC%B2%B4%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98">자바스크립트의 객체(메모리 할당, 가비지 컬렉션)</a></strong></li>
<li><strong><a href="https://velog.io/@imjkim49/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EC%A0%95%EB%A6%AC">자바스크립트- 데이터 타입 정리</a></strong></li>
<li><a href="https://galid1.tistory.com/661">javascript - [코어자바스크립트] javascript 의 메모리와 데이터 할당 (데이터 할당의 자유와 효율성)</a></li>
<li><a href="https://poiemaweb.com/js-data-type-variable">5.6 Data type &amp; Variable 데이터 타입과 변수</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 _ 리액트 과정] 21일차]]></title>
            <link>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-21%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@newas_born/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%BC%EC%A0%95-21%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 28 Nov 2022 13:11:57 GMT</pubDate>
            <description><![CDATA[<h3 id="--학습-일자--22-11-28">- 학습 일자 : 22. 11. 28</h3>
<h2 id="📜-진행-내용">📜 진행 <strong>내용</strong></h2>
<ul>
<li>팀 프로젝트 발표</li>
<li>팀 프로젝트 회고/ 마무리</li>
</ul>
<hr>
<h2 id="💡-배운내용"><strong>💡</strong> 배운내용</h2>
<h3 id="팀-프로젝트-발표">&lt; 팀 프로젝트 발표 &gt;</h3>
<ul>
<li><p><strong>전체</strong></p>
<p> (다른 팀 프로젝트 및 튜터님 피드백 중)</p>
<ul>
<li>삭제 기능을 구현할 땐, 삭제 전 경고창으로 사용자에게 삭제할지 한 번 더 확인하는 과정이 필요하다.</li>
<li>수정 기능을 구현할 땐, 기존 내용을 같이 보여주면서 수정하도록 해야한다.</li>
<li>노션으로 일정과 대시보드 활용하여 프로젝트 진행하기</li>
<li>프로젝트를 본격적으로 시작하기 전에 코드 컨벤션 규칙 정하기</li>
<li>트러블 슈팅에 대한 부분 잘 정리해둘 것!</li>
</ul>
</li>
<li><p><strong>팀</strong></p>
<ul>
<li>위 내용과 겹치는 부분이 많아서, 추후 서면 피드백으로 다시 비교해보기.</li>
</ul>
</li>
<li><p><strong>개인</strong></p>
<ul>
<li><strong>Keep</strong> : 잘하고 있는 점. 계속 했으면 좋겠다 싶은 점<ul>
<li>프로젝트 진행에서 부족한 부분 수시로 체크하기.</li>
<li>체크한 부분은 반드시 팀원과 소통 후 결정하여 작업하기.</li>
<li>코드 개선방향에 대해 항상 고민하기. (모듈화, 변수명, 불필요한 태그 줄이기 등)</li>
</ul>
</li>
<li><strong>Problem</strong> : 뭔가 문제가 있다 싶은 점. 변화가 필요한 점.<ul>
<li>깃헙 pull/push 할 경우 충돌되는 영역이 너무 많다.</li>
<li>프로젝트 진행시 기획(구현 기능 상세, 폴더 구조, 데이터 설계, 진행 일정, 코드 컨벤션), 준비, 진행 과정 정리 잘하기</li>
</ul>
</li>
<li><strong>Try</strong> : 잘하고 있는 것을 더 잘하기 위해서, 문제가 있는 점을 해결하기 위해서 시도해 볼 것들<ul>
<li>개인 프로젝트를 진행하면서 브랜치를 나눠서 연습해보기.</li>
<li>아래 항목들에 대해 나의 기준에 맞는 양식 만들어놓기<ul>
<li>구현 기능 상세, 폴더 구조, 데이터 설계, 진행 일정, 코드 컨벤션</li>
</ul>
</li>
<li>기능 구현시 작은 단위로 push할 것.</li>
<li>깃헙을 자유롭게 활용하면서, 에러가 발생해도 원인 파악할 수 있는 수준 갖추기</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="🎯-문제와-해결">🎯 <strong>문제와 해결</strong></h3>
<ul>
<li>발표 전까지, 프로젝트 CSS 스타일링을 좀더 마무리 하는 과정에서 계속 JS 구현 기능이 제대로 작동하지 않는 에러가 발생했다.<ul>
<li>시간 관계상 함수를 직접 작성한 팀원 분과 협업하여 해결하면서 진행했다.</li>
<li>추후에는 내가 참여하는 프로젝트의 함수들이 어떻게 작동하는지 면밀히 살펴봐야 한다.</li>
</ul>
</li>
<li>깃헙에 pull / push하는 과정에서 충돌하거나, 제대로 업로드가 되지 않는 경우가 많았다.<ul>
<li>이 부분은 깃헙에 대한 공부가 부족한 것이기 때문에, 이번 주에 git 강의를 통해서 다시 정리 후 연습 해야한다.</li>
</ul>
</li>
</ul>
<h3 id="️-어려웠던-내용"><strong>⁉️ 어려웠던 내용</strong></h3>
<ul>
<li>오늘의 문제 부분을 해결하는 과정</li>
</ul>
<h3 id="❎-한-번-더-공부할-내용">❎ 한 번 더 공부할 내용</h3>
<ul>
<li>깃헙</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>