<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>flypig-hub.log</title>
        <link>https://velog.io/</link>
        <description>하루 고생하면 코드가 나 대신 일해준다.</description>
        <lastBuildDate>Sun, 25 Dec 2022 13:02:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>flypig-hub.log</title>
            <url>https://velog.velcdn.com/images/flypig-hub/profile/1b1b22c9-529b-45fe-8861-0f12e2fde7e2/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. flypig-hub.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/flypig-hub" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[22.12.25 칵테일 메이커 설정 1]]></title>
            <link>https://velog.io/@flypig-hub/22.12.25-%EC%B9%B5%ED%85%8C%EC%9D%BC-%EB%A9%94%EC%9D%B4%EC%BB%A4-%EC%84%A4%EC%A0%95-1</link>
            <guid>https://velog.io/@flypig-hub/22.12.25-%EC%B9%B5%ED%85%8C%EC%9D%BC-%EB%A9%94%EC%9D%B4%EC%BB%A4-%EC%84%A4%EC%A0%95-1</guid>
            <pubDate>Sun, 25 Dec 2022 13:02:25 GMT</pubDate>
            <description><![CDATA[<p> nestjs초기설정 참조. - 22.11.24 node.js project </p>
<p> service controller module 폴더 활용 예정.
 entity 생성 요망.</p>
<p> crolling 기능 활용. 1일 1회, 나무위키 사이트 크롤링
 필요 기능들 -</p>
<p> 개발 계획 -</p>
<p> 서버 설정 - </p>
<p> -카페시간 다됨.. 추후 이 게시글 수정 바람.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ERD생성 방법]]></title>
            <link>https://velog.io/@flypig-hub/ERD%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@flypig-hub/ERD%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Thu, 15 Dec 2022 12:43:02 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>현실의 주제를 큰 카테고리로 추출.</p>
<ul>
<li>카테고리의 기준은 이 카테고리가 가지고 있는 기능이 유일한가? 중요도가 높은가?로 결정.</li>
<li>자주 쓰이는 카테고리 - 고객(독립개체), 상품(독립개체), 판매(행동)</li>
</ul>
<ol start="2">
<li>큰 카테고리에서 entity를 추출한다.</li>
</ol>
<p>2-1추출한 카테고리에서 [독립된, 유일한, 가장 중요한] key entity를 추출한다.</p>
<p>2-2 key entity를 중심으로 [종속된, 중요도가 큰, key entity에 연관된]action entity를 추출한다.</p>
<p>2-3 action entity의 결과 값인 [row data인, 종속된, 중요도가 낮은(쉽게 변경이 가능한)]action entity를 추출한다.</p>
</li>
</ol>
<ol start="3">
<li><p>추출된 각 entity를 관계도(erd)로 이어준다.
각 realation은 종속관계에 있고 보통 key-data의 저장, 꺼내오기의 형태를 가진다.</p>
<p>참고 - <a href="https://www.erdcloud.com/">https://www.erdcloud.com/</a> - erd작성 도구</p>
<ul>
<li><a href="https://www.erdcloud.com/d/PK2Ae7d4asTRqHpHx">https://www.erdcloud.com/d/PK2Ae7d4asTRqHpHx</a> - RDBM 예시자료</li>
</ul>
</li>
</ol>
<p>이후 완성된 ERD를 활용해 RDBMS를 제작하고 이를 바탕으로 API를 제작하면 되겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[연속된 수의 합]]></title>
            <link>https://velog.io/@flypig-hub/%EC%97%B0%EC%86%8D%EB%90%9C-%EC%88%98%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@flypig-hub/%EC%97%B0%EC%86%8D%EB%90%9C-%EC%88%98%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Thu, 15 Dec 2022 12:23:44 GMT</pubDate>
            <description><![CDATA[<p>문제 = result는 sum을 length로 가지고 있고 모든 elemen는 연속된 수이며 모두 더했을 때 total 이 된다.
이때 resule를 구하시오.</p>
<p>function solution(num, total) {
    var answer = [];
    let zeroSum = 0;
    let start = 0;
    for (let i = 0 ; i&lt;num ; i++){
        zeroSum+=i
    }
    for(let k=0; k&lt;100; k++){
    if (total &gt; zeroSum){zeroSum+=num;
                           start ++;
                          }<br>    else if (total &lt; zeroSum){zeroSum-=num;
                         start --;
                        }
    else if (total === zeroSum){
                         break;
                           }
    }
     for(let j = 0 ; j&lt;num ; j++){
    answer.push(start);
    start++;
    }
    return answer;
}</p>
<p>나의 풀이 - 1~sum의 모든 element를 더한 값 zeroSum을 구한다.
result의 첫 element가 1에서 1만큼 달라질때 total의 값은 sum만큼의 차이를 가진다.
 반복문을 통해 zeroSum과 total 이 오차를 보일 때마다 result의 첫번째 element인 start 값을 1만큼 더하거나 뺀다. zeroSum과 total이 값이 같아졌을 경우 result의 값은 만큼의 length를 가지는 start부터 시작하는 연속된 수 이다.</p>
<p> ////</p>
<p> 다른 사람( J)의 풀이.</p>
<p>function solution(num, total) {
    var min = Math.ceil(total/num - Math.floor(num/2));
    var max = Math.floor(total/num + Math.floor(num/2));</p>
<pre><code>return new Array(max-min+1).fill(0).map((el,i)=&gt;{return i+min;});</code></pre><p>}
Math.ceil() - number를 받고 소수점을 올림하여 정수를 반환합니다.
최소값 = 올림 값(num을 total로 나눈 값-num/2값의 올림 값)
Math.floor() - number를 받고 소수점을 내림하여 정수를 반환합니다.
최대값 = 내림 값(numdmf total로 나눈 값-num/2의 올림 값)
new array 어레이 생성 array에 array(element 갯수)를 생성 , arr.fill(value,start index(option), end index(option))array의 element 값을 start index부터 end index까지 value로 변환한다.
.map 다음의 함수의 결과값으로 구성된 arr를 반환한다.
(element, index(option), array(option),<a href="option">thisarr</a>)
(el,i)=&gt;{return i+min} min과 index값을 더한 값이 elm의 값이 된다.
[최소값, 최소값+index, 최소값+index, ...]</p>
<p>다른사람(J)의 연산속도가 약 2배 빠르다.</p>
<p>new arr().fill().map(()=&gt;)을 활용하여 array.push가 아닌 생성과 값 입력을 동시에 해보도록 하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[nodejs-작성 중]]></title>
            <link>https://velog.io/@flypig-hub/nodejs-%EC%9E%91%EC%84%B1-%EC%A4%91</link>
            <guid>https://velog.io/@flypig-hub/nodejs-%EC%9E%91%EC%84%B1-%EC%A4%91</guid>
            <pubDate>Mon, 31 Oct 2022 03:27:04 GMT</pubDate>
            <description><![CDATA[<p>Node.js 특징.</p>
<p>chrome v8 js 엔진 기반 js 런타임</p>
<p>js 어플 실행 가능.(?) 서버 실행이 가장 유효.</p>
<ul>
<li>서버사이트 스크립트 언어가 아니다. 프로그램(환경)이다(?)</li>
</ul>
<p>-웹 서버와 같이 확장성 있는 네트워크 프로그램 제작을 위해 만들어졌다.(?)</p>
<p>-Non-blocking I/O, 단일 스레드 이벤트 루프(추후 주석 작성함)</p>
<p>-내장 http 서버 라이브러리를 포함한다(?)
따라서  아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능(?)하여
서버 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 한다.</p>
<p>-데이터의 실시간 변환. 안드로이드폰 아이폰 윈도우 맥 등 플랫폼제약없이 프로그램과 게임 구동 가능(알아보기)
-온라인 채팅, 실시간 온라인 게임, 로그인 기능을 넣어 유저를 관리하고 점수를 관리 가능. (socket.io와 node.js의 관계는?)
-</p>
<p>j.s는 독립적인 언어가 아닌 script언어이다(?)
스크립트 언어는 특정한 프로그램 안에서만 동작하는 프로그램.
j.s는 웹 브라우저 프로그램 안에서만 동작.</p>
<p>node.js는 js를 터미널 프로그램에서 입력하여 실행가능.
노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.(libuv란?)
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.</p>
<p>-이벤트 리스너에 콜백함수를 등록.
-해당 이벤트 발생 시, 이벤트가 미리 지정해둔 작업을 수행(언어 정리 요망)
-다음 이벤트가 발생할 때 까지 (서버는?) 대기한다.</p>
<p>이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.
노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loog)라고 부른다.</p>
<ul>
<li>위 내용 중 이벤트 루프의 처리 순서에 대해 설명하시오.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[t.s crypto 블록체인 클론 - 저장용]]></title>
            <link>https://velog.io/@flypig-hub/t.s-crypto-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%81%B4%EB%A1%A0-%EC%A0%80%EC%9E%A5%EC%9A%A9</link>
            <guid>https://velog.io/@flypig-hub/t.s-crypto-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%81%B4%EB%A1%A0-%EC%A0%80%EC%9E%A5%EC%9A%A9</guid>
            <pubDate>Sun, 09 Oct 2022 10:04:52 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/flypig-hub/T-S-blockchain-using-crypto.git">https://github.com/flypig-hub/T-S-blockchain-using-crypto.git</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[해쉬태그 뽑기]]></title>
            <link>https://velog.io/@flypig-hub/%ED%95%B4%EC%89%AC%ED%83%9C%EA%B7%B8-%EB%BD%91%EA%B8%B0</link>
            <guid>https://velog.io/@flypig-hub/%ED%95%B4%EC%89%AC%ED%83%9C%EA%B7%B8-%EB%BD%91%EA%B8%B0</guid>
            <pubDate>Thu, 18 Aug 2022 06:30:50 GMT</pubDate>
            <description><![CDATA[<p> let tags = [];
    for (let i = 0; i &lt; allRoom.length; i++) {
      const room = allRoom[i];
      for (let l = 0; l &lt; room.hashTag.length; l++) {
        const hashtag = room.hashTag[l];
        tags.push(hashtag);
      }
    }</p>
<pre><code>tags = tags.reduce((accu, curr) =&gt; {
  accu[curr] = (accu[curr] || 0) + 1;
  return accu;
}, {});
let max = 0;
let max2 = 0;
let max3 = 0;
for (let j = 0; j &lt; Object.values(tags).length; j++) {
  if (max &lt; Object.values(tags)[j]) {
    max = Object.values(tags)[j];
  }
  if (max2 &lt; Object.values(tags)[j] &lt; max) {
    max2 = Object.values(tags)[j];
  }
  if (max3 &lt; Object.values(tags)[j] &lt; max2) {
    max3 = Object.values(tags)[j];
  }
}
max = Object.keys(tags).find((key) =&gt; tags[key] === max);
delete tags[max];
max2 = Object.keys(tags).find((key) =&gt; tags[key] === max2);
delete tags[max2];
max3 = Object.keys(tags).find((key) =&gt; tags[key] === max3);
tags = [max, max2, max3];</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[기능정리 - 조건순으로 검색하기]]></title>
            <link>https://velog.io/@flypig-hub/%EA%B8%B0%EB%8A%A5%EC%A0%95%EB%A6%AC-%EC%A1%B0%EA%B1%B4%EC%88%9C%EC%9C%BC%EB%A1%9C-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@flypig-hub/%EA%B8%B0%EB%8A%A5%EC%A0%95%EB%A6%AC-%EC%A1%B0%EA%B1%B4%EC%88%9C%EC%9C%BC%EB%A1%9C-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 18 Aug 2022 05:35:36 GMT</pubDate>
            <description><![CDATA[<p>const findbyaddress = await hosts.findAll({
      where: {
        [Op.or]: [
          {
            mainAddress: {
              [Op.substring]: querydata.search,
            },
          },
          { houseInfo: querydata.search },
        ],
      },
      order: [[&quot;createdAt&quot;, &quot;DESC&quot;]],
      include: [
        {
          model: images,
          required: false,
          attributes: [
            &quot;hostId&quot;,
            &quot;postImageURL&quot;,
            &quot;thumbnailURL&quot;,
            &quot;userImageURL&quot;,
          ],
        },
      ],
    });
    const findbytitle = await hosts.findAll({
      where: {
        title: {
          [Op.substring]: querydata.search,
        },
      },
      order: [[&quot;createdAt&quot;, &quot;DESC&quot;]],
      include: [
        {
          model: images,
          required: false,
          attributes: [
            &quot;hostId&quot;,
            &quot;postImageURL&quot;,
            &quot;thumbnailURL&quot;,
            &quot;userImageURL&quot;,
          ],
        },
      ],
    });
    let hostContent = await hosts.findAll({
      where: {
        hostContent: {
          [Op.substring]: querydata.search,
        },
      },
      order: [[&quot;createdAt&quot;, &quot;DESC&quot;]],
      include: [
        {
          model: images,
          required: false,
          attributes: [
            &quot;hostId&quot;,
            &quot;postImageURL&quot;,
            &quot;thumbnailURL&quot;,
            &quot;userImageURL&quot;,
          ],
        },
      ],
    });
    for (let h = 0; h &lt; findbyaddress.length; h++) {
      searchResult.push(findbyaddress[h]);
      searchResultId.push(findbyaddress[h].hostId);
    }
    for (let p = 0; p &lt; findbytitle.length; p++) {
      if (searchResultId.includes(findbytitle[p].hostId)) {
      } else {
        searchResult.push(findbytitle[p]);
        searchResultId.push(findbytitle[p].hostId);
      }
    }
    for (let i = 0; i &lt; hostContent.length; i++) {
      if (searchResultId.includes(hostContent[i].hostId)) {
      } else {
        searchResult.push(hostContent[i]);
        searchResultId.push(hostContent[i].hostId);
      }
    }</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기능정리 - 특정 글 순서 바꾸기]]></title>
            <link>https://velog.io/@flypig-hub/%EA%B8%B0%EB%8A%A5%EC%A0%95%EB%A6%AC-%ED%8A%B9%EC%A0%95-%EA%B8%80-%EC%88%9C%EC%84%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0</link>
            <guid>https://velog.io/@flypig-hub/%EA%B8%B0%EB%8A%A5%EC%A0%95%EB%A6%AC-%ED%8A%B9%EC%A0%95-%EA%B8%80-%EC%88%9C%EC%84%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0</guid>
            <pubDate>Thu, 18 Aug 2022 05:34:10 GMT</pubDate>
            <description><![CDATA[<p>for (let i = 0; i &lt; chatingRooms.length; i++) {
      let chatRoom = chatingRooms[i];
      if (chatRoom.roomId == roomId) {
        chatingRooms[i] = chatingRooms[0];
        chatingRooms[0] = chatRoom;
      }
    }</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기능정리 - 해쉬태그 인기순으로 나열하기]]></title>
            <link>https://velog.io/@flypig-hub/%EA%B8%B0%EB%8A%A5%EC%A0%95%EB%A6%AC-%ED%95%B4%EC%89%AC%ED%83%9C%EA%B7%B8-%EC%9D%B8%EA%B8%B0%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%82%98%EC%97%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@flypig-hub/%EA%B8%B0%EB%8A%A5%EC%A0%95%EB%A6%AC-%ED%95%B4%EC%89%AC%ED%83%9C%EA%B7%B8-%EC%9D%B8%EA%B8%B0%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%82%98%EC%97%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 18 Aug 2022 05:31:57 GMT</pubDate>
            <description><![CDATA[<p>const allRoom = await Rooms.findAll({ order: [[&quot;createdAt&quot;, &quot;DESC&quot;]] });</p>
<pre><code>let tags = [];
for (let i = 0; i &lt; allRoom.length; i++) {
  const room = allRoom[i];
  for (let l = 0; l &lt; room.hashTag.length; l++) {
    const hashtag = room.hashTag[l];
    tags.push(hashtag);
  }
}

tags = tags.reduce((accu, curr) =&gt; {
  accu[curr] = (accu[curr] || 0) + 1;
  return accu;
}, {});
let max = 0;
let max2 = 0;
let max3 = 0;
for (let j = 0; j &lt; Object.values(tags).length; j++) {
  if (max &lt; Object.values(tags)[j]) {
    max = Object.values(tags)[j];
  }
  if (max2 &lt; Object.values(tags)[j] &lt; max) {
    max2 = Object.values(tags)[j];
  }
  if (max3 &lt; Object.values(tags)[j] &lt; max2) {
    max3 = Object.values(tags)[j];
  }
}
max = Object.keys(tags).find((key) =&gt; tags[key] === max);
delete tags[max];
max2 = Object.keys(tags).find((key) =&gt; tags[key] === max2);
delete tags[max2];
max3 = Object.keys(tags).find((key) =&gt; tags[key] === max3);
tags = [max, max2, max3];</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[키워드 검색기능. 시퀄라이저 사용.]]></title>
            <link>https://velog.io/@flypig-hub/%ED%82%A4%EC%9B%8C%EB%93%9C-%EA%B2%80%EC%83%89%EA%B8%B0%EB%8A%A5.-%EC%8B%9C%ED%80%84%EB%9D%BC%EC%9D%B4%EC%A0%80-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@flypig-hub/%ED%82%A4%EC%9B%8C%EB%93%9C-%EA%B2%80%EC%83%89%EA%B8%B0%EB%8A%A5.-%EC%8B%9C%ED%80%84%EB%9D%BC%EC%9D%B4%EC%A0%80-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Thu, 18 Aug 2022 05:21:43 GMT</pubDate>
            <description><![CDATA[<p>const queryData = req.query;
  let key = {};
  try {
    queryData.search === &quot;Northarea&quot;
      ? (key = {
          [Op.or]: [
            {
              mainAddress: {
                [Op.substring]: &quot;제주시&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;조천읍&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;애월읍&quot;,
              },
            },
          ],
        })
      : queryData.search === &quot;Westarea&quot;
      ? (key = {
          [Op.or]: [
            {
              mainAddress: {
                [Op.substring]: &quot;한림읍&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;한경면&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;대정읍&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;안덕면&quot;,
              },
            },
          ],
        })
      : queryData.search === &quot;Southarea&quot;
      ? (key = {
          [Op.or]: [
            {
              mainAddress: {
                [Op.substring]: &quot;중문&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;서귀포시&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;남원읍&quot;,
              },
            },
          ],
        })
      : queryData.search === &quot;Eastarea&quot;
      ? (key = {
          [Op.or]: [
            {
              mainAddress: {
                [Op.substring]: &quot;구좌읍&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;성산읍&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;표선면&quot;,
              },
            },
            {
              mainAddress: {
                [Op.substring]: &quot;우도면&quot;,
              },
            },
          ],
        })
      : (key = {});</p>
<pre><code>const hostPost = await hosts.findAll({
  where: key,
  include: [
    {
      model: images,
      attributes: [&quot;hostId&quot;, &quot;postImageURL&quot;],
    },
  ],
  order: [[&quot;createdAt&quot;, &quot;DESC&quot;]],
});

코드 사용 시 댓글을 남겨주세요.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[코드 정리 - 게시물 시간.]]></title>
            <link>https://velog.io/@flypig-hub/%EC%BD%94%EB%93%9C-%EC%A0%95%EB%A6%AC-%EA%B2%8C%EC%8B%9C%EB%AC%BC-%EC%8B%9C%EA%B0%84</link>
            <guid>https://velog.io/@flypig-hub/%EC%BD%94%EB%93%9C-%EC%A0%95%EB%A6%AC-%EA%B2%8C%EC%8B%9C%EB%AC%BC-%EC%8B%9C%EA%B0%84</guid>
            <pubDate>Thu, 18 Aug 2022 05:19:04 GMT</pubDate>
            <description><![CDATA[<p>-코멘트의 경우.
for (let i = 0; i &lt; commentInfo.length; i++) {
  let comment = commentInfo[i];
  const writtenTime = Date.parse(comment.createdAt);
  const timeNow = Date.parse(Date());
  const diff = timeNow - writtenTime;</p>
<p>  if (diff &gt; 1123200000) {
  } else {
    const times = [
      { time: &quot;분&quot;, milliSeconds: 1000 * 60 },
      { time: &quot;시간&quot;, milliSeconds: 1000 * 60 * 60 },
      { time: &quot;일&quot;, milliSeconds: 1000 * 60 * 60 * 24 },
      { time: &quot;주&quot;, milliSeconds: 1000 * 60 * 60 * 24 * 7 },
    ].reverse();</p>
<pre><code>for (const value of times) {
  const betweenTime = Math.floor(diff / value.milliSeconds);
  if (betweenTime &gt; 0) {
    comment = {
      userId: comment.userId,
      commentId: comment.commentId,
      comment: comment.comment,
      userImageURL: comment.user.userImageURL,
      nickname: comment.user.nickname,
      createdAt: betweenTime + value.time + &quot;전&quot;,
    };
    commentInfo[i] = comment;
    break;
  } else {
    Review = {
      userId: comment.userId,
      commentId: comment.commentId,
      comment: comment.comment,
      userImageURL: comment.user.userImageURL,
      nickname: comment.user.nickname,
      createdAt: &quot;방금 전&quot;,
    };
    commentInfo[i] = comment;
  }

  -</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[멘도롱 제주 프로젝트 정리]]></title>
            <link>https://velog.io/@flypig-hub/%EB%A9%98%EB%8F%84%EB%A1%B1-%EC%A0%9C%EC%A3%BC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@flypig-hub/%EB%A9%98%EB%8F%84%EB%A1%B1-%EC%A0%9C%EC%A3%BC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 18 Aug 2022 05:17:41 GMT</pubDate>
            <description><![CDATA[<p><a href="https://mendorong-jeju.co.kr/">https://mendorong-jeju.co.kr/</a>
2022.06<del>2022.08
멘도롱 제주 프로젝트가 6주의 기간을 모두 잡아먹고 드디어 끝이 났다. 
그간 배웠던 node.js를 다써먹고도 api작성, socketio구현을 위해 공부를 계속 하며 만들어야했기에 시간과 노력을 많이 잡아먹었다.
 너무 집중했던 탓일까 프로젝트 마무리 후 1주정도 지난 시점에서 2</del>3일간 아무것도 하기싫은 그런 시기가 왔다. 누군가에게는 그저 그런 프로젝트이지만 나에게는 프론트의 요청을 어떻게든 들어주지않으면 안되었던 절실한 코드가 담긴 프로젝트였기에 정신적으로 잠깐 탈진한 듯 무료히 시간을 보내었다.
 이제 본격적으로 취업준비를 해봐야지 하고 풀악셀을 밟아보았는데, 어머나 세상에 1mm전진하고 바로 알고리즘의 문에 박혔다. 여태 api구현하며 얼마나 머리를 썩혔는데 이쯤이야 하고 생각했는데 내가 구현했던 방향과 전혀다른 문제들이 속속들이 나오며 나는 잠시 또 브레이크를 밟고 자리에 엎어질 수 밖에 없었다.</p>
<p> 면접용 개념공부는 조금씩, 알고리즘 공부는 빡세게 또 시작해봐야겠다.</p>
<p> 모르고 시작한건 아니지만 공부의 끝이 공부라니 너무 좋다. 또 한번 힘내보자.</p>
<p> // 이후의 게시글에 그 코드들을 올릴 예정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 프로젝트 때의 소켓 트러블]]></title>
            <link>https://velog.io/@flypig-hub/%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%95%8C%EC%9D%98-%EC%86%8C%EC%BC%93-%ED%8A%B8%EB%9F%AC%EB%B8%94</link>
            <guid>https://velog.io/@flypig-hub/%EC%9B%B9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%95%8C%EC%9D%98-%EC%86%8C%EC%BC%93-%ED%8A%B8%EB%9F%AC%EB%B8%94</guid>
            <pubDate>Wed, 03 Aug 2022 03:31:19 GMT</pubDate>
            <description><![CDATA[<p><code>다른 문제점</code></p>
<p>1.채팅룸 관리는 api요청으로, 실시간 채팅 기능은 sockstio연결로 구성하였으나</p>
<p>“내가 들어가있는 채팅룸 목록”을 불러오기는 최대한 실시간에 가깝게 구현하고자 하여</p>
<p>방을 바꿀 떄 마다 api를 한번씩 호출하는 방식으로 구현하였다.</p>
<p>하지만 api의 unshift()함수가 중복 적용되는 버그가 발견되어 unshift()이외에</p>
<p>“내가 현재 채팅중인 방”을 “내가 들어가있는 채팅룸 목록”의 첫번째에 위치시키는 코드가 필요해졌다.</p>
<ol>
<li>채팅방의 인기 해쉬태그 목록 뽑아내기.</li>
</ol>
<p>채팅방 관련 api설계와 코드작업 시작이 늦게 이루어져 </p>
<p> 서버를 열고 데이터를 쌓고 있는 와중에 schemas - 채팅방 해쉬태그를 bd에 추가 해야하는 상황이 벌어졌다.</p>
<p> 버그나 데이터 꼬임이 생기지 않게 하기 위해 schemas 추가 없이 hashtag 인기순 정렬 기능만 만들고자 헀다.</p>
<p><code>해결방법</code></p>
<ol>
<li>unshift함수를 사용하지않고  새로운 for문을 만들어 대체하여 </li>
</ol>
<p>unshift함수의 “객체 추가” 기능이 아닌 “객체끼리의 위치 변경”으로 기능을 수정하여 사용했다.</p>
<ol>
<li><p>채팅방 models관련 코드를 전부 삭제.</p>
<p>roomshashtag schemas 관련 코드를 전부 빼고 rooms 의 hashtag만으로 새 배열을 만들어 갯수순으로 정렬하였다.</p>
<p>/<em>이중포문으로  채팅방전체 안의 채팅방의 해쉬태그를 모두 뽑아와 나열 후 리듀스로 같은 단어를 특정 후 갯수를 밸류값으로 추가 후 for문을 통해 해쉬태그 갯수를 추출 후 내림차순으로 나열, 상위 세개의 수를 뽑아 리듀스 된 객체find()에 사용</em>/</p>
<p>그리하여 상위 세개의 해쉬태그를 models없이 뽑을 수 있도록 하였다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[pm2]]></title>
            <link>https://velog.io/@flypig-hub/pm2</link>
            <guid>https://velog.io/@flypig-hub/pm2</guid>
            <pubDate>Tue, 02 Aug 2022 08:58:14 GMT</pubDate>
            <description><![CDATA[<ol>
<li>PM2란 무엇인가?</li>
</ol>
<p>© 2019 PM2. All Rights Reserved.</p>
<p>1) 프로세스 매니저
우리의 Node.js에 사용성을 200% 높여주는 천금같은 패키지 매니저로 npm이 있다면, Node.js를 Express와 같은 프레임 워크를 이용해 Back-End에서 사용하고 있는 개발자들에게 감히 사용성을 20000% 높여준다 할 수 있는 한 줄기 빛인 프로세스 매니저로 바로 PM2가 있습니다. (이름 그 자체로 PM이 Process Manager의 약자입니다... 2는뭐지..??)</p>
<ul>
<li>패키지 매니저인 npm에 대해 궁금하시다면 ☞ [Node.js] npm 소개와 설치 및 사용법</li>
</ul>
<p>2) PM2 사용 이유
우선 Node.js를 서버로서 Back-End에서 사용하시려면 여러가지 고민이 생기실겁니다.</p>
<p>대표적으로,</p>
<p>(1) 서비스를 제공하고 있는 도중 갑자기 서버가 중지되면 어떡하지?</p>
<p>(2) Node.js는 싱글 스레드 기반인데 멀티 코어 혹은 하이퍼 스레딩을 사용하고 싶다면 어떻게 해야 하지?</p>
<p>등이 있습니다.</p>
<p>Back-End 개발자에게는 골치 아픈 이러한 문제들을 PM2를 이용하시면 문제없이 해결하실 수 있습니다!</p>
<p>아래의 사용법 설명에서 위 문제들의 해결 방법을 차차 설명해 드리도록 하겠습니다.</p>
<ol start="2">
<li>PM2 설치 및 사용법
1) PM2 패키지 설치
npm install pm2 -g</li>
</ol>
<p>(-g 옵션을 주어 전역으로 설치를 해주셔야 실행명령어로 사용하실 수 있습니다.)</p>
<ul>
<li>npm 및 패키지 설치에 관해 궁금하시다면 ☞ [Node.js] npm 소개와 설치 및 사용법</li>
</ul>
<p>2) PM2 사용법</p>
<p>(1) pm2 -version</p>
<p>역시 제일 기본적인 명령어인 버전 확인 명령입니다. 설치 후 잘 설치되었나 확인하실 때 사용하시면 됩니다.</p>
<p>(2) pm2 start example.js</p>
<p>PM2를 실행하는 명령어로 서버 소스코드가 작성되어 있는 js파일을 실행하시면 되겠습니다.</p>
<p>(실행 즉시 Daemon화 되어 종료하거나, 에러가 발생하지 않는 이상 24시간 계속 유지됩니다.)</p>
<ul>
<li>유용한 옵션</li>
</ul>
<p>--watch : PM2가 실행된 프로젝트의 변경사항을 감지하여 서버를 자동 리로드 해줍니다.</p>
<p>(서비스하기 전 개발 단계에서 js파일 같은 코드 파일이나 기타 정적 파일들을 수정할 시 변경사항이 수동으로 리로드를 하지 않아도 즉시 반영되므로 매우 편리합니다.)</p>
<p>-i max(코어개수) : Node.js의 싱글 스레드를 보완하기 위한 클러스터(Cluster) 모드입니다.</p>
<p>물론 코드 상으로 클러스터를 구현할 수도 있겠지만, PM2에서는 정말 간편하게 자체 옵션으로 클러스터 모드를 지원해 줍니다!</p>
<p>-i 뒤에 코어의 개수를 입력하거나 max를 쓰시면 최대 코어 개수로 클러스터링(Clustering) 됩니다.</p>
<p>(위의 PM2 사용 이유에서 언급했던 2번째 고민을 해결하실 수 있습니다.)</p>
<p>클러스터(Cluster) 모드로 실행 중인 PM2의 모습입니다.
(3) pm2 kill</p>
<p>start 명령과 반대로 실행 중인 PM2 Daemon을 종료시키는 명령입니다.</p>
<p>(4) pm2 log</p>
<p>실행 중인 PM2 Daemon의 log를 확인하는 명령입니다.</p>
<p>(터미널에서 작업 시 로그 확인을 다 하셨으면 컨트롤 + c를 눌러 빠져나오시면 됩니다.)</p>
<p>(5) pm2 monit</p>
<p>PM2로 실행한 서버의 상황을 한눈에 확인할 수 있는 화면으로 이동하는 명령입니다.</p>
<p>(터미널에서 작업 시 모니터 화면을 종료하시려면 q를 눌러 빠져나오실 수 있습니다.)</p>
<p>터미널에서의 PM2 모니터 화면입니다.
(6) pm2 startup + pm2 startup 명령의 결과로 출력된 명령(sudo env로 시작하는 명령) + pm2 save</p>
<p>이 명령은 pm2로 실행할 서버를 항상 자동으로 시작하게끔 부트 스크립트에 등록하는 명령입니다.</p>
<p>반드시 부트 스크립트에 등록하기 전 등록할 서버를 실행해 놓으셔야 하며, pm2 start up 명령을 사용하시면 터미널에 sudo env로 시작하는 명령어가 자동으로 생성되어 출력됩니다. 그렇게 출력되어 나온 명령어를 복사하셔서 그대로 붙여 넣은 뒤 입력해주시면 현재 실행 중인 pm2 서버가 부트 스크립트에 등록되게 됩니다. 그다음 pm2 save 명령으로 pm2 관련 변경사항을 저장해 주시면 되겠습니다.</p>
<p>(위의 PM2 사용 이유에서 언급했던 1번째 고민을 해결하실 수 있습니다.)</p>
<p>(7) pm2 unstartup + pm2 save</p>
<p>예상되시겠지만, 이 명령은 위의 명령과 반대로 부트 스크립트에 등록된 pm2 서버를 등록 해제시키는 명령입니다.</p>
<p>여기까지 Node.js의 프로세스 매니저인 PM2의 소개와 설치 및 사용법이었습니다.</p>
<p>제가 소개해드린 명령어 이외에도 많은 기능을 하는 명령어들이 있으니 궁금하시거나 더 알아보시고 싶으신 분들은...</p>
<ul>
<li>PM2 공식 홈페이지 : PM2 공식 홈페이지</li>
</ul>
<p>PM2 - Home</p>
<p>Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.</p>
<p>pm2.keymetrics.io
위의 PM2 공식 홈페이지를 참조하시면 되겠습니다.</p>
<p>감사합니다!</p>
<p>출처 - <a href="https://hellominchan.tistory.com/11">https://hellominchan.tistory.com/11</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[어레이 안의 객체 솔팅 ]]></title>
            <link>https://velog.io/@flypig-hub/%EC%96%B4%EB%A0%88%EC%9D%B4-%EC%95%88%EC%9D%98-%EA%B0%9D%EC%B2%B4-%EC%86%94%ED%8C%85</link>
            <guid>https://velog.io/@flypig-hub/%EC%96%B4%EB%A0%88%EC%9D%B4-%EC%95%88%EC%9D%98-%EA%B0%9D%EC%B2%B4-%EC%86%94%ED%8C%85</guid>
            <pubDate>Thu, 28 Jul 2022 20:21:31 GMT</pubDate>
            <description><![CDATA[<p>[{id:1,&quot;이름&quot;:1},{id:2,&quot;이름&quot;:2},{id:3,&quot;이름&quot;:3},{id:4,&quot;이름&quot;:4},{id:5,&quot;이름&quot;:5}{id:6,&quot;이름&quot;:6}]</p>
<p>문제는 들어간 방이 배열의 0번쨰에 위치해야 하는데 그것을 array.unshift(객체)로 해놨더니 api를 중복실행시키니 db는 안움직여도 프론트에서 함수를 실행시켜 객체 갯수가 점점 늘어나는 문제가 발생했다.</p>
<p>그래서 객체 메소드들, 시퀄라이즈 op들, order, 배열 솔팅함수 등을 살펴보았지만 전부 실패했고 for문을 만져보던 중 </p>
<p>변수 id 를 for문안에 넣어 변수 id값을 가진 객체의 순서를 찾고 그 객체를 0번째 인자로 변경시켜주었다.</p>
<p>다만 그랬더니 그 객체가 처음 인자로 오긴 하는데 원래 0번쨰 인자를 덮어씌우기만 하길래 0번쨰 인자가 덮어씌워지기 전에 i번쨰 인자로 옮겨 준 후 0번째 인자에 덮어 씌워주었다.</p>
<p>그랬더니 </p>
<p>변수 id = 5일떄</p>
<p>[{id:5,&quot;이름&quot;:5},{id:2,&quot;이름&quot;:2},{id:3,&quot;이름&quot;:3},{id:4,&quot;이름&quot;:4},{id:1,&quot;이름&quot;:1}{id:6,&quot;이름&quot;:6}]
와 같은 위치이동이 일어났다.</p>
<p>클라이언트에게 주어지는 정보 중 클라이언트가 클릭한 특정 객체값을 0번으로 보여줄 때 활용하면 좋을 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[sequelize 쿼리 사용법]]></title>
            <link>https://velog.io/@flypig-hub/sequelize-%EC%BF%BC%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@flypig-hub/sequelize-%EC%BF%BC%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Wed, 27 Jul 2022 21:02:47 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@usreon/Sequelize-where-condition">https://velog.io/@usreon/Sequelize-where-condition</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[커밋취소]]></title>
            <link>https://velog.io/@flypig-hub/%EC%BB%A4%EB%B0%8B%EC%B7%A8%EC%86%8C</link>
            <guid>https://velog.io/@flypig-hub/%EC%BB%A4%EB%B0%8B%EC%B7%A8%EC%86%8C</guid>
            <pubDate>Tue, 19 Jul 2022 07:33:36 GMT</pubDate>
            <description><![CDATA[<p>git reset HEAD<del>취소할 커밋 숫자
ex)
git reset HEAD</del>1</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git username password]]></title>
            <link>https://velog.io/@flypig-hub/git-username-password</link>
            <guid>https://velog.io/@flypig-hub/git-username-password</guid>
            <pubDate>Tue, 19 Jul 2022 06:18:06 GMT</pubDate>
            <description><![CDATA[<p>git clone을 할때 github username, password 를 입력해주면 됐었는데, 2021년 08월 13일부로 변경됨.</p>
<p>github 로그인 &gt; Settings &gt; Developer settings &gt; Personal access tokens &gt; Generate New Token &gt; 필요항목 입력 후 Generate Token</p>
<p>Token 을 생성하고 나면 key값이 주어지는데 저 화면을 나가면 key값을 다시 확인할 수 없으므로 별도로 보관해야한다.</p>
<p>현재 위치 - 7주차 도구</p>
<p>참고 velog -<a href="https://velog.io/@rxdryd/git-clone-%EC%98%A4%EB%A5%98">https://velog.io/@rxdryd/git-clone-%EC%98%A4%EB%A5%98</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[sequelize 사용하기]]></title>
            <link>https://velog.io/@flypig-hub/sequelize-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@flypig-hub/sequelize-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 19 Jul 2022 05:35:38 GMT</pubDate>
            <description><![CDATA[<p>npm i sequelize mysql2 -S
npm i sequelize-cli -D
npx sequelize init</p>
<p>sql 연결</p>
<p>npx sequelize db:create</p>
<p>ex)
npx sequelize model:generate --name User --attributes email:string,nickname:string,password:string</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[socket.io연결과 진행순서]]></title>
            <link>https://velog.io/@flypig-hub/socket.io%EC%97%B0%EA%B2%B0%EA%B3%BC-%EC%A7%84%ED%96%89%EC%88%9C%EC%84%9C</link>
            <guid>https://velog.io/@flypig-hub/socket.io%EC%97%B0%EA%B2%B0%EA%B3%BC-%EC%A7%84%ED%96%89%EC%88%9C%EC%84%9C</guid>
            <pubDate>Tue, 19 Jul 2022 05:27:55 GMT</pubDate>
            <description><![CDATA[<p>socket.io 설치 및 버전 맞추기</p>
<p>우분투에서 redirect로 port맞추기 443(?) -&gt; 7000</p>
<p>프론트에서 io(url) 연결 확인</p>
<p>socket.emit
socket.on 연결 확인</p>
<p>db라우터 및 models 생성, 확인</p>
<p>join-room에서 roomName, nickName 확인 후 db저장하기</p>
<p>필요한 socket 기능 만들어놓기</p>
<p>기능별 폴더 정리해서 나누기</p>
<p>전체 기능 확인하기</p>
]]></description>
        </item>
    </channel>
</rss>