<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>베스</title>
    <link>https://bass9030.tistory.com/</link>
    <description>리듬 스래기, 코딩 스래기</description>
    <language>ko</language>
    <pubDate>Thu, 16 Apr 2026 05:47:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bass9030</managingEditor>
    <image>
      <title>베스</title>
      <url>https://tistory1.daumcdn.net/tistory/3496421/attach/ea04eb21e857460783853fc993bb5e11</url>
      <link>https://bass9030.tistory.com</link>
    </image>
    <item>
      <title>대학별 실시간 경쟁률 확인 사이트 제작기</title>
      <link>https://bass9030.tistory.com/27</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;univ-live.bass9030.dev_.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/71uQf/btsQEdHkMN4/HCPtarkEfr70yWIOYSchvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/71uQf/btsQEdHkMN4/HCPtarkEfr70yWIOYSchvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/71uQf/btsQEdHkMN4/HCPtarkEfr70yWIOYSchvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F71uQf%2FbtsQEdHkMN4%2FHCPtarkEfr70yWIOYSchvK%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;1920&quot; height=&quot;911&quot; data-filename=&quot;univ-live.bass9030.dev_.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩을 엔트리로 처음 입문한 초딩 시절을 지나 그냥 저냥 지냈던 중딩, 그리고 고1, 고2를 지나 결국엔 오지 않을것 같았던 고3 대학 원서접수철이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 공부를 잘하는 편은 아니기에 그냥 대충 성적에 맞게 대학을 알아보고 있었는데 친구에게 연락이 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;대학별로 실시간 경쟁률 볼수 있는 프로그램 만들어줘&quot;&lt;/b&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;귀찮긴 하지만 만들면 나도 꽤 유용하게 쓸거 같기도 하고 재밌어 보여서 개발에 들어갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 - 백엔드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크는 항상 그랬듯 ExpressJS로 시작하였다. 요즘 NestJS를 조금 깔짝여보고 있긴 하지만 이건 원서접수기간인 일주일안에 빠르게 제작해야했기에 빠르게 개발할 수 있는 ExpressJS로 선택하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경쟁률을 보는 사이트이기에 경쟁률을 불러올 수 있는 API가 필요하지만, 안타깝게도 진학사에서는 공식적(공개적)으로 경쟁률을 제공하는 API를 제공하지 않는다. 그러기에 뒷문(?)을 찾아서 경쟁률 정보를 가져와야한다. 진학사와 유웨이는 SSR(Server-Side-Rendering)을 사용하여 대학별 경쟁률을 표시해주기 때문에 직접 사이트의 HTML을 파싱해줘야했다.&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;674&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crtlpy/btsQCk8Ff4C/63Smf1FU5gwNo1wI0kgik1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crtlpy/btsQCk8Ff4C/63Smf1FU5gwNo1wI0kgik1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crtlpy/btsQCk8Ff4C/63Smf1FU5gwNo1wI0kgik1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrtlpy%2FbtsQCk8Ff4C%2F63Smf1FU5gwNo1wI0kgik1%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;674&quot; height=&quot;203&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 우리가 볼것은 'hdnResultNow' 값이다. 여기에는 아무 조건을 걸지않고 검색했을때 경쟁률 페이지로 인도해줄 URL 정보가 포함된 JSON이 들어간다. 이 JSON을 그냥 사용하기에는 구조가 약간 더럽다(?)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.47.31.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rz4Lv/btsQ6ThteMl/MfOcTLf2cS3BUWLSj8l52k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rz4Lv/btsQ6ThteMl/MfOcTLf2cS3BUWLSj8l52k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rz4Lv/btsQ6ThteMl/MfOcTLf2cS3BUWLSj8l52k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frz4Lv%2FbtsQ6ThteMl%2FMfOcTLf2cS3BUWLSj8l52k%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;720&quot; height=&quot;940&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.47.31.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 한번 가공을 통해 필요한 정보만 정리한 JSON으로 변환해주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.49.01.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be8Gei/btsQ4mMaL1k/Wa45k7iKfhnr319Bo4k6v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be8Gei/btsQ4mMaL1k/Wa45k7iKfhnr319Bo4k6v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be8Gei/btsQ4mMaL1k/Wa45k7iKfhnr319Bo4k6v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe8Gei%2FbtsQ4mMaL1k%2FWa45k7iKfhnr319Bo4k6v0%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;447&quot; height=&quot;938&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.49.01.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;938&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;스크린샷 2025-10-12 오전 1.51.09.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZABeD/btsQ303E1pR/OJuFl0uQ9kBD4eKqs3GA1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZABeD/btsQ303E1pR/OJuFl0uQ9kBD4eKqs3GA1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZABeD/btsQ303E1pR/OJuFl0uQ9kBD4eKqs3GA1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZABeD%2FbtsQ303E1pR%2FOJuFl0uQ9kBD4eKqs3GA1k%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;564&quot; height=&quot;939&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.51.09.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;939&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;스크린샷 2025-10-12 오전 1.54.48.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P7f51/btsQ6YixB2R/ScKLLkDjVMKi1V3IOMDnMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P7f51/btsQ6YixB2R/ScKLLkDjVMKi1V3IOMDnMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P7f51/btsQ6YixB2R/ScKLLkDjVMKi1V3IOMDnMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP7f51%2FbtsQ6YixB2R%2FScKLLkDjVMKi1V3IOMDnMk%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;333&quot; height=&quot;133&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.54.48.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.58.15.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coDMLL/btsQ7N8TMIx/orj4b7cexmKPXe1CeX6D7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coDMLL/btsQ7N8TMIx/orj4b7cexmKPXe1CeX6D7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coDMLL/btsQ7N8TMIx/orj4b7cexmKPXe1CeX6D7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoDMLL%2FbtsQ7N8TMIx%2Forj4b7cexmKPXe1CeX6D7k%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;628&quot; height=&quot;873&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.58.15.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;873&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;스크린샷 2025-10-12 오전 1.52.52.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceIRyZ/btsQ6YCOA1h/jLXQANwitIGzTSt64hOmGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceIRyZ/btsQ6YCOA1h/jLXQANwitIGzTSt64hOmGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceIRyZ/btsQ6YCOA1h/jLXQANwitIGzTSt64hOmGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceIRyZ%2FbtsQ6YCOA1h%2FjLXQANwitIGzTSt64hOmGk%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;538&quot; height=&quot;259&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.52.52.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;259&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;스크린샷 2025-10-12 오전 1.57.17.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHPTpP/btsQ7fdEM0R/Z1nP1laW77UtMRSWwbQSkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHPTpP/btsQ7fdEM0R/Z1nP1laW77UtMRSWwbQSkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHPTpP/btsQ7fdEM0R/Z1nP1laW77UtMRSWwbQSkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHPTpP%2FbtsQ7fdEM0R%2FZ1nP1laW77UtMRSWwbQSkk%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;892&quot; data-filename=&quot;스크린샷 2025-10-12 오전 1.57.17.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 이를 핸들링해주는 Router 코드와 응답속도 개선을 위한 간단한 캐시를 적용하며 백엔드를 마무리 하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-10-12 오전 2.03.31.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;929&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbiz81/btsQ6GQkl3G/Fabp5qbb8VS273lHFio4U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbiz81/btsQ6GQkl3G/Fabp5qbb8VS273lHFio4U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbiz81/btsQ6GQkl3G/Fabp5qbb8VS273lHFio4U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdbiz81%2FbtsQ6GQkl3G%2FFabp5qbb8VS273lHFio4U0%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;641&quot; height=&quot;929&quot; data-filename=&quot;스크린샷 2025-10-12 오전 2.03.31.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;929&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 - 프론트엔드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드는 디자인에 재능이 없기 때문에 그냥 bootstrap으로 딸깍해주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-10-12 오전 2.06.01.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFXBVO/btsQ5SKbwSP/E0fnLEXbk8KIInkysI2IjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFXBVO/btsQ5SKbwSP/E0fnLEXbk8KIInkysI2IjK/img.png&quot; data-alt=&quot;깨알같이 면책조항도 써두었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFXBVO/btsQ5SKbwSP/E0fnLEXbk8KIInkysI2IjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFXBVO%2FbtsQ5SKbwSP%2FE0fnLEXbk8KIInkysI2IjK%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;1238&quot; height=&quot;850&quot; data-filename=&quot;스크린샷 2025-10-12 오전 2.06.01.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깨알같이 면책조항도 써두었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 추가할때마다 localStorage를 사용하여 저장하게 하였고, 브라우저 변경등에 대응하도록 목록 내보내기/불러오기를 추가하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-10-12 오전 2.09.39.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAZhRH/btsQ4NCQYb9/68oX94zKDZY70NDoW12Xhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAZhRH/btsQ4NCQYb9/68oX94zKDZY70NDoW12Xhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAZhRH/btsQ4NCQYb9/68oX94zKDZY70NDoW12Xhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAZhRH%2FbtsQ4NCQYb9%2F68oX94zKDZY70NDoW12Xhk%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;523&quot; height=&quot;849&quot; data-filename=&quot;스크린샷 2025-10-12 오전 2.09.39.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;후기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하루만에 주요 기능을 완성하고 친구들에게 웹페이지 URL를 주었을때 친구들은 아주 만족하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비록 크롤링이라는 한계에서 오는 어쩔수 없는 불편함(학과/전형 자동완성 안됨, 정확히 입력 안하면 조회안됨 등등)은 있었지만 친구들은 돈받고 팔아도 되겠다며 극찬을 날려주었고, 동시에 황금돼지띠인 이번 Team 07의 엄청난 경쟁력(...)을 한눈에 보여주게되며 절망 역시 심어주게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원서접수기간인 일주일 안에 최대한 빨리 개발해야한다는 제약때문에 아쉬움이 좀 남았긴하지만, 그래도 이정도면 나름 만족스러운 결과물이 뽑힌거 같고 또 친구들도 만족하며 써주니 나름 뿌듯하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 Github: &lt;a href=&quot;https://github.com/bass9030/univ-live-ratio&quot;&gt;https://github.com/bass9030/univ-live-ratio&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760204149571&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - bass9030/univ-live-ratio&quot; data-og-description=&quot;Contribute to bass9030/univ-live-ratio development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bass9030/univ-live-ratio&quot; data-og-url=&quot;https://github.com/bass9030/univ-live-ratio&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xpMmc/hyZKNmCZlU/FDI9dU5rV6r2MJexiKVxR0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/o3Dlx/hyZLbGkHna/XOGPcXeyqvMQ1WmEqnZZz1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/bass9030/univ-live-ratio&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bass9030/univ-live-ratio&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xpMmc/hyZKNmCZlU/FDI9dU5rV6r2MJexiKVxR0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/o3Dlx/hyZLbGkHna/XOGPcXeyqvMQ1WmEqnZZz1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - bass9030/univ-live-ratio&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to bass9030/univ-live-ratio development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>코딩 스래기</category>
      <category>expressjs</category>
      <category>nodejs</category>
      <category>개발</category>
      <category>개발기</category>
      <category>대학경쟁률</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/27</guid>
      <comments>https://bass9030.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 12 Oct 2025 02:38:12 +0900</pubDate>
    </item>
    <item>
      <title>마훅 - 마후마후 트윗 번역 웹훅 제작기</title>
      <link>https://bass9030.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 나는 두 가지의 서비스(&lt;a href=&quot;https://music.bass9030.dev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;보컬라디오&lt;/a&gt;, &lt;a href=&quot;https://mahook.bass9030.dev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;마훅&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;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btmR79/btsLSMH4rFR/BmwpMZQWac8gjOl0c7n9wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btmR79/btsLSMH4rFR/BmwpMZQWac8gjOl0c7n9wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btmR79/btsLSMH4rFR/BmwpMZQWac8gjOl0c7n9wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtmR79%2FbtsLSMH4rFR%2FBmwpMZQWac8gjOl0c7n9wk%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 그중에서 마훅의 개발 스토리를 써보자 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 마훅의 시작&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 2020년도부터 마후마후를 알게 되어 덕질을 시작했다. 그러면서 자연스레 마후마후의 트위터를 보기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 당시에는 트위터를 활발하게 하지 않았기에 마후가 올리는 트윗을 몇일 ~ 몇 주 뒤 뒤늦게 확인하는 경우가 잦았고, 당시 나는 그게 마음에 들지 않았다. 그리고 개인적으로 트위터 내장 구글 번역기 퀄리티도 별로 신뢰하지 않았기에 &quot;마후마후 트윗을 디스코드랑 카톡으로 보내는 봇을 만들어보자!&quot;로 mafuTranslate 프로젝트를 시작하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqZ24a/btsLT1RTSFw/LvKu8FneUIWSgztIEmvWpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqZ24a/btsLT1RTSFw/LvKu8FneUIWSgztIEmvWpk/img.png&quot; data-alt=&quot;비공개되어있는 'mafuTranslate' 레포의 첫 커밋 기록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqZ24a/btsLT1RTSFw/LvKu8FneUIWSgztIEmvWpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqZ24a%2FbtsLT1RTSFw%2FLvKu8FneUIWSgztIEmvWpk%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;380&quot; height=&quot;146&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비공개되어있는 'mafuTranslate' 레포의 첫 커밋 기록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시에는 트위터의 v1 API가 무료로 풀려있어서 v1 API과 Python을 통해 5분 간격으로 트윗을 감지해 번역 후 전송하는 코드를 완성하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIbJzD/btsLRj1orOZ/TXGAEa5yDD3lGmlktxuI91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIbJzD/btsLRj1orOZ/TXGAEa5yDD3lGmlktxuI91/img.png&quot; data-alt=&quot;당시 Python으로 구현된 코드 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIbJzD/btsLRj1orOZ/TXGAEa5yDD3lGmlktxuI91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIbJzD%2FbtsLRj1orOZ%2FTXGAEa5yDD3lGmlktxuI91%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;986&quot; height=&quot;796&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;당시 Python으로 구현된 코드 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드 웹훅 전송까지 구현하고 난 뒤 당시 카카오톡 봇 제작자들 사이에서 유행처럼 번지던 '카링'(구 카카오링크, 현 카카오쉐어)을 통한 전송을 구현하려고 했는데, 개발 당시 카카오에서 카카오링크 관련 인증 로직을 변경한 지 얼마 지나지 않았던 때라 Python에서 작동하던 카카오링크 모듈이 존재하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 Python으로 작성된 카카오링크 모듈 수정을 시도하였다가 결국 실패하였다. 그래서 카카오톡 봇용 카카오링크 모듈이 RhinoJS로 작성되어 있다는점에 착안, 같은 JS인 NodeJS를 사용하여 카카오링크까지 전송되도록 다시 제작하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c150VP/btsLSek8ooN/itKORtLwLsT7eZEDwJP0h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c150VP/btsLSek8ooN/itKORtLwLsT7eZEDwJP0h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c150VP/btsLSek8ooN/itKORtLwLsT7eZEDwJP0h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc150VP%2FbtsLSek8ooN%2FitKORtLwLsT7eZEDwJP0h0%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;273&quot; height=&quot;78&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;78&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;366&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1nHZg/btsLT4Vozyk/3MoREuKRiguf8CLYD5Sca0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1nHZg/btsLT4Vozyk/3MoREuKRiguf8CLYD5Sca0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1nHZg/btsLT4Vozyk/3MoREuKRiguf8CLYD5Sca0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1nHZg%2FbtsLT4Vozyk%2F3MoREuKRiguf8CLYD5Sca0%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;366&quot; height=&quot;112&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;112&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;804&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RtjpF/btsLSgiXTS2/jVgNVR1Co24gBdJyNSLtm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RtjpF/btsLSgiXTS2/jVgNVR1Co24gBdJyNSLtm0/img.png&quot; data-alt=&quot;당시 NodeJS로 구현된 코드 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RtjpF/btsLSgiXTS2/jVgNVR1Co24gBdJyNSLtm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRtjpF%2FbtsLSgiXTS2%2FjVgNVR1Co24gBdJyNSLtm0%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;804&quot; height=&quot;705&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;당시 NodeJS로 구현된 코드 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 2년동안 큰 문제없이 즐겁게 마후마후 트윗을 한글로 즐기고 있었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 갑작스런 이별&lt;/h2&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;1443&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xZJR8/btsLTumAFPI/DDoDH8KkJ5wdO0xbHZKVDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xZJR8/btsLTumAFPI/DDoDH8KkJ5wdO0xbHZKVDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xZJR8/btsLTumAFPI/DDoDH8KkJ5wdO0xbHZKVDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxZJR8%2FbtsLTumAFPI%2FDDoDH8KkJ5wdO0xbHZKVDk%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;1443&quot; height=&quot;505&quot; data-origin-width=&quot;1443&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;갑자기 트위터가 v1 API를 지원종료한다고 메일을 보내왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 나는 '뭐 v2에도 프리티어 있을 텐데 그냥 v2 마이그레이션만 딸깍하면 되겠지~'하고 가벼운 마음으로 v2 마이그레이션 작업을 시작했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vJsyw/btsLRNgDC0I/TUlJq545UlK3AHhUmRz3Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vJsyw/btsLRNgDC0I/TUlJq545UlK3AHhUmRz3Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vJsyw/btsLRNgDC0I/TUlJq545UlK3AHhUmRz3Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvJsyw%2FbtsLRNgDC0I%2FTUlJq545UlK3AHhUmRz3Dk%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;351&quot; height=&quot;403&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;403&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;인터넷을 검색해 본다. 일론머스크가 트위터 API를 유로화 했단다. v2 API 프리티어론 자기가 올린 트윗 조회밖에 안 된단다. 이런 젠장.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4nh8W/btsLSf5s1Rd/BnlzGvTOte6a5gRDeeoKB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4nh8W/btsLSf5s1Rd/BnlzGvTOte6a5gRDeeoKB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4nh8W/btsLSf5s1Rd/BnlzGvTOte6a5gRDeeoKB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4nh8W%2FbtsLSf5s1Rd%2FBnlzGvTOte6a5gRDeeoKB1%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;800&quot; height=&quot;277&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 2023년 10월. mafuTranslate 프로젝트는 관짝에 들어가게 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 부활&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 mafuTranslate 프로젝트가 관짝에 들어간 지 3달 뒤인 2024년 1월 새해, 갑자기 뭔 바람이 들었는지 mafuTranslate 프로젝트를 다시 살려보고 싶다는 욕구가 셈 솟았다. 하지만 당연하게도 3달 동안 트위터 API는 변한 게 없었고, 원래 목적대로 사용하려면 돈을 내야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 학생이 대충 깔짝이는 프로젝트에 거금을 들이기란 있을 수 없는 일이다. 그래서 대안책으로 embed 사이트에서 텍스트를 뽑아와 우회하는 방법을 생각하여 구조를 뜯어보던 중 수상한 걸 발견했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTvNL/btsLTahI0dq/WOVNhEBzpdgg681j41E8j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTvNL/btsLTahI0dq/WOVNhEBzpdgg681j41E8j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTvNL/btsLTahI0dq/WOVNhEBzpdgg681j41E8j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTvNL%2FbtsLTahI0dq%2FWOVNhEBzpdgg681j41E8j0%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;421&quot; height=&quot;38&quot; data-origin-width=&quot;421&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;&quot;__NEXT_DATA__&quot;라는 아주아주 수상해 보이는 json..&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;1687&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CG6NI/btsLSsC3kBO/KMjkUdMYOln0cCJW2c5tm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CG6NI/btsLSsC3kBO/KMjkUdMYOln0cCJW2c5tm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CG6NI/btsLSsC3kBO/KMjkUdMYOln0cCJW2c5tm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCG6NI%2FbtsLSsC3kBO%2FKMjkUdMYOln0cCJW2c5tm1%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;1687&quot; height=&quot;190&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;190&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;트윗 타임라인 데이터가 쓰기 편하게 json으로 있는것&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;1920&quot; data-origin-height=&quot;1032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4x5qR/btsLScOmWtf/ZEu2cunNxImkNbVC4pMwn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4x5qR/btsLScOmWtf/ZEu2cunNxImkNbVC4pMwn0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4x5qR/btsLScOmWtf/ZEu2cunNxImkNbVC4pMwn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4x5qR%2FbtsLScOmWtf%2FZEu2cunNxImkNbVC4pMwn0%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;1920&quot; height=&quot;1032&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1032&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;근데 어라? 이상하다. 마지막 트윗이 당시 홍백가합전 트윗으로 표시되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;로그인 쿠키도 같이 보내도록 수정하고, 개발 당시 파파고 API도 같이 유로화가 돼서 Kakao i 번역기도 같이 뜯어서 이식하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdundw/btsLTGAtyty/gZwV3qbNhvKtIuzjEuGfe1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdundw/btsLTGAtyty/gZwV3qbNhvKtIuzjEuGfe1/img.jpg&quot; data-alt=&quot;당시 노토지방 지진으로 난리도 아니였었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdundw/btsLTGAtyty/gZwV3qbNhvKtIuzjEuGfe1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdundw%2FbtsLTGAtyty%2FgZwV3qbNhvKtIuzjEuGfe1%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;490&quot; height=&quot;210&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;당시 노토지방 지진으로 난리도 아니였었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 mafuTranslate 프로젝트는 중단 3개월 만에 다시 재가동을 선언하였다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 욕심&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 혼자 만족하면서 5분 간격 사이에 트윗이 여러 개 올라왔을 때 대응, Kakao i 번역이 마음에 안 들어서 DeepL 번역기로 작동하게 수정 등 여러 가지 수정을 거치면서 문뜩 한 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이거 나만 쓰기엔 좀 아까운 듯? 분명 수요 있긴 할거 같은데?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 생각을 시작으로 '유사 왁스코드(우왁굳과 관련인들의 범용 알림 웹훅)를 만들어보자'라는 생각으로 mafuTranslate 프로젝트를 기반으로 위에다가 웹페이지를 얹는 방식으로 빠르게 제작하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;911&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJR8mR/btsLTwdFvj5/knUKOnMD1hb6OoAAMyxEKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJR8mR/btsLTwdFvj5/knUKOnMD1hb6OoAAMyxEKK/img.jpg&quot; data-alt=&quot;마훅 최초 버전 웹페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJR8mR/btsLTwdFvj5/knUKOnMD1hb6OoAAMyxEKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJR8mR%2FbtsLTwdFvj5%2FknUKOnMD1hb6OoAAMyxEKK%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;1920&quot; height=&quot;911&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;911&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마훅 최초 버전 웹페이지&lt;/figcaption&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;
&lt;p data-ke-size=&quot;size16&quot;&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;1223&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4p2X/btsLRL4bu7K/7bZru4aSELYyKuOPJVJda0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4p2X/btsLRL4bu7K/7bZru4aSELYyKuOPJVJda0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4p2X/btsLRL4bu7K/7bZru4aSELYyKuOPJVJda0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4p2X%2FbtsLRL4bu7K%2F7bZru4aSELYyKuOPJVJda0%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;1223&quot; height=&quot;592&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;592&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 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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMA9sp/btsLRH82bqG/q6QHELFQAxcN0R2qzNS7Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMA9sp/btsLRH82bqG/q6QHELFQAxcN0R2qzNS7Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMA9sp/btsLRH82bqG/q6QHELFQAxcN0R2qzNS7Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMA9sp%2FbtsLRH82bqG%2Fq6QHELFQAxcN0R2qzNS7Qk%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;425&quot; height=&quot;285&quot; data-origin-width=&quot;425&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;/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;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eglGHq/btsLSQqjmpe/kul827J8wRUWK99VohVQAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eglGHq/btsLSQqjmpe/kul827J8wRUWK99VohVQAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eglGHq/btsLSQqjmpe/kul827J8wRUWK99VohVQAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeglGHq%2FbtsLSQqjmpe%2Fkul827J8wRUWK99VohVQAk%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;95&quot; data-origin-width=&quot;338&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;이용자도 11명으로 나쁘지 않게 생겼고 (2개는 내 디코 서버에 등록해 두었다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TzWEM/btsLScgDPqy/k6j5y0R8SkYs9r5fh3kdT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TzWEM/btsLScgDPqy/k6j5y0R8SkYs9r5fh3kdT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TzWEM/btsLScgDPqy/k6j5y0R8SkYs9r5fh3kdT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTzWEM%2FbtsLScgDPqy%2Fk6j5y0R8SkYs9r5fh3kdT0%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;847&quot; height=&quot;34&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;34&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;586&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIGQQp/btsLTtVyuN5/IKZCca7tPjOYd2PGJBnxc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIGQQp/btsLTtVyuN5/IKZCca7tPjOYd2PGJBnxc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIGQQp/btsLTtVyuN5/IKZCca7tPjOYd2PGJBnxc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIGQQp%2FbtsLTtVyuN5%2FIKZCca7tPjOYd2PGJBnxc0%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;586&quot; height=&quot;325&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갤러리 공지랑 관련 링크 글에 내 서비스가 박제되는 엄청난 성과도 이루었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;이렇게 보면 사람 일 어떻게 될지 진짜 모르는 게 맞는 거 같다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 Github: &lt;a href=&quot;https://github.com/bass9030/mafu-webhook&quot;&gt;https://github.com/bass9030/mafu-webhook&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760204570494&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - bass9030/mafu-webhook: 마후 트윗을 디스코드 웹훅으로 드셔보시겠습니까?&quot; data-og-description=&quot;마후 트윗을 디스코드 웹훅으로 드셔보시겠습니까? Contribute to bass9030/mafu-webhook development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bass9030/mafu-webhook&quot; data-og-url=&quot;https://github.com/bass9030/mafu-webhook&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3Uvs0/hyZKGOzaFy/zIYouDIKqr0YRADMTlKopK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dJIyyK/hyZKbOH57K/cCPDDXr5UKAZhk5LqbjSmk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/bass9030/mafu-webhook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bass9030/mafu-webhook&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3Uvs0/hyZKGOzaFy/zIYouDIKqr0YRADMTlKopK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dJIyyK/hyZKbOH57K/cCPDDXr5UKAZhk5LqbjSmk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - bass9030/mafu-webhook: 마후 트윗을 디스코드 웹훅으로 드셔보시겠습니까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마후 트윗을 디스코드 웹훅으로 드셔보시겠습니까? Contribute to bass9030/mafu-webhook development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>코딩 스래기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/25</guid>
      <comments>https://bass9030.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 20 Jan 2025 00:46:56 +0900</pubDate>
    </item>
    <item>
      <title>[슬라임 트래커 제작] #2 - 납땜</title>
      <link>https://bass9030.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXE3A/btsLAW5H3Ky/1cXuo78NaIOmDndU473lxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXE3A/btsLAW5H3Ky/1cXuo78NaIOmDndU473lxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXE3A/btsLAW5H3Ky/1cXuo78NaIOmDndU473lxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXE3A%2FbtsLAW5H3Ky%2F1cXuo78NaIOmDndU473lxK%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;400&quot; height=&quot;198&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;축제가 24년 12월 24일 화요일이였는데 글 올라온 시점 보면 알다싶히 결국 기한을 못맞춰 동아리 체험 부스에는 못쓰게 되었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 PCB를 늦게 주문한것도 있지만&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/peqfT/btsLzBH9SGz/kVay1SvFFJ5eQvBILxpXuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/peqfT/btsLzBH9SGz/kVay1SvFFJ5eQvBILxpXuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/peqfT/btsLzBH9SGz/kVay1SvFFJ5eQvBILxpXuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpeqfT%2FbtsLzBH9SGz%2FkVay1SvFFJ5eQvBILxpXuK%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;1829&quot; height=&quot;550&quot; data-origin-width=&quot;1829&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;이놈들이 PCB Assembly 주문을 실수로 보류시켜버리고 말도 안해서 지연된것도 한몫 한다. 그래도 최대한 기한 맞춰볼려고 배송 방법까지 페덱스로 바꿨는데 젠장..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4레이어 PCB는 PCBWay보다 JLCPCB가 싸길레 처음 시켜봤는데 첫인상이 별로가 됐다.&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;뭐 그래도 재료는 왔으니 어찌하겠나. 만들어야지. 2편은 납땜이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 회로 점검은 하남자나 하는것&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcVHwQ/btsLBZtAOR4/735lq1B1yuQYubRfEQqfLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcVHwQ/btsLBZtAOR4/735lq1B1yuQYubRfEQqfLK/img.png&quot; data-alt=&quot;왜 사진엔 6개밖에 없냐고? 작업 중간에 처음 사진 안찍은걸 깨닫고 찍음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcVHwQ/btsLBZtAOR4/735lq1B1yuQYubRfEQqfLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcVHwQ%2FbtsLBZtAOR4%2F735lq1B1yuQYubRfEQqfLK%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;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왜 사진엔 6개밖에 없냐고? 작업 중간에 처음 사진 안찍은걸 깨닫고 찍음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무려 9만원을 들인 PCB께서 도착하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 주문전에 수십번 슬라임 트래커 공식 회로도와 BMI270 breakout 보드의 회로도를 수십번 비교해보며 이상이 없는것을 확인한 뒤 주문한 PCB기에 문제가 없을거라 믿었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 만약에 문제가 있다면 배터리까지 달리는 놈이라 잘못되면 LER(Light-Emitting-Resistors)이 되거나 폭탄이 만들어짐과 함께 돈 10만원이 날아가기 때문에 테스터기로 간단하게 점검을 시작했다.&lt;/p&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;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZmjA2/btsLARXEica/3SVXZ5PAPdM1FAF1LDKlik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZmjA2/btsLARXEica/3SVXZ5PAPdM1FAF1LDKlik/img.jpg&quot; data-alt=&quot;Light-Emitting-Resistors&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZmjA2/btsLARXEica/3SVXZ5PAPdM1FAF1LDKlik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZmjA2%2FbtsLARXEica%2F3SVXZ5PAPdM1FAF1LDKlik%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;1226&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Light-Emitting-Resistors&lt;/figcaption&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;&quot;에이 설마 내가 설계를 잘못했겠어?&quot;라는 근자감과 함께 테스터기를 집어넣고 인두기와 납을 꺼냈다.&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;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXphu/btsLBLJ45YY/txCfQbCanOB72qdrgfUBDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXphu/btsLBLJ45YY/txCfQbCanOB72qdrgfUBDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXphu/btsLBLJ45YY/txCfQbCanOB72qdrgfUBDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXphu%2FbtsLBLJ45YY%2FtxCfQbCanOB72qdrgfUBDK%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;289&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WeMos D1 Mini 기판을 끼울 핀 소켓을 납땜하고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qINFy/btsLCmJKynA/jW2Z4NPpNjfNEanKdnvMw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qINFy/btsLCmJKynA/jW2Z4NPpNjfNEanKdnvMw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qINFy/btsLCmJKynA/jW2Z4NPpNjfNEanKdnvMw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqINFy%2FbtsLCmJKynA%2FjW2Z4NPpNjfNEanKdnvMw0%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;331&quot; height=&quot;278&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리튬폴리머 충전용 TP4056 칩 역시 납땜하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L8Y0o/btsLBXpHpXm/4tyvabAxelbSHPITzDxYiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L8Y0o/btsLBXpHpXm/4tyvabAxelbSHPITzDxYiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L8Y0o/btsLBXpHpXm/4tyvabAxelbSHPITzDxYiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL8Y0o%2FbtsLBXpHpXm%2F4tyvabAxelbSHPITzDxYiK%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;210&quot; height=&quot;192&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;192&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;이제 이걸 8번 반복하면 된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuGi5t/btsLQUyYcM4/RQByh4Cw5Uk9FCRd56NxK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuGi5t/btsLQUyYcM4/RQByh4Cw5Uk9FCRd56NxK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuGi5t/btsLQUyYcM4/RQByh4Cw5Uk9FCRd56NxK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuGi5t%2FbtsLQUyYcM4%2FRQByh4Cw5Uk9FCRd56NxK1%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;254&quot; height=&quot;89&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2시간 걸렸다 &lt;a href=&quot;https://www.youtube.com/watch?v=efiRLGUuggc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(납땜 타임랩스)&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;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGOEK/btsLO7fB3ym/0ljsTcINOt54P33pYWKkZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGOEK/btsLO7fB3ym/0ljsTcINOt54P33pYWKkZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGOEK/btsLO7fB3ym/0ljsTcINOt54P33pYWKkZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGOEK%2FbtsLO7fB3ym%2F0ljsTcINOt54P33pYWKkZK%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;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;다음편에는 케이스 조립, 펌웨어 업로드를 작성하도록 하겠다&lt;/p&gt;</description>
      <category>삽질기/슬라임 VR 트래커 제작하기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/24</guid>
      <comments>https://bass9030.tistory.com/24#entry24comment</comments>
      <pubDate>Thu, 16 Jan 2025 20:47:36 +0900</pubDate>
    </item>
    <item>
      <title>[슬라임 트래커 제작] #1 - PCB 설계</title>
      <link>https://bass9030.tistory.com/23</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cELaFF/btsLbVeVvox/DEYIx6E3Smd4czipENKHsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cELaFF/btsLbVeVvox/DEYIx6E3Smd4czipENKHsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cELaFF/btsLbVeVvox/DEYIx6E3Smd4czipENKHsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcELaFF%2FbtsLbVeVvox%2FDEYIx6E3Smd4czipENKHsk%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;364&quot; height=&quot;500&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 프롤로그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌다 보니 동아리 발표에서 VR 버츄얼 유튜버 체험 머시기 부스를 하게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 VRChat과 Warudo로 대충 때우고 말려 했는데 아무리 생각해도 이것만 하기엔 애들이 &quot;VR&quot;를 보고 온 것과는 다르게 할 콘텐츠가 없어 실망할거 같은것이 눈에 보였다.&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;그래서 GPT 한테 도움을 요청해봤더니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xVQie/btsLc3cf0Y4/h1dYl5SxN0ZLbLaDFeW0g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xVQie/btsLc3cf0Y4/h1dYl5SxN0ZLbLaDFeW0g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xVQie/btsLc3cf0Y4/h1dYl5SxN0ZLbLaDFeW0g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxVQie%2FbtsLc3cf0Y4%2Fh1dYl5SxN0ZLbLaDFeW0g0%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;407&quot; height=&quot;120&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mocap, 즉 모션캡처 장비를 써보라는 조언을 해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 순간 머리속을 스쳐가는 단어 &quot;슬라임 트래커&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광학식이 아닌 IMU 센서를 사용하여 기존 바이브 트래커의 비싼 가격과 베이스 스테이션이 설치되야한다는 두 단점을 해소한 트래커이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 오픈소스라 회로도 맞게 대충 배선 짜고 오픈소스 펌웨어 업로드만 딸깍하면 된다. &lt;s&gt;(실제로도 그렇다면 굉장히 좋겠지만..)&lt;/s&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;h3 data-ke-size=&quot;size23&quot;&gt;1. IMU 센서 선정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말했듯 슬라임 트래커는 IMU 센서로 우리들의 움직임을 파악한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 이 IMU 센서의 정확도가 구리면 당연히 트래킹 역시 제대로 되지 않게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 내용은 슬라임 VR 문서에 자세히 나와있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.slimevr.dev/diy/imu-comparison.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.slimevr.dev/diy/imu-comparison.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733732883057&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;IMU Comparison - SlimeVR Docs&quot; data-og-description=&quot;The community has been hard at work testing various IMUs for DIY SlimeVR trackers. A survey was held within the DIY community for a clearer picture of the current state of available IMUs. This page is based on user feedback and weighed against the survey, &quot; data-og-host=&quot;docs.slimevr.dev&quot; data-og-source-url=&quot;https://docs.slimevr.dev/diy/imu-comparison.html&quot; data-og-url=&quot;https://docs.slimevr.dev/diy/imu-comparison.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.slimevr.dev/diy/imu-comparison.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.slimevr.dev/diy/imu-comparison.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;IMU Comparison - SlimeVR Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The community has been hard at work testing various IMUs for DIY SlimeVR trackers. A survey was held within the DIY community for a clearer picture of the current state of available IMUs. This page is based on user feedback and weighed against the survey,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.slimevr.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IMU는 크게 지자기 센서와 가속도 + 자이로스코프 센서를 사용한 &lt;b&gt;9축 방식&lt;/b&gt;과 일반 가속도 + 자이로스코프 센서만을 사용한 &lt;b&gt;6축 방식&lt;/b&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;b&gt;6축&lt;/b&gt;의 경우 단순 가속도 + 자이로스코프 센서만을 사용하여 위치를 파악한다. 물론 6축만 사용해도 충분한 추척성능을 보여주나, &lt;b&gt;Yaw 움직임이 있을 경우&lt;/b&gt; 사용하면서 점점 &lt;b&gt;오차가 발생&lt;/b&gt;하게 된다. Yaw 오차가 발생하면서 실제 서있는 자세와 VR속 나의 위치에 오차가 발생하여 주기적으로 위치 재설정을 해야한다.&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;b&gt;9축&lt;/b&gt;의 경우 가속도 + 자이로스코프 센서만 이용하는것이 아닌 &lt;b&gt;지자기 센서&lt;/b&gt;도 함께 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지자기 센서로 실제로 얼마나 돌았는지에 대한 절대적인 수치를 제공받을 수 있기 때문에 6축 방식보다 Yaw 오차가 훨씬 줄어 위치 재설정을 하는 빈도가 줄어든다.&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;&quot;그럼 무조건 9축으로 하는게 더 좋은거 아님?&quot; 이라고 할수도 있지만, 9축방식의 경우 지자기 센서, 즉 지구 자기장을 이용하기 때문에 주변에 &lt;b&gt;자기장을 교란&lt;/b&gt;시킬수 있는 물체가 있다면 오히려 &lt;b&gt;6축보다 못한 성능&lt;/b&gt;을 보여줄수도 있다. 실제로 9축 트래커를 구매했다가 자기장 교란으로 지자기 센서를 끄고 6축 트래커로 사용하는 사람도 여럿 있다.&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;필자는 BMI270을 이용하여 6축 트래커를 제작하기로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 회로 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&lt;a href=&quot;https://docs.slimevr.dev/diy/tracker-schematics.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.slimevr.dev/diy/tracker-schematics.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734150768044&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;Tracker Schematics - SlimeVR Docs&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.slimevr.dev&quot; data-og-source-url=&quot;https://docs.slimevr.dev/diy/tracker-schematics.html&quot; data-og-url=&quot;https://docs.slimevr.dev/diy/tracker-schematics.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DjddV/hyXOeLGYmx/4tKKnDnCdqEzBmmYfHCok1/img.png?width=1200&amp;amp;height=898&amp;amp;face=0_0_1200_898,https://scrap.kakaocdn.net/dn/qp8ih/hyXKmxMLaI/QKUdhQQKpuBtscR4cnaKfK/img.png?width=1031&amp;amp;height=290&amp;amp;face=0_0_1031_290,https://scrap.kakaocdn.net/dn/Oj20l/hyXKobnumj/NypEXSxJakqEsx3vAH3iKk/img.png?width=450&amp;amp;height=294&amp;amp;face=0_0_450_294&quot;&gt;&lt;a href=&quot;https://docs.slimevr.dev/diy/tracker-schematics.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.slimevr.dev/diy/tracker-schematics.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DjddV/hyXOeLGYmx/4tKKnDnCdqEzBmmYfHCok1/img.png?width=1200&amp;amp;height=898&amp;amp;face=0_0_1200_898,https://scrap.kakaocdn.net/dn/qp8ih/hyXKmxMLaI/QKUdhQQKpuBtscR4cnaKfK/img.png?width=1031&amp;amp;height=290&amp;amp;face=0_0_1031_290,https://scrap.kakaocdn.net/dn/Oj20l/hyXKobnumj/NypEXSxJakqEsx3vAH3iKk/img.png?width=450&amp;amp;height=294&amp;amp;face=0_0_450_294');&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;Tracker Schematics - SlimeVR Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.slimevr.dev&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;&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;999&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8fE6/btsLj3Qq9HS/G5FIrGFAhRbM5whdqRPpXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8fE6/btsLj3Qq9HS/G5FIrGFAhRbM5whdqRPpXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8fE6/btsLj3Qq9HS/G5FIrGFAhRbM5whdqRPpXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8fE6%2FbtsLj3Qq9HS%2FG5FIrGFAhRbM5whdqRPpXk%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;999&quot; height=&quot;937&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 BMI270의 breakout(칩 형태가 아닌 PCB 보드형태로 되있는것)보드를 모듈식으로 끼우는식으로 제작할려 했으나, BMI270 breakout 보드를 국내에서 구매할 수 있는 경로가 없어 그냥 센서 칩을 온보드에 바로 박아버리는쪽으로 설계했다.&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;628&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caGJxd/btsLjcnasCL/YiyVUDXaRiTj4Nm9vBU4W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caGJxd/btsLjcnasCL/YiyVUDXaRiTj4Nm9vBU4W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caGJxd/btsLjcnasCL/YiyVUDXaRiTj4Nm9vBU4W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaGJxd%2FbtsLjcnasCL%2FYiyVUDXaRiTj4Nm9vBU4W1%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;628&quot; height=&quot;624&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;624&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;895&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cminJW/btsLjbhu9S0/nAhcl8TrmcIbtiaS7K4cW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cminJW/btsLjbhu9S0/nAhcl8TrmcIbtiaS7K4cW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cminJW/btsLjbhu9S0/nAhcl8TrmcIbtiaS7K4cW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcminJW%2FbtsLjbhu9S0%2FnAhcl8TrmcIbtiaS7K4cW0%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;895&quot; height=&quot;820&quot; data-origin-width=&quot;895&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;이후 위 회로도를 기반으로 PCB를 설계한 후 JLCPCB에 PCBA 주문을 넣었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhWomd/btsLi943TS8/qgjKiRcLBas90qChHZcRPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhWomd/btsLi943TS8/qgjKiRcLBas90qChHZcRPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhWomd/btsLi943TS8/qgjKiRcLBas90qChHZcRPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhWomd%2FbtsLi943TS8%2FqgjKiRcLBas90qChHZcRPk%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;1125&quot; height=&quot;584&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음편인 조립은 PCB가 도착하는대로 작성하도록 하겠다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #2e3033;&quot;&gt;제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요 제발 PCB 설계미스 없게 해주세요&lt;/span&gt;&lt;/p&gt;</description>
      <category>삽질기/슬라임 VR 트래커 제작하기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/23</guid>
      <comments>https://bass9030.tistory.com/23#entry23comment</comments>
      <pubDate>Sat, 14 Dec 2024 13:40:31 +0900</pubDate>
    </item>
    <item>
      <title>사볼콘 만들기 #2 - 재료 도착, 조립</title>
      <link>https://bass9030.tistory.com/20</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20240813_145515.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leBxq/btsJbL0k4i6/R6xxU3Hb89KQKWok4nGjpK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leBxq/btsJbL0k4i6/R6xxU3Hb89KQKWok4nGjpK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leBxq/btsJbL0k4i6/R6xxU3Hb89KQKWok4nGjpK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleBxq%2FbtsJbL0k4i6%2FR6xxU3Hb89KQKWok4nGjpK%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;20240813_145515.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 전자부품들이 도착하였다. 커넥터와 칩저항, Teensy 2.0 보드가 도착했다.&lt;/p&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;1920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FFtXE/btsJchdi9gW/vGTK8TnyNGFsvyZO8vVRh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FFtXE/btsJchdi9gW/vGTK8TnyNGFsvyZO8vVRh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FFtXE/btsJchdi9gW/vGTK8TnyNGFsvyZO8vVRh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFFtXE%2FbtsJchdi9gW%2FvGTK8TnyNGFsvyZO8vVRh1%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;1440&quot; height=&quot;1920&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 기존에 쓰던 1mm 유연납이 거의 다써가서 0.8mm 200g 짜리 납도 새로 구매했으나.. 무연납으로 사버렸다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠깐 쓰다가 380도에선 드럽게 안녹고 400도 이상 올리기엔 알리산 인두기라 무섭고 해서 그냥 집에 있던 유연납을 그대로 사용했다.&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-filename=&quot;20240816_130955.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z4Ynm/btsJciJYF1W/kJCrBcPjdMiYsCd4HcPNI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z4Ynm/btsJciJYF1W/kJCrBcPjdMiYsCd4HcPNI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z4Ynm/btsJciJYF1W/kJCrBcPjdMiYsCd4HcPNI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ4Ynm%2FbtsJciJYF1W%2FkJCrBcPjdMiYsCd4HcPNI1%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;20240816_130955.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20240816_130957.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJ1UT/btsJcARihLC/ijtIbaK2ffprzPfeNVxZT0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJ1UT/btsJcARihLC/ijtIbaK2ffprzPfeNVxZT0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJ1UT/btsJcARihLC/ijtIbaK2ffprzPfeNVxZT0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJ1UT%2FbtsJcARihLC%2FijtIbaK2ffprzPfeNVxZT0%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;20240816_130957.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전자부품들이 도착하고 몇일 뒤 PCB가 도착했다. 통관은 8월 14일날 끝났으나 하필 14일이 택배 쉬는날이라 금요일에 도착했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20240816_143415.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqBGDQ/btsJcVHwzZy/hiXcCRx8SIdmoIFpb4Dlfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqBGDQ/btsJcVHwzZy/hiXcCRx8SIdmoIFpb4Dlfk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqBGDQ/btsJcVHwzZy/hiXcCRx8SIdmoIFpb4Dlfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqBGDQ%2FbtsJcVHwzZy%2FhiXcCRx8SIdmoIFpb4Dlfk%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;4032&quot; height=&quot;3024&quot; data-filename=&quot;20240816_143415.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20240816_170143.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qtqZ0/btsJblnsMZY/gf2bPD79TrSuKJxKomDDj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qtqZ0/btsJblnsMZY/gf2bPD79TrSuKJxKomDDj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qtqZ0/btsJblnsMZY/gf2bPD79TrSuKJxKomDDj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqtqZ0%2FbtsJblnsMZY%2Fgf2bPD79TrSuKJxKomDDj0%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;4032&quot; height=&quot;3024&quot; data-filename=&quot;20240816_170143.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 본격적으로 PCB를 납땜하고 커넥터를 만들어갔다. PCB 소자 납땜까진 나름 할만했는데 커넥터 납땜이 지옥이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쬐그만한 커넥터 핀을 총합 40번이나 납땜하니 미칠 지경이였다.&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;PCB 납땜을 완료하고 하우징을 제작했다. 이때부터 슬슬 지치고 이걸 완성하겠다는 생각밖에 안들어서 사진을 못찍었다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드릴질을 안하고 나사못을 박으면 목제에 금이 간다는건 알아서 사전에 드릴질을 하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 세게 누르니까 MDF가 약간 찢어져버리고, 드릴질을 구멍에 맞게 하고 나사못을 박았는데 하판이랑 벽이랑 뚫은 구멍위치가 안맞았는지 박는 족족 금이 갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 못쓸정도는 아니여서 그냥 진행하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어차피 내 DIY의 목표는 &quot;주요 기능만 제대로 하면 된다&quot;니까.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20240818_000302.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XyX1C/btsJc3SY2Bs/O9ktDOdbay005kyQccLu0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XyX1C/btsJc3SY2Bs/O9ktDOdbay005kyQccLu0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XyX1C/btsJc3SY2Bs/O9ktDOdbay005kyQccLu0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXyX1C%2FbtsJc3SY2Bs%2FO9ktDOdbay005kyQccLu0k%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;20240818_000302.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;추가로 집에 type-C 암놈 포트가 남는게 몇개 있어서 드릴로 열심히 파내서 type-C로 연결할 수 있게 해주었다.&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-filename=&quot;blob&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdTKGz/btsJdooVYNd/vD9Wje712NglzpBXUvpKuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdTKGz/btsJdooVYNd/vD9Wje712NglzpBXUvpKuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdTKGz/btsJdooVYNd/vD9Wje712NglzpBXUvpKuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdTKGz%2FbtsJdooVYNd%2FvD9Wje712NglzpBXUvpKuk%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;1920&quot; height=&quot;1440&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;조립한뒤 테스트해보니 생각보다 시끄러워서 버튼에다 종이 테이프를 4겹정도 위아래로 붙여 조금이나마 줄여줬다.&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;이제 Teensy 2.0에 들어갈 코드를 작성해야하는데 이는 전에 직접 만든 종이 Pocket Voltex의 코드를 Teensy 2.0 사양에 맞춰 약간 변경하여 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로서 2주만에 자작 사볼콘이 완성되었다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼: 약 15,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치, 스프링: 16,800원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MDF 재단: 28,500원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCB: 약 20,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전자부품: 44,874원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;====================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 110,054원이 들었다.&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;
&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;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) PCB&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보드 설계를 끝마치고 PCBWay에다가 주문을 넣고 PCB 회로를 보는데 아뿔싸..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔코더 풀업저항 회로를 완전히 잘못짠것이다. 어쩐지 전 사볼콘에는 선이 4개가 나와있었는데 내 회로는 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;1017&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrvMX/btsJbqhI9nG/uGNBwesNkMTzVwmLIQN2MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrvMX/btsJbqhI9nG/uGNBwesNkMTzVwmLIQN2MK/img.png&quot; data-alt=&quot;머릿속이 햐얘져서 급하게 보내느랴고 번역기가 오역낸것도 그냥 복붙해서 보냄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrvMX/btsJbqhI9nG/uGNBwesNkMTzVwmLIQN2MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwrvMX%2FbtsJbqhI9nG%2FuGNBwesNkMTzVwmLIQN2MK%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;1017&quot; height=&quot;367&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;머릿속이 햐얘져서 급하게 보내느랴고 번역기가 오역낸것도 그냥 복붙해서 보냄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;급하게 메일로 '비상!!!! 도움!!! gerber파일 바꿔줘!!!!!'라는 메일을 보냈다. 다음날 답장을 보니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LfjjV/btsJcR6mXUN/oi7BuxNORQ24WqJxbKFOyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LfjjV/btsJcR6mXUN/oi7BuxNORQ24WqJxbKFOyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LfjjV/btsJcR6mXUN/oi7BuxNORQ24WqJxbKFOyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLfjjV%2FbtsJcR6mXUN%2Foi7BuxNORQ24WqJxbKFOyK%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;625&quot; height=&quot;737&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;737&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;이때 휴일이였는데 이친구들은 참 일처리가 빠르더라.. 덕분에 5$ 더 들여서 엔코더 보드를 새로 주문했다. 다행히 배송은 묶음이 되서 배송비까진 안냈다.&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;그리고 PCB를 하우징에 고정시킬려고 M4규격의 나사와 스탠드오프를 샀는데 보드에 마운트구멍을 2.2mm로 뚫어놨다...&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;h4 data-ke-size=&quot;size20&quot;&gt;2) 조립&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글을 읽다가 눈치챈 사람도 있겠지만, 깜빡하고 PCB에 스타트 버튼 커넥터을 안넣어버렸다. BT A/B/C/D와 FX L/R, VOL L/R에만 신경쓴 나머지 스타트 버튼은 까맣게 잊어버린것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전선을&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;스타트버튼은 일단은 폼으로 달아둘까 하다가, 그래도 달려있는 버튼이니 급하게 아두이노키트에 있는 점퍼선을 잘라 연결해줬다. 사진에서 검정선들 사이 눈에 띄는 회색, 보라색, 흰색선들이 추가한 버튼 커넥터이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 목공&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;이게 나무를 고정할 공구가 없으니까 첫큐부터 망해버렸다. 구멍을 뚫어가면서 벽과 하판을 잡아줄게 아무것도 없으니 구멍을 뚫어도 구멍이 서로 안맞아 결국엔 나무가 갈라졌다. 그리고 이게 MDF 특성인건지 드릴이 반정도는 잘 들어가다가 다 뚫어질때쯤에 깔끔하게 뚫리는게 아니고 찢어진다고 해야하나? 아무튼 정상적으론 안뚫렸다. 그래도 못쓸정도의 상태가진 가지않아서 다행이 잘 조립했다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐 이런 뻘짓거리 좋아하는 나로써는 재미있는 프로젝트였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 대충 사부작거리고 마는것도 아니고 한번 각잡고 만든 프로젝트다 보니 나에게 뭔가 더 의미가 있었다.&lt;/p&gt;</description>
      <category>삽질기/사볼콘 만들기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/20</guid>
      <comments>https://bass9030.tistory.com/20#entry20comment</comments>
      <pubDate>Sun, 1 Sep 2024 11:19:13 +0900</pubDate>
    </item>
    <item>
      <title>사볼콘 만들기 #1 - 재료 준비</title>
      <link>https://bass9030.tistory.com/19</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 프롤로그&lt;/h3&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;1920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCjpkL/btsI1X6iNCh/XIJyrskr9WFDMVXPhBVJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCjpkL/btsI1X6iNCh/XIJyrskr9WFDMVXPhBVJtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCjpkL/btsI1X6iNCh/XIJyrskr9WFDMVXPhBVJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCjpkL%2FbtsI1X6iNCh%2FXIJyrskr9WFDMVXPhBVJtk%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;1440&quot; height=&quot;1920&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1920&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;PC는 디맥투온을 주로 하고 모바일은 프세카와 피그로스, &lt;s&gt;리플렉비트 플러스&lt;/s&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;820&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t03yc/btsI0545nyh/JYZspioP47g8jc8Jv6FJ5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t03yc/btsI0545nyh/JYZspioP47g8jc8Jv6FJ5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t03yc/btsI0545nyh/JYZspioP47g8jc8Jv6FJ5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft03yc%2FbtsI0545nyh%2FJYZspioP47g8jc8Jv6FJ5k%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;820&quot; height=&quot;290&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 오락실이 올해 초 폐업했다.. &lt;s&gt;코로나 시발&lt;/s&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;이제 오락실을 갈려면 대전까지 원정을 가면서 교통비로만 만원상당을 까먹어야한다. 사볼 프리미엄 타임 5판이 날라가는 금액이다. 또 집에서 나가서 시외로 가야한다는 굉장한 업적을 이루어야한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;1. 그깟거 그냥 사면 안됨?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WXawf/btsI1VALpnD/cnokmNY5k0rWMuq9YUfO20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WXawf/btsI1VALpnD/cnokmNY5k0rWMuq9YUfO20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WXawf/btsI1VALpnD/cnokmNY5k0rWMuq9YUfO20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWXawf%2FbtsI1VALpnD%2FcnokmNY5k0rWMuq9YUfO20%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;765&quot; height=&quot;355&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;355&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;1257&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clS64D/btsI2i3v1Ef/V5JpAKiy13I8UGPhqRCV81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clS64D/btsI2i3v1Ef/V5JpAKiy13I8UGPhqRCV81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clS64D/btsI2i3v1Ef/V5JpAKiy13I8UGPhqRCV81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclS64D%2FbtsI2i3v1Ef%2FV5JpAKiy13I8UGPhqRCV81%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;1257&quot; height=&quot;515&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;515&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;1080&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf7pUT/btsI2pH8CEf/Lz0agxkMjoi7qDaGBI0Xr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf7pUT/btsI2pH8CEf/Lz0agxkMjoi7qDaGBI0Xr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf7pUT/btsI2pH8CEf/Lz0agxkMjoi7qDaGBI0Xr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf7pUT%2FbtsI2pH8CEf%2FLz0agxkMjoi7qDaGBI0Xr1%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;1080&quot; height=&quot;505&quot; data-origin-width=&quot;1080&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;10만원이 넘는 거금을 한번에 지불할 능력이 없다. 학생이니까.....&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;h3 data-ke-size=&quot;size23&quot;&gt;2. 재료 선정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;과거 인터넷을 보다가 찾은 Pocket Voltex를 기반으로하여 종이박스로 만들었었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQmhw/btsI0LMNX0u/sTbZx2LELb09OXEss7ko60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQmhw/btsI0LMNX0u/sTbZx2LELb09OXEss7ko60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQmhw/btsI0LMNX0u/sTbZx2LELb09OXEss7ko60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQmhw%2FbtsI0LMNX0u%2FsTbZx2LELb09OXEss7ko60%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;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4aLR0/btsI03TUEUo/t5m0BC8WCZA8sMMEjIgwQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4aLR0/btsI03TUEUo/t5m0BC8WCZA8sMMEjIgwQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4aLR0/btsI03TUEUo/t5m0BC8WCZA8sMMEjIgwQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4aLR0%2FbtsI03TUEUo%2Ft5m0BC8WCZA8sMMEjIgwQ0%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;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;이번 사볼콘은 이런점을 싹 개선해서 제작하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 입력부&lt;/h3&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;1080&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3OIsH/btsI1uwQqYX/LGL4SOSlL08Kpy1hLFKnwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3OIsH/btsI1uwQqYX/LGL4SOSlL08Kpy1hLFKnwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3OIsH/btsI1uwQqYX/LGL4SOSlL08Kpy1hLFKnwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3OIsH%2FbtsI1uwQqYX%2FLGL4SOSlL08Kpy1hLFKnwk%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;1080&quot; height=&quot;967&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마침 알리익스프레스에서 IST 버튼보다 저렴한 가격에 동일 규격 버튼을 판매하길래 해당 버튼을 구매했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송 후 확인해보니 버튼 무게가 이걸로 리듬게임 하다간 지쳐서 못할정도로 꽤 무거워서 IST물에서 가벼운 스위치와 스프링을 구매해서 교체해주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OLVmH/btsI2gygIWf/or1og0jQVISWlPwGwkeMzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OLVmH/btsI2gygIWf/or1og0jQVISWlPwGwkeMzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OLVmH/btsI2gygIWf/or1og0jQVISWlPwGwkeMzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOLVmH%2FbtsI2gygIWf%2For1og0jQVISWlPwGwkeMzK%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;314&quot; height=&quot;823&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔코더는 위에서 만든 사볼콘에서도 사용했고 PocketVoltex와 퍼스투 포터블 사볼콘(추정)에서도 사용하는 PEC16-4020F-N0024&amp;nbsp;엔코더를&amp;nbsp;똑같이&amp;nbsp;사용하기로&amp;nbsp;하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 하우징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하우징은 상판의 경우 &lt;a href=&quot;https://arca.live/b/mgamm/26420675&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arca.live/b/mgamm/26420675&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;1854&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4u0Xk/btsI2w1OBGa/o78V0K3lVrKK74HSj0iBxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4u0Xk/btsI2w1OBGa/o78V0K3lVrKK74HSj0iBxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4u0Xk/btsI2w1OBGa/o78V0K3lVrKK74HSj0iBxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4u0Xk%2FbtsI2w1OBGa%2Fo78V0K3lVrKK74HSj0iBxk%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;1854&quot; height=&quot;1080&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1080&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;705&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VrThj/btsI1l7YOxL/vR6T3cpEHBqWtbkhXTEXqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VrThj/btsI1l7YOxL/vR6T3cpEHBqWtbkhXTEXqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VrThj/btsI1l7YOxL/vR6T3cpEHBqWtbkhXTEXqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVrThj%2FbtsI1l7YOxL%2FvR6T3cpEHBqWtbkhXTEXqk%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;705&quot; height=&quot;291&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;291&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;317&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUBvq/btsI0Md0vbC/guaw0NLIQa4KNf9lRdbBk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUBvq/btsI0Md0vbC/guaw0NLIQa4KNf9lRdbBk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUBvq/btsI0Md0vbC/guaw0NLIQa4KNf9lRdbBk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUBvq%2FbtsI0Md0vbC%2Fguaw0NLIQa4KNf9lRdbBk0%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;317&quot; height=&quot;609&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;609&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;1918&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/II0US/btsI0UpwYoy/yKq1ZxvmlOIX8vAFLT8w01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/II0US/btsI0UpwYoy/yKq1ZxvmlOIX8vAFLT8w01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/II0US/btsI0UpwYoy/yKq1ZxvmlOIX8vAFLT8w01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FII0US%2FbtsI0UpwYoy%2FyKq1ZxvmlOIX8vAFLT8w01%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;1918&quot; height=&quot;1010&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;1010&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;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 전자파트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러의 두뇌를 담당할 MCU는 Teensy 2.0 보드를 사용하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 컨트롤러는 각잡고 만들고 싶어서 PCB까지 제작하기로 했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3mW5W/btsI2DNbcVk/Nez01PzElFAmOwZNj7SdtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3mW5W/btsI2DNbcVk/Nez01PzElFAmOwZNj7SdtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3mW5W/btsI2DNbcVk/Nez01PzElFAmOwZNj7SdtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3mW5W%2FbtsI2DNbcVk%2FNez01PzElFAmOwZNj7SdtK%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;482&quot; height=&quot;733&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;733&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;492&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfsOM/btsI2DNcrOQ/YpRZR85kT89rPSpREQqACK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfsOM/btsI2DNcrOQ/YpRZR85kT89rPSpREQqACK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfsOM/btsI2DNcrOQ/YpRZR85kT89rPSpREQqACK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfsOM%2FbtsI2DNcrOQ%2FYpRZR85kT89rPSpREQqACK%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;492&quot; height=&quot;798&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;www.devicemart.co.kr_mypage_order_view_no=2024080614390617974 (1).png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v11TH/btsI1CV2TDC/al2wGLSFoS5lUoJaQFIPB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v11TH/btsI1CV2TDC/al2wGLSFoS5lUoJaQFIPB0/img.png&quot; data-alt=&quot;칩저항이랑 커넥터 핀 최소수량이 100개라 일단 시켰는데 만들고 남은거 어디다 쓰냐...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v11TH/btsI1CV2TDC/al2wGLSFoS5lUoJaQFIPB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv11TH%2FbtsI1CV2TDC%2Fal2wGLSFoS5lUoJaQFIPB0%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;1000&quot; height=&quot;1040&quot; data-filename=&quot;www.devicemart.co.kr_mypage_order_view_no=2024080614390617974 (1).png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;칩저항이랑 커넥터 핀 최소수량이 100개라 일단 시켰는데 만들고 남은거 어디다 쓰냐...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Teensy 2.0 보드가 들어갈 메인 기판, 엔코더를 고정해줄 기판과 그 기판에 들어갈 부품들을 주문하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 기타 부품&lt;/h3&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;627&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyck7s/btsI0DBE3zS/lDwWoeHKH4S5PzRhTgeEs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyck7s/btsI0DBE3zS/lDwWoeHKH4S5PzRhTgeEs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyck7s/btsI0DBE3zS/lDwWoeHKH4S5PzRhTgeEs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyck7s%2FbtsI0DBE3zS%2FlDwWoeHKH4S5PzRhTgeEs0%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;627&quot; height=&quot;595&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;595&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음편인 조립편은 PCB와 부품들이 도착하면 작성하도록 하겠다.&lt;/p&gt;</description>
      <category>삽질기/사볼콘 만들기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/19</guid>
      <comments>https://bass9030.tistory.com/19#entry19comment</comments>
      <pubDate>Mon, 12 Aug 2024 14:37:14 +0900</pubDate>
    </item>
    <item>
      <title>[Web] NodeJS로 웹 푸시알림 구현하기</title>
      <link>https://bass9030.tistory.com/17</link>
      <description>&lt;div style=&quot;color: #24292e; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.webp&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7L0dX/btsK7OnsXtN/VhQI8oKQGlr4BTy8KyEv31/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7L0dX/btsK7OnsXtN/VhQI8oKQGlr4BTy8KyEv31/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7L0dX/btsK7OnsXtN/VhQI8oKQGlr4BTy8KyEv31/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7L0dX%2FbtsK7OnsXtN%2FVhQI8oKQGlr4BTy8KyEv31%2Fimg.webp&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;205&quot; data-filename=&quot;img1.daumcdn.webp&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에&amp;nbsp;웹&amp;nbsp;푸시를&amp;nbsp;구현하면서&amp;nbsp;알게&amp;nbsp;된&amp;nbsp;내용을&amp;nbsp;간단하게&amp;nbsp;정리해보려고&amp;nbsp;한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;web-push&amp;nbsp;모듈&amp;nbsp;설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 NodeJS에서 웹 푸시를 쉽게 구현해주는 web-push 모듈을 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414400280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i web-push&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VAPID 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 푸시 알림 전송에는 VAPID라 불리우는 키쌍이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web-push&amp;nbsp;패키지에는&amp;nbsp;VAPID를&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기능을&amp;nbsp;지원하기에&amp;nbsp;VAPID를&amp;nbsp;생성해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414447409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx web-push generate-vapid-keys&lt;/code&gt;&lt;/pre&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;아래와&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.webp&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yamL0/btsK7IAWbf7/aY5CzhBhHKyXbXYecK4cvK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yamL0/btsK7IAWbf7/aY5CzhBhHKyXbXYecK4cvK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yamL0/btsK7IAWbf7/aY5CzhBhHKyXbXYecK4cvK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyamL0%2FbtsK7IAWbf7%2FaY5CzhBhHKyXbXYecK4cvK%2Fimg.webp&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;633&quot; height=&quot;162&quot; data-filename=&quot;img1.daumcdn.webp&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서비스워커 작성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 웹 브라우저에서 푸시 알림을 처리할 수 있도록 서비스워커에 push 이벤트를 처리하는 코드를 작성해야합니다.&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;위에서&amp;nbsp;서술했듯&amp;nbsp;서비스워커는&amp;nbsp;&lt;b&gt;웹페이지와&amp;nbsp;완전&amp;nbsp;별개&lt;/b&gt;로&amp;nbsp;떨어저&amp;nbsp;있기에&amp;nbsp;서비스워커에서는&amp;nbsp;&lt;b&gt;DOM,&amp;nbsp;window&amp;nbsp;&lt;/b&gt;요소등을&amp;nbsp;&lt;b&gt;사용할&amp;nbsp;수&amp;nbsp;없습니다.&lt;/b&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;먼저 서비스워커로 사용할 js 파일을 퍼블릭 폴더에 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&amp;nbsp;push&amp;nbsp;이벤트&amp;nbsp;리스너를&amp;nbsp;추가하여&amp;nbsp;푸시알림&amp;nbsp;수신&amp;nbsp;이벤트를&amp;nbsp;생성해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414568674&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* serviceworker.js */

self.addEventListener(&quot;push&quot;, (event) =&amp;gt; {
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음&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;서버단에서 보낸 푸시 정보는 event.data로 수신되니 으로 수신되니 서버에서 보낸 형식에 맞게 파싱해줍니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림 표시의 경우는 브라우저의 Notification API를 사용하여 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414592891&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* serviceworker.js */

self.addEventListener(&quot;push&quot;, (event) =&amp;gt; {
    const payload = event.data.json();
    event.waitUntil(
      registration.showNotification(payload.title, {
        body: payload.body,
        vibrate: [100, 100, 100],
      })
    );
});&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹페이지&amp;nbsp;알림&amp;nbsp;전송&amp;nbsp;권한&amp;nbsp;요청&amp;nbsp;및&amp;nbsp;푸시&amp;nbsp;알림&amp;nbsp;구독 &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 웹 푸시알림을 브라우저가 처리하고, 알림을 보낼수 있도록 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지&amp;nbsp;내에&amp;nbsp;JS코드를&amp;nbsp;생성한후&amp;nbsp;먼저&amp;nbsp;serviceWorker,&amp;nbsp;PushManager,&amp;nbsp;Notification을&amp;nbsp;브라우저에서&amp;nbsp;지원하는지&amp;nbsp;확인해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414621886&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* index.js */

if (&quot;serviceWorker&quot; in navigator &amp;amp;&amp;amp; &quot;PushManager&quot; in window &amp;amp;&amp;amp; 'Notification' in window) {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음&amp;nbsp;serviceWorker를&amp;nbsp;등록해줍니다.&amp;nbsp;저의&amp;nbsp;경우&amp;nbsp;서비스워커를&amp;nbsp;/javascripts/serviceworker.js에&amp;nbsp;저장했기에&amp;nbsp;이를&amp;nbsp;기준으로&amp;nbsp;등록하였습니다. &lt;/p&gt;
&lt;pre id=&quot;code_1733414641959&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* index.js */

navigator.serviceWorker.register(&quot;/javascripts/serviceworker.js&quot;).then(e =&amp;gt; {
});&lt;/code&gt;&lt;/pre&gt;
&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;subscribePushNoti를&amp;nbsp;호출해&amp;nbsp;푸시알림을&amp;nbsp;등록해줍니다. &lt;/p&gt;
&lt;pre id=&quot;code_1733414664290&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* index.js */

navigator.serviceWorker.register(&quot;/javascripts/serviceworker.js&quot;).then(e =&amp;gt; {
	if(Notification.permission == 'default') {
		Notification.requestPermission((permission) =&amp;gt; {
			if(permission == 'granted') {
				// 푸시알림 구독
				subscribePushNoti(e);
			}
		});
	}else if(Notification.permission == 'granted') {
		// 푸시알림 구독
		subscribePushNoti(e);
	}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribePushNoti함수는&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;작성하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414686465&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function subscribePushNoti(e) {
    let subInfo = await e.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: PUBLIC_KEY
    });
    await fetch('/api/subscribe', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(subInfo)
    })
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;serviceWoeker.register().then(e =&amp;gt; {})에 포함된 e.pushManager.subscribe()를 사용하여 푸시 알림을 구독합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribe()에&amp;nbsp;사용되는&amp;nbsp;옵션은&amp;nbsp;다음과&amp;nbsp;같습니다.&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;userVisibleOnly: 사용자에게 표시되는 알림만 받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;applicationServerKey:&amp;nbsp;발급한&amp;nbsp;VAPID의&amp;nbsp;Public&amp;nbsp;Key&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;e.pushManager.subscribe()를&amp;nbsp;실행하여&amp;nbsp;나온&amp;nbsp;구독&amp;nbsp;정보를&amp;nbsp;서버로&amp;nbsp;전송합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;푸시알림 구독 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 서버단에서 구독 정보를 토대로 처리해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ExpressJS로&amp;nbsp;구현하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733414762057&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var express = require('express');
var router = express.Router();
var webpush = require('web-push');
let subInfo = {};

// web-push 모듈 설정
webpush.setVapidDetails(
	'mailto:&amp;lt;email 주소&amp;gt;',
    VAPID_PUBLIC_KEY,
    VAPIID_PRIVATE_KEY
);

// 푸시알림 전송
router.post('/event', function(req, res, next) {
	// status 0: 전송 성공
	// status -1: 구독 정보 없음
	if(!!!subInfo) {
		res.json({status: -1});
		return;
	}
	webpush.sendNotification(subInfo, JSON.stringify({title: 'test', body: 'test'}))
	res.json({status:0}
);
});


// 푸시알림 구독정보 저장
router.post('/subscribe', function(req, res, next) {
	subInfo = req.body;
	res.json({status: 0});
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹으로&amp;nbsp;전송한&amp;nbsp;구독정보를&amp;nbsp;subInfo&amp;nbsp;변수에&amp;nbsp;저장후&amp;nbsp;/event로&amp;nbsp;POST&amp;nbsp;요청&amp;nbsp;전송시&amp;nbsp;subInfo에&amp;nbsp;저장된&amp;nbsp;구독&amp;nbsp;정보를&amp;nbsp;바탕으로&amp;nbsp;푸시알림을&amp;nbsp;전송합니다. &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;이후 웹페이지에 한번 접속하여 알림 전송을 허용해준후, /event로 POST 요청을 보내면 웹브라우저로 알림이 전송되는것을 확인할 수 있습니다. &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;a href=&quot;https://blog.bass9030.dev/post/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.bass9030.dev/post/15&lt;/a&gt;&amp;nbsp;에서&amp;nbsp;이동된&amp;nbsp;글입니다] &lt;/p&gt;</description>
      <category>코딩 스래기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/17</guid>
      <comments>https://bass9030.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 3 Apr 2024 14:29:26 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Intent로 웹페이지를 열면 웹뷰 충돌이 발생할때</title>
      <link>https://bass9030.tistory.com/16</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1681050905808_Screenshot_20230409_233253_Device_care.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbRbML/btsGlVweQ8G/cxdbz4ZRuJKjdvxohLqNk1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbRbML/btsGlVweQ8G/cxdbz4ZRuJKjdvxohLqNk1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbRbML/btsGlVweQ8G/cxdbz4ZRuJKjdvxohLqNk1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbRbML%2FbtsGlVweQ8G%2Fcxdbz4ZRuJKjdvxohLqNk1%2Fimg.webp&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;586&quot; data-filename=&quot;1681050905808_Screenshot_20230409_233253_Device_care.jpg&quot; data-origin-width=&quot;1080&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아버지가 어느 선사의 웹페이지가 켜지지 않고 위 사진의 오류가 뜬다며 나를 호출하셨다.&lt;/p&gt;
&lt;p style=&quot;color: #24292e; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #24292e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;증상 구현&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아버지깨선 앱을 키고, 가장 먼저 '범블비호'라는 선사의 웹페이지에 접속하면 위와 같은 오류가 뜨거나 크롬 창이 감빡하고 나타났다 사라진다고 하셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그로고 다른 선사들의 페이지는 멀쩡하게 접속되고, 아무 선사나 들어갔다 나간뒤 범블비호의 웹페이지에 접속하면 멀쩡해진다고 하셨다.&lt;/p&gt;
&lt;h2 style=&quot;color: #24292e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;웹뷰 이번에도 너 때문이냐&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 웹뷰 관련 오류인줄 알고 아버지께 웹뷰 업데이트와 크롬이 뭔가 안맞는거 같으니 임시로 다른 선사를 먼저 들어가고 범블비호를 들어가라고 해둔 뒤 디버깅에 돌입했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선은 본인의 폰에서 테스트한 결과, 똑같이 재현되었다. 우선 웹뷰의 업데이트를 삭제하고 들어가봤는데 얼래? 똑같은 화면이 표시되었다.&lt;/p&gt;
&lt;h2 style=&quot;color: #24292e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;일단 로그부터 까보자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만&amp;nbsp;야속하게도&amp;nbsp;로그에는&amp;nbsp;워닝&amp;nbsp;조차도&amp;nbsp;쓰지&amp;nbsp;않았고,&amp;nbsp;디버깅은&amp;nbsp;미궁으로&amp;nbsp;빠져들어갔다.&lt;/p&gt;
&lt;h2 style=&quot;color: #24292e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;설마 한국 URL 때문에?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;않았다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러던중&amp;nbsp;머릿속을&amp;nbsp;스쳐지나가는&amp;nbsp;생각하나.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;저 URL 한글이였지 않았나?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;범블비호 선사의 URL은 범블비호.com으로 한글 URL을 사용중이다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글&amp;nbsp;URL은&amp;nbsp;당연하게도&amp;nbsp;해외에서는&amp;nbsp;전혀&amp;nbsp;사용되지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;Intent&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;이때문에&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;h2 style=&quot;color: #24292e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;퓨리코드 변환&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&amp;nbsp;해당&amp;nbsp;오류를&amp;nbsp;수정하기&amp;nbsp;위해&amp;nbsp;입력한&amp;nbsp;URL을&amp;nbsp;퓨니코드로&amp;nbsp;변환한&amp;nbsp;URL로&amp;nbsp;크롬을&amp;nbsp;열게&amp;nbsp;해주면&amp;nbsp;해결이&amp;nbsp;된다. &lt;br /&gt;여기서&amp;nbsp;퓨리코드란&amp;nbsp;xn--cg4bkiv2oina.com&amp;nbsp;이런식의&amp;nbsp;누가봐도&amp;nbsp;스팸&amp;nbsp;웹사이트&amp;nbsp;냄새&amp;nbsp;풀풀나는&amp;nbsp;URL인데 &lt;br /&gt;사실&amp;nbsp;이는&amp;nbsp;한글URL을&amp;nbsp;기본URL에서&amp;nbsp;사용가능한&amp;nbsp;문자들로&amp;nbsp;바꾼&amp;nbsp;인코딩중&amp;nbsp;하나이다. &lt;br /&gt;참고로&amp;nbsp;저&amp;nbsp;인코딩된&amp;nbsp;URL은&amp;nbsp;삼성전자.com이나,&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;URL을&amp;nbsp;퓨니코드로&amp;nbsp;인코딩해&amp;nbsp;열어주는&amp;nbsp;코드만&amp;nbsp;추가하니&amp;nbsp;문제가&amp;nbsp;해결되었다&lt;/p&gt;
&lt;pre id=&quot;code_1712120774476&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; String link = selectedShip.link;
 if(!link.startsWith(&quot;http://&quot;) || !link.startsWith(&quot;https://&quot;))
 	link = &quot;http://&quot; + IDN.toASCII(link);
 else
 	link = &quot;http://&quot; + IDN.toASCII(link.split(&quot;//&quot;)[1]);
Log.d(&quot;link&quot;, link);
Intent browserIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse(link));&lt;/code&gt;&lt;/pre&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;해당글은&amp;nbsp;&lt;a href=&quot;https://blog.bass9030.dev/post/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.bass9030.dev/post/14&lt;/a&gt; 에서&amp;nbsp;이전된&amp;nbsp;글입니다 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1712120864923&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;[Android] Intent로 웹페이지를 열면 웹뷰 충돌이 발생할때&quot; data-og-description=&quot;아버지가 부탁하신 선박검색앱의 버그도 어느정도 잡았고, 자동 업데이트도 구현해놔서 이제 버그는 없겠지하고 안심하고 있었는데 아뿔싸.. 아버지가 어느 선사의 웹페이지가 켜지지 않고 위 &quot; data-og-host=&quot;blog.bass9030.dev&quot; data-og-source-url=&quot;https://blog.bass9030.dev/post/14&quot; data-og-url=&quot;https://blog.bass9030.dev/post/14&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://blog.bass9030.dev/post/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.bass9030.dev/post/14&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;[Android] Intent로 웹페이지를 열면 웹뷰 충돌이 발생할때&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;blog.bass9030.dev&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>코딩 스래기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/16</guid>
      <comments>https://bass9030.tistory.com/16#entry16comment</comments>
      <pubDate>Wed, 3 Apr 2024 14:06:31 +0900</pubDate>
    </item>
    <item>
      <title>[Web] form 태그에서 js 추가 안하고 원하는 페이지로 리다이렉트하기</title>
      <link>https://bass9030.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 express로 블로그를 만드는 뻘짓을 하고 있는데 절때 건들일이 없을거 같은 로그인 페이지에 손댈게 생겼다.&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;widthContent&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v2I5z/btq1AE3UQV5/qnEQvIewUGfMnhtYH1Tapk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v2I5z/btq1AE3UQV5/qnEQvIewUGfMnhtYH1Tapk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v2I5z/btq1AE3UQV5/qnEQvIewUGfMnhtYH1Tapk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv2I5z%2Fbtq1AE3UQV5%2FqnEQvIewUGfMnhtYH1Tapk%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;249&quot; height=&quot;33&quot; data-origin-width=&quot;249&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;이렇게 요청을 보내고 여기서 로그인을 마치면 redir인자에 있는 /write 페이지로 이동하는 식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 문제가 하나있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로그인 페이지가 html(정확히는 ejs)로만 이루어져 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;login.ejs&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733413493023&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link href=&quot;/css/login.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/css/darkmode.css&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;%- include('nav', {login: login}) %&amp;gt;
    &amp;lt;div id=&quot;loginForm&quot;&amp;gt;
        &amp;lt;h3&amp;gt;로그인&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt;블로그 운영자 확인용 로그인입니다.&amp;lt;/p&amp;gt;
        &amp;lt;% if(wrong) { %&amp;gt;
            &amp;lt;p style=&quot;color: red; font-size: 10px;&quot;&amp;gt;아이디 혹은 비밀번호를 잘못 입력했습니다.&amp;lt;/p&amp;gt;
        &amp;lt;% } %&amp;gt;
        &amp;lt;form action=&quot;/login&quot; method=&quot;POST&quot;&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;td&amp;gt;ID : &amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;td&amp;gt;PW : &amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;password&quot;&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;b&gt;login.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733413508895&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;router.post('/', function(req, res, next) {
    var body = req.body;
    var inputpass = crypto.createHash(&quot;sha512&quot;).update(body.password).digest(&quot;hex&quot;);
    if(body.id == 'id' &amp;amp;&amp;amp; inputpass == 'sha512 hash pw') {
        req.session.userinfo = body.id;
        req.session.isLogin = true;
        res.redirect('/');
    }else{
        res.render('login', {wrong: true, login: req.session.isLogin});
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form태그는 action에 있는 주소에 method에 있는 방법으로 페이지를 요청해 이동시키기에 별도의 js를 쓰지 않는 이상 form안에 input으로만 인자를 넘겨줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(예시로 태그가&lt;code&gt;&amp;lt;form action=&quot;/test&quot; method=&quot;GET&quot;&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/code&gt;이면 tistory.com/login?id=(input value)로 get요청을 보내는 것이다.)&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;이때 XHR로 요청을 보내게 만들었어야 하는데 블로그를 만들기로 마음 먹고 로그인 폼을 만들때만 해도 웹 개발 지식을 거의 몰랐기에 그냥 프론트 엔드에서 login으로 리다이액션만 하게 해놓고 백엔드에서 리다이렉트을 시켰다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 저 form에서 리다이렉트를 시킬 웹 주소를 넘겨줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 쉽다. html코드에 숨겨진 input를 만든 후, 거기다가 리다이렉트할 주소를 넣어주면 된다.&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;b&gt;login.ejs&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733413554462&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link href=&quot;/css/login.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/css/darkmode.css&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;%- include('nav', {login: login}) %&amp;gt;
    &amp;lt;div id=&quot;loginForm&quot;&amp;gt;
        &amp;lt;h3&amp;gt;로그인&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt;블로그 운영자 확인용 로그인입니다.&amp;lt;/p&amp;gt;
        &amp;lt;% if(wrong) { %&amp;gt;
            &amp;lt;p style=&quot;color: red; font-size: 10px;&quot;&amp;gt;아이디 혹은 비밀번호를 잘못 입력했습니다.&amp;lt;/p&amp;gt;
        &amp;lt;% } %&amp;gt;
        &amp;lt;form action=&quot;/login&quot; method=&quot;POST&quot;&amp;gt;
            &amp;lt;input type=&quot;text&quot; name=&quot;redir&quot; style=&quot;display: none;&quot; value=&quot;&amp;lt;%=redir%&amp;gt;&quot;/&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;td&amp;gt;ID : &amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;td&amp;gt;PW : &amp;lt;/td&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;password&quot;&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;
                    &amp;lt;td&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;로그인&quot;&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;login.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733413583237&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var createError = require('http-errors');
var express = require('express');
var router = express.Router();
var crypto = require('crypto');

/* GET login page. */
router.get('/', function(req, res, next) {
    res.render('login', {wrong:false, login: req.session.isLogin, redir: (req.query.redir ? req.query.redir : '')});
});

router.post('/', function(req, res, next) {
    var body = req.body;
    var inputpass = crypto.createHash(&quot;sha512&quot;).update(body.password).digest(&quot;hex&quot;);
    if(body.id == 'id' &amp;amp;&amp;amp; inputpass == 'sha512 hash pw') {
        req.session.userinfo = body.id;
        req.session.isLogin = true;
        res.redirect((req.body.redir ? req.body.redir : '/'));
    }else{
        res.render('login', {wrong: true, login: req.session.isLogin, redir: (req.query.redir ? req.query.redir : '')});
    }
});

module.exports = router;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLrh6f/btq1E9hjMeJ/6IFAF1qGqqMAA1tijv6URK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLrh6f/btq1E9hjMeJ/6IFAF1qGqqMAA1tijv6URK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLrh6f/btq1E9hjMeJ/6IFAF1qGqqMAA1tijv6URK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLrh6f%2Fbtq1E9hjMeJ%2F6IFAF1qGqqMAA1tijv6URK%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;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 로그인을 하면 redir에 들어간 주소로 정상적으로 이동이 된다 :)&lt;/p&gt;</description>
      <category>코딩 스래기</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/15</guid>
      <comments>https://bass9030.tistory.com/15#entry15comment</comments>
      <pubDate>Thu, 1 Apr 2021 21:37:39 +0900</pubDate>
    </item>
    <item>
      <title>#4 - 진짜 끝..?</title>
      <link>https://bass9030.tistory.com/13</link>
      <description>&lt;p&gt;등교개학 시작한 베스다.&amp;nbsp;&lt;s&gt;야발&lt;/s&gt;&lt;/p&gt;
&lt;p&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&gt;&lt;a href=&quot;https://bass9030.tistory.com/10&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020/10/21 - [뻘짓 프로젝트/휴대폰에서 리눅스 서버 돌리기] - #1 - 시작부터 문제가 생겼..&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bass9030.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020/10/22 - [뻘짓 프로젝트/휴대폰에서 리눅스 서버 돌리기] - #2 - 어차피 게임 섭은...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bass9030.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020/10/25 - [뻘짓 프로젝트/휴대폰에서 리눅스 서버 돌리기] - #3 - 끝..?&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbel91/btqLW8khf19/vLfB428eLrTPzNgur5aVHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbel91/btqLW8khf19/vLfB428eLrTPzNgur5aVHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbel91/btqLW8khf19/vLfB428eLrTPzNgur5aVHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbel91%2FbtqLW8khf19%2FvLfB428eLrTPzNgur5aVHk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;전글에서 만들었던 마크 서버는 잘 돌아가고 있다.&lt;/p&gt;
&lt;p&gt;램은 1기가로 늘렸는데 총 램 사용량이 60%대에서 80%대까지 올라간것 빼곤 딱히 없다.&lt;/p&gt;
&lt;p&gt;아무튼 이제 개판난 linux deploy를 다시 설정해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRECjD/btqLTxylYoh/rLb2zqKFxGiiENkoJmEFkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRECjD/btqLTxylYoh/rLb2zqKFxGiiENkoJmEFkk/img.png&quot; data-alt=&quot;밑에 &amp;amp;quot;지금 무료: Lavers of Fear 2&amp;amp;quot; 겁나 거슬리네&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRECjD/btqLTxylYoh/rLb2zqKFxGiiENkoJmEFkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRECjD%2FbtqLTxylYoh%2FrLb2zqKFxGiiENkoJmEFkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;밑에 &quot;지금 무료: Lavers of Fear 2&quot; 겁나 거슬리네&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 설정을 시작해보자.&lt;/p&gt;
&lt;p&gt;일단 ENV환경부터 업데이트 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK9yip/btqLW7MqPnp/xrQ6WrRvrtsGIkoXqgh1r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK9yip/btqLW7MqPnp/xrQ6WrRvrtsGIkoXqgh1r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK9yip/btqLW7MqPnp/xrQ6WrRvrtsGIkoXqgh1r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK9yip%2FbtqLW7MqPnp%2FxrQ6WrRvrtsGIkoXqgh1r0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bodlFr/btqLW9jcCLP/VPM0pbx5v04ipjcRd3FzA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bodlFr/btqLW9jcCLP/VPM0pbx5v04ipjcRd3FzA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bodlFr/btqLW9jcCLP/VPM0pbx5v04ipjcRd3FzA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbodlFr%2FbtqLW9jcCLP%2FVPM0pbx5v04ipjcRd3FzA0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;업데이트가 완료되었으니 설치방법을 건들자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj64xJ/btqLWHNX1t3/RYKylduHAHZ4jWheFNvkNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj64xJ/btqLWHNX1t3/RYKylduHAHZ4jWheFNvkNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj64xJ/btqLWHNX1t3/RYKylduHAHZ4jWheFNvkNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj64xJ%2FbtqLWHNX1t3%2FRYKylduHAHZ4jWheFNvkNk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설치 경로를 SD카드로 바꾸고..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHrpZt/btqLOOnL0e9/KcLTL9FuPBa2tdkLq4Lo90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHrpZt/btqLOOnL0e9/KcLTL9FuPBa2tdkLq4Lo90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHrpZt/btqLOOnL0e9/KcLTL9FuPBa2tdkLq4Lo90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHrpZt%2FbtqLOOnL0e9%2FKcLTL9FuPBa2tdkLq4Lo90%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;사용자 이름은 root(root로 안하면 관리자 권한이 필요한 작업을 sudo를 붙여도 안되는 이슈가 있음),&lt;/p&gt;
&lt;p&gt;사용자 패스워드는 자신이 원하는것으로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBgXCO/btqLW85Fg2T/suTp9v6xqBZ5sPpOQi3d6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBgXCO/btqLW85Fg2T/suTp9v6xqBZ5sPpOQi3d6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBgXCO/btqLW85Fg2T/suTp9v6xqBZ5sPpOQi3d6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBgXCO%2FbtqLW85Fg2T%2FsuTp9v6xqBZ5sPpOQi3d6K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;마운트는 외장 sd카드와 내장 메모리로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVfn6H/btqLWIMVg6q/9V3wMMB0sRHOtKWdPGzh71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVfn6H/btqLWIMVg6q/9V3wMMB0sRHOtKWdPGzh71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVfn6H/btqLWIMVg6q/9V3wMMB0sRHOtKWdPGzh71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVfn6H%2FbtqLWIMVg6q%2F9V3wMMB0sRHOtKWdPGzh71%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ssh는 당근 활성화 해주면 설정은 얼추 끝난다.&lt;/p&gt;
&lt;p&gt;(원하는 분들은 GUI 환경을 활성화해서 vnc에 접속할수도 있는데, 전 귀찮으니 패스하겠습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdxYgg/btqLW9pW16I/xcGKkX07uik9q7DRd125A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdxYgg/btqLW9pW16I/xcGKkX07uik9q7DRd125A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdxYgg/btqLW9pW16I/xcGKkX07uik9q7DRd125A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdxYgg%2FbtqLW9pW16I%2FxcGKkX07uik9q7DRd125A1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 설치를 진행해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;882&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekEoBp/btqLRVft053/1xX6e1Bn7cX8COchvDkIuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekEoBp/btqLRVft053/1xX6e1Bn7cX8COchvDkIuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekEoBp/btqLRVft053/1xX6e1Bn7cX8COchvDkIuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekEoBp%2FbtqLRVft053%2F1xX6e1Bn7cX8COchvDkIuk%2Fimg.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;882&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ㅓ라라..?&lt;/p&gt;
&lt;p&gt;이런경우는 대부분 이미지 크기 문제이므로 이미지 크기를 2000MB(2GB)로 수정후 계속해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;882&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4Rjrb/btqLTw7gGJh/WYyBRVL2IDjNtgqAxCK22k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4Rjrb/btqLTw7gGJh/WYyBRVL2IDjNtgqAxCK22k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4Rjrb/btqLTw7gGJh/WYyBRVL2IDjNtgqAxCK22k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4Rjrb%2FbtqLTw7gGJh%2FWYyBRVL2IDjNtgqAxCK22k%2Fimg.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;882&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다행히 잘 돌아간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;882&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5nAOB/btqLRV7ANrj/4ND8H4C0fNIVrNbCmznlLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5nAOB/btqLRV7ANrj/4ND8H4C0fNIVrNbCmznlLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5nAOB/btqLRV7ANrj/4ND8H4C0fNIVrNbCmznlLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5nAOB%2FbtqLRV7ANrj%2F4ND8H4C0fNIVrNbCmznlLK%2Fimg.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;882&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설치가 완료됐다.&lt;/p&gt;
&lt;p&gt;이제 ssh 연결해서 마저 설정하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C90ME/btqLQbXpV8S/ExSs6LYeKrNg0aCofbLRA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C90ME/btqLQbXpV8S/ExSs6LYeKrNg0aCofbLRA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C90ME/btqLQbXpV8S/ExSs6LYeKrNg0aCofbLRA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC90ME%2FbtqLQbXpV8S%2FExSs6LYeKrNg0aCofbLRA0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;잘 마운트 됐고 잘 켜졌다.&lt;/p&gt;
&lt;p&gt;이제 ssh 연결만 하고 아파치 깔고 설정할꺼 하면 끝난다 히히&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUloh/btqLW7sc59Y/KQrWpkFP6s1FVKAFBfQSQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUloh/btqLW7sc59Y/KQrWpkFP6s1FVKAFBfQSQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUloh/btqLW7sc59Y/KQrWpkFP6s1FVKAFBfQSQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUloh%2FbtqLW7sc59Y%2FKQrWpkFP6s1FVKAFBfQSQ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;git bash 그리웠다.. 그동안 teamviewer로만 작업해서 답답했는데, 이제 좀 편안하다.&lt;/p&gt;
&lt;p&gt;이제 apache2와 빔&lt;s&gt;(액션 비이임)&lt;/s&gt;을 깔아준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llrvH/btqLTx6dCXV/GoGiB3jtBQUpSsq3JfldFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llrvH/btqLTx6dCXV/GoGiB3jtBQUpSsq3JfldFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llrvH/btqLTx6dCXV/GoGiB3jtBQUpSsq3JfldFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllrvH%2FbtqLTx6dCXV%2FGoGiB3jtBQUpSsq3JfldFK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설치가 다됐으면 윈도우 환경에 백업해논 파일들을 넣어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI7lN8/btqLRj1YoaS/wkNImPaUHLqujN8G5iCGL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI7lN8/btqLRj1YoaS/wkNImPaUHLqujN8G5iCGL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI7lN8/btqLRj1YoaS/wkNImPaUHLqujN8G5iCGL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI7lN8%2FbtqLRj1YoaS%2FwkNImPaUHLqujN8G5iCGL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그리고 이제 한가지 설정을 해주면 되는데, 문제가 멍청하게 그 설정파일을 백업하지 않았다..&lt;/p&gt;
&lt;p&gt;그래서 다시 기억을 더듬어보자.&lt;/p&gt;
&lt;p&gt;아마 그 설정이 같은 호스트에서 다른 도메인으로 엑세스 하게 하는 설정인데.. 일단 검색과 기억으로 잘 설정을 완료했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 이번 시리즈는 여기서 끝내도록 하겠ㄷ&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UgGuU/btqLU9RBdUW/cEa7tG5jFQPQO7FiuiReL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UgGuU/btqLU9RBdUW/cEa7tG5jFQPQO7FiuiReL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UgGuU/btqLU9RBdUW/cEa7tG5jFQPQO7FiuiReL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUgGuU%2FbtqLU9RBdUW%2FcEa7tG5jFQPQO7FiuiReL0%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;과연 인간, 여기가 상상력의 한계인가?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;댓츠노노, 그렇지 않다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>삽질기/리눅스 in 휴대폰</category>
      <author>bass9030</author>
      <guid isPermaLink="true">https://bass9030.tistory.com/13</guid>
      <comments>https://bass9030.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 27 Oct 2020 18:17:24 +0900</pubDate>
    </item>
  </channel>
</rss>