<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>2_juzzang.log</title>
        <link>https://velog.io/</link>
        <description>기록!</description>
        <lastBuildDate>Sun, 10 Oct 2021 07:59:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. 2_juzzang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/2_juzzang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[항해 3주차 WIL (10.03~10.10)]]></title>
            <link>https://velog.io/@2_juzzang/%ED%95%AD%ED%95%B4-3%EC%A3%BC%EC%B0%A8-WIL-10.0310.10</link>
            <guid>https://velog.io/@2_juzzang/%ED%95%AD%ED%95%B4-3%EC%A3%BC%EC%B0%A8-WIL-10.0310.10</guid>
            <pubDate>Sun, 10 Oct 2021 07:59:40 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@2_juzzang/10.03-%EB%AC%B4%ED%95%9C-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EC%82%BC%ED%95%AD-%EC%97%B0%EC%82%B0%EC%9E%90">10.03</a></p>
<p><a href="https://velog.io/@2_juzzang/10.04-%EB%8C%93%EA%B8%80-%EA%B0%95%EC%9D%98">10.04</a></p>
<p><a href="https://velog.io/@2_juzzang/10.05-form-%ED%83%9C%EA%B7%B8">10.05</a></p>
<p><a href="https://velog.io/@2_juzzang/10.07-%EB%A6%AC%EB%8D%95%EC%8A%A4-%E3%85%A0">10.07</a></p>
<p><a href="https://velog.io/@2_juzzang/10.09-%EC%A3%BC%ED%8A%B9%EA%B8%B0-%ED%9A%8C%EA%B3%A0">10.09</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[10.09 주특기 회고~]]></title>
            <link>https://velog.io/@2_juzzang/10.09-%EC%A3%BC%ED%8A%B9%EA%B8%B0-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@2_juzzang/10.09-%EC%A3%BC%ED%8A%B9%EA%B8%B0-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 10 Oct 2021 07:48:38 GMT</pubDate>
            <description><![CDATA[<h1 id="주특기-회고">주특기 회고</h1>
<blockquote>
<p>Q1. s3 버킷에 배포한 뒤, 어떤도메인.com이 아닌 어떤도메인.com/login 등 페이지로 이동하면 왜 오류가 날까요?</p>
</blockquote>
<ol>
<li>리액트의 라우팅 방식이 전통적 링크 방식이 아니기 때문. (전통적 링크 방식의 경우 주소창에 적힌대로 html 파일을 받아 보여준다면, SPA는 하나의 html을 두고 주소창에 적힌 대로 내용을 갈아끼우는 방식)</li>
<li>s3 버킷의 정적 웹사이트 호스팅은 /login 경로에 맞는 html을 찾는 거고, 해당 html파일이 없기 때문에 404 에러가 나는 것.</li>
<li>에러 해결 방법은? s3가 어떤 상황이건 index.html을 보도록 설정해주는 것</li>
</ol>
<blockquote>
<p>Q2. 리액트에서 각 페이지 컨텐츠에 맞는 미리보기(사이트 이미지, 사이트 설명 등)를 띄워주려면 어떻게 해야할까요?</p>
</blockquote>
<ul>
<li>메타 데이터를 직접적으로 index.html에 추가하는 방법이 있지만, 이는 SPA인 리액트에서 조건에 따라 동적으로 변경하기 어려운 단점이 있다.<ul>
<li>따라서 react-helmet 라이브러리를 사용하여 조건에따라 동적으로 메타 데이터를 변경시켜 각 페이지의 컨텐츠에 맞는 미리보기를 띄워준다.</li>
</ul>
</li>
</ul>
<blockquote>
<p>Q3. 리덕스에서 미들웨어 청크의 역할은 뭘까요?</p>
</blockquote>
<ul>
<li>비동기 작업을 처리할 때 사용하는 미들웨어로 이를 사용하면 액션 객체가 아닌 함수를 디스패치 할 수 있게 된다.</li>
</ul>
<blockquote>
<p>Q4. 프로미스는 정확히 말하면 비동기가 아닙니다. 비동기와 프로미스는 각각 무엇일까요?</p>
</blockquote>
<ul>
<li><p>비동기(Asynchronous)적 처리는 작업을 요청하지만 결과는 그 자리에서 꼭 받지 않아도 되는 데이터 처리 방식이다.</p>
</li>
<li><p>Promise는 비동기적으로 실행하는 작업의 결과(성공 or 실패)를 나타내는 객체이다. 여기서 주목해야 하는 점은 객체 라는 것인데, 비동기의 결과를 객체화 시킨다는 점이 Promise의 가장 큰 장점이자 특징이 된다.</p>
<ul>
<li>Promise 성공시 then 메소드가 실패시 catch 메소드가 실행된다.  </li>
</ul>
</li>
<li><p>비동기는 데이터 처리 방식이고 promise는 비동기 작업의 단위.</p>
</li>
</ul>
<blockquote>
<p>Q5. TDZ(Temporal Dead Zone/일시적 사각지대)란?</p>
</blockquote>
<ul>
<li>우선 선언을 하면 실행 컨텍스트가 내용을 훑는데 여기서 초기화 작업이 일어난다. 초기화 작업은 메모리에 변수에 들어갈 공간을 미리 확보해 놓는 것이다. 때문에 변수가 선언되기 전에 사용한다는 것은 메모리 공간을 확보하기 전에 사용한다는 것이고 그렇기에 ReferenceError가 난다. 이렇게 변수가 선언되기 전, 호출할 수 없는 공간을 TDZ라고 부른다.</li>
</ul>
<hr>
<h2 id="동기와-비동기">동기와 비동기</h2>
<ul>
<li>동기는 요청과 결과가 동시에 일어난다.<ul>
<li>직렬 구조를 가지고 있고 요청 후 결과를 받아야만 다음 
동작이 일어난다. </li>
</ul>
</li>
<li>결과가 주어질 때까지 아무것도 못하고 대기를 해야하는 단점이 존재한다.<ul>
<li>비동기는 요청과 결과가 동시에 일어나지 않는다. 시간이 걸리더라도 그 사이에 다른 작업이 가능하여 자원을 효율적으로 쓸 수 있는 장점</li>
<li>비동기에서의 블록은 결과를 계속 기다리는 것, 논블록은 다른 작업을 하면서 기다리는 것 </li>
</ul>
</li>
</ul>
<hr>
<h3 id="리덕스를-왜-쓰는지">리덕스를 왜 쓰는지</h3>
<ul>
<li>리덕스를 왜 쓰는지에 대해 깊게 생각하지 못하다가 진성님이 해주시는 말을 듣고 다시금 왜 생각하게 되었다.<ul>
<li>부모 컴포넌트에서 자식의 자식의 ... 자식 컴포넌트에 props를 넘겨주는걸 리덕스를 사용하면 한 번에 줄 수 있다는 것 왜 이걸 잊고 있었을까 싶다~~ </li>
</ul>
</li>
</ul>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>이 코드가 어디서 오고 어디서 쓰이고 어디로 가는지에 대해 생각을 해야하는 연습을 하자. 감사합니다 승민님<del>~</del></li>
<li>혜원님의 실력이 하위권이라는 것은 부정할 수 없겠지만 실력에 굴하지 않고 다른 사람의 의견을 듣기위해 사람들 앞에서서 발표를 한다는 것에서 큰 감동을 먹었다.</li>
<li>하나의 function은 하나의 목적</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10.07 리덕스 ㅠ]]></title>
            <link>https://velog.io/@2_juzzang/10.07-%EB%A6%AC%EB%8D%95%EC%8A%A4-%E3%85%A0</link>
            <guid>https://velog.io/@2_juzzang/10.07-%EB%A6%AC%EB%8D%95%EC%8A%A4-%E3%85%A0</guid>
            <pubDate>Sun, 10 Oct 2021 07:48:06 GMT</pubDate>
            <description><![CDATA[<h1 id="redux">Redux</h1>
<p><a href="https://react.vlpt.us/redux/01-keywords.html">https://react.vlpt.us/redux/01-keywords.html</a></p>
<p>벨로퍼트 리덕스 강의 내용을 참고했다.</p>
<p>때늦은 리덕스 정리..</p>
<h2 id="action액션">Action(액션)</h2>
<p>상태에 변화가 필요하게 될 땐 액션이란 것을 발생시키며 이는 <strong>하나의 객체</strong>로 표현된다. 형식은 아래와 같다.</p>
<pre><code class="language-jsx">{
    type: &quot;RANDOM&quot;
}</code></pre>
<p>액션 객체는 type을 필수적으로 가지고있어야 하고 그 외의 값들은 개발자 마음대로 넣어줄 수 있다.</p>
<pre><code class="language-jsx">예시1)
{
  type: &quot;ADD_TODO&quot;,
  data: {
    id: 0,
    text: &quot;리덕스 배우기&quot;
  }
}
예시2)
{
  type: &quot;CHANGE_INPUT&quot;,
  text: &quot;안녕하세요&quot;
}</code></pre>
<hr>
<h2 id="action-creator-액션-생성함수">Action Creator (액션 생성함수)</h2>
<p>액션을 만드는 함수. 단순히 파라미터를 받아와서 액션 객체 형태로 만들어준다.</p>
<pre><code class="language-jsx">
export function addTodo(data) {
  return {
    type: &quot;ADD_TODO&quot;,
    data
  };
}

// 화살표 함수
export const changeInput = text =&gt; ({ 
  type: &quot;CHANGE_INPUT&quot;,
  text
});
</code></pre>
<ul>
<li>이러한 액션 생성함수를 만들어서 사용하는 이유는 나중에 컴포넌트에서 더욱 쉽게 액션을 발생시키기 위함.</li>
<li>보통 함수 앞에 export 키워드를 붙여서 다른 파일에서 불러와서 사용</li>
<li>액션 생성함수를 사용하는 것이 필수는 아니다.</li>
<li>액션을 발생 시킬 때마다 직접 액션 객체를 작성할 수도 있다.</li>
</ul>
<hr>
<h2 id="reducer-리듀서">Reducer (리듀서)</h2>
<p>리듀서는 변화를 일으키는 함수로 두가지의 파라미터를 받는다.
이전 상태값과 액션을 받아 새로운 상태를 만드는 함수를 만든다.
리듀서는 불변성을 유지해야 한다.</p>
<pre><code class="language-jsx">function reducer(state, action) {
  // 상태 업데이트 로직
  return alteredState;
}

리듀서는, 현재의 상태와, 전달 받은 액션을 참고하여 새로운 상태를 만들어서 반환한다.

만약 카운터를 위한 리듀서를 작성한다면 다음과 같이 작성할 수 있습니다.

function counter(state, action) {
  switch (action.type) {
    case &#39;INCREASE&#39;:
      return state + 1;
    case &#39;DECREASE&#39;:
      return state - 1;
    default:
      return state;
  }
}</code></pre>
<ul>
<li><p>리덕스의 리듀서에서는 기존 state를 그대로 반환하도록 작성해야합니다.</p>
</li>
<li><p>리덕스를 사용 할 때에는 여러개의 리듀서를 만들고 이를 합쳐서 루트 리듀서 (Root Reducer)를 만들 수 있습니다. (루트 리듀서 안의 작은 리듀서들은 서브 리듀서라고 부릅니다.)</p>
</li>
</ul>
<hr>
<h2 id="store-스토어">Store (스토어)</h2>
<p>리덕스에서는 한 애플리케이션당 하나의 스토어를 만들게 됩니다. 스토어 안에는, 현재의 앱 상태와, 리듀서가 들어가있고, 추가적으로 몇가지 내장 함수들이 있습니다.</p>
<hr>
<h2 id="dispatch-디스패치">dispatch (디스패치)</h2>
<p>디스패치는 스토어의 내장함수 중 하나입니다. 디스패치는 액션을 발생 시키는 것 이라고 이해하면 됩니다.</p>
<p>dispatch 라는 함수에는 액션을 파라미터로 전달합니다.. dispatch(action) 이런식으로 말이죠.</p>
<p>그렇게 호출을 하면, 스토어는 리듀서 함수를 실행시켜서 해당 액션을 처리하는 로직이 있다면 액션을 참고하여 새로운 상태를 만들어줍니다.</p>
<hr>
<h2 id="subscribe-구독">subscribe (구독)</h2>
<p>구독 또한 스토어의 내장함수 중 하나입니다. subscribe 함수는, 함수 형태의 값을 파라미터로 받아옵니다. subscribe 함수에 특정 함수를 전달해주면, 액션이 디스패치 되었을 때 마다 전달해준 함수가 호출됩니다.</p>
<p>리액트에서 리덕스를 사용하게 될 때 보통 이 함수를 직접 사용하는 일은 별로 없습니다. 그 대신에 react-redux 라는 라이브러리에서 제공하는 connect 함수 또는 useSelector Hook 을 사용하여 리덕스 스토어의 상태에 구독합니다.</p>
<h3 id="useselector">useSelector</h3>
<p>리덕스 스토어 안에 들어있는 값을 조회할 때 사용하는 Hooks 이다.
useSelector를 사용해서 리덕스 스토어의 상태를 조회할 땐 상태가 바뀌지 않았다면 리렌더링이 되지 않는다는 장점이 있다.</p>
<hr>
<h2 id="리덕스-모듈">리덕스 모듈</h2>
<p>리덕스 모듈엔</p>
<ul>
<li><p>액션 타입</p>
</li>
<li><p>액션 생성함수</p>
</li>
<li><p>리듀서
세 개가 필요하다.</p>
</li>
<li><p>Ducks 패턴을 따를 땐 액션의 이름에 접두사 넣기 &gt; 다른 모듈과 액션 이름이 중복되는 것을 방지하기 위함이다.
ㅉ</p>
<h2 id="rootreducer">Rootreducer</h2>
</li>
</ul>
<p>한 프로젝트에서 여러개의 리듀서가 있을 때는 이를 한 리듀서로 합쳐서 사용을 하는데 이를 루트 리듀서라고 부른다.
리듀서를 합칠 땐 리덕스에 내장된 combineReducers 함수를 사용한다.</p>
<hr>
<h2 id="프리젠테이션-컴포넌트">프리젠테이션 컴포넌트</h2>
<p>리덕스 스토어 없이 props로만 받아와서 사용하는 컴포넌트</p>
<h2 id="컨테이너-컴포넌트">컨테이너 컴포넌트</h2>
<p>리덕스 스토어의 상태를 조회하거나 액션을 디스패치 할 수 있는 컴포넌트</p>
<hr>
<h2 id="middleware-미들웨어">middleware (미들웨어)</h2>
<p>리덕스 미들웨어를 사용하면 액션이 디스패치 된 다음 리듀서에서 해당 액션을 받아와서 업데이트 하기 전에 추가적인 작업을 할 수 있다.</p>
<ul>
<li>특정 조건에 따라 액션이 무시되게 만들 수 있다.</li>
<li>액션을 콘솔에 출력하거나 서버쪽에 로깅을 할 수 있다.</li>
<li>액션이 디스패치 됐을 때, 이를 수정해서 리듀서에게 전달되도록 할 수 있다.</li>
<li>특정 액션이 발생했을 때, 이에 기반하여 다른 액션이 발생되도록 할 수 있다.</li>
<li>특정 액션이 발생했을 때, 특정 자바스크립트 함수를 실행시킬 수 있다.</li>
</ul>
<blockquote>
<p>리덕스에서 미들웨어를 사용하는 <strong><em>주된 사용 용도는 비동기 작업을 처리할 때이다.</em></strong>
예를 들어 백엔드 API를 연동해야 된다면 리덕스 미들웨어를 사용해서 처리하는 것이 있다.</p>
</blockquote>
<hr>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>2기 수료하신 지영멘토님께 이것 저것 여쭤봤는데 이 분도 혼자만 늦는 거 같다는 고민을 하셨던 때가 있었구나 하면서 생각이 많아졌다. 그럼에도 불구하고 해내신 걸 보면 내 입장에선 그저 빛..</li>
<li>어디에서나 기초, 기본은 중요하단 생각은 변함이 없어서 항해 커리큘럼을 따라가기가 벅차다고 느끼는 것 같다.<ul>
<li>과연 포텐셜이 터질 것인가.. 다 자기 하기나름이겠지만 </li>
</ul>
</li>
<li>팀한테 민폐가 되지 않으려면 더 노오력을 하자~</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10.05 form 태그]]></title>
            <link>https://velog.io/@2_juzzang/10.05-form-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@2_juzzang/10.05-form-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Sun, 10 Oct 2021 07:47:48 GMT</pubDate>
            <description><![CDATA[<h1 id="form-태그">form 태그</h1>
<blockquote>
<p>로그인, 회원가입, 구매, 글작성 등 서비스를 제공하는 서버에 정보를 전송할 때 사용하는 글자를 입력하는, 무언가를 선택하는 것들을 form이라고 부른다.
사용자의 입력정보를 서버로 전송할 때 사용하는 것 !</p>
</blockquote>
<h2 id="submit-버튼">Submit 버튼</h2>
<pre><code class="language-html">&lt;input type=&quot;submit&quot; /&gt;</code></pre>
<p><input type="submit" /> 이렇게 생겼다. 
form을 제출하는 버튼!</p>
<pre><code class="language-html">&lt;button type=&quot;submit&quot; /&gt;</code></pre>
<p>버튼에 submit 타입을 줘도 된다.</p>
<h2 id="action을-통해-name을-담아-보낸다">action을 통해 name을 담아 보낸다.</h2>
<pre><code class="language-html">&lt;form action=&quot;정보를 어디로 보낼 것인지 주소를 입력&quot;&gt;</code></pre>
<p><img src="https://images.velog.io/images/2_juzzang/post/40d70238-6ed9-4e9d-932e-f8092d83e81b/form%ED%83%9C%EA%B7%B8.PNG" alt=""></p>
<p>name이라는 속성을 통해 아이디는 &quot;id&quot;, 비밀번호는 &quot;pwd&quot;, 주소는 &quot;address&quot;란 이름에 담아 전송한다.</p>
<h2 id="method">method</h2>
<pre><code class="language-html">&lt;form action=&quot;주소&quot; method=&quot;POST 혹은 GET&quot;&gt;</code></pre>
<p>GET = URL 정보를 담아 보낸다.</p>
<p>POST = 다른 곳에 숨겨서 보내며 form은 높은 확률로 POST method를 사용한다. </p>
<p>실무에선 서버단의 엔지니어가 시키는대로 하면 된다고 한다. 😁😅</p>
<p><strong><em>갑자기 form?</em></strong></p>
<p>form태그를 물어보신 분이 계셨는데 잘 모르겠다고 답한 스스로가 부끄러워서 정리를 해봤다. 🤣</p>
<hr>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>백틱 ``` 옆에 html, jsx, javscript 등을 적으면 코드가 좀 더 이쁘게(?) 써진다는 것을 알았다.</li>
<li>5주차 강의까지 다 들었다. 듣긴 다 들었는데 역시 아직 내 지식이 아니라는 생각..</li>
<li>과제를 하되 과제를 목적으로 한다기보단 복습을 목적으로 해야겠다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10.04 댓글 강의]]></title>
            <link>https://velog.io/@2_juzzang/10.04-%EB%8C%93%EA%B8%80-%EA%B0%95%EC%9D%98</link>
            <guid>https://velog.io/@2_juzzang/10.04-%EB%8C%93%EA%B8%80-%EA%B0%95%EC%9D%98</guid>
            <pubDate>Sun, 10 Oct 2021 07:47:27 GMT</pubDate>
            <description><![CDATA[<h2 id="복합쿼리">복합쿼리</h2>
<p>복합쿼리는 firestore에서 한 콜렉션의 여러 필드를 한 쿼리로 묶을 때 필요하다.
-&gt; 여러 필드 내용을 가지고 쿼리를 쓰고 싶을 때 쓴다.</p>
<p>게시글에 아이디로 조건을 걸어 쿼리를 날린다.
작성한 일시 insert_dt로 정렬하기 위해 복합쿼리를 사용.</p>
<h1 id="댓글">댓글</h1>
<ul>
<li><p>댓글 뷰 &gt; 기능 &gt; 댓글 텍스트를 리덕스에 삽입 &gt; 파이어 스토어에 저장 &gt; 리덕스에 데이터 업데이트</p>
</li>
<li><p>댓글 데이터 추가할 때 게시글 정보의 댓글 갯수 + 1을 해줘야 한다.</p>
</li>
</ul>
<p>리덕스에 데이터를 저장하는 이유
다음번에 또 쓰기 위해</p>
<p>A - B - A 로 페이지를 이동할 때 매번 요청을 하는건 비효율적.
=&gt; 각 게시글에 맞는 댓글 리스트를 저장할 공간을 만들어 저장한다. </p>
<h2 id="댓글알림">댓글알림</h2>
<p>파이어베이스의 실시간 데이터 베이스를 사용해서 데이터가 실시간으로 업데이트 되었음을 알려주는 리스너를 붙인다.</p>
<p><strong><em>필요한 것은?</em></strong></p>
<ul>
<li>내가 작성한 게시글엔 내가 쓴 댓글은 알림이 가지 않아야 한다.</li>
<li>내가 아닌 사람이 댓글을 달면 파이어베이스에 저장해둔 { noti: {read:false} }의 false값이 true로 바뀌어야 한다.</li>
</ul>
<h2 id="header-notibadge-firebase-comment">Header, NotiBadge, firebase, comment,</h2>
<hr>
<h2 id="키-프레스-이벤트">키 프레스 이벤트</h2>
<p>엔터키를 눌렀을 때에도 댓글 작성이 되게한다.</p>
<p>이런 이벤트를 키 프레스 이벤트라고 말한다.</p>
<p>onKeyPress 를 사용.</p>
<pre><code class="language-jsx">onKeyPress={(e) =&gt; {
            if(e.key === &quot;Enter&quot;){
              onSubmit(e);
            }
          }}</code></pre>
<h2 id="const-관련-에러">const 관련 에러</h2>
<p><strong>Unhandled Rejection (ReferenceError): Cannot access &#39;post&#39; before initialization</strong></p>
<blockquote>
<p>초기화 전에는 게시물에 액세스 할 수 없다.</p>
</blockquote>
<p><code>const post = getState().post.list.find(l =&gt; l.id === post.id);</code></p>
<blockquote>
<p>변수 post_id 를 post.id 로 오타를 내버려서 위의 에러가 발생했다.</p>
</blockquote>
<p>const로 선언된 변수는 (=) 우측에 있는 것을 먼저 평가한 후 왼쪽의 변수에 담는데
우측의 내용을 평가할 때 존재하지 않는 변수(post)의 프로퍼티에 접근을 하려니 위의 에러 메세지가 뜬 것이었다.
const는 선언, 할당, 초기화가 동시에 되어야 함을 상기시키자~!</p>
<p>오타도 조심하자 ㅎㅎ..</p>
<hr>
<hr>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>역시 강한 사람이 끝까지 남는게 아니라 남은 사람이 강한 사람..</li>
<li>방향이 틀린 것은 아닌 것 같으니 고만 흔들리고 킵 고잉<del>~</del></li>
<li>역시 삽질로 얻는게 훨씬 많다~  </li>
<li>오타를 조심하자고 해놓고 또 오타로 시간을 버렸다. 하 <del>~</del></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10.03 무한 스크롤, 삼항 연산자,]]></title>
            <link>https://velog.io/@2_juzzang/10.03-%EB%AC%B4%ED%95%9C-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EC%82%BC%ED%95%AD-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@2_juzzang/10.03-%EB%AC%B4%ED%95%9C-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EC%82%BC%ED%95%AD-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Sun, 10 Oct 2021 07:47:08 GMT</pubDate>
            <description><![CDATA[<h2 id="무한-스크롤">무한 스크롤</h2>
<p>무한 스크롤을 구현하기 위해 알아야되는 것 중 하나는 브라우저 창의 크기!</p>
<p>스크롤 할 수 있는 영역이 얼마나 남았나 계산을 해야한다.</p>
<p>✔ 계산을 하기 위해 웹 페이지 전체 크기와 얼마나 스크롤을 했는지를 알아야 한다.</p>
<p>✔ <strong>window.innerHeight</strong>은 가시적으로 보이는 브라우저 창 높이.(메뉴바 툴바 제외한 크기!)</p>
<p>✔ <strong>document.body.scrollHeight</strong>는 스크롤할 수 있는 높이.(눈에 안보이는 영역도 포함!)</p>
<p>✔ <strong>document의 scrollTop</strong>은 스크롤이 얼마나 움직였나 알려주는 값.</p>
<hr>
<h2 id="삼항-연산자와---">삼항 연산자와 &amp;&amp; , ||</h2>
<p>삼항 연산자는 <code>{조건? 참 : 거짓 }</code>의 형태로 쓰이는데</p>
<p>강의를 듣다가 <code>{ 조건 &amp;&amp; 참 }</code>의 형태로 구성된 코드를 봤다. 
찾아보니 &amp;&amp; 연산자는 조건(본인, 이하 조건)이 참이면 &amp;&amp; 우측의 값을 return 하고,
조건이 거짓이면 조건을 그대로 return 한다.</p>
<p>|| 연산자는 조건이 참이면 조건을 그대로 return하고 거짓일 경우 &amp;&amp; 우측의 값을 return한다.</p>
<blockquote>
<p><code>{ 조건 ? 참 : 거짓}</code> &lt;- 이건 값이 있을 때, 없을 때 모두 보여줘야 할 것이 있을 때 쓰고</p>
<p><code>{ 조건 &amp;&amp; 참 }, { 조건 || 거짓 }</code> &quot;&quot; &lt;- 이건 하나의 값만 보여주고 싶을 때 사용한다고 한다.</p>
</blockquote>
<hr>
<h2 id="상세-페이지-연결">상세 페이지 연결</h2>
<p>PostDetail.js</p>
<p><strong>post_id를 통해 댓글이 어느 게시물에 달려있는지 알 수 있다.</strong>
<strong>insert_dt로 글을 정렬한다. 역순으로 정리해서 최근 게시물이 제일 상단에 뜨도록 한다.</strong>
post_id, insert_dt 두 가지로 필터링을 해서 query를 쓰면 파이어스토어에서 복합쿼리 설정을 해줘야 한다. </p>
<p>Post에서 클릭하면 PostDetail로 넘어가야 하므로 온클릭을 통해 페이지뷰를 전환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.30 리액트 심화 중에서~]]></title>
            <link>https://velog.io/@2_juzzang/09.30-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%8B%AC%ED%99%94-%EC%A4%91%EC%97%90%EC%84%9C</link>
            <guid>https://velog.io/@2_juzzang/09.30-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%8B%AC%ED%99%94-%EC%A4%91%EC%97%90%EC%84%9C</guid>
            <pubDate>Sun, 10 Oct 2021 07:46:27 GMT</pubDate>
            <description><![CDATA[<h1 id="리액트-심화">리액트 심화</h1>
<h2 id="객체">객체</h2>
<ul>
<li><p>객체는 {}안에 key:value 형태로 구성된다.</p>
</li>
<li><p>{}안에는 여러 쌍의 프로퍼티를 넣을 수 있고, 여러 타입의 데이터를 넣을 수 있다.</p>
</li>
<li><p>key는 무조건 문자형이다.</p>
</li>
<li><p>value에는 모든 자료형이 들어갈 수 있다.</p>
</li>
</ul>
<h3 id="const로-선언된-객체">const로 선언된 객체</h3>
<blockquote>
<p>const로 선언된 값은 재할당 할 수 없다.</p>
<p><strong><em>but,</em></strong> const로 선언된 <strong><em>객체</em></strong>는 재할당 할 수 있다!</p>
<p>객체의 프로퍼티는 보호되지 않아서 변경이 가능하다</p>
</blockquote>
<h3 id="함수">함수</h3>
<blockquote>
<p>😎함수도 객체이며 JS에선 함수를 특별한 값(?) 취급을 한다.</p>
<p>JS는 ()가 있음연 함수를 실행하고 ()가 없으면 함수를 문자형으로 바꿔 출력한다.</p>
<p>이를 응용하면 함수를 복사할 수 있고, 또 매개변수처럼 전달할 수 있다.
return 값은 기본적으로 undefined를 반환한다.</p>
</blockquote>
<ul>
<li><p>함수 표현식에서 this는 그 함수 자체</p>
</li>
<li><p>화살표 함수의 this는 부모를 불러온다</p>
</li>
<li><p>내부변수가 외부변수보다 우선 순위가 높다</p>
</li>
</ul>
<h3 id="콜백함수">콜백함수</h3>
<p><strong>함수를 값처럼 전달할 때, 인수로 넘겨주는 함수를 콜백 함수라고 한다.</strong></p>
<hr>
<h2 id="promise">promise</h2>
<p>콜백 헬을 해결하기 위한 방법</p>
<ul>
<li>비동기 연산이 종료된 이후에 결과를 알기 위해 사용하는 객체</li>
<li>프로미스는 생성자 함수를 가지고 만든다 (new)</li>
<li>비동기 작업을 수행할 콜백 함수를 인자로 전달받아서 사용한다.</li>
</ul>
<pre><code>const promise = new promise((resolve, reject) =&gt; {
    if(...){
        ...
        resolve(&quot;성공!&quot;);
    }
    else{
        ...
        reject(&quot;실패!&quot;);
    }
});</code></pre><ul>
<li>pending: 비동기 처리 수행 전(resolve, reject가 아직 호출되지 않음)</li>
<li>fulfilled: 수행 성공(resolve가 호출된 상태)</li>
<li>rejected: 수행 실패(reject가 호출된 상태)</li>
<li>settled: 성공 or 실패(resolve나 reject가 호출된 상태)</li>
</ul>
<hr>
<h3 id="async-await">async, await</h3>
<p>promise를 더 편히 쓰게 해주는 키워드</p>
<hr>
<h3 id="세션-스토리지">세션 스토리지</h3>
<ul>
<li>HTML5에서 추가된 저장소. key:value 형태의 저장소</li>
<li>세션 스토리지에 저장된 데이터는 브라우저를 닫으면 제거가 된다. </li>
<li>따라서 유지해야되는 데이터들(장바구나, 자동로그인)을 넣기엔 어렵다.</li>
</ul>
<p><img src="https://images.velog.io/images/2_juzzang/post/0c6dae0b-0869-4ea7-bddc-b7b6370599a8/%EC%8B%AC%ED%99%94%202%20%EC%84%B8%EC%85%98%20%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80.PNG" alt=""></p>
<hr>
<h3 id="로컬-스토리지">로컬 스토리지</h3>
<ul>
<li>따로 지워주지 않는다면 브라우저를 닫아도 데이터가 제거되지 않는다.</li>
<li>중요한 정보는 넣지 않는게 좋다.</li>
<li>쿠키와 마찬가지로 key : value 형태의 저장소이다.</li>
</ul>
<p><img src="https://images.velog.io/images/2_juzzang/post/aff4e7a2-0bbe-4b4e-906d-c33dbc5aacd9/%EB%A1%9C%EC%BB%AC%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80.PNG" alt=""></p>
<hr>
<h3 id="그렇다면-토큰은-어디에-저장하면-좋을까">그렇다면 토큰은 어디에 저장하면 좋을까?</h3>
<ul>
<li><p>프로젝트의 성향에 맞춰 저장 장소는 그때그때 달라져야 한다.</p>
</li>
<li><p>각각 장단점이 있기 때문에 쿠키에 저장하는 경우도, 로컬 스토리지에 저장하는 경우도 있다. </p>
</li>
</ul>
<hr>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>강의 듣다가 잡생각이 들면 바로 일시정지 눌러라<del>~</del>!</li>
<li></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.29 리액트 복습]]></title>
            <link>https://velog.io/@2_juzzang/09.29-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B3%B5%EC%8A%B5</link>
            <guid>https://velog.io/@2_juzzang/09.29-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B3%B5%EC%8A%B5</guid>
            <pubDate>Sun, 10 Oct 2021 07:46:05 GMT</pubDate>
            <description><![CDATA[<h1 id="리액트-복습">리액트 복습</h1>
<h2 id="리액트는-데이터-바인딩이-쉽다">리액트는 데이터 바인딩이 쉽다?</h2>
<p><strong><em>es6 destructoring</em></strong></p>
<pre><code>const [a, b] = [1, 2] 이면
const a = 1
const b = 2 가 된다.</code></pre><p><strong><em>state</em></strong></p>
<ol>
<li>변수 대신 쓰는 데이터 저장공간</li>
<li>useState()를 이용하여 만들어야 한다.</li>
<li>문자, 숫자, 배열(Array), object 다 저장가능</li>
<li>자주 바뀌는, 중요한 데이터를 state로 저장해서 사용</li>
</ol>
<p><strong><em>state를 쓰는 이유?</em></strong></p>
<ol>
<li>웹이 App처럼 동작하게 만들기 위해 </li>
<li>state가 변경되면 새로고침 없이도 <strong>HTML이 자동으로 재렌더링</strong>이 됨</li>
</ol>
<p><strong><em>state를 변경하려면?</em></strong></p>
<blockquote>
<p>object state, Array 데이터 수정방법</p>
</blockquote>
<ol>
<li>변경함수 사용, 변경함수(대체할 데이터)<blockquote>
<p><code>const [value, setValue] = useState();</code>에서
두번째 인자인 setValue가 state 변경함수이다. 여기선 이 함수를 통해 value 값을 변경할 수 있다.</p>
</blockquote>
</li>
</ol>
<pre><code>예제) []의 첫번째 요소 바꾸기
const [value, setValue] = useState([]);
function 함수이름(){
    let new_value = [...value]; &gt;&gt; 딥카피
    new_value[0] = &#39;변경할 값이름&#39;
    setValue(new_value);
}</code></pre><hr>
<h2 id="component">Component</h2>
<p>리액트를 쓰는 큰 이유 중 하나! </p>
<h3 id="컴포넌트-만드는-법"><strong><em>컴포넌트 만드는 법</em></strong></h3>
<ol>
<li>함수를 만들어 이름을 짓는다.</li>
<li>return문 안에 축약을 원하는 HTML을 넣는다.</li>
<li>원하는 위치에서 &lt;1에서 만든 함수명 /&gt;</li>
</ol>
<blockquote>
<ul>
<li>이름의 첫 글자는 대문자로 한다.</li>
<li>return문 안에 있는 태그는 하나로 묶어야 한다.</li>
<li>function App() 도 일종의 컴포넌트.</li>
</ul>
</blockquote>
<h3 id="어떤-것을-컴포넌트로-만들면-좋을까"><strong><em>어떤 것을 컴포넌트로 만들면 좋을까?</em></strong></h3>
<ol>
<li>반복적으로 나오는 HTML 덩어리들</li>
<li>자주 바뀌는 HTML UI들</li>
<li>다른 페이지를 만들 때</li>
</ol>
<hr>
<h2 id="삼항연산자">삼항연산자</h2>
<p>{ } 중괄호 안에  if문은 작동하지 않는다.
대신, 삼항연산자를 사용한다.</p>
<pre><code>{
    1 &lt; 3 
    ? console.log(&#39;참&#39;) 
    : console.log(&#39;거짓&#39;)
}</code></pre><p>위와 같이</p>
<blockquote>
<p>조건식 ? 참일 경우 코드 : 거짓일 경우 코드</p>
</blockquote>
<p>로 구성된다.</p>
<hr>
<h2 id="modal창-on-off">Modal창 on, off</h2>
<p>모달창 on,off도 state 데이터를 이용한다.</p>
<pre><code>let [modal, modal변경] = useState(false);
    &lt;button onClick={ () =&gt; {modal변경(!modal)} }&gt;스위치&lt;/button&gt;
{ modal === true ? &lt;Modal /&gt; : null } // 삼항연산자 사용</code></pre><p><strong><em>난 무얼 놓쳤는가?</em></strong></p>
<p>modal변경()의 인자에  !를 쓰는 것 자체를 생각을 못했다.</p>
<p>로직을 보면 첫 페이지 로드시엔 modal이 false 상태라 null 값을 가진다. <br>
스위치 버튼을 클릭하면 modal변경 함수에 의해 modal이 !false가 되므로 true로 바뀐다.<br></p>
<hr>
<h2 id="반복문">반복문</h2>
<p>{ } 중괄호 안에는 for와 같은 반복문을 사용할 수 없다.
그래서 중괄호 안에서 사용이 가능한 map을 쓴다. 이는 반복문이라고 하기 보단
배열에 붙일 수 있는 일종의 내장함수!</p>
<pre><code>var 어레이 = [2,3,4];
어레이.map(function(a){ 
    return a * 10 (주고싶은 값)  // [20, 30, 40] 리턴
});</code></pre><ol>
<li>소괄호 안에 콜백함수를 넣는게 기본</li>
<li>map안의 코드가 어레이 요소의 갯수만큼 실행이 된다. (여기선 3번) </li>
<li>map 함수는 원본을 변형시키지 않는다.</li>
<li>파라미터에 들어가는 인수는 아무거나 입력</li>
</ol>
<p><strong><em>어떻게 씁니까?</em></strong></p>
<pre><code>{ 반복할데이터.map(() =&gt; { return &lt;HTML&gt; } )}</code></pre><p><strong><em>이렇게 써봤습니다</em></strong></p>
<pre><code> {
    a.map((아무거나) =&gt; {
        return (
        &lt;h2&gt;
        { 아무거나 }
        &lt;/h2&gt;
    )
    })
}</code></pre><ul>
<li>인수에 아무거나를 넣어주면서 a에 있던 배열이 차례대로 출력이 되는 것을 확인</li>
</ul>
<hr>
<h2 id="props--부모의-state를-가져다-쓰고-싶어요">props : 부모의 state를 가져다 쓰고 싶어요</h2>
<p><strong><em>props로 자식컴포넌트에 state를 전해주고 싶을 땐 이렇게</em></strong></p>
<ol>
<li>데이터를 보내고 싶은 자식컴포넌트로 가서 &lt;자식컴포넌트 작명={전송할 state} /&gt;</li>
<li>자식컴포넌트에서 파라미터에 props<del>(이름은 마음대로)</del>를 입력</li>
<li>자식컴포넌트에서 사용하고 싶은 곳에 props.작명[0] 이런 식으로 사용</li>
</ol>
<p><strong><em>이렇게 써봤습니다</em></strong></p>
<pre><code>let[글제목, 글제목변경] = useState([&#39;제목 정하는 중&#39;, &#39;뭐로 하지&#39;, &#39;이걸로 할까&#39;]);
 &lt;button onClick={ () =&gt; {modal변경(!modal)} }&gt;스위치&lt;/button&gt;
    // 1. 데이터를 Modal로 보냅니다. 작명센스부족에 글제목 state를 담습니다.
    { modal === true ? &lt;Modal 작명센스부족={글제목} /&gt; : null }
.
.
.

// 2. props를 인자로 받아오고
function Modal(props) {
  console.log(props.작명센스부족)
  return (
    &lt;div className=&quot;modal&quot;&gt;
        // 3. props.작명센스부족 은 3개의 배열을 가져옵니다. ( 위의 글제목 3개 )
        &lt;h2&gt;{props.작명센스부족[0]}&lt;/h2&gt;
        // 첫번째 요소인 &#39;제목 정하는 중&#39;이 출력되겠네요~~~!
        &lt;p&gt;날짜&lt;/p&gt;
        &lt;p&gt;상세내용&lt;/p&gt;
    &lt;/div&gt;
  )
}</code></pre><hr>
<p><strong><em>글을 state에 저장하기</em></strong></p>
<p>답안</p>
<pre><code>div className=&quot;publish&quot;&gt;
    &lt;input type=&quot;text&quot; placeholder=&quot;Hello World&quot; onChange={ (e) =&gt; {입력값변경(e.target.value)} }/&gt;
    &lt;button onClick={()=&gt;{
      let new_글제목 = [...글제목];
      new_글제목.unshift(입력값);
      글제목변경(new_글제목)
    }}&gt;저장&lt;/button&gt; 
    &lt;/div&gt;</code></pre><hr>
<p>내가 쓴 답</p>
<pre><code>&lt;div className=&quot;publish&quot;&gt;
    &lt;input type=&quot;text&quot; placeholder=&quot;Hello World&quot; onChange={ (e) =&gt; {입력값변경(e.target.value)} }/&gt;
    &lt;button onClick={()=&gt;{
      let add_글제목 = [...글제목];
      add_글제목 = [...글제목, {입력값}];
      글제목변경(add_글제목);
    }}&gt;저장&lt;/button&gt; 
    &lt;/div&gt;</code></pre><p><strong><em>뭘 잘못했나</em></strong></p>
<ol>
<li>변수는 중괄호를 써야한다는 사실 때문에 배열안에서 {입력값}을 쓰고 있었다. (여기서 입력값은 input 값)</li>
<li>Objects are not valid as a React child 라고 분명히 콘솔에 찍혀있는데 또 영어가 무섭다고 검색을 안했다.
 이는 객체는 React 자식으로 유효하지 않다는 말이다.</li>
<li>중괄호 빼주니 정상적으로 작동한다. 😂</li>
<li>순서를 바꿔 add=글제목 = [입력값, ...글제목]으로 해도 unshift(입력값)과 같게 작용한다.</li>
</ol>
<hr>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>졸리면 자는게 낫겠다.. 지각을 결석 수준으로 해버렸다.</li>
<li>CSS도 중요하지만 JS, 리액트가 더 중요하다! 본질에 집중하자</li>
<li>코드리뷰 제대로 하기, 도움이 아주~ 아주~ 많이 된다 </li>
<li>하나 둘 나가기 시작했다.. 안나가려면 개처럼 해야된다 개처럼.. 하면 된다가 아니라 갈면 된다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.28 ES6]]></title>
            <link>https://velog.io/@2_juzzang/09.28-ES6</link>
            <guid>https://velog.io/@2_juzzang/09.28-ES6</guid>
            <pubDate>Sun, 10 Oct 2021 07:45:36 GMT</pubDate>
            <description><![CDATA[<h1 id="es6">ES6</h1>
<p>부족함을 느껴 다시 한 번 자바스크립트 공부를 했다.
일단 봐둬야 할 것들은</p>
<ul>
<li>변수 var, let, const</li>
<li>조건문 if else</li>
<li>반복문 for</li>
<li>함수 function return</li>
<li>배열 array object</li>
<li>이벤트 addEventListener
이렇게 생각해놨다.</li>
</ul>
<h2 id="파라미터">파라미터</h2>
<pre><code>function 알림창열기() {
    document.getElementById(&#39;alert&#39;).style.display = &#39;block&#39;;
}
function 알림창닫기() {
    document.getElementById(&#39;idName&#39;).style.display = &#39;none&#39;;
}

파라미터를 사용하여 ()안에 값을 입력하면

function 알림창열기(&#39;x&#39;){
    document.getElementById(&#39;alert&#39;).style.display = x;
}

파라미터 값이 &#39;x&#39;에 들어가게 된다.

알림창열기(&#39;block&#39;);
알림창열기(&#39;none&#39;);  
두 줄로 위 두 개의 함수와 같은 역할을 수행할 수 있게 된다.</code></pre><blockquote>
<p>f(x) = x + 5 일 때,
f(1) = 1 + 5, f(2) = 2 + 5 와 같이
파라미터가 x의 위치에 들어가는 것을 알 수 있다.</p>
<p>f(파라미터) = 파라미터 + 5 이런 식으로 되는 것 
<strong>파라미터를 쓰려면 파라미터가 들어갈 위치만 있으면 된다.</strong></p>
</blockquote>
<h3 id="기본값">기본값</h3>
<blockquote>
<p>함수의 파라미터의 인자에 기본 값을 설정하는 법</p>
<p>인자가 name 이라고 하면 인자에
(name = &#39;기본값&#39;)을 작성하면 name의 기본값은 &#39;기본값&#39;이 된다.</p>
<p>함수 안에서 name이 할당되지 않으면 기본값이 사용된다.</p>
</blockquote>
<h3 id="파라미터-아규먼트">파라미터? 아규먼트?</h3>
<blockquote>
<p>f(x)와 f(4) 가 있다고 하면 </p>
<p>x 는 Parameter(파라미터)라고 하고 x에 들어가는 4는 들어가는 Arguement(아규먼트)라고 한다.</p>
<p>이는 파라미터의 값으로 아규먼트 4를 대입하였다. 라는 의미가 되겠다.</p>
</blockquote>
<hr>
<h2 id="변수">변수</h2>
<p>let - 다른 값으로 변경이 가능함 </p>
<p>const - 다른 값으로 변경이 불가능한 상수 </p>
<ol>
<li>변수는 문자와 숫자, $와 _만 사용한다.</li>
<li>첫글자는 숫자가 될 수 없다.</li>
<li>예약어는 사용할 수 없다.</li>
<li>가급적 상수는 대문자로 표기한다.</li>
<li>변수명은 읽기 쉽고 이해할 수 있게 작성.</li>
<li>먼저 const로 값을 주되, 변할 가능성이 있는 것들은 let으로 고쳐준다.</li>
</ol>
<hr>
<h2 id="null과-undefined">null과 undefined</h2>
<p>null은 존재하지 않는 값으로, 객체 취급하지 않는다. (오류지만 하위 버전의 호환성 때문에 고치지 않는다고 한다.)
undefiend는 값이 할당되지 않은 값</p>
<hr>
<h2 id="형변환">형변환</h2>
<p>String() 괄호 안의 타입을 <strong>문자형</strong>으로 변환</p>
<p>Number() 괄호 안의 타입을 <strong>숫자형</strong>으로 변환</p>
<ul>
<li>Number(true) = 1</li>
<li>Number(false) = 0</li>
<li>Number() 안에 문자열이 들어가면 NaN(Not a number) 을 반환한다.</li>
<li>Number(null)  0 을 반환한다.</li>
<li>Number(undefined) NaN을 반환한다.  </li>
</ul>
<p><img src="https://images.velog.io/images/2_juzzang/post/fb096d6c-898b-433e-a6ce-078d43cc6995/%ED%98%95%EB%B3%80%ED%99%98.PNG" alt=""></p>
<p>Boolean에서 <strong>false</strong></p>
<ul>
<li>숫자 0</li>
<li>빈 문자열 &#39;&#39;</li>
<li>null</li>
<li>undefined</li>
<li>NaN </li>
</ul>
<p>이 값들은 모두 false를 반환하고 이 외의 값들은 모두 true를 반환한다.</p>
<h2 id="연산자">연산자</h2>
<pre><code> + , - , * , / , %(나머지)</code></pre><p>거듭제곱 **</p>
<p>증가연산자
let num = 10;
let result = ++num; 증가 (num이 뒤에 있어 변경 O)
let result = num++; 변동 없음 (num이 앞에 있어서 변경 X)</p>
<h2 id="반복문">반복문</h2>
<h3 id="for">for</h3>
<pre><code>for (let i = 0; i &lt; 10; i++){
    코드
}</code></pre><blockquote>
<p>( 초기값 ; 조건 ; 코드 실행 후 작업 ) 세 부분으로 나뉜다.</p>
<p>초기 값 설정 후 조건이 true면 코드가 실행되고 i값을 증가시켜준다.</p>
<p>이를 반복하다가 조건이 false가 되면 반복문이 멈춘다.</p>
</blockquote>
<h3 id="while">while</h3>
<pre><code>let i = 0; 
while (i&lt;10) {
  코드   
  i ++;
}</code></pre><blockquote>
<p>명확한 횟수가 정해져 있으면 for문을, 그렇지 않으면 while을 사용하자</p>
</blockquote>
<h3 id="반복문을-빠져나오는-방법">반복문을 빠져나오는 방법</h3>
<p>break : 멈추고 빠져나옴
continue : 멈추지만 빠져나오지 않고 다음 반복문 진행</p>
<hr>
<h2 id="switch">Switch</h2>
<p>if/else문과 원리가 비슷하다.</p>
<pre><code>Switch(평가) {
    Case A:
    A일 때 코드
    Case B:
    B일 때 코드
}</code></pre><blockquote>
<p>둘 다 같은 코드</p>
</blockquote>
<pre><code>if(평가 == A) {
    A일 때 코드
} else if (평가 == B) {
    B일 때 코드
}</code></pre><p>switch 문은 break가 없다면 계속 진행한다.</p>
<hr>
<h2 id="함수-선언문과-함수-표현식">함수 선언문과 함수 표현식</h2>
<pre><code>함수 선언문
function sayHello() {
    console.log(&#39;Hello&#39;);
}
sayHello();</code></pre><p>위와 아래의 결과값은 같으나</p>
<pre><code>함수 표현식
화살표 함수를 쓸 수 있다.
let sayHello = function() {
    console.log(&#39;Hello&#39;)
}
sayHello();</code></pre><p><strong><em>But</em></strong></p>
<p><strong>함수 선언문</strong>은 어디서든 호출이 가능하다. 이는 호이스팅 때문이다.
<code>sayHello();</code> 를 함수 위에서 써도 동작한다.</p>
<pre><code>호이스팅 - 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동한다.
선언은 위에서 되는 반면 할당은 위에서 되지 않는다!</code></pre><p>반면 <strong>함수 표현식</strong>은 코드에 도달하면 동작한다. </p>
<hr>
<h2 id="object">Object</h2>
<p>객체는 중괄호{}로 구성하고 키(key)와 밸류(value)로 구성된다.</p>
<p>const superman = {
    name : &#39;clark&#39;,
    age : 33
}</p>
<h3 id="접근">접근</h3>
<p>. (온점) superman.name</p>
<p>[] (대괄호) superman[&#39;name&#39;]</p>
<h3 id="추가">추가</h3>
<p>superman.gender = &#39;male&#39;;</p>
<p>superman[&#39;hairColor&#39;] = &#39;black&#39;;</p>
<h3 id="삭제">삭제</h3>
<p>삭제하고싶은 프로퍼티 앞에 delete</p>
<p>delete superman.hairColor;</p>
<h3 id="for--in-반복문">for ... in 반복문</h3>
<p>for in 반복문을 사용하면 객체를 순회하면서 값을 얻을 수 있다.</p>
<pre><code>const Mike = {
    name : &quot;Mike&quot;
    age : 30,
    hobby : &quot;football&quot;
}

for (x in Mike){
    // x는 key값(name, age)를 반환한다.
    Mike[x] 는 Mike, 30, football을 반환한다.
}</code></pre><h2 id="객체를-반환하는-함수">객체를 반환하는 함수</h2>
<pre><code>function makeObject(name, age){
    // 리턴문에 {} &gt;&gt; 객체를 반환!
    return {
        name : name, 키:밸류 값이 같으므로 name,
        age : age,                       age, 로 표기 가능
        hobby : &#39;football&#39;
    }
} </code></pre><pre><code>const mike = makeObject(&quot;Mike&quot;,  30);
Mike = 

Object {
    name : &quot;Mike&quot;
    age : 30,
    hobby : &quot;football&quot;
}</code></pre><p>객체가 출력된다.</p>
<hr>
<h2 id="객체에-함수를-추가---method">객체에 함수를 추가 - method</h2>
<pre><code>const superman = {
    name : &quot;Mike&quot;
    age : 30,
    fly : function() {
        console.log(&#39;날아갑니다&#39;);
    }
}

superman.fly();
// 날아갑니다</code></pre><blockquote>
<p>객체 프로퍼티(키:값 한 쌍으로 구성)로 할당 된 함수를 method(메서드) 라고 한다.</p>
</blockquote>
<hr>
<h2 id="배열array">배열(array)</h2>
<p>:순서가 있는 리스트</p>
<ul>
<li>배열은 대괄호로 묶어주고 쉼표로 구분할 수 있다.</li>
<li>index는 0부터 시작한다.</li>
<li>배열은 문자, 숫지, 객체, 함수 등도 포함할 수 있다.</li>
<li>.length는 배열의 길이를 구할 수 있다. 배열이 가지고 있는 요소의 개수를 반환한다.</li>
<li>.push(): 배열 끝에 요소 추가, unshift(): 배열 앞에 추가</li>
<li>.pop(): 배열 끝의 요소 제거, shift(): 배열 끝에 제거</li>
<li>배열을 쓰는 가장 큰 이유 중 하나는 반복을 위해서!</li>
</ul>
<p>배열 반복문은 for in 보다 for of로 돌리기</p>
<p>하지만 인덱스를 못 얻는다는 단점이 존재함</p>
<pre><code>예제)
let days = [&#39;월&#39;, &#39;화&#39;, &#39;수&#39;];
for(let x of days){
    console.log(x)
}</code></pre><hr>
<h1 id="심화">심화</h1>
<h2 id="변수-1">변수</h2>
<p>var, let, const</p>
<p>var</p>
<ul>
<li>한 번 선언된 변수를 다시 선언할 수 있다.</li>
<li>선언하기 전에 사용할 수 있다. &gt; 코드가 실제로 올라가진 않지만 최상위로 올라간 것 처럼 동작한다 (호이스팅) <strong><em>하지만</em></strong> 할당은 호이스팅이 되지 않는다. </li>
</ul>
<p>호이스팅이란 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것처럼 행동하는 것을 의미하는데 
그렇다면 let 과 const는 왜 에러가 발생하는가?</p>
<p> <strong><em>TDZ (Temporal Dead Zone)</em></strong> 때문에 발생한다.</p>
<p>TDZ영역에 있는 변수들은 사용을 할 수 없는데 let과 const는 이 TDZ의 영향을 받아서 할당을 하기 전에는 사용 할 수 없게 되는 것이다.
이는 코드를 예측 가능하게하고 잠재적인 버그를 줄일 수 있게 하는 장점이 있다.</p>
<h3 id="변수의-생성과정">변수의 생성과정</h3>
<ol>
<li>선언</li>
<li>초기화</li>
<li>할당</li>
</ol>
<p>var는 선언 + 초기화 &gt; 할당 / 함수 스코프</p>
<p>let은 선언 &gt; 초기화 &gt; 할당 / 블록 스코프</p>
<p>const는 선언 + 초기화 + 할당 / 블록 스코프</p>
<pre><code>var name;
name = &#39;Mike&#39;; (O)

let age;
age = 30; (O)

const gender;
gender = &#39;male&#39; (X) &gt; 에러</code></pre><hr>
<h2 id="생성자-함수">생성자 함수</h2>
<pre><code>function Item(title, price){
    //this = {}; 빈 객체 생성 &gt;&gt; 생략되어 있음
    this.title = title;
    this.price = price;
    // 메소드 생성
    this.showPrice = function(){
        console.log(&#39;가격은 ${price}원 입니다.&#39;);
    }
    //return this; &gt;&gt; 생략되어 있음 &gt; 생략된 두 부분은 new로 호출하면 알고리즘에 의해 실행이 된다!
}

const Item1= new Item(&#39;인형&#39; , 3000);
const Item2= new Item(&#39;가방&#39; , 4000);
const Item3= new Item(&#39;필통&#39; , 5000);

item3.showPrice();
showPrice 메소드에 의해 &#39;가격은 5000원 입니다.&#39; 가 출력된다</code></pre><p><img src="https://images.velog.io/images/2_juzzang/post/16ab3198-4678-45d3-9711-46c537a2c60e/%EC%83%9D%EC%84%B1%EC%9E%90%201.PNG" alt=""></p>
<blockquote>
<p><strong><em>생성자 함수는 new를 꼭 붙여야 한다.</em></strong></p>
</blockquote>
<hr>
<h2 id="객체-메소드">객체 메소드</h2>
<h3 id="objectassign--객체-복제">Object.assign() : 객체 복제</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/59b8fd98-d1c3-458f-be5f-ca5136f474f3/%EA%B0%9D%EC%B2%B4%20%EB%A9%94%EC%86%8C%EB%93%9C%201.PNG" alt=""></p>
<p><img src="https://images.velog.io/images/2_juzzang/post/7573d70c-ff7f-403b-a2ac-7bc2dae24009/%EA%B0%9D%EC%B2%B4%20%EB%A9%94%EC%86%8C%EB%93%9C%202.PNG" alt=""></p>
<p>여러 객체도 복제가 가능하다.</p>
<h3 id="objectkeys--키-값만-배열로-반환">Object.keys() : 키 값만 배열로 반환</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/d548cea1-ab01-49ed-b960-916418252bfb/%ED%82%A4%EB%B0%B0%EC%97%B4%20%EB%B0%98%ED%99%98.PNG" alt=""></p>
<h3 id="objectvalues--밸류-값만-배열로-반환">Object.values() : 밸류 값만 배열로 반환</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/de9dc711-321b-4f16-86b1-85e2079eb084/%EA%B0%92%20%EB%B0%B0%EC%97%B4%20%EB%B0%98%ED%99%98.PNG" alt=""></p>
<h3 id="objectentries--객체를-배열로-반환">Object.entries() : 객체를 배열로 반환</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/113ddb85-b21d-42ba-80bc-c758396b223e/%EB%B0%B0%EC%97%B4%EB%A1%9C%20%EB%B0%98%ED%99%98.PNG" alt=""></p>
<h3 id="objectfromentries--배열을-객체로-반환">Object.fromEntries() : 배열을 객체로 반환</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/60a90b87-65a7-4680-8254-c72c5109ffaf/%EB%B0%B0%EC%97%B4%EC%9D%84%20%EA%B0%9D%EC%B2%B4%EB%A1%9C.PNG" alt=""></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[09. 27 노마드코더 paintJS]]></title>
            <link>https://velog.io/@2_juzzang/09.-27</link>
            <guid>https://velog.io/@2_juzzang/09.-27</guid>
            <pubDate>Sun, 10 Oct 2021 07:45:10 GMT</pubDate>
            <description><![CDATA[<h1 id="😂">😂</h1>
<p>개인과제는 제출을 했으나 만족스럽진 않은 결과물이다.</p>
<p>다만 수요일까지의 시간이 생겨 부족했던 부분을 공부할 시간이 생겨서</p>
<p>노마드코더의 그림판 클론코딩 &gt; JS &gt; 리액트를 될 수 있는 부분까지 다시 공부해보려고 한다.</p>
<h2 id="심화반-시작-전까지-기회라고-생각하면서-도전😎">심화반 시작 전까지 기회라고 생각하면서 도전~😎</h2>
<h2 id="paintjs_클론코딩">PaintJS_클론코딩</h2>
<p>변수(상수)를 선언하고 로직 순서에 따른 함수작성을 한다.</p>
<p>거의 모든 JS가 context의 메서드와 toggle 함수로 구성, boolean(true,false) 값 사용)</p>
<p>콘솔로 계속 확인</p>
<p>값을 변경해보면서 어떻게 화면에 나타나는지도 확인</p>
<p>clientX,Y 는 윈도우 전체의 범위 내에서 마우스 위치 값을 나타냄.</p>
<hr>
<h2 id="오늘의-tmi">오늘의 TMI</h2>
<ul>
<li>가끔 쉬는 것도 필요하구나 느꼈다. 일요일에 하루 쉬었더니 뭔가 집중이 잘 되는 느낌?</li>
<li>늦었지만 쉬지않고 클론 코딩을 끝냈다. 굳굳</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[3주차 WIL]]></title>
            <link>https://velog.io/@2_juzzang/3%EC%A3%BC%EC%B0%A8-WIL</link>
            <guid>https://velog.io/@2_juzzang/3%EC%A3%BC%EC%B0%A8-WIL</guid>
            <pubDate>Sun, 03 Oct 2021 08:41:06 GMT</pubDate>
            <description><![CDATA[<h1 id="라이프-사이클---클래스형-함수형">라이프 사이클 - 클래스형, 함수형</h1>
<h2 id="클래스형">클래스형</h2>
<p><img src="https://images.velog.io/images/2_juzzang/post/e778c123-fbe5-4320-ad8d-cc6ef1d852fb/%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4%20%ED%81%B4%EB%9E%98%EC%8A%A4.png" alt=""></p>
<ul>
<li><p>Will 접두사가 붙은 메서드: 특정 작업을 작동하기 전에 실행되는 메서드</p>
</li>
<li><p>Did 접두사가 붙은 메서드: 특정 작업을 작동한 후 실행되는 메서드
라이프 사이클은 크게 3가지 흐름으로 정리 된다.</p>
</li>
<li><p>componentDidMount</p>
<ul>
<li>DOM 트리에 삽입된 직후 즉, 초기 브라우저 화면을 갱신하기 전에 호출 되는 메서드이다.</li>
<li>fetch, 스크롤 이벤트,setInterval 같은 초기에 설정이 필요한 경우 이곳에서 작업을 한다.</li>
<li>만약 스크롤 이벤트,setInterval 를 호출 했다면 componentWillUnmount() 메서드를 통해 해제 작업을 진행해야 한다.</li>
</ul>
</li>
<li><p>componentDidUpdate</p>
<ul>
<li>업데이트가 일어난 직후에 호출되는 함수이다.</li>
<li>최초 랜더링시에는 호출되지 않는다.</li>
<li>DOM을 조작할 때 유용하다.</li>
</ul>
</li>
<li><p>componentWillunmount</p>
<ul>
<li>컴포넌트가 웹 브라우저상에서 사라지기 전에 호출하는 메서드</li>
<li>컴포넌트를 DOM에서 제거할 때 실행된다.</li>
</ul>
</li>
</ul>
<h2 id="함수형과-hooks">함수형과 Hooks</h2>
<p><img src="https://images.velog.io/images/2_juzzang/post/5f54f756-0708-470a-8a46-e050aa58eda3/%ED%95%A8%EC%88%98%ED%98%95%20%EB%9D%BC%EC%9D%B4%ED%94%84.png" alt=""></p>
<p>리액트 훅스에서 side effect 로 라이프사이클을 조정할 수 있다.
훅을 사용하는게 클래스형의 라이프 사이클과 같다는 말은 아니다.</p>
<p>훅을 사용하면 생명주기 메서드를 기반으로 쪼개는 것 보다는, Hook을 통해 서로 비슷한 것을 하는 작은 함수의 묶음으로 컴포넌트를 나누는 방법을 사용할 수 있다.</p>
<p><a href="https://codingbroker.tistory.com/23">클래스형과 함수형의 Hooks를 비교</a></p>
<p>위 링크에서 볼 수 있듯 Hooks를 사용하면 기본적으로 코드의 양을 많이 줄일 수 있다.</p>
<hr>
<h2 id="3주차-til-😂">3주차 TIL 😂</h2>
<p><a href="https://github.com/2Juzzang/Diary-or-TIL/commit/b369f0247a60dcfc1c6c96b5a45448fef25f77cb?short_path=60f8182#diff-60f818282a13d0505d98538a0c2276d1b1687789aae461b84370c32eb87e0ae3">09.27</a></p>
<p><a href="https://github.com/2Juzzang/Diary-or-TIL/commit/e741f667105ec0d428724f0d4630bd91dce1d667?short_path=889e854#diff-889e8547b57c67358f2f80b84174520bda5ebec59121d7c94a5cab40d0948e2b">09.28</a></p>
<p><a href="https://github.com/2Juzzang/Diary-or-TIL/commit/cb76772f61d4e66b5ee6039a7145e79a47b1355e?short_path=889e854#diff-889e8547b57c67358f2f80b84174520bda5ebec59121d7c94a5cab40d0948e2b">09.29</a></p>
<p><a href="https://github.com/2Juzzang/Diary-or-TIL/commit/6db4a896440bd2c08650683cf096c24e1ae9bc17#diff-f299f4e57da490a9069c05e22c8b5c01839762c3e2111bb44f75536f5c55a92f">09.30</a></p>
<hr>
<h2 id="3주차-tmi">3주차 TMI</h2>
<ul>
<li>심화반 강의를 들으면서부터 솔직히 머릿속에 정리가 되질 않아서 TIL을 쓰지 못했다.</li>
<li>WIL은 더 다듬어야 할 필요를 느낀다.</li>
<li>지식이 한 데 모아져있는게 아니라 여기저기 퍼져있는 느낌을 많이 받고있다. 이게 좀 머릿속에서 묶였으면 하는데 강의 이해하기에도 급급한 요즘이라 정리하기가 어렵다.</li>
<li>강의를 들으며 느끼지만 속도보단 방향인 것 같다. 하지만 이렇게 기한이 정해져 있는 환경에서는 조금 어려울지도😂</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.26 2주차 WIL]]></title>
            <link>https://velog.io/@2_juzzang/09.26-2%EC%A3%BC%EC%B0%A8-WIL</link>
            <guid>https://velog.io/@2_juzzang/09.26-2%EC%A3%BC%EC%B0%A8-WIL</guid>
            <pubDate>Sun, 26 Sep 2021 13:08:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/2_juzzang/post/ad5afda2-2f1e-46a7-bcbc-febc85e0744f/2%EC%A3%BC%EC%B0%A8%20%EC%8B%9C%EC%9E%91.PNG" alt=""></p>
<p>2주차 팀</p>
<p>주특기를 배우기 시작했다. 
선택한 주특기는 리액트고 추석 연휴 때 쉬면서 강의를 계속 들었다.
짧은 시간 내에 이해하려니 어려운 부분이 많았다.</p>
<p>그래서 일단은 4주차까지 듣고난 후 프로젝트를 직접 만들어 보면서 수강한 내용들을 이해하려고 했다.</p>
<p><img src="https://images.velog.io/images/2_juzzang/post/2562e026-8cb9-43fd-b8f4-d59542991d80/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B81.PNG" alt=""><img src="https://images.velog.io/images/2_juzzang/post/a5fa0fe3-6010-4e80-9534-81e896b0bfb9/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82.PNG" alt=""></p>
<p><del>아직 배포는 완료하지 못했다.</del>
확실히 만들어보면서 강의에 대한 내용들이 이 부분에 해당하는 내용이었구나 하고 알게되는게 많았던 것 같다.</p>
<p>이번 주차에선 리액트의 구조, 리덕스에 대해 배웠는데 강의에선 함수형과 클래스형을 계속 왔다갔다 해서 많이 헷갈렸는데
그 부분이 프로젝트(과제)를 만들면서 이해가 돼서 다행이었던 한 주였다.</p>
<h2 id="dom-돔">DOM (돔)</h2>
<blockquote>
<p><strong>DOM(Document Object Model) 문서객체모델</strong>
DOM은 html 단위 하나하나를 객체로 생각하는 모델이다. 예를 들면, &#39;div&#39;라는 객체는 텍스트 노드, 자식 노드 등등, 하위의 어떤 값을 가지고 있는데 이런 구조를 트리 구조라고 한다. 왜 이런 설명을 썼냐면 DOM도 트리 구조이기 때문이다.</p>
</blockquote>
<p>HTML이란 코드로 설계된 웹페이지가 브라우저( = 크롬, 파이어폭스 etc..) 안에서 화면에 나타나고 이벤트에 반응하고 값을 입력받는 등 기능들을 수행할 객체들로 실체화된 형태</p>
<p>DOM의 모든 요소들 html, div, radio, table 등 이것들은 모두 node로 부터 상속받는다.
모든 HTML요소들은 기본적으로 node이고 이는 모두 node의 기능을 가지고 있다는 말이 된다.</p>
<p>node는 클릭 등의 이벤트가 가해지는 EventTarget이기 때문에 이 요소들은 모두 addEventListener 등의 기능도 갖고 있다.   </p>
<p>가상돔(Virtual DOM)
실제 DOM의 구조만 간결히 흉내낸 자바스크립트 객체로
가상DOM 에서 바뀐 부분들이 생기면 실제 돔과 비교하여 바뀐 부분들만 실제 DOM에 반영한다.</p>
<h2 id="serverless-서버리스">Serverless (서버리스)</h2>
<blockquote>
<p>서버리스(serverless)란 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있도록 하는 클라우드 네이티브 개발 모델.</p>
</blockquote>
<p>웹이 동작하려면 클라이언트와 서버가 필요하다. 서버가 없다면 웹이 동작하지 않는다. 
서버리스는 서버가 없다는 것이 아니라 직접 서버를 관리하지 않는 경우를 뜻한다.</p>
<p>서버리스가 나오기 전에는 아마존의 EC2와 같이 비용을 지불하고 하드웨어적인 부분을 빌려 서버를 사용했는데 이는 하드웨어 부분만 빌리는 것일 뿐 소프트웨어 부분은 직접 관리를 해줘야 했다.</p>
<p>그 후에 서버리스가 등장하게 됐는데 이 서버리스는 항상 돌아가는 것이 아니고 리퀘스트 요청이 왔을 때만 함수가 동작한다.
서버는 이용자가 몇 명이든 같은 돈을 내고 사용하지만 
서버리스는 수행한 함수만큼 돈을 지불하고 </p>
<p>서버는 항상 돌아가고 있기 때문에 바로바로 응답이 가능하지만
서버리스는 잠들어있는(?) 상태의 함수를 깨우는 것이기 때문에 미세하게나마 시간차가 생길 수 있다는 단점이 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.23 리액트 3주차]]></title>
            <link>https://velog.io/@2_juzzang/09.23-%EB%A7%88%EC%9D%8C%EC%9D%84-%EB%B9%84%EC%9B%8C%EC%95%BC-%ED%95%A9%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@2_juzzang/09.23-%EB%A7%88%EC%9D%8C%EC%9D%84-%EB%B9%84%EC%9B%8C%EC%95%BC-%ED%95%A9%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Thu, 23 Sep 2021 15:20:09 GMT</pubDate>
            <description><![CDATA[<h1 id="3주차">3주차</h1>
<p><strong>[수업 목표]</strong></p>
<blockquote>
<ol>
<li>event listener를 사용할 수 있다.</li>
<li>React-router로 주소에 따라 다른 페이지를 보여줄 수 있다.</li>
<li>미리 정해놓은 주소가 아닐 때, &#39;앗! 잘못 찾아오셨어요!&#39; 페이지를 보여줄 수 있다.</li>
<li>Redux로 상태관리를 해보고 아래의 상태관리 흐름을 이해한다.
(기본 값이 있고 → 어떤 동작을 하면(&quot;어떤 동작을 하는 지 정하자! → 하면 뭐가 바뀌는 지 정하자!&quot; 과정이 사전에 필요하다!) → 값이 변했잖아? → 컴포넌트한테 알려주자!)</li>
<li>Redux hook을 사용해본다.</li>
</ol>
</blockquote>
<h2 id="1강---event-listner">1강 - Event Listner</h2>
<p>Event Listner 는 사용자가 어떤 행동을하는지 아닌지 지켜보다가 알려주는 것.</p>
<p>리액트에서 요소는 Ref로 잡는다. 후에 addEventListner를 추가한다.</p>
<p>Event listener를 추가해주는 것을 구독한다 라고 한다.</p>
<p>e.target &gt; 이벤트가 발생한 요소가 무엇인지 가지고 오는 것</p>
<blockquote>
<p>this.circle.current.addEventListener(1 - 어떤 이벤트, 2 - 어떤 행동을 할지)</p>
<p>this.circle.current.addEventListener(&quot;mouserover&quot;, this.hoverEvent) 마우스 오버시 hoverEvent 실행</p>
</blockquote>
<hr>
<h2 id="2강---라우팅">2강 - 라우팅</h2>
<p><strong>라우팅</strong> - 브라우저 주소에 따라 다른 페이지를 보여주는 것을 라우팅이라고 한다.</p>
<p>리액트는 SPA(Single Page Application)로 구성되어 있는데 이는 서버에서 주는 HTML이 1개 뿐인 어플리케이션을 말한다.</p>
<br>

<blockquote>
<p>하나만 주는 이유 중 제일 중요한 것은 사용성 때문인데
페이지를 이동할 때마다 서버에서 주는 html로 화면을 바꾸다보면 상태 유지가 어렵고, 바뀌지 않은 부분까지 새로 불러와 비효율적이다.</p>
</blockquote>
<br>

<blockquote>
<p>단점은 한 번만 정적자원(HTML, CSS, JS)를 받다보니 처음에 모든 컴포넌트를 받아오기 때문에 사용자가 사용하지 않을 페이지까지 전부 가지고 오고 이는 컴포넌트의 양에 따라 로딩 속도가 느려지게 된다. </p>
</blockquote>
<hr>
<h2 id="4강---리액트에서-라우팅-처리하기">4강 - 리액트에서 라우팅 처리하기</h2>
<p>path가 &quot;/&quot;와 &quot;/cat&quot;이 있다고 했을 때</p>
<p>&quot;/cat&quot;으로 들어가게 되면 &quot;/&quot;에 있는 컴포넌트들도 화면에 불러와지게 되는데
이는 &quot;/cat&quot;에도 슬래쉬( / )가 포함되어 있기 때문이다.</p>
<p>이를 막기 위해 속성 exact를 사용한다.  -&gt; 정확한 입력이 필요해서 중복된 값으로 라우팅 되는 것을 막을 수 있다.</p>
<p><strong>사용 예제)</strong></p>
<pre><code>&lt;Route path=&quot;/cat/:cat_name&quot; exact component={Cat}&gt;&lt;/Route&gt;</code></pre><h3 id="페이지-이동-방법">페이지 이동 방법</h3>
<p>1 - Link</p>
<p>링크를 임포트하고, to 다음 가고싶은 url 작성</p>
<pre><code>&lt;Link to=&quot;/&quot; exact&gt;Home으로&lt;/Link&gt;
&lt;Link to=&quot;/cat/cat_name&quot; exact&gt;Cat으로&lt;/Link&gt;
&lt;Link to=&quot;/Dog&quot;&gt;Dog으로&lt;/Link&gt;</code></pre><p>2 - History</p>
<p>useHistory 훅을 사용한다.</p>
<pre><code>import { useHistory } from &quot;react-router-dom&quot;;
const Dog = (props) =&gt; {
    const history = useHistory();
    console.log(history);
    return (
        &lt;div onClick={() =&gt; {
            history.push(&quot;/Cat&quot;);
        }}&gt;
            Dog화면 입니다!
        &lt;/div&gt;
    );
};</code></pre><hr>
<h2 id="6강---잘못된-주소-처리">6강 - 잘못된 주소 처리</h2>
<p>react-router-dom에서 제공해주는 Switch 를 사용</p>
<blockquote>
<p>👇 자세한 설명
(<a href="https://baeharam.netlify.app/posts/react/why-switch-is-needed">https://baeharam.netlify.app/posts/react/why-switch-is-needed</a>)</p>
</blockquote>
<hr>
<h2 id="7강---리덕스redux">7강 - 리덕스(Redux)</h2>
<blockquote>
<p>전역 데이터 저장소로 
하위 데이터에 데이터를 주려고 할 때 발생하는 props drilling을 막을 수 있다.</p>
<p>전역 데이터 저장소에서 바로 원하는 곳에 데이터를 주는게 가능하게 해주기 때문이다.</p>
</blockquote>
<h3 id="흐름">흐름</h3>
<blockquote>
<p>구독한 컴포넌트들이 수정 요청 &gt;&gt; 액션(디스패치) &gt;&gt; 리듀서 &gt;&gt; 스토어 수정 &gt;&gt; 다시 구독한 컴포넌트에 값을 내려줌</p>
</blockquote>
<hr>
<h2 id="8강">8강</h2>
<h3 id="리덕스의-특징">리덕스의 특징</h3>
<ul>
<li>store는 1개만 쓴다 </li>
<li>state는 action으로만 변경을 할 수 있다.</li>
<li>이전 상태는 수정하지 않고 변화를 준 새로운 객체를 return 해야한다.</li>
<li>파라미터(인자)가 같으면 항상 같은 값을 리턴해야 한다.(순수한 함수)</li>
</ul>
<hr>
<h2 id="10강---컴포넌트와-store-연결">10강 - 컴포넌트와 store 연결</h2>
<p>컴포넌트에 만들어둔 store를 주입한다. 라고 표현.</p>
<p>index.js 에서 임포트해온다.</p>
<blockquote>
<p>import {Provider} from &quot;react-redux&quot;;<br>
import store from &quot;./redux/configStore&quot;<br>
BrowserRouter와 같이 App을 <code>&lt;Provider&gt;</code>로 감싸준다.</p>
</blockquote>
<hr>
<h2 id="11강---컴포넌트에서-리덕스-데이터를-사용하는-방법">11강 - 컴포넌트에서 리덕스 데이터를 사용하는 방법</h2>
<p>리덕스 훅</p>
<blockquote>
<p>useDispatch는 데이터를 업데이트할 때,<br>
useSelector는 데이터를 가져올 때 사용.<br>
import {useDispatch, useSelector} from &quot;react-redux&quot;;</p>
</blockquote>
<hr>
<h2 id="어떤-페이지를-만들-때의-순서">어떤 페이지를 만들 때의 순서?</h2>
<p>뷰 - 라우터 - 기능</p>
<hr>
<h1 id="함수function-by-드림코딩-엘리">함수(function) (by. 드림코딩 엘리)</h1>
<blockquote>
<p>함수는 프로그램을 구성하는 기본적인 빌딩 블록</p>
<ul>
<li>서브 프로그램이라고도 불리며 여러번 재사용이 가능하다는 장점이 있다.</li>
<li>한가지의 태스크나 어떤 값을 계산하기 위해 사용한다.</li>
</ul>
</blockquote>
<h2 id="함수의-구조">함수의 구조</h2>
<blockquote>
<p>function 이름(인자1, 인자2..) { 기능, return }</p>
<ul>
<li>하나의 함수는 한 가지의 일만 하도록 만들어야 한다.</li>
<li>함수는 무언가를 동작하게 하는 것이기 때문에 동사형태로 이름을 지정</li>
<li>JS에서 함수는 오브젝트로 간주되기 때문에 변수에 할당 할 수 있고, 파라미터(인자)로 전달이 되고, 다른 함수를 리턴 할 수 있다.</li>
</ul>
</blockquote>
<h2 id="return">return</h2>
<blockquote>
<p>모든 함수엔 return이 들어가있는데 종종 없는 경우를 볼 수 있다.
이는 return undefined 이 들어가있는 것과 같고 이는 생략이 가능하다.</p>
</blockquote>
<h2 id="할당">할당</h2>
<blockquote>
<p>익명 함수(anonymous function)를 할당</p>
<pre><code>const print = function () {
   console.log(print)
}</code></pre><p>함수 호출
print(); &gt;&gt; 로그에 print</p>
<p>const printAgain = print;</p>
<p>printAgain(); &gt;&gt; 로그에 print</p>
</blockquote>
<h2 id="callback">Callback</h2>
<blockquote>
<p>어떤 상황이나 조건이 충족했을 때 호출되는 함수</p>
</blockquote>
<h2 id="화살표-함수-arrow-function">화살표 함수 (Arrow function)</h2>
<blockquote>
<p>함수를 간결하게 만들어줌 
<br>
항상 이름이 없는 익명함수</p>
</blockquote>
<p><strong>예제 1)</strong></p>
<pre><code>const simplePrint = function () {
    console.log(&#39;simplePrint&#39;);
};

    🔻🔻🔻🔻🔻🔻🔻🔻🔻

const simplePrint = () =&gt; console.log(&#39;simplePrint&#39;);</code></pre><p><strong>예제 2)</strong></p>
<pre><code>const add = function (a, b) {
    return a + b;
}
    🔻🔻🔻🔻🔻🔻🔻🔻🔻
const add = (a, b) =&gt; a + b;</code></pre><p><strong>중괄호</strong></p>
<pre><code>const A = () =&gt; {
    return console.log(&#39;A 입니다&#39;)
}</code></pre><p>중괄호가 있는 경우 return문이 없다면 값이 반환되지 않는다.</p>
<hr>
<h2 id="오늘의-느낀점">오늘의 느낀점</h2>
<ul>
<li><p>컴퓨터는 실수를 안한다.</p>
</li>
<li><p>모든 실수는 내가 한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.22]]></title>
            <link>https://velog.io/@2_juzzang/09.22</link>
            <guid>https://velog.io/@2_juzzang/09.22</guid>
            <pubDate>Wed, 22 Sep 2021 14:22:23 GMT</pubDate>
            <description><![CDATA[<h1 id="11강---state-관리">11강 - State 관리</h1>
<p>단방향 데이터 흐름</p>
<pre><code>부모 컴포넌트에서 자식 컴포넌트로 데이터를 넘겨주는 것</code></pre><p>왜 단방향을 쓰는가?</p>
<pre><code>양방향일 경우, 자식 데이터가 부모 데이터에 영향을 주면 부모 데이터는 리렌더링이 일어나고 
부모 데이터가 리렌더링이 됐으므로 자식 데이터 역시 렌더링이 일어난다. 그럼 또 다시 부모 데이터에 영향을 줘 리렌더링 &gt; 자식 렌더링 &gt; 부모 렌더링 &gt; 자식 ... 무한 루프에 빠지기 때문에 단방향을 사용한다.</code></pre><h2 id="클래스형-컴포넌트에서-state-다루기">클래스형 컴포넌트에서 State 다루기</h2>
<pre><code>가상돔, 실제돔을 비교할 때 비교를 해서 바뀐 부분이 한 번에 올라가는데,
비교를 하기 위해서는 값이 필요한데 그 값이 &#39;key&#39;이다.
각 요소마다 key라는 내용이 자동으로 들어가는데 이는 Elements 탭에서는 확인이 불가능하다. 

 =&gt; 실제 돔에 들어가는 속성이 아니기 때문</code></pre><hr>
<h1 id="생활코딩-리액트">생활코딩 리액트</h1>
<p> 컴포넌트는 반드시 하나의 최상위 태그가 필요하다.</p>
<pre><code>Props는 사용자가 컴포넌트를 사용하는 입장에서 중요하고

State는 props의 값에 따라 내부의 구현에 필요한 데이터들이라고 생각하자.</code></pre><p>어떤 컴포넌트가 실행될 때 render보다 먼저 실행되면서 그 컴포넌트를 <strong><em>초기화</em></strong> 시켜주고 싶은 코드는 <strong><em>constructor</em></strong> 안에 코드를 작성한다.</p>
<pre><code>class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      content:{Title:&quot;기본 제목&quot;, sub:&quot;기본 내용&quot;}
    }
  }
  render() {
    return(
      &lt;div className=&quot;App&quot;&gt;
      &lt;Content Title={this.state.content.Title} Sub={this.state.content.sub}/&gt;
      &lt;/div&gt;
    );
  }
}</code></pre><pre><code>리액트에서는 Props의 값이나 State의 값이 바뀌면 state를 가지고 있는 컴포넌트의 렌더 함수가 다시 호출되면서 렌더 함수 하위의 컴포넌트들도 리렌더링 된다.(화면이 다시 그려진다.)</code></pre><p>온클릭 이벤트</p>
<pre><code>다른점
JS
onclick=&quot;function&quot;
React
onClick={function(){}}</code></pre><p><strong><em>debugger;</em></strong></p>
<pre><code>개발자 도구 창에서 debugger 코드를 만나면 실행을 멈춘다. &gt; sources 에서 확인 가능</code></pre><h2 id="bind"><strong><em>bind()</em></strong></h2>
<pre><code>const obj = {name:&#39;jihoon&#39;};
function bindTest(){
    console.log(this.name);
} &gt;&gt; 로그의 결과는 undefined

여기서 
bindTest.bind(obj); 바인드 함수를 사용하면 this의 값이 ()안의 값이 된다. 여기선 obj가 되겠다.</code></pre><hr>
<pre><code>컴포넌트 밖에서 props를 수정하는 것은 가능하다.

컴포넌트 안(render 이하)에서 props를 수정하려면 이벤트(setState)를 통해 props의 state를 바꿔주면서 props를 수정해야한다.</code></pre><pre><code>this.state.mode = &#39;welcome&#39; X
ㄹ
컴포넌트의 생성이 완료된 후 동적으로 state 값을 바꾸고 싶다면 setState를 사용한다.

this.setState({ mode:&#39;welcome&#39; }); O</code></pre><hr>
<h2 id="리덕스redux"><strong><em>리덕스(Redux)</em></strong></h2>
<pre><code>데이터를 저장소에 저장해뒀다가 저장소의 값이 바뀌면 관련된 모든 컴포넌트가 알아서 바뀌게 하는 것.</code></pre><h2 id="concat"><strong><em>concat()</em></strong></h2>
<pre><code>let a = [1, 2] 
a.concat(3)
a = [1, 2]  &gt;&gt; 값이 담기지 않음

let a = [1, 2]
let b = a.concat(3)
b = [1,2,3] &gt;&gt; 새로운 변수에 담으면 값이 담긴다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[09.21 ]]></title>
            <link>https://velog.io/@2_juzzang/09.21-7cv3r64e</link>
            <guid>https://velog.io/@2_juzzang/09.21-7cv3r64e</guid>
            <pubDate>Wed, 22 Sep 2021 14:17:28 GMT</pubDate>
            <description><![CDATA[<h1 id="리액트-2주차">리액트 2주차</h1>
<blockquote>
<p>리액트의 동작 방식에 대해 배운다</p>
</blockquote>
<h2 id="컴포넌트">컴포넌트</h2>
<blockquote>
<p>리액트는 조각 조각들을 모아서 웹페이지 하나를 완성하는데 이 조각 조각들을 컴포넌트(Component)라고 부른다.</p>
</blockquote>
<h2 id="라이프-사이클이란">라이프 사이클이란?</h2>
<blockquote>
<p>컴포넌트가 렌더링을 준비하는 순간부터, 페이지에서 사라질 때까지를 말한다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/2_juzzang/post/6aa5d7a2-03a3-44d4-847e-321fef79e092/%EB%9D%BC%EC%9D%B4%ED%94%84%20%EC%82%AC%EC%9D%B4%ED%81%B4.PNG" alt="Life cycle"></p>
<p><strong>라이프 사이클은 크게 생성 / 수정 / 삭제 로 나뉜다.</strong></p>
<p><strong>수정되는 경우들</strong></p>
<ul>
<li>컴포넌트 자신의 데이터state가 바뀌었을 때</li>
<li>부모가 나한테 주는 데이터 props가 바뀌었을 때</li>
<li>부모가 리렌더링 되었을 때</li>
<li>강제 업데이트를 일으켰을 때 </li>
</ul>
<h2 id="가상돔">가상돔</h2>
<p><strong><em>👉 DOM</em></strong> : HTML 단위 하나하나를 객체로 생각하는, 트리구조를 갖고 있는 모델</p>
<p><strong>왜 쓰는가?</strong></p>
<blockquote>
<p>OM트리 중 하나가 수정될 때마다 DOM을 찾고, 수정하고를 하게되면 필요없는 연산이 너무 많이 일어나기 때문에 이를 막기위해 사용</p>
</blockquote>
<p><strong>동작방식</strong></p>
<blockquote>
<p>모리에 가상DOM에 변경사항을 전부 다 넣고 진짜 DOM과 비교하여 바뀐 부분만을 변경해준다. 
=&gt; 이 때 render가 진행된다.</p>
</blockquote>
<p><strong>진짜 DOM은 페이지에 처음 진입했을 때와 가상돔을 이용해 데이터가 변경 될 때 나타난다.</strong></p>
<hr>
<h1 id="2강">2강</h1>
<p>클래스형 컴포넌트 함수형 컴포넌트가 있다.</p>
<blockquote>
<p>2019년 v16.8 부터 함수형 컴포넌트에 리액트 훅(hook)을 지원해 주어서 현재는 공식 문서에서 함수형 컴포넌트와 훅을 함께 사용할 것을 권장하고 있다. </p>
</blockquote>
<h3 id="근데-왜-클래스형-컴포넌트를-배우는가">근데 왜 클래스형 컴포넌트를 배우는가?</h3>
<blockquote>
<p>여기선 클래스형 컴포넌트를 알아듣고 수정할 수 있을 정도로 알아두기 위해 배운다.
라이프 사이클 함수는 클래스형 컴포넌트에서만 사용할 수 있다.</p>
</blockquote>
<blockquote>
<p>어떤 것(요소)이 바뀌느냐는 render의 return에 포함되어 있다.
이 요소들이 가상돔에서 실제 돔으로 올라가면 수정(업데이트)가 완료된 것</p>
</blockquote>
<hr>
<h1 id="3강">3강</h1>
<h2 id="컴포넌트-component">컴포넌트 (Component)</h2>
<p>리액트는 컴포넌트를 잘 나누는 것도, 잘 쌓아올리는 것도 중요하다.</p>
<p>컴포넌트가 쓰는 데이터 Props, State</p>
<h3 id="props">Props</h3>
<ul>
<li>부모로부터 받아온 데이터
A라는 부모와 B라는 자식이 있다.
A가 B에게 데이터를 주면 이 데이터는 B에게 props가 되는 것
props는 수정이 불가능하다.</li>
</ul>
<h3 id="state">State</h3>
<ul>
<li>내 데이터, 컴포넌트 자체의 데이터</li>
<li>수정, 생성이 자유롭다.</li>
</ul>
<hr>
<h1 id="4강">4강</h1>
<h2 id="export와-import">export와 import</h2>
<blockquote>
<p>export default의 경우 중괄호가 필요 없지만
그냥 export만 쓸 경우엔 중괄호가 필요하다
export {BucketList}; </p>
</blockquote>
<p>import {BucketList} from &quot;./BucketList&quot;
export default BucketList;
import BucketList from &#39;./BucketList&#39;;</p>
<hr>
<h1 id="5강">5강</h1>
<h2 id="함수형-컴포넌트를-클래스형-컴포넌트로-바꾸기">함수형 컴포넌트를 클래스형 컴포넌트로 바꾸기</h2>
<blockquote>
<p>// 클래스형 컴포넌트
class App extends React.Component{
  // 초기화 해 줄 초기화 함수가 필요, 생성자
  constructor(props){
    super(props);
    this.state = {
      list: [&quot;영화관 가기&quot;, &quot;강의 듣기&quot;, &quot;카페 가기&quot;],
    }
  }</p>
</blockquote>
<p>  // 돔에 표현되기 위해서 render를 만들어준다. JSX에선 1개 이상의 리턴 값이 필수
  render () {
    console.log(this.state.list)
    return (
      <div className="App">
        {/* 자바스크립트 변수는 중괄호를 사용 <em>/}
        &lt;BucketList list={this.state.list} /</em> &lt;= props명과 넘겨줄 데이터 *//&gt;
      </div>
    )
  }
}</p>
<blockquote>
<p>// 함수형 컴포넌트
 function App() {
   return (
     <div className="App">
       <BucketList/>
     </div>
   );
 }</p>
</blockquote>
<pre><code>
---

# 7강

## React에서 CSS 사용하기

**마진 병합 상쇄 현상**
&gt;자식 요소가 display: block; 값을 가지고 있을 때 이 요소의 margin이 부모 요소의 margin처럼 보여지는 현상을 마진 병합 상쇄 현상이라고 한다. 
이 때 부모 요소를 display: block이 아니게 두면 된다.


**height: vh;** &gt; 화면 비를 기준으로 높이를 설정하는 값이다.

**width: vw;** &gt; 화면 비를 기준으로 넓이를 설정하는 값이다.

**display: flex;** &gt; flex를 먹인 요소의 **자식 요소**가 자기가 갖고 있는 컨텐츠의 사이즈 만큼만 차지한다.

---

# 8강

## styled-component 패키지 문법 익히기
&gt;// 첫 글자는 대문자로
const MyStyled = styled.div`
 width: 50vw;
 min-height: 150px;
 background-color: ${(props) =&gt; (props.bg_color)} `;
&gt;
백틱 (``) 안에서 ${} 사용할 수 있음 

&gt;${(props) =&gt; (props.bg_color)}
위 아래 같은 기능
${(props) =&gt; {
    return props.bg_color;
  }}  
&gt;
삼항 연산자 사용가능
${(props) =&gt; (props.bg_color? &quot;red&quot; : &quot;purple&quot;)}

---

# 10강 - 리액트에서 돔요소 가져오기

## 다시 한 번 듣기
&gt;getElementById 와 appendChild는 진짜 DOM을 건드린다. 
이 때 가상돔에는 있지만 실제돔에 없는 경우라면 당연히 에러가 뜨는데 그래서 DOM요소를 가져올 때 사용하는 것이 Ref

&gt;Ref는 &#39;이름표&#39;라고 생각

&gt;함수형 컴포넌트에선 라이플 사이클 메서드를 쓸 수 없어서 리액트 훅을 사용한다.
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[09.20 ]]></title>
            <link>https://velog.io/@2_juzzang/09.20-pfjv5fzl</link>
            <guid>https://velog.io/@2_juzzang/09.20-pfjv5fzl</guid>
            <pubDate>Wed, 22 Sep 2021 14:16:58 GMT</pubDate>
            <description><![CDATA[<h3 id="항해-리액트-1주차">항해 리액트 1주차</h3>
<p>HTML CSS Javascript &gt;&gt; <strong>정적자원</strong>이라고 부른다.</p>
<blockquote>
<p>웹의 동작방식은 간단하게 말하면
<strong>클라이언트</strong>는 서버에 <strong>요청</strong>을  <strong>서버</strong>는 클라이언트에게 <strong>응답</strong>을 하는 것</p>
</blockquote>
<blockquote>
<pre><code></code></pre></blockquote>
<div>안녕하세요</div>   요소(Elements)
<div></div>            태그(Tag)
```

<blockquote>
<p><strong>DOM(Document Object Model) 문서객체모델</strong> 
DOM은 html 단위 하나하나를 객체로 생각하는 모델이다. 예를 들면, &#39;div&#39;라는 객체는 텍스트 노드, 자식 노드 등등, 하위의 어떤 값을 가지고 있는데 이런 구조를 트리 구조라고 한다. DOM도 트리 구조이다.</p>
</blockquote>
<blockquote>
<p><strong>CamelCase</strong>
이름을 짓는 경우 띄어쓰기가 필요한 곳에 띄어쓰기 대신 대문자를 넣는데
이게 낙타 등 같다고해서 지어진 이름이라고 한다.
<del>귀여워</del></p>
</blockquote>
<blockquote>
<p>변수 선언은 <strong>let, const</strong>로 한다.
let은 재할당이 가능하다.
하지만 const는 재할당이 불가능하다. &gt;&gt; 변수가 아닌 상수</p>
<p><strong>스코프(Scope)</strong>가 뭘까?
우리가 어떤 변수를 선언했을 때, 그 <strong>변수를 사용할 수 있는 유효범위</strong>를 스코프라고 한다.
var는 <strong>함수</strong> 단위
let, const는 <strong>block</strong> 단위
{} 증괄호 안에 든 내용을 <strong>block</strong>이라고 표현한다.</p>
</blockquote>
<pre><code class="language-jsx">function scope(){
    const a = 0;
    let b = 0;
    var c = 0;
  &gt;
    if(a === 0){
        const a = 1;
        let b = 1;
        var c = 1;
        console.log(a, b, c);
    }
    // 앗! c는 값이 변했죠? 
    // 그렇습니다. var는 함수 단위라서 if문 밖에서 선언한 값이 변했어요.
    // let과 const로 선언한 겂은 어떤가요? if문 안쪽 내용이 바깥 내용에 영향을 끼치지 않죠?
    console.log(a, b, c);
}</code></pre>
<p>함수 표현식 :</p>
<pre><code>    // 함수 이름은 생략해도 괜찮아요!
    let do_something = function [함수 이름]() { ... }</code></pre><h2 id="화살표-함수--함수-표현식의-단축형"><strong>화살표 함수 &gt;&gt; 함수 표현식의 단축형</strong>!</h2>
<pre><code>    // 화살표 함수는 함수 표현식의 단축형입니다.
    // function까지 생력이 되었죠!
    let do_something = () =&gt; { ... }</code></pre><blockquote>
<p>*<em>Spread 문법 *</em>
어떤 객체 안에 있는 요소들을 객체 바깥으로 꺼내는 문법
let array = [1, 2, 3, 4, 5];
... &lt;&lt; 스프레드 문법 
[...array]는 새로운 [ ]객체 안에 요소들을 넣어주는게 되겠다.</p>
</blockquote>
<h2 id="삼항-연산자">삼항 연산자</h2>
<p><strong>if문의 단축형태!</strong></p>
<blockquote>
<pre><code>let is = 5
let e = is === 5? 3: 4;</code></pre></blockquote>
<pre><code>물음표 앞 까지는 조건이 들어간다. &gt;&gt; 만약 is === 5 라면
콜론 앞은 참일 때의 값 세미 콜론 앞의 값은 거짓일 때의 값으로 여기선 참이므로 3이 출력된다.

## Array 내장함수

### map
&gt;**원본 배열을 유지하면서 변환시켜 새로운 배열을 만들어낸다.**

![](https://images.velog.io/images/2_juzzang/post/0b27ae3e-ba07-40d2-a5ca-4d471d8164da/map.PNG)


### filter
&gt;**어떤 조건을 만족하는 항목들만 골라서 새로운 배열을 만들어내지만 요소 자체를 변경할 수는 없다.**


### concat
&gt;**배열들을 합칠 때 사용한다. 단, 중복 요소를 제거해주진 않는다.**
&gt;```
ex) 
const dogs = [&quot;검은 강아지&quot;, &quot;노란 강아지&quot;, &quot;흰 강아지&quot;];
const cats = [&quot;검은 고양이&quot;, &quot;복슬 고양이&quot;, &quot;노란 고양이&quot;];
const pets = dogs.concat(cats);
&gt;
console.log(pets) = [&#39;검은 강아지&#39;, &#39;노란 강아지&#39;, &#39;흰 강아지&#39;, &#39;검은 고양이&#39;, &#39;복슬 고양이&#39;, &#39;노란 고양이&#39;]</code></pre><h3 id="from">from</h3>
<blockquote>
<p><strong>1. 배열로 만들고자 하는 것이나 유사배열을 복사해서 새로운 배열로 만들 때
 2. 새로운 배열을 만들 때 (초기화)</strong></p>
</blockquote>
<p>유사배열이 뭘까?
[ 어떤 값들... ] 이 모양으로 생겼지만 배열의 내장 함수를 사용하지 못하는 친구들입니다. DOM nodelist같은 게 유사배열이에요.**</p>
<blockquote>
<br>

<pre><code>//배열화
    const my_name = &#39;hoon&#39;
    const my_name_array = Array.from(my_name);
    my_name_array = [&quot;h&quot;, &quot;o&quot;, &quot;o&quot;, &quot;n&quot;] 

// 길이가 문자열과 같고, 0부터 4까지 숫자를 요소로 갖는 배열을 만들어볼거예요. 
    const text_array = Array.from(&#39;hello&#39;, (item, idx) =&gt; {return idx});
    console.log(text_array);

</code></pre></blockquote>
<p>// 새 배열을 만들어 보자!(=&gt; 빈 배열을 초기화한다고도 해요.)
// 길이가 4고, 0부터 3까지 숫자를 요소로 갖는 배열을 만들어볼거예요. 
    const new_array = Array.from({length: 4}, (item, idx)=&gt;{ return idx;});
    console.log(new_array);       </p>
<p>```</p>
<h2 id="jsx">JSX</h2>
<p><strong>Javscript + XML</strong></p>
<blockquote>
</blockquote>
<p><strong>JSX 문법을 사용해서 React 요소를 만들고 DOM에 렌더링 시켜서</strong> 뷰를 그린다.
뷰를 그리는 요소들이 자바스크립트 파일에 들어간다.
리액트는 HTML파일이 하나만 있다.</p>
<h3 id="리액트-규칙">리액트 규칙</h3>
<blockquote>
<ol>
<li>태그는 꼭 닫아주기</li>
<li>무조건 1개의 엘리먼트를 반환하기</li>
<li>JSX에서 javascript 값을 가져오려면?</li>
<li>class 대신 className! id는 그대로 id</li>
<li>인라인으로 style 주기 , 스타일은 딕셔너리로 넘겨줘야 한다. {키:밸류}</li>
</ol>
</blockquote>
<p>return에서 if문을 사용할 수 없으므로 대신 삼항연산자를 사용,</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.20]]></title>
            <link>https://velog.io/@2_juzzang/09.20</link>
            <guid>https://velog.io/@2_juzzang/09.20</guid>
            <pubDate>Mon, 20 Sep 2021 15:20:45 GMT</pubDate>
            <description><![CDATA[<h3 id="항해-리액트-1주차">항해 리액트 1주차</h3>
<p>HTML CSS Javascript &gt;&gt; <strong>정적자원</strong>이라고 부른다.</p>
<blockquote>
<p>웹의 동작방식은 간단하게 말하면
<strong>클라이언트</strong>는 서버에 <strong>요청</strong>을  <strong>서버</strong>는 클라이언트에게 <strong>응답</strong>을 하는 것</p>
</blockquote>
<blockquote>
<pre><code></code></pre></blockquote>
<div>안녕하세요</div>   요소(Elements)
<div></div>            태그(Tag)
```

<blockquote>
<p><strong>DOM(Document Object Model) 문서객체모델</strong> 
DOM은 html 단위 하나하나를 객체로 생각하는 모델이다. 예를 들면, &#39;div&#39;라는 객체는 텍스트 노드, 자식 노드 등등, 하위의 어떤 값을 가지고 있는데 이런 구조를 트리 구조라고 한다. DOM도 트리 구조이다.</p>
</blockquote>
<blockquote>
<p><strong>CamelCase</strong>
이름을 짓는 경우 띄어쓰기가 필요한 곳에 띄어쓰기 대신 대문자를 넣는데
이게 낙타 등 같다고해서 지어진 이름이라고 한다.
<del>귀여워</del></p>
</blockquote>
<blockquote>
<p>변수 선언은 <strong>let, const</strong>로 한다.
let은 재할당이 가능하다.
하지만 const는 재할당이 불가능하다. &gt;&gt; 변수가 아닌 상수</p>
<p><strong>스코프(Scope)</strong>가 뭘까?
우리가 어떤 변수를 선언했을 때, 그 <strong>변수를 사용할 수 있는 유효범위</strong>를 스코프라고 한다.
var는 <strong>함수</strong> 단위
let, const는 <strong>block</strong> 단위
{} 증괄호 안에 든 내용을 <strong>block</strong>이라고 표현한다.</p>
</blockquote>
<pre><code class="language-jsx">function scope(){
    const a = 0;
    let b = 0;
    var c = 0;
  &gt;
    if(a === 0){
        const a = 1;
        let b = 1;
        var c = 1;
        console.log(a, b, c);
    }
    // 앗! c는 값이 변했죠? 
    // 그렇습니다. var는 함수 단위라서 if문 밖에서 선언한 값이 변했어요.
    // let과 const로 선언한 겂은 어떤가요? if문 안쪽 내용이 바깥 내용에 영향을 끼치지 않죠?
    console.log(a, b, c);
}</code></pre>
<p>함수 표현식 :</p>
<pre><code>    // 함수 이름은 생략해도 괜찮아요!
    let do_something = function [함수 이름]() { ... }</code></pre><h2 id="화살표-함수--함수-표현식의-단축형"><strong>화살표 함수 &gt;&gt; 함수 표현식의 단축형</strong>!</h2>
<pre><code>    // 화살표 함수는 함수 표현식의 단축형입니다.
    // function까지 생력이 되었죠!
    let do_something = () =&gt; { ... }</code></pre><blockquote>
<p>*<em>Spread 문법 *</em>
어떤 객체 안에 있는 요소들을 객체 바깥으로 꺼내는 문법
let array = [1, 2, 3, 4, 5];
... &lt;&lt; 스프레드 문법 
[...array]는 새로운 [ ]객체 안에 요소들을 넣어주는게 되겠다.</p>
</blockquote>
<h2 id="삼항-연산자">삼항 연산자</h2>
<p><strong>if문의 단축형태!</strong></p>
<blockquote>
<pre><code>let is = 5
let e = is === 5? 3: 4;</code></pre></blockquote>
<pre><code>물음표 앞 까지는 조건이 들어간다. &gt;&gt; 만약 is === 5 라면
콜론 앞은 참일 때의 값 세미 콜론 앞의 값은 거짓일 때의 값으로 여기선 참이므로 3이 출력된다.

## Array 내장함수

### map
&gt;**원본 배열을 유지하면서 변환시켜 새로운 배열을 만들어낸다.**

![](https://images.velog.io/images/2_juzzang/post/0b27ae3e-ba07-40d2-a5ca-4d471d8164da/map.PNG)


### filter
&gt;**어떤 조건을 만족하는 항목들만 골라서 새로운 배열을 만들어내지만 요소 자체를 변경할 수는 없다.**


### concat
&gt;**배열들을 합칠 때 사용한다. 단, 중복 요소를 제거해주진 않는다.**
&gt;```
ex) 
const dogs = [&quot;검은 강아지&quot;, &quot;노란 강아지&quot;, &quot;흰 강아지&quot;];
const cats = [&quot;검은 고양이&quot;, &quot;복슬 고양이&quot;, &quot;노란 고양이&quot;];
const pets = dogs.concat(cats);
&gt;
console.log(pets) = [&#39;검은 강아지&#39;, &#39;노란 강아지&#39;, &#39;흰 강아지&#39;, &#39;검은 고양이&#39;, &#39;복슬 고양이&#39;, &#39;노란 고양이&#39;]</code></pre><h3 id="from">from</h3>
<blockquote>
<p><strong>1. 배열로 만들고자 하는 것이나 유사배열을 복사해서 새로운 배열로 만들 때
 2. 새로운 배열을 만들 때 (초기화)</strong></p>
</blockquote>
<p>유사배열이 뭘까?
[ 어떤 값들... ] 이 모양으로 생겼지만 배열의 내장 함수를 사용하지 못하는 친구들입니다. DOM nodelist같은 게 유사배열이에요.**</p>
<blockquote>
<br>

<pre><code>//배열화
    const my_name = &#39;hoon&#39;
    const my_name_array = Array.from(my_name);
    my_name_array = [&quot;h&quot;, &quot;o&quot;, &quot;o&quot;, &quot;n&quot;] 

// 길이가 문자열과 같고, 0부터 4까지 숫자를 요소로 갖는 배열을 만들어볼거예요. 
    const text_array = Array.from(&#39;hello&#39;, (item, idx) =&gt; {return idx});
    console.log(text_array);

</code></pre></blockquote>
<p>// 새 배열을 만들어 보자!(=&gt; 빈 배열을 초기화한다고도 해요.)
// 길이가 4고, 0부터 3까지 숫자를 요소로 갖는 배열을 만들어볼거예요. 
    const new_array = Array.from({length: 4}, (item, idx)=&gt;{ return idx;});
    console.log(new_array);       </p>
<pre><code>
## JSX 
**Javscript + XML**
&gt; 
**JSX 문법을 사용해서 React 요소를 만들고 DOM에 렌더링 시켜서** 뷰를 그린다.
뷰를 그리는 요소들이 자바스크립트 파일에 들어간다.
리액트는 HTML파일이 하나만 있다.

### 리액트 규칙
&gt;1. 태그는 꼭 닫아주기
2. 무조건 1개의 엘리먼트를 반환하기
3. JSX에서 javascript 값을 가져오려면?
4. class 대신 className! id는 그대로 id
5. 인라인으로 style 주기 , 스타일은 딕셔너리로 넘겨줘야 한다. {키:밸류}

return에서 if문을 사용할 수 없으므로 대신 삼항연산자를 사용,









</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[09.18 1주차 회고록]]></title>
            <link>https://velog.io/@2_juzzang/1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@2_juzzang/1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sat, 18 Sep 2021 17:58:05 GMT</pubDate>
            <description><![CDATA[<h2 id="1주차-프로젝트가-끝났다">1주차 프로젝트가 끝났다.</h2>
<p>사람들이랑 밤 새워가며 코딩을 하는게 요리대회를 나갔을 때랑 비슷해서 학부생 때의 기억이 떠올라 좋았다. <del>학생으로 돌아간 느낌이 들었다는거지..</del></p>
<p>같은 시간, 다른 결과물을 보고 잘 하시는 분들이 정말 많으면서 동시에 많이 부족했음을 느꼈다.<br>그리고 정말 좋은 분들이 많이 계시는 걸 다시금 느낄 수 있었다.</p>
<hr>
<h2 id="완성-결과물--보고-또-보고"><a href="http://team22book.shop/">완성 결과물 : 보고 또 보고</a></h2>
<p>시간 안에 낼 수 있을 것이다. 라는 기대와는 달리 제출 시간을 넘겼다는게 아쉬웠다.
왜 이렇게 늦어졌을까 생각을 해봤다.</p>
<blockquote>
<p>*<em>1. 깃을 써봤다고 처음부터 알려드렸던게 오히려 시간을 잡아먹지 않았나 생각이 든다. *</em>
5일의 시간 중 따져보면 깃으로 허비한 시간이 많았던 것 같다.
나도 잘 아는게 아닌데 팀원들한테 알려주고 에러가 나면 내가 고치는 상황이 반복됐고 이게 누적되어 팀 프로젝트에 영향을 미쳤으리라 생각된다.
오히려 진자로 템플릿을 나눈 시점부터 깃을 썼으면 어땠을까 싶다.</p>
</blockquote>
<blockquote>
<p><strong>2. 역할 분배에 실패했다.</strong>
와이어 프레임을 짜고 역할을 분배하는데 있어서 어떻게 나누면 좋을지를 몰랐다.
결국 필수 기능 2개를 2명씩 나누는 걸로 했는데 역시 크게 나누는 것보다 조금 더 세세하게 나눴으면 좋았을 것 같다.
<del>하지만.. 난 몰랐는걸..</del></p>
</blockquote>
<h3 id="jinja2">jinja2</h3>
<p>진자는 이번이 두번째로 써보는 기회였다.
템플릿을 나누면서 직접 코드를 넣어보니 어떻게 구성이 되는지 이해가 잘 됐다.
역시 백문이 불여일견, 백견이 불여일행 ㅎㅎ..</p>
<blockquote>
<ul>
<li>Jinja 템플릿은 Python Flask 패키지에 내장된 Template 엔진으로 동적으로 변하는 웹페이지를 쉽게 구현할 수 있도록 도와주고.</li>
</ul>
</blockquote>
<ul>
<li>고정적으로 출력되어야 할 서식 html 코드가 존재하고 동적으로 변해야할 자리는 Jinja2 문법으로 비워둔다. &gt;&gt; <em>이 부분에서 틀이 있고 재료를 넣어 만들어 간다고 느낀 것 같다.</em></li>
<li>html 안에서 파이썬 코드를 작성할 수 있도록 해준다.</li>
</ul>
<p>써보면서 느낀 것은 뭔가 도자기 틀이 있고 거기에 재료를 넣어 만들어 나가는 느낌이었다.
<a href="https://frhyme.github.io/python-libs/jinja_basic/">상세한 사용방법은 여기</a></p>
<hr>
<h3 id="계속-매달렸던-회원가입-문제">계속 매달렸던 회원가입 문제</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/9851c5ee-b8c8-47c8-b818-ad0860e72443/9.18%201.PNG" alt="">
<img src="https://images.velog.io/images/2_juzzang/post/eb2239cf-599e-420b-98a0-735a004a54cd/9.18%202.PNG" alt=""></p>
<blockquote>
<p>결론은 render_template에도 메서드를 걸어줘도 된다고 한다.. 
지금까지 보고 배운 것 중에서 메서드를 쓴 것을 본 적이 없었어서 당연히 쓰면 안되겠지 했는데 쓰고나서 에러가 발생하지 않으니 써도 되나..? 라고 의문을 가졌지 확신은 못했다.
결국 멘토분께 여쭤봤는데 써도 되는 거라고 하셔서 안도했다.😄</p>
</blockquote>
<br>

<h2 id="jwt를-이용한-로그인😂">JWT를 이용한 로그인😂</h2>
<p>웹 페이지에 로그인을 할 때 서버에선 내가 로그인을 하고 있다는 사실을 알고 있어야한다.</p>
<blockquote>
<p><strong>인증 Authentication</strong>
내가 이 사이트에 가입된 회원임을, 즉 특정 서비스에 일정 권한이 주어진 사용자임을 아이디와 패스워드를 통해 인증을 받는 것
<strong>인가 Authorization(권한부여)</strong>
인증을 받은 사용자가 이후 서비스 기능들을 사용할 때. 서비스 제공자가 (인증을 통해)이를 알아보고 기능을 사용할 수 있게 허가를 해주는 것</p>
</blockquote>
<p><strong>JWT</strong>(JSON Web Token)는 <strong>인가(Authorization)</strong>에 연관된 기술이다.</p>
<p><img src="https://images.velog.io/images/2_juzzang/post/9c37136f-cd1c-4bd6-b153-5b0bca64fdcf/1%EC%A3%BC%EC%B0%A8%20JWT.PNG" alt=""></p>
<p>. 을 기준으로 세 부분으로 구분이 되는데,
차례대로 각각 header, payload, verifysignature(서명)로 구분된다.</p>
<blockquote>
<p><strong>header</strong> : 타입과 알고리즘으로 구성되어 있다. 타입 &#39;JWT&#39;는 고정값이고 알고리즘은 3번 서명값을 만드는데 사용 될 알고리즘이 지정된다. HS256 등 여러 암호화 방식 중 하나를 지정할 수 있다. <strong>JWT를 어떻게 검증하는가에 대한 내용을 담고 있다.</strong>
여기서 1번 헤더와 2번 페이로드, 서버에 감춰놓은 비밀 값 이 셋을 암호화 알고리즘에 넣고 돌리면 3번 서명값이 나오는 것이다.</p>
</blockquote>
<p><strong>payload</strong> : 이 토큰을 누가 누구에게 발급했는지, 언제까지 유효한지 등 서비스는 사용자에게 토큰을 통해 공개하기 원하는 내용을 서비스 측에서 원하는대로 담을 수 있다.
이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 한다.</p>
<blockquote>
<p><strong>verify signature</strong> :  헤더와 페이로드를 합친 문자열을 서명한 값이다. 서명은 헤더의 alg에 정의된 알고리즘과 비밀 키를 이용해 성성하고 Base64 URL-Safe로 인코딩한다.</p>
</blockquote>
<hr>
<p><strong>이 셋을 합치면 JWT가 완성된다.</strong></p>
<blockquote>
</blockquote>
<blockquote>
<p><strong>장점</strong> : 서버측 부하를 낮출 수 있고 능률적인 접근 권한 관리를 할 수 있다.</p>
</blockquote>
<p><strong>단점</strong> : 서버에는 토큰을 보낸 사용자에 대한 정보가 없기 때문에 토큰이 탈취당한 경우 무효화 할 방법이 없다. </p>
<hr>
<p>처음부터 로그인에 매달릴걸.. 코드를 붙여 넣은 것인데도 에러 때문에 꽤 오랜 시간이 걸렸다. 
에러 메세지를 검색하고 시도해봐도 해결을 못 하고 제출 시간을 넘겼고 결국 주변 분들이 도와주셔서 해결 할 수 있었다.</p>
<blockquote>
<p>디버그 모드를 적극 활용하기 -&gt; 코드 하나하나 문제가 있는지 찍어볼 수 있었다.</p>
</blockquote>
<br>

<h2 id="api-😀">API 😀</h2>
<h3 id="보다-쉽게-정리되어-있는-api-설명서"><a href="https://dev-dain.tistory.com/50">보다 쉽게 정리되어 있는 API 설명서</a></h3>
<p>이번 프로젝트에서 API를 GET과 POST 방식으로만 구성했는데 이 외에도 더 있다는 것을 알게됐고,
사전 강의를 들으면서 모호했던 API 코드 부분을 계속 보고 어떤 순서로 작동이 되고 코드를 직접 짜보면서 이해가 좀 된 것 같다.
하지만 api에 대한 정의 부분은 잘 모르고 있던 터라 찾아보게 되었다.</p>
<blockquote>
<p>현재 이해한 바로는 POST는 데이터를 수정하고 보낼 때 즉, 데이터에 변화를 줄 때 쓰는 것.
GET은 서버에서 가져온 데이터를 보기 위해 사용한다고 느꼈다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.16 결국 터진 Git과 오늘의 이슈]]></title>
            <link>https://velog.io/@2_juzzang/09.16-%EA%B2%B0%EA%B5%AD-%ED%84%B0%EC%A7%84-Git</link>
            <guid>https://velog.io/@2_juzzang/09.16-%EA%B2%B0%EA%B5%AD-%ED%84%B0%EC%A7%84-Git</guid>
            <pubDate>Thu, 16 Sep 2021 16:20:25 GMT</pubDate>
            <description><![CDATA[<h3 id="😂-git-이슈">😂 Git 이슈</h3>
<p>어제와 오늘 원격 db에 크롤링한 데이터들을 저장하려다가 시간을 다 쓴 것 같다.
계속 시간을 투자할 순 없어서 후순위로 순서를 미루고 api 연동을 했다.
모호하게 알고있던 api 통신에 대해 익힐 수 있어 좋은 경험이었다.</p>
<p>api가 무엇인지 어떻게 돌아가는건지를 찾아보고 해야되는데 그럴 시간이 없어서 주말을 이용해 찾아보기로 다짐한다.</p>
<p>프로젝트 중간에 gitignore를 만들었다가 실패한 것 같다. 3명은 됐는데 한 분의 pyCharm 파일 자체가 오류 난 것인지 셋팅이 아예 안되는 문제가 발생했다. 
결국 다시 파자는 의견을 따라 git repo를 새로 만들게 됐다.
<del>사실 git을 처음부터 알려드렸는데 결과가 이렇게 돼버려서 내가 잘못했음을 알아 상심이 컸지만 극복</del></p>
<p><a href="https://articles09.tistory.com/48">Git 초기설정 1</a>
<a href="https://articles09.tistory.com/49?category=726318">Git 초기설정 2</a>
저장소를 파본 적이 별로 없어서 해당 링크에서 많은 도움을 받을 수 있었다.</p>
<p>오늘의 교훈 
<strong>git을 시작할 때 미리미리 gitignore 작성하기..메모..</strong></p>
<h3 id="🤣태초에-이슈가-있었습니다">🤣태초에 이슈가 있었습니다..</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/ad3aa330-a612-4339-9d44-d657de7f9871/9.17%20%EC%9D%B4%EC%8A%881.PNG" alt="">
로그인, 회원가입을 눌러도 모달창이 열리지 않았습니다.</p>
<h4 id="😎-근데-빛도-있었습니다">😎 근데 빛도 있었습니다..</h4>
<p><img src="https://images.velog.io/images/2_juzzang/post/fc74467e-d464-4356-87d8-f7fd6b04fadf/09.17.PNG" alt="">
사전 스터디 조원들이 도와줬습니다
2조 어셈블 ㅠ-ㅠ</p>
<p><img src="https://images.velog.io/images/2_juzzang/post/6611cb76-d56c-408f-8d35-67ab239f231a/09.17%20%EC%9D%B4%EC%8A%88.PNG" alt="">
다른 분이 짠 코드다보니 다른 곳에서 문제를 찾고 있었고
<img src="https://images.velog.io/images/2_juzzang/post/0810034f-984f-44ff-968c-4f83931e5270/9.17%20%EC%9D%B4%EC%8A%882.PNG" alt="">
주석을 저렇게 달아놓으셔서 로그인, 회원가입 모달창이구나 라고 생각하고 넘겼다가
다시보니 이벤트 전파 관련 함수였음을 알았고
<img src="https://images.velog.io/images/2_juzzang/post/70f02b4e-9100-4b6f-ae70-bc12759ae324/9.17%20%EC%9D%B4%EC%8A%884.PNG" alt="">
클릭시 카드들을 지워주고 새로운 카드를 뿌려주기 위해 저렇게 코드를 짰는데</p>
<pre><code>$(&#39;#main&#39;).empty(); 찾았다 요놈..</code></pre><blockquote>
<p>여기서 id=main에 있는 내용을 삭제해주고 다시 뿌려주는 것을 발견했고 
id01, id02를 찾지 못하는 콘솔을 참고해서 다시 index파일을 봤는데
id01, id02가 main id를 가진 엘리먼트 안에 포함되어 있음을 발견했습니다.</p>
</blockquote>
<h3 id="🙋♂️-해결은-이렇게">🙋‍♂️ 해결은 이렇게</h3>
<p><img src="https://images.velog.io/images/2_juzzang/post/2842ac91-e416-46fc-b53e-000d3fd239e7/09.17%20%EC%9D%B4%EC%8A%885.PNG" alt=""></p>
<p>그래서 main 밖으로 id01, id02 를 가진 엘리먼트를 빼주니 이슈가 해결되었습니다~!</p>
<p><img src="https://images.velog.io/images/2_juzzang/post/7cdc712a-8b5f-4498-b835-ab732e60d293/09.17%20%EC%9D%B4%EC%8A%88%ED%95%B4%EA%B2%B0.PNG" alt=""></p>
<p>짜잔! 
또 이렇게 짜릿함을 한사발 들이킵니다.
그리고 역시 혼자보단 함께하는게 좋다는 생각을 또 하게 됩니다🤞</p>
<p><del>이제 로그인 공부하러..</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[09.14 Git과의 싸움]]></title>
            <link>https://velog.io/@2_juzzang/09.14-Git%EA%B3%BC%EC%9D%98-%EC%8B%B8%EC%9B%80</link>
            <guid>https://velog.io/@2_juzzang/09.14-Git%EA%B3%BC%EC%9D%98-%EC%8B%B8%EC%9B%80</guid>
            <pubDate>Tue, 14 Sep 2021 16:05:50 GMT</pubDate>
            <description><![CDATA[<p>2일차
깃을 수월하게 사용하지 못하다보니 막히게 되고 계속 수정하고 머지하고의 연속이었다.
나도 다 아는게 아니다보니 모든 문제를 해결하진 못했는데 넷이 모여 화면을 공유하고 하나 둘 해결하면서 점점 깃에 익숙해지기 시작했다.
<del>물론 지금도 알다가도 모르겠긴하다</del></p>
<p><del>JWT를 이용한 로그인 기능을 맡게 되었다.</del>
<strong>팀원들의 깃이랑 씨름하느라 손을 못댔다. 큰일..</strong>
<img src="https://images.velog.io/images/2_juzzang/post/fa583b27-4268-470d-add3-bec51ad503c8/%EC%BB%A4%EB%B0%8B%20%EB%A9%94%EC%84%B8%EC%A7%80.PNG" alt="">
오늘은 하루 종일 git add . / git commit -m &quot;msg&quot; 의 반복 타이핑이었다.
역할 분담을 해도 도와주고 하다보니 컨플릭트가 필연적으로 나게됐고 그걸 또 같이 보면서 수정하느라 시간을 쓰게 됐다.
msg의 내용엔 처음에 조원들에게 아무말이나 적으라고 했는데 </p>
<p>사전 스터디에서 미니 프로젝트를 할 때 pull이나 push를 하려고 하면 merge를 하라길래 아무것도 모르고 커밋 메세지에 &quot;제발ㄹㄹㄹㄹㄹ&quot; 이런 메세지나 담았다가 나중에 로그에 다 찍히는 걸 봤다.
팀원들이 그랬었다. 간절하신게 보인다고..🤣</p>
<p>근데 그걸 알고있는 내가 아무말이나 쓰라는게 생각해보니 좀 아니다 싶어서
메세지에 관해 검색해봤다가 위의 내용을 발견할 수 있었다.</p>
<p>이제 슬슬 서버쪽으로 넘어가야 하는데 아직도 틀을 짜고 있어서 걱정이 된다.
내가 해야할 것들에 대한 강의도 보고있질 못하니 걱정이다.
<img src="https://images.velog.io/images/2_juzzang/post/3b512d3f-1a71-403e-8dc8-9f8d824f86e4/09.14.PNG" alt="">
2일찬데 벌써 600시간 ㅎ-ㅎ
<del>고쳐주세요 ㅠ</del></p>
<p>그래도 오늘 구현한 기능(?)이 없는 건 아니니.. 도와드리다보니 html, css에 대한 감을 익혀가고 있다.</p>
<pre><code>.book:hover .list{
    display: block;
}</code></pre><p>마우스오버 상태에서 메뉴바가 나오는 기능을 구현했다.
<span style="color:blue"><strong>display:none; 에서 display:block; 으로 바꿔줘야 하는 것이 핵심</strong></span>이었고
javascript를 통한 방법, css를 통한 방법이 있었다.
처음엔 js를 택했는데 메뉴바로 마우스를 이동하면 메뉴바가 사라져서 css를 택하게 되었다.
<strong>위 코드에서 book은 부모, list는 자식이 되고 부모태그에 호버를 할 경우
list의 display가 none;에서 block;으로 바뀌게 해줬다.</strong>
<strong>자식태그는 당연히 부모코드에 속해있어야 한다!</strong>
<img src="https://images.velog.io/images/2_juzzang/post/316cba63-6116-4cd1-8dfa-d9432c0dc087/%EC%9D%B4%EA%B2%8C.PNG" alt="">
결과물</p>
]]></description>
        </item>
    </channel>
</rss>