<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hwji.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 03 Apr 2024 04:45:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hwji.log</title>
            <url>https://images.velog.io/images/hyunwoo__ji/profile/998dbf4d-1418-49d5-a113-d810b01e718f/KakaoTalk_20211217_104913605.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hwji.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyunwoo__ji" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 15주차 회고 | React - React Router]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-15%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-React-Router</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-15%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-React-Router</guid>
            <pubDate>Wed, 03 Apr 2024 04:45:47 GMT</pubDate>
            <description><![CDATA[<h3 id="라우팅routing이란">라우팅(Routing)이란?</h3>
<ul>
<li>사용자가 요청한URL에 따라 해당URL에 맞는 페이지를 보여주는 것</li>
<li>가장 많이 쓰이는 라이브러리? React Router</li>
</ul>
<h3 id="리액트-라우터react-router">리액트 라우터(React Router)</h3>
<ul>
<li>개발자가 주소별로 다른 컴포넌트를 보여주기 위해 사용하는 라이브러리</li>
<li>여러 환경에서 동작할 수 있도록 여러 종류의 라우터 컴포넌트 제공</li>
<li>주요 컴포넌트
  BrowserRouter
  Routes
  Route
  Link
  createBrowserRouter</li>
</ul>
<h3 id="browserrouter">BrowserRouter</h3>
<ul>
<li>Router의 역할</li>
<li>새로고침을 하지 않아도 새로운 컴포넌트를 렌더링 해주는 기능 담당</li>
<li>URL마다 컴포넌트가 바뀔때 이때 바뀌는 부분의 최상단에 위치 해야 한
다.</li>
</ul>
<h3 id="routes-route">Routes, Route</h3>
<ul>
<li>경로가 일치하는 컴포넌트를 렌더링 해주도록 경로 매칭</li>
<li>Route에서는 구체적으로 어떤 컴포넌트를 렌더링할지 결정
<img src="https://velog.velcdn.com/images/hyunwoo__ji/post/97101e7a-34ff-49ab-8394-690b54d23f82/image.png" alt=""></li>
</ul>
<h3 id="link">Link</h3>
<ul>
<li>경로를 변경한다</li>
<li>기존 HTML의 a 태그가 새로고침해 렌더링을 수행했다면<Link> 컴포넌트는 페이지 전환을 방지한다.

</li>
</ul>
<h2 id="url-파라미터">URL 파라미터</h2>
<ul>
<li>useParams()</li>
<li>/product/:id</li>
<li>경로에: 를사용해설정되는것</li>
<li>URL 파라미터가여러개인경우/product/:id/:name 처럼 설정</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/671d36ab-a195-4a3f-8d09-cee7f754feae/image.png" alt=""></p>
<h2 id="url-쿼리스트링">URL 쿼리스트링</h2>
<p>  <img src="https://velog.velcdn.com/images/hyunwoo__ji/post/856fb1b4-f648-4c8c-b547-6a575d0d4d93/image.png" alt=""></p>
<h2 id="페이지-이동">페이지 이동</h2>
<p>  <img src="https://velog.velcdn.com/images/hyunwoo__ji/post/2d813e0b-4f1a-471b-9346-2a026039d335/image.png" alt=""></p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 15주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 14주차 회고 | React - hooks]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-14%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-lifecycle</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-14%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-lifecycle</guid>
            <pubDate>Mon, 01 Apr 2024 07:23:58 GMT</pubDate>
            <description><![CDATA[<h3 id="hooks란">hooks란?</h3>
<ul>
<li>클래스 컴포넌트에서만 가능했던 state(상태관리) 와 lifecycle(라이프사이클) 이 가능하도록 돕는 기능</li>
</ul>
<pre><code>let list = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;];
for ( let i = 0; i &lt; list.length; i++) {
    console.log( list[i] );
}</code></pre><h3 id="hooks-사용규칙">hooks 사용규칙</h3>
<ul>
<li><p>최상위 단계에서만 호출 가능</p>
<ul>
<li>최상위 컴포넌트 X</li>
<li>반복문, 조건문, 중첩된 함수 내부에서 호출하면 안되는 것!</li>
</ul>
</li>
<li><p>hooks는 오로지 <strong>React 함수형 컴포넌트</strong> 안에서만 호출이 가능하다</p>
</li>
<li><p>커스텀 훅 이름은 &quot;use&quot;로 시작(권장사항)</p>
</li>
</ul>
<h3 id="hooks종류">hooks종류</h3>
<ul>
<li>useState(): 상태 관리를 위한 가장 기본적인 훅</li>
<li>useRef(): 참조(reference)를 생성하고 관리할 수 있는 훅 (DOM 접근, 변수 보존 등)</li>
<li>useEffect(): 컴포넌트가 랜더링 될 때마다 특정 작업을 수행하도록 설정할 수 있는 훅</li>
<li>useMemo(): 메모이제이션을 통해 함수의 리턴 값을 재사용할 수 있게 해주는 훅</li>
<li>useCallback(): 함수를 메모이제이션하여 불필요한 렌더링을 줄이게 해주는 훅</li>
<li>useReducer(): 복잡한 컴포넌트 상태 로직을 리듀서 함수를 통해 관리할 수 있는 훅</li>
<li>useContext(): 리액트에서 전역적으로 접근 가능한 데이터나 함수를 관리하고,
불필요한 컴포넌트에서 그 값을 바로 가져와 사용할 수 있게 도와주는 훅</li>
</ul>
<h3 id="usememo">useMemo()</h3>
<ul>
<li>함수형 컴포넌트 내부에서 발생하는 연산을 최적화시켜주는 hook</li>
<li>렌더링 과정에서 특정 값이 바뀌엇을 때만 연산을 실행한다.</li>
</ul>
<blockquote>
<p>const memoizedValue = useMemo(callback,dependency)</p>
</blockquote>
<ul>
<li>렌더링 과정에서 두 번째 인자로 받은 의존 배열내 값이 바뀌는 경우에만 첫번째 인자로 받은 콜백함수를 실행해 구한 값을 반환한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/433304c8-b367-4d0d-808d-262f02f4a30e/image.png" alt=""></p>
<h3 id="usecallback">useCallback</h3>
<ul>
<li>렌더링 최적화에 사용되는 hook API</li>
<li>useMemo와 유사함. useMemo에서는 값을 최적화 시켰지만,
다시 rendering 될 때 함수를 다시 불러오는 것을 막는다.</li>
</ul>
<pre><code>const memoizedCallback = useCallback(callback, dependency)

const onClikc = useCallback(e =&gt; {
    e.preventDefault();
    setNumber(number + 1);
}, [number]);</code></pre><p>hook - useReducer()</p>
<ul>
<li>reducer란?
현재 상태와 업데이트를 위해 필요한 정보를 담은 액션 값을 전달받아 새로운 상태를 반환하는 함수
<img src="https://velog.velcdn.com/images/hyunwoo__ji/post/2ffb4acb-fa33-4ad9-8bac-bbbddacce953/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/d18b58f8-fae7-4cfc-bc6d-f2abe9bb75d2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/a51dead6-93ec-4c5a-a477-bd955e8b55e2/image.png" alt=""></p>
<h3 id="custom-hooks">Custom Hooks</h3>
<ul>
<li><p>컴포넌트에서 반복되는 로직이 많을 때 custom hooks을 이용하면 편리</p>
</li>
<li><p>즉, 컴포넌트 분할과 달리 컴포넌트 로직 자체를 분할하거나 재사용이 가능</p>
</li>
<li><p>보통은 hooks/ 디렉토리 안에 커스텀 훅을 정의하여 사용</p>
<ul>
<li>use 로 시작하는 파일을 만드는 것이 관례</li>
<li>ex. useScroll.js, useToggle.js 등</li>
</ul>
</li>
</ul>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 14주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 14주차 회고 | React - lifecycle]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-14%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-14%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-</guid>
            <pubDate>Thu, 28 Mar 2024 08:01:50 GMT</pubDate>
            <description><![CDATA[<h3 id="리액트---라이프사이클">리액트 - 라이프사이클</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/b16fcf18-2fff-4e65-b084-64fc2679a204/image.png" alt=""></p>
<ul>
<li><p>Mount</p>
<ul>
<li>Dom이 생성되고 웹 브라우저 상에 나타남</li>
</ul>
</li>
<li><p>Update</p>
<ul>
<li>props or state 바뀌었을 때 업데이트함</li>
</ul>
</li>
<li><p>UnMount</p>
<ul>
<li>컴포넌트가 화면에서 사라질(제거될) 때</li>
</ul>
</li>
</ul>
<h3 id="함수형-컴포넌트">함수형 컴포넌트</h3>
<h3 id="useeffect">useEffect()</h3>
<ul>
<li>함수형 컴포넌트에서는 useEffect()를 사용해
Mount, Update, Unmount 시 특정 작업을 처리</li>
</ul>
<pre><code>useEffect(effect, deps);
// effect: 랜더링 이후 실행할 함수 (Mount, Update)
//     - effect 함수에서 함수를 return 시 반환하는 함수가 컴포넌트 Unmount 될 때 실행됨
// deps: 배열 값이 변하면 effect 함수 실행
//     - 생략: Mount &amp; Update 시 동작
//  - []: 빈 배열 -&gt; Mount 시에만 동작
//  - [data]: 배열 안의 data 값이 Update 시 동작

// 컴포넌트 Mount or Update 될 때 동작
useEffect(() =&gt; {});

// 컴포넌트 Mount 될 때 동작
useEffect(() =&gt; {}, []);

// data 값이 Update 될 때 동작
const [data, setData] = useState();
useEffect(() =&gt; {}, [data]);</code></pre><blockquote>
<p>컴포넌트가 rendering 될 때마다 특정 작업을 수행</p>
</blockquote>
<pre><code>useEffect(() =&gt; {
    console.log(&#39;렌더링이 완료되었습니다.&#39;);
    console.log( &quot;name : &quot;, name, &quot; &amp; email : &quot;, email)
})</code></pre><pre><code>useEffect(() =&gt; {
    console.log(&#39;처음 렌더링될 때만 실행됨!!&#39;);
}, []);</code></pre><ul>
<li>Mount 될 때만 실행된다.<ul>
<li>Mount: 최초 rendering</li>
</ul>
</li>
</ul>
<h3 id="useeffect-1">useEffect()</h3>
<ul>
<li><p>특정 값이 바뀔 때만 실행하게 하고 싶다면?</p>
<pre><code>useEffect (() =&gt; {
  console.log(name);
}, [name]);     // 함수형 컴포넌트</code></pre></li>
<li><p>컴포넌트가 unmount 되기 직전에 작업을 수행하고 싶다면?
=&gt; cleanup(뒷정리 함수) 이용하기
return 으로 함수 반환하기</p>
<pre><code>useEffect (() =&gt; {
  console.log(&quot;effect&quot;);
  console.log(name);

  return () =&gt; {
      console.log(&quot;cleanup&quot;);
      console.log(name);
  };
});</code></pre></li>
</ul>
<blockquote>
<p>실행 예시</p>
</blockquote>
<pre><code>import { useState, useEffect } from &#39;react&#39;;

const myComponent = (props) =&gt; {
    const { number } = porps;
    const [text, setText] = useState(&#39;&#39;);

    useEffect(() =&gt; {
        // Mount 시점에 실행
        console.log(&#39;Funcitional Component | mount!&#39;);

        // Unmount 시점에 시행
        return () =&gt; {
            console.log(&#39;Functional Component | unmount&#39;);
        }
    }, []);

    // Mount &amp; Update 시점에 실행
    useEffect(() =&gt; {
        console.log(&#39;Functional Component | update!&#39;);
    });


    // text 가 바뀔 때만 실행
    useEffect(() =&gt; {
        console.log(&#39;Functional Component | text update!&#39;);
    }, [text]);

    return (
    &lt;&gt;
        &lt;p&gt;MyComponent {number}&lt;/p&gt;
        &lt;input
            type=&quot;text&quot;
            value={text}
            onChange={(e) =&gt;. setText(e.target.value)}
        /&gt;
    &lt;/&gt;
    );
};</code></pre><pre><code>const LifeCycleFunc = () =&gt; {
    const [number, setNumber] = useState(0);
    const [visible, setVisible] = useState(true);

    const changeNumberState = () =&gt; {
        setNumber(number + 1);
    };

    const changeVisibleState = () =&gt; {
        setVisible(!visible);
    };

    return (
        &lt;&gt;
            &lt;button onClick={changeNumberState}&gt;PLUS&lt;/button&gt;
            &lt;button onClick={changeVisibleState}&gt;ON/OFF&lt;/button&gt;
            {visible &amp;&amp; &lt;MyComponent number={number} /&gt;}
        &lt;/&gt;
    );
};

export default LifeCycleFunc;</code></pre><h3 id="결론">결론</h3>
<p>리액트의 주기 lifecycle에 대해 알아봣으며 함수형 컴포넌트에서는 useEffect()를 사용해서 작업을 하는 것을 알게 되었다. useEffect()의 사용방법과 use가 들어가는 hooks 에 대해 더 공부할 필요성을 느꼈다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 14주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 13주차 회고 | React - ref]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-13%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-13%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-React-</guid>
            <pubDate>Mon, 25 Mar 2024 00:28:39 GMT</pubDate>
            <description><![CDATA[<h3 id="react에서요소선택">React에서요소선택</h3>
<p>-&gt; React 컴포넌트가아닌HTML Element에 직접 접근해야한다면..?</p>
<p>1) id 지정</p>
<ul>
<li>같은컴포넌트를 반복해서 사용하면 id가 중복되는 문제
=&gt; 고유한 id가 되지않음.</li>
</ul>
<blockquote>
<p>반면에 ref는 컴포넌트 내부에서만 작동</p>
</blockquote>
<h3 id="ref-란">ref 란?</h3>
<ul>
<li>전역적으로 작동하지 않고 컴포넌트 내부에서 선언 및 사용</li>
<li>동일한 컴포넌트를 반복해 사용해도 각 컴포넌트 내부에서만 동작</li>
<li><blockquote>
<p>따라서중복되지않음!</p>
</blockquote>
</li>
<li>DOM을 직접적으로 건드려야 할 때 사용</li>
<li>특정 input에 focus 주기, 스크롤박스조작, 비디오 플레이어의 재생/정지 기능 등</li>
</ul>
<blockquote>
<p>주의! Class 형 컴포넌트에서만 기본 기능으로제공함.
이번 챕터까지 클래스형 컴포넌트 사용. 이후는 함수형 컴포넌트만 사용.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/1021ea66-5688-42cd-b7dc-ce3a8257593d/image.png" alt=""></p>
<h3 id="ref-사용하기">ref 사용하기</h3>
<h4 id="함수형-컴포넌트">함수형 컴포넌트</h4>
<ul>
<li>함수형 컴포넌트에서 ref를사용 하기 쉽게 만들어주는 Hook</li>
<li>useRef()는 인자로 받은 값으로 초기화된 변경 가능한ref 객체를반환
한다.</li>
<li>ref.current로 현재 가리키는 객체에 접근할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/3c8b872f-359a-4523-88d9-6c9ed9475883/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/fb382fc9-d55b-4ce7-899f-0dca4844e12e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/fafaecf7-b533-4e87-9430-b08f166716a3/image.png" alt=""></p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 13주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 13주차 회고 | React - map, filter, 단축평가]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-13%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-useEffect</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-13%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-useEffect</guid>
            <pubDate>Wed, 20 Mar 2024 03:44:16 GMT</pubDate>
            <description><![CDATA[<h3 id="map">map()</h3>
<h3 id="일반-for-반복문">일반 for 반복문</h3>
<pre><code>let list = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;];
for ( let i = 0; i &lt; list.length; i++) {
    console.log( list[i] );
}</code></pre><h3 id="map-함수">map() 함수</h3>
<ul>
<li>map()의 인자로 넘겨지는 callback 함수를 실행한 결과를 가지고 새로운 배열을 만들때 사용</li>
<li>map() 함수를 필요에 따라 반복문처럼 사용할 수도 있음</li>
</ul>
<h3 id="map-함수-문법">map() 함수 문법</h3>
<blockquote>
<p>arr.map( callbackFunction, [thisArg] )</p>
</blockquote>
<ul>
<li>callbackFunction<ul>
<li>새로운 배열의 요소를 생성하는 함수로, currentValue,
index, array 3개의 인수를 가질 수 있다.</li>
<li>[thisArg] 는 생략 가능한 것으로 callbackFunction 에서 사용할 this 객체</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/dbf861fd-446a-4062-8027-5bfaf43c0189/image.png" alt=""></p>
<pre><code>let list = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
let items = list.map((txt, id, arr) =&gt; {
    console.log(&quot;txt: &quot;, txt);
    console.log(&quot;id: &quot;, id);
    console.log(&quot;arr: &quot;, arr);
    return txt + id;
})</code></pre><ul>
<li>txt : list를 순서대로 돌면서 나오는 값</li>
<li>id : 방금 나온 값(txt)의 인덱스</li>
<li>arr : 현재 반복을 돌고 있는 배열</li>
<li>items: &quot;return txt + id&quot;로 만들어진 배열</li>
</ul>
<h3 id="배열-데이터-map과-함께-사용">배열 데이터, map()과 함께 사용</h3>
<ul>
<li><p>배열 데이터를 좀 더 효율적으로 그리기 위해서 map 사용!
<img src="https://velog.velcdn.com/images/hyunwoo__ji/post/063cf127-c386-4809-9d87-6a420782bf94/image.png" alt=""></p>
</li>
<li><p>key</p>
<ul>
<li>기존 요소와 업데이트 요소를 비교하는데 사용되는 속성,</li>
<li>다른 요소와 겹치지 않는 고유한 값이어야 합니다.</li>
<li>key는 고유한 값을 가져야 하기 때문에 배열의 요소 중 고유한 값(id 등) 이 존재하지 않는다면 index로 사용해도 됩니다! (단, index를 사용하는 것은 최후의 수단!)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/b4574d70-b686-4ef8-846f-69bb7625c405/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/2f683027-b650-40fd-8a4f-9992be1e6fa9/image.png" alt=""></p>
<h3 id="component에-map적용">Component에 map()적용</h3>
<ul>
<li>map() 함수를 이용해 컴포넌트를 생성할 때 “key” 사용을 권장한다.</li>
<li>Why? React는 자율적으로 업데이트 전 기존 요소와 업데이트 요소를 비교하는데
key를 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/edc6f1fc-afb8-43b1-bf70-b6ce602b73fc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/2c7defbb-813e-4579-9677-33d7a1890728/image.png" alt=""></p>
<h3 id="filter-함수">filter() 함수</h3>
<ul>
<li>filter()의 인자로 넘겨지는 callback 함수의 테스트(조건)를 통과하는 요소
를 모아 새로운 배열을 생성.</li>
<li>filter() 함수를 사용하여 배열에서 원하는 값을 삭제하는 코드 구현 가능.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/cc468c2f-c233-4627-b5f8-abb5b308e00d/image.png" alt=""></p>
<pre><code>let animals = [&#39;dog&#39;, &#39;cat&#39;, &#39;rabbit&#39;];
let newAnimals = animals.filter((animal) =&gt; { return animal.length &gt; 3});
console.log(newAnimals);

let newAnimals = animals.filter((animal) =&gt; animal.length &gt; 3);</code></pre><pre><code>let words = [&#39;dog&#39;, &#39;cat&#39;, &#39;rabbit&#39;];

let result2 = words.filter((word) =&gt; {
    return word.includes(&#39;a&#39;);
});
console.log( result2 );</code></pre><h3 id="단축평가란">단축평가란?</h3>
<ul>
<li>논리 연산자를 사용하여 특정 조건에 따라 값을 결정하거나, 조건에 따라 특정코드를 실행하는 방법</li>
</ul>
<p>1) &amp;&amp; 연산자를 사용한 단축 평가</p>
<ul>
<li>둘다 참</li>
</ul>
<p>2) || 연산자를 사용한 단축 평가</p>
<ul>
<li><p>둘 중 하나 참</p>
<h3 id="연산자">&amp;&amp; 연산자</h3>
<p>A &amp;&amp; B</p>
</li>
<li><p>A가 false : B는 아예 확인하지 않고 바로 A의 값을 반환합니다. A가 이미 false이므로 A와 B 모두 참일 수 없기 때문</p>
<pre><code>const result = false &amp;&amp; &quot;Hellog&quot;;
console.log(result); // 출력: false</code></pre><ul>
<li>A가 true: 만약 A가 true 라면, B의 값을 확인. 이 경우, B의 값이 반환됩니다.</li>
</ul>
</li>
</ul>
<pre><code>const name = &quot;Martin&quot;;
const greeting = name &amp;&amp; `Hello, ${name}!`;
console.log(greeting); // 출력: &quot;Hello, Martin!&quot;</code></pre><h3 id="-연산자">|| 연산자</h3>
<p> A || B</p>
<ul>
<li>A가 false: B의 값을 확인해야 합니다. 이 경우, B의 값이 반환됩니다.<pre><code></code></pre>const defaultName = &quot;Martin&quot;;
const userName = null;
const displayName = userName || defaultName;
console.log(displayName); // 출력: &quot;Martin&quot;<pre><code>- A가 true: B는 아예 확인하지 않고 바로 A의 값을 반환합니다. 왜냐하면 A가 이미 true이므로 A나 B 중 하나만 참이면 되기 때문입니다.</code></pre><pre><code></code></pre>const result = true || &quot;Hello&quot;;
console.log(result); // 출력: true</li>
</ul>
<pre><code>
### 참고
[코딩온] 웹개발자 풀스택 과정 13주차 ppt








</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 12주차 회고 | state와 useState]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-useState</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-useState</guid>
            <pubDate>Mon, 18 Mar 2024 14:05:17 GMT</pubDate>
            <description><![CDATA[<h3 id="state란">state란</h3>
<ul>
<li>React에서 앱의 유동적인 데이터를 다루기 위한 개체</li>
<li>계속해서 변하는 특정 상태</li>
<li>상태에 따라 다른 동작을 함</li>
<li>왜 사용할까?<ul>
<li>State가 변경될 시 자동으로 재랜더링 되기 때문</li>
<li>이 점이 변수와 다른점</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/2626b96a-0c65-4480-928f-b7a91d95fff7/image.png" alt=""></p>
<h3 id="주의할점">주의할점</h3>
<ul>
<li>state는 원칙적으로 클래스형 컴포넌트에서만 사용 가능</li>
<li>직접 this.state를 변경하지 말것!!!
=&gt; 항상 setState를 사용</li>
<li>setState는 비동기적으로 동작하므로, 이전 상태를 기반으로
계산할 때 함수 형태의 setState를 사용</li>
</ul>
<h3 id="함수형-컴포넌트의-state">함수형 컴포넌트의 state</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/2a9f51e3-1038-4916-81da-9d672f44a981/image.png" alt=""></p>
<p><img src="blob:https://velog.io/3de0b491-3955-42a1-b800-eb533972b590" alt="업로드중.."></p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 12주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 12주차 회고 | props]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-props</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-props</guid>
            <pubDate>Wed, 13 Mar 2024 09:03:32 GMT</pubDate>
            <description><![CDATA[<h3 id="props란">props란</h3>
<ul>
<li>properties를 줄인 표현으로 컴포넌트 속성을 설정할 때 사용하는 요소</li>
<li>props는 컴포넌트끼리 값을 전달하는 수단</li>
<li>상위 컴포넌트에서 하위 컴포넌트로 전달 (단방향 데이터 흐름)</li>
</ul>
<pre><code>{/* 일반 사용법 */}
&lt;ClassComponent&gt;&lt;/ClassComponent&gt;

{/* props 사용법 */}
&lt;ClassComponent title=&quot;제목&quot; content&quot;내용&gt;&lt;/ClassComponent&gt;</code></pre><h3 id="함수형-컴포넌트-props">함수형 컴포넌트 props</h3>
<ul>
<li>부모 컴포넌트에서 전달한 props는 함수형 컴포넌트에서 함수의 파라미터로 전달받으며, JSX 내부에서 {} 기호로 감싸서 사용한다.</li>
</ul>
<pre><code>&lt;FuncComponent name=&quot;코딩온&quot;&gt;&lt;/FuncComponent&gt;
{/* 부모 컴포넌트에서 name props 전달*/}</code></pre><pre><code>{/* 자식 컴포넌트에서 name props 받음*/}
const FuncComponent = (props) =&gt; {
    return(
        &lt;&gt;
            &lt;div&gt;안녕? **{props.name}**&lt;/div&gt;
            &lt;div&gt;반가워 !&lt;/div&gt;
        &lt;/&gt;
    )
}</code></pre><h3 id="defaultprops">defaultProps</h3>
<ul>
<li>부모 컴포넌트에서 props가 전달되지 않았을 때 기본값으로 보여 줄 props를 설정 하는 것</li>
</ul>
<pre><code>FuncComponent.defaultProps = {
    nmae: &#39;홍길동&#39;
}</code></pre><h3 id="propschildren">props.children</h3>
<ul>
<li>부모 컴포넌트에서 자식 컴포넌트를 호출할 때 태그 사이에 작성한 내용<pre><code>&lt;FuncComponent name=&quot;코딩온&quot;&gt;**자식 내용**&lt;/FuncComponent&gt;</code></pre></li>
</ul>
<pre><code>{/* 자식 컴포넌트*/}
const FuncComponent = (props) =&gt; {
    return(
        &lt;&gt;
            &lt;div&gt;안녕? **{props.name}**&lt;/div&gt;
            &lt;div&gt;반가워 !&lt;/div&gt;
            &lt;h4&gt;**{prop.children}**/&lt;h4&gt;
        &lt;/&gt;
    )
}</code></pre><h3 id="proptypes">propTypes</h3>
<ul>
<li>컴포넌트의 필수 props를 지정하거나 props의 타입을 지정할 때 사용</li>
<li>JavaScript의 &quot;유연한 특성&quot;을 해결하기 위해 권장되는 기능</li>
<li>정해진 타입이 아닌 다른 타입으로 정보가 전달될 시, 제대로 동작은 하지만 console에 오류가 나온다.</li>
</ul>
<pre><code>impport PropTypes from &quot;prop-types&quot;;

FuncComponent.propTypes = {
    name: PropTypes.string
}</code></pre><h2 id="클래스형-컴포넌트-props">클래스형 컴포넌트 props</h2>
<pre><code>class ClassComponent extends Component {
    render() {
        return(
            &lt;h1&gt;Class component 입니다. 이름은 { this.props.name }&lt;/h1&gt;
        );
    }

    static defaultProps = {
        name: &quot;기본 이름&quot;
    };

    static propTypes = {
        name: PropTypes.string
    }
}

{/* 다른 형식 */}
ClassComponent.defaultProps = {
    name: &#39;홍길동&#39;
}

.ClassComponent.propTypes = {
    name: PropTypes.string
}
</code></pre><blockquote>
<p>이제는 props 관련 리액트 예제 문제를 풀어보자.</p>
</blockquote>
<h3 id="예제-1">예제 1)</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/adda6a29-2cdc-4b0e-9fbe-1cadd23208f3/image.png" alt=""></p>
<pre><code>class App extends Component {
  render() {

    const printConsole = () =&gt; {
      console.log(&#39;콘솔 띄우기 성공!&#39;);
    }
    return (
      &lt;div className=&quot;App&quot;&gt;
        &lt;ClassComponent text=&#39;dd&#39;/&gt;</code></pre><pre><code>import { Component } from &#39;react&#39;
import PropTypes from &#39;prop-types&#39;;

export default class Ex01 extends Component {

  render() {
    const {text, valid} = this.props;
    return (
        &lt;&gt;
            &lt;div&gt;{text}&lt;/div&gt;
            &lt;button onClick={valid}&gt;버튼&lt;/button&gt;
        &lt;/&gt;
    )
  }
}

Ex01.defaultProps = {
    text: &#39;이건 기본 text props입니다.&#39;
}

Ex01.propTypes = {
    text: PropTypes.string.isRequired,
}
</code></pre><h3 id="예제-2">예제 2)</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/5a659e85-6079-4709-8fb4-be1818fc0975/image.png" alt=""></p>
<pre><code>import React, { Component } from &#39;react&#39;

export default class Ex02 extends Component {
    // state 사용
    state = {
        number: 0,
    }

  render() {
    const { number } = this.state;
    return (
      &lt;&gt;
        &lt;h2&gt;{number}&lt;/h2&gt;
        &lt;button onClick={() =&gt; {
            this.setState({number: number + 2});
        }}&gt;plus&lt;/button&gt;
        &lt;button onClick={() =&gt; {
            this.setState({number: number - 1});
        }}&gt;minus&lt;/button&gt;
      &lt;/&gt;
    )
  }
}
</code></pre><h3 id="예제-3">예제 3)</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/62b79d7a-8930-4ec7-9796-871c63aabae7/image.png" alt=""></p>
<pre><code>import { useState } from &quot;react&quot;

const Ex03 = () =&gt; {
    const [number, setNumber] = useState(0);


    const increase = () =&gt; {
        setNumber(number + 1);
    }

    const decrease = () =&gt; {
        setNumber(number - 2);
    }

    return (
        &lt;&gt;
            &lt;h1&gt;{number}&lt;/h1&gt;
            &lt;button onClick={increase}&gt;plus&lt;/button&gt;
            &lt;button onClick={decrease}&gt;minus&lt;/button&gt;
        &lt;/&gt;
    )
}

export default Ex03</code></pre><h3 id="결론">결론</h3>
<p>리액트 props에 대한 개념 정리와 문제를 통해 이해할 수 있는 시간을 가졌다.
프론트엔드의 중요한 부분을 차지하기에 많이 연습을 해야 할 거 같다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 12주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 11주차 회고 | jwt 인증]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-11%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EC%8B%A4%EC%8A%B5-cookie-session</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-11%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EC%8B%A4%EC%8A%B5-cookie-session</guid>
            <pubDate>Sun, 10 Mar 2024 00:35:58 GMT</pubDate>
            <description><![CDATA[<h3 id="oauth란">OAuth란</h3>
<p>Open Authorization</p>
<ul>
<li><p>인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 어플리케이션의 접근 권한을 부 여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개 방형 표준이다(위키백과)</p>
</li>
<li><p>즉, 서드파티 어플리케이션이 사용자의 계정에 접근할 수 있는 권한 을 부여하기 위한 프로토콜</p>
</li>
</ul>
<h3 id="oauth-10">OAuth 1.0</h3>
<ul>
<li>서드파티 어플리케이션이 사용자의 데이터에 접근할 권한을 얻기 위해 서명된 요청을 사용</li>
<li>요청의 서명 부분은 어플리케이션의 비밀 키와 사용자의 토큰을 조합하여 생성되며, 이를 통해 보안이 유지</li>
</ul>
<h3 id="oauth-20">OAuth 2.0</h3>
<ul>
<li>OAuth 2.0은 보다 간편하고 확장성이 있는 버전으로, 기본적으로 인증과 권한을 분리하여 다루는 것을 특징</li>
<li>Access Token을 통해 권한을 부여하고, 사용자의 실제 비밀 정보를 공유하지 않습니다.</li>
</ul>
<h3 id="jwt-bearer-token-인증">JWT Bearer Token 인증</h3>
<ul>
<li>OAuth 2.0에서는 Bearer Token 인증 방식을 지원</li>
<li>JWT를 Bearer Token으로 사용할 수 있음</li>
<li>클라이언트가 발급받은 JWT를 &quot;Authorization&quot; 헤더에 담아 요청을 보내면, 서버는 해당 JWT의 유효성을 검사하여 권한을 부여</li>
</ul>
<ul>
<li>Bearer? 웹 서비스에서 사용자 인증에 사용되는 인증 방식 중 하나</li>
</ul>
<h2 id="jwt">jwt</h2>
<h3 id="jwtjson-web-token">JWT(JSON Web Token)</h3>
<ul>
<li>웹 애플리케이션에서 정보를 안전하게 전송하기 우한 간단한 방법</li>
<li>인증된 사용자를 식별하거나 데이터에 서명을 하여 변조를 방지하는데 사용</li>
</ul>
<h3 id="jwt-구성">JWT 구성</h3>
<ul>
<li>Header: 토큰의 타입과 해시 알고리즘 정보가 포함</li>
<li>payload: 실제 정보 데이터가 포함되며, 클레임 이라 불리는 키-값 쌍으로 이루어져 있음</li>
<li>Signature: 토큰의 무결성을 검증하기 위한 서명 부분으로,
Header와 Payload의 조합에 비밀 키를 사용해 생성</li>
</ul>
<h3 id="jwt-작동-방식">JWT 작동 방식</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/052df646-7c1c-4efe-85e5-2cff42e52d38/image.png" alt=""></p>
<h3 id="jwt-주요-함수">JWT 주요 함수</h3>
<ul>
<li><p>sign: 서버측에서 JWT를 생성할 때 사용</p>
<pre><code>jwt.sign(payload, secretOrPrivateKey, [options, callback])</code></pre></li>
<li><p>verify: 클라이언트나 서버에서 받은 JWT의 유효성을 검증할 때 사용
jwt.verify(token, secretOrPublicKey, [options, callback])</p>
<pre><code></code></pre></li>
</ul>
<h3 id="jwt-사용하기">JWT 사용하기</h3>
<pre><code>npm install jsonwebtoken

const jwt = require(&#39;jsonwebtoken&#39;);</code></pre><h3 id="결론">결론</h3>
<p>앞으로는 프론트엔드 위주로 블로깅을 할 예정! 백엔드는 틈틈이 이어나가야 할 거 같다!</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 11주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 11주차 회고 | cookie, session]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EC%8B%A4%EC%8A%B5-MVC</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EC%8B%A4%EC%8A%B5-MVC</guid>
            <pubDate>Wed, 06 Mar 2024 14:59:23 GMT</pubDate>
            <description><![CDATA[<h2 id="cookie-session-알아보기">cookie, session 알아보기</h2>
<h3 id="cookie">cookie</h3>
<ul>
<li>웹 브라우저(클라이언트)에 저장되는 키와 값이 들어있는 작은 데이터 파일</li>
<li>이름, 값, 만료일, 경로 정보로 구성되어 있다.</li>
</ul>
<h3 id="cookie의-동작-방식">cookie의 동작 방식</h3>
<ul>
<li>쿠키의 동작 방식</li>
</ul>
<ol>
<li>클라이언트가 페이지를 요청</li>
<li>서버에서 쿠키를 생성</li>
<li>HTTP 헤더에 쿠키를 포함 시켜 응답</li>
<li>브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음</li>
<li>같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄</li>
<li>서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤어데 포함시켜 응답
<img src="https://velog.velcdn.com/images/hyunwoo__ji/post/25fdecdd-6a22-4628-b22e-50e6c236f29d/image.png" alt=""></li>
</ol>
<h3 id="쿠키-사용하기">쿠키 사용하기</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/fc8ebbd5-ca66-4ba1-bb49-fda1004ee48c/image.png" alt=""></p>
<h3 id="session-이란">session 이란?</h3>
<ul>
<li>웹 서버에 저장되는 쿠키</li>
<li>사용자가 웹 브라우저를 통해 접속한 시점부터 연결을 끝내는 시점까지의 시간 동안 일련의 요구를 하나의 상태로 보고 그 상태를 유지시킨다.<ul>
<li>ex. 로그인 유지</li>
</ul>
</li>
</ul>
<h3 id="session-의-동작-방식">session 의 동작 방식</h3>
<ol>
<li>클라이언트 서버에 접속 시 세션 ID를 발급받습니다.</li>
<li>클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있습니다.</li>
<li>클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 서버에 전달해서 사용합니다.</li>
<li>서버는 세션 ID를 전달받아서 별다른 작업 없이 세션 ID로 세션에 있는 클라이언트 정보를 가져옵니다.</li>
<li>클라이언트는 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답ㅎ바니다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/f91faab0-8e10-440a-8a4d-87b0f22ca802/image.png" alt=""></p>
<h3 id="session-사용하기">session 사용하기</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/cfb6782d-2a4f-4db8-b46d-9c34e20d9033/image.png" alt=""></p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 11주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 10주차 회고 | 실습 - MVC]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-10%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-MVC-og8pcs71</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-10%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-MVC-og8pcs71</guid>
            <pubDate>Sat, 02 Mar 2024 10:04:21 GMT</pubDate>
            <description><![CDATA[<h2 id="예제를-통해-mvc-알아보기">예제를 통해 MVC 알아보기</h2>
<h3 id="지난-mvc블로깅에-이어서-예제를-가져왔다">지난 MVC블로깅에 이어서 예제를 가져왔다.</h3>
<h3 id="mvc-흐름">MVC 흐름</h3>
<ul>
<li><p>전체적인 흐름은 아래와 같이 구성하였다.
<img src="https://velog.velcdn.com/images/hyunwoo__ji/post/b497878e-934e-43a4-951f-87766195544b/image.png" alt=""></p>
</li>
<li><p>model</p>
<ul>
<li>데이터를 처리하는 부분 (유저 정보 데이터)</li>
</ul>
</li>
<li><p>view</p>
<ul>
<li>UI 관련된 것을 처리하는 부분 (사용자에게 보여지는 부분) - post.ejs</li>
</ul>
</li>
<li><p>controller</p>
<ul>
<li>View와 Model을 연결해주는 부분</li>
</ul>
</li>
<li><p>routes - index.js</p>
</li>
</ul>
<h3 id="appjs">app.js</h3>
<pre><code>const express = require(&#39;express&#39;);
const app = express();
const PORT = 8000;

// body-parser
app.use(express.urlencoded({ extended: true });
app.use(express.json());

// view engine
app.set(&#39;view engine&#39;, &#39;ejs&#39;);
app.set(&#39;views&#39;, &#39;./views&#39;);

const router = require(&#39;./routes&#39;);
app.use(&#39;/&#39;, router)

app.listen(PORT, () =&gt; {
    console.log(`http://localhost:${PORT}`);
});
</code></pre><ul>
<li>경로를 controller와 연결해 설정 가능</li>
</ul>
<h3 id="routesindexjs">routes/index.js</h3>
<pre><code>const express = require(&#39;express&#39;);
const controller = require(&#39;../controller&#39;);
const router = express.Router();

// router
// === 페이지
router.get(&#39;/&#39;, controller.axiosPost);
// === 데이터 요청, 응답
router.post(&#39;/resultPost&#39;, controller.resultPost);

module.exports = router;</code></pre><h3 id="modeluserjs">model/user.js</h3>
<pre><code>const users = [
    {
        userid: &#39;kdt11&#39;,
        userpw: &#39;1234&#39;,
    },
];

modeuel.exports = users;
</code></pre><ul>
<li>model 폴더에 user.js 로 데이터 저장</li>
</ul>
<h3 id="viewspostejs">views/post.ejs</h3>
<pre><code> &lt;body&gt;
        &lt;h1&gt;POST 로그인 실습&lt;/h1&gt;
        &lt;form&gt;
            &lt;label for=&quot;username&quot;&gt;아이디&lt;/label&gt;
            &lt;input type=&quot;text&quot; id=&quot;username&quot; required /&gt;
            &lt;br /&gt;
            &lt;label for=&quot;pw&quot;&gt;패쓰워드&lt;/label&gt;
            &lt;input type=&quot;password&quot; id=&quot;pw&quot; required /&gt;
            &lt;br /&gt;
            &lt;button type=&quot;button&quot; onclick=&quot;login()&quot;&gt;로그인&lt;/button&gt;
        &lt;/form&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        &lt;div class=&quot;resultBox&quot;&gt;&lt;/div&gt;
        &lt;script&gt;
            const resultBox = document.querySelector(&#39;.resultBox&#39;);
            function login() {
                //백엔드로 요청보낼 데이터
                const data = {
                    id: document.querySelector(&#39;#username&#39;).value,
                    pw: document.querySelector(&#39;#pw&#39;).value,
                };
                axios({
                    method: &#39;POST&#39;,
                    url: &#39;/resultPost&#39;,
                    data,
                }).then((res) =&gt; {
                    console.log(&#39;res&#39;, res);
                    const { result, userInfo } = res.data;
                    if (result) {
                        resultBox.textContent = `${userInfo.id}님 환영합니다`;
                        resultBox.style.color = &#39;blue&#39;;
                    } else {
                        resultBox.textContent = &#39;아이디 또는 패쓰워드가 틀렸습니다&#39;;
                        resultBox.style.color = &#39;red&#39;;
                    }
                });
            }
        &lt;/script&gt;
    &lt;/body&gt;</code></pre><ul>
<li>프론트 레이아웃 정보 작성</li>
</ul>
<h3 id="controllerindexjs">controller/index.js</h3>
<pre><code>const User = require(&#39;../model/user&#39;);

exports.axiosPost = (req, res) =&gt; {
    res.render(&#39;post&#39;);
};

exports.resultPost = (req, res) =&gt; {
    console.log(&#39;요청값&#39;, req.body);
    const { id: reqId, pw: reqPw } = req.body;

    if (User[0].userid === reqId &amp;&amp; User[0].userpw === reqPw {
        res.send({ result: true, userInfo: {id: User[0].useid } })
    } else {
        res.send({ result: false, userInfo: null });
    }
};</code></pre><h3 id="아직도-mvc-개념으로-구조를-작성해봤다--간단한-서버만들기부터-다양한구조로-연습을-많이-필요하다">아직도 mvc 개념으로 구조를 작성해봤다.  간단한 서버만들기부터 다양한구조로 연습을 많이 필요하다.</h3>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 10주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 10주차 회고 | MVC]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-10%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-MVC</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-10%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-MVC</guid>
            <pubDate>Wed, 28 Feb 2024 14:38:11 GMT</pubDate>
            <description><![CDATA[<h2 id="mvc-에-대해-알아보기">MVC 에 대해 알아보기</h2>
<h3 id="mvc에-들어가기전-환경변수에-대한-개념을-알고-넘어가기로-하였다">mvc에 들어가기전 환경변수에 대한 개념을 알고 넘어가기로 하였다.</h3>
<h3 id="환경변수">환경변수</h3>
<ul>
<li>환경변수는 운영 체제나 애플리케이션에서 사용되는 데이터 값을 저장하는 메커니즘</li>
<li>프로그램의 동작을 조정하거나 구성</li>
<li>Node.js에서도 이러한 환경변수를 활용하여 애플리케이션의 설정과 동작을 조정</li>
</ul>
<h3 id="nodejs-환경-변수">Node.js 환경 변수</h3>
<p>Node.js에서는 process.env 객체를 통해 환경변수에 접근</p>
<pre><code>// node.js 환경변수 확인
const ps = process.env;
console.log(ps);</code></pre><blockquote>
<p>.env</p>
</blockquote>
<ul>
<li>환경변수를 관리하기 위해 .env파일을 사용하는 것이 일반적</li>
<li>깃 저장소에 업로드 하지 말아야함!</li>
<li>서버에 파일만 업로드</li>
</ul>
<h3 id="환경변수-사용">환경변수 사용</h3>
<blockquote>
<p>npm install dotenv</p>
</blockquote>
<pre><code>require(&#39;dotenv&#39;).config() // .env 파일의 환경변수를 읽어옴</code></pre><h3 id="환경변수-사용-1">환경변수 사용</h3>
<blockquote>
<p>NAME=KDT
  NODE=dev</p>
</blockquote>
<pre><code>require(&#39;dotenv&#39;).config() // .env 파일의 환경변수를 읽어옴

app.get(&#39;/&#39;, (req, res) =&gt; {
    res.send(&#39;log&#39;);
    console.log(process.env.NAME);
    console.log(process.env.NODE);
});</code></pre><h3 id="pacakagejson-사용">pacakage.json 사용</h3>
<blockquote>
<p>npm install cross-env</p>
</blockquote>
<p>Node.js 프로젝트에서 운영 체제 간 환경변수 설정을 도와주는 모듈</p>
<pre><code>&quot;scripts&quot;: {
    &quot;start&quot;: &quot;cross-env NODE_ENV=development node index.js&quot;,
    &quot;start:prod&quot;: &quot;cross-env NODE_ENV=production node index.js,
    &quot;test&quot;: &quot;echo \&quot; Error: no test specified\&quot; &amp;&amp; exit 1&quot;
},</code></pre><p>MVC 이론에 대해 알아보자.</p>
<h3 id="mvc란">MVC란?</h3>
<ul>
<li>Model View Controller</li>
<li>소프트웨어 설계와 관련된 디자인 패턴 (상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론)</li>
<li>MVC 이용 웹 프레임워크<ul>
<li>PHP</li>
<li>Django</li>
<li>Express</li>
<li>Angular 등등</li>
</ul>
</li>
</ul>
<h3 id="mvc-장단점">MVC 장단점</h3>
<ul>
<li>장점</li>
</ul>
<ol>
<li>패턴들을 구분해 개발</li>
<li>유지보수 용이</li>
<li>유연성이 높다.</li>
<li>확장성이 높다.</li>
<li>협업에 용이</li>
</ol>
<ul>
<li>단점</li>
</ul>
<ol>
<li>완벽한 의존성 분리가 어렵다</li>
<li>설계 단계가 복잡하다</li>
<li>설계 시간이 오래 걸린다.</li>
<li>클래스(단위) 가 많아진다.</li>
</ol>
<h3 id="mvc-흐름">MVC 흐름</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/5432b933-28a0-4b72-9a14-73b3c39aeda7/image.png" alt=""></p>
<ul>
<li><p>Model</p>
<ul>
<li>데이터를 처리하는 부분</li>
</ul>
</li>
<li><p>View</p>
<ul>
<li>UI 관련된 것을 처리하는 부분 (사용자에게 보여지는 부분)</li>
</ul>
</li>
<li><p>Controller</p>
<ul>
<li><p>View와 Model을 연결해주는 부분</p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/eb7181e6-ef94-47c9-b457-b9ecec6569b2/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="indexjsappjs-개인적으로는-appjs가-친숙하다">index.js(app.js) 개인적으로는 app.js가 친숙하다.</h3>
<pre><code>const indexRouter = require(&#39;./routes&#39;); // index는 생략 가능!
app.use(&#39;/&#39;, indexRouter); // localhost:PORT / 경로를 기본으로 ./routes/index.js 파일에 선언한 대로 동작

// 404 error ㅓ리
app.get(&#39;*&#39;, (req, res) =&gt; {
    // res.send(&#39;404 Error! 잘못된 주소 형식입니다.);
    res.render(&#39;404&#39;);
});

app.listen(PORT, () =&gt; {
    console.log(`http://localhost:${PORT}`);
});
</code></pre><ul>
<li>Router 불러오는 부분</li>
<li>위의 코드를 이용해 특정 시작 url의 역할 구분 가능</li>
</ul>
<h3 id="routesindexjs">routes/index.js</h3>
<pre><code>const express = require(&#39;express&#39;)&#39;
const controller = require(&#39;../controller/Cmain.js&#39;);
const router = express.Router();

// localhost:PORT/
router.get(&#39;/&#39;, controller.main); // GET /
router.get(&#39;/comments&#39;, controller.comments); // GET / coments

module.exports = router;</code></pre><ul>
<li>경로를 controller와 연결해 설정 가능</li>
</ul>
<h3 id="참고---404-error-라우팅">참고 - 404 Error 라우팅</h3>
<pre><code>app.get(&#39;*&#39;, (req, res) =&gt; {
    // res.send(&#39;404 Error! 잘못된 주소 형식입니다.&#39;);
    res.render(&#39;404&#39;);
});</code></pre><p>주로 get을 사용</p>
<pre><code>app.use(&#39;*&#39;, (req, res) =&gt; {
    res.status(404).render(&#39;404&#39;);
});</code></pre><p>모든 http 요청에 사용</p>
<ul>
<li>맨 마지막 라우트로 선언</li>
<li><ul>
<li>: 그 외 나머지 주소는 모두(all) 잘못된 요청임을 사용자에게 알려야 함</li>
</ul>
</li>
<li>클라이언트가 올바르지 않은 주소로 요청 시 Error 페이지 렌더링</li>
<li>use일때는 모든 http 요청시 404페이지 나타나게 됨</li>
</ul>
<h3 id="controllercmainjs">Controller/Cmain.js</h3>
<pre><code>exports.main = (req, res) =&gt; {
    res.render(&#39;index&#39;);
};

exports.comments = (req, res) =&gt; {
    res.render(&#39;comments&#39;);
};</code></pre><ul>
<li>경로와 연결될 함수 내용을 정의</li>
<li>경로와 연결되는 함수이기에 req객체와 res 객체를 사용 가능</li>
</ul>
<h3 id="controller---model">Controller - model</h3>
<pre><code>const Comment = require(&#39;../model/Comment&#39;);

exports.main = (req, res) =&gt; {
    res.render(&#39;index&#39;);
};

exports.comments = (req, res) =&gt; {
    console.log(Comment.commentInfos()); // 댓글 목록이 [ {}, {}, {} ] 형태로 출력
    res.render(&#39;comments&#39;, { commentInfos: Comment.commentInfos() });
};</code></pre><ul>
<li>컨트롤러와 모델을 연결한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/44fe1f11-55a6-4151-8f39-6d086d829622/image.png" alt=""></p>
<p>환경변수와 MVC의 개념및 코드 활용법에 대해 알아봤다.
다음 블로깅은 동적 폼 전송의 로그인 실습을 MVC 구조로 바꾸는 문제를 연습해보고 작성하는 시간을 가지려고 한다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 10주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 9주차 회고 | 데이터베이스 - 2]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-9%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-2</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-9%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-2</guid>
            <pubDate>Sat, 24 Feb 2024 06:04:32 GMT</pubDate>
            <description><![CDATA[<h2 id="지난-데이터베이스-sql문-에-대해-계속-알아가보자">지난 데이터베이스 SQL문 에 대해 계속 알아가보자.</h2>
<h3 id="sql문">SQL문</h3>
<h3 id="where-절---범위-집합-패턴-null">WHERE 절 - 범위, 집합, 패턴, NULL</h3>
<ul>
<li><p>BETWEEN a AND b : 
a와 b의 값 사이에 있으면 참 (a와 b 값도 포함)</p>
</li>
<li><p>IN ( list ) : 
리스트에 있는 값 중에서 어느 하나라도 일치하면 참</p>
</li>
<li><p>LIKE &#39;비교문자열&#39; : 
비교문자열과 형태가 일치하면 사용 (%, _사용)</p>
</li>
<li><p>% 
0개 이상의 어떤 문자</p>
</li>
<li><p>_
1개의 단일문자</p>
</li>
<li><p>IS NULL : 
NULL 값인 경우 true, 아니면 false</p>
</li>
</ul>
<h3 id="where-절---논리연산자">WHERE 절 - 논리연산자</h3>
<p>AND : 앞에 있는 조건과 뒤에 오는 조건이 참(TRUE)가 되면 결과도 참(TRUE)
OR : 앞에 있는 조건과 뒤에 오는 조건 중 하나라도 참(TRUE)면 결과는 참(TRUE)
NOT : 뒤에 오는 조건과 반대되는 결과를 돌려준다.</p>
<h3 id="order-by">ORDER BY</h3>
<ul>
<li>결과가 출력되는 순서 조절</li>
<li>where 절과 함께 사용 가능<ul>
<li>단 where 절 뒤에 나와야함
ASC: Ascending, 오름차순(기본값)
DESC: Descending, 내림차순</li>
</ul>
</li>
</ul>
<h3 id="distinct">DISTINCT</h3>
<ul>
<li>중복된 데이터 제거</li>
</ul>
<h3 id="limit">LIMIT</h3>
<ul>
<li>출력 개수 제한</li>
</ul>
<h3 id="집계함수">집계함수</h3>
<p>SUM() 합계
AVG() 평균
MAX() 최대값
MIN() 최소값
COUNT() 행 개수
COUNT(DISTICT) 중복 제외한 행 개수</p>
<h3 id="group-by">GROUP BY</h3>
<ul>
<li>group by
  속성이름끼리 그룹으로 묶는 역할</li>
<li>having
  group by절의 결과를 나타내는 그룹의 조건 걸기</li>
</ul>
<h3 id="dml---update-delete">DML - UPDATE, DELETE</h3>
<p>UPDATE</p>
<ul>
<li>데이터를 <strong>수정</strong>하기 위해 사용<blockquote>
<p>UPDATE 테이블명 SET 필드1=값1 WHERE 필드2=조건2;</p>
</blockquote>
</li>
</ul>
<p>DELETE</p>
<ul>
<li>데이터를 <strong>삭제</strong>하기 위해 사용<blockquote>
<p>DELETE FROM 테이블명 WHERE 필드1=값1;</p>
</blockquote>
</li>
</ul>
<h3 id="결론">결론</h3>
<p>한동안 백엔드 관련 블로깅을 해야 할 거 같다. 복습해야 할 부분이 많이 남아있는 만큼 여러 번 반복을 통해 익혀나가겠다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 9주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 9주차 회고 | 데이터베이스 - 1]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-9%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-9%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Wed, 21 Feb 2024 14:44:36 GMT</pubDate>
            <description><![CDATA[<h2 id="sql문-에-대해-알아보자">SQL문 에 대해 알아보자</h2>
<h3 id="sql문">SQL문</h3>
<ul>
<li>Structured Query Language</li>
<li>구조적 쿼리 언어</li>
<li>관계형 데이터베이스를 제어하고 관리할 수 있는 목적의 프로그래밍 언어</li>
</ul>
<h3 id="sql-분류">SQL 분류</h3>
<ul>
<li>데이터 정의어 (DDL, Data Definition Language)</li>
<li>데이터 조작어 (DML, Data Manipulation Language)</li>
<li>데이터 제어어 (DCL, Data Control Language)</li>
</ul>
<h3 id="데이터-정의어">데이터 정의어</h3>
<p>SQL문 – DDL</p>
<ul>
<li>DDL ( Data Definition Language )</li>
<li>데이터베이스 or 테이블을 정의하는 언어</li>
</ul>
<h3 id="ddl---create">DDL - CREATE</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/f3bd0db5-8fa2-4373-85b3-6225b4070127/image.png" alt=""></p>
<h2 id="2-데이터-정의어-dml">2 데이터 정의어 DML</h2>
<h3 id="sql문--dml">SQL문 – DML</h3>
<ul>
<li>DML ( Data Manipulation Language )</li>
<li>데이터베이스의 내부 데이터를 관리하기 위한 언어</li>
</ul>
<p>Response 객체
writeHead: 응답 헤더 작성
write: 응답 본문 작성
end: 응답 본문 작성 후 응답 종료</p>
<h3 id="crud">CRUD</h3>
<ul>
<li>대부분의 컴퓨터 소프트웨어가 가지는 기본적인 처리 기능</li>
<li>Create(생성)</li>
<li>Read(읽기)</li>
<li>Update(갱신)</li>
<li>Delete(삭제)</li>
</ul>
<h3 id="dml---insert">DML - INSERT</h3>
<ul>
<li>테이블에 데이터를 추가하기 위해 사용</li>
</ul>
<h3 id="select문">SELECT문</h3>
<ul>
<li>데이터를 검색하는 기본 문장</li>
<li>질의어(query)라고도 함</li>
<li>SQL문 중 가장 많이 사용되는 문법</li>
</ul>
<blockquote>
<p>SELECT 속성이름, ...FROM 테이블이름 [where 검색조건]</p>
</blockquote>
<h3 id="sql-문-내부적-실행-순서">SQL 문 내부적 실행 순서</h3>
<ul>
<li>홍길동 고객의 주소를 찾으시오.<blockquote>
<p>SELECT addr FROM customer WHERE custname = &#39;홍길동&#39;;</p>
</blockquote>
</li>
</ul>
<h3 id="select-문-구성요소">SELECT 문 구성요소</h3>
<p>SELECT addr - 속성이름
FROM coustomer - 테이블 이름
WHERE custname = &#39;홍길동&#39;; - 검색 조건</p>
<h3 id="dml---select">DML - SELECT</h3>
<ul>
<li>데이터를 검색(조회)하기 위해 사용</li>
</ul>
<pre><code>SELECT * FROM 테이블명;
SELECT * FROM 테이블명 WHERE 필드1 = 조건값1;
SELECT * FROM 테이블명 WHERE 필드1 = 조건값1 ORDER BY 필드1 ASC;
SELECT 필드1, 필드2, 필드3 FROM 테이블명 WHERE 필드1 = 조건값1 ORDER BY 필드1 ASC;
SELECT 필드1, 필드2, 필드3 FROM 테이블명 WHERE 필드1 = 조건값1 ORDER BY 필드1 ASC LIMIT 개수;</code></pre><h3 id="where-절---부정연산자">WHERE 절 - 부정연산자</h3>
<blockquote>
<p>!= 같지 않다.
  ^= 같지 않다.
  &lt;&gt; 같지 않다
  NOT 컬럼명 = ~와 같지 않다.</p>
</blockquote>
<h3 id="where-절---부정연산자-1">WHERE 절 - 부정연산자</h3>
<blockquote>
<p>!= 같지 않다.
  ^= 같지 않다.
  &lt;&gt; 같지 않다
  NOT 컬럼명 = ~와 같지 않다.</p>
</blockquote>
<blockquote>
<p>데이터베이스 SQL문을 추가로 블로깅 해야 할거같다.</p>
</blockquote>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 9주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 8주차 회고 | 모듈 (Module)]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EB%AA%A8%EB%93%88-Module</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-%EB%AA%A8%EB%93%88-Module</guid>
            <pubDate>Wed, 14 Feb 2024 07:44:40 GMT</pubDate>
            <description><![CDATA[<h2 id="모듈-module-에-대해-알아보자">모듈 (Module) 에 대해 알아보자</h2>
<h3 id="모듈">모듈</h3>
<ul>
<li>특정한 기능을 함수나 변수들의 집합</li>
<li>재사용 가능한 코드 조각</li>
</ul>
<h3 id="모듈의-장점">모듈의 장점</h3>
<ul>
<li><p>코드 추상화
  -&gt; 복잡한 시스템이나 객체를 단순화하여 핵심적인 부분에 집중하는 프로그래밍 원칙</p>
</li>
<li><p>코드 캡슐화
  -&gt; 코드의 무분별한 변경을 막기 위해 모듈 내부에 코드를 숨길 수 있다</p>
</li>
<li><p>코드 재사용</p>
</li>
<li><p>의존성 관리</p>
</li>
</ul>
<h3 id="모듈-만들기---1">모듈 만들기 - 1</h3>
<p>하나의 모듈 파일에 하나 만들기</p>
<pre><code>function connect() {
    return a + b;
}

module.exports = connect;</code></pre><h3 id="모듈-만들기---2">모듈 만들기 - 2</h3>
<p>하나의 모듈 파일에 여러 개 만들기</p>
<pre><code>const a = &quot;a 변수&quot;;
const b = &quot;b 변수&quot;;

//1
module.exports = {
    a,
    b
}

//2
module.exports.a = a
module.exports.b = b

//2의 생략
exports.a = a
exports.b = b</code></pre><h3 id="모듈-불러오기">모듈 불러오기</h3>
<p>const { } 로 가져올 때는 구조분해해 가져오기에 이름이 동일해야 한다.</p>
<pre><code>const { a, b } = require(&quot;./var.js&quot;);
const returnString = require(&quot;./func.js&quot;);</code></pre><p>하나만 내보낸 모듈은 다른 이름이어도 불러올 수 있다.</p>
<h3 id="http-모듈">http 모듈</h3>
<ul>
<li><p>Node.js를 통해 서버를 구축하는 방법은 http와 express 두개</p>
</li>
<li><p>http 모듈</p>
<ul>
<li><p>웹서버를 구동하기 위한 node.js 내장 웹모듈</p>
</li>
<li><p>server 객체, request 객체, response 객체를 사용한다.</p>
</li>
<li><p>server 객체: 웹 서버를 생성할때 사용하는 객체</p>
</li>
<li><p>request 객체: 응답메시지를 작성할 때 첫 번째 매개변수로 전달되는 객체</p>
</li>
<li><p>response 객체: 응답메시지를 작성할 때 두 번째 매개변수로 전달되는 객체</p>
</li>
</ul>
</li>
</ul>
<pre><code>const http = require(&#39;http&#39;);

const server = http.createServer();

server.listen(8080, function() {
    console.log(&#39;8080번 포트로 서버 실행&#39;);
};

listen(port, callback) 서버를 첫번째 매개변수의 포트로 실행한다.</code></pre><pre><code>const http = require(&#39;http&#39;);

const server = http.createServer(function(req,res) {
    res.writeHead( 200 );
    res.write( &quot;&lt;h1&gt;Hello!&lt;/h1&gt;&quot;);
    res.end(&quot;&lt;p&gt;End&lt;/p&gt;);
});

server.listen(8080, function() {
    console.log(&#39;8080번 포트로 서버 실행&#39;);
};
</code></pre><p>Response 객체
writeHead: 응답 헤더 작성
write: 응답 본문 작성
end: 응답 본문 작성 후 응답 종료</p>
<h3 id="localhost와-port">localhost와 port</h3>
<ul>
<li><p>localhost
  -localhost는 컴퓨터 내부 주소 (127.0.0.1)
  -자신의 컴퓨터를 가리키는 호스트이름(hostname)</p>
</li>
<li><p>port
  -서버 내에서 데이터를 주고받는 프로세스를 구분하기 위한 번호
  -기본적으로 http서버는 80번 포트 사용 (생략 가능, https는 443)</p>
</li>
</ul>
<h3 id="server-객체">server 객체</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/44746077-1c15-4b5a-b5d6-9d9f5f84c062/image.png" alt=""></p>
<h3 id="server-객체---이벤트">server 객체 - 이벤트</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/440218e9-0b3b-4bf4-bc29-2c0b1697241f/image.png" alt=""></p>
<h3 id="express-모듈">express 모듈</h3>
<h4 id="express">express</h4>
<ul>
<li><p>웹 서버를 생성하는 것과 관련된 기능을 담당하는 프레임워크</p>
</li>
<li><p>웹 애플리케이션을 만들기 위한 각종 메소드와 미들웨어 등이 내장되어 있다.</p>
</li>
<li><p>http 모듈 이용 시 코드의 가독성 ↓ 확장성 ↓
→ 이를 해결하기 위해 만들어진 것이 <strong>Express 프레임워크</strong></p>
</li>
</ul>
<h4 id="express-사용">express 사용</h4>
<pre><code>const express = require(&#39;express&#39;);
const app = express();
const PORT = 8000;

app.get(&#39;/&#39;, function (req, res) {
    res.send(&#39;hello express&#39;);
});

app.listen(PORT, function () {
    console.log(`Listening on port ${PORT} http://localhost:${PORT}`);
});
</code></pre><p>Express 사용</p>
<ul>
<li><p>express()</p>
<ul>
<li>Express 모듈이 export하는 최상위 함수로, express application 을 만듬</li>
</ul>
</li>
<li><p>app 객체</p>
<ul>
<li>Express()함수를 호출함으로써 만들어진 express application</li>
</ul>
</li>
</ul>
<h3 id="ejs-템플릿">EJS 템플릿</h3>
<ul>
<li>템플릿 엔진
  문법과 설정에 따라 파일을 html 형식으로 변환시키는 모듈</li>
<li>ejs
  Embedded Javascript 의 약자로, 자바스크립트가 내장되어 있는 html 파일
  확장자는 .ejs</li>
</ul>
<h4 id="ejs-문법-사용하기">ejs 문법 사용하기</h4>
<blockquote>
</blockquote>
<p>&lt;% %&gt;
무조건 자바스크립트 코드가 들어가야 하고 줄바꿈을 할 경우에는 새로운 &lt;% %&gt; 를 이용해야 한다.</p>
<blockquote>
</blockquote>
<p>&lt;% %&gt;
값을템플릿에출력할때사용</p>
<blockquote>
</blockquote>
<p>&lt;%- include(&#39;view의 상대주소&#39;) %&gt;
다른 view 파일을 불러올 때 사용</p>
<h3 id="미들웨어">미들웨어</h3>
<ul>
<li>요청이 들어옴에 따라 응답까지의 중간 과정을 함수로 분리한 것</li>
<li>서버와 클라이언트를 이어주는 중간 작업</li>
<li>use()를 이용해 등록할 수 있다.</li>
</ul>
<p>app.set(&#39;view engine&#39;, &#39;ejs&#39;);
app.use(&#39;/views&#39;, express.static(__dirname + &#39;/views&#39;));</p>
<h3 id="미들웨어---static">미들웨어 - static</h3>
<ul>
<li><p>이미지,css 파일 및 Javascript 파일과 같은 정적 파일 제공</p>
</li>
<li><p>Express에 있는 static 메소드를 이용해 미들웨어로 로드</p>
</li>
<li><p>등록방법
app.use(&#39;/static&#39;, express.static(__dirname + &#39;/static&#39;));</p>
</li>
</ul>
<h3 id="결론">결론</h3>
<p>모듈, ejs, 미들웨어 등에 대해 알아봤다. Node.js와 관련된 개념 및 문제들을 앞으로 많이 작성할것 같다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 8주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 8주차 회고 | Node.js]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Wed, 14 Feb 2024 04:24:36 GMT</pubDate>
            <description><![CDATA[<h2 id="nodejs-에-대해-알아보자">Node.js 에 대해 알아보자</h2>
<h3 id="nodejs">Node.js</h3>
<ul>
<li>구글 크롬의 자바스크립트 엔진(V8 Engine)에 기반해 만들어진
Javascript 런타임</li>
<li>이벤트 기반, 비동기 I/O 모델을 사용해 가볍고 효율적</li>
<li>npm 패키지는 세계에서 가장 큰 오픈 소스 라이브러리</li>
</ul>
<h3 id="런타임이란">런타임이란?</h3>
<ul>
<li>프로그래밍 언어가 구동되는 환경</li>
<li>Javascript의 런타임 환경은 웹 브라우저만 존재 했었다
-&gt; Javascript를 서버단 언어로 사용하기 위해 나온 것이 node.js
-&gt; 웹 브라우저 없이 실행 가능</li>
</ul>
<h3 id="npm">npm</h3>
<p>Node Packgae Manager
노드 패키지를 관리해주는 틀 (npm에 업로드 된 모듈, 패키지들 간 의존 관계가 존재)</p>
<h3 id="packagejson">package.json</h3>
<ul>
<li>패키지들이 서로 의존되어 있어, 문제가 발생할 수 있는데 이를 관리하기 위해 필요한 것</li>
<li>프로젝트에 대한 정보와 사용중인 패키지 이름 및 버전 정보가 담겨 있는 파일</li>
</ul>
<blockquote>
</blockquote>
<p>&quot;name&quot; : 패키지 이름
&quot;version&quot; : 패키지의 버전
&quot;main&quot; : 자바스크립트 실행 파일 진입점 (문답식에서의 entry point)
&quot;description&quot; : 패키지에 대한 설명
&quot;scripts&quot;: npm run 을 이용해 정해놓는 스크립트 명령어
&quot;license&quot;: 해당 패키지의 라이센스</p>
<h3 id="npm-사용하기">npm 사용하기</h3>
<p><strong>npm init</strong></p>
<ul>
<li>프로젝트를 시작할 때 사용하는 명령어</li>
<li>package.json에 기록 될 내용을 문답식으로 입력한다.</li>
</ul>
<p><strong>npm init --y</strong></p>
<ul>
<li>pacakge.json이 생성될 때 기본값으로 생성된다.</li>
</ul>
<p><strong>npm install 패키지 이름</strong></p>
<ul>
<li>프로젝트에서 사용할 패키지를 설치하는 명령어</li>
<li>설치된 패키지의 이름과 정보는 package.json의 dependencies에 입력된다.</li>
</ul>
<h3 id="nodejs-특징">Node.js 특징</h3>
<ol>
<li>자바스크립트 언어 사용</li>
<li>Single Thread</li>
<li>Non-blocking I/O</li>
<li>비동기적 Eevent-Driven</li>
</ol>
<h4 id="single-thread">Single Thread</h4>
<p>프로세스</p>
<ul>
<li>실행 중인 프로그램</li>
<li>운영체제에서 할당하는 작업의 단위</li>
</ul>
<p>Thread(스레드)</p>
<ul>
<li>프로세스 내에서 실행되는 흐름의 단위</li>
<li>하나의 프로세스에는 n개의 스레드가 존재하며 동시에 작동할 수 있다.</li>
</ul>
<blockquote>
<p>Node.js는 사용자가 직접 제어할 수 있는 스레드는 하나이다.</p>
</blockquote>
<ul>
<li>싱글 스레드가 주어진 일을 하나밖에 처리 못한다.</li>
<li>Non-blocking I/O 기능으로 일부 코드는 백그라운드(다른 프로세스)에서 실행 가능</li>
<li>에러를 처리하지 못하는 경우 멈춘다.</li>
<li>프로그래밍 난이도가 쉽고, cpu, 메모리 자원을 적게 사용한다.</li>
</ul>
<p>에러를 처리하지 못하면 프로그램이 아예 중단됨</p>
<h3 id="non-blocking-io">Non-blocking I/O</h3>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/b5aef722-1551-4f0a-aea2-a1aa61521d97/image.png" alt=""></p>
<blockquote>
<p>동기 (Synchronous)</p>
</blockquote>
<ul>
<li>데이터의 요청과 결과가 한 자리에서 동시에 일어나는 것</li>
<li>시간이 얼마가 걸리던지 요청한 자리에서 결과가 주어진다.</li>
<li>한 요청에 서버의 응답이 이루어질 때까지 계속 대기해야 한다</li>
</ul>
<blockquote>
<p>비동기 (Asynchronous)</p>
</blockquote>
<ul>
<li>동시에 일어나지 않는 것</li>
<li>요청한 후 응답을 기다리지 않고 다른 활동을 한다.</li>
</ul>
<p>I/O 작업 : 파일 시스템 접근 ( 읽기, 쓰기, 만들기 등 ), 네트워크 요청</p>
<p>Node.js는 표준 라이브러리의 모든 I/O 메서드를 비동기 방식으로 제공한다.</p>
<h4 id="event-driven">Event-Driven</h4>
<ul>
<li>Event-Driven: 이벤트가 발생할 때 미리 지정해둔 작업을 수행</li>
<li>ex) 클릭, 네트워크 요청, 타이머 등</li>
<li>이벤트 리스너 (Event Listener)
-&gt; 이벤트 등록 함수</li>
<li>콜백 함수 (Callback Function)
-&gt; 이벤트가 발생했을 때 실행되는 함수</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/25bcebd7-19fe-44d6-8182-92d7b7a9057c/image.png" alt=""></p>
<h4 id="call-stack">Call Stack</h4>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/07e8ef13-9018-491b-a55c-25e7850689fc/image.png" alt=""></p>
<h4 id="event-loop">Event Loop</h4>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/46b801f3-7ff2-45b6-9627-fbc5176678c8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/6a8c08a8-f3ce-4e1e-aaf5-67f08d862613/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/72043c26-0048-4a49-a731-8f742bbae94b/image.png" alt=""></p>
<h3 id="nodejs의-역할">Node.js의 역할</h3>
<ul>
<li>간단한 로직</li>
<li>대량의 클라이언트가 접속하는 서비스 (입출력이 많은 서비스)</li>
<li>빠른 개발 요구, 빠른 응답시간 요구</li>
<li>비동기 방식에 어울리는 서비스(스트리밍 서비스, 채팅 서비스 등 )</li>
</ul>
<h3 id="결론">결론</h3>
<p>서버에 데이터를 요청할때 필요한 axios fetch를 같이 알아봤다. 여기에 Ajax 등도 있다.
개인적으로 axios/fetch 이 두 가지를 사용하게 될거 같다.
다음에는 예제 등을 가져와 코드를 추가로 보충하겠다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 8주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 7주차 회고 | Axios / Fetch]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-7%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-Axios-Fetch</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-7%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-Axios-Fetch</guid>
            <pubDate>Sun, 11 Feb 2024 14:02:32 GMT</pubDate>
            <description><![CDATA[<h2 id="axios--fetch-에-대해-알아보자">Axios / Fetch 에 대해 알아보자</h2>
<h3 id="axios">Axios</h3>
<h4 id="nodejs와-브라우저를-위한-promise-api를-활용">Node.js와 브라우저를 위한 Promise API를 활용</h4>
<h4 id="비동기-http-통신이-가능-return이-promise-객체로-온다">비동기 HTTP 통신이 가능. return이 Promise 객체로 온다.</h4>
<ul>
<li><p>장점</p>
<ul>
<li>Promise 기반으로 만들어졌다.</li>
<li>브라우저 호환성이 뛰어나다</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li><p>모듈 설치 or 호출을 해줘야 사용이 가능하다
npm i 또는 cdn 사용해야 한다.</p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/f0067600-913e-4ad7-b02c-80ea2643045b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/5aaeb2e6-47ab-459d-a23e-366fbaa56c05/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="fetch">Fetch</h3>
<h4 id="javascript-내장-라이브러리">JavaScript 내장 라이브러리</h4>
<h4 id="promise-기반">Promise 기반</h4>
<ul>
<li><p>장점</p>
<ul>
<li>JavaScript 내장 라이브러리이므로 별도의 import 필요X</li>
<li>Promise 기반</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li>최신 문법</li>
<li>Timeout 기능이 없다</li>
<li>상대적으로 Axios에 비해 기능 부족</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/66ddcccb-ab8f-444d-88da-8cd34e37240e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/6d7a6c65-5dfa-4af2-8c3f-305688e09c47/image.png" alt=""></p>
<h3 id="fetch---response">Fetch - response</h3>
<p>response 에는 Promise를 기반으로 하는 다양한 메서드(함수) 존재.
이 메서드들을 사용하면 다양한 형태의 응답 처리 가능
response.text() - 응답을 읽고 텍스트를 반환
response.json() - 응답을 JSON 형태로 파싱 (실제로 확인해보면 JavaScript 객체 형태로 반환)</p>
<p><img src="https://velog.velcdn.com/images/hyunwoo__ji/post/924d845a-42cd-4407-a5ee-768e5d95e525/image.png" alt=""></p>
<h3 id="결론">결론</h3>
<p>서버에 데이터를 요청할때 필요한 axios fetch를 같이 알아봤다. 여기에 Ajax 등도 있다.
개인적으로 axios/fetch 이 두 가지를 사용하게 될 거같아 지금부터 미리 연습을 많이 해야겠다고 느꼈다.
다음에는 예제 등을 가져와 코드를 추가로 보충해야겠다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 7주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 7주차 회고 | JavaScript - Promise]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-7%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-JavaScript-Promise</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-7%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-JavaScript-Promise</guid>
            <pubDate>Wed, 07 Feb 2024 14:58:46 GMT</pubDate>
            <description><![CDATA[<h2 id="promise를-예제를-통해-알아보기로-하자">Promise()를 예제를 통해 알아보기로 하자</h2>
<h3 id="promise-예제-01">Promise 예제 01</h3>
<pre><code>let colorBg = (newBg, delay) =&gt; {
    return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            document.body.style.backgroundColor = newBg;
            resolve();
        }, delay);
    })
}

colorBg(&#39;red&#39;, 1000)
.then(() =&gt; {
    return colorBg(&#39;orange&#39;, 1500);
})
.then(() =&gt; {
    return colorbg(&#39;blue&#39;, 2500)
})
.then(() =&gt; {
    return colorbg(&#39;black&#39;, 3500)
})
.then(() =&gt; {
    return colorbg(&#39;lightblue&#39;, 4500)
})
</code></pre><p>resolve 콜백함수만 사용하였으며, 백그라운드 색상(newBg)과 딜레이 시간(delay)을 변수로 저장해서 코드를 작성하였다.</p>
<ul>
<li>Promise는 두 가지 콜백 함수를 가짐
resolve(value): 작업이 성공(fulfilled)한 경우, 그 결과를 value와 함께 호출
reject(error): 에러(rejected)발생 시 에러 객체를 나타내는 error와 함께 호출</li>
</ul>
<h3 id="promise-예제-02">Promise 예제 02</h3>
<pre><code>function call(name) {
    return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            console.log(name);
            resolve(name);
        }, 1000);
    })
 }
 function back() {
     return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            console.log(&#39;back&#39;)
            resolve(&#39;back&#39;);
        }, 1000);
     })
  }
  function hell() {
      return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            resolve(&#39;callback hell&#39;);
        }, 1000);
     })
  }

  // promise 실행
      call(&#39;kim&#39;).then((res) =&gt; {
        console.log(`${res} 반가워`);
        return back();
    })
    .then((res1) =&gt; {
        console.log(`${res1}을 실행 했구나`);
        return hell();
    })
    .then((res2) =&gt; {
        console.log(`여기는 ${res2}`);
    });</code></pre><h3 id="async--await-으로-예제-2-수정">async / await 으로 예제 2 수정</h3>
<p>async / await
프로미스 기반 코드를 좀 더 쓰기 쉽고 읽기 쉽게 하기 위해 등장
비동기 처리 패턴 중 가장 최근에 나온 문법</p>
<p>  async</p>
<ul>
<li><p>함수 앞에 붙여 Promise를 반환한다</p>
</li>
<li><p>프로미스가 아닌 값을 반환해도 프로미스로 감싸서 반환한다.</p>
<p>await</p>
</li>
<li><p>프로미스 앞에 붙여 프로미스가 다 처리될 때가지 기다리는 역할을 하며 결과는
그 후에 반환한다.</p>
</li>
</ul>
<pre><code>let exec = async () =&gt; {
    let name = await call(&#39;kim&#39;);
    console.log(`${name} 반가워`);

    let res1 = await back();
    console.log(`${res1} 을 실행했구나`);

    let res2 = await hell();
    console.log(`여기는 ${res2}`);
  };

  exec();

 async function exec() {
     let name = await call(&#39;kim&#39;);
    console.log(`${name} 반가워`);
    let res = await back();
       console.log(`${res}을 실행 했구나`);
    let result = await hell();
    console.log(`여기는 ${result}`);
  }

 exec();</code></pre><h3 id="결론">결론</h3>
<p>Promise()와 async/await의 중요하기에 복습 및 예제 코드등을 다시 한번 정리하는 시간을 가졌다. 비동기와 동기 그리고 콜백함수까지 까먹지 않게 공부 및 연습을 많이 해야할 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 6주차 회고 | JavaScript - 콜백함수]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-6%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-JavaScript-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-6%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-JavaScript-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 05 Feb 2024 13:29:16 GMT</pubDate>
            <description><![CDATA[<h2 id="자바스크립트의-콜백함수에-대해-알아보자">자바스크립트의 콜백함수에 대해 알아보자</h2>
<h3 id="콜백함수">콜백함수</h3>
<p>JavaScript는 함수를 인자로 받고 다른 함수를 통해 반환될 수 있는데, 인자(매개변수)로 대입되는 함수를 콜백함수라고 한다.</p>
<p>즉, 다른 함수가 실행을 끝낸 뒤 실행되는 함수</p>
<p>함수를 선언할 때는 parameter(인자, 매개변수)로 함수를 받아서 쓸 수 있다.</p>
<ul>
<li>비동기 받ㅇ식으로 작성된 함수를 동기 처리하기 위하여 사용
독립적으로 수행되느 작업도 있는 반면 응답을 받은 이후 처리되어야 하는 종속적인 작업도 있을 수 있으므로 그에 대한 대응 방법이 필요</li>
</ul>
<h3 id="콜백지옥">콜백지옥</h3>
<ul>
<li>비동기 프로그래밍시 발생하는 문제</li>
<li>함수의 매개변수로 넘겨지는 콜백 함수가 반복되어 코드의 들여쓰기가 너무 깊어지는 현상</li>
<li>가독성은 떨어지고 코드수정 난이도는 올라간다.</li>
</ul>
<h3 id="promise">Promise</h3>
<ul>
<li>비동기 함수를 동기 처리하기 위해 만들어진 객체</li>
<li>성공과 실패를 분리하여 반환</li>
<li>비동기 작업이 완료된 이후에 다음 작업을 연결시켜 진행할 수 있는 기능을 가짐</li>
</ul>
<h3 id="promise-사용법-01">Promise 사용법 01</h3>
<pre><code>function promise1(flag) {
    return new Promise(function (resolve, reject) {
    if(flag) {
        resolve(&#39;promise 상태는 fulfilled!!! then으로 연결됩니다. \n 이때의 flag가 true입니다.&#39;);
    } else {
        reject(&#39;promise 상태는 rejected!!! catch로 연결됩니다&#39;. \n 이때의 flag가 false입니다.&#39;);
    }
  });
}</code></pre><ul>
<li>Promise는 두 가지 콜백 함수를 가짐
resolve(value): 작업이 성공(fulfilled)한 경우, 그 결과를 value와 함께 호출
reject(error): 에러(rejected)발생 시 에러 객체를 나타내는 error와 함께 호출</li>
</ul>
<h3 id="promise-사용법-02">Promise 사용법 02</h3>
<pre><code>함수 호출 (성공)
promise1(true)
 .then(function (result) {
     console.log(result);
 })
 .catch(function (err) {
     console.log(err);
 });

 함수 호출 (실패)
promise1(true)
 .then(function (result) {
     console.log(result);
 })
 **.catch**(function (err) {
     console.log(err);
 });

 - resolve() -&gt; then 메서드 실행
 - reject() -&gt; catch 메서드 실행

</code></pre><h3 id="async--await">async / await</h3>
<ul>
<li>Promise도 chaning을 하다보면 then().then() 처럼 꼬리를 물게 되어 코드의 가독성이 떨어질 수 있다.</li>
<li>Promise보다 직관적인 코드를 위해 등장한 async, await</li>
<li>기능이 추가된 것이 아닌, Promise를 다르게 사용하는 것</li>
</ul>
<p>async / await
프로미스 기반 코드를 좀 더 쓰기 쉽고 읽기 쉽게 하기 위해 등장
비동기 처리 패턴 중 가장 최근에 나온 문법</p>
<p>  async</p>
<ul>
<li><p>함수 앞에 붙여 Promise를 반환한다</p>
</li>
<li><p>프로미스가 아닌 값을 반환해도 프로미스로 감싸서 반환한다.</p>
<p>await</p>
</li>
<li><p>프로미스 앞에 붙여 프로미스가 다 처리될 때가지 기다리는 역할을 하며 결과는
그 후에 반환한다.</p>
</li>
</ul>
<pre><code>function goMart() {
    console.log(&#39;마트에 가서 어떤 음료를 살지 고민한다&#39;);
}

function pickDrink() {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { 
            console.log(&#39;고민 끝!!&#39;);
            product = &#39;제로 콜라&#39;;
            price = 2000;
            resolve();
           }, 3000);
         });
        }

  function pay() {
      console.log(`상품명 : ${product}, 가격: ${price}`);
   }

   async function exec() {
       goMart();
    await pickDrink();
    pay();
   }

   let product;
   let price;
   exec();</code></pre><h3 id="결론">결론</h3>
<p>자바스크립트에서 가장 중요한 개념들을 알아봤다. 동기와 비동기등을 이해하고 사용하는데 연습을 통해서 익히고 이해해야 할 것 같다. 콜백함수로 처리된 코드를 Promise를 이용한 코드로 바꾸는 연습을 해야겠다고 느꼈다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 6주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩온] 웹개발자 풀스택 과정 6주차 회고 | JavaScript - 구조분해할당]]></title>
            <link>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-6%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-JavaScript-%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9</link>
            <guid>https://velog.io/@hyunwoo__ji/%EC%BD%94%EB%94%A9%EC%98%A8-%EC%9B%B9%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B3%BC%EC%A0%95-6%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-JavaScript-%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9</guid>
            <pubDate>Wed, 31 Jan 2024 07:43:17 GMT</pubDate>
            <description><![CDATA[<h2 id="자바스크립트에서-중요한-부분인-구조분해할당에에-대해-알아보자">자바스크립트에서 중요한 부분인 구조분해할당에에 대해 알아보자</h2>
<h4 id="-5주차는-프로젝트를-진행하였는데-회고를-프로젝트github의-readme에-작성할-예정이다">* 5주차는 프로젝트를 진행하였는데 회고를 프로젝트GitHub의 README에 작성할 예정이다.</h4>
<h3 id="구조분해-할당">구조분해 할당</h3>
<ul>
<li>배열이나 객체의 속성을 해체해 그 값을 개별변수에 담는 것</li>
<li>JavaScript 에서 많이 쓰이는 자료구조인 배열과 객체를 편하게 사용하기 위함</li>
<li>결국에는 코드를 얼마나 효율적인 방법으로 쓸 수 있는지에 대한 것으로 이해 하였다.</li>
</ul>
<h3 id="javascript-코드">JavaScript 코드</h3>
<pre><code>&lt;script&gt;
const car = {
    id: 1,
    name: &quot;현대&quot;,
    price: 2000,
}

// 객체의 키값을들 변수로 저장해 아래와 같이 저장할 수 있다.
const id = car.id;
const name = car.name;
const price = car.price;

// 구조분해할당으로 더 효율적으로 정리할 수 있다. 한줄로!
const {id, name, price} = car;

// 배열에서도 구조분해할당으로 정리 가능하다.

const plane = [2, &#39;대한항공&#39;, &#39;인천&#39;]

// 배열을 아래와 같이 할당했다.
const planeId = plane[0];
const planeName = plane[1];
const planePlace = plane[2];

// 구조분해할당으로 다시 정리해보자

const [planeId, planeName, planePlace] = plane;

// 한줄로 깔끔하게 작성할 수 있다.
// 객체는 {} 중괄호 - 배열은 [] 대괄호 사용
// 구조분해할당으로 꺼내와서 작성시 원하는 값만 작성도 가능하다.

const {id, name, price} = car;
const {name, price} = car; // id값 빼고 나머지 2개의 값 가져오기

// 배열은 조금 방법이 다르다
// 사용하지 않는 값에 언더바(_)로 대체해서 작성해야 한다. 

const [planeId, planeName, planePlace] = plane;
const [planeId, _, planePlace] = plane; // planeName을 언더바값으로 작성했다.

&lt;/script&gt;</code></pre><h3 id="spread-연산자---전개구문spread">spread 연산자 - 전개구문(spread)...</h3>
<ul>
<li><p>반복 가능한 객체에 사용하는 문법 -&gt; 배열, 유사 배열, 문자열 등에 사용 가능</p>
</li>
<li><p>객체의 요소에 접근해서 요소들을 하나씩 분리해서 전개요소에 접근해서 반환</p>
</li>
<li><p>연산자 ... 사용</p>
<blockquote>
<p>const arr1 = [1, 2, 3, 4, 5];
const arr2 = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;];
위 두 배열을 합쳐서 접근할때 spread연산자를 통해 가능하다
const arr3 = [...arr1, ...arr2];</p>
</blockquote>
<h3 id="spread-vs-rest">spread vs rest</h3>
<ul>
<li><p>spread 파라미터는 호출시 함수의 파라미터에 사용
  get(...values);</p>
</li>
<li><p>rest 파라미터는 호출 받는 함수의 파라미터에 사용
  호출하는 함수의 파라미터 순서에 맞춰 값 설정후 남은 파라미터 값을 배       열로 설정
<img src="https://velog.velcdn.com/images/hyunwoo__ji/post/fe39b284-8d25-49d0-be60-7303f1d7ca6a/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="결론">결론</h3>
<p>구조분해할당과 스프레드 연산자에 대한 개념과 예제를 통한 연습으로 이해할 수 있어서 좋은 공부가 되었다. 많은 도움이 될 수 있게 복습을 열심히 해야할 것 같다.</p>
<h3 id="참고">참고</h3>
<p>[코딩온] 웹개발자 풀스택 과정 6주차 ppt</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - while, forEach, filter]]></title>
            <link>https://velog.io/@hyunwoo__ji/JavaScript-while-forEach-filter</link>
            <guid>https://velog.io/@hyunwoo__ji/JavaScript-while-forEach-filter</guid>
            <pubDate>Sat, 27 Jan 2024 15:31:18 GMT</pubDate>
            <description><![CDATA[<h2 id="while문">while문</h2>
<h3 id="javascript-코드">JavaScript 코드</h3>
<pre><code>&lt;script&gt;
    let n = 0;
    let sum = 0;

    while(n &lt; 100) {
        if(n % 2 != 0 || n % 3 != 0) {
            sum += n;
        }
        n++;
    }
    console.log(sum);
&lt;/script&gt;</code></pre><ul>
<li>100까지의 숫자중 2의 배수와 3의 배수의 합을 더한값을 while문으로 출력한다.</li>
</ul>
<h2 id="foreach문-01-예제">forEach문 01 예제</h2>
<pre><code>&lt;script&gt;
    let array = []
    let sum1 = 0;
    let sum2 = 0;
    let sum3 = 0;

    for(let i = 0; i &lt; 100; i++) {
        array.push(i+1);
        sum1 += array[i];
    }
    // forEach 문
    array.forEach((arr) =&gt; {
        sum3 += arr;
    })

    console.log(sum1, sum2, sum3);
    console.log(array);
&lt;/script&gt;</code></pre><ul>
<li>1부터 100까지 숫자의 합 forEach문 출력</li>
</ul>
<h2 id="foreach문-02-예제">forEach문 02 예제</h2>
<pre><code>&lt;script&gt;
    let fruits1 = [&quot;사과&quot;, &quot;딸기&quot;, &quot;파인애플&quot;, &quot;수박&quot;, &quot;참외&quot;, &quot;오렌지&quot;, &quot;자두&quot;, &quot;망고&quot;];
    let fruits2 = [&quot;수박&quot;, &quot;사과&quot;, &quot;참외&quot;, &quot;오렌지&quot;, &quot;파인애플&quot;, &quot;망고&quot;];

    let same = [];
    let diff = [];

    fruits1.forEach((fruits) =&gt; {
        if(fruits2.includes(fruits)) {
            same.push(fruits);
        }
    })

    fruits1.forEach((fruits) =&gt; {
        if(!fruits2.includes(fruits)) {
            diff.push(fruits);
        }
    })

    console.log(same);
    console.log(diff);
&lt;/script&gt;</code></pre><ul>
<li>두 배열의 공통점과 차이점 찾기</li>
</ul>
<h2 id="filter">filter</h2>
<ul>
<li>forEach 02 예제를 filter() 사용해서 출력하기</li>
</ul>
<pre><code>&lt;script&gt;
    let fruits1 = [&quot;사과&quot;, &quot;딸기&quot;, &quot;파인애플&quot;, &quot;수박&quot;, &quot;참외&quot;, &quot;오렌지&quot;, &quot;자두&quot;, &quot;망고&quot;];
    let fruits2 = [&quot;수박&quot;, &quot;사과&quot;, &quot;참외&quot;, &quot;오렌지&quot;, &quot;파인애플&quot;, &quot;망고&quot;];

    let same = fruits1.filter((fruits) =&gt; fruits2.includes(fruits));
    let diff = fruits1.filter((fruits) =&gt; !fruits2.includes(fruits));

    console.log(same);
    console.log(diff);
&lt;/script&gt;</code></pre><h2 id="결론">결론</h2>
<p>지난 약 10일간 프로젝트 준비 때문에 복습 및 지난 배웠던거를 놓쳤었는데 다시 복습 및 자바스크립트 공부를 반복적으로 연습해야 해야겠다.</p>
]]></description>
        </item>
    </channel>
</rss>