<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>히파루스의 솔직한 여행 이야기</title>
    <link>https://hippalus.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 23:53:46 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Hippalus</managingEditor>
    <image>
      <title>히파루스의 솔직한 여행 이야기</title>
      <url>https://t1.daumcdn.net/cfile/tistory/206A0D3B51297A9523</url>
      <link>https://hippalus.tistory.com</link>
    </image>
    <item>
      <title>아이폰 동영상 흐릿하거나 뿌옇게 보이는 증상 해결</title>
      <link>https://hippalus.tistory.com/681</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;iOS 26 업데이트는 참 역대급 헛발질스럽다.&lt;br&gt;이상한 투명 유리 효과를 넣질 않나&lt;br&gt;왜이리 유저를 못살게 구는지 모르겠다.&lt;br&gt;그래서인지 이것 저것 예전 모습을 유지하기 위해 설정을 바꿔 그랬는지 언제 부턴가 동영상이 순간 순간 뿌옇게 흐릿하게 보이는 짜증나는 증상이 지속 되기에 이르렀다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPRAS2/dJMb99TWmtg/33MDa5h8gN9x3QgrrrmoE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPRAS2/dJMb99TWmtg/33MDa5h8gN9x3QgrrrmoE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPRAS2/dJMb99TWmtg/33MDa5h8gN9x3QgrrrmoE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPRAS2%2FdJMb99TWmtg%2F33MDa5h8gN9x3QgrrrmoE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;863&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;공통점은 폭력적인 화면이거나 뭔가 극적인 효과였다.&lt;br&gt;검색해보니 개인정보보호를 바꾸네 어쩌네 잘못된 정보들만 넘쳐났다.&lt;br&gt;특히 AI 할루시네이션은 짜증 그 잡채&lt;br&gt;&lt;br&gt;한참 고생히다 결국 알아낸 방법은 다음과 같다.&lt;br&gt;&lt;br&gt;섷정의 손쉬운 사욜&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rOMI9/dJMb99TWmth/T2v5itQvZxxD5J58aViKW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rOMI9/dJMb99TWmth/T2v5itQvZxxD5J58aViKW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rOMI9/dJMb99TWmth/T2v5itQvZxxD5J58aViKW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrOMI9%2FdJMb99TWmth%2FT2v5itQvZxxD5J58aViKW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2556&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;디스플레이 및 텍스트 크기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baIOSM/dJMcabYyoYc/FUci6LVxKcOdoo33kGFNL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baIOSM/dJMcabYyoYc/FUci6LVxKcOdoo33kGFNL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baIOSM/dJMcabYyoYc/FUci6LVxKcOdoo33kGFNL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaIOSM%2FdJMcabYyoYc%2FFUci6LVxKcOdoo33kGFNL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2556&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;쭉 내려보면 플래시 효과&amp;nbsp;&amp;nbsp;흐리게 처리 &lt;br&gt;이걸 꺼줘야 한다 ㅡㅡ&lt;br&gt;아우 개짜증난다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzq0EJ/dJMcabYyoYd/0JcGQhYsfMCKMjwfkNZYc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzq0EJ/dJMcabYyoYd/0JcGQhYsfMCKMjwfkNZYc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzq0EJ/dJMcabYyoYd/0JcGQhYsfMCKMjwfkNZYc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdzq0EJ%2FdJMcabYyoYd%2F0JcGQhYsfMCKMjwfkNZYc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2556&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이걸 내가 켰는지 애플것들이 자동으로 켜서 이지경이 됐는지 모르겠다.&lt;/p&gt;</description>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/681</guid>
      <comments>https://hippalus.tistory.com/681#entry681comment</comments>
      <pubDate>Sat, 16 May 2026 20:57:49 +0900</pubDate>
    </item>
    <item>
      <title>국산 무료 ERD 툴 추천, DB 설계를 더 빠르고 편하게 만드는 깔끔한 DB설계툴</title>
      <link>https://hippalus.tistory.com/680</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DB&amp;nbsp;설계를&amp;nbsp;하다&amp;nbsp;보면&amp;nbsp;툴이&amp;nbsp;은근히&amp;nbsp;작업&amp;nbsp;흐름에&amp;nbsp;큰&amp;nbsp;영향을&amp;nbsp;준다. &lt;br /&gt;기능은&amp;nbsp;많은데&amp;nbsp;막상&amp;nbsp;써보면&amp;nbsp;불편하거나,&amp;nbsp;협업이&amp;nbsp;잘&amp;nbsp;안&amp;nbsp;되거나,&amp;nbsp;출력이&amp;nbsp;엉망인&amp;nbsp;경우도&amp;nbsp;많다.&lt;br /&gt;ERDCloud, dbdiagram.io, Draw.io 유료 무료 할 것 없이 상당히 불편하다.&lt;br /&gt;그렇다고 엑셀로 ERD를 관리하다보면 새로운 필드가 하나 추가하면 모든 줄이 아래로 밀려 여간 불편한게 이만 저만이 아니다.&lt;br /&gt;&lt;br /&gt;Taker란 웹협업 ERD 툴은 데이터베이스 설계도 ERD가 전체적으로 실무에서 쓰기 괜찮은 구성이다. &lt;br /&gt;특히 협업이나 출력 같은 부분에서 신경을 많이 썼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://erd.tak.kr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://erd.tak.kr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIbZtn/dJMcaaZs1xT/Qeis9qyqXcmP5AoROeVN5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIbZtn/dJMcaaZs1xT/Qeis9qyqXcmP5AoROeVN5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIbZtn/dJMcaaZs1xT/Qeis9qyqXcmP5AoROeVN5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIbZtn%2FdJMcaaZs1xT%2FQeis9qyqXcmP5AoROeVN5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;369&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ERD툴 Taker는 어떤 도구인가&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;별도&amp;nbsp;설치&amp;nbsp;없이&amp;nbsp;브라우저에서&amp;nbsp;바로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;웹&amp;nbsp;기반&amp;nbsp;ERD&amp;nbsp;툴이다. &lt;br /&gt;단순히&amp;nbsp;테이블&amp;nbsp;구조를&amp;nbsp;그리는&amp;nbsp;수준이&amp;nbsp;아니라,&amp;nbsp;설계부터&amp;nbsp;협업,&amp;nbsp;관리까지&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;만들어져&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;협업 기능이 꽤 편하다.&lt;/b&gt;&lt;br /&gt;여러&amp;nbsp;명이&amp;nbsp;동시에&amp;nbsp;같은&amp;nbsp;ERD를&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;변경&amp;nbsp;사항이&amp;nbsp;바로&amp;nbsp;반영된다.&lt;br /&gt;(물론 읽기 기능만도 부여할 수 있어 ERD의 훼손을 막을 수 있다.)&lt;br /&gt;&lt;br /&gt;자동 저장이 기본으로 적용되고 버전 관리도 지원해서 이전 상태로 되돌릴 수 있고 ERD 화면 안에서 채팅도 가능하다.&lt;br /&gt;작업하면서 구조를 같이 보며 얘기할 수 있어서, 따로 메신저를 왔다 갔다 할 필요가 없다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;DDL&amp;nbsp;반입과&amp;nbsp;반출&amp;nbsp;지원&lt;/b&gt; &lt;br /&gt;실무에서 자주 쓰는 DB들은 대부분 지원된다. &lt;br /&gt;Oracle, MSSQL, MySQL, PostgreSQL&lt;br /&gt;기존 DB 구조를 불러와서 ERD로 정리할 수도 있고, 설계한&amp;nbsp;내용을&amp;nbsp;그대로&amp;nbsp;DDL로&amp;nbsp;내보내는&amp;nbsp;것도&amp;nbsp;가능하다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;출력 기능이 안정적인 편&lt;/b&gt;&lt;br /&gt;ERD를 문서로 제출해야 할 때 출력이 깔끔하게 나오는지가 중요한데, 이 부분이 생각보다 잘 되어 있다.&lt;br /&gt;출력 미리보기를 통해 레이아웃을 확인할 수 있고, A4&amp;nbsp;기준으로&amp;nbsp;잘리지&amp;nbsp;않도록&amp;nbsp;배치를&amp;nbsp;조정할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;기존에 출력 때문에 따로 이미지로 캡처해서 정리하던 번거로움이 줄어든다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;관계 설정이 단순하다.&lt;/b&gt;&lt;br /&gt;FK 설정도 복잡하지 않다. &lt;br /&gt;필드를 드래그해서 연결하면 바로 관계가 만들어진다.&lt;br /&gt;별도로&amp;nbsp;여러&amp;nbsp;단계를&amp;nbsp;거치지&amp;nbsp;않아도&amp;nbsp;되기&amp;nbsp;때문에, &lt;br /&gt;전체&amp;nbsp;구조를&amp;nbsp;잡는&amp;nbsp;속도가&amp;nbsp;빠른&amp;nbsp;편이다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;국내 환경에 맞는 기능&lt;/b&gt;&lt;br /&gt;논리명과 물리명을 함께 관리할 수 있고, 테이블명이나&amp;nbsp;필드명을&amp;nbsp;기준으로&amp;nbsp;검색도&amp;nbsp;가능하다. &lt;br /&gt;국내 프로젝트에서 자주 쓰는 방식이라 따로 적응할 필요 없이 사용할 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;미니맵과&amp;nbsp;검색&amp;nbsp;기능&lt;/b&gt; &lt;br /&gt;테이블이 많아지면 구조 파악이 어려워지는데, 미니맵으로&amp;nbsp;전체&amp;nbsp;구성을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;선택한 테이블 위치도 표시되기 때문에 현재&amp;nbsp;보고&amp;nbsp;있는&amp;nbsp;영역을&amp;nbsp;놓치지&amp;nbsp;않는다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;단축키 지원&lt;/b&gt;&lt;br /&gt;무료 ERD taker에선 테이블 추가나 필드 편집 같은 반복 작업을 단축키로&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있어서&amp;nbsp;작업&amp;nbsp;속도가&amp;nbsp;올라간다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;무료로 시작 가능&lt;/b&gt;&lt;br /&gt;기본적으로&amp;nbsp;50개&amp;nbsp;테이블까지&amp;nbsp;무료로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;개인 프로젝트나 상용 서비스 설계에는 충분한 수준이다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;사용하면서 느낀 점&lt;/b&gt;&lt;br /&gt;전체적으로&amp;nbsp;과하게&amp;nbsp;복잡하지&amp;nbsp;않으면서&amp;nbsp;필요한&amp;nbsp;기능은&amp;nbsp;다&amp;nbsp;들어가&amp;nbsp;있는&amp;nbsp;느낌이다. &lt;br /&gt;&lt;br /&gt;협업이 자연스럽고, 출력이 안정적이고, 사용 방식이 직관적이다.&lt;br /&gt;기존&amp;nbsp;ERD&amp;nbsp;툴이&amp;nbsp;불편하게&amp;nbsp;느껴졌다면&amp;nbsp;한&amp;nbsp;번&amp;nbsp;써볼&amp;nbsp;만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용방법&lt;/b&gt;&lt;br /&gt;회원가입 후 내 ERD 프로젝트로 이동한 후 프로젝트 생성버튼을 누르면 프로젝트 명과 함께 DB유형을 선택 후 생성만 해주면 끝이다.&lt;br /&gt;DB유형은 필드 추가시 필드 유형을 자동완성해주는데 이때 활용되며, DB 유형을 잘못 생성했다면 프로젝트 내부에서도 바꿀 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P9fDJ/dJMcab49p9X/d1xrRmWUytlx4m4872jk01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P9fDJ/dJMcab49p9X/d1xrRmWUytlx4m4872jk01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P9fDJ/dJMcab49p9X/d1xrRmWUytlx4m4872jk01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP9fDJ%2FdJMcab49p9X%2Fd1xrRmWUytlx4m4872jk01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;432&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입시 프로젝트를 최대 2개까지, 테이블은 50개 그리고 협업 대상자는 최대 6명까지 함께 가능하며, 이때 편집 권한은 3명까지 가능한데.. 보통 한 팀에 DB관리하는 사람이 그리 많진 않으니 이정도면 충분하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;생성 후 프로젝트 내부로 들어가면 Figma와 유사하다.&lt;br /&gt;빈 캔버스가 나오고 좌측상단엔 미니맵과 하단엔 채팅창 우측 상단엔 협업자들을 관리하는 편집 권한 관리와 그리고 각종 메뉴로 되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtdGyc/dJMcaiDb9nW/feYj47iQJugioijHGIRKvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtdGyc/dJMcaiDb9nW/feYj47iQJugioijHGIRKvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtdGyc/dJMcaiDb9nW/feYj47iQJugioijHGIRKvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtdGyc%2FdJMcaiDb9nW%2FfeYj47iQJugioijHGIRKvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1271&quot; height=&quot;890&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블을 추가하려면 마우스 오른쪽 버튼을 눌러 테이블 추가를 선택하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;233&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4jkC/dJMcacpsYSG/n4JwNACimyqWhr0Ky0jNDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4jkC/dJMcacpsYSG/n4JwNACimyqWhr0Ky0jNDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4jkC/dJMcacpsYSG/n4JwNACimyqWhr0Ky0jNDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4jkC%2FdJMcacpsYSG%2Fn4JwNACimyqWhr0Ky0jNDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;233&quot; height=&quot;285&quot; data-origin-width=&quot;233&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요렇게 새 테이블이 추가된다.&lt;br /&gt;논리명과 물리명을 입력하고 저장하면 끝&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPyxT9/dJMcabRBVyp/KPM3eYOEkPYpxOqM3KfdLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPyxT9/dJMcabRBVyp/KPM3eYOEkPYpxOqM3KfdLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPyxT9/dJMcabRBVyp/KPM3eYOEkPYpxOqM3KfdLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPyxT9%2FdJMcabRBVyp%2FKPM3eYOEkPYpxOqM3KfdLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;421&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필드추가는 필드영역에서 마찬가지로 마우스 오른쪽 버튼을 눌러서 필드 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVfFIy/dJMcaiDb9qy/fX6EqQiyKkKBbpcQ58fky0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVfFIy/dJMcaiDb9qy/fX6EqQiyKkKBbpcQ58fky0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVfFIy/dJMcaiDb9qy/fX6EqQiyKkKBbpcQ58fky0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVfFIy%2FdJMcaiDb9qy%2FfX6EqQiyKkKBbpcQ58fky0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;920&quot; height=&quot;419&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzjXp3/dJMcadWam7N/BXcj5zmduPojcsOnAB8oL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzjXp3/dJMcadWam7N/BXcj5zmduPojcsOnAB8oL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzjXp3/dJMcadWam7N/BXcj5zmduPojcsOnAB8oL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzjXp3%2FdJMcadWam7N%2FBXcj5zmduPojcsOnAB8oL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;174&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매우 직관적이다.&lt;br /&gt;&lt;br /&gt;테이블간의 FK 연결도 그냥 부모 필드 선택한 상태에서 드래그 드롭하면 연결선과 함께 관계 필드가 복사된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTMUgp/dJMcab49qdL/mVNRM6Wji3RbVRJX2lBosK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTMUgp/dJMcab49qdL/mVNRM6Wji3RbVRJX2lBosK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTMUgp/dJMcab49qdL/mVNRM6Wji3RbVRJX2lBosK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTMUgp%2FdJMcab49qdL%2FmVNRM6Wji3RbVRJX2lBosK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;611&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색도 직관적&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbLW9Y/dJMb990BzEL/Mkeg7vhl3Fr5dbqAzYwjY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbLW9Y/dJMb990BzEL/Mkeg7vhl3Fr5dbqAzYwjY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbLW9Y/dJMb990BzEL/Mkeg7vhl3Fr5dbqAzYwjY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbLW9Y%2FdJMb990BzEL%2FMkeg7vhl3Fr5dbqAzYwjY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1191&quot; height=&quot;610&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머진 메뉴 눌러서 확인해보면 단축키와 함께 제공되는 기능(DDL, 이용방법, 필드명 말줄임 on, off, 테이블안의 필드들 보이기 숨기기 토글 등등)들이 모두 설명 되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdh5Me/dJMcaiwpWLU/zKjp9ZZQZYNBG7IcqUfDk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdh5Me/dJMcaiwpWLU/zKjp9ZZQZYNBG7IcqUfDk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdh5Me/dJMcaiwpWLU/zKjp9ZZQZYNBG7IcqUfDk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdh5Me%2FdJMcaiwpWLU%2FzKjp9ZZQZYNBG7IcqUfDk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1268&quot; height=&quot;750&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://erd.tak.kr&quot;&gt;https://erd.tak.kr&lt;/a&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Database</category>
      <category>DB</category>
      <category>erd</category>
      <category>협업</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/680</guid>
      <comments>https://hippalus.tistory.com/680#entry680comment</comments>
      <pubDate>Tue, 5 May 2026 09:30:32 +0900</pubDate>
    </item>
    <item>
      <title>opencode에서 작업한 jsp, css, js가 안 먹힐 때</title>
      <link>https://hippalus.tistory.com/679</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 class가 변경되면 서버를 재시작해야 하지만 jsp, css, js등은 그냥 새로고침 또는 강력 새로고침을 하면 반영이 된다.&lt;br /&gt;하지만 opencode에서 작업하면 eclipse에서 작업되지 않았기 때문인데 안 그러면 매번 project를 clean해줘야 하므로 매우 불편해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Servers&amp;nbsp;탭&amp;nbsp;&amp;rarr;&amp;nbsp;Tomcat&amp;nbsp;더블클릭&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단의 Automatically publish when resources change 선택된 것 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p1zJf/dJMcaipAyxT/1kDnPuFtsBakKRKyVfYuVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p1zJf/dJMcaipAyxT/1kDnPuFtsBakKRKyVfYuVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p1zJf/dJMcaipAyxT/1kDnPuFtsBakKRKyVfYuVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp1zJf%2FdJMcaipAyxT%2F1kDnPuFtsBakKRKyVfYuVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;265&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정하는 김에 Publishing interval도 1에서 0으로 바꿔줘야 빠른 반영이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boKw00/dJMcac3Wx6A/H0NqkbZkfnstgfr5XCWzSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boKw00/dJMcac3Wx6A/H0NqkbZkfnstgfr5XCWzSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boKw00/dJMcac3Wx6A/H0NqkbZkfnstgfr5XCWzSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboKw00%2FdJMcac3Wx6A%2FH0NqkbZkfnstgfr5XCWzSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;88&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 하단의 server options의 serve modules without publishing이 체크 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIlOLe/dJMcaaryWOC/wlUVRsBptXSd8nbnwhQco0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIlOLe/dJMcaaryWOC/wlUVRsBptXSd8nbnwhQco0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIlOLe/dJMcaaryWOC/wlUVRsBptXSd8nbnwhQco0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIlOLe%2FdJMcaaryWOC%2FwlUVRsBptXSd8nbnwhQco0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;237&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/679</guid>
      <comments>https://hippalus.tistory.com/679#entry679comment</comments>
      <pubDate>Mon, 27 Apr 2026 12:17:05 +0900</pubDate>
    </item>
    <item>
      <title>sourcetree (소스트리)에서 commit 내용으로 찾기</title>
      <link>https://hippalus.tistory.com/678</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소스트리 접속 후 좌측 메뉴에서 Search선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzmET/dJMb99TxmFc/7cAbIxgfdh8NXknU23Djl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzmET/dJMb99TxmFc/7cAbIxgfdh8NXknU23Djl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzmET/dJMb99TxmFc/7cAbIxgfdh8NXknU23Djl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvzmET%2FdJMb99TxmFc%2F7cAbIxgfdh8NXknU23Djl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;238&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중앙 검색창에 커밋시 포함된 내용 키워드로 검색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r0jEr/dJMcahxh9av/6AI32eChG62AWs83Wy3cck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r0jEr/dJMcahxh9av/6AI32eChG62AWs83Wy3cck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r0jEr/dJMcahxh9av/6AI32eChG62AWs83Wy3cck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr0jEr%2FdJMcahxh9av%2F6AI32eChG62AWs83Wy3cck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;134&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이하 확인 가능&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/678</guid>
      <comments>https://hippalus.tistory.com/678#entry678comment</comments>
      <pubDate>Mon, 13 Apr 2026 19:08:00 +0900</pubDate>
    </item>
    <item>
      <title>opencode chatgpt oauth 연결</title>
      <link>https://hippalus.tistory.com/677</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencode설치 후 터미널에서 opencode auth login 입력 후 나타나는 Go to 링크를 클릭(이동 안되면 복사 후 브라우저에서 붙여넣기 후 이동)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tj1Mv/dJMcaflQmkf/E9LmCtc4P4VwXl84jDvuZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tj1Mv/dJMcaflQmkf/E9LmCtc4P4VwXl84jDvuZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tj1Mv/dJMcaflQmkf/E9LmCtc4P4VwXl84jDvuZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTj1Mv%2FdJMcaflQmkf%2FE9LmCtc4P4VwXl84jDvuZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;267&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 화면에서 사용중인 계정 정보 입력 후 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bngZbZ/dJMcafMWaVd/kk5tVHONsy94dWq57gProK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bngZbZ/dJMcafMWaVd/kk5tVHONsy94dWq57gProK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bngZbZ/dJMcafMWaVd/kk5tVHONsy94dWq57gProK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbngZbZ%2FdJMcafMWaVd%2Fkk5tVHONsy94dWq57gProK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;289&quot; height=&quot;380&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 후 계속 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjJNE/dJMcaari5yN/nK1R1xKn7NkAHoaQCFSHNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjJNE/dJMcaari5yN/nK1R1xKn7NkAHoaQCFSHNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjJNE/dJMcaari5yN/nK1R1xKn7NkAHoaQCFSHNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjJNE%2FdJMcaari5yN%2FnK1R1xKn7NkAHoaQCFSHNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;274&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 인증 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxxiKe/dJMb99TrRv2/uK93vctNn50T24QcmBaGU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxxiKe/dJMb99TrRv2/uK93vctNn50T24QcmBaGU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxxiKe/dJMb99TrRv2/uK93vctNn50T24QcmBaGU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxxiKe%2FdJMb99TrRv2%2FuK93vctNn50T24QcmBaGU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;98&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완료 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogeK1/dJMcagrvlR3/lnQ2zhuDgZBaj8KAgmc67K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogeK1/dJMcagrvlR3/lnQ2zhuDgZBaj8KAgmc67K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogeK1/dJMcagrvlR3/lnQ2zhuDgZBaj8KAgmc67K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogeK1%2FdJMcagrvlR3%2FlnQ2zhuDgZBaj8KAgmc67K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;55&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opencode 실행하면 이제 사용 가능&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/677</guid>
      <comments>https://hippalus.tistory.com/677#entry677comment</comments>
      <pubDate>Mon, 6 Apr 2026 12:11:10 +0900</pubDate>
    </item>
    <item>
      <title>sourcetree (소스트리)에서 과거 변경된 이력 확인하는 방법</title>
      <link>https://hippalus.tistory.com/676</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 소스트리 실행 후 파일 상태 메뉴 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X841V/dJMcadg7qmP/t15pZcFqbxaJOyfHpiNvJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X841V/dJMcadg7qmP/t15pZcFqbxaJOyfHpiNvJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X841V/dJMcadg7qmP/t15pZcFqbxaJOyfHpiNvJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX841V%2FdJMcadg7qmP%2Ft15pZcFqbxaJOyfHpiNvJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1111&quot; height=&quot;167&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 중앙에 대기 중인 파일, 파일 상태순 정렬 콤보박스를 전체로 바꿔줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O9bZE/dJMcajhiiLS/rSBkZV0SN0xJq7ClU261B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O9bZE/dJMcajhiiLS/rSBkZV0SN0xJq7ClU261B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O9bZE/dJMcajhiiLS/rSBkZV0SN0xJq7ClU261B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO9bZE%2FdJMcajhiiLS%2FrSBkZV0SN0xJq7ClU261B1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;214&quot; height=&quot;336&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 우측에 검색 박스에서 원하는 파일 명 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BkpEb/dJMcafzf0IO/LTfeXWjzU0aezF5DcM8PiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BkpEb/dJMcafzf0IO/LTfeXWjzU0aezF5DcM8PiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BkpEb/dJMcafzf0IO/LTfeXWjzU0aezF5DcM8PiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBkpEb%2FdJMcafzf0IO%2FLTfeXWjzU0aezF5DcM8PiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;33&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 좌측 스테이지쪽 창에 해당 파일 클릭 / 마우스 우측 눌러 context menu 호출&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEhGSM/dJMcadVGlJi/QxMAX0dwVONZWJ8aKiGhf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEhGSM/dJMcadVGlJi/QxMAX0dwVONZWJ8aKiGhf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEhGSM/dJMcadVGlJi/QxMAX0dwVONZWJ8aKiGhf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEhGSM%2FdJMcadVGlJi%2FQxMAX0dwVONZWJ8aKiGhf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;348&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.선택된 로그 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZHAsY/dJMcagkBafW/afci9itUZvJeKYrADA01h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZHAsY/dJMcagkBafW/afci9itUZvJeKYrADA01h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZHAsY/dJMcagkBafW/afci9itUZvJeKYrADA01h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZHAsY%2FdJMcagkBafW%2Fafci9itUZvJeKYrADA01h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;355&quot; height=&quot;365&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 로그 선택시 상세 내용 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFb7HE/dJMcaivVOds/KWDSFx8LhQbkdzNzzBk68k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFb7HE/dJMcaivVOds/KWDSFx8LhQbkdzNzzBk68k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFb7HE/dJMcaivVOds/KWDSFx8LhQbkdzNzzBk68k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFb7HE%2FdJMcaivVOds%2FKWDSFx8LhQbkdzNzzBk68k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;494&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/676</guid>
      <comments>https://hippalus.tistory.com/676#entry676comment</comments>
      <pubDate>Thu, 26 Mar 2026 19:06:37 +0900</pubDate>
    </item>
    <item>
      <title>망할 크롬 보안 강화  chrome 141 버전 쇼핑몰 전자결제 실패</title>
      <link>https://hippalus.tistory.com/675</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444746; text-align: start;&quot;&gt;크롬의 비교적 최신 버전인 141 부터는 &lt;span style=&quot;background-color: #ffffff; color: #444746; text-align: start;&quot;&gt;결제를 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; iframe 방식의 보안 프로그램이 작동하지 않게 변경되었다.&lt;br /&gt;다른 간편결제 방식들은 상관 없지만 카드번호를 일일이 입력하는 결제 방식은 보안 프로그램이 반드시 필요하기 때문에 현장에선 혼란이 발생하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444746; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444746; text-align: start;&quot;&gt;더 큰 문제는&lt;/span&gt; 2025년 9월 말부터 업데이트가 배포되기 시작했는데 PG사들은 이런 사실 조차 모르고 있는 업체가 존재한다란 점이다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444746; text-align: start;&quot;&gt;발생 조차 모르니 해결방법 조차 모르는게 당연하다. &amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #444746; text-align: start;&quot;&gt;-_-&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그나마 카드사들은 자체적으로 관련 내용을 숙지하여 원격 프로그램등으로 고객의 불편함을 해소시켜 주고는 있는 현실이다.&lt;br /&gt;( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;보다 근본적인&lt;span&gt; &lt;/span&gt;&lt;/span&gt;해결책은 이 망할 Active-X을 걷어차 버려야 한다란 점이다.&lt;br /&gt;Active-X보다 더 불편하게 응용프로그램을 일일이 다운받아 설치하게 만드는 상황이 10년 가깝게 지나도록 아무도 고칠 생각 조차 않하고 있으니 개탄할 노릇이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책은 비교적 간단하다.&lt;br /&gt;아래 주소를 크롬 브라우저의 주소창에 입력 후 엔터를 치면&lt;br /&gt;chrome://flags/#local-network-access-check&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 노랑색 화면이 뜨는데 여기서 우측 Default를 Disabled로 바꿔주고 브라우저를 새로고침하면 끝난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czoKoP/dJMcahQknXh/wtI3WavGnbJ9P5LE61Ebpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czoKoP/dJMcahQknXh/wtI3WavGnbJ9P5LE61Ebpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czoKoP/dJMcahQknXh/wtI3WavGnbJ9P5LE61Ebpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczoKoP%2FdJMcahQknXh%2FwtI3WavGnbJ9P5LE61Ebpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;183&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점유율 1위 브라우저에서 이렇게 보안 강화를 할 때 국내의 뒤떨어진 후진적 마인들의 보안 방식이 얼마나 비합리적이고 시대에 뒤떨어져있는지 여실히 보여주는 사례라 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코리아 남바 원&lt;/p&gt;</description>
      <category>chrome</category>
      <category>PG사</category>
      <category>결제실패</category>
      <category>쇼핑몰결제실패</category>
      <category>업데이트</category>
      <category>크롬</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/675</guid>
      <comments>https://hippalus.tistory.com/675#entry675comment</comments>
      <pubDate>Mon, 17 Nov 2025 07:56:09 +0900</pubDate>
    </item>
    <item>
      <title>시놀로지 NAS 장비에 어울리는 UPS를 설치해보자 - 초보자용</title>
      <link>https://hippalus.tistory.com/674</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;NAS장비를 운영하다 갑작스러운 정전 사태가 발생하면 작업하던 데이터는 물론 NAS장치 자체에 심각한 오류가 발생하여 소중한 데이터를 날려버릴 수 있다.&lt;br /&gt;특히나 건물이 노후한 회사에서 나스장비를 운영하다보면 여간 불안한게 아닐 수 없다.&lt;br /&gt;&lt;br /&gt;나는 시놀로지(Sunology) NAS 장비를 사용중이고 이에 맞는 UPS장비를 고르다보니 이런 저런 후기들을 살펴 본 결과&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EATON&amp;nbsp;Ellipse&amp;nbsp;ECO&amp;nbsp;650&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;USB&lt;/span&gt;&lt;/b&gt;&amp;nbsp;DIN,&amp;nbsp;무정전전원공급장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이녀석을 구매하게 되었다.&lt;br /&gt;대략 3년 정도 권장 사용 후 교체하라는데 때에 맞춰 교체도 해줘야겠다.&lt;br /&gt;&lt;br /&gt;반드시 구매할 때 USB 모델을 구매해야 하는데, 왜냐면 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;USB로 UPS와 NAS장비를 연결하여 관리&lt;/b&gt;&lt;/span&gt;하여야 하기 때문이다.&lt;br /&gt;(또한 EATON Ellipse ECO 650 USB DIN 요녀석이 시놀로지 NAS에서도 잘 맞는다란 후기를 봤기 때문)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;글을 쓰고 있는 25년 11월 현 시점에서 해당 UPS가 가장 저렴한곳 링크는 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://smartstore.naver.com/hesps/products/7982341313&quot;&gt;https://smartstore.naver.com/hesps/products/7982341313&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762992858504&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;EATON Ellipse ECO 650 USB DIN, 무정전전원공급장치 : 히즈파워시스템&quot; data-og-description=&quot;[히즈파워시스템] 무정전전원공급장치UPS 전문업체_히즈파워시스템입니다.&quot; data-og-host=&quot;smartstore.naver.com&quot; data-og-source-url=&quot;https://smartstore.naver.com/hesps/products/7982341313&quot; data-og-url=&quot;https://smartstore.naver.com/hesps/products/7982341313&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hnSo4/hyZNqdXgut/u8sZbqUThOx5Kw5rMmKnTK/img.jpg?width=1000&amp;amp;height=999&amp;amp;face=0_0_1000_999,https://scrap.kakaocdn.net/dn/en1R9B/hyZNMml0Vl/Za30i6vmk81dHvmhFIrIo1/img.jpg?width=1000&amp;amp;height=999&amp;amp;face=0_0_1000_999,https://scrap.kakaocdn.net/dn/JEOMw/hyZNvTVqTe/aPFpsIKcBXgOssWnDa6hY0/img.jpg?width=510&amp;amp;height=509&amp;amp;face=0_0_510_509&quot;&gt;&lt;a href=&quot;https://smartstore.naver.com/hesps/products/7982341313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://smartstore.naver.com/hesps/products/7982341313&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hnSo4/hyZNqdXgut/u8sZbqUThOx5Kw5rMmKnTK/img.jpg?width=1000&amp;amp;height=999&amp;amp;face=0_0_1000_999,https://scrap.kakaocdn.net/dn/en1R9B/hyZNMml0Vl/Za30i6vmk81dHvmhFIrIo1/img.jpg?width=1000&amp;amp;height=999&amp;amp;face=0_0_1000_999,https://scrap.kakaocdn.net/dn/JEOMw/hyZNvTVqTe/aPFpsIKcBXgOssWnDa6hY0/img.jpg?width=510&amp;amp;height=509&amp;amp;face=0_0_510_509');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;EATON Ellipse ECO 650 USB DIN, 무정전전원공급장치 : 히즈파워시스템&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[히즈파워시스템] 무정전전원공급장치UPS 전문업체_히즈파워시스템입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;smartstore.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;내돈내산&lt;/b&gt;&lt;/span&gt;이므로 업체에게서 돈 1원 받은바 없다.&lt;br /&gt;그냥 가격비교하고 저렴한데 설명까지 잘해주시고 친절해서 구매했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;요 장비는 정전시 대략 30분 정도 버티는 것 같다.&lt;br /&gt;물론 연결하는 장치가 많을수록 배터리는 빨리 방전된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음은 장치에 대한 짤막한 내용이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251113_090730124.jpg&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;2577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9oD0t/dJMcahJwXpX/CQR3LMaY9kGJ84NdlP4dJ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9oD0t/dJMcahJwXpX/CQR3LMaY9kGJ84NdlP4dJ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9oD0t/dJMcahJwXpX/CQR3LMaY9kGJ84NdlP4dJ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9oD0t%2FdJMcahJwXpX%2FCQR3LMaY9kGJ84NdlP4dJ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;963&quot; data-filename=&quot;KakaoTalk_20251113_090730124.jpg&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;2577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포장이 매우 꼼꼼하게 비닐로 래핑되어 배송되었고 잘 몰랐는데 FR을 사야 하나보다.&lt;br /&gt;다행히 주문한게 FR이 아닌 DIN이다. 뭐 다른 모델을 사더라도 전원선을 바꾸면 될 일이니..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251113_090730124_01.jpg&quot; data-origin-width=&quot;2838&quot; data-origin-height=&quot;3010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A81gd/dJMcafdSmsI/dwmCSPTUOVpROUoXTWa93K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A81gd/dJMcafdSmsI/dwmCSPTUOVpROUoXTWa93K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A81gd/dJMcafdSmsI/dwmCSPTUOVpROUoXTWa93K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA81gd%2FdJMcafdSmsI%2FdwmCSPTUOVpROUoXTWa93K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;509&quot; data-filename=&quot;KakaoTalk_20251113_090730124_01.jpg&quot; data-origin-width=&quot;2838&quot; data-origin-height=&quot;3010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개봉해보면 저런 매뉴얼이 나오는데 뭐 대충 USB랑 연결하고 어쩌고 전원 켜면 삐 소리 난다 그런이야기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음부터 실제 설치 방법이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 문제가 과연 NAS를 UPS가 켜진 상태에서 꽂아야 하는가?&lt;br /&gt;어디 블로그를 보니 정전시 모뎀선도 같이 UPS에 연결하지 않으면 NAS에 악영향이 가네 어쩌네 하던데&lt;br /&gt;전기기술자인 지인에게 물어본 결과 모뎀선도 UPS 연결해야 NAS에 악영향이 간다란 말은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;멍멍이소리&lt;/b&gt;&lt;/span&gt;라 한다.&lt;br /&gt;(모뎀이고 허브고 나발이고 필요 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 내가 &lt;b&gt;작업한 순서&lt;/b&gt;는 다음과 같다.&lt;br /&gt;1. NAS 관리툴에서 전원 종료&lt;br /&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;UPS 전원 OFF 확인&lt;/b&gt;&lt;/span&gt;(처음 배송될 당시에 OFF임 당연히)&lt;br /&gt;3. NAS 전원 케이블을 UPS Master소켓에 연결&lt;br /&gt;4. USB를 UPS와 NAS에 연결&lt;br /&gt;5. UPS 전원 ON&lt;br /&gt;6. NAS &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;전원 ON&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251113_090730124_02.jpg&quot; data-origin-width=&quot;3282&quot; data-origin-height=&quot;2335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nH5ID/dJMcafrpik1/3CwGfPl3OPOgD3K9Vknw4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nH5ID/dJMcafrpik1/3CwGfPl3OPOgD3K9Vknw4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nH5ID/dJMcafrpik1/3CwGfPl3OPOgD3K9Vknw4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnH5ID%2FdJMcafrpik1%2F3CwGfPl3OPOgD3K9Vknw4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;341&quot; data-filename=&quot;KakaoTalk_20251113_090730124_02.jpg&quot; data-origin-width=&quot;3282&quot; data-origin-height=&quot;2335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 시놀로지 NAS 장비&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251113_090730124_03.jpg&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;2575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rb2eu/dJMcahJwXpW/9iYkpUD4Ut6neazKMILfj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rb2eu/dJMcahJwXpW/9iYkpUD4Ut6neazKMILfj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rb2eu/dJMcahJwXpW/9iYkpUD4Ut6neazKMILfj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frb2eu%2FdJMcahJwXpW%2F9iYkpUD4Ut6neazKMILfj0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;962&quot; data-filename=&quot;KakaoTalk_20251113_090730124_03.jpg&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;2575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 UPS 전원 소켓(Master와 EcoControl 중 Master에 연결한 모습)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251113_090730124_04.jpg&quot; data-origin-width=&quot;2017&quot; data-origin-height=&quot;1444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpqUU3/dJMcafrpik0/2AKnikNdDR2kTDkbWyhfk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpqUU3/dJMcafrpik0/2AKnikNdDR2kTDkbWyhfk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpqUU3/dJMcafrpik0/2AKnikNdDR2kTDkbWyhfk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpqUU3%2FdJMcafrpik0%2F2AKnikNdDR2kTDkbWyhfk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;344&quot; data-filename=&quot;KakaoTalk_20251113_090730124_04.jpg&quot; data-origin-width=&quot;2017&quot; data-origin-height=&quot;1444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 UPS의 USB 포트에서 NAS의 USB포트로 연결한 모습&lt;br /&gt;좌측 x표시한 곳이 아닌 우측 화살표 부분이 USB 포트되겠다.&lt;br /&gt;NAS 앞쪽에도 USB 포트가 있던데 거기도 가능할 듯 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;106&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfn8nH/dJMcaawR2jK/8cIdtT1Brv3N4wMoOog73K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfn8nH/dJMcaawR2jK/8cIdtT1Brv3N4wMoOog73K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfn8nH/dJMcaawR2jK/8cIdtT1Brv3N4wMoOog73K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfn8nH%2FdJMcaawR2jK%2F8cIdtT1Brv3N4wMoOog73K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;106&quot; height=&quot;109&quot; data-origin-width=&quot;106&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 UPS를 어떻게 활용할지에 대한 설정이다.&lt;br /&gt;시놀로지 NAS 장비 관리 웹페이지에서 제어판 &amp;gt; 하드웨어 및 전원으로 이동 후 상단 일반, 전원예약, HDD 대기기능, UPS가 보일것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZKzWM/dJMcahpedDO/W93Nwa6ocs5tc2p2roy6kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZKzWM/dJMcahpedDO/W93Nwa6ocs5tc2p2roy6kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZKzWM/dJMcahpedDO/W93Nwa6ocs5tc2p2roy6kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZKzWM%2FdJMcahpedDO%2FW93Nwa6ocs5tc2p2roy6kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;820&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 UPS 지원 활성화를 체크하고 나오는 옵션들 중에서 대충 선택해주면 된다.&lt;br /&gt;난 그냥 배터리 부족할 때까지(사이고마데!)를 설정해주었다.&lt;br /&gt;추가로 시스템이 대기 모드로 전환될 때 UPS 종료에도 체크를 해주었다.&lt;br /&gt;&lt;br /&gt;장치 정보를 눌러보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccqYdI/dJMcaaRaMLy/m8tsdqUQKEusjKwGzu3iRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccqYdI/dJMcaaRaMLy/m8tsdqUQKEusjKwGzu3iRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccqYdI/dJMcaaRaMLy/m8tsdqUQKEusjKwGzu3iRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccqYdI%2FdJMcaaRaMLy%2Fm8tsdqUQKEusjKwGzu3iRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;498&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요롷게 EATON 장비가 잘 연결된 것도 확인되고 배터리 상태도 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 쉽다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;끝으로 딴소리&lt;br /&gt;얼마 전 발생한 정부전산센터 화재 당시에 발화의 원인이 바로 이런 UPS 장비인데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;전원이 차단되지 않은 상태에서 케이블을 해체하다 쇼트가 발생된 것이라 카더라&lt;br /&gt;&lt;a href=&quot;https://www.thelec.kr/news/articleView.html?idxno=41521&quot;&gt;https://www.thelec.kr/news/articleView.html?idxno=41521&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762993844343&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;UPS 배터리 교체중 화재 발생, 국정자원 전산망 마비 - 전자부품 전문 미디어 디일렉&quot; data-og-description=&quot;대전 유성구 국가정보자원관리원(이하 국정자원) 전산실에서 무정전전원장치(UPS)용 리튬이온 배터리 화재가 발생해 정부 전산 서비스가 마비됐다. 배터리 제조사는 LG에너지솔루션으로 확인됐&quot; data-og-host=&quot;www.thelec.kr&quot; data-og-source-url=&quot;https://www.thelec.kr/news/articleView.html?idxno=41521&quot; data-og-url=&quot;http://www.thelec.kr/news/articleView.html?idxno=41521&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RAo0X/hyZMBNvs9r/RjgJh0dKZKTjvIL0VtQN2K/img.jpg?width=300&amp;amp;height=145&amp;amp;face=0_0_300_145,https://scrap.kakaocdn.net/dn/bQehEH/hyZNjeOcgR/lElMuuXM7K6KAGX0onaEm1/img.jpg?width=500&amp;amp;height=633&amp;amp;face=0_0_500_633&quot;&gt;&lt;a href=&quot;https://www.thelec.kr/news/articleView.html?idxno=41521&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.thelec.kr/news/articleView.html?idxno=41521&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RAo0X/hyZMBNvs9r/RjgJh0dKZKTjvIL0VtQN2K/img.jpg?width=300&amp;amp;height=145&amp;amp;face=0_0_300_145,https://scrap.kakaocdn.net/dn/bQehEH/hyZNjeOcgR/lElMuuXM7K6KAGX0onaEm1/img.jpg?width=500&amp;amp;height=633&amp;amp;face=0_0_500_633');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;UPS 배터리 교체중 화재 발생, 국정자원 전산망 마비 - 전자부품 전문 미디어 디일렉&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;대전 유성구 국가정보자원관리원(이하 국정자원) 전산실에서 무정전전원장치(UPS)용 리튬이온 배터리 화재가 발생해 정부 전산 서비스가 마비됐다. 배터리 제조사는 LG에너지솔루션으로 확인됐&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.thelec.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이만 끝낸다.&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>NAS</category>
      <category>ups</category>
      <category>무서워</category>
      <category>전원공급</category>
      <category>초보야</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/674</guid>
      <comments>https://hippalus.tistory.com/674#entry674comment</comments>
      <pubDate>Thu, 13 Nov 2025 12:31:31 +0900</pubDate>
    </item>
    <item>
      <title>건대 맛집 탐라육해 건대본점 -  신선함과 가성비 모두를 만족시키는 맛집</title>
      <link>https://hippalus.tistory.com/673</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;건대입구 인근은 다양한 음식점이 밀집한 곳으로, 언제나 새로운 맛집을 찾는 이들의 발걸음이 끊이지 않는 지역입니다.&lt;br /&gt;이 가운데 최근 많은 사람들의 주목을 받고 있는 곳이 바로 탐라육해 건대본점입니다. &lt;br /&gt;이름에서도 알 수 있듯 육류와 해산물을 동시에 즐길 수 있는 독창적인 콘셉트를 가진 곳으로, 특히 가격 대비 만족도가 높아 모임 장소로 각광받고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1000015332.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZi0kr/btsQGkg64n7/aiBj5lP93yyE7W1bVXbN3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZi0kr/btsQGkg64n7/aiBj5lP93yyE7W1bVXbN3K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZi0kr/btsQGkg64n7/aiBj5lP93yyE7W1bVXbN3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZi0kr%2FbtsQGkg64n7%2FaiBj5lP93yyE7W1bVXbN3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;480&quot; data-filename=&quot;1000015332.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;모든 메뉴가 만 원 이하, 부담 없는 가격에 다양한 선택&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;탐라육해 건대본점의 가장 큰 장점은 가격대입니다.&lt;br /&gt;대부분의 메뉴가 만 원 이하로 책정되어 있어, 한두 가지에 만족하기보다 다양한 메뉴를 주문해 나눠 먹을 수 있다는 점이 매력적입니다.&lt;br /&gt;요즘 외식 물가를 고려하면, 한 메뉴당 1만 원 이하의 가격으로 신선한 해산물과 육류를 즐길 수 있는 곳은 흔치 않습니다. &lt;br /&gt;&lt;br /&gt;한 번 방문하면 육회, 광어, 연어, 돔베오합 등 여러 가지 음식을 한 자리에서 주문해도 부담이 적어, &amp;lsquo;여러 가지를 맛보고 싶은 사람들&amp;rsquo;에게 특히 적합합니다.&lt;br /&gt;모임 자리에서 메뉴 선택으로 고민하는 경우가 많지만, 이곳은 합리적인 가격 덕분에 취향대로 고르고 나눠 먹는 재미가 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1000013942.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9yLz6/btsQH7OfgXa/LmDlkKlft0owgra2Z2FPOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9yLz6/btsQH7OfgXa/LmDlkKlft0owgra2Z2FPOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9yLz6/btsQH7OfgXa/LmDlkKlft0owgra2Z2FPOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9yLz6%2FbtsQH7OfgXa%2FLmDlkKlft0owgra2Z2FPOK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;360&quot; data-filename=&quot;1000013942.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;육류와 해산물이 어우러진 독창적인 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐라육해라는 이름처럼 이곳은 제주도의 맛을 서울 도심에서 즐길 수 있게 꾸려진 것이 특징입니다.&lt;br /&gt;단순히 고기집이나 횟집이 아닌, 두 가지 카테고리를 조화롭게 섞어낸 메뉴 구성이 손님들의 만족도를 높이고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1000013854.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3sCId/btsQIIgpQnm/1FWzUqNYB6WyZQIktMuYqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3sCId/btsQIIgpQnm/1FWzUqNYB6WyZQIktMuYqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3sCId/btsQIIgpQnm/1FWzUqNYB6WyZQIktMuYqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3sCId%2FbtsQIIgpQnm%2F1FWzUqNYB6WyZQIktMuYqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;360&quot; data-filename=&quot;1000013854.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;육회 메뉴&lt;/b&gt;&lt;br /&gt;전통적인 고추장 육회는 단짠단짠의 정석으로, 오랜 시간 사랑받아온 메뉴입니다.&lt;br /&gt;여기에 눈꽃치즈 육회라는 색다른 메뉴가 더해져, 고소하고 부드러운 치즈 풍미가 육회와 절묘하게 어울립니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1000014191.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jy2Xv/btsQGtLBrqs/pMfzltntZKHT73phAqZ8K1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jy2Xv/btsQGtLBrqs/pMfzltntZKHT73phAqZ8K1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jy2Xv/btsQGtLBrqs/pMfzltntZKHT73phAqZ8K1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJy2Xv%2FbtsQGtLBrqs%2FpMfzltntZKHT73phAqZ8K1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;640&quot; data-filename=&quot;1000014191.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;해산물 메뉴&lt;/b&gt;&lt;br /&gt;광어, 연어, 돔베오합은 제주 분위기를 그대로 옮겨온 듯한 구성입니다.&lt;br /&gt;특히 돔베오합은 신선한 재료를 푸짐하게 담아내 제주 특유의 분위기를 살렸습니다.&lt;br /&gt;활전복, 한치 사시미, 키조개 관자 등 흔히 접하기 어려운 고급 해산물도 합리적인 가격으로 제공된다는 점에서 인상적입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1000015196.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMKQgv/btsQI0VrkOn/N8RhD4cvEmiVQTX5F9k3bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMKQgv/btsQI0VrkOn/N8RhD4cvEmiVQTX5F9k3bk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMKQgv/btsQI0VrkOn/N8RhD4cvEmiVQTX5F9k3bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMKQgv%2FbtsQI0VrkOn%2FN8RhD4cvEmiVQTX5F9k3bk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;480&quot; data-filename=&quot;1000015196.jpg&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;참치&lt;/b&gt;&lt;br /&gt;많은 사람이 &amp;lsquo;고가의 메뉴&amp;rsquo;로 인식하는 참치도 단돈 8,000원이라는 놀라운 가격에 제공됩니다.&lt;br /&gt;고급 식재료를 부담 없는 가격에 맛볼 수 있다는 점은 탐라육해만의 차별화된 강점이라 할 수 있습니다. &lt;br /&gt;&lt;br /&gt;이렇듯&amp;nbsp;육류와&amp;nbsp;해산물이&amp;nbsp;균형&amp;nbsp;있게&amp;nbsp;갖춰져&amp;nbsp;있어,&amp;nbsp;고기와&amp;nbsp;회&amp;nbsp;중&amp;nbsp;어느&amp;nbsp;하나를&amp;nbsp;고르기&amp;nbsp;어려운&amp;nbsp;경우에도&amp;nbsp;모두&amp;nbsp;만족할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;손님이&amp;nbsp;많아도&amp;nbsp;신선함을&amp;nbsp;유지하는&amp;nbsp;비결 &lt;br /&gt;&lt;br /&gt;탐라육해 건대본점은 늘 손님이 많은 편입니다.&lt;br /&gt;이 점은 단순히 인기 있는 맛집이라는 사실을 넘어, 음식의 신선도를 유지하는 중요한 이유이기도 합니다.&lt;br /&gt;손님 회전율이 높다 보니 재료가 오래 머물지 않고, 그만큼 신선한 상태에서 바로바로 플레이팅될 수 있습니다. &lt;br /&gt;&lt;br /&gt;또한 이곳의 플레이팅은 깔끔하고 정갈하기에 단순히 저렴한 음식이 아닌, 시각적으로도 만족감을 주는 방식으로 제공되어 모임 자리에서도 좋은 인상을 남깁니다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;건대&amp;nbsp;모임&amp;nbsp;장소로&amp;nbsp;추천하는&amp;nbsp;이유&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;탐라육해 건대본점은 건국대학교 근처라는 이점 덕분에 학생 모임이나 소규모 동아리 모임, 직장인 회식 자리까지 모두 어울립니다. 메뉴 구성이 누구나 즐길 수 있을 만큼 다양하고, 가격대도 부담스럽지 않아 여러 연령대가 함께하는 자리에도 적합합니다. &lt;br /&gt;&lt;br /&gt;특히 모임 장소를 고를 때 중요한 요소 중 하나가 &quot;취향을 모두 만족시킬 수 있느냐&quot;인데, 탐라육해는 육류와 해산물을 동시에 제공하기 때문에 누구 한 명도 아쉬움이 남지 않는 구성을 갖추고 있습니다.&lt;br /&gt;분위기 또한 캐주얼하면서도 깔끔해 친구들과의 약속은 물론, 격식을 차리지 않는 직장 모임에도 적합합니다. &lt;br /&gt;&lt;br /&gt;건대 맛집 탐라육해 건대본점&lt;br /&gt;&lt;br /&gt;서울에서 수많은 맛집이 생겨나고 사라지지만, 탐라육해 건대본점은 &amp;lsquo;합리적인 가격&amp;rsquo;과 &amp;lsquo;신선한 재료&amp;rsquo;, 그리고 &amp;lsquo;다양한 메뉴 구성&amp;rsquo;이라는 세 가지 강점을 동시에 잡아낸 곳입니다.&lt;br /&gt;단순히 저렴한 가격만 내세우는 곳과 달리, 음식의 질과 플레이팅까지 신경 쓰며 손님들에게 꾸준히 좋은 평가를 받고 있습니다.&lt;br /&gt;비교적 새로 오픈한 건대 맛집이지만 네이버 플레이스 방문자 리뷰가 벌써 879건 블로그 리뷰가 30건이나 노출되고 있습니다.&lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;요즘처럼&amp;nbsp;모임&amp;nbsp;장소&amp;nbsp;선택이&amp;nbsp;까다로운&amp;nbsp;시대에,&amp;nbsp;누구나&amp;nbsp;만족할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;메뉴와&amp;nbsp;가격대를&amp;nbsp;갖춘&amp;nbsp;곳은&amp;nbsp;드물기&amp;nbsp;때문에&amp;nbsp;앞으로도&amp;nbsp;꾸준히&amp;nbsp;인기를&amp;nbsp;이어갈&amp;nbsp;것으로&amp;nbsp;보입니다. &lt;br /&gt;&lt;br /&gt;탐라육해 건대본점은 건대 맛집을 찾는 사람들에게 더없이 좋은 선택지입니다.&lt;br /&gt;만 원 이하의 부담 없는 가격으로 신선한 육류와 해산물을 동시에 즐길 수 있으며, 세련된 플레이팅과 활기찬 분위기로 모임 자리에도 안성맞춤입니다. &lt;br /&gt;&lt;br /&gt;서울&amp;nbsp;도심에서&amp;nbsp;제주도의&amp;nbsp;맛을&amp;nbsp;합리적으로&amp;nbsp;즐기고&amp;nbsp;싶거나,&amp;nbsp;건국대학교&amp;nbsp;인근에서&amp;nbsp;가성비&amp;nbsp;좋은&amp;nbsp;모임&amp;nbsp;장소를&amp;nbsp;찾고&amp;nbsp;있다면,&amp;nbsp;탐라육해&amp;nbsp;건대본점을&amp;nbsp;꼭&amp;nbsp;한&amp;nbsp;번&amp;nbsp;고려해볼&amp;nbsp;만합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소: 서울 광진구 아차산로33길 36 1층 (건대입구역 2번 출구에서 243m)&lt;br /&gt;영업시간:&amp;nbsp;매일&amp;nbsp;16:00&amp;nbsp;~&amp;nbsp;03:00 &lt;br /&gt;전화번호:&amp;nbsp;0507-1430-2017 &lt;br /&gt;홈페이지:&amp;nbsp;&lt;a href=&quot;https://www.tamrayukhae.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.tamrayukhae.com&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://map.naver.com/p/entry/place/2009124719?lng=127.0706674&amp;amp;lat=37.5418374&amp;amp;placePath=/menu?fromPanelNum=1&amp;amp;additionalHeight=76&amp;amp;timestamp=202509201747&amp;amp;locale=ko&amp;amp;svcName=map_pcv5&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://map.naver.com/p/entry/place/2009124719?lng=127.0706674&amp;amp;lat=37.5418374&amp;amp;placePath=/menu?fromPanelNum=1&amp;amp;additionalHeight=76&amp;amp;timestamp=202509201747&amp;amp;locale=ko&amp;amp;svcName=map_pcv5&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1758358918865&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;네이버 지도&quot; data-og-description=&quot;탐라육해 건대본점&quot; data-og-host=&quot;map.naver.com&quot; data-og-source-url=&quot;https://map.naver.com/p/entry/place/2009124719?lng=127.0706674&amp;amp;lat=37.5418374&amp;amp;placePath=/menu?fromPanelNum=1&amp;amp;additionalHeight=76&amp;amp;timestamp=202509201747&amp;amp;locale=ko&amp;amp;svcName=map_pcv5&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&quot; data-og-url=&quot;https://map.naver.com/p/entry/place/2009124719?additionalHeight=76&amp;amp;c=15.00,0,0,0,dh&amp;amp;lat=37.5418374&amp;amp;lng=127.0706674&amp;amp;locale=ko&amp;amp;placePath=/menu?fromPanelNum=1&amp;amp;searchType=place&amp;amp;svcName=map_pcv5&amp;amp;timestamp=202509201747&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/K5VaN/hyZJqrijyr/NfWDCZqIEYTutXMnOcUwbk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/fZP3C/hyZJt2EeBL/tthfTc5mVzGdzKPlJdS6I0/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://map.naver.com/p/entry/place/2009124719?lng=127.0706674&amp;amp;lat=37.5418374&amp;amp;placePath=/menu?fromPanelNum=1&amp;amp;additionalHeight=76&amp;amp;timestamp=202509201747&amp;amp;locale=ko&amp;amp;svcName=map_pcv5&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://map.naver.com/p/entry/place/2009124719?lng=127.0706674&amp;amp;lat=37.5418374&amp;amp;placePath=/menu?fromPanelNum=1&amp;amp;additionalHeight=76&amp;amp;timestamp=202509201747&amp;amp;locale=ko&amp;amp;svcName=map_pcv5&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/K5VaN/hyZJqrijyr/NfWDCZqIEYTutXMnOcUwbk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/fZP3C/hyZJt2EeBL/tthfTc5mVzGdzKPlJdS6I0/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;네이버 지도&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;탐라육해 건대본점&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;map.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버에서 알림받기 하면 랜덤 맛보기 해산물 쿠폰도 증정됩니다~&lt;/p&gt;</description>
      <category>입맛따라 가는 여행</category>
      <category>건대맛집</category>
      <category>건대술집</category>
      <category>탐라육해</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/673</guid>
      <comments>https://hippalus.tistory.com/673#entry673comment</comments>
      <pubDate>Sat, 20 Sep 2025 17:58:43 +0900</pubDate>
    </item>
    <item>
      <title>당근 장애 발생</title>
      <link>https://hippalus.tistory.com/672</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;2025년 7월 14일 오전 6시경부터 당근 마켓 접속시 아래와 같이 오류 화면만 노출 되고 있다.&lt;br&gt;&lt;br&gt;당근이 연일 폭염이 이어지는 바람에 더위 먹었나보다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/49QzX/btsPhGX9G9f/MELZSMj9rEgbzppQgav430/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/49QzX/btsPhGX9G9f/MELZSMj9rEgbzppQgav430/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/49QzX/btsPhGX9G9f/MELZSMj9rEgbzppQgav430/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F49QzX%2FbtsPhGX9G9f%2FMELZSMj9rEgbzppQgav430%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2223&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkT2nW/btsPfX1iQU0/o9mmfwhfTiHmPNXkCQ7oOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkT2nW/btsPfX1iQU0/o9mmfwhfTiHmPNXkCQ7oOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkT2nW/btsPfX1iQU0/o9mmfwhfTiHmPNXkCQ7oOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkT2nW%2FbtsPfX1iQU0%2Fo9mmfwhfTiHmPNXkCQ7oOK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2378&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQ9DN/btsPfJbaogV/h0iGyivUlWF9iOnNdhhC10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQ9DN/btsPfJbaogV/h0iGyivUlWF9iOnNdhhC10/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQ9DN/btsPfJbaogV/h0iGyivUlWF9iOnNdhhC10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQ9DN%2FbtsPfJbaogV%2Fh0iGyivUlWF9iOnNdhhC10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2379&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;</description>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/672</guid>
      <comments>https://hippalus.tistory.com/672#entry672comment</comments>
      <pubDate>Mon, 14 Jul 2025 06:28:36 +0900</pubDate>
    </item>
    <item>
      <title>강북구 수유역 인근 크로플 맛집 크로플숍</title>
      <link>https://hippalus.tistory.com/671</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 어린이날 이자 석가탄신일 되시겠다.&lt;br&gt;불교는 아니지만 분위기를 즐기려 부처님 오신남이면 화계사를 찾기도 한다.&lt;br&gt;올해도 화계사를 들러보았는데 이게 어인일인지 예전에 있던 막걸리, 파전 등을 팔던 노점들이 없었다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKMYhi/btsNKfCs5fg/kxsyH4RnrrKdPYcDL1LKEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKMYhi/btsNKfCs5fg/kxsyH4RnrrKdPYcDL1LKEk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKMYhi/btsNKfCs5fg/kxsyH4RnrrKdPYcDL1LKEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKMYhi%2FbtsNKfCs5fg%2FkxsyH4RnrrKdPYcDL1LKEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1080&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉬운 마음을 뒤로 한채 돈까스 1개씩 쳐묵쳐묵하고 버스타러 수유역 쪽으로 길을 가는데 들릴까 말까한 목소리로 &quot;어린이날 크로플 공짜에요&quot; 라는 소리가 들렸다.&lt;br&gt;헛게 들리나.. 밥도 먹고 왔는데...&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdJ2dy/btsNLDbeNIY/FdhkiqIKxSgkqGp6Tw8FnK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdJ2dy/btsNLDbeNIY/FdhkiqIKxSgkqGp6Tw8FnK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdJ2dy/btsNLDbeNIY/FdhkiqIKxSgkqGp6Tw8FnK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdJ2dy%2FbtsNLDbeNIY%2FFdhkiqIKxSgkqGp6Tw8FnK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이와 함께 조그마한 크로플숍에 들어가니 어린이날이라고 이벤트로 무료로 크로플을 나눠주시고 계셨더란 ㄷㄷㄷ&lt;br&gt;그런데 엄마 아빠도 하나씩 자시라고 총 3개나 주셨!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TW1VR/btsNJI6crhJ/LYP8dpO622mUMKskcImZZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TW1VR/btsNJI6crhJ/LYP8dpO622mUMKskcImZZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TW1VR/btsNJI6crhJ/LYP8dpO622mUMKskcImZZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTW1VR%2FbtsNJI6crhJ%2FLYP8dpO622mUMKskcImZZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 왜 내가 괜히 미안해지는거지? -_-&lt;br&gt;커피라도 한 잔 사려 했더니 오늘은 이벤트 때문에 커피 자체를 판매하지도 않으신다하더란&lt;br&gt;미안함을 뒤로 한채 크로플을 한입 물었는데 헐... 이거 뭐지????&lt;br&gt;일본에서 줄서서 먹는 그런 맛이 느껴진다.&lt;br&gt;과하지 않은 바삭함과 코팅된 시럽의 조합&lt;br&gt;&lt;b&gt;놀라움의 연속이다.&lt;/b&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFKIF/btsNKz8u965/13BmUg06y4VgBy7YgMypS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFKIF/btsNKz8u965/13BmUg06y4VgBy7YgMypS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFKIF/btsNKz8u965/13BmUg06y4VgBy7YgMypS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFKIF%2FbtsNKz8u965%2F13BmUg06y4VgBy7YgMypS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1080&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주인분께서 &quot;맛있으면 나중에 오세요~&quot; 라고 친절하게 말씀하시던데&lt;br&gt;맛있어서 나중에 반드시 가야할 집을 이제서야 발견했다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chiJGf/btsNKxpidU8/DP31ZQy0IkHwKYA4qzWMaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chiJGf/btsNKxpidU8/DP31ZQy0IkHwKYA4qzWMaK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chiJGf/btsNKxpidU8/DP31ZQy0IkHwKYA4qzWMaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchiJGf%2FbtsNKxpidU8%2FDP31ZQy0IkHwKYA4qzWMaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1080&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걸어가며 먹다가 이런집은 블로그에 소개시켜야 한다란 생각에 뒤돌아와 실내를 찍어봤다.&lt;br&gt;받아 먹은건 기본형 오리지널이었는데 크로플 아이스크림도 맛있어 보인다.&lt;br&gt;그런데 여름 제외??? 아이스크림이?? 나중에 찾아가면 물어봐야겠단&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJZCh/btsNLnNelxf/Kz3rpxnc7TKexuO6NUkF5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJZCh/btsNLnNelxf/Kz3rpxnc7TKexuO6NUkF5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJZCh/btsNLnNelxf/Kz3rpxnc7TKexuO6NUkF5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJZCh%2FbtsNLnNelxf%2FKz3rpxnc7TKexuO6NUkF5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벽 한켠엔 수많은 포인트 카드들까지 즐비한 걸로 미루어 동네에서도 꽤나 장사가 잘 되는 집인가 보다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L1Vi5/btsNK39gNDH/RkXQegDbrOqoJqjOL9Qiyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L1Vi5/btsNK39gNDH/RkXQegDbrOqoJqjOL9Qiyk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L1Vi5/btsNK39gNDH/RkXQegDbrOqoJqjOL9Qiyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL1Vi5%2FbtsNK39gNDH%2FRkXQegDbrOqoJqjOL9Qiyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1080&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L124G/btsNKi0fzZB/Vqn5uJHNlP3HOpqcC68nnK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L124G/btsNKi0fzZB/Vqn5uJHNlP3HOpqcC68nnK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L124G/btsNKi0fzZB/Vqn5uJHNlP3HOpqcC68nnK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL124G%2FbtsNKi0fzZB%2FVqn5uJHNlP3HOpqcC68nnK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/93Zrk/btsNKb07QDY/MtSs2QQYdcVjB5kxJiXHI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/93Zrk/btsNKb07QDY/MtSs2QQYdcVjB5kxJiXHI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/93Zrk/btsNKb07QDY/MtSs2QQYdcVjB5kxJiXHI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F93Zrk%2FbtsNKb07QDY%2FMtSs2QQYdcVjB5kxJiXHI1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1440&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;가게 입간판쪽 보니 배민1 스티커가 붙어있는걸로 미루어 배민으로도 주문이 가능한가보다.&lt;br&gt;우리 집에선 조금 멀지만 감사한 마음으로 리뷰라도 써야겠다.&amp;nbsp;&lt;br&gt;강북구 맛집 크로플숍 정보는 아래와 같다.&lt;br&gt;&lt;a href=&quot;https://map.naver.com/p/entry/place/1657484259?lng=127.016089&amp;amp;lat=37.6339145&amp;amp;placePath=%2Fhome&amp;amp;entry=plt&amp;amp;searchType=place&amp;amp;c=17.52,0,0,0,dh&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://map.naver.com/p/entry/place/1657484259?lng=127.016089&amp;amp;lat=37.6339145&amp;amp;placePath=%2Fhome&amp;amp;entry=plt&amp;amp;searchType=place&amp;amp;c=17.52,0,0,0,dh&lt;/span&gt;&lt;/a&gt;&lt;br&gt;주소: 서울&amp;nbsp;강북구&amp;nbsp;덕릉로&amp;nbsp;22-2&amp;nbsp;1층&amp;nbsp;왼쪽 &lt;br&gt;우이신설 화계역 2번 출구에서 130m미터 &lt;br&gt;영업시간: 12:00~19:00 (일요일 정기휴무)&lt;br&gt;전화번호: 070-4833-1460&lt;/p&gt;</description>
      <category>입맛따라 가는 여행</category>
      <category>강북구맛집</category>
      <category>수유맛집</category>
      <category>와플</category>
      <category>와플맛집</category>
      <category>크로플</category>
      <category>크로플맛집</category>
      <category>크로플숍</category>
      <category>화계사</category>
      <category>화계역맛집</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/671</guid>
      <comments>https://hippalus.tistory.com/671#entry671comment</comments>
      <pubDate>Mon, 5 May 2025 15:26:43 +0900</pubDate>
    </item>
    <item>
      <title>내계좌로 100만원 이상 송금도 못하는 농축협 인터넷뱅킹</title>
      <link>https://hippalus.tistory.com/670</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;준조합원인가 유료로 지역 농협에 조합원으로 가입하면 세금 비과세가 된단 말을 듣고 어렵게 가입하고 정신차려보니&lt;br&gt;아무리 예금 보호가 된다한들 이거 일반 시중은행의 예금자보호법이 아닌 자체 기금으로 보호된다란 사실을 간과했다.&lt;br&gt;&lt;br&gt;아차 싶어서 지역 농협 계좌로 송금했던 금액을 시중 1금융권 계좌로 송금 하여 했더니 하루 송금 제한이라며 됐고 너님 송금 더이상 못해 ㅇㅇ &lt;br&gt;&lt;br&gt;한도제한 해제가 있길래 올커니&lt;br&gt;그럼 고로취 하며 시도하니&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnspHz/btsMKP6i4ce/8RSPloee69zFdzkCsgmmOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnspHz/btsMKP6i4ce/8RSPloee69zFdzkCsgmmOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnspHz/btsMKP6i4ce/8RSPloee69zFdzkCsgmmOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnspHz%2FbtsMKP6i4ce%2F8RSPloee69zFdzkCsgmmOK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;991&quot; height=&quot;2000&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf1af3/btsMLXWu5QA/u2T0cArkkrs4Pi2nIIUK61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf1af3/btsMLXWu5QA/u2T0cArkkrs4Pi2nIIUK61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf1af3/btsMLXWu5QA/u2T0cArkkrs4Pi2nIIUK61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf1af3%2FbtsMLXWu5QA%2Fu2T0cArkkrs4Pi2nIIUK61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2379&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;다짜고짜 응 안돼 오류야&lt;br&gt;&lt;br&gt;농협 고객센터에 물어보니 계죄가 어쩌구 저쩌구 하더니 결국 키드 만들거나 칭구로 오라한다&lt;br&gt;또는 화면에 나와있듯이 만기된 금액 받게되면 그땐 해주겠음&lt;br&gt;&lt;br&gt;하.... 뭐 이리 폐쇄적이냐&lt;br&gt;&lt;br&gt;더러워서 탈퇴한다&lt;br&gt;&lt;br&gt;매일 접속해서 언제 다 빼냐 ㅡㅡ&lt;br&gt;괜히 지역 농협인가 뭔가 했다 개피보는 중임&lt;/p&gt;</description>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/670</guid>
      <comments>https://hippalus.tistory.com/670#entry670comment</comments>
      <pubDate>Sat, 15 Mar 2025 10:58:35 +0900</pubDate>
    </item>
    <item>
      <title>아무짝에 쓸모 없는 서울시 모범납세자 선정</title>
      <link>https://hippalus.tistory.com/668</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 써든리 카톡으로 보이스피싱 같은 톡이 왔다.&lt;br /&gt;무려 서울시에서 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;모범 납세자&lt;/b&gt;&lt;/span&gt;로 선정되었다란 안내였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cg5zi/btsMDHlkMn6/66ZKHWV7DLDmkZZtS5Skg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cg5zi/btsMDHlkMn6/66ZKHWV7DLDmkZZtS5Skg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cg5zi/btsMDHlkMn6/66ZKHWV7DLDmkZZtS5Skg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCg5zi%2FbtsMDHlkMn6%2F66ZKHWV7DLDmkZZtS5Skg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;209&quot; height=&quot;367&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 이거슨 또 무엇인가?&lt;br /&gt;내심 보이스피싱은 아닐까 싶어 검색해보니&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.news1.kr/society/general-society/5709517&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.news1.kr/society/general-society/5709517&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741246388635&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;서울시, 모범납세자 33만 명 선발&amp;hellip;은행수수료 면제 등 혜택&quot; data-og-description=&quot;모범납세자, 지난해 대비 9.3% 증가 서울시는 제59회 납세자의 날을 맞아 모범납세자 33만6914명을 선발했다고 6일 밝혔다. 모범 개인납세자는 32만2077명, 법인납세자는 1만4837명이다.모범 &amp;hellip;&quot; data-og-host=&quot;www.news1.kr&quot; data-og-source-url=&quot;https://www.news1.kr/society/general-society/5709517&quot; data-og-url=&quot;https://www.news1.kr/society/general-society/5709517&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FgSIa/hyYqdrKwaw/bSeo5NWkox7Qqq5eaAf6NK/img.jpg?width=1400&amp;amp;height=933&amp;amp;face=0_0_1400_933&quot;&gt;&lt;a href=&quot;https://www.news1.kr/society/general-society/5709517&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.news1.kr/society/general-society/5709517&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FgSIa/hyYqdrKwaw/bSeo5NWkox7Qqq5eaAf6NK/img.jpg?width=1400&amp;amp;height=933&amp;amp;face=0_0_1400_933');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;서울시, 모범납세자 33만 명 선발&amp;hellip;은행수수료 면제 등 혜택&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;모범납세자, 지난해 대비 9.3% 증가 서울시는 제59회 납세자의 날을 맞아 모범납세자 33만6914명을 선발했다고 6일 밝혔다. 모범 개인납세자는 32만2077명, 법인납세자는 1만4837명이다.모범 &amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.news1.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V5gmE/btsMDfWWxb8/SRJqxxR85N5MSYhdN0UPXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V5gmE/btsMDfWWxb8/SRJqxxR85N5MSYhdN0UPXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V5gmE/btsMDfWWxb8/SRJqxxR85N5MSYhdN0UPXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV5gmE%2FbtsMDfWWxb8%2FSRJqxxR85N5MSYhdN0UPXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;130&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;사실이었다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 혹시나가 역시나라고 살펴보니 여간 실망스러운게 아니었다.&lt;br /&gt;33만명 중 극소수만 그나마 공영주차장 무료 혜택 같은 혜택이라고 내세울만한 혜택이 있었고 나머지 수십만명에겐 옛다 그간 삥 군소리 없이 잘 뜯겼구나~ 하며 명예같은 선정일 뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혜택이랍시고 내세운 것들은 죄 모범납세자가 아니어도 누구나 받는 은행 수수료 무료, 환전 수수료 최대 90% 혜택 같은&lt;br /&gt;정말 탁상행정스러운 것들 뿐이다.&lt;br /&gt;마치 길거리에서 나눠주는 무료 찌라시 같은것들 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 자세히 알고 싶다면 아래 링크 PDF로 구체적인 혜택을 확인할 수 있다.&lt;br /&gt;&lt;a href=&quot;https://etax.seoul.go.kr/FILE_ATTACH/info/file/2025_mobum.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://etax.seoul.go.kr/FILE_ATTACH/info/file/2025_mobum.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;정말&amp;nbsp;정말&amp;nbsp;정말&amp;nbsp;정말&amp;nbsp;그나마&amp;nbsp;써볼까&amp;nbsp;말까&amp;nbsp;정도&amp;nbsp;수준의&amp;nbsp;혜택은&amp;nbsp;정기예금도&amp;nbsp;아닌&amp;nbsp;적금&amp;nbsp;우대이율&amp;nbsp;0.2%가&amp;nbsp;고작이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 좋았다가 안 좋아졌다.&lt;br /&gt;이런거 쓸데없이 선정하지말아주길 바란다.&lt;br /&gt;최소한 남산주차장 같은곳 몇회 이용권 정도는 줘야 하는거 아닌가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SoSo한 생각</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/668</guid>
      <comments>https://hippalus.tistory.com/668#entry668comment</comments>
      <pubDate>Thu, 6 Mar 2025 18:16:50 +0900</pubDate>
    </item>
    <item>
      <title>제주도 농촌주택 개량사업 29py기준 2억 5천만 원에 가능한 돌담하우스 모델</title>
      <link>https://hippalus.tistory.com/667</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;제주도&lt;/b&gt;&lt;/span&gt;에 오래된 &lt;b&gt;노후 주택을 새 주택으로&lt;/b&gt; 착공부터 완공까지 단 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3개월&lt;/b&gt;&lt;/span&gt;만에 &lt;b&gt;29py&lt;/b&gt; 기준 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2억 5천만 원&lt;/b&gt;&lt;/span&gt;에 건축 가능한 제주도 전문 건축 기업 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;돌담하우스&lt;/b&gt;&lt;/span&gt;입니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;intro.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekE2cg/btsLJAWkkCs/k9tTZvAKlIyVK41kW7gS5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekE2cg/btsLJAWkkCs/k9tTZvAKlIyVK41kW7gS5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekE2cg/btsLJAWkkCs/k9tTZvAKlIyVK41kW7gS5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekE2cg%2FbtsLJAWkkCs%2Fk9tTZvAKlIyVK41kW7gS5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1308&quot; height=&quot;978&quot; data-filename=&quot;intro.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;br /&gt;농촌주택 개량사업이란?&lt;br /&gt;&lt;/b&gt;농촌주택 개량사업은 농촌 지역의 노후 주택을 현대화하거나 새로 건축하는 데 필요한 자금을 지원하는 국가 주도 정책입니다. &lt;br /&gt;이 사업은 주거 환경 개선뿐만 아니라 농촌 지역의 인구 유입과 정착을 촉진하기 위한 목적으로 운영됩니다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;house.png&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zeTXF/btsLJA9Q7kJ/CYMlEq3KoS598B72nkDMPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zeTXF/btsLJA9Q7kJ/CYMlEq3KoS598B72nkDMPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zeTXF/btsLJA9Q7kJ/CYMlEq3KoS598B72nkDMPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzeTXF%2FbtsLJA9Q7kJ%2FCYMlEq3KoS598B72nkDMPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1724&quot; height=&quot;806&quot; data-filename=&quot;house.png&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요&amp;nbsp;혜택&lt;br /&gt;&lt;/b&gt;저금리 대출: 주택 건축 및 개량 비용의 최대 2억 원까지 연 2% 이하의 금리로 대출이 가능합니다.&lt;br /&gt;노후 주택 철거 지원: 기존의 노후화된 주택을 철거하고 새로운 주택을 건축할 수 있도록 지원합니다.&lt;br /&gt;농촌 활성화 기여: 귀농이나 귀촌을 계획 중인 분들에게 안정적인 정착 기반을 제공합니다.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;- 지원 대상과 조건&lt;/b&gt;&lt;br /&gt;읍면동 지역 무주택자, 본인 소유의 노후 불량주택을 개량하고자 하는 농촌주민, 도시지역 무주택 귀농귀촌인&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 대상자 선정&lt;/b&gt;&lt;br /&gt;매 년 2월 신청(해당 읍면동 행정복지센터)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 세제 지원&lt;/b&gt;&lt;br /&gt;취득세 감면 (280만 원 한도)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 은행 대출&lt;/b&gt;&lt;br /&gt;2억 5천 만 원&lt;br /&gt;최대 19년 분할 상환 (2%)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 유의 사항&lt;/b&gt;&lt;br /&gt;대출 신청 전 해당 지역이 농촌주택 개량사업 지원 대상 지역인지 확인해야 합니다.&lt;br /&gt;주택 건축과 개량은 지역별 허가 절차를 준수해야 하며, 제주도는 자연경관 보호를 위한 별도의 규제를 따릅니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;제주도 건축 전문 기업 돌담하우스와 함께하는 제주도 주택 개량&lt;/b&gt;&lt;br /&gt;제주도의 주택 건축은 다른 지역과는 달리 독특한 자연환경과 건축 규제를 고려해야 합니다. 이에 대해 전문 지식과 풍부한 경험을 보유한 업체가 바로 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;돌담하우스&lt;/b&gt;&lt;/span&gt;입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;돌담하우스의 강점&lt;/b&gt;&lt;br /&gt;지역 전문가: 제주도의 자연경관, 기후, 건축 규제에 대한 심층적인 이해를 바탕으로 프로젝트를 진행합니다.&lt;br /&gt;신뢰받는 시공: 엄격한 품질 관리와 투명한 공정으로 높은 신뢰도를 유지합니다. &lt;br /&gt;전문 상담 서비스: 건축주의 예산, 요구사항, 일정 등을 면밀히 분석하여 최적의 솔루션을 제공합니다.&lt;br /&gt;&lt;br /&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;info.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BNMaR/btsLKFoRWnD/YbRNyVtNAJfOkpErNoj9k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BNMaR/btsLKFoRWnD/YbRNyVtNAJfOkpErNoj9k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BNMaR/btsLKFoRWnD/YbRNyVtNAJfOkpErNoj9k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBNMaR%2FbtsLKFoRWnD%2FYbRNyVtNAJfOkpErNoj9k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;828&quot; data-filename=&quot;info.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;농촌주택 개량사업을 성공적으로 진행하려면 전문가의 도움이 필수적입니다. &lt;br /&gt;돌담하우스는 제주도 내 다양한 프로젝트 경험을 바탕으로 예비 건축주의 고민을 해결합니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;돌담하우스&lt;/b&gt;&lt;/span&gt;홈페이지(&lt;a href=&quot;https://www.doldamhouse.kr/govsup.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;https://www.doldamhouse.kr&lt;/u&gt;&lt;/a&gt;)에서&amp;nbsp; 1:1 상담 신청 가능합니다.&lt;br /&gt;특히 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;서울 등 도시에 나와 거주&lt;/b&gt;&lt;/span&gt;중이시며 제주도에 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;부모님이 소유하신 노후 주택&lt;/b&gt;&lt;/span&gt;을 농촌주택계량지원을 이용해 재건축을 원하시는 가족분들의 상담을 환영합니다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;상담 문의: 064-772-3697&lt;br /&gt;&lt;br /&gt;홈페이지:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;a href=&quot;https://www.doldamhouse.kr&quot;&gt;https://www.doldamhouse.kr&lt;/a&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시공평형 29평 (실거주 25평)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;plan.png&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xgf4P/btsLK49HtO0/jInKgJYuTk7lNKfVcoNgAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xgf4P/btsLK49HtO0/jInKgJYuTk7lNKfVcoNgAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xgf4P/btsLK49HtO0/jInKgJYuTk7lNKfVcoNgAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxgf4P%2FbtsLK49HtO0%2FjInKgJYuTk7lNKfVcoNgAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;827&quot; height=&quot;561&quot; data-filename=&quot;plan.png&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;계약금액 &lt;br /&gt;2억&amp;nbsp;5천만&amp;nbsp;원&amp;nbsp;(부가세포함) &lt;br /&gt;&lt;br /&gt;실비용 &lt;br /&gt;2억&amp;nbsp;2천&amp;nbsp;5백만&amp;nbsp;원 &lt;br /&gt;&lt;br /&gt;시공비 &lt;br /&gt;1억&amp;nbsp;8천만&amp;nbsp;원&amp;nbsp;(부가세포함&amp;nbsp;평당&amp;nbsp;690만&amp;nbsp;원) &lt;br /&gt;&lt;br /&gt;차액&amp;nbsp;4천&amp;nbsp;5백만&amp;nbsp;원 &lt;br /&gt;설계비,&amp;nbsp;인허가비,&amp;nbsp;기초토목,&amp;nbsp;오수정화조(침투조),&amp;nbsp;우수침투조 &lt;br /&gt;&lt;br /&gt;* 시오수관, 상수도 별도&lt;/h4&gt;</description>
      <category>SoSo한 생각</category>
      <category>개량지원사업</category>
      <category>계량지원사업</category>
      <category>농촌주택개량지원사업</category>
      <category>농촌주택개량지원정부사업</category>
      <category>농촌주택계량지원사업</category>
      <category>리모델링</category>
      <category>재건축</category>
      <category>제주도</category>
      <category>제주도건축</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/667</guid>
      <comments>https://hippalus.tistory.com/667#entry667comment</comments>
      <pubDate>Sat, 11 Jan 2025 13:52:48 +0900</pubDate>
    </item>
    <item>
      <title>토드(toad) F3키로 끝까지 검색 후 다시 처음부터 검색</title>
      <link>https://hippalus.tistory.com/666</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;chatgpt든 검색이든 아무리 해봤자 이상한 답만 줌&lt;br /&gt;옵션을 바꾸네 마네&lt;br /&gt;그냥 ctrl+f로 검색하면 스샷처럼 Wrap around를 체크하면 됨&lt;br /&gt;그럼 F3키로 계속 끝까지 검색 후 다시 처음부터 검색 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgjNHC/btsLlRRrZjG/oVUtG6cBf1dBMyTiyEitP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgjNHC/btsLlRRrZjG/oVUtG6cBf1dBMyTiyEitP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgjNHC/btsLlRRrZjG/oVUtG6cBf1dBMyTiyEitP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgjNHC%2FbtsLlRRrZjG%2FoVUtG6cBf1dBMyTiyEitP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;353&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/666</guid>
      <comments>https://hippalus.tistory.com/666#entry666comment</comments>
      <pubDate>Wed, 18 Dec 2024 12:58:21 +0900</pubDate>
    </item>
    <item>
      <title>eclipse 계속 console이 호출되어 정상적인 search 등이 불가능할 때</title>
      <link>https://hippalus.tistory.com/665</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;상단 Window메뉴의 Preferences 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIWaHh/btsKV3jBin7/oadMdgskKC5vRcGWjk5qg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIWaHh/btsKV3jBin7/oadMdgskKC5vRcGWjk5qg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIWaHh/btsKV3jBin7/oadMdgskKC5vRcGWjk5qg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIWaHh%2FbtsKV3jBin7%2FoadMdgskKC5vRcGWjk5qg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;160&quot; height=&quot;242&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Run/Debug의 Console선택 후 우측에 Show when program writes to standard out, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Show when program writes to standard&lt;span&gt; error 언체크 후 Apply and Close&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvsPsN/btsKWkFnYcD/HlY6TCSPJ7ldZvrErySdD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvsPsN/btsKWkFnYcD/HlY6TCSPJ7ldZvrErySdD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvsPsN/btsKWkFnYcD/HlY6TCSPJ7ldZvrErySdD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvsPsN%2FbtsKWkFnYcD%2FHlY6TCSPJ7ldZvrErySdD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;558&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/665</guid>
      <comments>https://hippalus.tistory.com/665#entry665comment</comments>
      <pubDate>Mon, 25 Nov 2024 18:31:38 +0900</pubDate>
    </item>
    <item>
      <title>postgresql 실행중인 쿼리 확인 후 취소</title>
      <link>https://hippalus.tistory.com/664</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실행중인 쿼리 목록 조회&lt;br /&gt;&lt;br /&gt;SELECT&amp;nbsp;pid,&amp;nbsp;state,&amp;nbsp;usename,&amp;nbsp;query &lt;br /&gt;FROM&amp;nbsp;pg_stat_activity &lt;br /&gt;WHERE&amp;nbsp;state&amp;nbsp;=&amp;nbsp;'active'; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;​ &lt;br /&gt;&lt;br /&gt;결과에서 pid 값을 넣고 실행&lt;br /&gt;SELECT&amp;nbsp;pg_terminate_backend(pid) &lt;br /&gt;FROM&amp;nbsp;pg_stat_activity &lt;br /&gt;WHERE&amp;nbsp;pid&amp;nbsp;=&amp;nbsp;&amp;lt;중단할&amp;nbsp;pid&amp;gt;; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>postgreSQL</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/664</guid>
      <comments>https://hippalus.tistory.com/664#entry664comment</comments>
      <pubDate>Mon, 21 Oct 2024 12:11:12 +0900</pubDate>
    </item>
    <item>
      <title>스카우터 xlog 사라졌을 때 다시 보이게 하기</title>
      <link>https://hippalus.tistory.com/663</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 이런 화면으로 java 서비스들이 얼마나 부하를 발생하고 있는지 확인 하고 있을텐데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5dUaO/btsJcQ0S5Ku/zbIglsvv25bZ6NxGwfFMbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5dUaO/btsJcQ0S5Ku/zbIglsvv25bZ6NxGwfFMbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5dUaO/btsJcQ0S5Ku/zbIglsvv25bZ6NxGwfFMbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5dUaO%2FbtsJcQ0S5Ku%2FzbIglsvv25bZ6NxGwfFMbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1183&quot; height=&quot;864&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느순간 이 화면이 사라져있다면&lt;br /&gt;상단 메뉴의 Collector &amp;gt; Tomcat &amp;gt; XLog를 눌러주면 다시 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nrpu3/btsJcTC1Z5v/QXlJl5nnKwyEKvwqzLmU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nrpu3/btsJcTC1Z5v/QXlJl5nnKwyEKvwqzLmU01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nrpu3/btsJcTC1Z5v/QXlJl5nnKwyEKvwqzLmU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNrpu3%2FbtsJcTC1Z5v%2FQXlJl5nnKwyEKvwqzLmU01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;676&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/663</guid>
      <comments>https://hippalus.tistory.com/663#entry663comment</comments>
      <pubDate>Fri, 23 Aug 2024 12:16:37 +0900</pubDate>
    </item>
    <item>
      <title>npm install 오류 : To see a list of supported npm commands, run:  npm help</title>
      <link>https://hippalus.tistory.com/662</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;npm으로 node.js 모듈을 install하다 이런 오류가 발생할 경우&lt;br /&gt;&lt;br /&gt;To see a list of supported npm commands, run: npm help&lt;br /&gt;npm notice Changelog: &lt;a href=&quot;https://github.com/npm/cli/releases/tag/v10.8.2&quot;&gt;https://github.com/npm/cli/releases/tag/v10.8.2&lt;/a&gt; Unknown command: &quot;notice&quot; &lt;br /&gt;To see a list of supported npm commands, run: npm help&lt;br /&gt;npm ERR! errno -13 &lt;br /&gt;Unknown command: &quot;ERR!&quot; &lt;br /&gt;&lt;br /&gt;아래 명령어 실행 후 다시 install을 시도하면 잘 될 수도 있다~&lt;br /&gt;npm cache clean --force&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/662</guid>
      <comments>https://hippalus.tistory.com/662#entry662comment</comments>
      <pubDate>Thu, 11 Jul 2024 12:44:52 +0900</pubDate>
    </item>
    <item>
      <title>5. node.js로 node-media-server를 이용한 실시간 스트리밍 방송 서버 만들기 : 클라이언트 브라우저로 영상 보기</title>
      <link>https://hippalus.tistory.com/661</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;1. 브라우저 보안 정책상 자동 재생이 불가하나 그래도 해야겠다면 mute로 실행되어야 한다.&lt;br /&gt;2. hls.js로 스트림 서버 접속해서 영상을 받아오면 된다.&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cd3131;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=utf-8&quot; pageEncoding=&quot;utf-8&quot;%&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;!DOCTYPE&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;html&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;Live Streams&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;script&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;&lt;a href=&quot;https://cdn.jsdelivr.net/npm/hls.js@latest&quot;&gt;https://cdn.jsdelivr.net/npm/hls.js@latest&lt;/a&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;video&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;live-stream&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;640&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;360&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;controls&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;autoplay&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&amp;lt;/video&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'live-stream'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;videoSrc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'&lt;a href=&quot;https://dev.kobay.co.kr:8000/live/re_8122486_836421b07dbb47b6cec6/index.m3u8'&quot;&gt;https://내주소:8000/live/obs studio에서 설정한 스트림키/index.m3u8'&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;Hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;isSupported&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;Hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;({&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;lowLatencyMode&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;liveSyncDurationCount&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;liveMaxLatencyDurationCount&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;liveDurationInfinity&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;highBufferWatchdogPeriod&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;nudgeMaxRetry&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;nudgeOffset&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;maxFragLookUpTolerance&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;startFragPrefetch&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;loadSource&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;videoSrc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;attachMedia&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;Hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;Events&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;MANIFEST_PARSED&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;startLoad&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(-&lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;); &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 가장 최근 세그먼트부터 로드&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;play&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;Hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;Events&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;ERROR&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'HLS error:'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;fatal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;destroy&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;setTimeout&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;loadSource&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;videoSrc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;attachMedia&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }, &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;canPlayType&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'application/vnd.apple.mpegurl'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;videoSrc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'loadedmetadata'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;duration&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;currentTime&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;duration&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 가장 최근 시점으로 이동&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;video&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;play&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OBS Studio의 설정, node.js 서버설정, 클라이언트에서도 최근 시점으로 이동시키는 설정 등&amp;nbsp;&lt;br /&gt;3위일체가 되었다면 3초는 아니더라도 5초~8초 사이의 딜레이정도만 존재하는 훌륭한 스트리밍 서비스가 가능하다.&lt;br /&gt;다만 아직 못해본건 서버사양과 대역폭 등에 대한 최대 지원 정도는 테스트 해봐야 함.&lt;br /&gt;경우에 따라선 nginx로 분산처리도 고려 대상임.&lt;br /&gt;&lt;br /&gt;* 쿠키 *&lt;br /&gt;만약 youtube의 실시간 채널 라이브 방송을 진행하고 이를 웹브라우저에서 보고 싶다면 아래처럼 iframe을 이용하면 확인할 수 있다.&lt;br /&gt;youtube는 3초 정도의 딜레이가 존재한다.&lt;br /&gt;구글이니까&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cd3131;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=utf-8&quot; pageEncoding=&quot;utf-8&quot;%&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;!DOCTYPE&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;html&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;Live Streams&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;iframe&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;live-stream&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;640&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;360&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;&lt;a href=&quot;https://www.youtube.com/embed/NdEGqSuVkrE?autoplay=1&quot;&gt;https://www.youtube.com/embed/******qSuVkrE?autoplay=1&lt;/a&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;frameborder&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;allow&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;autoplay; encrypted-media&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;allowfullscreen&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/661</guid>
      <comments>https://hippalus.tistory.com/661#entry661comment</comments>
      <pubDate>Tue, 2 Jul 2024 08:01:49 +0900</pubDate>
    </item>
    <item>
      <title>4. node.js로 node-media-server를 이용한 실시간 스트리밍 방송 서버 만들기 : OBS Studio로 방송 송출 설정</title>
      <link>https://hippalus.tistory.com/660</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;다른거 다 필요 없다.&lt;br /&gt;&lt;br /&gt;방송 송출 서버 주소 설정하고 방송하면 된다.&lt;br /&gt;설정을 해야 하니 제어 &amp;gt; 설정 눌러보면 팝업윈도우가 새로 뜨는데 &lt;br /&gt;좌측 메뉴에서 방송 누르고 서비스는 사용자 지정, 서버는 프로토콜을 rtmp로 설정 후 내 node.js 서버가 존재하는 ip, 도메인을 입력 후 그 하위 디렉토리까지 입력해준다.&lt;br /&gt;일전에 nginx 설정할 때 location /live 로 입력했던것 기억하는가?&lt;br /&gt;그 live가 이 live다.&lt;br /&gt;스트림 키는 유저별로 생성해주는 키로 마찬가지로 일전에 /node/stream/media/live/스트림키 어쩌구저쩌구 에 ts파일과 m3u8파일이 생긴다고 말했다.&lt;br /&gt;그때 사용되는 폴더가 이 스트림키로 생성된다.&lt;br /&gt;rtmp://mydomain.com/live 이런식으로 서버에 설정해주면 된다. (클라이언트 접속시엔 포트 번호가 들어가야 하지만 여기선 제거)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVo6Oc/btsIhW2wHp0/2C4VGAhUIYDw8JGku0bSKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVo6Oc/btsIhW2wHp0/2C4VGAhUIYDw8JGku0bSKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVo6Oc/btsIhW2wHp0/2C4VGAhUIYDw8JGku0bSKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVo6Oc%2FbtsIhW2wHp0%2F2C4VGAhUIYDw8JGku0bSKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;977&quot; height=&quot;754&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지만 해도 일단 방송 출력은 될 것이다.&lt;br /&gt;하지만 가장 중요한건 딜레이 줄이기 위한 설정이 남아있다.&lt;br /&gt;이것 몰라서 8시간 헤맸다.&lt;br /&gt;&lt;br /&gt;제어 &amp;gt; 설정 눌러보면 팝업윈도우가 새로 뜨는데&lt;br /&gt;여기서 좌측 메뉴들 중 출력 선택 &amp;gt; 고급 선택 &amp;gt; 비디오 인코더 x264, 키프레임 간격 2s, CPU 사용량 사전 설정(ultrafast)&lt;br /&gt;이정도만 손봐주면 된다.&lt;br /&gt;이거 안 해주면 15초 25초씩 딜레이 걸린다.&lt;br /&gt;참고로 유튜브라이브는 3초고 rtmp는 5초~8초가 최대 한계다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CWJdM/btsIicD4aiJ/97q6epP9o1KJjsxjjvwkaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CWJdM/btsIicD4aiJ/97q6epP9o1KJjsxjjvwkaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CWJdM/btsIicD4aiJ/97q6epP9o1KJjsxjjvwkaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCWJdM%2FbtsIicD4aiJ%2F97q6epP9o1KJjsxjjvwkaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1460&quot; height=&quot;1125&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 웹캠 없이 스마트폰으로 방송을 해야 한다면 iVCam이란 프로그램을 설치하기 바란다.&lt;br /&gt;중공산 프로그램 같긴한데.. 좀 찝찝하다만 동작은 잘 된다.&lt;br /&gt;내 폰은 iPhone인데 PC와 폰 모두 동일한 Wifi로 연결해야만 영상 전송이 가능하다.&lt;br /&gt;따라서 그냥 케이블로 연결했다.&lt;br /&gt;이것도 처음엔 잘 안됐는데 어찌저찌하다보니 되더라.. 그리고 가끔씩 끊어지더라&lt;br /&gt;왜 끊어지는진 모르겠다. 연결 끊김 연결 반복되기도 하더란.. 그래도 뭐 잘은 되니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOhYt5/btsIhwXBG2j/mA7VJmdWuv4dWGJlmJKWqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOhYt5/btsIhwXBG2j/mA7VJmdWuv4dWGJlmJKWqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOhYt5/btsIhwXBG2j/mA7VJmdWuv4dWGJlmJKWqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOhYt5%2FbtsIhwXBG2j%2FmA7VJmdWuv4dWGJlmJKWqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;128&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 연결해서 화면 뜨고 방송 시작 누르면 방송 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b39pLh/btsIjd3l4NB/NTDyzwAKMskhfuPrmQkvO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b39pLh/btsIjd3l4NB/NTDyzwAKMskhfuPrmQkvO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b39pLh/btsIjd3l4NB/NTDyzwAKMskhfuPrmQkvO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb39pLh%2FbtsIjd3l4NB%2FNTDyzwAKMskhfuPrmQkvO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1469&quot; height=&quot;786&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;live폴더 아래에 스트림키 폴더에 보면 이렇게 영상 파일들이 실시간으로 생성되는걸 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAe4p/btsIiV9EEHB/K0GgBUtR4hrvT1JkcnVPxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAe4p/btsIiV9EEHB/K0GgBUtR4hrvT1JkcnVPxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAe4p/btsIiV9EEHB/K0GgBUtR4hrvT1JkcnVPxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAe4p%2FbtsIiV9EEHB%2FK0GgBUtR4hrvT1JkcnVPxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1265&quot; height=&quot;41&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 ls로 확인하기 귀찮으면&lt;br /&gt;watch&amp;nbsp;-n&amp;nbsp;1&amp;nbsp;&quot;ls&amp;nbsp;-lR&amp;nbsp;/node/stream/media/live&quot; &lt;br /&gt;이렇게 해두면 알아서 파일이 실시간 확인 가능하다.&lt;br /&gt;&lt;br /&gt;다음엔 웹브라우저로 송출받은 영상을 확인해 보겠다.&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/660</guid>
      <comments>https://hippalus.tistory.com/660#entry660comment</comments>
      <pubDate>Mon, 1 Jul 2024 21:48:35 +0900</pubDate>
    </item>
    <item>
      <title>3. node.js로 node-media-server를 이용한 실시간 스트리밍 방송 서버 만들기 : node.js 스트리밍 서버 프로그램 개발</title>
      <link>https://hippalus.tistory.com/659</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. node-media-server (nms) 모듈 설치 : npm install node-media-server&lt;br /&gt;2. nms 기본 포트는 1935 사용&lt;br /&gt;3. 앞서 nginx에서 설정했던 7999 포트로 클라이언트 웹브라우저에서 요청시 실시간 영상 제공&lt;br /&gt;4. media파일 경로는 /node/stream/media&lt;br /&gt;&amp;nbsp; &amp;nbsp; 스트림키를 부여 받고 방송을 할 경우 저 media 폴더 하위에 스트림키 폴더가 생성되고 그 안에 ts, m3u8 파일 생성됨&lt;br /&gt;5. 방송 송출자와 시청자의 시간차를 줄이기 위해 hls_time을 2로 설정함. 숫자가 낮을수록 차가 줄어들지만 부하발생&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;NodeMediaServer&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'node-media-server'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;rtmp&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1935&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;chunk_size&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;60000&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;gop_cache&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;ping&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;ping_timeout&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;60&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;http&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;7999&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;allow_origin&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'*'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;cors&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;enable&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;origin&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'*'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;mediaroot&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'/node/stream/media'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;webroot&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'/node/stream/www'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;trans&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;ffmpeg&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'/usr/local/bin/ffmpeg'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 여기에 올바른 ffmpeg 경로를 설정합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;tasks&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; [&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'live'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hls&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hlsFlags&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'[hls_time=2:hls_list_size=3:hls_flags=delete_segments]'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hlsKeep&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 스트림 종료 후 hls 파일 삭제 방지&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dash&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dashFlags&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'[f=dash:window_size=3:extra_window_size=5]'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dashKeep&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 스트림 종료 후 dash 파일 삭제 방지&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; ]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;logType&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Debug 레벨 설정&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;nms&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;NodeMediaServer&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;nms&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/659</guid>
      <comments>https://hippalus.tistory.com/659#entry659comment</comments>
      <pubDate>Mon, 1 Jul 2024 19:49:09 +0900</pubDate>
    </item>
    <item>
      <title>2. node.js로 node-media-server를 이용한 실시간 스트리밍 방송 서버 만들기 : nginx SSL, CORS 해결 포함 설정</title>
      <link>https://hippalus.tistory.com/657</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[주요 설정]&lt;br /&gt;1. 8000포트를 사용하여 SSL로 live 클라이언트 웹 브라우저에서 접속&lt;br /&gt;2. 서버의 스트리밍 파일(m3u8, ts등)이 생성되는 곳은 /node/stream/media/live 폴더&lt;br /&gt;3. 빌어X을 CORS는 제낌&lt;br /&gt;4. node.js로 만든 스트리밍 서버에선 클라이언트 브라우저의 요청시 7999포트를 이용해서 hls로 리턴해줄 예정&lt;br /&gt;&lt;br /&gt;server&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;8000&amp;nbsp;ssl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server_name&amp;nbsp;dev.*****.co.kr; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_certificate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/usr/local/nginx/conf/cert/2024/dev_*****_co_kr_NginX_cert.pem; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_certificate_key&amp;nbsp;/usr/local/nginx/conf/cert/2024/dev_*****_co_kr_NginX_key.pem; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;access_log&amp;nbsp;/usr/local/nginx/logs/dev.*****.co.kr_access_log; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_log&amp;nbsp;/usr/local/nginx/logs/dev.*****.co.kr_error_log; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_session_cache&amp;nbsp;shared:SSL:1m; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_session_timeout&amp;nbsp;5m; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_protocols&amp;nbsp;TLSv1.1&amp;nbsp;TLSv1.2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_ciphers&amp;nbsp;******************************************************************************; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_prefer_server_ciphers&amp;nbsp;on; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Origin'&amp;nbsp;'*'&amp;nbsp;always; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Methods'&amp;nbsp;'GET,&amp;nbsp;POST,&amp;nbsp;OPTIONS,&amp;nbsp;PUT,&amp;nbsp;DELETE'&amp;nbsp;always; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Headers'&amp;nbsp;'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'&amp;nbsp;always; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Expose-Headers'&amp;nbsp;'Content-Length,Content-Range'&amp;nbsp;always; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/live&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp;/node/stream/media/live; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_pass&amp;nbsp;http://127.0.0.1:7999; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_buffering&amp;nbsp;off; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_request_buffering&amp;nbsp;off; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_cache&amp;nbsp;off; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_read_timeout&amp;nbsp;10s; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_send_timeout&amp;nbsp;10s; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_timeout&amp;nbsp;10s; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_http_version&amp;nbsp;1.1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_connect_timeout&amp;nbsp;75s; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;Upgrade&amp;nbsp;$http_upgrade; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;Connection&amp;nbsp;'upgrade'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;Host&amp;nbsp;$host; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_cache_bypass&amp;nbsp;$http_upgrade; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;Cache-Control&amp;nbsp;no-cache; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($request_method&amp;nbsp;=&amp;nbsp;'OPTIONS')&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Origin'&amp;nbsp;'*'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Methods'&amp;nbsp;'GET,&amp;nbsp;POST,&amp;nbsp;OPTIONS'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Headers'&amp;nbsp;'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Max-Age'&amp;nbsp;1728000; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Content-Type'&amp;nbsp;'text/plain;&amp;nbsp;charset=utf-8'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Content-Length'&amp;nbsp;0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;204; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;types&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;application/vnd.apple.mpegurl&amp;nbsp;m3u8; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;video/mp2t&amp;nbsp;ts; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/hls&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Disable&amp;nbsp;cache &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;Cache-Control&amp;nbsp;no-cache; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;CORS&amp;nbsp;setup &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Origin'&amp;nbsp;'*'&amp;nbsp;always; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Expose-Headers'&amp;nbsp;'Content-Length'; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;allow&amp;nbsp;CORS&amp;nbsp;preflight&amp;nbsp;requests &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($request_method&amp;nbsp;=&amp;nbsp;'OPTIONS')&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Allow-Origin'&amp;nbsp;'*'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Access-Control-Max-Age'&amp;nbsp;1728000; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Content-Type'&amp;nbsp;'text/plain&amp;nbsp;charset=UTF-8'; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;'Content-Length'&amp;nbsp;0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;204; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Serve&amp;nbsp;HLS&amp;nbsp;fragments &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;types&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;application/vnd.apple.mpegurl&amp;nbsp;m3u8; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;video/mp2t&amp;nbsp;ts; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root&amp;nbsp;/tmp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_header&amp;nbsp;Cache-Control&amp;nbsp;no-cache; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;다음은 node.js로 스트리밍 서버를 만들어보겠다.&lt;br /&gt;서버는 환경설정보다 쉽다.&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>CORS</category>
      <category>nginx설정</category>
      <category>NMS</category>
      <category>Node.js</category>
      <category>스트리밍</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/657</guid>
      <comments>https://hippalus.tistory.com/657#entry657comment</comments>
      <pubDate>Mon, 1 Jul 2024 18:50:55 +0900</pubDate>
    </item>
    <item>
      <title>1. node.js로 node-media-server를 이용한 실시간 스트리밍 방송 서버 만들기 : 환경설정 (centos7 기준)</title>
      <link>https://hippalus.tistory.com/658</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;너무 정신 없이 이것 저것 검색해가며 설치하다 보니 잡탕이지만 나름 정리해보자면&lt;br /&gt;nginx를 이용해 스트리밍 방송을 하려면 nginx에 rtmp모듈을 설치하여 컴파일하여야 하고&lt;br /&gt;nms를 이용해 실시간 방송을 하려면 ffmpeg도 설치해야 한다.&lt;br /&gt;현재 실행 권한은 su 권한이다.&lt;br /&gt;&lt;br /&gt;먼저 nginx에 rtmp모듈을 설치 및 컴파일을 진행한다.&lt;br /&gt;아래&amp;nbsp;과정은&amp;nbsp;Nginx를&amp;nbsp;커스터마이징하여&amp;nbsp;필요한&amp;nbsp;기능을&amp;nbsp;추가하고,&amp;nbsp;소스&amp;nbsp;코드를&amp;nbsp;컴파일하여&amp;nbsp;시스템에&amp;nbsp;설치하는&amp;nbsp;과정으로&amp;nbsp;각각의&amp;nbsp;단계는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;목적을&amp;nbsp;가지고&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;Nginx&amp;nbsp;소스&amp;nbsp;코드&amp;nbsp;다운로드&amp;nbsp;및&amp;nbsp;해제:&amp;nbsp;Nginx&amp;nbsp;소스&amp;nbsp;코드를&amp;nbsp;다운로드하고&amp;nbsp;압축을&amp;nbsp;해제하여&amp;nbsp;빌드&amp;nbsp;준비 &lt;br /&gt;RTMP&amp;nbsp;모듈&amp;nbsp;다운로드:&amp;nbsp;Nginx에&amp;nbsp;RTMP&amp;nbsp;스트리밍&amp;nbsp;기능을&amp;nbsp;추가하기&amp;nbsp;위해&amp;nbsp;RTMP&amp;nbsp;모듈&amp;nbsp;소스&amp;nbsp;코드를&amp;nbsp;다운로드 &lt;br /&gt;필수&amp;nbsp;라이브러리&amp;nbsp;설치:&amp;nbsp;Nginx&amp;nbsp;빌드에&amp;nbsp;필요한&amp;nbsp;PCRE,&amp;nbsp;zlib,&amp;nbsp;OpenSSL&amp;nbsp;라이브러리와&amp;nbsp;개발&amp;nbsp;파일을&amp;nbsp;설치 &lt;br /&gt;configure&amp;nbsp;실행:&amp;nbsp;시스템&amp;nbsp;환경에&amp;nbsp;맞게&amp;nbsp;Nginx&amp;nbsp;빌드&amp;nbsp;설정을&amp;nbsp;준비하고,&amp;nbsp;RTMP&amp;nbsp;모듈을&amp;nbsp;포함 &lt;br /&gt;make&amp;nbsp;및&amp;nbsp;make&amp;nbsp;install:&amp;nbsp;소스&amp;nbsp;코드를&amp;nbsp;컴파일하고,&amp;nbsp;컴파일된&amp;nbsp;바이너리를&amp;nbsp;시스템에&amp;nbsp;설치 &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;과정을&amp;nbsp;통해&amp;nbsp;원하는&amp;nbsp;기능을&amp;nbsp;가진&amp;nbsp;커스텀&amp;nbsp;Nginx를&amp;nbsp;빌드하여&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;1. 먼저 설치된 nginx의 버전을 확인해 본다.&lt;br /&gt;설치된&amp;nbsp;폴더는&amp;nbsp;/usr/local/nginx/sbin&amp;nbsp;이므로 &lt;br /&gt;cd&amp;nbsp;/usr/local/nginx/sbin &lt;br /&gt;./nginx&amp;nbsp;-v를&amp;nbsp;실행하면&amp;nbsp; &lt;br /&gt;설치된&amp;nbsp;버전&amp;nbsp;확인이&amp;nbsp;가능하다. &lt;br /&gt;네&amp;nbsp;경우&amp;nbsp;nginx&amp;nbsp;version:&amp;nbsp;nginx/1.12.2&amp;nbsp;로&amp;nbsp;나왔다. &lt;br /&gt;&lt;br /&gt;2. wget 명령어나 curl 명령어로 파일을 다운 받는다. &lt;br /&gt;난&amp;nbsp;curl로&amp;nbsp;다운받았다. &lt;br /&gt;wget&amp;nbsp;&lt;a href=&quot;http://nginx.org/download/nginx-1.12.2.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://nginx.org/download/nginx-1.12.2.tar.gz&lt;/a&gt;&lt;br /&gt;curl&amp;nbsp;-O&amp;nbsp;&lt;a href=&quot;http://nginx.org/download/nginx-1.12.2.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://nginx.org/download/nginx-1.12.2.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;tar&amp;nbsp;-xvf&amp;nbsp;nginx-1.12.2.tar.gz&lt;br /&gt;&lt;br /&gt;git&amp;nbsp;clone&amp;nbsp;&lt;a href=&quot;https://github.com/arut/nginx-rtmp-module.git&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/arut/nginx-rtmp-module.git&lt;/a&gt;&lt;br /&gt;cd&amp;nbsp;nginx-1.12.2 &lt;br /&gt;&lt;br /&gt;Nginx&amp;nbsp;빌드시&amp;nbsp;필요한&amp;nbsp;의존성으로&amp;nbsp;사용되는&amp;nbsp;패키지&amp;nbsp;설치 &lt;br /&gt;libpcre3&amp;nbsp;및&amp;nbsp;libpcre3-dev:&amp;nbsp;정규&amp;nbsp;표현식을&amp;nbsp;사용하는&amp;nbsp;소프트웨어&amp;nbsp;개발을&amp;nbsp;위한&amp;nbsp;PCRE&amp;nbsp;라이브러리. &lt;br /&gt;zlib1g-dev:&amp;nbsp;데이터&amp;nbsp;압축&amp;nbsp;및&amp;nbsp;해제를&amp;nbsp;위한&amp;nbsp;zlib&amp;nbsp;라이브러리&amp;nbsp;개발&amp;nbsp;파일. &lt;br /&gt;libssl-dev:&amp;nbsp;보안&amp;nbsp;통신을&amp;nbsp;지원하는&amp;nbsp;OpenSSL&amp;nbsp;라이브러리&amp;nbsp;개발&amp;nbsp;파일. &lt;br /&gt;&lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;pcre&amp;nbsp;pcre-devel &lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;zlib&amp;nbsp;zlib-devel &lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;openssl&amp;nbsp;openssl-devel &lt;br /&gt;&lt;br /&gt;./configure&amp;nbsp;--add-module=/usr/local/nginx/nginx-rtmp-module &lt;br /&gt;make &lt;br /&gt;make&amp;nbsp;install&lt;br /&gt;&lt;br /&gt;이제 ffmpeg 설치&lt;br /&gt;1. EPEL 리포지토리 추가 &lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;epel-release&amp;nbsp;-y &lt;br /&gt;참고로 실행 전 yum repolist | grep epel 으로 실행시 이미 설치되어있다면 미진행해도 됨&lt;br /&gt;이런식으로&amp;nbsp;나옴 &lt;br /&gt;epel:&amp;nbsp;ftp.kaist.ac.kr&amp;nbsp;epel/x86_64&amp;nbsp;Extra&amp;nbsp;Packages&amp;nbsp;for&amp;nbsp;Enterprise&amp;nbsp;Linux&amp;nbsp;7&amp;nbsp;-&amp;nbsp;x86_64&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;2. FFmpeg는 기본적으로 CentOS/RHEL의 공식 저장소에는 포함되어 있지 않으므로 FFmpeg 설치를 위해 RPM Fusion 리포지토리 추가&lt;br /&gt;yum&amp;nbsp;localinstall&amp;nbsp;--nogpgcheck&amp;nbsp;&lt;a href=&quot;https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm&lt;/a&gt;&lt;br /&gt;yum&amp;nbsp;localinstall&amp;nbsp;--nogpgcheck&amp;nbsp;&lt;a href=&quot;https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. FFmpeg 설치 &lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;ffmpeg&amp;nbsp;ffmpeg-devel&amp;nbsp;-y &lt;br /&gt;&lt;br /&gt;4. FFmpeg&amp;nbsp;설치&amp;nbsp;확인 &lt;br /&gt;ffmpeg&amp;nbsp;-version &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;만약 설치가 잘 안 된다면 아래 방법으로 시도&lt;br /&gt;wget 또는 curl 설치하며 진행하면 되는데&lt;br /&gt;yum install curl -y&lt;br /&gt;curl&amp;nbsp;-L&amp;nbsp;-o&amp;nbsp;ffmpeg-release-amd64-static.tar.xz&amp;nbsp;&lt;a href=&quot;https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;압축&amp;nbsp;해제 &lt;br /&gt;tar&amp;nbsp;xvf&amp;nbsp;ffmpeg-release-amd64-static.tar.xz &lt;br /&gt;&lt;br /&gt;압축&amp;nbsp;해제된&amp;nbsp;디렉토리로&amp;nbsp;이동 &lt;br /&gt;cd&amp;nbsp;ffmpeg-*-amd64-static &lt;br /&gt;&lt;br /&gt;FFmpeg&amp;nbsp;및&amp;nbsp;FFprobe&amp;nbsp;복사 &lt;br /&gt;해제된 디렉토리 내의 ffmpeg 및 ffprobe 파일을 /usr/local/bin으로 복사 &lt;br /&gt;&lt;br /&gt;cp&amp;nbsp;ffmpeg&amp;nbsp;/usr/local/bin/ &lt;br /&gt;cp&amp;nbsp;ffprobe&amp;nbsp;/usr/local/bin/ &lt;br /&gt;&lt;br /&gt;실행&amp;nbsp;권한&amp;nbsp;부여 &lt;br /&gt;chmod&amp;nbsp;+x&amp;nbsp;/usr/local/bin/ffmpeg &lt;br /&gt;chmod&amp;nbsp;+x&amp;nbsp;/usr/local/bin/ffprobe &lt;br /&gt;&lt;br /&gt;FFmpeg&amp;nbsp;버전&amp;nbsp;확인 &lt;br /&gt;ffmpeg&amp;nbsp;-version &lt;br /&gt;bash:&amp;nbsp;/usr/bin/ffmpeg:&amp;nbsp;그런&amp;nbsp;파일이나&amp;nbsp;디렉터리가&amp;nbsp;없습니다&amp;nbsp;뜨면 &lt;br /&gt;ls -l /usr/local/bin/ffmpeg 로 확인&lt;br /&gt;&lt;br /&gt;여기까지 진행됐다면 다음엔 nginx 설정을 진행한다.&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/658</guid>
      <comments>https://hippalus.tistory.com/658#entry658comment</comments>
      <pubDate>Mon, 1 Jul 2024 18:40:52 +0900</pubDate>
    </item>
    <item>
      <title>node.js를 이용한 분산 소켓 서버 : #5 pm2로 node.js 채팅서버 프로그램 동작</title>
      <link>https://hippalus.tistory.com/655</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pm2에 대해선 다른 블로그들을 참조하길 바란다.&lt;br /&gt;백그라운드 상태에서 내가 만든 프로그램을 돌리고 관리하는 서비스다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;채팅서버는 port번호 8985부터 8987 총 3개를 동작시킬 예정이다.&lt;br /&gt;편의를 위해 sh을 만들겠다.&lt;br /&gt;&lt;br /&gt;앞서 만든 서버 프로그램이 있는 위치에서 vi start.sh로 파일을 만든다.&lt;br /&gt;pm2로 실행할 때 port 번호를 전달하는 방식이다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;# Start Node.js servers with PM2 on ports 8985 to 8987&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;8985..8987}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;do&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;pm2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;start&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;server.js&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;--name&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;app-&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;$port&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;$port&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;done&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;# Show PM2 process list&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;pm2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;ls&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;:wp로 저장하고 나온다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이번엔 종료다.&lt;br /&gt;마찬가지로 vi stop.sh 파일을 만든다.&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;# Stop Node.js servers with PM2 on ports 8985 to 8987&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;8985..8987}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;do&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;pm2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;stop&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;app-&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;$port&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;pm2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;app-&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;$port&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;done&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;# Show PM2 process list&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;pm2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;ls&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #3b3b3b; text-align: start;&quot;&gt;:wp로 저장하고 나온다.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;이제 만든 파일들의 권한을 실행 가능하게 바꿔준다.&lt;br /&gt;chmod&amp;nbsp;+x&amp;nbsp;start.sh &lt;br /&gt;chmod&amp;nbsp;+x&amp;nbsp;stop.sh&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;start.sh를 실행한다.&lt;br /&gt;./start.sh&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6Rtfb/btsHAuxqWRz/UGmwhKYisKM7e3q4h920w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6Rtfb/btsHAuxqWRz/UGmwhKYisKM7e3q4h920w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6Rtfb/btsHAuxqWRz/UGmwhKYisKM7e3q4h920w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6Rtfb%2FbtsHAuxqWRz%2FUGmwhKYisKM7e3q4h920w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;153&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중지하려면&lt;br /&gt;./stop.sh&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwheiZ/btsHzvqyXZd/2wdcSDyWSMkZ8sh1nPgMJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwheiZ/btsHzvqyXZd/2wdcSDyWSMkZ8sh1nPgMJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwheiZ/btsHzvqyXZd/2wdcSDyWSMkZ8sh1nPgMJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwheiZ%2FbtsHzvqyXZd%2F2wdcSDyWSMkZ8sh1nPgMJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;85&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나씩 중지되다가 아래처럼 아무것도 안남게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUGmtj/btsHArtVHgp/qONg9KLkgyGAnYYKraZ1tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUGmtj/btsHArtVHgp/qONg9KLkgyGAnYYKraZ1tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUGmtj/btsHArtVHgp/qONg9KLkgyGAnYYKraZ1tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUGmtj%2FbtsHArtVHgp%2FqONg9KLkgyGAnYYKraZ1tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;31&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/655</guid>
      <comments>https://hippalus.tistory.com/655#entry655comment</comments>
      <pubDate>Sun, 30 Jun 2024 23:23:20 +0900</pubDate>
    </item>
    <item>
      <title>node.js를 이용한 분산 소켓 서버 : #4 node.js로 서버 개발(클라이언트 포함) 추가로 postman으로 테스트</title>
      <link>https://hippalus.tistory.com/654</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버 소스 server.js&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 간단한 버전이라 딱히 설명할게 없다.&lt;br /&gt;클라이언트가 처음 접속할 때 user 아이디와 참여하고자 하는 방번호(그룹으로 묶여 있어서 이 방번호 안에서 발생한 메세지는 해당 방 참여자에게만 전송 용도)를 보내면 이를 map으로 저장해두고&amp;nbsp;&lt;br /&gt;chat 메세지가 수신되면 보내는게 고작이다.&lt;br /&gt;개별 실행하려면 node server.js 8985 처럼 포트번호를 적고 실행하면 동작한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;express&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'express'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;http&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'http'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;socketIO&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'socket.io'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;createClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'redis'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;express&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;http&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;createServer&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;socketIO&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;cors&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;origin&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'*'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;v4&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;uuidv4&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'uuid'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// UUID 생성&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;SERVERID&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;uuidv4&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;SERVERID&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 고유한 UUID 출력&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Redis adapter setup&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisAdapter&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'socket.io-redis'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;createClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;({&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'redis://localhost:6379'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//redisClient.connect().catch(console.error);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'error'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Redis connection error:'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 여기에서 적절한 에러 처리를 수행할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Connected to Redis server'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; })&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Failed to connect to Redis server:'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 여기에서 적절한 에러 처리를 수행할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Store server's UUID in Redis&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'server_id'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;SERVERID&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;adapter&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;redisAdapter&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;PING_INTERVAL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;5000&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 5 seconds&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;CLIENT_TIMEOUT&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;PING_INTERVAL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// double seconds&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Heartbeat channel&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;HEARTBEAT_CHANNEL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;SERVERID&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'_'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'heartbeat'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Function to publish heartbeat&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;publishHeartbeat&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//console.log('Boradcast heartbeat message');&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;publish&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;HEARTBEAT_CHANNEL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'ping'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Start heartbeat interval&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;setInterval&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;publishHeartbeat&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;PING_INTERVAL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Function to check and remove zombie clients&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;checkAndRemoveZombieClients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Checking for zombie clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;serverId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'server_id'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Redis에서 서버의 고유값 가져오기&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hGetAll&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;]);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;serverId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;serverId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 해당 서버의 고유값과 일치하는 클라이언트만 처리&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Date&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;lastPong&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;lastPong&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;lastPong&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;CLIENT_TIMEOUT&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;`Removing zombie client: &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 좀비 클라이언트의 소켓을 disconnect&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;sockets&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;sockets&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;disconnect&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Redis에서 클라이언트 정보 삭제&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hDel&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Start zombie client check interval&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;setInterval&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;checkAndRemoveZombieClients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;PING_INTERVAL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Check every CLIENT_TIMEOUT milliseconds&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Function to check and update client timeout&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;updateClientTimeout&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;updateClientTimeout call! : &quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Date&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clientJson&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hGet&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clientJson&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Client not found, possibly already disconnected&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clientJson&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;lastPong&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Update last pong time&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Check if client was in timeout state before this pong&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;lastPong&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;CLIENT_TIMEOUT&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;`Client &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt; was in timeout state, but responded now.`&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Optionally, you can emit an event to the client to notify that it was nearly disconnected&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;emit&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'timeout-warning'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'You were about to be disconnected due to inactivity.'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Update client info in Redis&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hSet&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'connection'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'A new client has connected.'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;handshake&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;handshake&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Welcome!!!'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Store client information in Redis&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//await redisClient.hSet('clients', socket.id, JSON.stringify({ user, itemseq, socketId: socket.id, lastPong: Date.now() }));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//await redisClient.hSet('clients', socket.id, JSON.stringify({ user, itemseq, socketId: socket.id, lastPong: Date.now() }));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hSet&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;lastPong&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Date&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;serverId&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;SERVERID&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; }));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Failed to store client information in Redis:'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 여기에서 적절한 에러 처리를 수행할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Subscribe client to heartbeat channel&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;duplicate&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;subscribe&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;HEARTBEAT_CHANNEL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'ping'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;emit&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'heartbeat'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'ping'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'heartbeat'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'pong'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Update client's timeout status individually&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;updateClientTimeout&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'data message'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Received message:'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'bid'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;Bid received!!! : &quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Get all clients from Redis&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hGetAll&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clientsToNotify&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; [];&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clients&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;]);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clientsToNotify&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;clientsToNotify&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;Sending to client!&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socketId&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;emit&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'data message'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Handle other types of messages&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'disconnect'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'Client disconnected.'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Unsubscribe from heartbeat channel and close the subscriber&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;unsubscribe&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;HEARTBEAT_CHANNEL&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;quit&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Clean up the reference&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;hDel&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// Start the server on the specified port or default to 8985&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;argv&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;8985&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;listen&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// All redis clients delete.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;redisClient&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;del&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'clients'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;`Server is running on port &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;.`&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 소스&amp;nbsp;&lt;br /&gt;&lt;br /&gt;역시 별거 없다.&lt;br /&gt;&lt;a href=&quot;https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js &lt;/a&gt;갖다쓰고&lt;br /&gt;connect 버튼 누르면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;서버에&lt;span&gt; 접속하고&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;이후 접속되면 타입으로 전송하고 서버에서 오면 받아서 뿌리는게 끝이다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;!DOCTYPE&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;html&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;Socket.IO Chat&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;script&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;&lt;a href=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;&gt;https://code.jquery.com/jquery-3.6.0.min.js&lt;/a&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;ul&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;messages&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;form&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;form&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;action&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;arosones&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;itemseq&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;itemseq&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;a01&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;button&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;connectButton&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;bidamount&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;autocomplete&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;off&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;bidamount&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;button&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;sendButton&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;disabled&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;script&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #e50000;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;&lt;a href=&quot;https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js&quot;&gt;https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js&lt;/a&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;ready&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#connectButton'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;click&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;preventDefault&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#user'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#itemseq'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'&lt;a href=&quot;https://dev.kobay.co.kr:8984'&quot;&gt;https://....:0000'&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;transports&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'websocket'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;reconnectionAttempts&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;reconnectionDelay&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;100&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'error'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'WebSocket connection error:'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 여기에 추가적인 오류 처리 로직을 넣을 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'connect'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'WebSocket connected'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#connectButton'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;prop&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'disabled'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#sendButton'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;prop&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'disabled'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'disconnect'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'WebSocket disconnected'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#connectButton'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;prop&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'disabled'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#sendButton'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;prop&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'disabled'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'data message'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;msg : &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'&amp;lt;li&amp;gt;'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bidamount&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#messages'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'heartbeat'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;heartbeat rcv : &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;msg&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'ping'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 'ping' 메시지를 받으면 즉시 'pong'으로 응답&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;emit&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'heartbeat'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'pong'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#sendButton'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;click&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;preventDefault&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bidamount&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#bidamount'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#itemseq'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bidamount&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;connected&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'bid'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bidamount&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bidamount&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;itemseq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;socket&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;emit&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'data message'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'#bidamount'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다만 중요한 부분은 transports: ['websocket'] 이부분이다.&lt;br /&gt;WebSocket 전송 방식만 사용하는건데 이거 빠지면 사정없이 서버에서 끊어지고 난리도 아니다.&lt;br /&gt;이 부분을 몰라서 이틀을 허비했다. ㅡㅡ&lt;br /&gt;&lt;br /&gt;추가로&lt;br /&gt;포스트맨으로 테스트 하려면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgVb0k/btsHCt1wA56/qDYRkJitWHSlcZXFkAyqI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgVb0k/btsHCt1wA56/qDYRkJitWHSlcZXFkAyqI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgVb0k/btsHCt1wA56/qDYRkJitWHSlcZXFkAyqI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgVb0k%2FbtsHCt1wA56%2FqDYRkJitWHSlcZXFkAyqI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;317&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0pnpX/btsHDF7UjfH/6hDnMUqGDoKisUkpl7RMRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0pnpX/btsHDF7UjfH/6hDnMUqGDoKisUkpl7RMRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0pnpX/btsHDF7UjfH/6hDnMUqGDoKisUkpl7RMRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0pnpX%2FbtsHDF7UjfH%2F6hDnMUqGDoKisUkpl7RMRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;436&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1487&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnZFSM/btsHDA6HIRq/gKuBXol5KuKdgainHiS8lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnZFSM/btsHDA6HIRq/gKuBXol5KuKdgainHiS8lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnZFSM/btsHDA6HIRq/gKuBXol5KuKdgainHiS8lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnZFSM%2FbtsHDA6HIRq%2FgKuBXol5KuKdgainHiS8lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1487&quot; height=&quot;215&quot; data-origin-width=&quot;1487&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/654</guid>
      <comments>https://hippalus.tistory.com/654#entry654comment</comments>
      <pubDate>Sun, 30 Jun 2024 23:12:04 +0900</pubDate>
    </item>
    <item>
      <title>node.js를 이용한 분산 소켓 서버 : #3 centos7에 Redis 설치하기</title>
      <link>https://hippalus.tistory.com/653</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CentOS 7에서 Redis를 설치하는 방법은 다음과 같다.&lt;br /&gt;&lt;br /&gt;1. EPEL 저장소 설치&lt;br /&gt;Redis 패키지는 EPEL 저장소(Extra Packages for Enterprise Linux)를 통해 제공되므로 EPEL 저장소를 시스템에 추가한다.&lt;br /&gt;yum install epel-release&lt;br /&gt;(yum install epel-release yum-utils 로 설치시 유틸리티 도구들도 사용 가능하다)&lt;br /&gt;&lt;br /&gt;2. 저장소를 추가하였다면 Redis 설치한다.&lt;br /&gt;yum install redis&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;설치된 폴더는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/usr/bin이며 실제 시스템 서비스로 관리하기 위해 관리 스크립트가 존재하는 /etc/init.d에서 가지고 놀아야 한다.&lt;br /&gt;서비스 시작 : systemctl&amp;nbsp;start&amp;nbsp;redis&lt;br /&gt;서비스 종료 : systemctl stop redis&lt;br /&gt;서비스 재시작 : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;systemctl&lt;span&gt; restart redis &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;서비스 상태 확인 : systemctl&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; status &lt;/span&gt;redis&lt;/span&gt;&lt;br /&gt;부팅 시 서비스 자동 시작 설정 : systemctl&amp;nbsp;enable&amp;nbsp;redis&lt;br /&gt;일단 서비스를 시작만하자&lt;br /&gt;systemctl&amp;nbsp;start&amp;nbsp;redis &lt;br /&gt;&lt;br /&gt;만약 서비스를 종료하거나 시작하는데 먹통이 되고 바로 커맨드 라인으로 복귀되지 않으면 환경설정을 확인해봐야 한다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;systemctl status redis 로 상태를 확인해 보면&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;redis-shutdown[3419]: ERR Errors trying to SHUTDOWN. Check logs.&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;이런 로그를 확인할 수 있을것이다.&lt;br /&gt;vi나 cat명령어로 로그를 확인해보면&lt;br /&gt;cat /var/log/redis/redis.log&lt;br /&gt;Permission denied가 보인다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터베이스 파일의 권한 문제, 메모리 부족 문제, 설정 파일 문제 등이 있을 수 있을 수 있는데&lt;span&gt;&amp;nbsp;&lt;br /&gt;내 경우 Redis가 백그라운드에서 데이터베이스를 저장하려고 시도했지만, RDB 파일을 저장할 위치에 대한 권한 문제가 발생하여 저장에 실패한 상황이었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oLXci/btsHylvF2kL/4r35hztxdJBTXspsUJOxX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLXci/btsHylvF2kL/4r35hztxdJBTXspsUJOxX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLXci/btsHylvF2kL/4r35hztxdJBTXspsUJOxX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLXci%2FbtsHylvF2kL%2F4r35hztxdJBTXspsUJOxX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;243&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 환경설정을 손봐야 한다.&lt;br /&gt;/etc/redis.conf 또는 /etc/redis/redis.conf 파일을 열어본다.(내 경우 /etc/redis.conf 였다.)&lt;br /&gt;vi /etc/redis.conf 후 /f 명령어로 dir을 n n n 누르다 보면 발견된다.&lt;br /&gt;다행히 경로는 맞다. dir /var/lib/redis&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3dEGs/btsHyD3P8xo/qXh6IkF4dHAftGzMFyR2c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3dEGs/btsHyD3P8xo/qXh6IkF4dHAftGzMFyR2c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3dEGs/btsHyD3P8xo/qXh6IkF4dHAftGzMFyR2c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3dEGs%2FbtsHyD3P8xo%2FqXh6IkF4dHAftGzMFyR2c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;124&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 권한 문제다.&lt;br /&gt;chown&amp;nbsp;redis:redis&amp;nbsp;/var/lib/redis&lt;br /&gt;&lt;br /&gt;Redis 서비스를 재시작 한다.&lt;br /&gt;systemctl&amp;nbsp;restart&amp;nbsp;redis&lt;br /&gt;&lt;br /&gt;이제 서비스를 stop, restart 시 정상 동작하게 되고 로그를 봐도 잘 진행됨이 확인 된다.&lt;br /&gt;cat /var/log/redis/redis.log&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crWEVR/btsHy74uqDl/7XLpRWB5X957cxWrmY1aN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crWEVR/btsHy74uqDl/7XLpRWB5X957cxWrmY1aN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crWEVR/btsHy74uqDl/7XLpRWB5X957cxWrmY1aN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrWEVR%2FbtsHy74uqDl%2F7XLpRWB5X957cxWrmY1aN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;108&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceI3da/btsHyEVZi8W/qmGYRgLzaJurmlL3vPaFFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceI3da/btsHyEVZi8W/qmGYRgLzaJurmlL3vPaFFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceI3da/btsHyEVZi8W/qmGYRgLzaJurmlL3vPaFFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceI3da%2FbtsHyEVZi8W%2FqmGYRgLzaJurmlL3vPaFFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;183&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3. Redis가 원격에서 액세스가 되도록 설정 파일을 바꿔준다.&lt;br /&gt;vi&amp;nbsp;/etc/redis.conf &lt;br /&gt;/127.0.0.1&amp;nbsp;검색해서&amp;nbsp;(혹시&amp;nbsp;또&amp;nbsp;있다면&amp;nbsp;n으로&amp;nbsp;계속&amp;nbsp;검색) &lt;br /&gt;bind&amp;nbsp;127.0.0.1을&amp;nbsp;0.0.0.0&amp;nbsp;으로&amp;nbsp;수정 &lt;br /&gt;변경 내용을 :wq로 저장 후 서비스 재시작 시켜준다.&lt;br /&gt;systemctl&amp;nbsp;restart&amp;nbsp;redis&lt;br /&gt;&lt;br /&gt;하는김에 서버가&amp;nbsp;6379&amp;nbsp;포트&amp;nbsp;수신&amp;nbsp;중인지&amp;nbsp;확인&lt;br /&gt;(Redis는 기본적으로 6379 포트에서 실행) &lt;br /&gt;netstat -tulpn | grep LISTEN&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;14&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eR6Wtf/btsHAr1IL75/Nhq0QfHcGWDrn2mCI0BXT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eR6Wtf/btsHAr1IL75/Nhq0QfHcGWDrn2mCI0BXT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eR6Wtf/btsHAr1IL75/Nhq0QfHcGWDrn2mCI0BXT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeR6Wtf%2FbtsHAr1IL75%2FNhq0QfHcGWDrn2mCI0BXT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;14&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;14&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 확인도 해준다.&lt;br /&gt;Redis 명령창을 실행하면 된다.&lt;br /&gt;redis-cli 입력 후 엔터&lt;br /&gt;ping라고 엔터치면 pong라고 응답이 온다.&lt;br /&gt;기본 명령어( get, set, del )테스트 &lt;br /&gt;&quot;hello&quot;라는 key에 &quot;world&quot;라는 value를 저장 &lt;br /&gt;set&amp;nbsp;hello&amp;nbsp;world &lt;br /&gt;앞서 저장해둔 &quot;hello&quot; key에 해당하는 value를 확인 &lt;br /&gt;get&amp;nbsp;hello&amp;nbsp;엔터 &lt;br /&gt;world&amp;nbsp;확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;여기까지 정상이면 일단 준비는 끝&lt;br /&gt;&lt;br /&gt;조금 응용해보자&lt;br /&gt;Redis 서버의 클라이언트 연결에 관한 정보를 조회하는 데 사용되는 명령어&lt;br /&gt;redis-cli INFO clients 를 입력하면 현재 연결된 클라이언트 정보를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHnQMt/btsIah6jOxL/f9RlulIEQXA37VMIPYgoA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHnQMt/btsIah6jOxL/f9RlulIEQXA37VMIPYgoA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHnQMt/btsIah6jOxL/f9RlulIEQXA37VMIPYgoA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHnQMt%2FbtsIah6jOxL%2Ff9RlulIEQXA37VMIPYgoA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;271&quot; height=&quot;62&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장시킨 키에 해당하는 모든 정보를 조회하는 명령어&lt;br /&gt;HGETALL&amp;nbsp;&lt;br /&gt;&lt;br /&gt;node.js에서 hset으로 clients를 추가했고 이를 삭제하려면&lt;br /&gt;DEL clients&amp;nbsp;&lt;br /&gt;1이 나오면 실제 삭제됨, 0이면 삭제된 값이 없음&lt;br /&gt;(integer)&amp;nbsp;1&lt;br /&gt;(integer) 0&lt;br /&gt;&lt;br /&gt;번외로 뭔가 꼬여서 삭제 / 삭제하는 법을 사족으로 달고자 한다.&lt;br /&gt;이런 오픈소스들은 익숙해지기 전까진 삭제해도 뭔가 껄끄럽다.&lt;br /&gt;프로세스별&amp;nbsp;사용중인&amp;nbsp;포트&amp;nbsp;확인 &lt;br /&gt;netstat&amp;nbsp;-tulpn&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;LISTEN &lt;br /&gt;&lt;br /&gt;Redis&amp;nbsp;서비스가&amp;nbsp;실행&amp;nbsp;중이면&amp;nbsp;중지 &lt;br /&gt;systemctl&amp;nbsp;stop&amp;nbsp;redis &lt;br /&gt;&lt;br /&gt;Redis&amp;nbsp;패키지를&amp;nbsp;제거 &lt;br /&gt;yum&amp;nbsp;remove&amp;nbsp;redis&lt;br /&gt;&lt;br /&gt;Redis&amp;nbsp;관련&amp;nbsp;데이터와&amp;nbsp;설정&amp;nbsp;파일도&amp;nbsp;삭제하려면&amp;nbsp; &lt;br /&gt;rm&amp;nbsp;-rf&amp;nbsp;/etc/redis&amp;nbsp;/var/lib/redis&amp;nbsp;/var/log/redis&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>CentOS7</category>
      <category>REDIS</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/653</guid>
      <comments>https://hippalus.tistory.com/653#entry653comment</comments>
      <pubDate>Sun, 30 Jun 2024 22:58:17 +0900</pubDate>
    </item>
    <item>
      <title>node.js를 이용한 분산 소켓 서버 : #2 centos7에 Nginx 설치</title>
      <link>https://hippalus.tistory.com/651</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. yum 외부 저장소 추가&lt;br /&gt;cd&amp;nbsp;/etc/yum.repos.d&lt;br /&gt;ls를 실행해보면 yum 저장소에는 nginx가 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz3iTx/btsHx8bwegL/JDou9CdPZqaAVE0MoD3Nk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz3iTx/btsHx8bwegL/JDou9CdPZqaAVE0MoD3Nk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz3iTx/btsHx8bwegL/JDou9CdPZqaAVE0MoD3Nk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz3iTx%2FbtsHx8bwegL%2FJDou9CdPZqaAVE0MoD3Nk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;27&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 vi에디터로 /etc/yum.repos.d에 nginx.repo 파일을 생성 후 아래 스크립트를 복사 붙여넣기 한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;[nginx] &lt;br /&gt;name=nginx&amp;nbsp;repo &lt;br /&gt;baseurl=&lt;a href=&quot;http://nginx.org/packages/centos/7/$basearch/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://nginx.org/packages/centos/7/$basearch/&lt;/a&gt;&lt;br /&gt;gpgcheck=1&lt;br /&gt;enabled=1 &lt;br /&gt;&lt;br /&gt;ESC :wq로 저장 후 나와준다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;*참고&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;baseurl에 centos/7로 되어 있는데 만약 centos가 8이면 8을 입력하면 된다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(OS버전 확인 방법은 cat /etc/centos-release)&lt;br /&gt;그리고 gpgcheck 옵션은 리포지토리에서 받은 패키지들의 GPG( GNU Privacy Guard) 서명을 확인할지 여부를 나타내는데 0으로 설정하면 서명을 확인하지 않고 패키지를 설치하게 되는데 무결성 보장, 신뢰성, 보안 취약성 등의 문제가 있을 수도 있으니 그냥 1로 하자.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;enabled 활성화된 리포지토리에서 패키지를 설치할 수 있게 해주는 옵션이다.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;yum&amp;nbsp;install &lt;br /&gt;yum install -y nginx&lt;br /&gt;설치 과정에서 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Public key for nginx-1.26.0-1.el7.ngx.x86_64.rpm is not installed 라며 제대로 설치가 안 될 경우&lt;br /&gt;RPM 패키지가 서명되었지만 시스템에 해당 서명 키가 설치되어 있지 않아 발생하는 것으로 해결 방법은 해당 패키지에 대한 GPG 키를 가져와서 시스템에 추가한 후 다시 yum install -y nginx를 실행하면 된다.&lt;br /&gt;&lt;/span&gt;rpm&amp;nbsp;--import&amp;nbsp;&lt;a href=&quot;https://nginx.org/keys/nginx_signing.key&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nginx.org/keys/nginx_signing.key&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;3.nginx.conf 수정&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;vi 명령어로 vi /etc/nginx/nginx.conf 파일을 수정한다.&lt;br /&gt;* 내 경우 소스로 업체에서 설치를 해뒀는지 vi /usr/local/nginx/conf/nginx.conf로 수정해야 했다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;열어보면 이상한 설정들이 존재하는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QS9GP/btsHzEGNAiY/bRWFXdmuY43MsKSrDKmVmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QS9GP/btsHzEGNAiY/bRWFXdmuY43MsKSrDKmVmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QS9GP/btsHzEGNAiY/bRWFXdmuY43MsKSrDKmVmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQS9GP%2FbtsHzEGNAiY%2FbRWFXdmuY43MsKSrDKmVmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;281&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;눈여겨 볼 곳은 이곳 부터다.&lt;br /&gt;worker_processes auto; &lt;br /&gt;&lt;br /&gt;events&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;worker_connections&amp;nbsp;1024; &lt;br /&gt;} &lt;br /&gt;프로세서의 코어수 만큼 연결 처리를 1024개를 자동으로 감지해서 설정해주는 부분인데&lt;br /&gt;논리적으로야 코어가 16코어면 16 X 1024개니 어마어마하다.&lt;br /&gt;하지만 실제 그만큼 처리 가능할리는 만무하니 이정도로만 알고 지나가겠다.&lt;br /&gt;&lt;br /&gt;로드밸런싱을 위해 옵션을 주면 접속한 클라이언트들을 적절히 배분해준다.&lt;br /&gt;ip_hash가 일반적으로 사용되지만 내 경우 모두 동일한 IP이므로 정상 동작하지 않을것이다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;따라서 아래 두개 중&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;least_conn&lt;/span&gt;을 적용했다.&lt;br /&gt;&lt;br /&gt;다음은 upstream설정이다.&lt;br /&gt;몇개의 서버 프로세스를 실행시킬지에 대한 설정인데 upstream다음에 적당한 이름을 지어주면 된다.&lt;br /&gt;나는 클라이언트가 접속할 포트로 8984를 이용하고, 접속 후 생성된 서버 프로그램용으로 총 3개의 소켓 서버를 사용할 생각이므로 8985 부터 8987까지 추가해뒀다.&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;물리적 서버도 분리하면 더 많은 클라이언트 처리가 가능하겠지만&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;node.js 싱글스레드 방식이므로 하나의 local서버에서 포트만 달리 구성&lt;/b&gt;&lt;/span&gt;해도 나름 효과적이다. &lt;br /&gt;&lt;br /&gt;upstream의 이름을 난 그냥 node_app이라 지었고&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;upstream node_app {&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;least_conn&lt;/span&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server&amp;nbsp;127.0.0.1:&lt;span style=&quot;color: #ee2323;&quot;&gt;8985&lt;/span&gt;;&amp;nbsp;&amp;nbsp;#&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;Node.js&amp;nbsp;인스턴스&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server&amp;nbsp;127.0.0.1:&lt;span style=&quot;color: #ee2323;&quot;&gt;8986&lt;/span&gt;;&amp;nbsp;&amp;nbsp;#&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;Node.js&amp;nbsp;인스턴스&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server&amp;nbsp;127.0.0.1:&lt;span style=&quot;color: #ee2323;&quot;&gt;8987&lt;/span&gt;;&amp;nbsp;&amp;nbsp;#&amp;nbsp;세&amp;nbsp;번째&amp;nbsp;Node.js&amp;nbsp;인스턴스&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;인스턴스를&amp;nbsp;추가&lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;그리고 로드밸런싱을 어떤 방식으로 할지 적어주면 되는데&amp;nbsp;&lt;br /&gt;아래 4가지 중 하나를 선택하면 된다.&lt;br /&gt;난 현재 연결 수가 가장 적은 서버로 연결되는 방식인 least_conn 방식을 선택했다.&lt;br /&gt;&lt;br /&gt;least_conn:&amp;nbsp;현재&amp;nbsp;연결&amp;nbsp;수가&amp;nbsp;가장&amp;nbsp;적은&amp;nbsp;서버로&amp;nbsp;요청&lt;br /&gt;round_robin&amp;nbsp;(기본값):&amp;nbsp;순차적으로&amp;nbsp;각&amp;nbsp;서버에&amp;nbsp;요청&lt;br /&gt;ip_hash : 해시값이&amp;nbsp;3이고&amp;nbsp;서버가&amp;nbsp;5개&amp;nbsp;있다면,&amp;nbsp;3&amp;nbsp;%&amp;nbsp;5&amp;nbsp;=&amp;nbsp;3&amp;nbsp;이므로&amp;nbsp;4번째&amp;nbsp;서버(0부터&amp;nbsp;시작하므로)가&amp;nbsp;선택&lt;br /&gt;least_time&amp;nbsp;:&amp;nbsp;요청을&amp;nbsp;처리하는&amp;nbsp;데&amp;nbsp;걸리는&amp;nbsp;시간에&amp;nbsp;기반하여&amp;nbsp;서버를&amp;nbsp;선택하며&amp;nbsp;least_time&amp;nbsp;header&amp;nbsp;또는&amp;nbsp;least_time&amp;nbsp;last_byte&amp;nbsp;옵션으로&amp;nbsp;사용&lt;br /&gt;&lt;br /&gt;같은 서버에 port 번호만 다르게 해서 실행할거니 server 127.0.0.1 그리고 포트 번호를 적어줬다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 추가한 upstream을 호출하는 부분이다.&lt;br /&gt;http를 사용한다면 그냥 80쪽에 추가하면 되지만&lt;br /&gt;server { &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;listen 80;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;listen 8984;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;https(SSL)을 사용하여 통신하겠다면 listen 443 ssl아래에 아래처럼 소켓 클라이언트가 접속할 포트를 추가해주면 되겠다.&lt;br /&gt;내가 지정한 포트는 8984다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;server&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;443&amp;nbsp;ssl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;8984&amp;nbsp;ssl; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 이하 ssl 구성 (pem, cache, protocols TLS...등등) 생략&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;이제 가장 중요한 /socket.io 설정 부분이다.&lt;br /&gt;이부분 때문에 좀 헤맸다.&lt;br /&gt;proxy_pass : 앞서 upstream으로 분산처리를 하였는데 이 upstream이름을 적어주면 된다.&lt;br /&gt;limit_conn conn_limit_per_ip : 클라이언트가 몇개 이상 접속하게 되면 자동으로 차단하여 서버를 보호할 것이다. 난 테스트 해보니 8000개까지 처리 가능하였다.&lt;br /&gt;다른 설정들은 그냥 복사하면 그만이다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location /socket.io/ {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;limit_conn&amp;nbsp;conn_limit_per_ip&lt;/span&gt;&amp;nbsp;8000; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;X-Forwarded-For&amp;nbsp;$proxy_add_x_forwarded_for; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;Host&amp;nbsp;$host; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;proxy_pass&amp;nbsp;&lt;/span&gt;http://backsvr; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;X-Server-Name&amp;nbsp;$upstream_addr; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;enable&amp;nbsp;WebSockets &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_http_version&amp;nbsp;1.1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;Upgrade&amp;nbsp;$http_upgrade; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_set_header&amp;nbsp;Connection&amp;nbsp;&quot;upgrade&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가된 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nOIxZ/btsH9orwWB0/0ym6eGVE4AXurWaqIF1EH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nOIxZ/btsH9orwWB0/0ym6eGVE4AXurWaqIF1EH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nOIxZ/btsH9orwWB0/0ym6eGVE4AXurWaqIF1EH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOIxZ%2FbtsH9orwWB0%2F0ym6eGVE4AXurWaqIF1EH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;146&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS0QQR/btsH82vvGQp/eeqrNdtc3GqCbrb3AVKOpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS0QQR/btsH82vvGQp/eeqrNdtc3GqCbrb3AVKOpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS0QQR/btsH82vvGQp/eeqrNdtc3GqCbrb3AVKOpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS0QQR%2FbtsH82vvGQp%2FeeqrNdtc3GqCbrb3AVKOpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;270&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/szbl3/btsIbtkEdSt/VD4RCkmW1227g4e0peUXk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/szbl3/btsIbtkEdSt/VD4RCkmW1227g4e0peUXk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/szbl3/btsIbtkEdSt/VD4RCkmW1227g4e0peUXk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fszbl3%2FbtsIbtkEdSt%2FVD4RCkmW1227g4e0peUXk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;76&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4U6gq/btsH9vqqbXL/2OibH1O7rTi21UXKD5sej1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4U6gq/btsH9vqqbXL/2OibH1O7rTi21UXKD5sej1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4U6gq/btsH9vqqbXL/2OibH1O7rTi21UXKD5sej1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4U6gq%2FbtsH9vqqbXL%2F2OibH1O7rTi21UXKD5sej1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;214&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;4. Nginx 재시작 하여 설정 변경 사항 적용&lt;br /&gt;Nginx가 설치된 위치는 내 경우 /usr/sbin아래이므로&lt;br /&gt;/usr/sbin/nginx&amp;nbsp;-s&amp;nbsp;reload&lt;br /&gt;&lt;br /&gt;여기까지 Nginx 준비는 끝이다.&lt;br /&gt;&lt;br /&gt;실행 : systemctl&amp;nbsp;start&amp;nbsp;nginx&lt;br /&gt;중지 : systemctl stop nginx&lt;br /&gt;재시작 : systemctl restart nginx&lt;br /&gt;상태 : systemctl status nginx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 만약 nginx 실행 문제가 발생할 경우 확인하는 방법을 설명하자면&lt;br /&gt;만약 path가 없어서 nginx -t명령어 실행이 불가능할 경우&lt;br /&gt;whereis nginx 으로 nginx가 어디에 설치되어 있는지 확인하고 (보통 /usr/sbin 폴더에 있다.)&lt;br /&gt;&lt;br /&gt;수정된&amp;nbsp;conf파일&amp;nbsp;검사&amp;nbsp;:&amp;nbsp;/usr/local/nginx/sbin/nginx&amp;nbsp;-t&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boQ9GD/btsHy99aCib/O1NFMVk01vGyynwchpKQ5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boQ9GD/btsHy99aCib/O1NFMVk01vGyynwchpKQ5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boQ9GD/btsHy99aCib/O1NFMVk01vGyynwchpKQ5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboQ9GD%2FbtsHy99aCib%2FO1NFMVk01vGyynwchpKQ5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;25&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;25&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 nginx 중지 : /usr/local/nginx/sbin/nginx -s stop &lt;br /&gt;수정 후 nginx 실행 : /usr/local/nginx/sbin/nginx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순서대로 진행하면 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>nginx</category>
      <category>Node.js</category>
      <category>WebSocket</category>
      <category>로드밸런싱</category>
      <category>웹소켓</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/651</guid>
      <comments>https://hippalus.tistory.com/651#entry651comment</comments>
      <pubDate>Sun, 30 Jun 2024 20:11:56 +0900</pubDate>
    </item>
    <item>
      <title>node.js를 이용한 분산 소켓 서버 : #1 개념 및 설계</title>
      <link>https://hippalus.tistory.com/652</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소켓&amp;nbsp;프로그램을&amp;nbsp;만드는건&amp;nbsp;매우&amp;nbsp;쉽다. &lt;br /&gt;하지만&amp;nbsp;잘&amp;nbsp;만드는건&amp;nbsp;어렵다. &lt;br /&gt;&lt;br /&gt;소켓&amp;nbsp;프로그램은&amp;nbsp;일반&amp;nbsp;응용어플리케이션과&amp;nbsp;달리&amp;nbsp;외부&amp;nbsp;영향과&amp;nbsp;다양한&amp;nbsp;변수가&amp;nbsp;존재한다. &lt;br /&gt;웹소켓은&amp;nbsp;그나마&amp;nbsp;TCP/IP와&amp;nbsp;달리&amp;nbsp;수월한&amp;nbsp;편에&amp;nbsp;속하지만&amp;nbsp;여전히&amp;nbsp;잘&amp;nbsp;만드는건&amp;nbsp;어렵다. &lt;br /&gt;&lt;br /&gt;이번에&amp;nbsp;작업할&amp;nbsp;내용은&amp;nbsp;비교적&amp;nbsp;간단한&amp;nbsp;채팅방&amp;nbsp;개념의&amp;nbsp;다중&amp;nbsp;채팅이다. &lt;br /&gt;즉&amp;nbsp;여러&amp;nbsp;클라이언트가&amp;nbsp;소켓&amp;nbsp;서버에&amp;nbsp;접속해서&amp;nbsp;각각&amp;nbsp;원하는&amp;nbsp;방에&amp;nbsp;입장하고&amp;nbsp;해당&amp;nbsp;방에서&amp;nbsp;발생한&amp;nbsp;대화는&amp;nbsp;해당&amp;nbsp;방에만&amp;nbsp;전달되는&amp;nbsp;전통적인&amp;nbsp;그&amp;nbsp;채팅이다. &lt;br /&gt;&lt;br /&gt;기본적인 부분은 차치하고 설계시 고려대상으로 둔 부분은 몇 개의 클라이언트를 지원할 것인가였다.&lt;br /&gt;&lt;br /&gt;나름 최대 4000개 이상의 클라이언트를 지원할 생각이다.&lt;br /&gt;&lt;br /&gt;그럼 하나의 서버가 이를 다 커버할 수 있을까?&lt;br /&gt;대답은 No&lt;br /&gt;&lt;br /&gt;이때 사용할 기술이 PM2, Redis, Nginx다.&lt;br /&gt;PM2는 멀티 프로세스로 서버 소켓 프로그램을 실행할 것이고&lt;br /&gt;Nginx는 멀티 프로세스로 실행되는 서버 소켓 프로그램의 분배 접속에&amp;nbsp;&lt;br /&gt;Redis는 멀티 프로세스간의 대화 내용을 공유하게 만들어주는 기술로 활용할 것이다.&lt;br /&gt;&lt;br /&gt;이제 하나씩 진행해보자.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>nginx</category>
      <category>Node.js</category>
      <category>REDIS</category>
      <category>socket</category>
      <category>WebSocket</category>
      <category>분산</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/652</guid>
      <comments>https://hippalus.tistory.com/652#entry652comment</comments>
      <pubDate>Sat, 1 Jun 2024 20:01:50 +0900</pubDate>
    </item>
    <item>
      <title>5. node.js 어플리케이션에서 postgreSQL DB 조회에 사용할 계정 만들고 직접 구현해보기</title>
      <link>https://hippalus.tistory.com/650</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 리눅스 centos에 postgreSQL을 설치해 보았다.&lt;br /&gt;&lt;a href=&quot;https://hippalus.tistory.com/649&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hippalus.tistory.com/649&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이제 설치된 리눅스 postgreSQL에 어플리케이션으로 접속하여 DB를 조회해 볼 예정인데 일단 손쉬운 node.js로 구현해보려 한다.&lt;br /&gt;&lt;br /&gt;일전에 로컬 DB에 user를 만들었을 당시엔 편의상 pgAdmin에서 생성( &lt;a href=&quot;https://hippalus.tistory.com/648&quot;&gt;https://hippalus.tistory.com/648&lt;/a&gt; )했는데 이번엔 리눅스 서버에 설치된 postgreSQL에 계정을 psql을 이용해 생성해보고 어플리케이션에서 접근할 테이블과 관련한 권한 설정도 진행해보려 한다.&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;지금은 tester 라는 계정을 만들며 작업을 진행하겠다.&lt;/span&gt;&lt;br /&gt;이미 앞전 포스팅에서 tester와 testdb를 만든 상태라면 2번과 3번은 패싱~&lt;br /&gt;&lt;br /&gt;1. 리눅스 터미널에 su 계정으로 접속되어 있단 가정하에 먼저 su계정에서 postgres계정으로 전환하자.&lt;br /&gt;su&amp;nbsp;-&amp;nbsp;postgres &lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;psql을 입력 후 엔터를 친다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;i&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/i&gt;커맨드 상태에서 &lt;b&gt;CREATE USER tester WITH PASSWORD '적당한 암호';&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;엔터를 치면 CREATE ROLE 이라고 나와야 한다.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;3. testdb라는 테스트용 DB를 만들어본다.(이미 만든 상태라면 pass)&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;CREATE DATABASE testdb;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 일단 여기까지 기본 준비는 끝이고 이제 본격적으로 어플리케이션에서 tester의 설정을 만져보려한다.&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tester 계정은 단순히 어플리케이션단에서 SELECT, INSERT, UPDATE, DELETE 정도의 권한만 부여받은채로 실행될 계정이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이용자가 사용할 계정인데 SUPER USER 권한이 부여된채로 노출됐다가 무슨 일이 생길지 모르기 때문이다.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;내가 사용할 DB는 testdb이므로 testdb로 실행해야 하므로 testdb로 사용 DB를 바꿔준다.&lt;br /&gt;\c testdb 를 입력하고 엔터&lt;br /&gt;그럼 이렇게 뜰 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c45bHC/btsHnkwKhL9/e6rixlgBIaPOjxOGm4g1d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c45bHC/btsHnkwKhL9/e6rixlgBIaPOjxOGm4g1d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c45bHC/btsHnkwKhL9/e6rixlgBIaPOjxOGm4g1d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc45bHC%2FbtsHnkwKhL9%2Fe6rixlgBIaPOjxOGm4g1d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;45&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;5. 이제 해야 할 일은 이 testdb에서 table이 생성될 때 마다 자동으로 programuser 계정으로 SELECT, INSERT, UPDATE, DELETE 권한이 부여되게 만들어야 한다.&lt;br /&gt;&lt;br /&gt;'public'&amp;nbsp;스키마의&amp;nbsp;모든&amp;nbsp;테이블에&amp;nbsp;대한&amp;nbsp;기본&amp;nbsp;권한&amp;nbsp;부여 &lt;br /&gt;ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;tester&lt;span&gt; &lt;/span&gt;&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;만약 이전에 생성한 테이블들이 있다면 아래처럼 한 번 더 실행해준다.&lt;br /&gt;'public' 스키마의 모든 테이블에 대해 'appuser'에게 권한 부여&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO&lt;span&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;tester&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;참고로 취소는 다음과 같다.&lt;br /&gt;'public'&amp;nbsp;스키마의&amp;nbsp;모든&amp;nbsp;테이블에&amp;nbsp;대한&amp;nbsp;기본&amp;nbsp;권한&amp;nbsp;취소 &lt;br /&gt;ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT, INSERT, UPDATE, DELETE ON TABLES FROM &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;tester&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;'public'&amp;nbsp;스키마의&amp;nbsp;모든&amp;nbsp;테이블에&amp;nbsp;대한&amp;nbsp;권한&amp;nbsp;취소 &lt;br /&gt;REVOKE SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;tester&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;6. 테이블이 만들어질 때마다 tester계정에 해당 테이블을 SELECT, INSERT, UPDATE, DELETE권한이 자동으로 부여되게 만들었으니 board_tbl을 만들자.&lt;br /&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;public.board_tbl&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b_idx&amp;nbsp;integer&amp;nbsp;NOT&amp;nbsp;NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b_title&amp;nbsp;text&amp;nbsp;COLLATE&amp;nbsp;pg_catalog.&quot;default&quot;&amp;nbsp;NOT&amp;nbsp;NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b_content&amp;nbsp;text&amp;nbsp;COLLATE&amp;nbsp;pg_catalog.&quot;default&quot;&amp;nbsp;NOT&amp;nbsp;NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONSTRAINT&amp;nbsp;board_tbl_pkey&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;(b_idx)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;7. 이제 기본 DB의 user작업은 끝났다.&lt;br /&gt;node.js로 board_tbl을 select해보겠다.&lt;br /&gt;insert 문을 이용해 데이터를 넣어보자.&lt;br /&gt;insert&amp;nbsp;into&amp;nbsp;board_tbl&amp;nbsp;(b_idx,&amp;nbsp;b_title,&amp;nbsp;b_content)&amp;nbsp;values&amp;nbsp;(1,&amp;nbsp;'title',&amp;nbsp;'content'); &lt;br /&gt;insert&amp;nbsp;into&amp;nbsp;board_tbl&amp;nbsp;(b_idx,&amp;nbsp;b_title,&amp;nbsp;b_content)&amp;nbsp;values&amp;nbsp;(2,&amp;nbsp;'title2',&amp;nbsp;'content2'); &lt;br /&gt;insert&amp;nbsp;into&amp;nbsp;board_tbl&amp;nbsp;(b_idx,&amp;nbsp;b_title,&amp;nbsp;b_content)&amp;nbsp;values&amp;nbsp;(3,&amp;nbsp;'title3',&amp;nbsp;'content3');&lt;br /&gt;&lt;br /&gt;8. 드디어 node.js 프로그래밍&lt;br /&gt;(node.js설치는 검색해서 알아서~)&lt;br /&gt;&lt;br /&gt;node.js에서 postgreSQL을 접근하려면 pg 모듈을 설치해야 한다.&lt;br /&gt;npm i pg를 터미널에서 입력하면 잘 설치 된다.&lt;br /&gt;&lt;br /&gt;그다음 실제 소스 구현이다.&lt;br /&gt;app.js라는 파일을 만들고 아래와 같이 타이핑하자.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'pg'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// PostgreSQL 연결 정보 설정&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;({&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'tester'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, //아까 생성한 어플리케이션용 계정&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'000.000.000.000'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, //postgreSQL이 설치된 서버의 ip&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'testdb'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, //생성한 DB명&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'적당한암호'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, //어플리케이션용 계정의 비밀번호&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5432&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;// PostgreSQL 기본 포트 번호&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// PostgreSQL 데이터베이스에 연결&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// board_tbl 테이블에서 데이터 조회&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'SELECT * FROM board_tbl'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'error :'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'result :'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;row&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;rows&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;row&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 데이터베이스 연결 종료&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;저장 후 실행&lt;br /&gt;node app.js 엔터&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhhPS/btsHnHSziLI/rqYqgd8xwHPQjKLY6I9lP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhhPS/btsHnHSziLI/rqYqgd8xwHPQjKLY6I9lP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhhPS/btsHnHSziLI/rqYqgd8xwHPQjKLY6I9lP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlhhPS%2FbtsHnHSziLI%2FrqYqgd8xwHPQjKLY6I9lP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;391&quot; height=&quot;52&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
잘~ 나온다.&lt;br /&gt;&lt;br /&gt;만약 정보가 틀리거나 권한이 없거나 그러면 이런 오류를 발견하게 될 것이다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v04ES/btsHneiPq1a/l6KRZXkEDy31hgD2lxzuS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v04ES/btsHneiPq1a/l6KRZXkEDy31hgD2lxzuS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v04ES/btsHneiPq1a/l6KRZXkEDy31hgD2lxzuS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv04ES%2FbtsHneiPq1a%2Fl6KRZXkEDy31hgD2lxzuS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1082&quot; height=&quot;416&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;</description>
      <category>postgreSQL</category>
      <category>Node.js</category>
      <category>postgresql</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/650</guid>
      <comments>https://hippalus.tistory.com/650#entry650comment</comments>
      <pubDate>Mon, 13 May 2024 19:41:23 +0900</pubDate>
    </item>
    <item>
      <title>4. 리눅스에서 postgreSQL 16 설치해보기 (실패 후 15 설치)</title>
      <link>https://hippalus.tistory.com/649</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://www.postgresql.org/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.postgresql.org/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbR0oq/btsHjVDgZy9/j8gZE4UM7FOQgxzzfFhMYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbR0oq/btsHjVDgZy9/j8gZE4UM7FOQgxzzfFhMYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbR0oq/btsHjVDgZy9/j8gZE4UM7FOQgxzzfFhMYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbR0oq%2FbtsHjVDgZy9%2Fj8gZE4UM7FOQgxzzfFhMYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1161&quot; height=&quot;341&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;일단 리눅스를 선택한다.&lt;br /&gt;그럼 바로 아래에 OS선택이 뜨는데 난 centos7이니 Red Hat을 선택했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eszas/btsHlt61V3K/4uwGqNwUVoBykjS2KeMXzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eszas/btsHlt61V3K/4uwGqNwUVoBykjS2KeMXzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eszas/btsHlt61V3K/4uwGqNwUVoBykjS2KeMXzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEszas%2FbtsHlt61V3K%2F4uwGqNwUVoBykjS2KeMXzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;138&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이 페이지로 이동하는데&lt;br /&gt;&lt;a href=&quot;https://www.postgresql.org/download/linux/redhat/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.postgresql.org/download/linux/redhat/&lt;/a&gt;&lt;br /&gt;조금만 스크롤 하면 이런 화면이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MLFow/btsHkkC3gGY/ngPpkjOFDToXp5tO3OemKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MLFow/btsHkkC3gGY/ngPpkjOFDToXp5tO3OemKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MLFow/btsHkkC3gGY/ngPpkjOFDToXp5tO3OemKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMLFow%2FbtsHkkC3gGY%2FngPpkjOFDToXp5tO3OemKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;297&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 버전을 다운받을지 플랫폼은 뭔지 아키텍쳐는 뭔지 선택하면 설치 스크립트가 나오는데&lt;br /&gt;난 최신 버전 16과 CentOS7 선택했고 아키텍쳐 확인은 리눅스(centos 7)에서 아래 명령어로 확인한다.&lt;br /&gt;uname&amp;nbsp;-m &lt;br /&gt;난 x86_64가 나왔다.&lt;br /&gt;그럼 아래와 같은 스크립트가 나온다. 복사한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;sudo yum install -y &lt;a href=&quot;https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm&quot;&gt;https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;sudo yum install -y postgresql16-server&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;sudo /usr/pgsql-16/bin/postgresql-16-setup initdb&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;sudo systemctl enable postgresql-16&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;sudo systemctl start postgresql-16&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;리눅스에서 su권한을 획득한 상태에서 첫번째 스크립트 yum을 실행한다.&lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;&lt;a href=&quot;https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0YRpQ/btsHla0YsqQ/MuZNKrg74kNjsrWg7eD6Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0YRpQ/btsHla0YsqQ/MuZNKrg74kNjsrWg7eD6Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0YRpQ/btsHla0YsqQ/MuZNKrg74kNjsrWg7eD6Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0YRpQ%2FbtsHla0YsqQ%2FMuZNKrg74kNjsrWg7eD6Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1575&quot; height=&quot;456&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 성공.&lt;br /&gt;&lt;br /&gt;두번째 스크립트 실행&lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;postgresql16-server&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5bCjR/btsHishF993/kURTXRamKSxxyazNGwkoH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5bCjR/btsHishF993/kURTXRamKSxxyazNGwkoH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5bCjR/btsHishF993/kURTXRamKSxxyazNGwkoH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5bCjR%2FbtsHishF993%2FkURTXRamKSxxyazNGwkoH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;223&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error가 뜬다. 썩을&lt;br /&gt;yum list | grep postgresql16 명령어로 postgresql16을 설치할 수 있는패키지 항목을 조회해 보았으나 아무것도 없었다.&lt;br /&gt;&lt;br /&gt;yum list | grep postgresql15명령어로 확인해보니 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tqkP0/btsHi4AGpxX/w6bIhYzw0OiIo5y9KW72nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tqkP0/btsHi4AGpxX/w6bIhYzw0OiIo5y9KW72nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tqkP0/btsHi4AGpxX/w6bIhYzw0OiIo5y9KW72nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtqkP0%2FbtsHi4AGpxX%2Fw6bIhYzw0OiIo5y9KW72nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;169&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 계획을 바꿔서 15를 설치해보겠다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;yum&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;postgresql15-server&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMWCbU/btsHlHYgNIt/5xFYyv5ENu8GOCAZQxeA41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMWCbU/btsHlHYgNIt/5xFYyv5ENu8GOCAZQxeA41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMWCbU/btsHlHYgNIt/5xFYyv5ENu8GOCAZQxeA41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMWCbU%2FbtsHlHYgNIt%2F5xFYyv5ENu8GOCAZQxeA41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;550&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공&lt;br /&gt;&lt;br /&gt;postgresql15-server&amp;nbsp;설치가&amp;nbsp;완료됬다면&amp;nbsp;/usr/pgsql-15&amp;nbsp;경로에서&amp;nbsp;확인이&amp;nbsp;가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;111&quot; data-origin-height=&quot;11&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY5nFU/btsHkhGiQI0/aUKakkIYNIAJrgkBWXi9k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY5nFU/btsHkhGiQI0/aUKakkIYNIAJrgkBWXi9k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY5nFU/btsHkhGiQI0/aUKakkIYNIAJrgkBWXi9k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY5nFU%2FbtsHkhGiQI0%2FaUKakkIYNIAJrgkBWXi9k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;111&quot; height=&quot;11&quot; data-origin-width=&quot;111&quot; data-origin-height=&quot;11&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 setup을 진행한다.&lt;br /&gt;/usr/pgsql-15/bin/postgresql-15-setup initdb&lt;br /&gt;cd /usr/pgsql-15/bin/명령어로 이동해서 실행을 해도 된다. &lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dK3FxG/btsHi6edfaI/WK8EqfSaF8K0Q4v5qCECI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dK3FxG/btsHi6edfaI/WK8EqfSaF8K0Q4v5qCECI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dK3FxG/btsHi6edfaI/WK8EqfSaF8K0Q4v5qCECI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdK3FxG%2FbtsHi6edfaI%2FWK8EqfSaF8K0Q4v5qCECI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;212&quot; height=&quot;16&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;16&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; PostgreSQL&amp;nbsp;기동&lt;br /&gt;systemctl start postgresql-15&lt;br /&gt;(재기동은 restart를 쓰면된다.) &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;일단 기초 설치는 이걸로 끝이다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;이제 su계정에서 postgres 계정으로 전환하고 나머지 설정을 손보려한다.&lt;br /&gt;&lt;br /&gt;su - postgres&lt;br /&gt;pwd를 실행해보면&amp;nbsp; 현재 위치가 /var/lib/pgsql로 나타난다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;원격접속 설정을 위해 /var/lib/pgsql/15/data/pg_hba.conf 를 vi에디터로 편집한다.&lt;br /&gt;vi /var/lib/pgsql/15/data/pg_hba.conf&lt;br /&gt;아래로 스크롤 해보면 local connection 설정부분이 나온다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGFyyt/btsHlMefk0l/fStVaWoc02R1aKHlnft5Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGFyyt/btsHlMefk0l/fStVaWoc02R1aKHlnft5Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGFyyt/btsHlMefk0l/fStVaWoc02R1aKHlnft5Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGFyyt%2FbtsHlMefk0l%2FfStVaWoc02R1aKHlnft5Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;179&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;#&amp;nbsp;IPv4&amp;nbsp;local&amp;nbsp;connections: &lt;br /&gt;host&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;127.0.0.1/32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scram-sha-256&amp;nbsp; 요 아래에 0.0.0.0/0... 을 추가한다.&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;host&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0.0.0/0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scram-sha-256&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 postgresql.conf파일이다.&lt;br /&gt;마찬가지로 vi에디터로 편집해주자.&lt;br /&gt;vi&amp;nbsp;/var/lib/pgsql/15/data/postgresql.conf &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnFM3a/btsHjZZWHdI/FZ3IeD7JQ37YwGsX8HVNPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnFM3a/btsHjZZWHdI/FZ3IeD7JQ37YwGsX8HVNPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnFM3a/btsHjZZWHdI/FZ3IeD7JQ37YwGsX8HVNPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnFM3a%2FbtsHjZZWHdI%2FFZ3IeD7JQ37YwGsX8HVNPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;172&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;listen_addresses를 보면 localhost가 있는데 이를 *로 바꿔준다.&lt;br /&gt;저장하고 나와서 exit명령어를 입력하여 su계정으로 전환하자.&lt;br /&gt;환경 설정이 바뀌었으니 &lt;span style=&quot;color: #ee2323;&quot;&gt;su계정으로 postgreSQL을 재시작해주자.&lt;/span&gt;&lt;br /&gt;exit를 입력하면 다시 su 상태가 된다.&lt;br /&gt;&lt;br /&gt;systemctl&amp;nbsp;restart&amp;nbsp;postgresql-15 &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;참고로 처음 제공된 스크립트들 중&amp;nbsp; systemctl enable postgresql-15는 OS가 기동될때 자동으로 postgresql 서버가 실행되도록 하는 설정이다.&lt;br /&gt;실행하면 이런 처리 결과를 확인할 수 있게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;15&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3l1cE/btsHlHDY7mA/8WUTwil2m1OsED8Xxdddt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3l1cE/btsHlHDY7mA/8WUTwil2m1OsED8Xxdddt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3l1cE/btsHlHDY7mA/8WUTwil2m1OsED8Xxdddt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3l1cE%2FbtsHlHDY7mA%2F8WUTwil2m1OsED8Xxdddt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;15&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;15&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;어찌 저찌 외부 접속까지는 다 됐는데 그럼 남은건 외부에서 어떤 계정을 사용해서 접근하게 만들지를 설정할 단계다.&lt;br /&gt;다시 postgres계정으로 전환하자&lt;br /&gt;su - postgres&lt;br /&gt;&lt;br /&gt;그리고 psql을 실행 후 postgres=# 상태가 확인된다면&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;\du&amp;nbsp; 명령어를 입력해 사용자명, 권한, 소유한 데이터베이스 등의 정보를 표시해 본다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7TGzl/btsHiLakCNT/ypbzdO8aWBOkRuKapWNk60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7TGzl/btsHiLakCNT/ypbzdO8aWBOkRuKapWNk60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7TGzl/btsHiLakCNT/ypbzdO8aWBOkRuKapWNk60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7TGzl%2FbtsHiLakCNT%2FypbzdO8aWBOkRuKapWNk60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;96&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;나님이 슈퍼유저란 뜻이다.&lt;br /&gt;당연히 계정 생성이 가능하다.&lt;br /&gt;외부 접속을 하려면 새로운 db user 를 생성하거나 postgres(관리자)의 password 를 설정해야 한다.&lt;br /&gt;난 둘 다 하겠다.&lt;br /&gt;&lt;br /&gt;먼저 관리자 password 설정&lt;br /&gt;alter user postgres with password '원하는비밀번호입력'; &lt;br /&gt;ALTER ROLE 라고 뜨면 성공이다.&lt;br /&gt;&lt;br /&gt;다음은 외부 접속용 아이디 생성&lt;br /&gt;create user tester with password ' &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;원하는비밀번호입력&lt;/span&gt; ';&lt;br /&gt;CREATE ROLE 라고 뜨면 성공이다.&lt;br /&gt;&lt;br /&gt;DB도 만들어주자&lt;br /&gt;createdb testdb;&lt;br /&gt;간단하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이제 내 PC(맥)에서 접속을 해보자.&lt;br /&gt;&lt;/span&gt;(솔직히 이 부분에서 몇 시간을 소비해버렸다. 난 분명히 postgresql.conf 파일의 설정을 외부 접속 가능하도록 위에서 진행했는데... 한참 삽질 하다보니 바뀌어 있지 않았다. -_-)&lt;br /&gt;&lt;br /&gt;pgAdmin4를 실행해서 Servers에서 마우스 오른쪽을 눌러보니 Register가 보인다. 그 옆엔 Server가 있으니 이를 선택하자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.02.11.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzTAd/btsHlKPB8W7/mPyacqmOxzXPRwKsdqqCt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzTAd/btsHlKPB8W7/mPyacqmOxzXPRwKsdqqCt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzTAd/btsHlKPB8W7/mPyacqmOxzXPRwKsdqqCt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzTAd%2FbtsHlKPB8W7%2FmPyacqmOxzXPRwKsdqqCt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.02.11.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그럼 Register 새창이 뜨고 여기에 Name에 내가 원하는 식별 이름을 적어주자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.05.06.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx21qk/btsHmXGT4iP/66JZok8K42HDeVU7Kbrbwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx21qk/btsHmXGT4iP/66JZok8K42HDeVU7Kbrbwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx21qk/btsHmXGT4iP/66JZok8K42HDeVU7Kbrbwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx21qk%2FbtsHmXGT4iP%2F66JZok8K42HDeVU7Kbrbwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1398&quot; height=&quot;904&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.05.06.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그 옆 탭은 Connection 당연히 postgreSQL이 설치된 ip를 host name/address에 적어주고&lt;br /&gt;port는 기본 port인 5432&lt;br /&gt;db는 내가 생성한 db인 testdb&amp;nbsp;&lt;br /&gt;username도 내가 일전에 생성한 userid&lt;br /&gt;password도 아까 user생성할 때 함께 적었던 그 비번을 넣으면 된다.&lt;br /&gt;그리고 Save&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.05.42.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;1090&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJO4aR/btsHm2haSGi/j9hkfTEJ34aBhRBIpivNp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJO4aR/btsHm2haSGi/j9hkfTEJ34aBhRBIpivNp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJO4aR/btsHm2haSGi/j9hkfTEJ34aBhRBIpivNp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJO4aR%2FbtsHm2haSGi%2Fj9hkfTEJ34aBhRBIpivNp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1390&quot; height=&quot;1090&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.05.42.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;1090&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 생성한 user를 이용해 외부 DB에 최종적으로 연결된 모습을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.10.37.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL1sSN/btsHlIcVeTo/muGxW4VUvkO5gyifAjLr2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL1sSN/btsHlIcVeTo/muGxW4VUvkO5gyifAjLr2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL1sSN/btsHlIcVeTo/muGxW4VUvkO5gyifAjLr2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL1sSN%2FbtsHlIcVeTo%2FmuGxW4VUvkO5gyifAjLr2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1744&quot; height=&quot;808&quot; data-filename=&quot;스크린샷 2024-05-10 오후 6.10.37.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다음엔 생성된 계정 tester를 이용해 testdb에 접근하여 데이터를 조회해오는 샘플 프로젝트를 진행해 볼 예정이다.&lt;br /&gt;&lt;a href=&quot;https://hippalus.tistory.com/650&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hippalus.tistory.com/650&lt;/a&gt;&lt;/p&gt;</description>
      <category>postgreSQL</category>
      <category>postgresql</category>
      <category>외부연결</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/649</guid>
      <comments>https://hippalus.tistory.com/649#entry649comment</comments>
      <pubDate>Fri, 10 May 2024 19:35:45 +0900</pubDate>
    </item>
    <item>
      <title>3. pgAdmin으로 이용자 만들기</title>
      <link>https://hippalus.tistory.com/648</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보자.&lt;br /&gt;DB에 프로그램이 접속해서 CRUD 행위가 가능하려면 이용자가 있어야 하는 법&lt;br /&gt;그런데 난 postgreSQL을 처음 설치할 때 이용자는 만들었는데 프로그램이 접속해서 사용하는 이용자는 만든 기억이 없다.&lt;br /&gt;&lt;br /&gt;그러니 일단 만들자.&lt;br /&gt;Databases아래에 Login/Group Roles가 있다. 여기서 또 마우스 우측 버튼을 누르고 Create &amp;gt; Login/Group Roles를 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 5.07.58.png&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hys2H/btsHiJb4Nkn/l4UHQQDmjybVEhiuFkbLk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hys2H/btsHiJb4Nkn/l4UHQQDmjybVEhiuFkbLk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hys2H/btsHiJb4Nkn/l4UHQQDmjybVEhiuFkbLk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHys2H%2FbtsHiJb4Nkn%2Fl4UHQQDmjybVEhiuFkbLk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;982&quot; data-filename=&quot;스크린샷 2024-05-09 오후 5.07.58.png&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그러면 늘 그러하듯 새창이 뜬다.&lt;br /&gt;이름을 지정해주자 난 programuser라고 하련다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 5.08.15.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfSOeX/btsHlrVjfoK/iOzxIMHpuXLKYQV4x7oG80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfSOeX/btsHlrVjfoK/iOzxIMHpuXLKYQV4x7oG80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfSOeX/btsHlrVjfoK/iOzxIMHpuXLKYQV4x7oG80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfSOeX%2FbtsHlrVjfoK%2FiOzxIMHpuXLKYQV4x7oG80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;1096&quot; data-filename=&quot;스크린샷 2024-05-09 오후 5.08.15.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우측탭으로 이동하면 Password를 입력할 수 있다.&lt;br /&gt;그 아래 expires는 그냥 놔두면 never expire라 하니 건드리지 말아야겠다.&lt;br /&gt;Connection limit는 -1인걸로 미루어 이게 현명한 처사 같다.&lt;br /&gt;접속 제한이 없단 말 이겠지. 웹같은 환경에선 다수가 동시 접속이 일어날테니 -1로 놔두는게 맞지 싶다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 5.08.36.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swEVt/btsHkkWWcSH/sB2mpVgMjQyzG4OOqNbqa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swEVt/btsHkkWWcSH/sB2mpVgMjQyzG4OOqNbqa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swEVt/btsHkkWWcSH/sB2mpVgMjQyzG4OOqNbqa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FswEVt%2FbtsHkkWWcSH%2FsB2mpVgMjQyzG4OOqNbqa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;1094&quot; data-filename=&quot;스크린샷 2024-05-09 오후 5.08.36.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Save하면 끝.&lt;br /&gt;그런데 이렇게 하고 프로그램 구현을 하면 제대로 안 된다.&lt;br /&gt;이유는 각 테이블의 권한이 없기 때문이다.&lt;br /&gt;따라서 이번 포스팅은 그냥 pgAdmin으로 계정 생성하는 목적 정도로만 공유하고 다음 포스팅에서 제대로 어플리케이션에서 사용 될 계정을 만들고 설정도 다뤄보려 한다.&lt;/p&gt;</description>
      <category>postgreSQL</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/648</guid>
      <comments>https://hippalus.tistory.com/648#entry648comment</comments>
      <pubDate>Fri, 10 May 2024 06:24:44 +0900</pubDate>
    </item>
    <item>
      <title>2. postgreSQL 첫실행에 DB생성부터 테이블 만들고 데이터 insert, select까지</title>
      <link>https://hippalus.tistory.com/647</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 내 상황은 이렇다.&lt;br /&gt;사용해본 DB는 MSSQL을 15년 이상 주력사였고 최근 Oracle(과거 SI 잠깐 했을 당시에 2년 정도 토드사용해본게 전부였지만 최근 다시 사용) 그 외 잡다한 MySql, MSACCESS(ㅋㅋㅋ), DB같지도 않은 파라독스(S모 카드사에서 처음 접하고 개깜놀) 대충 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상황에서 처음 PostgreSQL을 설치해보았다.&lt;br /&gt;그리고 첫 실행을 하고자 설치된 폴더로 이동해보니 딱 저렇게 보인다.&lt;br /&gt;느낌적으로 pgAdmin 4라는 툴이 MSSQL의 SQL Server Management Studio스러워 보인다.&lt;br /&gt;SQL Shell은 아마 커맨드 라인으로 실행해주는 paAdmin 4일듯 싶다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.56.50.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIjeh9/btsHkfOE8gH/UQwJAhCoktuzlUBWD80DKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIjeh9/btsHkfOE8gH/UQwJAhCoktuzlUBWD80DKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIjeh9/btsHkfOE8gH/UQwJAhCoktuzlUBWD80DKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIjeh9%2FbtsHkfOE8gH%2FUQwJAhCoktuzlUBWD80DKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;778&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.56.50.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pgAdmin 4를 냅다 실행해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.54.16.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QJREx/btsHidK7Cni/ERA1DFlbJdKQOLrm3WISM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QJREx/btsHidK7Cni/ERA1DFlbJdKQOLrm3WISM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QJREx/btsHidK7Cni/ERA1DFlbJdKQOLrm3WISM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQJREx%2FbtsHidK7Cni%2FERA1DFlbJdKQOLrm3WISM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;1150&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.54.16.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음 역시나가 역시다.&lt;br /&gt;탭 영역을 보니 대시보드가 있고 그 옆에 프로퍼티, 시퀄 등등등이 있다.&amp;nbsp;&lt;br /&gt;눈깔을 좌측 트리로 이동해보자 Servers가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.57.06.png&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgxlcC/btsHjeW0oam/Yscn5XXCxBc81ZXYjS4LO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgxlcC/btsHjeW0oam/Yscn5XXCxBc81ZXYjS4LO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgxlcC/btsHjeW0oam/Yscn5XXCxBc81ZXYjS4LO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgxlcC%2FbtsHjeW0oam%2FYscn5XXCxBc81ZXYjS4LO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2036&quot; height=&quot;1230&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.57.06.png&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;MSSQL처럼 UI가 마음에 드는구나.&lt;br /&gt;트리를 펼쳐서 PostgreSQL 16을 눌러보자.&lt;br /&gt;팝업윈도우가 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.58.08.png&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wcGrh/btsHkZdxcld/KPgIKEi7P77XDSqqZVaoIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wcGrh/btsHkZdxcld/KPgIKEi7P77XDSqqZVaoIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wcGrh/btsHkZdxcld/KPgIKEi7P77XDSqqZVaoIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwcGrh%2FbtsHkZdxcld%2FKPgIKEi7P77XDSqqZVaoIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2038&quot; height=&quot;582&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.58.08.png&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아까 설치할 때 기록한 비번을 넣어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.58.20.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wVLPn/btsHkfHVw9R/59hmZaPPGzWKjVVWyAOwYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wVLPn/btsHkfHVw9R/59hmZaPPGzWKjVVWyAOwYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wVLPn/btsHkfHVw9R/59hmZaPPGzWKjVVWyAOwYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwVLPn%2FbtsHkfHVw9R%2F59hmZaPPGzWKjVVWyAOwYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2040&quot; height=&quot;558&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.58.20.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러니 Databases와 Roles, Tablespaces 등등 기본 시스템 DB쪽으로 추정된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.58.39.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPXYOQ/btsHkKOsJgr/bQvoz9KcCRkHaE7ydmS9k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPXYOQ/btsHkKOsJgr/bQvoz9KcCRkHaE7ydmS9k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPXYOQ/btsHkKOsJgr/bQvoz9KcCRkHaE7ydmS9k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPXYOQ%2FbtsHkKOsJgr%2FbQvoz9KcCRkHaE7ydmS9k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2040&quot; height=&quot;1532&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.58.39.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;자 그럼 이제 내 디비를 만들어봐야겠제?&lt;br /&gt;PostgreSQL 16에서 마우스 오른쪽을 눌러본다. Create가 있다 그 옆에 Database가 있구나.&lt;br /&gt;정말 직관적이다.(MSSQL 이용자라면 너무 쉽다.)&lt;br /&gt;있어야 할 곳에 기능이 있다. 그게 MS의 최대 장점 아닌가?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.01.22.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDkAIF/btsHjUcJ95t/4YvMv037kknkD218qpDEkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDkAIF/btsHjUcJ95t/4YvMv037kknkD218qpDEkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDkAIF/btsHjUcJ95t/4YvMv037kknkD218qpDEkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDkAIF%2FbtsHjUcJ95t%2F4YvMv037kknkD218qpDEkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;1034&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.01.22.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Database를 선택하니 역시나 창이 하나 뜬다.&lt;br /&gt;뻔하다. DB명 만들어주고 저장하면 그만이다.&lt;br /&gt;그 옆 Definition, Security 등을 눌러봤지만 뭘 하는건진 아직 모르겠다.&amp;nbsp;&lt;br /&gt;일단 DB나 만들자. Save 전에 SQL탭이 눈에 들어온다.&lt;br /&gt;뻔하다. 내가 만드는 액션의 SQL문이겠지. 그리고 저 SQL문은 SQL Shell 프로그램에서 동작시키거나 SQL management처럼 쿼리분석기에서 실행시킬 수 있을것이다.&lt;br /&gt;그냥 저런것도 보여주는구나 하고 넘기자. SAVE&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.01.50.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1092&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2J0PP/btsHkmAemx9/u2chYU21HnQtu5nBhXxZJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2J0PP/btsHkmAemx9/u2chYU21HnQtu5nBhXxZJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2J0PP/btsHkmAemx9/u2chYU21HnQtu5nBhXxZJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2J0PP%2FbtsHkmAemx9%2Fu2chYU21HnQtu5nBhXxZJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;1092&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.01.50.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1092&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.02.17.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XNr1t/btsHieDejTM/Xk34Trd0rxRyTjczikolBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XNr1t/btsHieDejTM/Xk34Trd0rxRyTjczikolBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XNr1t/btsHieDejTM/Xk34Trd0rxRyTjczikolBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXNr1t%2FbtsHieDejTM%2FXk34Trd0rxRyTjczikolBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;1096&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.02.17.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Save를 하고 나니 내 첫 PostgreSQL DB가 생성된게 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.02.42.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buBBH7/btsHk0csOHl/xNKXFv5TEIw6OC2RgPQLmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buBBH7/btsHk0csOHl/xNKXFv5TEIw6OC2RgPQLmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buBBH7/btsHk0csOHl/xNKXFv5TEIw6OC2RgPQLmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuBBH7%2FbtsHk0csOHl%2FxNKXFv5TEIw6OC2RgPQLmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1068&quot; height=&quot;888&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.02.42.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그럼 테이블을 만들어 보자.&lt;br /&gt;테이블이야 뭐 뻔하다 Schemas에 있겠지&lt;br /&gt;역시나 Tables가 있다.&lt;br /&gt;만들려면? 뻔하지 마우스 오른쪽 눌러보자.&lt;br /&gt;Create가 나온다. 그리고 Table&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.03.39.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;1706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyZUZn/btsHjurRRtR/LJY28DAY58GeGdjF5OyAs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyZUZn/btsHjurRRtR/LJY28DAY58GeGdjF5OyAs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyZUZn/btsHjurRRtR/LJY28DAY58GeGdjF5OyAs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyZUZn%2FbtsHjurRRtR%2FLJY28DAY58GeGdjF5OyAs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;1706&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.03.39.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;1706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그러면 Database 처럼 Table 생성창이 뜬다.&lt;br /&gt;이름은 게시판이 제일 만만하니 board_tbl이라 정해준다.&lt;br /&gt;그다음은? 당연히 컬럼이다. General 옆에 Columns가 보인다. 그거 누른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.04.10.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b03Yjg/btsHjdDLCdS/Fny8q5Mn0hZ0EqoRDEQ2ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b03Yjg/btsHjdDLCdS/Fny8q5Mn0hZ0EqoRDEQ2ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b03Yjg/btsHjdDLCdS/Fny8q5Mn0hZ0EqoRDEQ2ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb03Yjg%2FbtsHjdDLCdS%2FFny8q5Mn0hZ0EqoRDEQ2ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;1098&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.04.10.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;난 매우 간단하게 기준키 필드는 integer, 제목은 varchar, 내용은 text나 varchar로 만들고자 한다.&lt;br /&gt;그런데 varchar가 안보인다.&lt;br /&gt;이건 좀 당황스럽다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.10.45.png&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P20Qs/btsHklH6cqK/VeBcc3pjf1SuXaO23XAyG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P20Qs/btsHklH6cqK/VeBcc3pjf1SuXaO23XAyG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P20Qs/btsHklH6cqK/VeBcc3pjf1SuXaO23XAyG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP20Qs%2FbtsHklH6cqK%2FVeBcc3pjf1SuXaO23XAyG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1786&quot; height=&quot;794&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.10.45.png&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;chatGPT센세에게 물어보고 싶지만 내가 쓰는 버전은 3.5버전이므로 최신 정보는 알 수 없을 것 같다.&lt;br /&gt;claude.ai 티쳐에게 물어보자.&lt;br /&gt;&lt;br /&gt;16버전에선 varchar대신 text를 사용하는게 좋단다.&lt;br /&gt;초기 버전엔 varchar를 제공했지만 요즘은 그냥 닥치고 text쓰란다.&lt;br /&gt;그럼 varchar와 text가 아무런 차이점이 없다란 말인데... 흠..일단 믿어보자.&lt;br /&gt;&lt;br /&gt;그런데 text[] 이건 뭐지? 배열인데...&lt;br /&gt;또 claude.ai 티쳐에게 퀘스쳔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{'태그1', '태그2'...}이런식을 저장하는 자료형이란다.&lt;br /&gt;대충 PostgreSQL이 일반적인 RDBMS가 아니라는말은 익히 들어왔었던지라 지리정보나 그따위 정보에 특화된 필드가 아닐까 추측해본다.&lt;br /&gt;조금 구글링 해보니 JSON형도 있던데... 음... 그렇군&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;옥히&lt;span&gt;&amp;nbsp;도키&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;b_idx는 integer로 PK로 설정하고 다른 제목과 내용 역시 Not NULL로 설정한다. 기본값은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Save&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.11.05.png&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ACu5l/btsHkfgPRUz/cPCivoVkMdKzD9XnyclJw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ACu5l/btsHkfgPRUz/cPCivoVkMdKzD9XnyclJw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ACu5l/btsHkfgPRUz/cPCivoVkMdKzD9XnyclJw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FACu5l%2FbtsHkfgPRUz%2FcPCivoVkMdKzD9XnyclJw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1796&quot; height=&quot;1098&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.11.05.png&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;저장하고 나니 역시나 좌측 트리 영역에 테이블과 필드가 잘 나타난다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.14.23.png&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2Zs0m/btsHhqYrqem/3ToXRAGAN948ggbII3FMok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2Zs0m/btsHhqYrqem/3ToXRAGAN948ggbII3FMok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2Zs0m/btsHhqYrqem/3ToXRAGAN948ggbII3FMok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2Zs0m%2FbtsHhqYrqem%2F3ToXRAGAN948ggbII3FMok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;1240&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.14.23.png&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제 데이터를 insert해보자&lt;br /&gt;ANSI문법은 언제나 통하니 간단하게 insert문을 실행해보자.&lt;br /&gt;드래그 후 F5(execute script)를 실행하니 error가 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.14.43.png&quot; data-origin-width=&quot;2364&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edPHGS/btsHkmUx0Ca/AhWyKh1keOjyYPaWZ7Hq70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edPHGS/btsHkmUx0Ca/AhWyKh1keOjyYPaWZ7Hq70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edPHGS/btsHkmUx0Ca/AhWyKh1keOjyYPaWZ7Hq70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedPHGS%2FbtsHkmUx0Ca%2FAhWyKh1keOjyYPaWZ7Hq70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2364&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.14.43.png&quot; data-origin-width=&quot;2364&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이런.. b_title인데 필드명 오타를 냈나보다.&lt;br /&gt;보자.. 테이블 스키마 수정은... 뭐 뻔하지 마찬가지로 테이블의 board_tbl에서 마우스 우측 눌러 Properties를 누르면 되겠지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.14.59.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tbJWR/btsHjAMgQDr/da5LIWlJRP0OXhi1ytaB01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tbJWR/btsHjAMgQDr/da5LIWlJRP0OXhi1ytaB01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tbJWR/btsHjAMgQDr/da5LIWlJRP0OXhi1ytaB01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtbJWR%2FbtsHjAMgQDr%2Fda5LIWlJRP0OXhi1ytaB01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;1192&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.14.59.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;역시나다. b_titile 오타 i를 하나 제거하자&lt;br /&gt;Save&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.15.24.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE4L7p/btsHkWOC8EP/9zkG8VmAAlbQqxsyTvKsA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE4L7p/btsHkWOC8EP/9zkG8VmAAlbQqxsyTvKsA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE4L7p/btsHkWOC8EP/9zkG8VmAAlbQqxsyTvKsA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE4L7p%2FbtsHkWOC8EP%2F9zkG8VmAAlbQqxsyTvKsA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;1102&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.15.24.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;저장하기 전 SQL문을 구경해보자&lt;br /&gt;좀 특이하다. 이게 ANSI문법인가.&lt;br /&gt;MSSQL과는 좀 다르다.&lt;br /&gt;ALTER TABLE IF EXISTS.... RENAME 뭐 그런가보다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.16.18.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sa7vU/btsHlu5pv6O/il4e8bEuOgyZHRF3pJCKk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sa7vU/btsHlu5pv6O/il4e8bEuOgyZHRF3pJCKk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sa7vU/btsHlu5pv6O/il4e8bEuOgyZHRF3pJCKk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSa7vU%2FbtsHlu5pv6O%2Fil4e8bEuOgyZHRF3pJCKk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;236&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.16.18.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.16.45.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMDEFn/btsHkUwIPZP/vNHZV6tq2RIVm4dc6Lh5a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMDEFn/btsHkUwIPZP/vNHZV6tq2RIVm4dc6Lh5a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMDEFn/btsHkUwIPZP/vNHZV6tq2RIVm4dc6Lh5a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMDEFn%2FbtsHkUwIPZP%2FvNHZV6tq2RIVm4dc6Lh5a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;382&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.16.45.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다시 SQL문을 실행하자.&lt;br /&gt;그 전에 나는 그냥 select 문도 추가하고 F5를 실행하였는데 오류가 난다.&lt;br /&gt;아마 오라클처럼 ;를 넣어줘야 할 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.16.57.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P5jvS/btsHiFm4U7A/Xx0pwFw2zX82vAgZ0Qe0u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P5jvS/btsHiFm4U7A/Xx0pwFw2zX82vAgZ0Qe0u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P5jvS/btsHiFm4U7A/Xx0pwFw2zX82vAgZ0Qe0u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5jvS%2FbtsHiFm4U7A%2FXx0pwFw2zX82vAgZ0Qe0u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1502&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.16.57.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;정상적으로 insert, select가 실행된다.&lt;br /&gt;다시 한 번 실행해보면 b_idx값이 똑같이 1로 넣으니 당연히 duplicate 오류가 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.17.10.png&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeHIUH/btsHjcSrn7x/kdKFdBw8qyoFgw6RokPr1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeHIUH/btsHjcSrn7x/kdKFdBw8qyoFgw6RokPr1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeHIUH/btsHjcSrn7x/kdKFdBw8qyoFgw6RokPr1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeHIUH%2FbtsHjcSrn7x%2FkdKFdBw8qyoFgw6RokPr1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1636&quot; height=&quot;508&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.17.10.png&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2로 바꾸고 실행하면 잘 넣어지고 잘 보여진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.17.27.png&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VZAiy/btsHjY7fWpV/UrHrzwud7GmDLXlIDk8ZD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VZAiy/btsHjY7fWpV/UrHrzwud7GmDLXlIDk8ZD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VZAiy/btsHjY7fWpV/UrHrzwud7GmDLXlIDk8ZD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZAiy%2FbtsHjY7fWpV%2FUrHrzwud7GmDLXlIDk8ZD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1494&quot; height=&quot;560&quot; data-filename=&quot;스크린샷 2024-05-09 오후 3.17.27.png&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 첫인상.&lt;br /&gt;매우 직관적이다.&lt;br /&gt;MSSQL을 사용해봤다면 토드를 사용할 때와 다르게 친숙한 느낌을 받을 수 있다.&lt;br /&gt;여기에 뭐랄까 script같은 느낌도 들고...&lt;br /&gt;조만간 회사 오라클 DB를 PostgreSQL로 바꾸게 될 지 모르겠다.&lt;br /&gt;대공사겠지만.&lt;/p&gt;</description>
      <category>insert</category>
      <category>msSQL</category>
      <category>Oracle</category>
      <category>postgresql</category>
      <category>select</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/647</guid>
      <comments>https://hippalus.tistory.com/647#entry647comment</comments>
      <pubDate>Thu, 9 May 2024 20:49:18 +0900</pubDate>
    </item>
    <item>
      <title>1. postgreSQL 설치하기 : Mac</title>
      <link>https://hippalus.tistory.com/646</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Download&amp;nbsp;the&amp;nbsp;installer&amp;nbsp;링크를&amp;nbsp;누르면&amp;nbsp;아래&amp;nbsp;페이지로&amp;nbsp;이동된다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads&quot;&gt;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 페이지에서 자신에게 맞는 버전을 다운받으면 된다.&lt;br /&gt;난 일전에 windows용을 다운받았다가 개피를 보았으므로 맥용으로 다운받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치하기는 매우 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 Next만 누르면 그만이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.17.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qljxn/btsHknlATVJ/6ijzstv5gSknEjs2357Bn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qljxn/btsHknlATVJ/6ijzstv5gSknEjs2357Bn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qljxn/btsHknlATVJ/6ijzstv5gSknEjs2357Bn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqljxn%2FbtsHknlATVJ%2F6ijzstv5gSknEjs2357Bn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1098&quot; height=&quot;844&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.17.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.26.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF78LC/btsHi4tkE5h/TFrqQfMcvL1P5fbRdN3NEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF78LC/btsHi4tkE5h/TFrqQfMcvL1P5fbRdN3NEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF78LC/btsHi4tkE5h/TFrqQfMcvL1P5fbRdN3NEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF78LC%2FbtsHi4tkE5h%2FTFrqQfMcvL1P5fbRdN3NEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;844&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.26.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.36.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOdODn/btsHhtniMQS/k30HwvNtQdc3FT71POKoCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOdODn/btsHhtniMQS/k30HwvNtQdc3FT71POKoCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOdODn/btsHhtniMQS/k30HwvNtQdc3FT71POKoCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOdODn%2FbtsHhtniMQS%2Fk30HwvNtQdc3FT71POKoCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;840&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.36.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.46.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FLKG8/btsHicSZ9kc/dhNijY1bT0J5S2RANQmCX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLKG8/btsHicSZ9kc/dhNijY1bT0J5S2RANQmCX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLKG8/btsHicSZ9kc/dhNijY1bT0J5S2RANQmCX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLKG8%2FbtsHicSZ9kc%2FdhNijY1bT0J5S2RANQmCX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;838&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.41.46.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기선 암호만 넣어주고 계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.43.00.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baDPew/btsHht8FxZe/45PKKWyAb3CT0HJofImNkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baDPew/btsHht8FxZe/45PKKWyAb3CT0HJofImNkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baDPew/btsHht8FxZe/45PKKWyAb3CT0HJofImNkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaDPew%2FbtsHht8FxZe%2F45PKKWyAb3CT0HJofImNkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;840&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.43.00.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트도 5432그대로 입력된 상태에서 계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.43.14.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chCncZ/btsHk4To092/9LvW7gEOAuzLkHk01RE9i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chCncZ/btsHk4To092/9LvW7gEOAuzLkHk01RE9i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chCncZ/btsHk4To092/9LvW7gEOAuzLkHk01RE9i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchCncZ%2FbtsHk4To092%2F9LvW7gEOAuzLkHk01RE9i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;834&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.43.14.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 UTF-8 KR을 선택했다.&lt;br /&gt;계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.43.41.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cILekX/btsHi3HXpKF/DARR7AkWy5mH67HsJADBU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cILekX/btsHi3HXpKF/DARR7AkWy5mH67HsJADBU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cILekX/btsHi3HXpKF/DARR7AkWy5mH67HsJADBU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcILekX%2FbtsHi3HXpKF%2FDARR7AkWy5mH67HsJADBU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;856&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.43.41.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 Next&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.44.06.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBIcz8/btsHiGzuAxE/tXCGfCnJtKZkrbeK6blDk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBIcz8/btsHiGzuAxE/tXCGfCnJtKZkrbeK6blDk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBIcz8/btsHiGzuAxE/tXCGfCnJtKZkrbeK6blDk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBIcz8%2FbtsHiGzuAxE%2FtXCGfCnJtKZkrbeK6blDk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;856&quot; data-filename=&quot;스크린샷 2024-05-09 오후 2.44.06.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 끝이다.&lt;/p&gt;</description>
      <category>install</category>
      <category>postgresql</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/646</guid>
      <comments>https://hippalus.tistory.com/646#entry646comment</comments>
      <pubDate>Thu, 9 May 2024 20:01:40 +0900</pubDate>
    </item>
    <item>
      <title>postgreSQL window에 설치 삽질 There has been an error. icacls 오류</title>
      <link>https://hippalus.tistory.com/645</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 페이지로 이동한다.&lt;br /&gt;&lt;a href=&quot;https://www.postgresql.org/download/windows/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.postgresql.org/download/windows/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biBMTf/btsHj1CmwfT/FzONtYheyZq4ccVseVmUpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biBMTf/btsHj1CmwfT/FzONtYheyZq4ccVseVmUpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biBMTf/btsHj1CmwfT/FzONtYheyZq4ccVseVmUpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiBMTf%2FbtsHj1CmwfT%2FFzONtYheyZq4ccVseVmUpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;184&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Download the installer 링크를 누르면 아래 페이지로 이동된다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;여기서 원하는 인스톨러를 다운받음 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nKBYW/btsHjVIUMCg/LBi5FtnphvqK6ct0CKJ6ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nKBYW/btsHjVIUMCg/LBi5FtnphvqK6ct0CKJ6ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nKBYW/btsHjVIUMCg/LBi5FtnphvqK6ct0CKJ6ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnKBYW%2FbtsHjVIUMCg%2FLBi5FtnphvqK6ct0CKJ6ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1301&quot; height=&quot;726&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;난 16.2 Windows X86-64로 다운받았다.&lt;br /&gt;그리고 실행&lt;br /&gt;그리고 에러 ㅋㅋㅋㅋ&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwa7GB/btsHh83ILQk/EsOolmfji2vLVMF2BL2Z11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwa7GB/btsHh83ILQk/EsOolmfji2vLVMF2BL2Z11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwa7GB/btsHh83ILQk/EsOolmfji2vLVMF2BL2Z11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwa7GB%2FbtsHh83ILQk%2FEsOolmfji2vLVMF2BL2Z11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;152&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색해보니 관리자권한으로 실행을 해야 한다느니 cmd창에서 net user administrator로 실행을 하고 runas /user:administrator postgresql-16.2-1-windows-x64.exe 어쩌고 저쩌고 -_-&lt;br /&gt;뭔짓을 해도 내 PC에는 설치가 안됐다.&lt;br /&gt;&lt;br /&gt;더 검색해보니 하위버전을 설치해야 한다라는것 같아서&lt;br /&gt;하나 하나씩 다운 받아봤지만 다 동일했고&lt;br /&gt;누구는 이 링크로 다운 받아 설치하면 동작한다고 하는데 실제로 인스톨되는걸 확인했다.&lt;br /&gt;&lt;a href=&quot;https://get.enterprisedb.com/postgresql/postgresql-11.2-1-windows-x64.exe&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://get.enterprisedb.com/postgresql/postgresql-11.2-1-windows-x64.exe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evKcCp/btsHkMry7z9/lhkEM5T5jiccAsaz9L6C8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evKcCp/btsHkMry7z9/lhkEM5T5jiccAsaz9L6C8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evKcCp/btsHkMry7z9/lhkEM5T5jiccAsaz9L6C8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FevKcCp%2FbtsHkMry7z9%2FlhkEM5T5jiccAsaz9L6C8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;429&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그런데 버전도 마음에 안 들고 영 못마땅해서 난 그냥 맥용 16.2 버전 다운받아 맥에다 설치해버렸다.&lt;/p&gt;</description>
      <category>postgreSQL</category>
      <category>postgresql</category>
      <category>Windows11</category>
      <category>삽</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/645</guid>
      <comments>https://hippalus.tistory.com/645#entry645comment</comments>
      <pubDate>Thu, 9 May 2024 19:35:51 +0900</pubDate>
    </item>
    <item>
      <title>eclipse (이클립스) 단축키 내보내기, 가져오기</title>
      <link>https://hippalus.tistory.com/644</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이클립스는 정말이지 단축키가 너무 불편하다.&lt;br /&gt;MS처럼 윈도우 기반의 단축키가 전혀 매칭되지 않아 여간 불편한게 아니다.&lt;br /&gt;정성스럽게 키바인딩을 해둬도 workspace가 바뀌면 도루묵이길래 찾아보니 단축키 설정을 내보내고 갖고오기가 가능했다.&lt;br /&gt;&lt;br /&gt;방법은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내보내기&lt;br /&gt;File &amp;gt; export &amp;gt; General &amp;gt; Preferences (선택 후 Next) &amp;gt; Keys Preferences 체크 후 하단의 To preference file에서 원하는 위치로 파일명과 함께 지정 후 Finish&lt;br /&gt;&lt;br /&gt;갖고오기&lt;br /&gt;File &amp;gt; import&amp;gt; General &amp;gt; Preferences (선택 후 Next) &amp;gt; Keys Preferences 체크 후 상단의 From preference file에서 export해둔 파일명 지정 후 Keys Preferences 체크 후 Finish를 선택하면 재시작하라고 나오고 재시작하고 나면 내가 설정해둔 단축키가 정상적으로 동작한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnx8bH/btsHfYfykmx/rDuf22jq1RjsgGJxgKlukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnx8bH/btsHfYfykmx/rDuf22jq1RjsgGJxgKlukk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnx8bH/btsHfYfykmx/rDuf22jq1RjsgGJxgKlukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdnx8bH%2FbtsHfYfykmx%2FrDuf22jq1RjsgGJxgKlukk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;549&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8YsCb/btsHjuK47Az/EdJmK2NT3RIKnzUPvze3R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8YsCb/btsHjuK47Az/EdJmK2NT3RIKnzUPvze3R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8YsCb/btsHjuK47Az/EdJmK2NT3RIKnzUPvze3R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8YsCb%2FbtsHjuK47Az%2FEdJmK2NT3RIKnzUPvze3R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;538&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Eclipse</category>
      <category>export</category>
      <category>import</category>
      <category>단축키</category>
      <category>키바인딩</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/644</guid>
      <comments>https://hippalus.tistory.com/644#entry644comment</comments>
      <pubDate>Wed, 8 May 2024 19:29:38 +0900</pubDate>
    </item>
    <item>
      <title>이클립스(Eclipse)에서 검색된 결과 클릭시 무조건 새 탭으로 보기</title>
      <link>https://hippalus.tistory.com/643</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이클립스(Eclipse)에서&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;h로&amp;nbsp;검색하고&amp;nbsp;나며서&amp;nbsp;더블클릭하면&amp;nbsp;결과가&amp;nbsp;계속&amp;nbsp;같은&amp;nbsp;탭을&amp;nbsp;바꿔가며&amp;nbsp;보여주므로&amp;nbsp;여간&amp;nbsp;불편한게&amp;nbsp;아니다.&lt;br /&gt;열려있지&amp;nbsp;않은&amp;nbsp;파일이라면&amp;nbsp;매번&amp;nbsp;새로운&amp;nbsp;탭에서&amp;nbsp;파일을&amp;nbsp;열&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;Window&amp;nbsp;&amp;gt;&amp;nbsp;Preferences&amp;nbsp;메뉴로&amp;nbsp;이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN4dTa/btsHgBYjI4p/ucBXe241SCu3wULfPxQzn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN4dTa/btsHgBYjI4p/ucBXe241SCu3wULfPxQzn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN4dTa/btsHgBYjI4p/ucBXe241SCu3wULfPxQzn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN4dTa%2FbtsHgBYjI4p%2FucBXe241SCu3wULfPxQzn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;167&quot; height=&quot;254&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp; Perferences창이 뜨면 좌측에서 Search를 찾아 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pKPUX/btsHhsmlovK/G8kc6vV81GcVWLkru3ork1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pKPUX/btsHhsmlovK/G8kc6vV81GcVWLkru3ork1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pKPUX/btsHhsmlovK/G8kc6vV81GcVWLkru3ork1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpKPUX%2FbtsHhsmlovK%2FG8kc6vV81GcVWLkru3ork1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;543&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duthS5/btsHhQ8vmRJ/7QML9BcDJcguIH4P47QFm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duthS5/btsHhQ8vmRJ/7QML9BcDJcguIH4P47QFm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duthS5/btsHhQ8vmRJ/7QML9BcDJcguIH4P47QFm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduthS5%2FbtsHhQ8vmRJ%2F7QML9BcDJcguIH4P47QFm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;181&quot; height=&quot;545&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 우측 Search에서 첫번째 Reuse editors to show matches가 체크되어 있을것이다. 이걸 언체크하고 Apply and close시키면 된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/booFiU/btsHdue5HG6/o2EZzpPWij8NeVt40QryUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/booFiU/btsHdue5HG6/o2EZzpPWij8NeVt40QryUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/booFiU/btsHdue5HG6/o2EZzpPWij8NeVt40QryUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbooFiU%2FbtsHdue5HG6%2Fo2EZzpPWij8NeVt40QryUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;541&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>새탭</category>
      <category>이클립스</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/643</guid>
      <comments>https://hippalus.tistory.com/643#entry643comment</comments>
      <pubDate>Wed, 8 May 2024 12:55:36 +0900</pubDate>
    </item>
    <item>
      <title>SVN : 이클립스에서 서버와 로컬 소스 싱크 맞추기</title>
      <link>https://hippalus.tistory.com/642</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;SVN&amp;nbsp;Server와&amp;nbsp;SVN&amp;nbsp;Client의&amp;nbsp;소스&amp;nbsp;동기화 &lt;br /&gt;이클립스&amp;nbsp;프로젝트에서&amp;nbsp;마우스&amp;nbsp;우클릭&amp;nbsp;후&amp;nbsp;Team&amp;nbsp;&amp;gt;&amp;nbsp;Synchronize&amp;nbsp;with&amp;nbsp;Repository&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVbu5i/btsFg4v9bck/wAQFcqj8YBFG4qWDcSLrv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVbu5i/btsFg4v9bck/wAQFcqj8YBFG4qWDcSLrv0/img.png&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;714&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.6487%; margin-right: 10px;&quot; data-widthpercent=&quot;54.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVbu5i/btsFg4v9bck/wAQFcqj8YBFG4qWDcSLrv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVbu5i%2FbtsFg4v9bck%2FwAQFcqj8YBFG4qWDcSLrv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcrT8U/btsFlPxrXF8/bPi1Sx5ZNhzDpW0qtTyHR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcrT8U/btsFlPxrXF8/bPi1Sx5ZNhzDpW0qtTyHR0/img.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.1885%;&quot; data-widthpercent=&quot;45.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcrT8U/btsFlPxrXF8/bPi1Sx5ZNhzDpW0qtTyHR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcrT8U%2FbtsFlPxrXF8%2FbPi1Sx5ZNhzDpW0qtTyHR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;307&quot; height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Synchronize 탭에서 보여지는 아이콘 의미&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;27&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nbch3/btsFiOsuRMr/oGoUwKtLSdxYnlFAKT8ZB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nbch3/btsFiOsuRMr/oGoUwKtLSdxYnlFAKT8ZB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nbch3/btsFiOsuRMr/oGoUwKtLSdxYnlFAKT8ZB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnbch3%2FbtsFiOsuRMr%2FoGoUwKtLSdxYnlFAKT8ZB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;27&quot; height=&quot;22&quot; data-origin-width=&quot;27&quot; data-origin-height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;local에서는 수정되지 않았고, 서버에서만 수정된 파일로 Update하면 local이 수정됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;23&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC9tai/btsFg5oaDDQ/KztiTfBdYTClnkyKE32QL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC9tai/btsFg5oaDDQ/KztiTfBdYTClnkyKE32QL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC9tai/btsFg5oaDDQ/KztiTfBdYTClnkyKE32QL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC9tai%2FbtsFg5oaDDQ%2FKztiTfBdYTClnkyKE32QL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;23&quot; height=&quot;22&quot; data-origin-width=&quot;23&quot; data-origin-height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;local에서만 수정하고, 서버에서는 수정되지 않은 파일로 Commit하면 서버가 수정됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;25&quot; data-origin-height=&quot;21&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4wbX/btsFhhved6J/Jc3zbbJJp93YPqv2nkCJ01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4wbX/btsFhhved6J/Jc3zbbJJp93YPqv2nkCJ01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4wbX/btsFhhved6J/Jc3zbbJJp93YPqv2nkCJ01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4wbX%2FbtsFhhved6J%2FJc3zbbJJp93YPqv2nkCJ01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;25&quot; height=&quot;21&quot; data-origin-width=&quot;25&quot; data-origin-height=&quot;21&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;local에서도 수정되었고, 서버에서도 수정된 파일이므로 어디가 최신인지 확인해서 Update 또는 Commit을 해야 함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 로컬 소스를 서버로 Commit 또는 서버 소스를 로컬로 Update 하기 &lt;br /&gt;&lt;br /&gt;Commit : 서버로 내 로컬 소스를 올리는 작업으로 보통 작업 전에 Syncronize를 먼저해 본 후 본인이 작업하는 동안 다른 작업자가 작업을 해서 반영했는지 확인을 해야 충돌이 발생하지 않음&lt;br /&gt;&lt;br /&gt;Update : 서버의 소스를 로컬로 옮기는 작업 &lt;br /&gt;&lt;br /&gt;Override&amp;nbsp;and&amp;nbsp;Update는&amp;nbsp;SVN&amp;nbsp;서버의&amp;nbsp;소스를&amp;nbsp;내&amp;nbsp;로컬&amp;nbsp;소스로&amp;nbsp;overwrite&amp;nbsp;(SVN소스가&amp;nbsp;오리지널) &lt;br /&gt;Override&amp;nbsp;and&amp;nbsp;commit는&amp;nbsp;내&amp;nbsp;로컬&amp;nbsp;소스를&amp;nbsp;SVN으로&amp;nbsp;overwrite&amp;nbsp;(내소스가&amp;nbsp;오리지널)&lt;br /&gt;요 두개는 일전에도 다루었었음&lt;br /&gt;&lt;a href=&quot;https://hippalus.tistory.com/621&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hippalus.tistory.com/621&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708993302659&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;eclipse에서 SVN: Override and Update, Override and Commit&quot; data-og-description=&quot;SVN으로 형상관리시 수정된 또는 수정할 소스를 충돌현상이 발생할 경우 먼저 대상 소스를 마우스 우클릭 Team &amp;gt; Synchronize with Repository 선택 update or commit시 충돌인 conflict가 발생하게 된다. 이때 Over&quot; data-og-host=&quot;hippalus.tistory.com&quot; data-og-source-url=&quot;https://hippalus.tistory.com/621&quot; data-og-url=&quot;https://hippalus.tistory.com/621&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdGn4Q/hyVqkaF6p2/OEcLLWVE3BnxQytDaKJE41/img.png?width=309&amp;amp;height=97&amp;amp;face=0_0_309_97,https://scrap.kakaocdn.net/dn/4wdzd/hyVqi4ZG97/QiFC0M9W2eTI4iShUpp2A0/img.png?width=309&amp;amp;height=97&amp;amp;face=0_0_309_97&quot;&gt;&lt;a href=&quot;https://hippalus.tistory.com/621&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hippalus.tistory.com/621&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdGn4Q/hyVqkaF6p2/OEcLLWVE3BnxQytDaKJE41/img.png?width=309&amp;amp;height=97&amp;amp;face=0_0_309_97,https://scrap.kakaocdn.net/dn/4wdzd/hyVqi4ZG97/QiFC0M9W2eTI4iShUpp2A0/img.png?width=309&amp;amp;height=97&amp;amp;face=0_0_309_97');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;eclipse에서 SVN: Override and Update, Override and Commit&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SVN으로 형상관리시 수정된 또는 수정할 소스를 충돌현상이 발생할 경우 먼저 대상 소스를 마우스 우클릭 Team &amp;gt; Synchronize with Repository 선택 update or commit시 충돌인 conflict가 발생하게 된다. 이때 Over&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hippalus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/642</guid>
      <comments>https://hippalus.tistory.com/642#entry642comment</comments>
      <pubDate>Tue, 27 Feb 2024 12:35:47 +0900</pubDate>
    </item>
    <item>
      <title>linux에서 소켓 연결 최대 개수 조정 방법</title>
      <link>https://hippalus.tistory.com/641</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ulimit -a 명령어를 실행해보면 아래와 같이 나타남&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlFckt/btsFf5BBrWx/4mnqIzVY2ZCFGFtnr2QnOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlFckt/btsFf5BBrWx/4mnqIzVY2ZCFGFtnr2QnOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlFckt/btsFf5BBrWx/4mnqIzVY2ZCFGFtnr2QnOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlFckt%2FbtsFf5BBrWx%2F4mnqIzVY2ZCFGFtnr2QnOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;209&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의깊게 봐야 하는 정보는 file size로 소켓이 최대 접속 가능한 개수를 나타난다.&lt;br /&gt;보통 1024개가 기본 설정인데 어지간한 소켓 서버라면 1024로는 턱없이 부족할터&lt;br /&gt;&amp;nbsp; &lt;br /&gt;파일 오픈 개수를 늘려야 한다.&lt;br /&gt;&lt;br /&gt;root 권한으로 접속하여 /etc/security/limits.conf 열어서 아래처럼 수정하면 된다.&lt;br /&gt;&lt;br /&gt;vi&amp;nbsp;/etc/security/limits.conf &lt;br /&gt;* soft nofile 400000 &lt;br /&gt;* hard nofile 400000 &lt;br /&gt;&lt;br /&gt;저장 후 터미널을 새로 로그인 하여 ulimit -a 명령어를 실행해보면 지정한 대로 접속 개수가 증가되어 있음을 확인할 수 있고 client socket의 connection역시 성공적으로 연결됨을 확인할 수 있을 것이다.&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>Connection</category>
      <category>Linux</category>
      <category>socket</category>
      <category>ulimit</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/641</guid>
      <comments>https://hippalus.tistory.com/641#entry641comment</comments>
      <pubDate>Mon, 26 Feb 2024 12:44:00 +0900</pubDate>
    </item>
    <item>
      <title>리눅스에 node.js 설치하기 다른 방법</title>
      <link>https://hippalus.tistory.com/640</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일전에 cent os에 node.js 설치하기 글을 작성한적 있다.&lt;br /&gt;&lt;a href=&quot;https://hippalus.tistory.com/607&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hippalus.tistory.com/607&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708648675410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;cent os에 node.js 설치하기&quot; data-og-description=&quot;linux cent os에 node.js를 설치하기 위해선 yum을 이용하여야 한다. root권한이 있는 계정으로 접속한 후 yum repolist를 실행해보면 아래 스샷처럼 보통 초기엔 epel이란게 없기 마련이다. EPEL 저장소가 없&quot; data-og-host=&quot;hippalus.tistory.com&quot; data-og-source-url=&quot;https://hippalus.tistory.com/607&quot; data-og-url=&quot;https://hippalus.tistory.com/607&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZjUXG/hyVqvPSUo2/uuqsNI48so76miiYFZ507K/img.png?width=800&amp;amp;height=55&amp;amp;face=0_0_800_55,https://scrap.kakaocdn.net/dn/ddK13X/hyVqupTNO5/CGRJEa79Qemck07RHgF5o1/img.png?width=800&amp;amp;height=55&amp;amp;face=0_0_800_55,https://scrap.kakaocdn.net/dn/uwyvQ/hyVquwEXL4/UCilbWGYDACwXGNZMkIO10/img.png?width=1703&amp;amp;height=607&amp;amp;face=0_0_1703_607&quot;&gt;&lt;a href=&quot;https://hippalus.tistory.com/607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hippalus.tistory.com/607&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZjUXG/hyVqvPSUo2/uuqsNI48so76miiYFZ507K/img.png?width=800&amp;amp;height=55&amp;amp;face=0_0_800_55,https://scrap.kakaocdn.net/dn/ddK13X/hyVqupTNO5/CGRJEa79Qemck07RHgF5o1/img.png?width=800&amp;amp;height=55&amp;amp;face=0_0_800_55,https://scrap.kakaocdn.net/dn/uwyvQ/hyVquwEXL4/UCilbWGYDACwXGNZMkIO10/img.png?width=1703&amp;amp;height=607&amp;amp;face=0_0_1703_607');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;cent os에 node.js 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;linux cent os에 node.js를 설치하기 위해선 yum을 이용하여야 한다. root권한이 있는 계정으로 접속한 후 yum repolist를 실행해보면 아래 스샷처럼 보통 초기엔 epel이란게 없기 마련이다. EPEL 저장소가 없&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hippalus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 방법 말고 더 나은 방법으로 linux에서 node.js를 설치하고자 한다.&lt;br /&gt;&lt;br /&gt;먼저 node.js 홈페이지의 다운로드로 이동한다.&lt;br /&gt;&lt;a href=&quot;https://nodejs.org/en/download&quot;&gt;https://nodejs.org/en/download&lt;/a&gt; &lt;/p&gt;
&lt;figure id=&quot;og_1708648703155&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Node.js &amp;mdash; Download&quot; data-og-description=&quot;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/en/download&quot; data-og-url=&quot;https://nodejs.org/en/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tzDvE/hyVqq17cJM/V04ZWPoq0c3pG8Sqam9h70/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/FwyqW/hyVm3AIa7h/KJQdROTx7FwZypstkfgKV0/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/en/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/en/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tzDvE/hyVqq17cJM/V04ZWPoq0c3pG8Sqam9h70/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/FwyqW/hyVm3AIa7h/KJQdROTx7FwZypstkfgKV0/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Node.js &amp;mdash; Download&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EnYAy/btsFfxi1Oo8/ZCDxRQ2ffbssLdqKaey3AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EnYAy/btsFfxi1Oo8/ZCDxRQ2ffbssLdqKaey3AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EnYAy/btsFfxi1Oo8/ZCDxRQ2ffbssLdqKaey3AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEnYAy%2FbtsFfxi1Oo8%2FZCDxRQ2ffbssLdqKaey3AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;764&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Linux Binaries가 두 버전이 있는데 일반적이면 x64를 설치하면 된다.&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;x64: 대부분의 데스크톱 및 서버 시스템에서 사용된다. 일반적으로 인텔 또는 AMD의 64비트 아키텍처를 사용하는 시스템에 적합. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;ARM: ARM 아키텍처를 사용하는 시스템에 대한 바이너리로 Raspberry Pi와 같은 임베디드 장치나 ARM 기반의 서버에 설치할 때 적합.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;위 화면에서 64-bit의 링크를 마우스 우측으로 눌러 링크 주소 복사하기를 눌러 복사 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CDhwD/btsFec0LsXF/11SSAVdY8vroemcfejKHXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CDhwD/btsFec0LsXF/11SSAVdY8vroemcfejKHXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CDhwD/btsFec0LsXF/11SSAVdY8vroemcfejKHXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCDhwD%2FbtsFec0LsXF%2F11SSAVdY8vroemcfejKHXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;406&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사해보면 2024년 2월 현재 다운로드 주소는 다음과 같다.&lt;br /&gt;&lt;a href=&quot;https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-x64.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-x64.tar.xz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이제 리눅스로 접속 후 su명령어로 관리자 권한으로 진행한다.&lt;br /&gt;&lt;br /&gt;노드가 설치될 폴더를 생성 후 해당 폴더로 이동한다.&lt;br /&gt;cd&amp;nbsp;/opt &lt;br /&gt;mkdir&amp;nbsp;nodejs &lt;br /&gt;cd&amp;nbsp;nodejs &lt;br /&gt;&lt;br /&gt;앞서 복사했던 주소로 다운로드를 실행한다.&lt;br /&gt;wget&amp;nbsp;&lt;a href=&quot;https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-x64.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-x64.tar.xz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FB0xu/btsFbiVLnx0/AXPkgQFICl8ajjA3EAdebK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FB0xu/btsFbiVLnx0/AXPkgQFICl8ajjA3EAdebK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FB0xu/btsFbiVLnx0/AXPkgQFICl8ajjA3EAdebK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFB0xu%2FbtsFbiVLnx0%2FAXPkgQFICl8ajjA3EAdebK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;108&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다운로드 된 압축을 푼다.&lt;br /&gt;파일명은 ls명령어로 확인하여 각자 맞는 파일명을 적어주면 된다.&lt;br /&gt;다시 말하지만 &lt;span style=&quot;color: #ee2323;&quot;&gt;파일명&lt;/span&gt; 등은 2024년 2월 현재 시점의 파일명이다.&lt;br /&gt;xz&amp;nbsp;-d&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;node-v20.11.1-linux-x64.tar.xz&lt;/span&gt; &lt;br /&gt;tar&amp;nbsp;xf&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;node-v20.11.1-linux-x64.tar&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;심볼릭 링크를 생성한다.&lt;br /&gt;ln&amp;nbsp;-s&amp;nbsp;/opt/nodejs/node-v20.11.1-linux-x64&amp;nbsp;/opt/nodejs/node&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;ln&amp;nbsp;명령어는&amp;nbsp;심볼릭&amp;nbsp;링크를&amp;nbsp;생성하는&amp;nbsp;명령어로&amp;nbsp;-s&amp;nbsp;옵션은&amp;nbsp;심볼릭&amp;nbsp;링크를&amp;nbsp;생성하라는&amp;nbsp;것을&amp;nbsp;나타낸다. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;그&amp;nbsp;뒤에는&amp;nbsp;실제&amp;nbsp;파일이나&amp;nbsp;디렉토리의&amp;nbsp;경로를&amp;nbsp;지정하고,&amp;nbsp;마지막에는&amp;nbsp;생성될&amp;nbsp;링크의&amp;nbsp;경로를&amp;nbsp;지정한다. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;/opt/nodejs/node-v20.11.1-linux-x64&amp;nbsp;경로에&amp;nbsp;있는&amp;nbsp;디렉토리를&amp;nbsp;가리키는&amp;nbsp;심볼릭&amp;nbsp;링크를&amp;nbsp;/opt/nodejs/node라는&amp;nbsp;이름으로&amp;nbsp;생성하게&amp;nbsp;된다. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;이렇게&amp;nbsp;하면&amp;nbsp;/opt/nodejs/node라는&amp;nbsp;경로로&amp;nbsp;접근하면&amp;nbsp;실제로&amp;nbsp;/opt/nodejs/node-v20.11.1-linux-x64에&amp;nbsp;있는&amp;nbsp;내용을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;되므로&amp;nbsp;이는&amp;nbsp;더&amp;nbsp;간단하고&amp;nbsp;직관적인&amp;nbsp;경로로&amp;nbsp;Node.js를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;도와준다.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;끝으로 환경 변수에 등록해 준다.&lt;br /&gt;vim ~/.bashrc&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4AV6c/btsFdW4TLNe/RMew2BveDt7YrVXdxAWmUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4AV6c/btsFdW4TLNe/RMew2BveDt7YrVXdxAWmUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4AV6c/btsFdW4TLNe/RMew2BveDt7YrVXdxAWmUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4AV6c%2FbtsFdW4TLNe%2FRMew2BveDt7YrVXdxAWmUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;993&quot; height=&quot;362&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 마지막 라인에 아래 라인을 추가 한다.&lt;br /&gt;export&amp;nbsp;PATH=&quot;$PATH:/opt/nodejs/node/bin&quot; &lt;br /&gt;&lt;br /&gt;저장 하고 나온 후 추가한 내용을 즉시 적용시킨다.&lt;br /&gt;source ~/.bashrc&lt;br /&gt;&lt;br /&gt;이제 아무 디렉토리에 가서 node -v를 실행해보면 현재 설치된 node의 버전이 확인 될 것이다.&lt;/p&gt;</description>
      <category>모바일 &amp;amp; 앱</category>
      <category>Linux</category>
      <category>Node.js</category>
      <category>설치</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/640</guid>
      <comments>https://hippalus.tistory.com/640#entry640comment</comments>
      <pubDate>Fri, 23 Feb 2024 12:58:56 +0900</pubDate>
    </item>
    <item>
      <title>유니버셜 스튜디오 재팬 입장권 정리와 오픈런 실패하지 않는 필승법</title>
      <link>https://hippalus.tistory.com/639</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;본 리뷰는 &lt;span style=&quot;color: #f89009;&quot;&gt;시즌 C 경험&lt;/span&gt;을 토대로 작성되어 있음&lt;br /&gt;시즌은 A,B,C,D 총 4단계로 구성되어 있으며 A에 가까울수록 티켓 가격도 저렴하고 사람도 상대적으로 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;급한분들을 위한 슈퍼닌텐도월드 마리오카트 쿠파의 도전장 탑승 성공 공식 간단정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 얼리파크인 티켓 구매&lt;br /&gt;장점 : 파크 개장 시간 기준 15분 먼저 입장하는 시스템이므로 가장 확실하고 쉽고 돈도 적게 든다. 내가 가려는 날짜에 보이면 무조건 사야 한다.&lt;br /&gt;단점 : 구하기가 어렵다. 티켓 자체가 조기 품절되므로 원하는 날짜에 가려면 한달 전 또는 그 이전부터 구매 해야 한다.&lt;br /&gt;&lt;br /&gt;2. 유니버셜 익스프레스 패스 4를 리미티드, 리미티드 &amp;amp; 펀, 버라이어티 라이드 중 택 1 하여 구매&lt;br /&gt;장점 : 아침 일찍 방문하지 않아도 되며, 지정된 어트랙션을 다이렉트로 이용 가능하므로 시간 절약에서 월등하다.&lt;br /&gt;단점 : 비싸다. 입장권을 별도로 구매해야 하며, 얼리파크인 보다는 양호하지만 마찬가지로 조기 품절 되므로 그 이전부터 구매를 해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 몸으로 떼우는 오픈런&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장점 :&lt;/span&gt; 저렴하다. &lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입장권만 사서 7시까지 USJ 게이트&lt;/span&gt;로 가서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입장&lt;/span&gt;하자마자 앱에서 가장 빠른&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;8시 정리권&lt;/span&gt;을 발부 받아 이용하면 된다.&lt;/b&gt;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;단점 : 아침 일찍 부터 부지런히 움직여야 하고 30분 정도 게이트에서 기다려야 하며 자칫 정리권을 발부 받지 못하면 낭패 패닉에 빠질 수 있다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;입장권은 공식 판매처에서 구매하길 바란다.&lt;br /&gt;&lt;a href=&quot;https://www.usj.co.jp/web/ko/kr/travel&quot;&gt;https://www.usj.co.jp/web/ko/kr/travel&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;상세한 설명 스따또&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_7242.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/burkiE/btsEXrkoDB5/W1GRvVB9s754de7RcnM3m1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/burkiE/btsEXrkoDB5/W1GRvVB9s754de7RcnM3m1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/burkiE/btsEXrkoDB5/W1GRvVB9s754de7RcnM3m1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FburkiE%2FbtsEXrkoDB5%2FW1GRvVB9s754de7RcnM3m1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_7242.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;USJ를 입장하기 위해선 당연히 입장권을 구매해야 한다.&lt;br /&gt;하지만 사악한 USJ의 슈퍼닌텐도월드는 입장권이 있다하여도 워낙 인기가 많아 입장 가능 인원수를 통제하기 때문에 조금이라도 늦게 들어가면 선착순 마감이 되어 버린다.&lt;br /&gt;하여 몇 만원을 더 주고 다른 입장객보다 15분 먼저 입장 가능한 &quot;얼리파크인&quot;이란 USJ &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;입장권&lt;/b&gt;&lt;/span&gt; 티켓을 구매하면 남들보다 먼저 입장이 가능하므로 무조건 슈퍼닌텐도월드의 입장은 물론이고 쿠파의 도전장 탑승물도 거의 기다리지 않고 이용 가능하다.&lt;br /&gt;&lt;br /&gt;그런데 이 얼리파크인이란 입장권은 매리트가 매우 쓰바라시하기에 너도 나도 얘도 쟤도 사려드니 구하기가 쉽지 않다.&lt;br /&gt;보통 한달 전에 모두 매진되어버린다.&lt;br /&gt;&lt;br /&gt;그럼 다른 방법은 돈을 더 들이는 방법인데 바로 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;확약권&lt;/span&gt;&lt;/b&gt;이란게 포함되어 있는 유니버셜 익스프레스 패스 4를 리미티드, 리미티드 &amp;amp; 펀, 버라이어티 라이드 중 택 1 하여 구매하면 된다.&lt;br /&gt;이 티켓은 정말 사악한게 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;가격도 비싼데&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입&lt;/span&gt;장권이 별도&lt;/b&gt;&lt;/span&gt;다.&lt;br /&gt;게다가 얼리파크인 보다는 양호하지만 마찬가지로 조기 품절된다.&lt;br /&gt;사람 심리가 다 똑같으니 이런 현상은 당연하다.&lt;br /&gt;&lt;br /&gt;뭐 좋다. 어찌됐든 사면 그만이니.&lt;br /&gt;하지만 직장 다니는 사람들이 자기 여행일자를 한달도 훨씬 전에 휴가 기안 내고 승인 받고 그러다 문제 생기면 휴가 취소 되면?&lt;br /&gt;어렵게 구매한 저 비싼 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;익스프레스 패스는 취소도 안된다&lt;/b&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;그럼 마지막 최후의 수단은 무엇인가?&lt;br /&gt;바로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;정리권&lt;/b&gt;&lt;/span&gt;이다.&lt;br /&gt;정리권이란 그때 그때 (보통 1시간마다인것 같았다.) 슈퍼닌텐도월드에 입장객이 빠져나가면 또 사람이 들어올 수 있으니 즉 자리가 정리되었으므로 새로운 손님이 들어 올 수 있으므로 문을 열어주는 것이 바로 정리권이다.&lt;br /&gt;이 정리권은 입장할 때 등록한 입장권을 USJ앱에 등록하고 정리권 발급 메뉴에서 신청하는 구조로 파크에 입장한 모두가 목을 메는 입장권이므로 발급 받기가 매우 어렵다.&lt;br /&gt;&lt;br /&gt;안다. 당신은 지금 뭐 이런 괴상망측한 제도와 혼란스러운 용어에 어지럼증을 느끼고 있다란것을.&lt;br /&gt;처음 정리권이란 용어를 접했을 땐 도무지 이 괴상한 용어에 대해 혼란이 컸는데 한 번 경험해보니 이젠 익숙한 용어가 되었다. &lt;br /&gt;&lt;br /&gt;정리하자면 닌텐도월드에 입장 가능한 추가 입장권은 두 종류가 있는데 하나는 확약권, 다른 하나는 정리권&lt;br /&gt;확약권이란 사전에 &quot;너님은 몇시에 입장 가능하세요&quot;라고 USJ측에서 발권한 슈퍼닌텐도월드의 입장권이고 익스프레스라는 별도 요금을 지불하여 구매가 가능한 티켓이고&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;정리권이란 &quot;자리가 났으니 올 사람 오세요&quot;라며 앱에서 발행하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;실시간 선착순 입장권이다.&lt;br /&gt;&lt;br /&gt;따라서 가장 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;추천하는 방법은 오픈런&lt;/b&gt;&lt;/span&gt;이다.&lt;br /&gt;슈퍼닌텐도월드 정리권 = 오픈런 이라고 외우면 쉽다.&lt;br /&gt;&lt;br /&gt;일단 오픈런을 성공하려면 7시까진 입장게이트에 도착해 있어야 한다.&lt;br /&gt;아래 좌측 사진은 USJ역에서 빠져나올 때의 모습이고, 우측은 7시의 입장게이트의 모습이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEnGHX/btsEVKrrEzS/mSEMlTxatK0BCsThMMNmH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEnGHX/btsEVKrrEzS/mSEMlTxatK0BCsThMMNmH1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;800&quot; data-filename=&quot;IMG_7126.jpeg&quot; style=&quot;width: 29.5537%; margin-right: 10px;&quot; data-widthpercent=&quot;29.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEnGHX/btsEVKrrEzS/mSEMlTxatK0BCsThMMNmH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEnGHX%2FbtsEVKrrEzS%2FmSEMlTxatK0BCsThMMNmH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDtOVl/btsE0Jw3mZC/ywckStiuXIBaCPoK7E11F1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDtOVl/btsE0Jw3mZC/ywckStiuXIBaCPoK7E11F1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot; data-filename=&quot;IMG_7124.jpeg&quot; data-widthpercent=&quot;70.1&quot; style=&quot;width: 69.2835%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDtOVl/btsE0Jw3mZC/ywckStiuXIBaCPoK7E11F1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDtOVl%2FbtsE0Jw3mZC%2FywckStiuXIBaCPoK7E11F1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지하철에서 내렸을 당시의 플랫폼 상황 영상도 첨부한다.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size18&quot;&gt;오픈런을 하여 7시까지 파크 게이트에 다다랐다면 7시 20분 전후로 입장이 가능하고 입장하자 마자 앱에서 정리권을 발부 받으면 슈퍼닌텐도월드에 입장할 수 있다.&lt;br /&gt;(참고-유니버셜 스튜디오재팬의 개장 시간은 그날 그날 다르기 때문에 앱으로 확인하길 바란다.)&lt;br /&gt;참고로 7시 30분 정도 까지는 슈퍼닌텐도월드는 그냥 들어갈 수 있었기에 정리권 메뉴로 발급 받을 수 없었고 35분쯤 되니 그때부터 발급이 진행되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_20240217_202134577.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9zM0N/btsEY94sOIn/QMoW54zm5QRBNeTlea5clk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9zM0N/btsEY94sOIn/QMoW54zm5QRBNeTlea5clk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9zM0N/btsEY94sOIn/QMoW54zm5QRBNeTlea5clk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9zM0N%2FbtsEY94sOIn%2FQMoW54zm5QRBNeTlea5clk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-filename=&quot;edited_KakaoTalk_20240217_202134577.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;초등 저학년과 오픈런 해봤는데 결코 힘들지 않았다.&lt;br /&gt;입장 후 슈퍼닌텐도월드로 향하는 사람들의 영상인데 유튜브 등에서 보여주는 영상처럼 치열하거나 그런 상황은 아니었다.&lt;br /&gt;어쩌면 귀멸의 칼날 때문에 분산되어 상대적으로 수월했을지도 모른다.&lt;br /&gt;USJ 오픈런 관련 유튜브 영상만 봤을 땐 &quot;와... 이거 빡세게 뛰어야 하는데 그 먼 거리까지 어떻게 뛰지?&quot; 싶었지만 절대 아니다.&lt;br /&gt;너무 겁먹지 말자.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size18&quot;&gt;걷기와 살짝 뛰기를 반복하며 가다보면 아까 말했듯이 정리권이 발부되는 시점이 생긴다.&lt;br /&gt;가면서 앱에서 정리권 발부 화면을 계속 새로고침 해야 한다.&lt;br /&gt;난 8시 정리권이 있길래 냉큼 받았다.&lt;br /&gt;정리권 발급도 원하는 시간을 10분 단위로 선택 가능한데 시간을 선택하지 말고 그냥 가장 빠른 시간대를 자동으로 선택 버튼을 통해 아무거나 빠른걸 선택하는걸 추천한다.&lt;br /&gt;괜히 분까지 고르다 놓친다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_IMG_7188.PNG&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr4avm/btsEWKEz7Ek/zbdpKdRSlwsPFk6KQQZ9e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr4avm/btsEWKEz7Ek/zbdpKdRSlwsPFk6KQQZ9e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr4avm/btsEWKEz7Ek/zbdpKdRSlwsPFk6KQQZ9e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr4avm%2FbtsEWKEz7Ek%2FzbdpKdRSlwsPFk6KQQZ9e0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-filename=&quot;edited_IMG_7188.PNG&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 정리권을 발급 받았다면 해당 시간에 맞춰 닌텐도월드로 이동하면 딱 저 지점에서 직원이 정리권 확인 후 안으로 들여보내준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_7131.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ntiek/btsEYNAqBSB/us2GHHa0U8SFRoLcOMJel0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ntiek/btsEYNAqBSB/us2GHHa0U8SFRoLcOMJel0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ntiek/btsEYNAqBSB/us2GHHa0U8SFRoLcOMJel0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fntiek%2FbtsEYNAqBSB%2Fus2GHHa0U8SFRoLcOMJel0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_7131.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;그럼 이런 환상적인 게임세계 보상이 오픈런 용사님에게 보상으로 지급된다.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;이게 끝이다?&lt;br /&gt;아니다. 이제 절반 왔다.&lt;br /&gt;저따위 풍경은 나중에 천천히 감상해도 늦지 않는다.&lt;br /&gt;영상을 봐라 저게 어떻게 아침시간 영상이겠는가?&lt;br /&gt;곧바로 쿠파성으로 뛰어야 한다.&lt;br /&gt;그래야 이번 방문의 최종 목적인 마리오카트 탑승이 가능하기 때문이다.&lt;br /&gt;정말 최종 보스 답다. 쿠파&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NqjF9/btsEWyxttq6/A08VHA5fEP6R1iXNOTPpzK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NqjF9/btsEWyxttq6/A08VHA5fEP6R1iXNOTPpzK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;800&quot; data-filename=&quot;IMG_7157.JPG&quot; style=&quot;width: 35.5814%; margin-right: 10px;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NqjF9/btsEWyxttq6/A08VHA5fEP6R1iXNOTPpzK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNqjF9%2FbtsEWyxttq6%2FA08VHA5fEP6R1iXNOTPpzK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nYYJA/btsEV9dCs9u/llogSHQ8i65MoXrTfxO6Kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nYYJA/btsEV9dCs9u/llogSHQ8i65MoXrTfxO6Kk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot; data-filename=&quot;IMG_7139.JPG&quot; data-widthpercent=&quot;64&quot; style=&quot;width: 63.2558%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nYYJA/btsEV9dCs9u/llogSHQ8i65MoXrTfxO6Kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnYYJA%2FbtsEV9dCs9u%2FllogSHQ8i65MoXrTfxO6Kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ATJct/btsEYWxutqy/PwJxWk5h7WoetRKtEH2ua1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ATJct/btsEYWxutqy/PwJxWk5h7WoetRKtEH2ua1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;800&quot; data-filename=&quot;IMG_7156.JPG&quot; data-widthpercent=&quot;36&quot; style=&quot;width: 35.5814%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ATJct/btsEYWxutqy/PwJxWk5h7WoetRKtEH2ua1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FATJct%2FbtsEYWxutqy%2FPwJxWk5h7WoetRKtEH2ua1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX2sre/btsEZl4Rz4i/MzvJD8DdxcFBHTk7umrgeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX2sre/btsEZl4Rz4i/MzvJD8DdxcFBHTk7umrgeK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot; data-filename=&quot;IMG_7140.JPG&quot; style=&quot;width: 63.2558%;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX2sre/btsEZl4Rz4i/MzvJD8DdxcFBHTk7umrgeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX2sre%2FbtsEZl4Rz4i%2FMzvJD8DdxcFBHTk7umrgeK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보이는가? 저 줄의 행렬을&lt;br /&gt;그나마 이건 오픈런해서 30분 정도 기다리면 탑승 할 수 있었다.&lt;br /&gt;나중되면 이 줄의 두배 세배 네배 꼬불꼬불 구불구불 이어질 것이다.&lt;br /&gt;얼리파크인 티켓을 구매했다면 10분 정도면 탑승 할 수 있었을 것이다.&lt;br /&gt;그래도 중간 중간 슈퍼마리오로 꾸며져 있어서 크게 지루하진 않았다만 이거 하나 타겠다고 지하에서 120분씩 기다려야 한다면 현타 강하게 올 것 같다.&lt;br /&gt;그정도로 기다리며 탈만한 어트랙션은 아니었다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;30분 정도 기다려서는 반드시 타야만 하는 어트랙션이긴 하다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;허니팁&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;팁1 : 입장권 구매처&lt;br /&gt;입장 티켓 가격이 같은 공식 판매처라고 다 같은 가격에 팔지 않았다.&lt;br /&gt;특정 업체는 다른 곳들과 달리 비싸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ticket.jpg&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TCnTc/btsEWjAsJZ2/8S43rtwKdr820iKFJ4YlYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TCnTc/btsEWjAsJZ2/8S43rtwKdr820iKFJ4YlYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TCnTc/btsEWjAsJZ2/8S43rtwKdr820iKFJ4YlYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTCnTc%2FbtsEWjAsJZ2%2F8S43rtwKdr820iKFJ4YlYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1147&quot; height=&quot;634&quot; data-filename=&quot;ticket.jpg&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;상품 소개와 구매 인터페이스가 편리한건 klook인것 같은데 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;난 투어비스에서&lt;span&gt; &lt;/span&gt;&lt;/span&gt;구매했다.&lt;br /&gt;가격 등을 비교해서 구매하길 바란다.&lt;br /&gt;&lt;br /&gt;팁2 : 입장권 출력 이유&lt;br /&gt;입장권은 반드시 출력해서 가야 한다.&lt;br /&gt;안일한 마음에 캡쳐해서 폰으로 보여주면 되겠지라는 생각은 입장의 지연의 빌미를 제공한다.&lt;br /&gt;게이트에서 전용 리더기로 읽어야 가능한데 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;종이가 아니면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 읽히질 않는다.&lt;br /&gt;또한 USJ 앱에 입장권을 등록해야 하는데 이 역시 이미지로는 불가하다. 인식 절대 안된다.&lt;br /&gt;외워라 입장은 출력(프린트다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_1102.PNG&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgymYm/btsEXvtFz9w/3jIlVHSCd3gOJCzCgiNA41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgymYm/btsEXvtFz9w/3jIlVHSCd3gOJCzCgiNA41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgymYm/btsEXvtFz9w/3jIlVHSCd3gOJCzCgiNA41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgymYm%2FbtsEXvtFz9w%2F3jIlVHSCd3gOJCzCgiNA41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;800&quot; data-filename=&quot;IMG_1102.PNG&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 출력을 못했다면 편의점에서도 출력서비스가 된다.&lt;br /&gt;프린트 방법은 조만간 다루겠다. 개빡친다.&lt;br /&gt;&lt;br /&gt;팁3 : 파워업밴드는 반드시 사든지 빌리든지 하자.&lt;br /&gt;파워업밴드가 없으면 닌텐도월드를 절반밖에 즐길 수 없다.&lt;br /&gt;파워업밴드는 곳곳에 팔고 있으니 사람 많은곳에서 사지 말자. 시간 아깝다.&lt;br /&gt;당근마켓에선 3만원 ~ 3만 5천원 정도에 팔던데 솔직히 양심 없는 사람들 같다.&lt;br /&gt;4,800엔이면 요즘 환율로 42,500원 정도다.&lt;br /&gt;지들 놀거 다 놀고 세금 환급까지 받아놓구선 그걸 저 가격에 판다니 ㅡㅡ&lt;br /&gt;대여도 가능한데 난 그냥 두 개 샀다.&lt;br /&gt;&lt;br /&gt;팁4 : 닌텐도월드내 유일한 레스토랑 키노피오 줄서기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_7184.JPG&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ke8kr/btsE0rcrph2/jyAFMkYQsE1StdUnpc5bg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ke8kr/btsE0rcrph2/jyAFMkYQsE1StdUnpc5bg1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ke8kr/btsE0rcrph2/jyAFMkYQsE1StdUnpc5bg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKe8kr%2FbtsE0rcrph2%2FjyAFMkYQsE1StdUnpc5bg1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;800&quot; data-filename=&quot;IMG_7184.JPG&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키노피오레스토랑은 2팀으로 나누어 1팀은 관람을 1명은 줄을 서자.&lt;br /&gt;10시 30분쯤 줄서야 12시에 밥 먹을 수 있다.&lt;br /&gt;요것도 나중에 다루겠다.&lt;br /&gt;키노피오 레스토랑의 입구인 요기까지는 혼자 줄을 설 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;팁5 : 스타팝콘&lt;br /&gt;스타모양 팝콘도 파는데 개비싸고 사려면 20분은 넘게 기다려야 한다.&lt;br /&gt;직원이 동작되는지 확인하고 일일이 설명하기 때문이다.&lt;br /&gt;사려면 각오해야 한다.&lt;br /&gt;&lt;br /&gt;팁6 : 퇴장 동선에 위치한 워터월드 즐기기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_7247.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cumX3x/btsE0qR8BL7/umca5vA5WjRvGkw7BwyOfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cumX3x/btsE0qR8BL7/umca5vA5WjRvGkw7BwyOfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cumX3x/btsE0qR8BL7/umca5vA5WjRvGkw7BwyOfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcumX3x%2FbtsE0qR8BL7%2Fumca5vA5WjRvGkw7BwyOfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_7247.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;닌텐도월드에서 퇴장할 땐 시간을 잘 맞춰 퇴장하면 동선에 있는 워터월드 관람이 가능하니 워터월드 관람 시간을 미리 확인하고 가면 좋다.&lt;br /&gt;난 우연하게 시간이 맞아서 어떨결에 관람했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;팁7 : 텍스리펀&lt;br /&gt;기념품 영수증은 버리지 말자.&lt;br /&gt;세금 환급을 받을 수 있는데 게이트쪽 왼편에 위치해 있는데 다들 퇴장할 때 가면 자칫 줄이 너무 길어 환급 받느라 시간 낭비할 수 있으니 가급적 미리 받는걸 추천한다.&lt;br /&gt;참고로 난 3시 30분쯤에 받았는데 5분 정도 걸려 받았다.&lt;br /&gt;모자, 파워업 밴드 같은 기념품이 대상이다.(먹는건 제외)&lt;br /&gt;비닐로 밀봉해서 돌려준다.&lt;br /&gt;&lt;br /&gt;팁8 : 직원에게 거절하라&lt;br /&gt;닌텐도월드내 어떤 게임은 4명이서 할 수 있는데 일행이 2명이면 2명이서 하겠다고 해라.&lt;br /&gt;우리팀은 괜히 얼라들과 4인 배정되어 했다가 기다린 보람도 없이 게임 실패하고 열쇠도 못 얻었다.&lt;br /&gt;(열쇠 3개를 모아야 최종 게임에 도전할 자격이 주어진다.)&lt;br /&gt;&lt;br /&gt;팁9 : 한국어 가능한 직원&lt;br /&gt;한국어 가능 직원이 있긴 한데 게임룰에 대해 물어봤다가 낭패를 봤다.&lt;br /&gt;내 파워업밴드에 열쇠 2개, 다른 사람 파워업밴드에 열쇠 1개가 있는 상황인데 이걸 합쳐서 최종 보스에게 도전 가능하냐 물었더니 된다하여 최종 보스 구역으로 이동하여 보여주니 뺀찌 맞았다. -_-&lt;br /&gt;일본인은 몰라도 아는척 한다고 80년대 선생님이 그러셨는데...&lt;br /&gt;&lt;br /&gt;팁10 : 입장권 유효기간&lt;br /&gt;입장권은 지정 당일이 아닌 지정일로부터 수개월간 유효하다.&lt;br /&gt;그 지정한 날짜의 시즌에만 맞다면 해당 기간내 입장이 가능하다.&lt;br /&gt;&lt;br /&gt;팁11 : 날씨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7DqAM/btsEWAvguKX/0f6SdWQxTtpG2wCHmDkKdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7DqAM/btsEWAvguKX/0f6SdWQxTtpG2wCHmDkKdK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;800&quot; data-filename=&quot;IMG_6743.PNG&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7DqAM/btsEWAvguKX/0f6SdWQxTtpG2wCHmDkKdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7DqAM%2FbtsEWAvguKX%2F0f6SdWQxTtpG2wCHmDkKdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kN98F/btsEZTUzPYr/Sxxw4b1GoGFlsyudHBcdK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kN98F/btsEZTUzPYr/Sxxw4b1GoGFlsyudHBcdK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;800&quot; data-filename=&quot;IMG_6742.PNG&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kN98F/btsEZTUzPYr/Sxxw4b1GoGFlsyudHBcdK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkN98F%2FbtsEZTUzPYr%2FSxxw4b1GoGFlsyudHBcdK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bktaK3/btsEXsjpe9j/tjOHRRlYVW0CGJmTEmQB41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bktaK3/btsEXsjpe9j/tjOHRRlYVW0CGJmTEmQB41/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;800&quot; data-filename=&quot;IMG_6741.PNG&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bktaK3/btsEXsjpe9j/tjOHRRlYVW0CGJmTEmQB41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbktaK3%2FbtsEXsjpe9j%2FtjOHRRlYVW0CGJmTEmQB41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;내 경험상&lt;span&gt; &lt;/span&gt;&lt;/span&gt;웨더뉴스가 아큐웨더나 웨더채널에 비해 잘 맞았다.&lt;br /&gt;검색한게 맞다면 웨더뉴스만 일본쪽 서비스인걸로 알고 있다.&lt;br /&gt;닌텐도월드 방문하는 이유가 이 파란 하늘 때문인데 비오면 속상하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음-1.jpg&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bObXrL/btsE0ISDv53/7KOYo8sV08r3GKmQmfdpu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bObXrL/btsE0ISDv53/7KOYo8sV08r3GKmQmfdpu0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bObXrL/btsE0ISDv53/7KOYo8sV08r3GKmQmfdpu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbObXrL%2FbtsE0ISDv53%2F7KOYo8sV08r3GKmQmfdpu0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;800&quot; data-filename=&quot;제목 없음-1.jpg&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팁12 : 외부음식물&lt;br /&gt;물이나 패트병에 든 음료는 인당 1개씩 500ml에 한해 가능하다던데 주머니에 있는건 검사 안한다.&lt;br /&gt;가뜩이나 사람 많은데 식당은 줄을 서야 하고 애는 배고프다고 하면 멘붕 온다.&lt;br /&gt;USJ측이 고객을 배려하지 않으니 각자도생급 식량은 주머니에 넣고 가자.&lt;br /&gt;먹고 살아야 하지 않겠는가?&lt;/p&gt;</description>
      <category>비행기타고 가는 여행</category>
      <category>USJ</category>
      <category>닌텐도월드</category>
      <category>슈퍼마리오</category>
      <category>얼리파크인</category>
      <category>오픈런</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/639</guid>
      <comments>https://hippalus.tistory.com/639#entry639comment</comments>
      <pubDate>Sat, 17 Feb 2024 21:28:04 +0900</pubDate>
    </item>
    <item>
      <title>작심하고 불편하게 만든 토드(toad) 주석 이탤릭 기울임 폰트 해제하기</title>
      <link>https://hippalus.tistory.com/637</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바 진영은 정말 볼때마다 개발자, 기획자들이 작심하고 딴지 거는 느낌을 갖도록 만든 툴의 요소가 한두개가 아니다.&lt;br /&gt;M$가 정말이지 볼수록 혜자임&lt;br /&gt;&lt;br /&gt;토드도 가뜩이나 불편한데(계속 시간 지나면 session이 지멋대로 끊기질 않나) 기본 에디터에 주석을 입력하면 아주 그냥 상콤하게 가독성을 망가뜨려준다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;가독성 뿐만 아니라 커서가 도대체 어디에 위치해 있는지 조차 알 수 없게 만들어 편집 자체를 방해한다.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;153&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btfLsL/btsD8zXlqIg/QrsVMI0Rk2GOWqxvIySeiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btfLsL/btsD8zXlqIg/QrsVMI0Rk2GOWqxvIySeiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btfLsL/btsD8zXlqIg/QrsVMI0Rk2GOWqxvIySeiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtfLsL%2FbtsD8zXlqIg%2FQrsVMI0Rk2GOWqxvIySeiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;153&quot; height=&quot;48&quot; data-origin-width=&quot;153&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이딴건 바퀴벌레 없애듯 그때 그때 발견 즉시 없애야 한다.&lt;br /&gt;에디터에서 빈땅 클릭하고 마우스 우측 눌러 맨 아래쪽 보면 Editor Options... 메뉴를 눌러준다.&lt;br /&gt;뭔노무 메뉴는 또 이리 많은지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjJDX/btsD8xrG3Zc/89KUmhEtfn8L9KEDB41SK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjJDX/btsD8xrG3Zc/89KUmhEtfn8L9KEDB41SK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjJDX/btsD8xrG3Zc/89KUmhEtfn8L9KEDB41SK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjJDX%2FbtsD8xrG3Zc%2F89KUmhEtfn8L9KEDB41SK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;227&quot; height=&quot;813&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나온 메뉴에서 좌측 트리에 보면 Editor가 있다.&lt;br /&gt;그 안에서 Behavior 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLkG6e/btsEaQLga2W/Sr4EL6xAEQBUTSpfc2K9T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLkG6e/btsEaQLga2W/Sr4EL6xAEQBUTSpfc2K9T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLkG6e/btsEaQLga2W/Sr4EL6xAEQBUTSpfc2K9T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLkG6e%2FbtsEaQLga2W%2FSr4EL6xAEQBUTSpfc2K9T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1074&quot; height=&quot;566&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 하단 Languages의 ... 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhP2yU/btsD3FYLTQY/AleG1DWuqX0w38qvGKGSZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhP2yU/btsD3FYLTQY/AleG1DWuqX0w38qvGKGSZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhP2yU/btsD3FYLTQY/AleG1DWuqX0w38qvGKGSZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhP2yU%2FbtsD3FYLTQY%2FAleG1DWuqX0w38qvGKGSZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;271&quot; height=&quot;161&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하.. 이제 슬슬 딥빡침이 밀려온다.&amp;nbsp;&lt;br /&gt;거기서 Highlighting탭을 눌러 Comment를 누르고 중앙에 Font style의 Italic에 체크를 풀어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwVyDG/btsEb7ZPWR6/QOb7N5totQSfPaPYYRWk4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwVyDG/btsEb7ZPWR6/QOb7N5totQSfPaPYYRWk4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwVyDG/btsEb7ZPWR6/QOb7N5totQSfPaPYYRWk4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwVyDG%2FbtsEb7ZPWR6%2FQOb7N5totQSfPaPYYRWk4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;574&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제서야 비정상의 정상화가 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9uCZ/btsEa9cKsU8/nvgaXvxtQ4T60JlTNwuKe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9uCZ/btsEa9cKsU8/nvgaXvxtQ4T60JlTNwuKe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9uCZ/btsEa9cKsU8/nvgaXvxtQ4T60JlTNwuKe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9uCZ%2FbtsEa9cKsU8%2FnvgaXvxtQ4T60JlTNwuKe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;571&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;툴을 만들어 판매하려면 여러 기능이 들어가는건 좋지만 애시당초 이용자들이 불편함을 느끼지 않게 배려함이 백만번 맞거늘 변태들도 아니고 -_-&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 사용하다보니 하.. 진짜 가지가지도 이런 야물찬 가지가 또 있을까&lt;br /&gt;이번엔 줄이 너무 길면 HOME 키를 눌러도 맨 앞으로 커서가 이동하지 않는게 확인되었다.&lt;br /&gt;마찬가지로 Options까지 온 다음 Editor의 Behavior의 Word wrap를 체크해주면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p9sRV/btsD4ktkJor/1TlNUgdj8OBv21XBFNC2xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p9sRV/btsD4ktkJor/1TlNUgdj8OBv21XBFNC2xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p9sRV/btsD4ktkJor/1TlNUgdj8OBv21XBFNC2xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp9sRV%2FbtsD4ktkJor%2F1TlNUgdj8OBv21XBFNC2xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;568&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 짧아진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xmHEy/btsD5xMwmN1/UG3DZX5CMRiCuRANsLQNf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xmHEy/btsD5xMwmN1/UG3DZX5CMRiCuRANsLQNf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xmHEy/btsD5xMwmN1/UG3DZX5CMRiCuRANsLQNf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxmHEy%2FbtsD5xMwmN1%2FUG3DZX5CMRiCuRANsLQNf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1150&quot; height=&quot;167&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 짧아도 너무 짧다.&lt;br /&gt;Editor &amp;lt; Display로 이동해서 Gutter and Margin의 Position이 80자로 되어 있는걸 자기 컴에 맞게 설정하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HujnE/btsEb8LdQ7o/eCWcooDTK2KJGqQjEDtbo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HujnE/btsEb8LdQ7o/eCWcooDTK2KJGqQjEDtbo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HujnE/btsEb8LdQ7o/eCWcooDTK2KJGqQjEDtbo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHujnE%2FbtsEb8LdQ7o%2FeCWcooDTK2KJGqQjEDtbo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1071&quot; height=&quot;561&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1695&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVUgj/btsD4G3YcDx/8On11UpOkekYRMAKLwZ4Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVUgj/btsD4G3YcDx/8On11UpOkekYRMAKLwZ4Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVUgj/btsD4G3YcDx/8On11UpOkekYRMAKLwZ4Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVUgj%2FbtsD4G3YcDx%2F8On11UpOkekYRMAKLwZ4Jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1695&quot; height=&quot;152&quot; data-origin-width=&quot;1695&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>italic</category>
      <category>toad</category>
      <category>이탤릭체</category>
      <category>토드</category>
      <category>편집기</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/637</guid>
      <comments>https://hippalus.tistory.com/637#entry637comment</comments>
      <pubDate>Tue, 30 Jan 2024 12:43:32 +0900</pubDate>
    </item>
    <item>
      <title>npm module pm2 사용법(자동재실행으로 메모리 위험에서 벗어나보자)</title>
      <link>https://hippalus.tistory.com/636</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pm2란?&lt;/b&gt;&lt;br /&gt;pm2는 Node.js 애플리케이션을 관리하기 위한 프로세스 매니저로 애플리케이션을 백그라운드에서 실행하고, 자동으로 재시작하며, 여러 가지 기능을 제공한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;설치와 실행&lt;/b&gt;&lt;br /&gt;npm install pm2 &lt;span style=&quot;color: #ee2323;&quot;&gt;-g&lt;/span&gt;를 실행하면 설치가 가능하다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;반드시 -g로 전역설치&lt;/span&gt;를 해야만 한다.&lt;br /&gt;안그러면 command not found오류를 만나게 될 것이야~&lt;br /&gt;&lt;br /&gt;기본 실행방법은 아래와 같다.&lt;br /&gt;(참고로 내 node.js 푸시 서버 이름은 pushServer.js다.)&lt;br /&gt;&lt;br /&gt;시작&lt;br /&gt;pm2&amp;nbsp;start&amp;nbsp;pushServer.js &lt;br /&gt;&lt;br /&gt;중지&lt;br /&gt;pm2&amp;nbsp;stop&amp;nbsp;pushServer.js&lt;br /&gt;&lt;br /&gt;만약 실행중인 프로그램을 또 실행하려 들면 기특하게도 이런 오류를 내뱉어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;21&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chCFP0/btsDQ4praVo/K8oiQb5DJUR1Jds1svG5k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chCFP0/btsDQ4praVo/K8oiQb5DJUR1Jds1svG5k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chCFP0/btsDQ4praVo/K8oiQb5DJUR1Jds1svG5k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchCFP0%2FbtsDQ4praVo%2FK8oiQb5DJUR1Jds1svG5k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;21&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;21&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pm2를 사용하는 이유는 로그아웃을 해도 pm2로 돌리면 나중에 관리가 되기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;자동 재실행&lt;/b&gt;&lt;br /&gt;여기가진 좋다.&lt;br /&gt;그.런.데&amp;nbsp;&lt;br /&gt;내가 만든 푸시 서버 node.js는 node-cron을 사용하여 1분마다 체크 로직이 들어있는데 이상한게 계속 메모리 점유율이 올라갔다. 59M .. 60M .. 71M ...&lt;br /&gt;의심가는 로직을 주석처리 해보고 별짓 다 해봐도 아무리 용을 써도 메모리 점유율이 그대로였다.&lt;br /&gt;node-cron만 사용하면 그랬다.&lt;br /&gt;혹시나 싶어 pm2 대신 그냥 node pushServer.js로 실행한들 동일했다.&lt;br /&gt;&lt;br /&gt;그러다 pm2는 자동 재실행하거나 메모리 사이즈가 일정 수치를 넘어서면 자동 재실행 등 다양한 옵션질이 가능하니 이를 활용하기로 했다.&lt;br /&gt;&lt;br /&gt;일단 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;메모리 오버시 자동 재실행&lt;/b&gt;&lt;/span&gt;을 하기 위해선 별도의 js를 만들어야 한다.&lt;br /&gt;이름은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;process.config.js&lt;/b&gt;&lt;/span&gt;라 지었다.&lt;br /&gt;&lt;br /&gt;module.exports&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apps:&amp;nbsp;[{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;script:&amp;nbsp;&quot;pushServer.js&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;instances:&amp;nbsp;&quot;max&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exec_mode:&amp;nbsp;&quot;cluster&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max_memory_restart: '100M' // 프로세스의 메모리가 100MB에 도달하면 reload 실행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}] &lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;이 process.config.js를 저장하고 실행을 시킨다.&lt;br /&gt;pm2 start process.config.js&amp;nbsp; &amp;nbsp;(종료는 pm2 stop process.config.js)&lt;br /&gt;&lt;br /&gt;이 경우 인스턴스가 max로 되어 있는데&lt;br /&gt;내 경우 새벽 3시마다 재실행을 하고 싶고 1개의 인스턴스만 실행되어야 하므로 내용을 이렇게 바꿔줬다.&lt;br /&gt;max대신 1, cluster대신 fork&lt;br /&gt;&lt;br /&gt;module.exports&amp;nbsp;=&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apps:&amp;nbsp;[{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&quot;pushServer&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;script:&amp;nbsp;&quot;/node/push/pushServer.js&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;instances:&amp;nbsp;1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exec_mode:&amp;nbsp;&quot;fork&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cron_restart: '0 3 * * *', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log:&amp;nbsp;&quot;/node/push/log/pushServer.log&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}], &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;이후 pm2 start process.config.js를 실행하면 알아서 잘 동작한다.&lt;br /&gt;해당 파일안의 script를 원하는 인스턴스의 개수 만큼 실행해주고 로그 또한 원하는 위치에 만들어준다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;혹시라도 실수로 instances를 이미 max로 실행해서 프로세스가 여러개 생성되었다면 pm2 list를 실행해보고&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;pm2 delete all&lt;/span&gt; 명령어로 깨끗하게 다 지워버리면 된다.&lt;br /&gt;&lt;/i&gt;&lt;/span&gt; &lt;s&gt;&lt;span style=&quot;color: #3b3b3b; text-align: start;&quot;&gt;성형 후 다시 새롭게 시작할 수 있다.&lt;/span&gt;&lt;/s&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;모니터링&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&lt;/span&gt;실행중인 node.js 프로그램의 상태를 확인하고 싶다면 monit 기능을 이용하면 된다.&lt;br /&gt;pm2&amp;nbsp;monit&lt;br /&gt;좌측 상단엔 실행중인 프로세스 리스트로 화살표로 이동이 가능하다.&lt;br /&gt;우측 하단에 Metadata에서 앱 이름과 버전 재실행 횟수 실행기간 등등 정보와&amp;nbsp;&lt;br /&gt;좌측 하단엔 메모리 정보들을 확인 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lb45Z/btsDLq1eHfI/HlO6ddxtA7Y3nUQEKT6al1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lb45Z/btsDLq1eHfI/HlO6ddxtA7Y3nUQEKT6al1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lb45Z/btsDLq1eHfI/HlO6ddxtA7Y3nUQEKT6al1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flb45Z%2FbtsDLq1eHfI%2FHlO6ddxtA7Y3nUQEKT6al1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;574&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모니터 툴을 빠져나올 땐 ctrl+c로 빠져나오면 된다.&lt;br /&gt;하단에 기본적인 사용 안내가 나와있는것을 확인할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;로그파일&lt;/b&gt;&lt;br /&gt;pm2로 실행중인 node.js 프로그램에서 console.log를 찍으면 로그가 .pm2/logs 폴더에 파일로 계속 쌓이는데 이것도 로그 파일 사이즈별로 컨트롤이 가능하다.&lt;br /&gt;이거 안해주면 나중에 어마어마한 사이즈의 로그파일을 경험하게 되니 반드시 해주자.&lt;br /&gt;&lt;br /&gt;방법은 특이하게 npm i가 아닌 pm2 install pm2-logrotate 이렇게 설치해야 한다.&lt;br /&gt;당연히 pm2는 제일 위에 언급하였듯이 npm으로 설치를 미리 해두어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwlmMF/btsDNGvYutK/OKZkpBkveNAWT8OkGWBTaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwlmMF/btsDNGvYutK/OKZkpBkveNAWT8OkGWBTaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwlmMF/btsDNGvYutK/OKZkpBkveNAWT8OkGWBTaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwlmMF%2FbtsDNGvYutK%2FOKZkpBkveNAWT8OkGWBTaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;443&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;pm2 set pm2-logrotate:max_size 1K 또는 pm2 set pm2-logrotate:max_size 1M 이런식으로 실행 후 pm2 start pushServer.js를 실행하면 이후 console.log로 찍은 로그는 저 사이즈를 넘을 경우 자동으로 새로운 파일이 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciCjgj/btsDRbB45ix/llUzLbUov6c7CM8cqXVpkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciCjgj/btsDRbB45ix/llUzLbUov6c7CM8cqXVpkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciCjgj/btsDRbB45ix/llUzLbUov6c7CM8cqXVpkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciCjgj%2FbtsDRbB45ix%2FllUzLbUov6c7CM8cqXVpkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;189&quot; height=&quot;167&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이것도 싫고 하루마다 파일을 생성하고 싶다면?&lt;br /&gt;pm2&amp;nbsp;set&amp;nbsp;pm2-logrotate:rotateInterval&amp;nbsp;'0&amp;nbsp;0&amp;nbsp;*&amp;nbsp;*&amp;nbsp;*'&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b34IWT/btsDKwOiu1N/zOD5gVxnCKRiQUkhkwusRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b34IWT/btsDKwOiu1N/zOD5gVxnCKRiQUkhkwusRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b34IWT/btsDKwOiu1N/zOD5gVxnCKRiQUkhkwusRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb34IWT%2FbtsDKwOiu1N%2FzOD5gVxnCKRiQUkhkwusRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;133&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;끝으로 자동재실행까진 괜찮은데 이 경우 메모리 누수가 발생하는건 아닌가 불안하다.&lt;br /&gt;여기까진 확인을 못해봤다.&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Node.js</category>
      <category>pm2</category>
      <category>pushserver</category>
      <category>메모리</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/636</guid>
      <comments>https://hippalus.tistory.com/636#entry636comment</comments>
      <pubDate>Wed, 24 Jan 2024 08:54:01 +0900</pubDate>
    </item>
    <item>
      <title>리눅스(cent os)에서 좀비 프로세스 kill 시키기</title>
      <link>https://hippalus.tistory.com/635</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발하다 8976 포트를 사용하는 node.js 프로그램을 개발하였는데&amp;nbsp;&lt;br /&gt;listen이 안되길래 분명히 kill을 해줘도 계속 되살아 났다.&lt;br /&gt;&lt;br /&gt;포트 현황을 확인하기 위해 리눅스에서 netstat를 실행해보니 아래처럼 주루룩 나온다.&lt;br /&gt;&lt;br /&gt;netstat&amp;nbsp;-tnlp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEOtP/btsDQVrS9ad/whH9acxBtGNOJXSa2bCfB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEOtP/btsDQVrS9ad/whH9acxBtGNOJXSa2bCfB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEOtP/btsDQVrS9ad/whH9acxBtGNOJXSa2bCfB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEOtP%2FbtsDQVrS9ad%2FwhH9acxBtGNOJXSa2bCfB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;379&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;보다 간단하게 확인하기 위해 grep와 포트번호를 입력하고 실행하면 하나만 나오는게 확인 된다.&lt;br /&gt;&lt;br /&gt;netstat -nap | grep :8976 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;18&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QTYPO/btsDJ0gZkDu/bE4x6CtD0LO0dtdCgnqVP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QTYPO/btsDJ0gZkDu/bE4x6CtD0LO0dtdCgnqVP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QTYPO/btsDJ0gZkDu/bE4x6CtD0LO0dtdCgnqVP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQTYPO%2FbtsDJ0gZkDu%2FbE4x6CtD0LO0dtdCgnqVP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;18&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;18&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이때 root권한으로 실행을 해야 프로세스아이디 확인이 된다는 이야기를 본것 같다.)&lt;br /&gt;21688을 실행시키고 있는 부모의 프로세스ID를 찾는 명령언데 &lt;br /&gt;ps -o ppid= -p 21688&lt;br /&gt;&lt;br /&gt;이걸 실행하니 부모의 프로세스 아이디가 내 경우 11811이었다.&lt;br /&gt;&lt;br /&gt;ps -p 11811&lt;br /&gt;이 process id로 조회를 해보면 pm2로 실행되고 있었다.&lt;br /&gt;해당 프로세스 아이디를 kill 11811 해주고 pm2가 실행하던 프로세스 아이디도 kill해주면 증상이 해결된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Kill</category>
      <category>Linux</category>
      <category>Process</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/635</guid>
      <comments>https://hippalus.tistory.com/635#entry635comment</comments>
      <pubDate>Mon, 22 Jan 2024 18:58:35 +0900</pubDate>
    </item>
    <item>
      <title>svn 모르고 이클립스에서 삭제했을 때 복구하는 방법</title>
      <link>https://hippalus.tistory.com/634</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 이것 저것 만지다 svn을 다시 한 번 연결해 봤는데 어라? 같은 repository가 두개나 존재하네? 잘못본건가?&lt;br /&gt;하나 삭제해야지 싶어 svn 리스트 중 하나를 삭제하였더니 project explorer에서 svn 연결이 그냥 끊겨버렸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcwDlt/btsDJgpBDDC/UuV89SwuywDLWce5VdXMu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcwDlt/btsDJgpBDDC/UuV89SwuywDLWce5VdXMu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcwDlt/btsDJgpBDDC/UuV89SwuywDLWce5VdXMu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcwDlt%2FbtsDJgpBDDC%2FUuV89SwuywDLWce5VdXMu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;290&quot; height=&quot;47&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;project explorer의 파일에서 Team을 선택하면 우측에 이런 메뉴들이 나와야 하는데 덩그러니 몇 안되는 메뉴만 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCn7z/btsDJEcHAh5/r1b0BuOzHcBkaWmpzKslik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCn7z/btsDJEcHAh5/r1b0BuOzHcBkaWmpzKslik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCn7z/btsDJEcHAh5/r1b0BuOzHcBkaWmpzKslik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCn7z%2FbtsDJEcHAh5%2Fr1b0BuOzHcBkaWmpzKslik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;295&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 연결되어 있던 svn을 삭제했나보다. -_-&lt;br /&gt;아 연결되어 있는 svn이면 경고를 주던가!&lt;br /&gt;&lt;br /&gt;다시&amp;nbsp;연결해야하니&amp;nbsp;일단&amp;nbsp;project에서&amp;nbsp;오른쪽&amp;nbsp;마우스&amp;nbsp;클릭&amp;nbsp;&amp;rarr;&amp;nbsp;[Team]&amp;nbsp;&amp;rarr;&amp;nbsp;[Share&amp;nbsp;Project]&lt;br /&gt;Use existing repository location 라디오 버튼을 선택하고 next를 하면 다시 살아난다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/634</guid>
      <comments>https://hippalus.tistory.com/634#entry634comment</comments>
      <pubDate>Fri, 19 Jan 2024 19:44:32 +0900</pubDate>
    </item>
    <item>
      <title>NFT 개발하기 - 2편 IPFS에 node.js로 파일 다운로드하기</title>
      <link>https://hippalus.tistory.com/633</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1편에서 기본적인 설정을 통해 node.js를 이용한&amp;nbsp; IPFS에 파일 업로드를 해보았다.&lt;br /&gt;이번엔 다운로드다.&lt;br /&gt;이미 많은걸 해두었기에 다운로드는 더 쉽다.&lt;br /&gt;&lt;br /&gt;일단 IPFS는 실행해둬야 한다.&lt;br /&gt;윈도우용이든&amp;nbsp; CMD에서 ipfs daemon 명령어를 이용해서든&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/85Uki/btsDETolfVm/1Hi1QZ6MNno8NBVpEHXfq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/85Uki/btsDETolfVm/1Hi1QZ6MNno8NBVpEHXfq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/85Uki/btsDETolfVm/1Hi1QZ6MNno8NBVpEHXfq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F85Uki%2FbtsDETolfVm%2F1Hi1QZ6MNno8NBVpEHXfq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;599&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbhGbM/btsDHna77Ee/wvkQbDxiFZW85WkFqUA0xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbhGbM/btsDHna77Ee/wvkQbDxiFZW85WkFqUA0xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbhGbM/btsDHna77Ee/wvkQbDxiFZW85WkFqUA0xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbhGbM%2FbtsDHna77Ee%2FwvkQbDxiFZW85WkFqUA0xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;437&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 만들었던 d:\Project\NFT 폴더를 계속 이용할 것이다.&lt;br /&gt;appdown.js란 파일을 만들고 그 안에 이렇게 타이핑 해보자&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;IPFS&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;ipfs-api&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;ipfs&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;IPFS&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;({&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;5001&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;hash&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;QmfHZXP......VHfHkuntm86xY1vg&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;; // 앞서 업로드 하고 받아낸 해시값&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;ipfs&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;hash&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;Error while downloading file:&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;File download success! Result:&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;No files found for the given hash.&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 hash부분이다.&lt;br /&gt;업로드 하고 받아낸 해시값을 입력해야 한다.&lt;br /&gt;&lt;br /&gt;저장 후 node appdown.js를 실행하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq785a/btsDBRyzHUY/ucWsJzHbBMcowaDzIVpibK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq785a/btsDBRyzHUY/ucWsJzHbBMcowaDzIVpibK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq785a/btsDBRyzHUY/ucWsJzHbBMcowaDzIVpibK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq785a%2FbtsDBRyzHUY%2FucWsJzHbBMcowaDzIVpibK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;315&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드시 사용한 txt파일 내용을 확인할 수 있다.&lt;/p&gt;</description>
      <category>NFT</category>
      <category>IPFS</category>
      <category>NFT</category>
      <category>Node.js</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/633</guid>
      <comments>https://hippalus.tistory.com/633#entry633comment</comments>
      <pubDate>Fri, 19 Jan 2024 08:53:24 +0900</pubDate>
    </item>
    <item>
      <title>이클립스 기본 controller class와 mapper, xml 만드는 법</title>
      <link>https://hippalus.tistory.com/632</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Controller 생성&lt;br /&gt;Project Explorer의 Java Resources에서 마우스 우측 버튼을 눌러 New를 선택하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cusNgl/btsDEUzVs3f/1x20PNGLXRuEtwmngEG7Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cusNgl/btsDEUzVs3f/1x20PNGLXRuEtwmngEG7Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cusNgl/btsDEUzVs3f/1x20PNGLXRuEtwmngEG7Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcusNgl%2FbtsDEUzVs3f%2F1x20PNGLXRuEtwmngEG7Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;259&quot; height=&quot;95&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측에 나온 메뉴의 Class를 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ni2SV/btsDBRYzVPQ/dpdCLhO1QY0v4qGn1lSzbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ni2SV/btsDBRYzVPQ/dpdCLhO1QY0v4qGn1lSzbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ni2SV/btsDBRYzVPQ/dpdCLhO1QY0v4qGn1lSzbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fni2SV%2FbtsDBRYzVPQ%2FdpdCLhO1QY0v4qGn1lSzbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;277&quot; height=&quot;529&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name에 알맞은 컨트롤러 이름을 지정해주자&lt;br /&gt;.java는 안 적어도 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDA8rn/btsDAaR6Y4u/e0rTNBqprk2FMHn0HHlmJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDA8rn/btsDAaR6Y4u/e0rTNBqprk2FMHn0HHlmJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDA8rn/btsDAaR6Y4u/e0rTNBqprk2FMHn0HHlmJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDA8rn%2FbtsDAaR6Y4u%2Fe0rTNBqprk2FMHn0HHlmJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;529&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음엔 Mapper class&lt;br /&gt;똑같이 해되 이번엔 Interface를 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgQyiS/btsDCVl6PqG/LZC13BPHI0alnma5q6Dad1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgQyiS/btsDCVl6PqG/LZC13BPHI0alnma5q6Dad1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgQyiS/btsDCVl6PqG/LZC13BPHI0alnma5q6Dad1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgQyiS%2FbtsDCVl6PqG%2FLZC13BPHI0alnma5q6Dad1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;278&quot; height=&quot;531&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑같이 이름을 적고 Finish를 선택하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kH72k/btsDCWehei5/DWYrxIWlK6OpPdNvgq3kVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kH72k/btsDCWehei5/DWYrxIWlK6OpPdNvgq3kVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kH72k/btsDCWehei5/DWYrxIWlK6OpPdNvgq3kVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkH72k%2FbtsDCWehei5%2FDWYrxIWlK6OpPdNvgq3kVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;417&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 컨트롤러 클래스와 매퍼 클래스가 이클립스에 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcgcB7/btsDyQ7oyy6/xtvXKbgegsXpRtKsEsq7uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcgcB7/btsDyQ7oyy6/xtvXKbgegsXpRtKsEsq7uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcgcB7/btsDyQ7oyy6/xtvXKbgegsXpRtKsEsq7uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcgcB7%2FbtsDyQ7oyy6%2FxtvXKbgegsXpRtKsEsq7uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;218&quot; height=&quot;71&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src쪽으로 이동해 보면 &lt;br /&gt;나는 log란 폴더 아래에 두길 원했으므로 log밑에 컨트롤러 클래스와 mapper 폴더 아래에 매퍼 클래스가 위치한게 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eB836E/btsDBPfq0xy/DF0ucBJv4bye914knUrLZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eB836E/btsDBPfq0xy/DF0ucBJv4bye914knUrLZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eB836E/btsDBPfq0xy/DF0ucBJv4bye914knUrLZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeB836E%2FbtsDBPfq0xy%2FDF0ucBJv4bye914knUrLZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;222&quot; height=&quot;72&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제 마지막으로 매퍼와 연결되는 xml을 만들어 본다.&lt;br /&gt;src폴더 하위의 resources폴더를 찾아간 후 log 폴더를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQVgxR/btsDBvHUR7T/qJT62hOa7p8j1vR2Jd0D20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQVgxR/btsDBvHUR7T/qJT62hOa7p8j1vR2Jd0D20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQVgxR/btsDBvHUR7T/qJT62hOa7p8j1vR2Jd0D20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQVgxR%2FbtsDBvHUR7T%2FqJT62hOa7p8j1vR2Jd0D20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;172&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyQ1sb/btsDACOnl5A/XR9nQYpb49I5k4Ou6zrCI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyQ1sb/btsDACOnl5A/XR9nQYpb49I5k4Ou6zrCI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyQ1sb/btsDACOnl5A/XR9nQYpb49I5k4Ou6zrCI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyQ1sb%2FbtsDACOnl5A%2FXR9nQYpb49I5k4Ou6zrCI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;500&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 log폴더에서 New, File을 선택하여&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OtOlb/btsDD34X2sx/fnnWn3FQBgWf9tkeHc9bVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OtOlb/btsDD34X2sx/fnnWn3FQBgWf9tkeHc9bVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OtOlb/btsDD34X2sx/fnnWn3FQBgWf9tkeHc9bVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOtOlb%2FbtsDD34X2sx%2FfnnWn3FQBgWf9tkeHc9bVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;123&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까와 마찬가지로 이름을 정해주되 xml을 붙여주자.&lt;br /&gt;애시당초xml을 선택하는 방법도 있겠지만 난 이 방법을 선호한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHkEX8/btsDAFEm8kW/gbtZYqLc8n9QE4P9kBzkm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHkEX8/btsDAFEm8kW/gbtZYqLc8n9QE4P9kBzkm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHkEX8/btsDAFEm8kW/gbtZYqLc8n9QE4P9kBzkm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHkEX8%2FbtsDAFEm8kW%2FgbtZYqLc8n9QE4P9kBzkm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;505&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이렇게 mapper 클래스에서 호출할 xml이 생성된다.&lt;br /&gt;x아이콘은 파일이 xml 규격을 따르지 않기 때문인데 이건 뭐 내용 채워주면 없어진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmOGn7/btsDADs2OkO/p9cnBAmjDV6ACem0p74Ma0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmOGn7/btsDADs2OkO/p9cnBAmjDV6ACem0p74Ma0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmOGn7/btsDADs2OkO/p9cnBAmjDV6ACem0p74Ma0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmOGn7%2FbtsDADs2OkO%2Fp9cnBAmjDV6ACem0p74Ma0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;196&quot; height=&quot;38&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>controller</category>
      <category>Eclipse</category>
      <category>mapper</category>
      <category>XML</category>
      <category>매퍼</category>
      <category>이클립스</category>
      <category>컨트롤러</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/632</guid>
      <comments>https://hippalus.tistory.com/632#entry632comment</comments>
      <pubDate>Fri, 19 Jan 2024 08:42:34 +0900</pubDate>
    </item>
    <item>
      <title>NFT 개발하기 - 1편 IPFS에 node.js로 파일 업로드하기</title>
      <link>https://hippalus.tistory.com/630</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;NFT가&amp;nbsp;뭐고&amp;nbsp;왜&amp;nbsp;해야&amp;nbsp;하고&amp;nbsp;그딴&amp;nbsp;시덥잖은&amp;nbsp;이야긴&amp;nbsp;다른&amp;nbsp;글을&amp;nbsp;참조하시고&amp;nbsp;바로&amp;nbsp;실전으로&amp;nbsp;들어간다. &lt;br /&gt;묻지도&amp;nbsp;따지지도&amp;nbsp;말고&amp;nbsp;일단&amp;nbsp;IPFS에&amp;nbsp;파일&amp;nbsp;올리는것부터&amp;nbsp;해야&amp;nbsp;하는데&amp;nbsp;IPFS를&amp;nbsp;이용하는&amp;nbsp;이유는&amp;nbsp;NFT는&amp;nbsp;그림,&amp;nbsp;음원,&amp;nbsp;비디오&amp;nbsp;그딴건데&amp;nbsp;파일을&amp;nbsp;안&amp;nbsp;올리면&amp;nbsp;어쩌겠는가? &lt;br /&gt;그런데&amp;nbsp;이걸&amp;nbsp;한&amp;nbsp;개인의&amp;nbsp;서버에&amp;nbsp;올리면? &lt;br /&gt;서버&amp;nbsp;다운되거나&amp;nbsp;해킹되면? &lt;br /&gt;그러니&amp;nbsp;분산&amp;nbsp;파일&amp;nbsp;시스템인&amp;nbsp;IPFS에&amp;nbsp;올리는거&lt;br /&gt;&lt;br /&gt;궁금하면 더보기~&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NFT(Non-Fungible Token)는 고유한 디지털 자산을 나타내는 토큰으로, 블록체인 기술을 기반으로 합니다. IPFS(InterPlanetary File System)는 분산 파일 시스템으로, 파일을 분산된 네트워크에 저장하고 검색할 수 있게 해줍니다. NFT를 만들 때 IPFS를 이용하는 이유는 여러 가지가 있습니다: &lt;br /&gt;&lt;br /&gt;분산&amp;nbsp;저장:&amp;nbsp;IPFS는&amp;nbsp;파일을&amp;nbsp;여러&amp;nbsp;노드에&amp;nbsp;분산하여&amp;nbsp;저장하므로&amp;nbsp;중앙&amp;nbsp;서버에&amp;nbsp;의존하지&amp;nbsp;않습니다.&amp;nbsp;이는&amp;nbsp;단일&amp;nbsp;지점의&amp;nbsp;장애나&amp;nbsp;특정&amp;nbsp;서버의&amp;nbsp;다운으로&amp;nbsp;인한&amp;nbsp;데이터&amp;nbsp;손실을&amp;nbsp;방지할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;내구성과&amp;nbsp;신뢰성:&amp;nbsp;IPFS는&amp;nbsp;데이터를&amp;nbsp;여러&amp;nbsp;노드에&amp;nbsp;복제하여&amp;nbsp;내구성과&amp;nbsp;신뢰성을&amp;nbsp;높입니다.&amp;nbsp;파일이&amp;nbsp;한&amp;nbsp;노드에서&amp;nbsp;손상되거나&amp;nbsp;사용&amp;nbsp;불가능해지더라도&amp;nbsp;여러&amp;nbsp;다른&amp;nbsp;노드에서&amp;nbsp;해당&amp;nbsp;파일을&amp;nbsp;찾아&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;비용&amp;nbsp;효율성:&amp;nbsp;IPFS를&amp;nbsp;사용하면&amp;nbsp;파일을&amp;nbsp;저장하고&amp;nbsp;검색하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;비용을&amp;nbsp;최적화할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;중앙화된&amp;nbsp;서버를&amp;nbsp;운영하고&amp;nbsp;유지하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;비용을&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;방대한&amp;nbsp;용량과&amp;nbsp;확장성:&amp;nbsp;IPFS는&amp;nbsp;대용량&amp;nbsp;파일을&amp;nbsp;효과적으로&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;확장될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;블록체인이나&amp;nbsp;중앙&amp;nbsp;서버에서&amp;nbsp;처리하기&amp;nbsp;어려운&amp;nbsp;큰&amp;nbsp;용량의&amp;nbsp;미디어&amp;nbsp;파일을&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;안전성과&amp;nbsp;보안:&amp;nbsp;IPFS는&amp;nbsp;데이터를&amp;nbsp;암호화하고&amp;nbsp;해시값을&amp;nbsp;통해&amp;nbsp;무결성을&amp;nbsp;검증하여&amp;nbsp;안전성과&amp;nbsp;보안을&amp;nbsp;강화합니다.&amp;nbsp;블록체인과&amp;nbsp;결합하여&amp;nbsp;높은&amp;nbsp;수준의&amp;nbsp;보안을&amp;nbsp;제공합니다. &lt;br /&gt;&lt;br /&gt;이러한 이유로, NFT를 만들 때 IPFS를 이용하여 디지털 자산을 저장하고 관리하는 것이 일반적으로 권장됩니다. 이를 통해 더 분산화되고 안전한 환경에서 NFT를 다룰 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPFS를 다운받기 위해 공홈에 가보면&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://docs.ipfs.tech/install/ipfs-desktop/#windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.ipfs.tech/install/ipfs-desktop/#windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wiu5Y/btsDASqoCAJ/2G5KUsJKtLEDblCVvuZrbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wiu5Y/btsDASqoCAJ/2G5KUsJKtLEDblCVvuZrbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wiu5Y/btsDASqoCAJ/2G5KUsJKtLEDblCVvuZrbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWiu5Y%2FbtsDASqoCAJ%2F2G5KUsJKtLEDblCVvuZrbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;347&quot; height=&quot;41&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요런 다운로드 페이지 안내 문구를 발견할 수 있다.&amp;nbsp;&lt;br /&gt;눌러보면 아래 링크로 이동되는데&lt;br /&gt;&lt;a href=&quot;https://github.com/ipfs/ipfs-desktop/releases&quot;&gt;https://github.com/ipfs/ipfs-desktop/releases&lt;/a&gt;&lt;br /&gt;웃기는건 window용 exe가 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4LPo/btsDDXEsCAS/lNupS23ivxRKIgc0hzz5E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4LPo/btsDDXEsCAS/lNupS23ivxRKIgc0hzz5E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4LPo/btsDDXEsCAS/lNupS23ivxRKIgc0hzz5E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4LPo%2FbtsDDXEsCAS%2FlNupS23ivxRKIgc0hzz5E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;897&quot; height=&quot;489&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Show all 17 assets를 눌러야 아래처럼 윈도우용 IPFS 인스톨 파일을 확인할 수 있다. -_-&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRq2C/btsDBtYajuE/Ai5M6kR08JJtKAByl2YzK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRq2C/btsDBtYajuE/Ai5M6kR08JJtKAByl2YzK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRq2C/btsDBtYajuE/Ai5M6kR08JJtKAByl2YzK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRq2C%2FbtsDBtYajuE%2FAi5M6kR08JJtKAByl2YzK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;232&quot; height=&quot;28&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운받고 실행하면 설치할 위치 선택해주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0GHiZ/btsDERi9GmF/kDtBQEPa3FaphOiBeBxkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0GHiZ/btsDERi9GmF/kDtBQEPa3FaphOiBeBxkf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0GHiZ/btsDERi9GmF/kDtBQEPa3FaphOiBeBxkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0GHiZ%2FbtsDERi9GmF%2FkDtBQEPa3FaphOiBeBxkf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;357&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치완료되면 실행 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pGnbc/btsDyQftNCq/vQVZlznxtwDbilqf84k1MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pGnbc/btsDyQftNCq/vQVZlznxtwDbilqf84k1MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pGnbc/btsDyQftNCq/vQVZlznxtwDbilqf84k1MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpGnbc%2FbtsDyQftNCq%2FvQVZlznxtwDbilqf84k1MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;356&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 설치 경로로 설치하면 IPFS.exe파일은 아래 경로에 들어가 있다.&lt;/span&gt;&lt;br /&gt;&lt;i&gt;C:\Program Files\IPFS Desktop\resources\app.asar.unpacked\node_modules\kubo\kubo&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vw9yx/btsDERcn4H6/5wkTPTIysRP6jPk0FALLUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vw9yx/btsDERcn4H6/5wkTPTIysRP6jPk0FALLUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vw9yx/btsDERcn4H6/5wkTPTIysRP6jPk0FALLUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvw9yx%2FbtsDERcn4H6%2F5wkTPTIysRP6jPk0FALLUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;235&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 왜 중요하냐면&lt;br /&gt;윈도우용은 설치 후 실행되는 프로그램이 daemon의 일을 맡아 하지만 어떤 책에 보면 이런 설명 조차 없이 daemon을 실행하라고만 해서 한참을 헤매게 만들기 때문이다.&lt;br /&gt;&lt;br /&gt;설치 후 IPFS를 실행해보면 저런 화면이 나오는데 상태와 파일 등등 좌측 메뉴를 눌러보면 뭐 대충 잘 동작하는것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZGOUA/btsDGlYUjZQ/CKXoeyeKJ9XcHGz5RK9bfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZGOUA/btsDGlYUjZQ/CKXoeyeKJ9XcHGz5RK9bfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZGOUA/btsDGlYUjZQ/CKXoeyeKJ9XcHGz5RK9bfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZGOUA%2FbtsDGlYUjZQ%2FCKXoeyeKJ9XcHGz5RK9bfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1420&quot; height=&quot;885&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 웹브라우저로 확인해보고 싶다면&lt;br /&gt;http://127.0.0.1:5001/webui&lt;br /&gt;이렇게 해도 동일한 화면 확인이 가능하다.&lt;br /&gt;&lt;br /&gt;별건으로 IPFS를 어디서든 동작하게 하려면 환경변수에 IPFS를 등록해야 하는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHDMuF/btsDDZaPriJ/Z6xd1LSNPiaGCGDkNhmbv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHDMuF/btsDDZaPriJ/Z6xd1LSNPiaGCGDkNhmbv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHDMuF/btsDDZaPriJ/Z6xd1LSNPiaGCGDkNhmbv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHDMuF%2FbtsDDZaPriJ%2FZ6xd1LSNPiaGCGDkNhmbv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;550&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gy4l8/btsDDVM1JLr/2oKCyhwiR7lR86Y8Ci5rhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gy4l8/btsDDVM1JLr/2oKCyhwiR7lR86Y8Ci5rhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gy4l8/btsDDVM1JLr/2oKCyhwiR7lR86Y8Ci5rhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGy4l8%2FbtsDDVM1JLr%2F2oKCyhwiR7lR86Y8Ci5rhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;528&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/204AS/btsDA5KeE8A/i7Hz2OOpzfL9CZ1WRmQ8k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/204AS/btsDA5KeE8A/i7Hz2OOpzfL9CZ1WRmQ8k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/204AS/btsDA5KeE8A/i7Hz2OOpzfL9CZ1WRmQ8k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F204AS%2FbtsDA5KeE8A%2Fi7Hz2OOpzfL9CZ1WRmQ8k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;501&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 설치한 경로를 등록해주면 된다.&lt;br /&gt;&lt;i&gt;C:\Program Files\IPFS Desktop\resources\app.asar.unpacked\node_modules\kubo\kubo&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be0Ltw/btsDESh5Kov/C8G4ZxqdahP7YoKBUpPMh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be0Ltw/btsDESh5Kov/C8G4ZxqdahP7YoKBUpPMh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be0Ltw/btsDESh5Kov/C8G4ZxqdahP7YoKBUpPMh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe0Ltw%2FbtsDESh5Kov%2FC8G4ZxqdahP7YoKBUpPMh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;160&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 실행된 IPFS Desktop은 트레이 아이콘으로 동작중인걸 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BlJuA/btsDA2M6ZCp/ujk3n7EqQGVrmPQ1y9gf5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BlJuA/btsDA2M6ZCp/ujk3n7EqQGVrmPQ1y9gf5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BlJuA/btsDA2M6ZCp/ujk3n7EqQGVrmPQ1y9gf5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBlJuA%2FbtsDA2M6ZCp%2Fujk3n7EqQGVrmPQ1y9gf5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;172&quot; height=&quot;153&quot; data-origin-width=&quot;172&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눌러보면 재시작, 중지 등 추가 작업이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;146&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDTXvQ/btsDAQ6SCWu/KlurlIGNpKwfzQez8d3Zl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDTXvQ/btsDAQ6SCWu/KlurlIGNpKwfzQez8d3Zl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDTXvQ/btsDAQ6SCWu/KlurlIGNpKwfzQez8d3Zl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDTXvQ%2FbtsDAQ6SCWu%2FKlurlIGNpKwfzQez8d3Zl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;146&quot; height=&quot;297&quot; data-origin-width=&quot;146&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 IPFS를 설치하였다면 이제 node.js로 IPFS에 파일 업로드를 해보겠다.&lt;br /&gt;node와 npm설치하는 방법은 다른 구글링하여 블로그를 &lt;a href=&quot;https://www.google.com/search?q=node.js+%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95&amp;amp;oq=node.js+%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95&amp;amp;gs_lcrp=EgZjaHJvbWUyBggAEEUYOdIBCDM4MDhqMGo3qAIAsAIA&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참조&lt;/a&gt;하기 바란다.&lt;br /&gt;엄청 쉽다. (&lt;a href=&quot;https://nodejs.org/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nodejs.org/ko&lt;/a&gt; 여기서 다운받고 설치하면 그만이다.)&lt;br /&gt;&lt;br /&gt;IPFS를 설치하면 포트가 5001로 동작하고 파일 업로드시 필요한 모듈은 ipfs-api, fs, bl 정도이다.&lt;br /&gt;일단 프로젝트의 위치를 지정하겠다.&lt;br /&gt;나는 D:\Project\NFT로 지정하였다.&lt;br /&gt;&lt;br /&gt;이제 cmd를 눌러 D:\로 이동 후 CD Project, CD NFT를 입력하여 위치를 이동시키자.&lt;br /&gt;모듈 설치하자.&amp;nbsp;&amp;nbsp;&lt;br /&gt;npm i ipfs-api&lt;br /&gt;npm i fs&lt;br /&gt;npm i bl&lt;br /&gt;각각의 모듈이 무슨 일을 하는지는 chatgpt에게 물어보라. ㅎㅎ&lt;br /&gt;&lt;br /&gt;vscode를 실행하여 아래 코드를 타이핑 후 app.js로 저장하자.&lt;br /&gt;당연히 위치는 D:\Project\NFT다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;IPFS&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;ipfs-api&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;fs&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;bl&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;'bl'&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 'bl' 모듈을 추가&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3b3b3b;&quot;&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;ipfs&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;IPFS&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;({&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;5001&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;protocol&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;readFileSync&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;./test.txt&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;fileBuffer&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;bl&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Buffer&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;)); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// 'bl' 모듈로 Buffer를 래핑&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;ipfs&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0070c1;&quot;&gt;fileBuffer&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;File add success! result :&quot;&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;hash&lt;/span&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #3b3b3b;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 node로 만든 app.js를 아래처럼 실행하면 성공 메세지와 함께 암호문자열을 확인 가능할것이다.&lt;br /&gt;참고로 업로드할 파일인 test.txt파일은 D:\Project\NFT에 test.txt 파일을 미리 만들어 두자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjiNvd/btsDCVNXVO4/ZV18M1ON5CGUl7YS7gGrpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjiNvd/btsDCVNXVO4/ZV18M1ON5CGUl7YS7gGrpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjiNvd/btsDCVNXVO4/ZV18M1ON5CGUl7YS7gGrpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjiNvd%2FbtsDCVNXVO4%2FZV18M1ON5CGUl7YS7gGrpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;59&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;result 자체를 찍어보면 다음과 같이 나온다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path:&amp;nbsp;'******NVAiMNRcGu6x1AwQ4c5SBnJMH', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hash:&amp;nbsp;'******NVAiMNRcGu6x1AwQ4c5SBnJMH', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size:&amp;nbsp;6 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;path는&amp;nbsp;경로&amp;nbsp;cid는&amp;nbsp;컨텐츠&amp;nbsp;식별자&amp;nbsp;size는&amp;nbsp;파일&amp;nbsp;용량이다.&amp;nbsp;path와&amp;nbsp;cid가&amp;nbsp;동일함을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;만약 아래처럼 오류가 난다면 IPFS 프로그램이 중지되었기 때문이다.&lt;br /&gt;IPFS를&amp;nbsp;실행해둔&amp;nbsp;상태에서&amp;nbsp;하길&amp;nbsp;바란다.&lt;br /&gt;(만약 난 좀 있어보이고 싶다란 사람이라면 cmd창에서 ipfs daemon이라 실행하면 동일한 효과를 볼 수 있다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brSZEf/btsDAw8BSuj/C9IkfNyZo1h9dOCErdRVKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brSZEf/btsDAw8BSuj/C9IkfNyZo1h9dOCErdRVKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brSZEf/btsDAw8BSuj/C9IkfNyZo1h9dOCErdRVKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrSZEf%2FbtsDAw8BSuj%2FC9IkfNyZo1h9dOCErdRVKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;183&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한가지 주의해야 할 점은 이후 node.js로 IPFS로 파일을 업로드 시켜볼 예정인데 이 파일 메뉴에 내가 올린 파일이 바로 나오지 않는다란 점이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLcjla/btsDCQFhajO/BAivVlEb8AkXh9T5iGCfKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLcjla/btsDCQFhajO/BAivVlEb8AkXh9T5iGCfKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLcjla/btsDCQFhajO/BAivVlEb8AkXh9T5iGCfKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLcjla%2FbtsDCQFhajO%2FBAivVlEb8AkXh9T5iGCfKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;881&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 node.js로 업로드 후 성공 메세지로 받았던 문자열을 Browse에 입력하고 검색하면 확인이 가능하다.&lt;br /&gt;File add success! result : Q *************....H&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xpBJ0/btsDBRdYQy6/mtsU2IaFpGk9JjyzCVq2k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xpBJ0/btsDBRdYQy6/mtsU2IaFpGk9JjyzCVq2k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xpBJ0/btsDBRdYQy6/mtsU2IaFpGk9JjyzCVq2k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxpBJ0%2FbtsDBRdYQy6%2FmtsU2IaFpGk9JjyzCVq2k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1422&quot; height=&quot;507&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 잘 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XtEkl/btsDGsjtETr/sbTNyt8llHceRft0dndlHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XtEkl/btsDGsjtETr/sbTNyt8llHceRft0dndlHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XtEkl/btsDGsjtETr/sbTNyt8llHceRft0dndlHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXtEkl%2FbtsDGsjtETr%2FsbTNyt8llHceRft0dndlHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;554&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 빈 파일을 업로드했다면 이렇게 나오니 당황하지 말자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pOFw2/btsDBPmURqI/YAA0q3oUxn8U4TnEAvEOPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pOFw2/btsDBPmURqI/YAA0q3oUxn8U4TnEAvEOPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pOFw2/btsDBPmURqI/YAA0q3oUxn8U4TnEAvEOPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpOFw2%2FbtsDBPmURqI%2FYAA0q3oUxn8U4TnEAvEOPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;668&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>NFT</category>
      <category>IPFS</category>
      <category>Node.js</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/630</guid>
      <comments>https://hippalus.tistory.com/630#entry630comment</comments>
      <pubDate>Thu, 18 Jan 2024 20:07:12 +0900</pubDate>
    </item>
    <item>
      <title>정릉시장 호떡맛집 남기남</title>
      <link>https://hippalus.tistory.com/629</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정릉시장에 줄서서 먹는다는 호떡집인 남기남 호떡이 있다길래 차를 몰고 정릉시장으로 고고하였다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호떡을 남기남? (아재 아재~~)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위치를 몰랐는데 정릉시장 공영주차장으로 가는길에 남기남 호떡 집이 있었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 줄이 없넹? 춥지도 않은 날인데...&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;참고로 주차장에서 한 50m 정도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6616.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs84ib/btsDrGa3iiJ/st8Cc4eLo4vUnWvkoNWA21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs84ib/btsDrGa3iiJ/st8Cc4eLo4vUnWvkoNWA21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs84ib/btsDrGa3iiJ/st8Cc4eLo4vUnWvkoNWA21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs84ib%2FbtsDrGa3iiJ%2Fst8Cc4eLo4vUnWvkoNWA21%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6616.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호떡 세개를 샀다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각각 1,500원이었는데 맛은 뭐 평범했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;맛보다 호떡 하나에 1,500원이라니&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하.... 코로나와 러우전쟁 때문에 세상이 이상해져 버렸다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;굳이 멀리서 줄서가며 먹을만한 그런집은 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6617.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cinDyF/btsDrnW658m/toisSvTw1sW6yIDqZnRXKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cinDyF/btsDrnW658m/toisSvTw1sW6yIDqZnRXKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cinDyF/btsDrnW658m/toisSvTw1sW6yIDqZnRXKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcinDyF%2FbtsDrnW658m%2FtoisSvTw1sW6yIDqZnRXKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6617.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;신포도겠지만 사라다 빵과 꽈배기가 맛있어 보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6618.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wi1IJ/btsDs3X7JkB/dexVIJRQtTRWOCKQ251sC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wi1IJ/btsDs3X7JkB/dexVIJRQtTRWOCKQ251sC0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wi1IJ/btsDs3X7JkB/dexVIJRQtTRWOCKQ251sC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWi1IJ%2FbtsDs3X7JkB%2FdexVIJRQtTRWOCKQ251sC0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6618.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호떡 한개씩 취식하고 발걸음을 정릉 시장 안쪽으로 옮겼다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시장 여기저기 한바꾸 돌다 보니 엔틱한 이발관이 시야에 들어와 한컷 담아봤다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왠지 물조리개와 바리깡이 있을 법한 외관이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6603.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1067&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FJkBY/btsDo87EEWm/rCXO4CTmwhHyzLklhhv9Bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FJkBY/btsDo87EEWm/rCXO4CTmwhHyzLklhhv9Bk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FJkBY/btsDo87EEWm/rCXO4CTmwhHyzLklhhv9Bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFJkBY%2FbtsDo87EEWm%2FrCXO4CTmwhHyzLklhhv9Bk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1067&quot; data-filename=&quot;IMG_6603.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1067&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시장에서 가장 마음에 들던 건물이었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여기저기 아기자기한 카페들도 있고 하천도 흐르고&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여름에 와서 맥주 한 잔 하기 괜찮은 분위기였다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시장 자체는 다른 시장들에 비해 좀 작은 느낌.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사진은 안 찍었지만 중간쯤 튀김집 색이 아주 쌧노란것이.. 하마터면 지갑 열 뻔 했다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새로운 그리고 간만의 재래시장 방문이라 시장 투어 자체는 뭐 쏘쏘~&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다만 여기 주차가 정말 쉣이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;공영주차장이랍시고 하나 있는데 주차가능 대수가 15대 정도 되려나? 그중에서 장애인도 1대&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;유료주차장인데 이중주차에 들어오는 차 나가려는 차 뒤엉키고 난리다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;저렇게 하꼬방만한 주차장을 공영이랍시고 만들어 두고 참 불편하다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데도 재래시장 방문해주세요 뿌잉뿌잉, 주말엔 마트 의무휴일인거 아시죠?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이딴 정책은 정말이지 한심하기 짝이 없다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보여주기식 정책에 효과도 없는 대형마트 일요일 의무휴업 폐지하는 정치인 나오면 무족헌~ 뽑아준다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;효과 없는거 공식 확인도 됐는데 표 눈치 보느라 생명 연장하는 짓은 이젠 좀 그만둘 때도 되지 않았는가&lt;/span&gt;&lt;/p&gt;</description>
      <category>입맛따라 가는 여행</category>
      <category>남기남호떡</category>
      <category>재래시장</category>
      <category>정릉시장</category>
      <category>호떡</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/629</guid>
      <comments>https://hippalus.tistory.com/629#entry629comment</comments>
      <pubDate>Sun, 14 Jan 2024 10:50:54 +0900</pubDate>
    </item>
    <item>
      <title>정릉시장 돼지갈비 서울 불고기</title>
      <link>https://hippalus.tistory.com/628</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아드님이 호떡이 드시고 싶으시단다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;유명한 호떡집 남기남이 정릉시장에 있다하여 차를 몰고 정릉시장에 방문하였다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시장을 둘러보니 시장기가 돌아 사전에 조사한 숯불 닭갈비냐 돈까스냐 서울불고기 집이냐 고민하다 서울 불고기에서 돼지갈비를 먹기로 하여 방문.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6615.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcy499/btsDrHVlcVe/cxjMPB7K1IvXTybk0yKf9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcy499/btsDrHVlcVe/cxjMPB7K1IvXTybk0yKf9k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcy499/btsDrHVlcVe/cxjMPB7K1IvXTybk0yKf9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcy499%2FbtsDrHVlcVe%2FcxjMPB7K1IvXTybk0yKf9k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6615.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정릉시장 초입에 있는 서울 불고기집은 가정 양옥을 개조한 집이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6604.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nu8pZ/btsDnyy1A6l/jqeUFWPdkFteSmKCtSEsKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nu8pZ/btsDnyy1A6l/jqeUFWPdkFteSmKCtSEsKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nu8pZ/btsDnyy1A6l/jqeUFWPdkFteSmKCtSEsKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnu8pZ%2FbtsDnyy1A6l%2FjqeUFWPdkFteSmKCtSEsKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6604.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가격은 대충 이러하다.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;육회는 가격이 좀 나가고 돼지갈비가 300g에 15,000원&lt;br /&gt;된장찌개는 2,000원 되신다.&lt;br /&gt;&lt;br /&gt;아드님께선 돼지갈비를 드실 땐 항상 된장찌개 두부를 건져 밥과 함께 드신다.&lt;br /&gt;나와는 식성이 정 반대다.&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;돈 아깝게시리 돈을 주고 된장찌개를 굳이?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6606.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BEcxT/btsDqO1GwSP/njKnHwy6OqT7rIkmiYqkIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BEcxT/btsDqO1GwSP/njKnHwy6OqT7rIkmiYqkIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BEcxT/btsDqO1GwSP/njKnHwy6OqT7rIkmiYqkIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBEcxT%2FbtsDqO1GwSP%2FnjKnHwy6OqT7rIkmiYqkIk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6606.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;돼지갈비 3인분을 주문하여 나왔는데 대부분 뼈가 붙어 있었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;뼈 있는거 싫은데 -_- (아마 뼈 없는걸로만 달라 요청하면 가능할것이다. 대부분의 돼지갈비 집들이 그러하니)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;고기도 약간 다른 집들과는 달랐다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;얇다고 해야 하나.. 그렇다고 중량이 적진 않으니 이점은 그저 &lt;span style=&quot;color: #f89009;&quot;&gt;취향의 차이&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6607.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJ6fBv/btsDoeUDUFz/dqCjtEIiti2NH42wvB0UV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJ6fBv/btsDoeUDUFz/dqCjtEIiti2NH42wvB0UV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJ6fBv/btsDoeUDUFz/dqCjtEIiti2NH42wvB0UV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJ6fBv%2FbtsDoeUDUFz%2FdqCjtEIiti2NH42wvB0UV0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6607.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;양배추 소스도 나오고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6608.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JaSzW/btsDnE0njGD/N1gLgKJmOqZc1i4x5jQ9K0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JaSzW/btsDnE0njGD/N1gLgKJmOqZc1i4x5jQ9K0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JaSzW/btsDnE0njGD/N1gLgKJmOqZc1i4x5jQ9K0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaSzW%2FbtsDnE0njGD%2FN1gLgKJmOqZc1i4x5jQ9K0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6608.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;된장찌개도 나왔다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주문 할 때 &quot;두부 좀...&quot;이라 말씀드리니 센스 있으시게 &quot;아~ 많이요~ ^^&quot; 이래주신다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정말 두부가 많이 들어 있었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;약간 아쉬운건 찌개 두부는 아닌것 같았...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6609.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GF99L/btsDnylxwIf/85BJxjmTEBnpdRTWAG0iT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GF99L/btsDnylxwIf/85BJxjmTEBnpdRTWAG0iT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GF99L/btsDnylxwIf/85BJxjmTEBnpdRTWAG0iT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGF99L%2FbtsDnylxwIf%2F85BJxjmTEBnpdRTWAG0iT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6609.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여하튼 고기를 얹고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6610.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3RQhl/btsDriVLXMg/KDkSYK8B8jk5h0RMpwzffk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3RQhl/btsDriVLXMg/KDkSYK8B8jk5h0RMpwzffk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3RQhl/btsDriVLXMg/KDkSYK8B8jk5h0RMpwzffk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3RQhl%2FbtsDriVLXMg%2FKDkSYK8B8jk5h0RMpwzffk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6610.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;굽고&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6612.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bISjzU/btsDp7AIcYy/Xf1BEvjXiDZF7Z7xwkZoo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bISjzU/btsDp7AIcYy/Xf1BEvjXiDZF7Z7xwkZoo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bISjzU/btsDp7AIcYy/Xf1BEvjXiDZF7Z7xwkZoo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbISjzU%2FbtsDp7AIcYy%2FXf1BEvjXiDZF7Z7xwkZoo1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6612.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구웠다.&lt;/span&gt;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;창 안으로 햇빛이 비춰 먹음직스럽길래 사진도 여러장 찍었다.&lt;br /&gt;사실 블로그 하려고 찍은건 아니었는데.&lt;br /&gt;찍다보니 블로그에 올려야겠기에 더 찍었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_6613.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccEfCq/btsDp62SPpm/2jImSHAHJqLTccfa1kWGRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccEfCq/btsDp62SPpm/2jImSHAHJqLTccfa1kWGRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccEfCq/btsDp62SPpm/2jImSHAHJqLTccfa1kWGRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccEfCq%2FbtsDp62SPpm%2F2jImSHAHJqLTccfa1kWGRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; data-filename=&quot;IMG_6613.JPG&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;전체적인 상차림은 대략 이렇다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사진에 짤려 안 보이는데 마늘과 쌈장 그리고 동치미가 접시에 조금 나온다.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;정말 솔직하게 식후감을 말하자면 막 맛집 그런건 아니다. 평범한 집이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아쉬웠던 점은 좁은 방에 테이블이 4개인가 있었는데 그 중 3테이블에서 고기를 굽느라 방안에 연기가 한 가득이었다.&lt;br /&gt;일행은 눈이 아플 지경이었다 했다.&lt;br /&gt;식사를 다 끝낼 때 쯤에서야 환풍기를 돌려주셨고 그래도 안되어서 창문도 열어주셔서... -_-a&lt;br /&gt;1년 동안 마실 미세먼지를 다 마신것 같다.&lt;br /&gt;&lt;br /&gt;정릉시장 구경갈 겸 돼지갈비로 식사하실 분은 방문하셔도 괜찮다.&lt;br /&gt;서울페이(제로페이)가맹점이라 서울페이가 있는 분이라면 이용하시길&lt;br /&gt;서울페이 되는집인데 막상 찾아가면 결제 못하는 집들 상당수 있는데 이 집은 된다.&lt;br /&gt;&lt;br /&gt;위치와 정보는 네이버~&lt;br /&gt;&lt;a href=&quot;https://map.naver.com/p/search/%EC%A0%95%EB%A6%89%EC%8B%9C%EC%9E%A5%20%EC%84%9C%EC%9A%B8%EB%B6%88%EA%B3%A0%EA%B8%B0/place/38341807?placePath=?entry=pll&amp;amp;from=nx&amp;amp;fromNxList=true&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://map.naver.com/p/search/%EC%A0%95%EB%A6%89%EC%8B%9C%EC%9E%A5%20%EC%84%9C%EC%9A%B8%EB%B6%88%EA%B3%A0%EA%B8%B0/place/38341807?placePath=?entry=pll&amp;amp;from=nx&amp;amp;fromNxList=true&amp;amp;searchType=place&amp;amp;c=15.00,0,0,0,dh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>입맛따라 가는 여행</category>
      <category>돼지갈비</category>
      <category>정릉시장</category>
      <author>Hippalus</author>
      <guid isPermaLink="true">https://hippalus.tistory.com/628</guid>
      <comments>https://hippalus.tistory.com/628#entry628comment</comments>
      <pubDate>Sat, 13 Jan 2024 18:37:29 +0900</pubDate>
    </item>
  </channel>
</rss>