<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jung_inny.log</title>
        <link>https://velog.io/</link>
        <description>둉이닝</description>
        <lastBuildDate>Tue, 27 Jan 2026 15:05:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. jung_inny.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jung_inny" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Algo_03. DP 알고리즘]]></title>
            <link>https://velog.io/@jung_inny/Algo03.-DP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@jung_inny/Algo03.-DP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Tue, 27 Jan 2026 15:05:37 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-dp-알고리즘dynamic-programming이란">📌 DP 알고리즘(Dynamic Programming)이란</h2>
<h4 id="✨-목적">✨ 목적</h4>
<p>: 다이나믹 프로그래밍은 완전 탐색, DFS, BFS와 같이 수많은 경우의 수를 모두 따져봐야하는데, 그 경우의 수가 너무 많아서 속도가 느려지는 문제를 개선하고자, 수행시간을 단축하기 위해 만들어진 알고리즘</p>
<ul>
<li>DP 알고리즘이 없었을 때에는 최단 경로를 찾거나 최고 점수를 만드는 등의 문제를 풀려면 모든 조합을 만들어보는 수 밖에 없었음</li>
<li>DP 알고리즘이 만들어진 이후에는 수행시간을 현저하게 줄일 수 있었음</li>
</ul>
<h4 id="✨-예제-프로그래머스_정수-삼각형">✨ 예제 (프로그래머스_정수 삼각형)</h4>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/2eee6911-7aa9-43bc-839b-0f994d59c7c8/image.png" alt=""></p>
<ul>
<li><p>DFS 사용 할 경우
: 7-3-8-2-4 를 더해서 24라는 숫자를 구해 max라는 변수를 갱신하고,
: 7-3-8-2-5 를 더해서 25라는 숫자로 max를 갱신하고,
: 이 동작을 반복해서 모든 경우의 수를 다 따져보면 30이라는 값이 최댓값이라는 것을 알 수 있음</p>
</li>
<li><blockquote>
<p>5줄 짜리 삼각형이면 전혀 지장이 없지만, 500줄 짜리 삼각형 이라면 경우의 수가 너무 많아짐</p>
</blockquote>
</li>
<li><blockquote>
<p>중복적인 연산이 많음</p>
</blockquote>
</li>
<li><blockquote>
<p>연산 횟수를 어떻게 줄이고 빠르게 푸는 방법은 ?</p>
</blockquote>
</li>
<li><p>DP 사용할 경우
: 컴퓨터가 보기 쉽게 직각 삼각형 형태로 바꿈
<img src="https://velog.velcdn.com/images/jung_inny/post/df0b4a31-d32f-4658-9a70-bfad3f400d4b/image.png" alt="">
: 한 숫자에서 내려갈 수 있는 길은 왼쪽, 오른쪽이 아닌 밑으로 가거나 내 밑의 오른쪽으로 가거나 두 가지 경우의 수가 있음
: 연산을 줄이기 위해서는 한 번 수행한 연산의 결과를 저장해둬야 함 -&gt; 이 삼각형과 동일하게 생긴 배열 하나 더 만듦
<img src="https://velog.velcdn.com/images/jung_inny/post/9d78c996-8682-40f2-9723-7b7a4718fdb7/image.png" alt="">
: 원본 삼각형은 문제에서 주어졌던 값을 그대로 갖고 있음
: DP 삼각형은 해당 위치까지 올 수 있는 최댓값을 저장하는 배열
: 최종 DP 삼각형을 통해 마지막 줄만 참고했을 때, 30이라는 답을 도출해 낼 수 있음 
<img src="https://velog.velcdn.com/images/jung_inny/post/957e4392-5dc4-47b6-b455-e185d33319ab/image.png" alt=""></p>
</li>
</ul>
<h4 id="✨-dp의-목적">✨ DP의 목적</h4>
<ul>
<li>메모리를 사용해 중복 연산을 줄이고, 중복 연산을 줄여서 수행 속도를 개선한다</li>
<li>메모리를 사용한다 = 또 하나의 배열 혹은 자료구조를 만든다</li>
<li>중복 연산을 줄인다 = 한 번 연산한 결과를 배열에 담아 다시는 같은 연산을 다시 하지 않는다</li>
</ul>
<h4 id="✨-dp-문제를-알아보고-구분하는-방법">✨ DP 문제를 알아보고 구분하는 방법</h4>
<ul>
<li>DP는 특정 유형에만 국한되지 않고 다양한 유형의 문제를 최적화 할 때 고려될 수 있는 알고리즘
1) DFS/BFS로 풀 수는 있지만 경우의 수가 너무 많은 문제
2) 경우의 수들에 중복적인 연산이 많은 경우</li>
</ul>
<h4 id="✨-문제-해결-접근-방법">✨ 문제 해결 접근 방법</h4>
<ul>
<li>최대한 많은 문제들을 풀어보고 풀이를 참고하면서 DP 사고방식을 키우는게 중요함 !</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algo_02. 구현 알고리즘]]></title>
            <link>https://velog.io/@jung_inny/Algo02.-%EA%B5%AC%ED%98%84-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@jung_inny/Algo02.-%EA%B5%AC%ED%98%84-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Tue, 20 Jan 2026 07:00:15 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-구현-알고리즘implementation-algorithm이란">📌 구현 알고리즘(Implementation Algorithm)이란</h2>
<h4 id="✨-정의">✨ 정의</h4>
<p>: 어떤 특별한 공식이나 방법이 아닌 코딩테스트 문제 해결을 위한 개념으로, 단순히 머릿속에 있는 알고리즘을 소스코드로 풀어내는 과정</p>
<h4 id="✨-예시">✨ 예시</h4>
<ul>
<li>실수 연산을 다루고, 특정 소수점 자리까지 출력해야 하는 문제</li>
<li>문자열을 특정한 기준에 따라서 끊어 처리해야하는 문제</li>
<li>적절한 라이브러리르 찾아서 사용해야 하는 문제</li>
<li>알고리즘은 간단한데, 코드가 길어지는 문제</li>
</ul>
<p>-&gt; 대체로 사소한 조건 설정이 많은 문제일수록 코드로 구현하기 까다롭다</p>
<hr>
<h2 id="📌-추천-문제">📌 추천 문제</h2>
<p><a href="https://www.acmicpc.net/problem/7568">백준 7568_덩치</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algo_01. 그리디 알고리즘]]></title>
            <link>https://velog.io/@jung_inny/%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@jung_inny/%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Sat, 10 Jan 2026 14:50:42 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-greedy-알고리즘이란">📌 Greedy 알고리즘이란</h2>
<h4 id="✨-정의">✨ 정의</h4>
<p>: 미래를 고려하지 않고 오직 현재 시점에 가장 좋은 선택</p>
<hr>
<h2 id="📌-greedy-알고리즘의-특징">📌 Greedy 알고리즘의 특징</h2>
<h4 id="✨-미래의-선택을-고려하지-않고-현재에만-충실한-것이-최적의-해가-될-수-있을까">✨ 미래의 선택을 고려하지 않고 현재에만 충실한 것이 최적의 해가 될 수 있을까?</h4>
<p>: 최적의 해를 항상보장하지는 못 함 
: 현재의 최적 해 != 전체의 최적 해</p>
<p>  코테 특성 상 항상 최적해 찾아야 하므로 최적해가 보장되는 조건에서만 그리디 알고리즘 사용</p>
<h4 id="✨-최적해가-보장되는-조건">✨ 최적해가 보장되는 조건</h4>
<p>1) 현재의 선택이 미래의 선택에 영향을 주지 않는다
--&gt; 탐욕스런 선택 조건 (Greedy Choice Property)</p>
<ul>
<li>예시
<img src="https://velog.velcdn.com/images/jung_inny/post/52ef6724-30b2-464f-8ff2-cf2c1b357e20/image.png" alt=""></li>
</ul>
<p>2) 부분의 최적 해가 모이면 전체의 최적 해가 된다
--&gt; 최적 부분 구조 조건 (Optimal Substructure)</p>
<hr>
<h2 id="📌-greedy-전략">📌 Greedy 전략</h2>
<h4 id="✨-문제-풀이-핵심은-정렬">✨ 문제 풀이 핵심은 &#39;정렬&#39;</h4>
<ul>
<li>어떻게 정렬해야 위의 두 가지 조건을 만족할까</li>
</ul>
<h4 id="✨-그리디-알고리즘이-사용되는-예시">✨ 그리디 알고리즘이 사용되는 예시</h4>
<ul>
<li>AI에 있어서 결정 트리 학습법 (Decision Tree Learning)</li>
<li>활동 선택 문제 (Activity selection problem)</li>
<li>거스름돈 문제</li>
<li>최소 신장 트리 (Minimum spanning tree)</li>
<li>다익스트라 알고리즘</li>
<li>허프만 코드</li>
<li>UNION&amp;FIND 알고리즘</li>
</ul>
<hr>
<h2 id="📌-greedy-사용-이유">📌 Greedy 사용 이유</h2>
<ul>
<li>DP 보다 더 빠름</li>
<li>완전 탐색이 가장 단순 무식하게 정답을 찾는 방식 / 너무 느림</li>
<li>이를 개선하기 위해 다이나믹 프로그래밍이라는 알고리즘 사용 / 항상 최적 해를 보장하기 위해 모든 경우의 수 고려해 느려짐</li>
</ul>
<hr>
<h2 id="📌-추천-문제">📌 추천 문제</h2>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/89196b83-bbbe-423c-bdc4-26b729a4e65e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0-2 디버깅]]></title>
            <link>https://velog.io/@jung_inny/0-2-%EB%94%94%EB%B2%84%EA%B9%85</link>
            <guid>https://velog.io/@jung_inny/0-2-%EB%94%94%EB%B2%84%EA%B9%85</guid>
            <pubDate>Tue, 09 Jan 2024 08:32:32 GMT</pubDate>
            <description><![CDATA[<h2 id="📌디버깅">📌디버깅</h2>
<h3 id="✨-디버깅의-중요성">✨ 디버깅의 중요성</h3>
<ul>
<li>디버깅 
: 프로그램에서 발생하는 문법 오류나 논리 오류를 찾아 바로잡는 과정</li>
</ul>
<h3 id="✨-디버깅하는-법">✨ 디버깅하는 법</h3>
<ul>
<li>코드에서 디버깅하고자 하는 줄에 중단점을 설정하고, IDE의 디버깅 기능을 실행해 진행.
```
🎀 디버깅 방법 🎀</li>
</ul>
<ol>
<li>코드에서 디버깅하고자 하는 줄에 중단점을 설정한다. 이때 중단점은 여러 개 설정할 수 있다.</li>
<li>IDE의 디버깅 기능을 실행하면 코드를 1줄씩 실행하거나 다음 중단점까지 실행할 수 있으며, 이 과정에서 추적할 변수값도 지정할 수 있다. 이 방법으로 변숫값이 자신의 의도한 대로 바뀐느지 파악한다.</li>
<li>변숫값 이외에도 원하는 수치를 입력해 논리 오류를 파악할 수 있다.</li>
</ol>
<pre><code>
### ✨ 디버깅 활용 사례
![](https://velog.velcdn.com/images/jung_inny/post/d80d4fde-2688-4a78-9796-4f8c5e9c7387/image.png)

- 오류 1. 변수 초기화 오류
: 사진에서 t가 2일 때 answer 의 값이 595 라고 출력됨.
: 디버깅읜 12번째 줄을 가리키고 있으므로 아직 answer 변수의 값은 0으로 초기화되어 있어야 함.
: 첫 번째 테스트 케이스에서 도출한 answer 의  값이 그대로 남아 있는 것임.
![](https://velog.velcdn.com/images/jung_inny/post/0fbb72e2-c7ec-416a-bfba-185b156042cf/image.png)

- 오류 2. 반복문에서 인덱스 범위 지정 오류
![](https://velog.velcdn.com/images/jung_inny/post/73a79653-ddac-48aa-bbbb-1553e1bb1bc2/image.png)

- 오류 3. 잘못된 변수 사용 오류
![](https://velog.velcdn.com/images/jung_inny/post/ee922b26-c966-4475-8015-6479a1d6c6ab/image.png)

- 오류 4. 파이썬 자동 형 변환 조심하기
![](https://velog.velcdn.com/images/jung_inny/post/a83f7532-aa9d-4830-901c-40e94e485fad/image.png)
</code></pre><p>💡 TIP 💡 </p>
<p>파이썬에서의 나누기는 / 연산자와 // 연산자 두 가지이다!</p>
<ul>
<li>/ 연산 : 나눗셈을 한 결괏값을 float 형으로 출력하며 소수점의 결과까지 보여준다.</li>
<li>// 연산 : 나눗셈을 한 결괏값을 int 형으로 출력하며 몫의 결고ㅘ만 보여준다.</li>
<li>% 연산 : 나눗셈을 한 후 나눈 나머지 값을 보여준다.<pre><code>








</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[0-1 시간 복잡도]]></title>
            <link>https://velog.io/@jung_inny/0-1-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84</link>
            <guid>https://velog.io/@jung_inny/0-1-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84</guid>
            <pubDate>Tue, 09 Jan 2024 06:57:39 GMT</pubDate>
            <description><![CDATA[<h2 id="📌참고-강의">📌참고 강의</h2>
<blockquote>
<p><a href="https://www.inflearn.com/course/%EB%91%90%EC%9E%87-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%B4%EC%8D%AC#curriculum">https://www.inflearn.com/course/두잇-알고리즘-코딩테스트-파이썬#curriculum</a></p>
</blockquote>
<hr>
<h2 id="📌시간-복잡도">📌시간 복잡도</h2>
<h3 id="✨-시간-복잡도란-">✨ 시간 복잡도란 ?</h3>
<ul>
<li>시간 복잡도
: 주어진 문제를 해결하기 위한 연산 횟수</li>
<li>코딩 테스트에서는 빅-오 표기법을 기준으로 수행 시간을 계산하는 것이 좋음.</li>
<li><blockquote>
<p>이유 : 다양한 테스트 케이스를 수행해 모든 케이스를 통과 해야만 합격이므로 최악일 경우를 염두에 둬야 함.</p>
</blockquote>
</li>
<li>데이터의 크기 (n) 가 늘어날수록 각 시간복잡도의 차이가 기하급수적으로 커짐.
<img src="https://velog.velcdn.com/images/jung_inny/post/7d0c5b42-c2ac-4516-b42c-ccacea32e3f6/image.png" alt=""></li>
</ul>
<h3 id="✨-시간-복잡도-유형">✨ 시간 복잡도 유형</h3>
<ul>
<li>빅-오메가 (Ω(n)) : 최선일 때 (best case) 의 연산 횟수를 낱타낸 표기법</li>
<li>빅-세타 (Θ(n)) : 보통일 때 (average case) 의 연산 횟수를 나타낸 표기법</li>
<li>빅-오 (Ο(n)) : 최악일 때 (worst case) 의 연산 횟수를 나타낸 표기법</li>
</ul>
<h3 id="✨-시간-복잡도-활용">✨ 시간 복잡도 활용</h3>
<ul>
<li>백준 2750번 - 수 정렬하기</li>
<li><blockquote>
<p><a href="https://www.acmicpc.net/problem/2750">https://www.acmicpc.net/problem/2750</a></p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/a8881bad-adc7-4347-aa5a-0f56c6642dd9/image.png" alt=""></p>
<pre><code>💡 TIP 💡 

- 버블 정렬과 병합 정렬의 시간 복잡도를 각각 O(n^2), O(nlogn) 이라고 알고 있다고 가정

- 최악의 경우를 생각할 것 !
-&gt; 파이썬은 1초에 2천만 번 연산 가능
-&gt; 2초가 주어졌으므로 4천만 번 이하의 연산 횟수로 문제를 해결해야 함.</code></pre><ul>
<li><p>연산 횟수 계산 방법
: 연산 횟수 = 알고리즘 시간 복잡도 n 값에 데이터의 최대 크기를 대입하여 도출</p>
</li>
<li><p>알고리즘 적합성 평가
<img src="https://velog.velcdn.com/images/jung_inny/post/adad592b-3212-4a76-99a8-a4389a45bf0e/image.png" alt=""></p>
</li>
<li><p>시간 복잡도 도출 기준
(1) 상수는 시간 복잡도 계산에서 제외한다.
(2) 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준이 된다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 21일차🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-21%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-21%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 13 Nov 2023 20:27:09 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 21일차 (2023/11/8 ~ 2023/11/14)🌷

✅시퀄라이즈 실습하기
✅프로젝트 구조 갖추기
✅데이터베이스 세팅하기</code></pre><hr>
<hr>
<h2 id="📌프로젝트-구조-갖추기섹션-8">📌프로젝트 구조 갖추기(섹션 8)</h2>
<h3 id="✨-서버-만들기">✨ 서버 만들기</h3>
<ul>
<li>버전을 제일 낮은 버전인 0.0.1로 설정하는 이유
: 버전을 한번 올리면 다시 내릴 수 없음..</li>
<li>라우터 -&gt; 컨트롤러 -&gt; 서비스(요청, 응답 모름)
<img src="https://velog.velcdn.com/images/jung_inny/post/6832580a-08b1-4301-ad3b-a2340e873936/image.png" alt="">
1) 새로 만든 디랙토리 (폴더) 로 이동 <code>cd 이동할폴더</code>
2) <code>npm init</code> 명령어를 통해 초기 세팅 (위 사진 참고)
3) <code>npm i sequelize mysql2 sequelize-cli</code>
4) <code>npx sequelize init</code>
: <code>&#39;&quot;node&quot;&#39;은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.</code> 라는 오류 발생</li>
<li><blockquote>
<p>해결 방법 : powershell 말고 cmd에서 실행 (default terminal을 cmd로 바꿈)
5) <code>passport, public, routes, views</code> 파일을 상위 디랙토리인 Ch_09에 생성
6) <code>.env, app.js</code> 파일 상위 디랙토리인 Ch_09에 추가
: <code>app.js</code> 파일이 메인 파일임
7) <code>npm i express cookie-parser express-session morgan multer dotenv nunjucks</code> 명령어로 설치
8) <code>npm i -D nodemon</code> 개발용 서버 노드몬 설치
9) app.js 파일 작성
10) routes 파일 안에 <code>page.js</code> 파일 추가하고 작성
11) views 파일 안에 <code>error.html</code> 파일 추가
12) .env 파일에 <code>COOKIE_SECRET=cookiesecret</code> 작성
13) routes 파일의 page.js 작성
14) 상위 디랙토리에 <code>controllers</code> 디랙토리 생성
15) controllers 폴더에 <code>page.js</code> 파일 생성후 작성
16) views 폴더에 <code>profile.html, join.html, main.html</code> 파일 생성
17) <code>github.com/ZeroCho/nodejs-book/</code> 여기에서 Ch_09 &gt; 09.01 &gt; controllers 에 있는 모든 파일들 다 복붙하기
18) Ch_09 &gt; 09.01 &gt; public &gt; main.css 복붙
19) Ch_09 &gt; package.json 에 <code>&quot;start&quot;: &quot;nodemon app.js&quot;</code> 추가해야 <code>npm start</code> 사용할 수 있음
<img src="https://velog.velcdn.com/images/jung_inny/post/c3b45042-8e61-47fd-85a2-74ee4319c5e6/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="📌프로젝트-구조-갖추기이건-section9-이네">📌프로젝트 구조 갖추기(이건 section9 이네;)</h2>
<h3 id="✨-api-application-programming-interface">✨ API (Application Programming Interface)</h3>
<ul>
<li>다른 애플리케이션에서 현재 프로그램의 기능을 사용할 수 있게 허용하는 접점</li>
<li>다른 웹 서비스의 기능을 사용하거나 자원을 가져올 수 있는 창구</li>
<li>다른 사람에게 정보를 제공하고 싶은 부분만 API 열어놓고, 제공하고 싶지 않은 부분은 API를 만들지 않을 수 있음</li>
<li>API 서버 : 서버에 API를 올려서 URL을 통해 접근할 수 있게 만든 것</li>
</ul>
<h3 id="✨-크롤링-crawling">✨ 크롤링 (Crawling)</h3>
<ul>
<li>웹 사이트가 자체적으로 제공하는 API가 없거나 API 이용에 제한이 있을 때 사용하는 방법</li>
<li>표면적으로 보이는 웹 사이트의 정보를 일정 주기로 수집해 자체적으로 가공하는 기술</li>
<li>웹 사이트에서 직접 제공하는 API가 아니므로 원하는 정보를 얻지 못할 수 있음</li>
<li>웹 사이트가 어떤 페이지의 크롤링을 허용하는지 확인하려면 도메인/robots.txt에 접속하면 됨</li>
</ul>
<hr>
<h2 id="📌데이터베이스-세팅하기">📌데이터베이스 세팅하기</h2>
<h3 id="✨-프로젝트-구조-갖추기-cont">✨ 프로젝트 구조 갖추기 cont.</h3>
<ul>
<li>db를 js파일을 통해 만들었다가 수정하려면 직접 수정해줘야 함</li>
<li>js 파일을 수정한다고해서 db가 바뀌지는 않음
1) models 폴더에 <code>user.js, post.js, hashtag.js</code> 파일 추가 &amp; 작성</li>
</ul>
<p><code>!!!!! models &gt; index.js 파일의 24번째 라인 계속 오류남 어쩌라는거임 난 복붙한거야;</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 20일차🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-20%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-20%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 06 Nov 2023 15:46:08 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 20일차 (2023/11/06, 07)🌷

✅테이블 관계 이해하기
✅시퀄라이즈 쿼리 알아보기
✅관계 쿼리 알아보기</code></pre><hr>
<hr>
<h2 id="📌테이블-관계-이해하기">📌테이블 관계 이해하기</h2>
<h3 id="✨-관계-정의하기">✨ 관계 정의하기</h3>
<ul>
<li>users 모델과 comments 모델 간의 관계를 정의
1) 1:N 관계 (사용자 한 명이 댓글 여러 개 작성)</li>
<li><blockquote>
<p>시퀄라이즈에서는 1:N 관계를 hasMany로 표현 (사용자.hasMany(댓글))</p>
</blockquote>
</li>
<li><blockquote>
<p>반대의 입장에서는 belongsTo(댓글.belongsTo(사용자))</p>
</blockquote>
</li>
<li><blockquote>
<p>belongsTo가 있는 테이블에 컬럼이 생김 (댓글 테이블에 commenter 컬럼)
<img src="https://velog.velcdn.com/images/jung_inny/post/47fbe635-7e52-4da2-9adc-1a2c81983512/image.png" alt=""></p>
</blockquote>
</li>
<li><blockquote>
<p>Comment의 commenter라는 column이 내(user의) id를 참조하고있다.</p>
</blockquote>
</li>
</ul>
<p>2) 1대1 관계
<img src="https://velog.velcdn.com/images/jung_inny/post/50c01598-f7c6-40f9-b55b-1d220d09b813/image.png" alt=""></p>
<p>3) 다대다 관계
<img src="https://velog.velcdn.com/images/jung_inny/post/5fc59224-736a-47f5-ae85-8cf1c313c4e9/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/1e6d89d9-cbb0-42ee-b9ad-cf4c69e76bf2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 19일차🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-19%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-19%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 04 Nov 2023 14:01:04 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 19일차 (2023/10/31 ~ 2023/11/02)🌷

✅라우터 분리하기
✅넌적스 템플릿 엔진
✅MYSQL 설치하기
✅테이블 만들기
✅칼럼의 옵션들
✅CRUD 작업하기
✅시퀄라이즈 사용하기
✅시퀄라이즈 모델 만들기</code></pre><hr>
<hr>
<h2 id="📌라우터-분리하기">📌라우터 분리하기</h2>
<h3 id="✨-router-객체로-라우터-분리하기">✨ Router 객체로 라우터 분리하기</h3>
<ul>
<li>app.use 같은거 중에서 특별히 메서드랑 url 있는 것</li>
<li>app.js가 길어지는 것을 막을 수 있음
<img src="https://velog.velcdn.com/images/jung_inny/post/d7778dd7-7056-4109-a61f-acd4a5b2189e/image.png" alt=""></li>
<li>:id 를 넣으면 req.params.id로 받을 수 있음
<img src="https://velog.velcdn.com/images/jung_inny/post/b0065068-5e93-4ec6-a307-be48f026d7a6/image.png" alt=""></li>
<li>404 미들웨어</li>
<li><blockquote>
<p>요청과 일치하는 라우터가 없는 경우를 대비해 404 라우터 만들기
<img src="https://velog.velcdn.com/images/jung_inny/post/c4404192-5d96-4819-a5a8-b2e1336aee06/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h3 id="✨-라우터-그룹화하기">✨ 라우터 그룹화하기</h3>
<ul>
<li>주소는 같지만 메서드가 다른 코드가 있을 때
<img src="https://velog.velcdn.com/images/jung_inny/post/aad322a5-e503-452a-81be-af6289e91baa/image.png" alt=""></li>
<li><blockquote>
<p>router.route 로 묶음
<img src="https://velog.velcdn.com/images/jung_inny/post/8374ace7-ae73-4506-8312-8034011b2374/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h3 id="✨-req-객체">✨ req 객체</h3>
<ul>
<li>req.app : req 객체를 통해 app 객체에 접근할 수 있음. req.app.get(&#39;port&#39;)와 같은 식으로 사용할 수 있음</li>
<li>req.body : body-parser 미들웨어가 만드는 요청의 본문을 해석한 객체</li>
<li>req.cookies : cookie-parser 미들웨어가 만드는 요청의 쿠키를 해석한 객체</li>
<li>req.ip : 요청의 ip 주소가 담겨 있음</li>
<li>req.params : 라우트 매개변수에 대한 정보가 담긴 객체</li>
<li>req.query : 쿼리스트링에 대한 정보가 담긴 객체</li>
<li>req.signedCookies : 서명된 쿠키들은 req.cookies 대신 여기에 담김</li>
<li>req.get(헤더 이름) : 헤더의 값을 가져오고 싶을 때 사용하는 메서드</li>
</ul>
<h3 id="✨-res-객체">✨ res 객체</h3>
<ul>
<li>res.app : req.app 처럼 res 객체를 통해 app 객체에 접근함</li>
<li>res.cookie(키, 값, 옵션) : 쿠키를 설정하는 메서드</li>
<li>res.clearCookie(키, 값, 옵션) : 쿠키를 제거하는 메서드</li>
<li>res.end() : 데이터 없이 응답 보냄</li>
<li>res.json(JSON) : JSON 형식의 응답 보냄</li>
<li>res.redirect(주소) : 리다이렉트할 주소와 함께 응답 보냄</li>
<li>res.render(뷰, 데이터) : 다음 절에서 다룰 템플릿 엔진을 랜더링해서 응답할 때 사용하는 메서드</li>
<li>res.send(데이터) : 데이터와 함께 응답 보냄. 데이터는 문자열일 수도 있고 HTML 일 수도 있으며, 버퍼일 수도 있고 객체나 배열일 수도 있음</li>
<li>res.sendFile(경로) : 경로에 위치한 파일을 응답함</li>
<li>res.set(헤더, 값) : 응답의 헤더를 설정함</li>
<li>res.status(코드) : 응답 시의 HTTP 상태 코드 지정함</li>
</ul>
<hr>
<h2 id="📌넌적스-템플릿-엔진">📌넌적스 템플릿 엔진</h2>
<h3 id="✨-넌적스">✨ 넌적스</h3>
<ul>
<li>Pug의 문법에 적응되지 않는다면 넌적스를 사용하면 좋음
<img src="https://velog.velcdn.com/images/jung_inny/post/21f3e450-6754-44c1-8d2e-11127eddab82/image.png" alt=""></li>
</ul>
<h3 id="✨-넌적스---변수">✨ 넌적스 - 변수</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/db9762e5-2024-4ed3-b40f-9ad0e80eed96/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/fc36b303-ea8b-405b-9c11-aca27b045ae0/image.png" alt=""></p>
<h3 id="✨-넌적스---반복문">✨ 넌적스 - 반복문</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/5022bf17-a12f-42c5-b75e-03820f3d7690/image.png" alt=""></p>
<h3 id="✨-넌적스---조건문">✨ 넌적스 - 조건문</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/c4cbacfd-5cfd-4ca1-8199-ca9d4454d108/image.png" alt=""></p>
<hr>
<h2 id="📌crud-작업하기">📌CRUD 작업하기</h2>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/7b75ac9d-eac4-427a-8e59-e6be1ff1ec01/image.png" alt=""></p>
<hr>
<h2 id="📌시퀄라이즈-사용하기">📌시퀄라이즈 사용하기</h2>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/85ad6e8b-e42a-45b5-9632-a4456025dad2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/b52d8a78-5c0a-473d-b80f-a742bd65862c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 18일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-18%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-18%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 31 Oct 2023 11:18:47 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 18일차 (2023/10/11 ~ 2023/10/30)🌷

✅package.json
✅express 서버 사용해보기
✅express로 html 서빙하기
✅미들웨어 사용하기
✅미들웨어 특성 이해하기
✅next 활용법
✅morgan, bodyParser, cookieParser
✅MYSQL 설치하기</code></pre><hr>
<hr>
<h2 id="📌packagejson">📌package.json</h2>
<h3 id="✨-npm-이란">✨ npm 이란</h3>
<ul>
<li>노드의 패키지 매니저</li>
<li>다른 사람들이 만든 소스 코드들을 모아둔 저장소</li>
<li>남의 코드를 사용하여 프로그래밍 가능</li>
<li>이미 있는 기능을 다시 구현할 필요가 없어 효율적</li>
<li>오픈 소스 생태계를 구성중</li>
<li>패키지 : npm에 업로드된 노드 모듈</li>
<li>모듈이 다른 모듈을 사용할 수 있듯 패키지도 다른 패키지를 사용할 수 있음</li>
<li>의존 관계라고 부름</li>
</ul>
<h3 id="✨-packagejson">✨ package.json</h3>
<ul>
<li>현재 프로젝트에 대한 정보와 사용 중인 패키지에 대한 정보를 담은 파일</li>
<li>같은 패키지라도 버전별로 기능이 다를 수 있으므로 버전을 기록해두어야 함</li>
<li>동일한 버전을 설치하지 않으면 문제가 생길 수 있음</li>
<li>노드 프로젝트 시작 전 package.json 부터 만들고 시작함 (npm init)</li>
</ul>
<h3 id="✨-packagejson-속성들">✨ package.json 속성들</h3>
<ul>
<li>package name : 패키지의 이름</li>
<li>version : 패키지의 버전 / npm의 버전을 다소 엄격하게 관리됨</li>
<li>entry point : 자바스크립트 실행 파일 진입점 / 보통 마지막으로 module.exports를 하는 파일 지정함</li>
<li>test command : 코드를 테스트할 때 입력할 명령어</li>
<li>git repository : 코드를 저장해둔 Git 저장소 주소 / 나중에 소스에 문제가 생겼을 때 사용자들이 이 저장소에 방문해 문제를 제기할 수 있고, 코드 수정본을 올릴 수도 있음</li>
<li>keywords : 키워드는 npm 공식 홈페이지에서 패키지를 쉽게 찾을 수 있게 해줌</li>
<li>license : 해당 패키지의 라이선스 넣기</li>
</ul>
<h3 id="✨-npm-스크립트">✨ npm 스크립트</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/dd6b4e2e-622f-4c7e-acc7-4afad7c92c0e/image.png" alt=""></p>
<hr>
<h2 id="📌express-서버-사용해보기">📌express 서버 사용해보기</h2>
<h3 id="✨-express-소개">✨ express 소개</h3>
<ul>
<li>http 모듈로 웹 서버를 만들 때 코드가 보기 좋지 않고, 확장성도 떨어짐
<img src="https://velog.velcdn.com/images/jung_inny/post/a88b1b2e-518f-4570-9e67-cec7604f4272/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/eccb74bc-6855-4bd3-b593-5b872e4833e9/image.png" alt=""></li>
</ul>
<hr>
<h2 id="📌미들웨어-사용하기">📌미들웨어 사용하기</h2>
<h3 id="✨-와일드카드">✨ 와일드카드</h3>
<ul>
<li>사용법<pre><code>app.get(&#39;/category/:name&#39;, (req, res)=&gt; {
  res.send(`hello ${req.params.name}`)
}))</code></pre></li>
<li>javaScript는 위에서부터 아래로 실행됨</li>
<li><a href="http://localhost:3000/category/Javascript">http://localhost:3000/category/Javascript</a> 실행 시 hello wildcard 뜸<pre><code>app.get(&#39;/category/:name&#39;, (req, res)=&gt;{
  res.send(&#39;hello wildcard&#39;)
})
app.get(&#39;/category/Javascript&#39;, (req, res) =&gt; {
  res.send(&#39;hello Javascript&#39;)
})</code></pre></li>
<li>따라서 와일드 카드와 범위가 넓은 라우터들은 보통 아래에 써줌</li>
</ul>
<hr>
<h2 id="📌미들웨어-특성-이해하기">📌미들웨어 특성 이해하기</h2>
<h3 id="✨-미들웨어란">✨ 미들웨어란</h3>
<pre><code>app.use((req, res, next)=&gt;{
    console.log(&#39;모든 요청에 실행하고싶어요&#39;)
    next()
})</code></pre><p>이 부분에서</p>
<pre><code>(req, res, next)=&gt;{
    console.log(&#39;모든 요청에 실행하고싶어요&#39;)
    next()
}</code></pre><p>이 부분을 use 에 장착 시킨것임.</p>
<ul>
<li>미들웨어 여러개 쓸 수 있음</li>
<li>하나의 미들웨어에서 send는 한번만 허용됨
<code>ex) res.sendFile / res.send / res.json</code></li>
</ul>
<hr>
<h2 id="📌next-활용법">📌next 활용법</h2>
<h3 id="✨next">✨next</h3>
<ul>
<li>next 를 호출해야 다음 코드로 넘어감</li>
<li>next를 주석 처리하면 응답이 전송되지 않음</li>
<li>다음 미들웨어(라우터 미들웨어)로 넘어가지 않기 때문</li>
<li>next에 인수로 값을 넣으면 에러 핸들러로 넘어감</li>
</ul>
<h3 id="✨에러-처리">✨에러 처리</h3>
<ul>
<li>에러 미들웨어로 넘어감</li>
<li>next()에 인수가 담기면 에러 미들웨어로 넘어감
<img src="https://velog.velcdn.com/images/jung_inny/post/74557a86-dd14-46cd-90aa-bf5d03fd5ac8/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/64343b7a-9d35-4c64-8dda-fc318134b7c2/image.png" alt=""></li>
<li>&#39;실행되나요?&#39;가 출력되지 않고 다음 미들웨어로 넘어가 &#39;실행되지롱&#39;이 출력됨
<img src="https://velog.velcdn.com/images/jung_inny/post/83e85653-c249-42a6-99d4-582f52f170b6/image.png" alt=""></li>
</ul>
<hr>
<h2 id="📌mysql-설치하기">📌MYSQL 설치하기</h2>
<h3 id="✨데이터베이스란">✨데이터베이스란</h3>
<ul>
<li>지금까지는 데이터를 서버 메모리에 저장했음</li>
<li><blockquote>
<p>서버를 재시작하면 데이터도 사라져버림 =&gt; 영구적으로 저장할 공간 필요</p>
</blockquote>
</li>
<li>MySQL 관계형 데이터베이스 사용</li>
<li><blockquote>
<p>데이터베이스 : 관련성을 가지며 중복이 없는 데이터들의 집합</p>
</blockquote>
</li>
<li><blockquote>
<p>DBMS : 관계형 데이터베이스를 관리하는 시스템</p>
</blockquote>
</li>
<li><blockquote>
<p>서버의 하드 디스크나 SSD 등의. 저장 매체에 데이터를 저장</p>
</blockquote>
</li>
<li><blockquote>
<p>서버 종료 여부와 상관 없이 데이터를 계속 사용할 수 있음</p>
</blockquote>
</li>
<li><blockquote>
<p>여러 사람이 동시에 접근할 수 있고, 권한을 따로 줄 수 있음
<img src="https://velog.velcdn.com/images/jung_inny/post/ff6ec63a-0efe-4e14-bed9-beb1f4799e99/image.png" alt=""></p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 17일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-17%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-17%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 10 Oct 2023 08:50:22 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 17일차 (23_10_10) 🌷

✅POST, PUT, DELETE 요청 보내기</code></pre><hr>
<hr>
<h2 id="📌post-put-delete-요청-보내기">📌POST, PUT, DELETE 요청 보내기</h2>
<p>쓸 내용이 업따 .</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 16일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-16%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-16%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 10 Oct 2023 08:35:17 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 16일차 (23_10_09) 🌷

✅REST API 서버 만들기</code></pre><hr>
<hr>
<h2 id="📌rest-api-서버-만들기">📌REST API 서버 만들기</h2>
<h3 id="✨-rest-api">✨ REST API</h3>
<ul>
<li>서버에 요청을 보낼 때는 주소를 통해 요청의 내용 표현</li>
<li><blockquote>
<p>/index.html이면 index.html을 보내달라는 뜻</p>
</blockquote>
</li>
<li><blockquote>
<p>항상 html을 요구할 필요 없음</p>
</blockquote>
</li>
<li><blockquote>
<p>서버가 이해하기 쉬운 주소가 좋음</p>
</blockquote>
</li>
<li>REST API(Representational State Transfer)</li>
<li><blockquote>
<p>서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법</p>
</blockquote>
</li>
<li><blockquote>
<p>/user 이면 사용자 정보에 관한 정보 요청하는 것</p>
</blockquote>
</li>
<li><blockquote>
<p>/post 면 게시글에 관련된 자원을 요청하는 것</p>
</blockquote>
</li>
<li>HTTP 요청 메서드</li>
<li><blockquote>
<p>GET : 서버 자원을 가져오라고 할 때 </p>
</blockquote>
</li>
<li><blockquote>
<p>POST : 서버에 자원을 새로 등록하고자 할 때 (또는 뭘 써야할 지 애매할 때)</p>
</blockquote>
</li>
<li><blockquote>
<p>PUT : 서버의 자원을 요청에 들어있는 자원으로 치환하고자 할 때</p>
</blockquote>
</li>
<li><blockquote>
<p>PATCH : 서버 자원의 일부만 수정하고자 할 때</p>
</blockquote>
</li>
<li><blockquote>
<p>DELETE : 서버의 자원을 삭제하고자 할 때</p>
</blockquote>
</li>
</ul>
<h3 id="✨-http-프로토콜">✨ HTTP 프로토콜</h3>
<ul>
<li>클라이언트가 누구든 서버와 HTTP 프로토콜로 소통 가능</li>
<li>RESTful</li>
<li><blockquote>
<p>REST API 를 사용한 주소 체계를 이용하는 서버</p>
</blockquote>
</li>
<li><blockquote>
<p>GET / user 는 사용자를 조회하는 요청, POST /user 는 사용자를 등록하는 요청
<img src="https://velog.velcdn.com/images/jung_inny/post/741cd406-a4c8-48b8-a030-9801a98a2798/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 15일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-15%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-15%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 07 Oct 2023 07:18:39 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 15일차 (23_10_06) 🌷

✅HTTP 서버 만들기
✅fs로 HTML 읽어 제공하기</code></pre><hr>
<hr>
<h2 id="📌http-서버-만들기">📌HTTP 서버 만들기</h2>
<h3 id="✨서버와-클라이언트의-관계">✨서버와 클라이언트의 관계</h3>
<ul>
<li>클라이언트가 서버로 요청 (request) 을 보냄</li>
<li>서버는 요청을 처리</li>
<li>처리 후 클라이언트로 응답 (response) 을 보냄</li>
</ul>
<h3 id="✨http-요청에-응답하는-노드-서버">✨http 요청에 응답하는 노드 서버</h3>
<ul>
<li>createServer 로 요청 이벤트에 대기</li>
<li>req 객체는 요청에 관한 정보가, res 객체는 응답에 관한 정보가 담겨있음
<img src="https://velog.velcdn.com/images/jung_inny/post/05f9fc5e-bc23-4dcd-a942-290f10e0101b/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/1856a4dc-f249-4513-9d07-c04378b31e67/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/e13e0533-f272-430c-a289-122bcbafa982/image.png" alt=""></li>
</ul>
<h3 id="✨localhost-와-포트">✨localhost 와 포트</h3>
<ul>
<li>localhost 는 컴퓨터 내부 주소</li>
<li><blockquote>
<p>외부에서 접근 불가능</p>
</blockquote>
</li>
<li>포트는 서버 내에서 프로세스를 구분하는 번호</li>
<li><blockquote>
<p>기본적으로 http 서버는 80번 포트 사용 (생략가능, https 는 443)</p>
</blockquote>
</li>
<li><blockquote>
<p>다른 포트로 DB나 다른 서버 동시 연결 가능</p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="📌fs로-html-읽어-제공하기">📌fs로 HTML 읽어 제공하기</h2>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/cbca2fed-e1e6-4044-a843-5d2f298984d7/image.png" alt=""></p>
<ul>
<li>에러 try catch 추가 후
<img src="https://velog.velcdn.com/images/jung_inny/post/cd9cfd80-b896-4957-8fc6-08336dff81f5/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/821fcc4b-2072-4d63-ae29-b4d723725607/image.png" alt=""></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 14일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-14%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-14%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 06 Oct 2023 17:58:31 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 14일차 (23_10_05) 🌷

✅Promise, async/await</code></pre><hr>
<hr>
<h2 id="📌promise-asyncawait">📌Promise, async/await</h2>
<h3 id="✨프로미스">✨프로미스</h3>
<ul>
<li>콜백 헬이라고 불리는 지저분한 자바스크립트 코드의 해결책</li>
<li>프로미스 : 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체</li>
<li>Then을 붙이면 결과를 반환</li>
<li>실행이 완료되지 않았으면 완료된 후에 then 내부 함수가 실행됨</li>
<li>resolve(성공리턴값) -&gt; then 으로 연결</li>
<li>reject(실패리턴값) -&gt; catch 로 연결</li>
<li>finally 부분은 무조건 실행됨
<img src="https://velog.velcdn.com/images/jung_inny/post/42cdd43e-2c2c-4a51-b40b-59867dd421a1/image.png" alt=""></li>
<li>promise.reslove(성공리턴값) : 바로 resolve 하는 프로미스</li>
<li>promise.reject(실패리턴값) : 바로 reject 하는 프로미스
<img src="https://velog.velcdn.com/images/jung_inny/post/bdca01a4-cbba-4e55-992c-f946f3ae5e24/image.png" alt=""></li>
<li>promise.all(배열) : 여러 개의 프로미스를 동시에 실행</li>
<li><blockquote>
<p>하나라도 실패하면 catch 로 감</p>
</blockquote>
</li>
<li><blockquote>
<p>allSettled 로 실패한 것만 추려낼 수 있음</p>
</blockquote>
</li>
</ul>
<h3 id="✨asyncawait">✨async/await</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/5ee383c2-3a66-474e-99fa-584c4c5832a1/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/7a08b5d1-2013-4a59-8097-a48097231e00/image.png" alt=""></p>
<ul>
<li><p>then = await</p>
</li>
<li><p>await은 오른쪽에서 왼쪽으로 코드 진행</p>
</li>
<li><p>async 에서 return 하는 건 then으로 받기</p>
<pre><code>async function main() {

  try {

    const result = await promise;
    return &#39;zerocho&#39;;

  } catch (error) {

      console.error(error);

  }
</code></pre></li>
</ul>
<p>}</p>
<p>// sol 1
main().then((name) =&gt; ...)</p>
<p>// sol 2
const name = await main()</p>
<p>```</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 13일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-13%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-13%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 06 Oct 2023 17:43:36 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 13일차 (23_10_04) 🌷

✅화살표함수</code></pre><hr>
<hr>
<h2 id="📌화살표함수">📌화살표함수</h2>
<h3 id="✨화살표-함수">✨화살표 함수</h3>
<ul>
<li>add1, add2, add3, add4는 같은 기능을 하는 함수</li>
<li>add2 : add1을 화살표 함수로 나타낼 수 있음</li>
<li>add3 : 함수의 본문이 return만 있는 경우 return 생략</li>
<li>add4 : return이 생략된 함수의 본문을 소괄호로 감싸줄 수 있음</li>
<li>not1과 not2도 같은 기능을 함 (매개변수 하나일 때 괄호 생략)</li>
<li>객체를 리턴하는 경우 소괄호가 필수다 !</li>
<li>function이 사라지지 않는 이유 : this</li>
<li>화살표 함수는 부모의 this 물려받음
<img src="https://velog.velcdn.com/images/jung_inny/post/6ea06034-0df6-45aa-80e3-34ff84da5032/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/131b82bd-f856-4369-a5e8-23738b706dea/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/9580c56f-5244-4860-baaf-f8d876e3d2d8/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/e6d5fb9d-66ea-4384-8c6b-708c622c495b/image.png" alt=""></li>
</ul>
<hr>
<pre><code>this;

button.addEvnetListener(&#39;click&#39;, function() {

    console.log(this.textContent);
    // 여기서 this 는 button의 this

}
</code></pre><hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 12일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-11%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-11%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 05 Oct 2023 02:07:37 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 12일차 (23_10_03) 🌷

✅스레드풀과 커스텀 이벤트
✅에러 처리하기</code></pre><hr>
<hr>
<h2 id="📌스레드풀과-커스텀-이벤트">📌스레드풀과 커스텀 이벤트</h2>
<h3 id="✨스레드풀">✨스레드풀</h3>
<ul>
<li>fs, crypto, zlib 모듈의 메서드를 실행할 때는 백그라운드에서 동시에 실행됨</li>
<li>스레드풀이 동시에 처리해줌</li>
<li>node 에서는 4개가 최대</li>
<li>본인 코어에 맞게 실행되도록 명령어를 통해 설정 가능
<img src="https://velog.velcdn.com/images/jung_inny/post/27deee86-cd66-4b8e-9c64-ae9b0bcca787/image.png" alt=""></li>
</ul>
<h3 id="✨커스텀-이벤트">✨커스텀 이벤트</h3>
<ul>
<li>여러 파일간의 동작 공유 가능<pre><code>// 커스텀 이벤트 선언
const EventEmitter = require(&#39;events&#39;);
const myEvent = new EventEmitter();
</code></pre></li>
</ul>
<p>// 이벤트 등록
myEvent.addListener(&#39;event1&#39;, () =&gt; {</p>
<pre><code>console.log(&#39;이벤트 1&#39;);</code></pre><p>});
    // 이벤트 2는 콜백이 2개
myEvent.on(&#39;event2&#39;, () =&gt; {</p>
<pre><code>console.log(&#39;이벤트 2&#39;);</code></pre><p>});
myEvent.on(&#39;event2&#39;, () =&gt; {</p>
<pre><code>console.log(&#39;이벤트 2 추가&#39;);</code></pre><p>});</p>
<p>// 한번만 실행되고 다음에는 안불림
myEvent.once(&#39;event3&#39;, () =&gt; {</p>
<pre><code>console.log(&#39;이벤트 3&#39;);</code></pre><p>});</p>
<p>// 이벤트 호출                // 출력
myEvent.emit(&#39;event1&#39;);       // 이벤트 1<br>myEvent.emit(&#39;event2&#39;);       // 이벤트 2
                           // 이벤트 2 추가</p>
<p>myEvent.emit(&#39;event3&#39;);       // 이벤트 3
myEvent.emit(&#39;event3&#39;);    //            --&gt; once이기 때문에 한번만 출력됨</p>
<p>myEvent.on(&#39;event4&#39;, () =&gt; {</p>
<pre><code>console.log(&#39;이벤트 4&#39;);</code></pre><p>});</p>
<p>// 이벤트 지우기
// event4에 연결되어있는 모든 콜백 삭제됨
myEvent.removeAllListeners(&#39;이벤트 4&#39;);</p>
<p>myEvent.emit(&#39;event4&#39;)        //         --&gt; 실행 안됨</p>
<p>// 하나의 콜백함수 지우기
const listener = () =&gt; {</p>
<pre><code>console.log(&#39;이벤트 5&#39;);</code></pre><p>});
myEvent.on(&#39;event5&#39;, listener);
myEvent.removeListener(&#39;event5&#39;, listener);
myEvent.emit(&#39;event5&#39;);        //       --&gt; 실행 안됨</p>
<p>// 해당하는 이벤트에 등록되어있는 콜백 개수 출력
console.log(myEvent.listenerCount(&#39;event2&#39;));  // 2</p>
<p>```</p>
<hr>
<h2 id="📌에러-처리하기">📌에러 처리하기</h2>
<h3 id="✨예외exception">✨예외(Exception)</h3>
<ul>
<li>처리하지 못한 에러</li>
<li>노드 스레드를 멈춤</li>
<li>노드는 기본적으로 싱글 스레드라 스레드가 멈춘다는 것은 프로세스가 멈추는 것</li>
<li>에러 처리는 필수</li>
<li>기본적으로 try catch 문으로 예외 처리
<img src="https://velog.velcdn.com/images/jung_inny/post/cfd693d9-8516-4567-80fb-c6b822de7e00/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/093fa765-0a8c-47e4-b71b-0edb4f7e5891/image.png" alt=""></li>
<li>노드 비동기 메서드의 에러는 따로 처리하지 않아도 됨</li>
<li><blockquote>
<p>콜백 함수에서 에러 객체 제공 / 노드 프로세스가 멈추지는 않음
<img src="https://velog.velcdn.com/images/jung_inny/post/cb4b5756-4b89-4ab3-a1c8-b5c6080a7c20/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/48bdab46-2e6f-4423-8e52-fad44f82653e/image.png" alt=""></p>
</blockquote>
</li>
<li>프로미스의 에러는 따로 처리하지 않아도 됨</li>
<li><blockquote>
<p>버전이 올라가면 동작이 바뀔 수 있음 (catch 붙여줘야 함)
<img src="https://velog.velcdn.com/images/jung_inny/post/f980051e-c131-40d4-bb6b-3746e3292105/image.png" alt=""></p>
</blockquote>
</li>
<li>최후의 수단으로 사용</li>
<li><blockquote>
<p>콜백 함수의 동작 보장되지 않음</p>
</blockquote>
</li>
<li><blockquote>
<p>복구 작업용으로 쓰는 것은 부적합</p>
</blockquote>
</li>
<li><blockquote>
<p>에러 내용 기록 용으로만 쓰는 게 좋음
<img src="https://velog.velcdn.com/images/jung_inny/post/3620027f-63c6-43fe-b5ce-82e0589af92b/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 11일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 01 Oct 2023 16:33:10 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 11일차 (23_10_02) 🌷

✅crypto와 util</code></pre><hr>
<hr>
<h2 id="📌crypto와-util">📌crypto와 util</h2>
<h3 id="✨단방향-암호화-crypto">✨단방향 암호화 (crypto)</h3>
<ul>
<li>암호화는 가능하지만 복호화는 불가능</li>
<li>암호화 : 평문을 암호로 만듦</li>
<li>복호화 : 암호를 평문으로 해독</li>
<li>비밀번호는 암호화가 아닌 해시</li>
</ul>
<h3 id="✨해시-hash">✨해시 (Hash)</h3>
<ul>
<li>해시 : 평문을 암호같이, 암호를 평문으로 만들기는 매우 어려움</li>
<li>특징 : 같은 평문을 암호화하면 암호는 항상 동일</li>
<li>서버에는 해시만 남아있음</li>
<li>유저가 입력한 암호를 해시화해서 그 값이 저장되어있는 해시와 같은지 비교함</li>
<li>알고리즘만 잘 선택하면 매우 안전함</li>
</ul>
<h3 id="✨양방향-암호화">✨양방향 암호화</h3>
<h4 id="📢대칭형-암호화-암호문-복호화-가능">📢대칭형 암호화 (암호문 복호화 가능)</h4>
<ul>
<li>Key가 사용됨</li>
<li>암호화할 때와 복호화 할 때 같은 Key를 사용해야 함</li>
<li>Key가 훔쳐질 가능성 높음. Key 관리 잘 해야 함.</li>
</ul>
<h3 id="✨util">✨util</h3>
<ul>
<li>노드에서 각종 편의기능만 모아둔 모듈</li>
<li>deprecated 와 promisfy 가 자주 쓰임</li>
<li>잘못만든 것을 알려줄 때 deprecated</li>
<li>deprecated 로 함수를 감싸서 경고창 띄움</li>
<li>promisfy 로 감싸면 콜백을 프로미스로 바꿀 수 있음</li>
<li>단, 콜백이 (error, data) 형식이여야만 바꿀 수 있음
<img src="https://velog.velcdn.com/images/jung_inny/post/c4b5634d-19ad-473d-9ec4-91e6c4e5745b/image.png" alt=""></li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 10일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 28 Sep 2023 07:28:26 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 10일차 🌷

✅url, dns, searchParams</code></pre><hr>
<hr>
<h2 id="📌url-dns-searchparams">📌url, dns, searchParams</h2>
<h3 id="✨url">✨url</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/224fd83a-0f60-4e1e-babd-8ce59677c7ea/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/00034612-2377-498a-ab22-14e9c7285b7c/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/98bc1eef-51e9-44b0-b616-e5ffa9473789/image.png" alt=""></p>
<h3 id="✨dns">✨dns</h3>
<ul>
<li>DNS를 다룰 때 사용하는 모듈</li>
<li>주로 도메인을 통해 IP나 기타 DNS 정보를 얻고자 할 때 사용함
<img src="https://velog.velcdn.com/images/jung_inny/post/1cb6397f-322e-4723-a1b6-657ff571a5f5/image.png" alt=""></li>
</ul>
<h3 id="✨searchparams">✨searchParams</h3>
<p><img src="https://velog.velcdn.com/images/jung_inny/post/8ac2887e-5d4a-4d1a-b4f9-b6e3b170c9d7/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/1d8da2c0-9d56-4223-a551-756af606e2ce/image.png" alt="">
<img src="https://velog.velcdn.com/images/jung_inny/post/a2516be7-bd70-4f9f-8ea2-acf8ed478dea/image.png" alt=""></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 9일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-7%EC%9D%BC%EC%B0%A8-khsg6wem</link>
            <guid>https://velog.io/@jung_inny/Node.js-7%EC%9D%BC%EC%B0%A8-khsg6wem</guid>
            <pubDate>Thu, 28 Sep 2023 07:15:00 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 9일차 🌷

✅os와 path</code></pre><hr>
<hr>
<h2 id="📌os와-path">📌os와 path</h2>
<h3 id="✨os">✨OS</h3>
<ul>
<li>운영체제의 정보를 담고 있음</li>
<li>모듈은 require로 가져옴 (내장 모듈이라 경로 대신 이름만 적어줘도 됨)</li>
<li>node의 스레드와 OS의 스레드는 다름<pre><code>ex)
</code></pre></li>
</ul>
<p>const os = require(&#39;os&#39;);
os.uptime();</p>
<pre><code>
### ✨path
- 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈
- 운영체제별로 경로 구분자가 다름(Windows:&#39;\&#39;, POSIX:&#39;/&#39;)
- join과 resolve의 차이 : resolve는 /를 절대경로로 처리, joinㅇㄴ 상대경로로 처리
- 상대 경로 : 현재 파일기준, 같은 경로면 점 하나(.), 한 단계 상위 경로면 점 두 개(..)
- 절대 경로는 루트 폴더나 노드 프로세스가 실행되는 위치가 기준
- \\와 \의 차이 : \는 윈도 경로 구분자, \\는 자바스크립트 문자열 안에서 사용(\가 특수문자라 \\로 이스케이프 해준 것)
- 윈도에서 POSIX path를 쓰고 싶다면 : path.posix 객체 사용

---
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 8일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 28 Sep 2023 06:55:11 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 8일차 🌷

✅process</code></pre><hr>
<hr>
<h2 id="📌process">📌process</h2>
<h3 id="✨process">✨process</h3>
<ul>
<li>현재 실행중인 노드 프로세스에 대한 정보를 담고 있음</li>
</ul>
<h3 id="✨processenv">✨process.env</h3>
<ul>
<li>환경변수</li>
<li>비밀키(데이터베이스 비밀번호, 서드파티 앱 키 등)를 보관하는 용도로도 쓰임</li>
<li>환경변수는 <code>process.env</code> 로 접근 가능</li>
<li>일부 환경 변수는 노드 실행 시 영향을 미침
<img src="https://velog.velcdn.com/images/jung_inny/post/124b0005-4616-4738-af66-a2082fb35afd/image.png" alt=""></li>
</ul>
<h3 id="✨processnexttick콜백">✨process.nextTick(콜백)</h3>
<ul>
<li>이벤트 루프가 다른 콜백 함수들보다 enxtTick의 콜백 함수를 우선적으로 처리함</li>
<li>너무 남용하면 다른 콜백 함수들 실행이 늦어짐</li>
<li>비슷한 경우로 promise가 있음(nextTick 처럼 우선순위가 높음)
<img src="https://velog.velcdn.com/images/jung_inny/post/c054d7fb-0057-4b79-bdad-06e9fbdedd55/image.png" alt=""></li>
</ul>
<h3 id="✨processexit코드">✨process.exit(코드)</h3>
<ul>
<li>현재의 프로세스를 멈춤</li>
<li>코드가 없거나 0이면 정상 종료</li>
<li>이외의 코드는 비정상 종료를 의미함</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js - 7일차 🌷]]></title>
            <link>https://velog.io/@jung_inny/Node.js-7%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jung_inny/Node.js-7%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 26 Sep 2023 05:41:31 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<pre><code>🌷 7일차 🌷

✅global과 콘솔, 타이머</code></pre><hr>
<hr>
<h2 id="📌global과-콘솔-타이머">📌global과 콘솔, 타이머</h2>
<h3 id="✨global">✨global</h3>
<ul>
<li>노드의 전역 객체</li>
<li>브라우저의 window 같은 역할</li>
<li>모든 파일에서 접근 가능</li>
<li>window처럼 생략도 가능 (console, require도 global의 속성)</li>
<li>global 속성에 값을 대입하면 다른 파일에서도 사용 가능</li>
</ul>
<h3 id="✨console-객체">✨console 객체</h3>
<ul>
<li>console.time, onsole.timeEnd : 시간 로깅</li>
<li>console.error : 에러 로깅</li>
<li>console.log : 평범한 로그</li>
<li>conosle.dir : 객체 로깅</li>
<li>console.trace : 호출 스택 로깅</li>
</ul>
<h3 id="✨타이머">✨타이머</h3>
<ul>
<li>setTimeout(콜백 함수, 밀리초) : 주어진 밀리초 (1000분의 1초) 이후에 콜백 함수를 실행</li>
<li>setInterval(콜백 함수, 밀리초) : 주어진 밀리초마다 콜백 함수를 반복 실행</li>
<li>setImmediate(골백 함수) : 콜백 함수를 즉시 실행</li>
<li>clearTimeout(아이디) : setTimeout을 취소</li>
<li>clearInterval(아이디) : setInterval을 취소</li>
<li>clearImmediate(아이디) : setImmediate을 취소</li>
</ul>
<hr>
]]></description>
        </item>
    </channel>
</rss>