<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발하는 서버</title>
    <link>https://hmw0908.tistory.com/</link>
    <description>개발자 맞아?</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 15:38:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>싹다배워</managingEditor>
    <image>
      <title>개발하는 서버</title>
      <url>https://tistory1.daumcdn.net/tistory/4459278/attach/300eb40c711742b2af073b13e971f6c5</url>
      <link>https://hmw0908.tistory.com</link>
    </image>
    <item>
      <title>스트리밍 서비스 최적화를 위한 Chrome Extension 개발기 (StreamLite) - 2</title>
      <link>https://hmw0908.tistory.com/198</link>
      <description>&lt;p data-end=&quot;229&quot; data-start=&quot;179&quot; data-ke-size=&quot;size16&quot;&gt;이전에 제작했던 크롬 확장 프로그램이 이번 업데이트(2.1v 릴리즈)를 통해 한 단계 더 개선했다.&lt;/p&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;231&quot; data-ke-size=&quot;size16&quot;&gt;기존에는 &lt;b&gt;YouTube 시청 환경 최적화&lt;/b&gt;에 집중했다면, 이제는 &lt;b&gt;Netflix까지 지원 범위를 확장&lt;/b&gt;하여 보다 몰입감 있는 콘텐츠 시청 환경을 제공한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;327&quot; data-start=&quot;231&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 업데이트 내용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Netflix 최적화 기능 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;410&quot; data-start=&quot;379&quot; data-ke-size=&quot;size16&quot;&gt;이번 업데이트의 핵심은 바로 &lt;b&gt;넷플릭스 지원&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;440&quot; data-start=&quot;412&quot; 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;net.jpg&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJfMY/dJMb99TpiO6/LIBofKB15ERnRwRZrd3A7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJfMY/dJMb99TpiO6/LIBofKB15ERnRwRZrd3A7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJfMY/dJMb99TpiO6/LIBofKB15ERnRwRZrd3A7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJfMY%2FdJMb99TpiO6%2FLIBofKB15ERnRwRZrd3A7k%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;313&quot; height=&quot;488&quot; data-filename=&quot;net.jpg&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;483&quot; data-start=&quot;442&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;460&quot; data-start=&quot;442&quot;&gt;메인 화면 광고 요소 제거&lt;/li&gt;
&lt;li data-end=&quot;483&quot; data-start=&quot;461&quot;&gt;자동 재생되는 미리보기 영상 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;562&quot; data-start=&quot;485&quot; data-ke-size=&quot;size16&quot;&gt;넷플릭스를 이용하다 보면 의도하지 않은 미리보기 영상이 자동으로 재생되거나 불필요한 UI 요소로 인해 집중이 깨지는 경우가 있는데, 이번 기능을 통해 훨씬 &lt;b&gt;깔끔하고 집중도 높은 시청 환경&lt;/b&gt;을 경험할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;562&quot; data-start=&quot;485&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 성능 개선 및 안정화 작업&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;714&quot; data-start=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;기존에 적용되어 있던 YouTube 관련 기능들도 그대로 유지되며, 내부적으로 성능 개선(리팩토링)이 함께 진행됐다.&lt;/p&gt;
&lt;p data-end=&quot;777&quot; data-start=&quot;745&quot; data-ke-size=&quot;size16&quot;&gt;지속적인 테스트를 통해 코드 전반을 점검하고 개선했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;849&quot; data-start=&quot;779&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;796&quot; data-start=&quot;779&quot;&gt;소스 코드 리팩토링 진행&lt;/li&gt;
&lt;li data-end=&quot;809&quot; data-start=&quot;797&quot;&gt;일부 버그 수정&lt;/li&gt;
&lt;li data-end=&quot;831&quot; data-start=&quot;810&quot;&gt;확장 프로그램 동작 안정성 향상&lt;/li&gt;
&lt;li data-end=&quot;849&quot; data-start=&quot;832&quot;&gt;전반적인 퍼포먼스 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;903&quot; data-start=&quot;851&quot; 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;style6&quot; /&gt;
&lt;h3 data-end=&quot;562&quot; data-start=&quot;485&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1011&quot; data-start=&quot;921&quot; data-ke-size=&quot;size16&quot;&gt;이번 업데이트를 통해 단순한 유튜브 최적화 도구를 넘어&lt;br /&gt;&lt;b&gt;멀티 플랫폼(YouTube + Netflix) 시청 최적화 확장 프로그램&lt;/b&gt;으로 발전한 느낌이다.&lt;/p&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1013&quot; data-ke-size=&quot;size16&quot;&gt;앞으로도 추가적인 기능 개선과 다양한 플랫폼 지원을 계속 확장해 나갈 예정이다.&lt;/p&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1013&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1013&quot; data-ke-size=&quot;size16&quot;&gt;chrome 웹 스토어에 올려둔 확장 프로그램은 아래 링크를 통해 다운로드 가능합니다!&lt;/p&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1013&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775106087898&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;StreamLite - Chrome 웹 스토어&quot; data-og-description=&quot;유튜브와 넷플릭스 성능 최적화 확장 프로그램&quot; data-og-host=&quot;chromewebstore.google.com&quot; data-og-source-url=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot; data-og-url=&quot;https://chromewebstore.google.com/detail/streamlite/kckfmemgmphngdofnnkaiikhbmgjdmci&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JtWra/dJMb86nXTfm/srztWZCOkvZCIOBc13aDz1/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JtWra/dJMb86nXTfm/srztWZCOkvZCIOBc13aDz1/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&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;StreamLite - Chrome 웹 스토어&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;chromewebstore.google.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>SideProject</category>
      <category>ChromeExtension</category>
      <category>Netflix최적화</category>
      <category>개발일지</category>
      <category>넷플릭스광고제거</category>
      <category>웹개발</category>
      <category>유튜브광고제거</category>
      <category>유튜브최적화</category>
      <category>크롬확장</category>
      <category>크롬확장프로그램</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/198</guid>
      <comments>https://hmw0908.tistory.com/198#entry198comment</comments>
      <pubDate>Thu, 2 Apr 2026 19:02:19 +0900</pubDate>
    </item>
    <item>
      <title>Gmail POP3 종료 (IMAP 전환 배경 정리)</title>
      <link>https://hmw0908.tistory.com/197</link>
      <description>&lt;h2 data-end=&quot;177&quot; data-start=&quot;150&quot; data-section-id=&quot;43a2oh&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Gmail 외부 메일 통합 기능 종료&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;241&quot; data-start=&quot;179&quot; data-ke-size=&quot;size16&quot;&gt;최근 &lt;span&gt;&lt;span&gt;Gmail&lt;/span&gt;&lt;/span&gt;에서 중요한 정책 변경이 발표되었다.&lt;/p&gt;
&lt;p data-end=&quot;271&quot; data-start=&quot;243&quot; data-ke-size=&quot;size16&quot;&gt;기존에 제공하던 다음 기능들이 단계적으로 종료된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;329&quot; data-start=&quot;273&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;298&quot; data-start=&quot;273&quot; data-section-id=&quot;5p08xl&quot;&gt;POP3 기반 &amp;lsquo;다른 계정에서 메일 확인&amp;rsquo;&lt;/li&gt;
&lt;li data-end=&quot;329&quot; data-start=&quot;299&quot; data-section-id=&quot;12ljr7n&quot;&gt;Gmailify (외부 메일을 Gmail처럼 관리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;336&quot; data-start=&quot;331&quot; data-ke-size=&quot;size16&quot;&gt;일정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;385&quot; data-start=&quot;337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;364&quot; data-start=&quot;337&quot; data-section-id=&quot;7j6qzh&quot;&gt;신규 사용자: 2026년 1분기부터 사용불가&lt;/li&gt;
&lt;li data-end=&quot;385&quot; data-start=&quot;365&quot; data-section-id=&quot;etma8c&quot;&gt;기존 사용자: 2026년 말에 기능이 중단될 때까지 계속 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;387&quot; 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;style6&quot; /&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;475&quot; data-start=&quot;452&quot; data-section-id=&quot;kfcgdv&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기존 POP3 역할&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;516&quot; data-start=&quot;477&quot; data-ke-size=&quot;size16&quot;&gt;많은 사용자들이 Gmail 하나로 다음과 같은 메일을 통합 관리해왔다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;549&quot; data-start=&quot;518&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;526&quot; data-start=&quot;518&quot; data-section-id=&quot;14sw1kk&quot;&gt;네이버 메일&lt;/li&gt;
&lt;li data-end=&quot;534&quot; data-start=&quot;527&quot; data-section-id=&quot;1yjj88w&quot;&gt;회사 메일&lt;/li&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;535&quot; data-section-id=&quot;n98gi5&quot;&gt;기타 외부 이메일 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;581&quot; data-start=&quot;551&quot; data-ke-size=&quot;size16&quot;&gt;이 기능은 내부적으로 &lt;b&gt;POP3 방식&lt;/b&gt;을 사용했다.&lt;/p&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Gmail이 외부 메일 서버에 접속해서 메일을 &amp;ldquo;가져오는(pull)&amp;rdquo; 구조였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;635&quot; data-start=&quot;583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;662&quot; data-start=&quot;642&quot; data-section-id=&quot;bj411b&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;왜 POP3만 사라지는가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;711&quot; data-start=&quot;664&quot; data-ke-size=&quot;size16&quot;&gt;이건 단순 기능 제거가 아니라 &lt;b&gt;메일 사용 패러다임 변화&lt;/b&gt;라고 보여진다.&lt;/p&gt;
&lt;p data-end=&quot;711&quot; data-start=&quot;664&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;746&quot; data-start=&quot;718&quot; data-section-id=&quot;l37iyj&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 멀티 디바이스 시대와 맞지 않는 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;760&quot; data-start=&quot;748&quot; data-ke-size=&quot;size16&quot;&gt;POP3는 기본적으로:&lt;/p&gt;
&lt;blockquote data-end=&quot;782&quot; data-start=&quot;761&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;763&quot; data-ke-size=&quot;size16&quot;&gt;메일을 내 기기로 다운로드하는 방식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;800&quot; data-start=&quot;784&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;800&quot; data-start=&quot;784&quot; data-ke-size=&quot;size16&quot;&gt;그래서 이런 문제가 발생한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;862&quot; data-start=&quot;802&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;827&quot; data-start=&quot;802&quot; data-section-id=&quot;n19gjo&quot;&gt;PC에서 읽은 메일 &amp;rarr; 모바일에서 안 보임&lt;/li&gt;
&lt;li data-end=&quot;843&quot; data-start=&quot;828&quot; data-section-id=&quot;r4o6xm&quot;&gt;읽음/안읽음 동기화 불가&lt;/li&gt;
&lt;li data-end=&quot;862&quot; data-start=&quot;844&quot; data-section-id=&quot;18d5dli&quot;&gt;폴더 및 정리 상태 공유 안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;873&quot; data-start=&quot;864&quot; data-ke-size=&quot;size16&quot;&gt;반면 IMAP은:&lt;/p&gt;
&lt;blockquote data-end=&quot;897&quot; data-start=&quot;874&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;897&quot; data-start=&quot;876&quot; data-ke-size=&quot;size16&quot;&gt;서버에 메일을 두고 모든 기기가 동기화&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;936&quot; data-start=&quot;899&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;936&quot; data-start=&quot;899&quot; data-ke-size=&quot;size16&quot;&gt;스마트폰 + PC + 태블릿 환경에서는 IMAP이 사실상 표준인 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;936&quot; data-start=&quot;899&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;969&quot; data-start=&quot;943&quot; data-section-id=&quot;lsoao5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 클라우드 기반 메일 서비스와 충돌&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;994&quot; data-start=&quot;971&quot; data-ke-size=&quot;size16&quot;&gt;요즘 메일 서비스는 단순 수신함이 아니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1034&quot; data-start=&quot;996&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1003&quot; data-start=&quot;996&quot; data-section-id=&quot;dovn78&quot;&gt;검색 기능&lt;/li&gt;
&lt;li data-end=&quot;1012&quot; data-start=&quot;1004&quot; data-section-id=&quot;10ttzc1&quot;&gt;스팸 필터링&lt;/li&gt;
&lt;li data-end=&quot;1020&quot; data-start=&quot;1013&quot; data-section-id=&quot;1hmiil&quot;&gt;자동 분류&lt;/li&gt;
&lt;li data-end=&quot;1034&quot; data-start=&quot;1021&quot; data-section-id=&quot;lyij3t&quot;&gt;AI 기반 메일 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1065&quot; data-start=&quot;1036&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 기능은 &lt;b&gt;서버 중심 구조&lt;/b&gt;에서 동작한다.&lt;/p&gt;
&lt;p data-end=&quot;1114&quot; data-start=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;하지만 POP3는 메일을 가져가버리기 때문에 서버 기능 활용이 제한된다..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;1114&quot; data-start=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1139&quot; data-start=&quot;1121&quot; data-section-id=&quot;1ylhq8b&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 보안 및 인증 문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1158&quot; data-start=&quot;1141&quot; data-ke-size=&quot;size16&quot;&gt;POP3는 오래된 프로토콜이라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1228&quot; data-start=&quot;1160&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1184&quot; data-start=&quot;1160&quot; data-section-id=&quot;18zu8jt&quot;&gt;최신 인증(OAuth 등)과 호환성 낮음&lt;/li&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1185&quot; data-section-id=&quot;xjia2w&quot;&gt;계정 탈취 시 전체 메일 다운로드 가능&lt;/li&gt;
&lt;li data-end=&quot;1228&quot; data-start=&quot;1209&quot; data-section-id=&quot;1vj72sa&quot;&gt;접근 제어 및 로그 관리 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1258&quot; data-start=&quot;1230&quot; data-ke-size=&quot;size16&quot;&gt;반면 IMAP은 보안 정책 적용이 훨씬 유리하다.&lt;/p&gt;
&lt;p data-end=&quot;1258&quot; data-start=&quot;1230&quot; data-ke-size=&quot;size16&quot;&gt;(안전하다는 것은 아니다.. POP3에 비해서 그렇다는거지~)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;1258&quot; data-start=&quot;1230&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1283&quot; data-start=&quot;1265&quot; data-section-id=&quot;1cei5lq&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 운영 비용과 비효율&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1306&quot; data-start=&quot;1285&quot; data-ke-size=&quot;size16&quot;&gt;Gmail의 외부 메일 가져오기 기능은 주기적으로 외부 서버에 접속해서 메일을 가져오는 Polling 구조인데&lt;/p&gt;
&lt;p data-end=&quot;1306&quot; data-start=&quot;1285&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1363&quot; data-start=&quot;1357&quot; data-ke-size=&quot;size16&quot;&gt;위 방식은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1403&quot; data-start=&quot;1365&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1373&quot; data-start=&quot;1365&quot; data-section-id=&quot;12m4zr0&quot;&gt;트래픽 낭비&lt;/li&gt;
&lt;li data-end=&quot;1381&quot; data-start=&quot;1374&quot; data-section-id=&quot;1sb4em1&quot;&gt;지연 발생&lt;/li&gt;
&lt;li data-end=&quot;1392&quot; data-start=&quot;1382&quot; data-section-id=&quot;1nl0uyb&quot;&gt;실패/중복 이슈&lt;/li&gt;
&lt;li data-end=&quot;1403&quot; data-start=&quot;1393&quot; data-section-id=&quot;ts75wt&quot;&gt;운영 비용 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1446&quot; data-start=&quot;1405&quot; 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;style6&quot; /&gt;
&lt;p data-end=&quot;1446&quot; data-start=&quot;1405&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1481&quot; data-start=&quot;1453&quot; data-section-id=&quot;lzvxvm&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;그래서 IMAP + 전달 방식으로 바뀐다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1508&quot; data-start=&quot;1483&quot; data-ke-size=&quot;size16&quot;&gt;Gmail이 제시하는 대안은 크게 두 가지다.&lt;/p&gt;
&lt;h3 data-end=&quot;1537&quot; data-start=&quot;1510&quot; data-section-id=&quot;k2r6oo&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 메일 전달(Forwarding)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1576&quot; data-start=&quot;1538&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1560&quot; data-start=&quot;1538&quot; data-section-id=&quot;1h5t82h&quot;&gt;외부 메일 &amp;rarr; Gmail로 자동 전달&lt;/li&gt;
&lt;li data-end=&quot;1576&quot; data-start=&quot;1561&quot; data-section-id=&quot;rd1nor&quot;&gt;Push 방식이라 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1607&quot; data-start=&quot;1578&quot; data-section-id=&quot;d1v4tp&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. IMAP 기반 메일 클라이언트 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1652&quot; data-start=&quot;1608&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1632&quot; data-start=&quot;1608&quot; data-section-id=&quot;1sxffhx&quot;&gt;Outlook, Thunderbird 등&lt;/li&gt;
&lt;li data-end=&quot;1652&quot; data-start=&quot;1633&quot; data-section-id=&quot;1ry5bbk&quot;&gt;여러 계정을 한 번에 관리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1673&quot; data-start=&quot;1659&quot; data-section-id=&quot;26pn4w&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;핵심 변화 정리&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1821&quot; data-start=&quot;1675&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;POP3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;IMAP&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1741&quot; data-start=&quot;1719&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1724&quot; data-start=&quot;1719&quot;&gt;방식&lt;/td&gt;
&lt;td data-end=&quot;1731&quot; data-start=&quot;1724&quot; data-col-size=&quot;sm&quot;&gt;다운로드&lt;/td&gt;
&lt;td data-end=&quot;1741&quot; data-start=&quot;1731&quot; data-col-size=&quot;sm&quot;&gt;서버 동기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1759&quot; data-start=&quot;1742&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1750&quot; data-start=&quot;1742&quot;&gt;기기 연동&lt;/td&gt;
&lt;td data-end=&quot;1754&quot; data-start=&quot;1750&quot; data-col-size=&quot;sm&quot;&gt;X&lt;/td&gt;
&lt;td data-end=&quot;1759&quot; data-start=&quot;1754&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1776&quot; data-start=&quot;1760&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1765&quot; data-start=&quot;1760&quot;&gt;보안&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1770&quot; data-start=&quot;1765&quot;&gt;낮음&lt;/td&gt;
&lt;td data-end=&quot;1776&quot; data-start=&quot;1770&quot; data-col-size=&quot;sm&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1801&quot; data-start=&quot;1777&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1787&quot; data-start=&quot;1777&quot;&gt;클라우드 기능&lt;/td&gt;
&lt;td data-end=&quot;1792&quot; data-start=&quot;1787&quot; data-col-size=&quot;sm&quot;&gt;제한&lt;/td&gt;
&lt;td data-end=&quot;1801&quot; data-start=&quot;1792&quot; data-col-size=&quot;sm&quot;&gt;완전 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1821&quot; data-start=&quot;1802&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1810&quot; data-start=&quot;1802&quot;&gt;운영 효율&lt;/td&gt;
&lt;td data-end=&quot;1815&quot; data-start=&quot;1810&quot; data-col-size=&quot;sm&quot;&gt;낮음&lt;/td&gt;
&lt;td data-end=&quot;1821&quot; data-start=&quot;1815&quot; data-col-size=&quot;sm&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1870&quot; data-start=&quot;1823&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;b&gt;메일을 가져오는 시대 &amp;rarr; 메일을 공유하는 시대로 변화&lt;/b&gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1895&quot; data-start=&quot;1877&quot; data-section-id=&quot;1rdwzw5&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실무 관점에서 느낀 점&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1945&quot; data-start=&quot;1897&quot; data-ke-size=&quot;size16&quot;&gt;이번 정책 변경은 단순 기능 종료가 아니라 &lt;b&gt;업무 방식 자체를 바꾸는 변화&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;1959&quot; data-start=&quot;1947&quot; data-ke-size=&quot;size16&quot;&gt;특히 기업 환경에서는 하나의 Gmail로 여러 메일을 관리하던 사용자,&amp;nbsp;외부 메일을 Gmail에 의존하던 조직과 같은 경우 반드시 대응이 필요하다.&lt;/p&gt;
&lt;p data-end=&quot;1959&quot; data-start=&quot;1947&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1959&quot; data-start=&quot;1947&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2056&quot; data-start=&quot;2038&quot; data-section-id=&quot;2egttw&quot; data-ke-size=&quot;size23&quot;&gt;예상되는 사용자 반응&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2115&quot; data-start=&quot;2058&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2074&quot; data-start=&quot;2058&quot; data-section-id=&quot;y6ehpj&quot;&gt;왜 갑자기 안 되나요. 이거 원래 잘 쓰던 기능인데. 왜 기술이 발전하는데 더 불편해지지?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2117&quot; 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-end=&quot;2157&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;challenge&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/001.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/001.png&quot; width=&quot;150&quot; /&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;</description>
      <category>요고조고이고/IT</category>
      <category>Gmail</category>
      <category>imap</category>
      <category>mail</category>
      <category>pop3</category>
      <category>메일</category>
      <category>메일끌고오기</category>
      <category>메일연동</category>
      <category>외부메일연동</category>
      <category>지메일</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/197</guid>
      <comments>https://hmw0908.tistory.com/197#entry197comment</comments>
      <pubDate>Thu, 19 Mar 2026 22:00:10 +0900</pubDate>
    </item>
    <item>
      <title>스트리밍 서비스 최적화를 위한 Chrome Extension 개발기 (StreamLite) - 1</title>
      <link>https://hmw0908.tistory.com/196</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775106689061&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;StreamLite - Chrome 웹 스토어&quot; data-og-description=&quot;유튜브와 넷플릭스 성능 최적화 확장 프로그램&quot; data-og-host=&quot;chromewebstore.google.com&quot; data-og-source-url=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot; data-og-url=&quot;https://chromewebstore.google.com/detail/streamlite/kckfmemgmphngdofnnkaiikhbmgjdmci&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JtWra/dJMb86nXTfm/srztWZCOkvZCIOBc13aDz1/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chromewebstore.google.com/detail/kckfmemgmphngdofnnkaiikhbmgjdmci?utm_source=item-share-cb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JtWra/dJMb86nXTfm/srztWZCOkvZCIOBc13aDz1/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&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;StreamLite - Chrome 웹 스토어&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;chromewebstore.google.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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YouTube는 다양한 추천 영상, 댓글, Shorts, 라이브 채팅 등 많은 UI 요소를 제공하지만 사용 목적에 따라서는 이러한 요소들이 오히려 &lt;b&gt;집중도를 떨어뜨리고 페이지 성능에도 영향을 줄 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이번 프로젝트에서는 &lt;b&gt;YouTube 페이지를 단순화하고 성능을 개선하는 Chrome 확장 프로그램&lt;/b&gt;&amp;nbsp;&lt;b&gt;StreamLite&lt;/b&gt;를 개발하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;StreamLite_main.png&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH4LS4/dJMcaibuGLk/17JBYyNbeakhtA8zK2TSF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH4LS4/dJMcaibuGLk/17JBYyNbeakhtA8zK2TSF1/img.png&quot; data-alt=&quot;메인화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH4LS4/dJMcaibuGLk/17JBYyNbeakhtA8zK2TSF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH4LS4%2FdJMcaibuGLk%2F17JBYyNbeakhtA8zK2TSF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;551&quot; data-filename=&quot;StreamLite_main.png&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메인화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로젝트 목표&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 확장 프로그램의 최초 목표는 크게 두 가지였다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;YouTube 페이지에서 불필요한 요소 제거&lt;/li&gt;
&lt;li&gt;페이지 성능 변화를 사용자에게 시각적으로 제공&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 단순한 UI 제거 확장이 아니라 &lt;b&gt;성능 개선 효과까지 확인할 수 있는 확장 프로그램&lt;/b&gt;을 목표로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 왜 YoutubeLite가 아니라 StreamLite냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 목표는 Youtube에 대한 개선이고 추후 릴리즈를 통해 Netflix, Disneyplus, Twitch 등 스트리밍 플랫폼에 대한 성능 개선까지 확장할 예정으로 명칭을 지었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ YouTube UI 최적화&lt;/h2&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;310&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pF8Jr/dJMcafTmsAF/cga8OOCt4px354UlncgWP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pF8Jr/dJMcafTmsAF/cga8OOCt4px354UlncgWP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pF8Jr/dJMcafTmsAF/cga8OOCt4px354UlncgWP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpF8Jr%2FdJMcafTmsAF%2Fcga8OOCt4px354UlncgWP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;310&quot; height=&quot;257&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 선택적으로 다음 요소들을 제거할 수 있도록 구현하였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추천 영상&lt;/li&gt;
&lt;li&gt;댓글&lt;/li&gt;
&lt;li&gt;Shorts&lt;/li&gt;
&lt;li&gt;라이브 채팅&lt;/li&gt;
&lt;/ul&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ Performance Monitor&lt;/h2&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;309&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA1Ujc/dJMcaakdgPL/KlDYvGavSmxekn2flR6X1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA1Ujc/dJMcaakdgPL/KlDYvGavSmxekn2flR6X1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA1Ujc/dJMcaakdgPL/KlDYvGavSmxekn2flR6X1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA1Ujc%2FdJMcaakdgPL%2FKlDYvGavSmxekn2flR6X1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;155&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 성능 변화를 확인할 수 있도록 &lt;b&gt;성능 모니터링 기능을 추가하였다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수집 데이터&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Memory Usage&lt;/li&gt;
&lt;li&gt;CPU Usage&lt;/li&gt;
&lt;li&gt;DOM Nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 데이터를 기반으로 &lt;b&gt;실시간 그래프를 표시&lt;/b&gt;한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ Performance Score&lt;/h2&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;309&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjY94r/dJMcad2fyVW/TcOUNt1oY0oLmSUkMCKV61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjY94r/dJMcad2fyVW/TcOUNt1oY0oLmSUkMCKV61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjY94r/dJMcad2fyVW/TcOUNt1oY0oLmSUkMCKV61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjY94r%2FdJMcad2fyVW%2FTcOUNt1oY0oLmSUkMCKV61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;168&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 수치 대신 &lt;b&gt;직관적인 성능 점수&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;Score 계산 기준&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Memory 40%
CPU 40%
DOM Nodes 20%
&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;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;80 ~ 100  Good
40 ~ 79   Normal
0 ~ 39    Heavy
&lt;/code&gt;&lt;/pre&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ Optimization Impact 분석&lt;/h2&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;309&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VvYu7/dJMcafMCaTn/cAvh7tj1Rk36ZsRTXseMtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VvYu7/dJMcafMCaTn/cAvh7tj1Rk36ZsRTXseMtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VvYu7/dJMcafMCaTn/cAvh7tj1Rk36ZsRTXseMtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVvYu7%2FdJMcafMCaTn%2FcAvh7tj1Rk36ZsRTXseMtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;118&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적화 기능 적용 전후의 성능 변화를 분석하여 &lt;b&gt;성능 개선 효과를 사용자에게 보여준다.&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;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Performance Improvement

Page Elements Reduced   &amp;darr; 32%
Memory Usage Reduced    &amp;darr; 18%
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ YouTube 페이지 자동 감지&lt;/h2&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;317&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGYRRT/dJMcadOH4Vr/UTUlHJVaLaJ3reH9uK8bkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGYRRT/dJMcadOH4Vr/UTUlHJVaLaJ3reH9uK8bkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGYRRT/dJMcadOH4Vr/UTUlHJVaLaJ3reH9uK8bkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGYRRT%2FdJMcadOH4Vr%2FUTUlHJVaLaJ3reH9uK8bkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;100&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;100&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;확장 프로그램은 현재 페이지가 YouTube인지 자동으로 감지한다.&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;UI 표시&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;  YouTube ✅
⚪ YouTube ❌&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;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;  Optimization ✅
⚪ Optimization ❌&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;b&gt;다국어 지원&lt;/b&gt;&lt;/h1&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;지원 언어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한국어&lt;/li&gt;
&lt;li&gt;English&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chrome Extension의 _locales 구조를 사용하여 구현하였다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;_locales
 ├ ko
 │   └ messages.json
 └ en
     └ messages.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;UI/UX 개선&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 버전에서는 단순한 설정 UI였지만 Chrome Web Store 수준의 UX를 목표로 다음 요소들을 추가하였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;카드 기반 UI&lt;/li&gt;
&lt;li&gt;토글 스위치&lt;/li&gt;
&lt;li&gt;실시간 성능 그래프&lt;/li&gt;
&lt;li&gt;성능 점수 표시&lt;/li&gt;
&lt;li&gt;상태 표시 패널&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;기술 스택&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서 사용한 기술&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Chrome Extension (Manifest V3)
JavaScript
Chart.js
HTML / CSS
Chrome Storage API
Chrome Tabs API
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;h1&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트를 통해&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chrome Extension 구조 이해&lt;/li&gt;
&lt;li&gt;브라우저 API 활용&lt;/li&gt;
&lt;li&gt;사용자 경험(UI/UX) 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등 다양한 경험을 할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StreamLite는 단순한 기능 구현을 넘어 &lt;b&gt;사용자가 성능 변화를 직접 확인할 수 있는 확장 프로그램&lt;/b&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;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;challenge&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/006.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/006.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>SideProject</category>
      <category>chrome</category>
      <category>ChromeExtension</category>
      <category>extension</category>
      <category>SideProject</category>
      <category>크롬</category>
      <category>크롬확장프로그램</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/196</guid>
      <comments>https://hmw0908.tistory.com/196#entry196comment</comments>
      <pubDate>Thu, 12 Mar 2026 21:39:14 +0900</pubDate>
    </item>
    <item>
      <title>SVN 저장소를 Git으로 백업 및 이관하기 (SVN &amp;rarr; Git Migration)</title>
      <link>https://hmw0908.tistory.com/195</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사내 프로젝트는 오래전부터 &lt;b&gt;SVN(Subversion)&lt;/b&gt; 으로 소스코드를 관리하고 있었다.&lt;br /&gt;하지만 대부분의 개발 조직이 &lt;b&gt;Git 기반 협업 환경(GitHub / GitLab 등)&lt;/b&gt; 을 사용하고 있기 때문에, 기존 SVN 저장소를 &lt;b&gt;사내 Git 서버로 백업 및 이관&lt;/b&gt;하는 작업을 진행하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 실제 프로젝트를 이관하면서 진행했던 과정과 그 과정에서 겪었던 &lt;b&gt;트러블슈팅&lt;/b&gt;까지 함께 정리해보려고 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;1. 목표&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 작업의 목적은 단순히 소스를 옮기는 것이 아니라 아래와 같은 조건을 만족해야 했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 &lt;b&gt;SVN 저장소는 그대로 유지&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git으로 전체 소스 백업&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SVN Commit History 유지&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;사내 &lt;b&gt;GitHub 서버(Gitea)로 Push&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 구조는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;SVN (기존 운영)
        &amp;darr;
Git 로컬 변환
        &amp;darr;
사내 GitHub 백업
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;2. 준비 환경&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4419%; text-align: center;&quot;&gt;&lt;b&gt;OS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4419%; text-align: center;&quot;&gt;&lt;b&gt;Tool&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4419%; text-align: center;&quot;&gt;&lt;b&gt;작업 경로&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;D:\svn_migration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4419%; text-align: center;&quot;&gt;&lt;b&gt;SVN 저장소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;https://test.com/project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4419%; text-align: center;&quot;&gt;&lt;b&gt;Git 서버&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;사내 GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Git에 SVN 명령어가 포함되어 있는지 확인한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git svn --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;3. SVN 구조 확인&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SVN &amp;rarr; Git에서 &lt;b&gt;가장 중요한 단계&lt;/b&gt;는 바로 &lt;b&gt;SVN 저장소 구조 확인&lt;/b&gt;이다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;svn list https://test.com/project&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;실행 결과(EX)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;WebContent/
classes/
doc/&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;즉 SVN 구조가 다음과 같이 되어 있었다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;SVN
 └ project
     ├ WebContent
     ├ classes
     └ doc&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;SVN 표준 구조(trunk / branches / tags)가 아니라는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조가 없기 때문에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;git svn clone&lt;/span&gt; 명령어를 사용할 때 옵션을 다르게 줘야 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;4. SVN &amp;rarr; Git 변환&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 폴더 생성&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;D:\svn_migration
&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;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git svn clone https://test.com/project --trunk=. project&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;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;git svn clone&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SVN 저장소를 Git으로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;--trunk=.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;현재 루트를 trunk로 인식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;homepage&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;로컬 폴더&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하면 다음과 같이 SVN revision이 Git commit으로 변환된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;r1 = a3f4e13213
r2 = b4c5d61241
r3 = 7a812442c0
...&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;5. 변환 완료 확인&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변환이 완료되면 Git 로그를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cd project
git log&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;SVN commit history가 Git commit으로 변환&lt;/b&gt;된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;commit a12345
Author: kim
게시판 수정

commit b23456
Author: lee
로그인 기능 추가
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;6. Git 서버 연결&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub에 Repository를 생성한 뒤 remote를 연결한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git remote add origin http://ip:port/github/project.git&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;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;7&lt;/b&gt;&lt;b&gt;. GitHub Push&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 브랜치 설정 후 push&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -M main
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;8. 트러블슈팅&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. trunk 관련 오류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 다음 명령어를 사용했다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git svn clone https://test.com/project --stdlayout project&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;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;fatal: refs/remotes/origin/trunk: not a valid SHA1
&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;SVN 저장소에 trunk 구조가 없기 때문&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;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git svn clone https://test/homepage --trunk=. homepage
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Git commit이 없는 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clone 이후 다음 오류 발생&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;fatal: your current branch 'master' does not have any commits yet
&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;SVN 구조를 잘못 인식해서 clone이 정상적으로 완료되지 않은 것&lt;/b&gt;이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SVN 구조 확인 후 --trunk=. 옵션으로 해결..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Git Push 인증 오류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git push 시 다음 오류 발생&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;fatal: Authentication failed
&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git 서버 인증 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git 계정 인증 (아이디 방식 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772776849165&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote set-url origin http://아이디@ip:port/github/project.git

ex) git remote set-url origin http://test@127.0.0.1:1000/github/project.git&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;9. 최종 결과&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 다음 구조로 이관이 완료되었다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;SVN (기존 유지)
     │
     └── Git Migration
            │
            └── GitHub 백업&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;challenge&quot; data-emoticon-name=&quot;005&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/005.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/005.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Git</category>
      <category>github</category>
      <category>SVN</category>
      <category>협업</category>
      <category>형상관리이관</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/195</guid>
      <comments>https://hmw0908.tistory.com/195#entry195comment</comments>
      <pubDate>Fri, 6 Mar 2026 22:03:21 +0900</pubDate>
    </item>
    <item>
      <title>[형상관리] GitHub에 잘못 PUSH한 폴더 및 파일 완전 삭제하기 (BFG 사용)</title>
      <link>https://hmw0908.tistory.com/194</link>
      <description>&lt;p data-end=&quot;322&quot; data-start=&quot;210&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하다가 Docker 설정 폴더를 GitHub에 실수로 Push하는 일이 발생했다.&lt;br /&gt;단순히 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;git rm&lt;/span&gt;으로 삭제하면 최신 버전에서는 사라지지만, &lt;b&gt;히스토리에는 그대로 남아있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;401&quot; data-start=&quot;324&quot; data-ke-size=&quot;size16&quot;&gt;특히 설정 파일 안에 민감 정보(DB 계정, 내부 IP, Key 등)가 포함되어 있다면 반드시 &lt;b&gt;히스토리까지 완전 삭제&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;469&quot; data-start=&quot;403&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 BFG Repo Cleaner를 이용해 특정 폴더를 Git 히스토리에서 완전히 제거하는 방법을 정리한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;469&quot; data-start=&quot;403&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 왜 git rm으로는 부족한가&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1772606276031&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rm -r Docker
git commit -m &quot;remove docker folder&quot;
git push&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방법은 현재 브랜치에서만 삭제된다.&lt;/p&gt;
&lt;p data-end=&quot;645&quot; data-start=&quot;578&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Git의 과거 커밋 기록에는 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;Docker/&lt;/span&gt; 폴더가 그대로 남아있다.&lt;/p&gt;
&lt;p data-end=&quot;682&quot; data-start=&quot;647&quot; 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;style6&quot; /&gt;
&lt;h2 data-end=&quot;682&quot; data-start=&quot;647&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 해결 방법: BFG Repo Cleaner 사용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFG는 Git 히스토리를 빠르게 정리해주는 도구다.&lt;br /&gt;특정 파일이나 폴더를 과거 커밋에서 완전히 제거할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. BFG 다운로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;BFG 다운로드&quot; href=&quot;https://rtyley.github.io/bfg-repo-cleaner/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rtyley.github.io/bfg-repo-cleaner/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772606366570&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;BFG Repo-Cleaner by rtyley&quot; data-og-description=&quot;$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git an alternative to git-filter-branch The BFG is a simpler, faster alternative to git-filter-branch for cleansing bad data out of your Git repository history: Removing Crazy Big Files Re&quot; data-og-host=&quot;rtyley.github.io&quot; data-og-source-url=&quot;https://rtyley.github.io/bfg-repo-cleaner/&quot; data-og-url=&quot;https://rtyley.github.io/bfg-repo-cleaner/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://rtyley.github.io/bfg-repo-cleaner/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rtyley.github.io/bfg-repo-cleaner/&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;BFG Repo-Cleaner by rtyley&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git an alternative to git-filter-branch The BFG is a simpler, faster alternative to git-filter-branch for cleansing bad data out of your Git repository history: Removing Crazy Big Files Re&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rtyley.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bfg-x.x.x.jar 파일을 다운로드 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. GitHub 레포를 Mirror 모드로 Clone&lt;/h3&gt;
&lt;pre id=&quot;code_1772606453294&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone --mirror https://github.com/계정/레포명.git

ex) git clone --mirror https://github.com/user/github_project.git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 실행하면 &lt;b&gt;bare repository&lt;/b&gt;를 생성한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. BFG 실행 (폴더 전체 삭제)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;bfg.jar&lt;/span&gt; 파일을 방금 생성된 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;.git&lt;/span&gt; 폴더 안에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 아래 명령 실행&lt;/p&gt;
&lt;pre id=&quot;code_1772606570583&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -jar bfg.jar --delete-folders 폴더명 --no-blob-protection

ex) java -jar bfg.jar --delete-folders docker --no-blob-protection&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--delete-folders docker : docker 폴더 전체 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--no-blob-protection : 보호 옵션 무시 (완전 삭제)&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. Git 내부 정리 작업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFG 실행 후에는 Git Garbage Collection을 진행해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1772606662831&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git reflog expire --expire=now --all
git gc --prune=now --aggressive&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- reflog 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삭제된 객체 완전 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Git 내부 최적화&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-5. GitHub에 강제 Push&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;히스토리가 변경되었기 때문에 반드시 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;--force&lt;/span&gt; 옵션이 필요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1772606719287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push --force&lt;/code&gt;&lt;/pre&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-6. BFG 실행 후 생성되는 폴더&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 후 다음 폴더가 생성된다.&lt;/p&gt;
&lt;pre id=&quot;code_1772606783383&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;레포명.git.bfg-report&lt;/code&gt;&lt;/pre&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 최종 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제해도 되는 것&lt;/p&gt;
&lt;pre id=&quot;code_1772606837175&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;레포명.git
레포명.git.bfg-report&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;/p&gt;
&lt;pre id=&quot;code_1772606854751&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;실제 프로젝트 폴더&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 강력한 버전 관리 도구지만, 한 번 올라간 파일은 단순 삭제로 완전히 제거되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 설정 파일이나 Docker 환경 파일은 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;.gitignore&lt;/span&gt;로 사전에 관리하는 습관이 중요하다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;challenge&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/003.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/003.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dev/CS</category>
      <category>BFG</category>
      <category>Git</category>
      <category>github</category>
      <category>push삭제</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/194</guid>
      <comments>https://hmw0908.tistory.com/194#entry194comment</comments>
      <pubDate>Wed, 4 Mar 2026 22:49:34 +0900</pubDate>
    </item>
    <item>
      <title>Docker 기반 웹 푸시 알림 시스템 - 5</title>
      <link>https://hmw0908.tistory.com/193</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GIF로 변환 프로젝트.gif&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN6rK4/dJMcaiPV1wQ/0KeZyepuOSi45BO8Er7cW1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN6rK4/dJMcaiPV1wQ/0KeZyepuOSi45BO8Er7cW1/img.gif&quot; data-alt=&quot;실제 로직 gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN6rK4/dJMcaiPV1wQ/0KeZyepuOSi45BO8Er7cW1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cN6rK4/dJMcaiPV1wQ/0KeZyepuOSi45BO8Er7cW1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1030&quot; data-filename=&quot;GIF로 변환 프로젝트.gif&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제 로직 gif&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;PWA 웹 푸시 시스템 구축 최종 정리&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프로젝트 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트의 목표는 PWA 웹 푸시 기능을 Docker 기반 구축하는 것이 목표였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 기능 구현이 아니라,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 운영 서버 적용&lt;/li&gt;
&lt;li&gt;Docker 기반 배포 환경 반영&lt;/li&gt;
&lt;li&gt;Oracle 10g 사용 환경 고려&lt;/li&gt;
&lt;li&gt;기존 통합 로그인 시스템과의 분리&lt;/li&gt;
&lt;/ul&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;style6&quot; /&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;pre id=&quot;code_1772548735804&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Backend]
- Spring Boot 3.5.9
- Java 17
- Spring Data JDBC
- Oracle 10g

[Infra]
- Docker (Rocky Linux)

[Frontend]
- PWA
- Service Worker
- Web Push API

[Push 인증]
- VAPID Key 기반 인증&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이사항:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 / 운영 동일 버전 DB 사용&lt;/li&gt;
&lt;li&gt;Oracle 10g 사용으로 최신 기능 제약 존재&lt;/li&gt;
&lt;li&gt;ojdbc6 &amp;rarr; ojdbc11 버전으로 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 초기 설계 vs 현실 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[초기 목적 및 설계]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 테이블과 푸시 구독 정보 연계&lt;/li&gt;
&lt;li&gt;통합로그인 시스템과 직접 연결&lt;/li&gt;
&lt;li&gt;redis를 사용한 대량 발송 로직 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[현실적 제약]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통합로그인 시스템 연동 시 라이선스 및 구조 변경 이슈&lt;/li&gt;
&lt;li&gt;브라우저 Service Worker를 활용해야하므로, endpoint 기준 관리 필요&lt;/li&gt;
&lt;li&gt;memory Queue만으로도 충분하여 추후 확장 예정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 최종 적용 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;푸시 구독 정보를 독립적으로 관리하여 아래와 같은 특징을 갖는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;endpoint 기준 관리&lt;/li&gt;
&lt;li&gt;중복 구독 방지 로직 적용&lt;/li&gt;
&lt;li&gt;만료 구독 자동 삭제 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. PWA 구성 요소&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-1. Service Worker 등록&lt;/h4&gt;
&lt;pre id=&quot;code_1772549338087&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;navigator.serviceWorker.register('/sw.js')&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-2. VAPID 키 기반 구독 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1772549371983&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const subscription = await registration.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: vapidPublicKey
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5-3. 서버 저장 처리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;endpoint&lt;/li&gt;
&lt;li&gt;p256_key&lt;/li&gt;
&lt;li&gt;auth_key&lt;/li&gt;
&lt;li&gt;bros_type&lt;/li&gt;
&lt;li&gt;os_type&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 저장&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 모바일 이슈 및 정책 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PC Chrome&lt;br /&gt;- 정상 동작&lt;/li&gt;
&lt;li&gt;Android Chrome, iOS Safari&lt;br /&gt;- 홈 화면에 추가 후 실행 시 정상 동작&lt;/li&gt;
&lt;li&gt;네이버 / 카카오 인앱 브라우저&lt;br /&gt;- Push API 미지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 모바일은 브라우저 실행 상태가 아니라, 반드시 &quot;설치형 PWA 상태&quot;여야 동작한다는 점이 핵심이었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 운영 환경 구성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker 기반 컨테이너 운영(프록시 네트워크 구성)&lt;/li&gt;
&lt;li&gt;Nginx Reverse Proxy 구성&lt;/li&gt;
&lt;li&gt;HTTPS 필수 적용&lt;/li&gt;
&lt;li&gt;VAPID Key 운영 서버 기준 발급 및 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. 현재 완료 단계 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PWA 적용 완료&lt;/li&gt;
&lt;li&gt;웹 푸시 구독 및 발송 기능 구현&lt;/li&gt;
&lt;li&gt;모바일 정책 대응 가이드 적용&lt;/li&gt;
&lt;li&gt;별도 구족 테이블 관리 구조 완성&lt;/li&gt;
&lt;li&gt;확장 가능한 구조 유지 및 모듈화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. 향후 개선 방향&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사내 통합 로그인 시스템 연동 (endpoint + ID 기반 푸시 관리)&lt;/li&gt;
&lt;li&gt;사용자 기반 푸시 타겟팅&lt;/li&gt;
&lt;li&gt;구독 상태 모니터링 대시보드&lt;/li&gt;
&lt;li&gt;장애 대응 자동화&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10. 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트는 처음부터 &quot;완성형 아키텍처&quot;를 목표로 하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 Agile(애자일) 방식의 점진적 확정 전략을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;249&quot; data-start=&quot;233&quot; data-ke-size=&quot;size16&quot;&gt;애자일의 핵심은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;342&quot; data-start=&quot;251&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;273&quot; data-start=&quot;251&quot;&gt;처음부터 모든 것을 설계하지 않는다.&lt;/li&gt;
&lt;li data-end=&quot;292&quot; data-start=&quot;274&quot;&gt;작게 만들고 빠르게 검증한다.&lt;/li&gt;
&lt;li data-end=&quot;325&quot; data-start=&quot;293&quot;&gt;현실 제약 안에서 동작 가능한 결과물을 우선 제공한다.&lt;/li&gt;
&lt;li data-end=&quot;342&quot; data-start=&quot;326&quot;&gt;이후 점진적으로 개선한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;376&quot; data-start=&quot;344&quot; data-ke-size=&quot;size16&quot;&gt;이번 PWA 기반 웹 푸시 시스템 역시 동일한 접근이었다.&lt;/p&gt;
&lt;p data-end=&quot;457&quot; data-start=&quot;378&quot; data-ke-size=&quot;size16&quot;&gt;초기 설계 단계에서는 사용자 테이블과 직접 연동되는 구조, 권한 기반 발송 제어, 통합 로그인 기반 사용자 식별 구조까지 고려했다.&lt;/p&gt;
&lt;p data-end=&quot;492&quot; data-start=&quot;459&quot; data-ke-size=&quot;size16&quot;&gt;그러나 실제 환경에서는 다음과 같은 현실적 제약이 존재했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;559&quot; data-start=&quot;494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;515&quot; data-start=&quot;494&quot;&gt;사내 통합 로그인 시스템 연동 필요&lt;/li&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;516&quot;&gt;라이선스 및 정책 이슈&lt;/li&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;531&quot;&gt;조직 간 협의 절차&lt;/li&gt;
&lt;li data-end=&quot;559&quot; data-start=&quot;544&quot;&gt;기존 시스템 영향도 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;611&quot; data-start=&quot;561&quot; data-ke-size=&quot;size16&quot;&gt;이러한 상황에서 이상적인 구조를 고집했다면 프로젝트는 시작조차 어려웠을 가능성이 높다.&lt;/p&gt;
&lt;p data-end=&quot;630&quot; data-start=&quot;613&quot; data-ke-size=&quot;size16&quot;&gt;그래서 선택한 방향은 명확했다.&lt;/p&gt;
&lt;blockquote data-end=&quot;662&quot; data-start=&quot;632&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;662&quot; data-start=&quot;634&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;현실적으로 구현 가능한 최소 기능부터 완성한다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;664&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;664&quot; data-ke-size=&quot;size16&quot;&gt;그 결과 현재 단계에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;785&quot; data-start=&quot;680&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;703&quot; data-start=&quot;680&quot;&gt;PWA 기반 웹 푸시 구조 확립&lt;/li&gt;
&lt;li data-end=&quot;725&quot; data-start=&quot;704&quot;&gt;모바일 정책 대응 구조 정리&lt;/li&gt;
&lt;li data-end=&quot;753&quot; data-start=&quot;726&quot;&gt;별도 구독 테이블 기반 독립 구조 완성&lt;/li&gt;
&lt;li data-end=&quot;785&quot; data-start=&quot;754&quot;&gt;운영 환경(Docker + HTTPS) 안정화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;787&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;기능적으로는 독립 운영 가능한 1차 버전이 완성된 상태&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;787&quot; data-ke-size=&quot;size16&quot;&gt;향후 통합로그인 시스템이 도입되어 사용자 식별 기반 푸시 관리 구조로 확장될 경우, 이 프로젝트는 단순 기능 개선이 아닌 사내 인증 체계와 연결되는 대외비 성격의 프로젝트로 전환될 가능성이 높다.&lt;/p&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;787&quot; 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;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;challenge&quot; data-emoticon-name=&quot;005&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/005.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/challenge/large/005.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>SideProject</category>
      <category>Docker</category>
      <category>pwa</category>
      <category>spring</category>
      <category>개발</category>
      <category>도커</category>
      <category>사이드프로젝트</category>
      <category>웹푸시알림</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/193</guid>
      <comments>https://hmw0908.tistory.com/193#entry193comment</comments>
      <pubDate>Wed, 4 Mar 2026 00:19:33 +0900</pubDate>
    </item>
    <item>
      <title>Docker 기반 웹 푸시 알림 시스템 - 4.5</title>
      <link>https://hmw0908.tistory.com/192</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;소스 형상관리 및 사내 Git 서버(Gitea) 연동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 프로젝트 소스 형상관리를 위해 Git을 도입하고,&lt;br /&gt;초기 GitHub 연동 이후 &lt;b&gt;사내 Git 서버(Gitea)&lt;/b&gt; 로 이전한 과정을 정리한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Git 도입 배경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot 기반 웹 푸시 알림 서버를 개발하면서 다음과 같은 필요성이 있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;379&quot; data-start=&quot;310&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;323&quot; data-start=&quot;310&quot;&gt;코드 변경 이력 관리&lt;/li&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;324&quot;&gt;기능 단위 버전 관리&lt;/li&gt;
&lt;li data-end=&quot;353&quot; data-start=&quot;338&quot;&gt;협업 및 추후 확장 대비&lt;/li&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;354&quot;&gt;회사 내부 정책에 맞는 형상관리 체계 구축&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;462&quot; data-start=&quot;381&quot; data-ke-size=&quot;size16&quot;&gt;초기에는 사이드 프로젝트 개념으로 GitHub Private Repository로 관리했으나,&lt;br /&gt;추후 내부적으로 활용이 가능할 것으로 판단되어 사내 보안 정책에 따라 내부 Git 서버(Gitea)로 이전하게 되었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;462&quot; data-start=&quot;381&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. gitignore 구성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 연동했던 Github에선 IDE 설정 파일, 빌드 산출물, 민감 정보가 Git에 포함되지 않도록 구성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 Git 서버로 이관 했을 때도 동일하게 유지했다. (민감 정보는 형상관리를 통해서가 아닌 내부적으로 관리 및 공유)&lt;/p&gt;
&lt;pre id=&quot;code_1770858092259&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# IDE
.idea/
*.iml

# Build
.gradle/
build/

# Logs
logs/

# Spring Profile
application-local.properties        #개발 환경 설정
application-prod.properties         #운영 서버 설정

# Env
.env
*.key&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;462&quot; data-start=&quot;381&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Git 이관 과정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 매우 간단해서 어이가 없었다..&lt;/p&gt;
&lt;pre id=&quot;code_1770858452252&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#기존 Remote 확인
git remote -v

#Gitea 저장소로 Remote 변경
git remote set-url origin http://사내Gitea주소/team/knunotify.git

#Push
git push -u origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;462&quot; data-start=&quot;381&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;462&quot; data-start=&quot;381&quot; data-ke-size=&quot;size16&quot;&gt;기존 커밋 히스토리를 유지한 상태로 원격 저장소만 사내 Gitea 서버로 변경했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;462&quot; data-start=&quot;381&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Gitea 사용 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gitea는 경량 Git 서버로 다음과 같은 장점이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2025&quot; data-start=&quot;1949&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1962&quot; data-start=&quot;1949&quot;&gt;자체 서버 운영 가능&lt;/li&gt;
&lt;li data-end=&quot;1975&quot; data-start=&quot;1963&quot;&gt;낮은 리소스 사용량&lt;/li&gt;
&lt;li data-end=&quot;1996&quot; data-start=&quot;1976&quot;&gt;간단한 설치 (Docker 지원)&lt;/li&gt;
&lt;li data-end=&quot;2013&quot; data-start=&quot;1997&quot;&gt;GitHub와 유사한 UI&lt;/li&gt;
&lt;li data-end=&quot;2025&quot; data-start=&quot;2014&quot;&gt;내부망 운영 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2085&quot; data-start=&quot;2027&quot; data-ke-size=&quot;size16&quot;&gt;특히 사내 보안 요구사항을 충족하면서도 GitHub와 유사한 사용 경험을 제공한다는 점이 장점이었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;2085&quot; data-start=&quot;2027&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;001&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>SideProject</category>
      <category>Git</category>
      <category>gitea</category>
      <category>github</category>
      <category>pwa</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/192</guid>
      <comments>https://hmw0908.tistory.com/192#entry192comment</comments>
      <pubDate>Thu, 12 Feb 2026 23:14:48 +0900</pubDate>
    </item>
    <item>
      <title>연말정산 구조 쉽고 간단하게 알아보자</title>
      <link>https://hmw0908.tistory.com/190</link>
      <description>&lt;h2 data-end=&quot;491&quot; data-start=&quot;467&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 연말정산을 한 문장으로 요약하면&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-end=&quot;562&quot; data-start=&quot;493&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;562&quot; data-start=&quot;495&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1년 동안 미리 낸 세금이 적절했는지 다시 계산해서 더 냈으면 돌려주고 덜 냈으면 추가로 받는 과정&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;596&quot; data-start=&quot;564&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;596&quot; data-start=&quot;564&quot; data-ke-size=&quot;size16&quot;&gt;즉, 새로운 세금을 매기는 게 아니라 이미 낸 세금을 &lt;b&gt;정산&lt;/b&gt;하는 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;804&quot; data-start=&quot;778&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 연말정산 전체 프로세스 (큰 그림)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;827&quot; data-start=&quot;806&quot; data-ke-size=&quot;size16&quot;&gt;연말정산은 항상 아래 순서로 흘러간다.&lt;/p&gt;
&lt;pre id=&quot;code_1770617892040&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;연봉 (총급여)
 &amp;rarr; 1. 자동으로 빼주는 금액 (근로소득공제)
 &amp;rarr; 2. 세금 계산 기준 금액 (과세표준)
 &amp;rarr; 3. 세율 적용 (누진세)
 &amp;rarr; 4. 깎아줄 수 있는 세금 차감 (세액공제)
 &amp;rarr; 5. 최종 세금
 &amp;rarr; 6. 이미 낸 세금과 비교 후 환급 or 추가 납부&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;982&quot; data-start=&quot;960&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ 단계별 구조를 쉽게 풀어보면&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;998&quot; data-start=&quot;984&quot; data-ke-size=&quot;size23&quot;&gt;연봉 (총급여)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1015&quot; data-start=&quot;999&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1006&quot; data-start=&quot;999&quot;&gt;세전 연봉&lt;/li&gt;
&lt;li data-end=&quot;1015&quot; data-start=&quot;1007&quot;&gt;상여금 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1036&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size23&quot;&gt;1. 근로소득공제 (자동계산)&lt;/h3&gt;
&lt;p data-end=&quot;1059&quot; data-start=&quot;1037&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;회사 다니는 사람이라서 깎아줌&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1087&quot; data-start=&quot;1061&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1068&quot; data-start=&quot;1061&quot;&gt;자동 적용&lt;/li&gt;
&lt;li data-end=&quot;1087&quot; data-start=&quot;1069&quot;&gt;연봉이 높을수록 비율은 줄어듦&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1136&quot; data-start=&quot;1124&quot; data-ke-size=&quot;size23&quot;&gt;2. 과세표준&lt;/h3&gt;
&lt;p data-end=&quot;1157&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;세금 매길 진짜 기준 금액&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770618058942&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;연봉 - 근로소득공제 - 기본공제(본인 1명) = 과세표준&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;여기서 산출된 과제표준 금액으로부터 세율이 붙는데, 인적공제(기본공제)는 본인 1명 기준으로 150만 원이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1243&quot; data-start=&quot;1226&quot; data-ke-size=&quot;size23&quot;&gt;3. 세율 적용 (누진세)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1274&quot; data-start=&quot;1245&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1259&quot; data-start=&quot;1245&quot;&gt;낮은 구간은 낮은 세율&lt;/li&gt;
&lt;li data-end=&quot;1274&quot; data-start=&quot;1260&quot;&gt;높은 구간은 높은 세율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1318&quot; data-start=&quot;1276&quot; data-ke-size=&quot;size16&quot;&gt;연봉이 오를수록 세금이 &lt;b&gt;급격히 늘어나는 느낌&lt;/b&gt;이 든다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1337&quot; data-start=&quot;1325&quot; data-ke-size=&quot;size23&quot;&gt;4. 세액공제&lt;/h3&gt;
&lt;p data-end=&quot;1356&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;여기서부터 전략의 영역&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1379&quot; data-start=&quot;1358&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1362&quot; data-start=&quot;1358&quot;&gt;카드&lt;/li&gt;
&lt;li data-end=&quot;1367&quot; data-start=&quot;1363&quot;&gt;보험&lt;/li&gt;
&lt;li data-end=&quot;1373&quot; data-start=&quot;1368&quot;&gt;의료비&lt;/li&gt;
&lt;li data-end=&quot;1379&quot; data-start=&quot;1374&quot;&gt;교육비&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1381&quot; 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;style6&quot; /&gt;
&lt;h3 data-end=&quot;1425&quot; data-start=&quot;1408&quot; data-ke-size=&quot;size23&quot;&gt;5. 이미 낸 세금과 비교&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1461&quot; data-start=&quot;1427&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1442&quot; data-start=&quot;1427&quot;&gt;많이 냈으면 &amp;rarr; 환급&lt;/li&gt;
&lt;li data-end=&quot;1461&quot; data-start=&quot;1443&quot;&gt;적게 냈으면 &amp;rarr; 추가 납부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1492&quot; data-start=&quot;1468&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ 이 구조 안에서 연봉에 따라서 비교하면?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1523&quot; data-start=&quot;1494&quot; data-ke-size=&quot;size16&quot;&gt;이제 같은 구조에 &lt;b&gt;연봉만 바꿔서 넣어보자.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;459&quot; data-start=&quot;439&quot; data-ke-size=&quot;size26&quot;&gt;비교 기준 (조건 통일)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;534&quot; data-start=&quot;461&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;474&quot; data-start=&quot;461&quot;&gt;근로소득자 (회사원)&lt;/li&gt;
&lt;li data-end=&quot;492&quot; data-start=&quot;475&quot;&gt;부양가족 없음 (본인 1명)&lt;/li&gt;
&lt;li data-end=&quot;504&quot; data-start=&quot;493&quot;&gt;비과세 수당 없음&lt;/li&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;505&quot;&gt;주택자금&amp;middot;특별공제 없음&lt;/li&gt;
&lt;li data-end=&quot;534&quot; data-start=&quot;520&quot;&gt;카드 사용은 평균 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;558&quot; data-start=&quot;536&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연봉 차이만 놓고 구조 비교를 해보자.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;연봉&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;연간 세금&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;체감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;3,000만&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;약 120만&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;거의 안 냄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;5,000만&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;약 390만&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;딱 중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;8,000만&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;약 1,000만&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;확 체감됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;558&quot; data-start=&quot;536&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;786&quot; data-start=&quot;764&quot; data-ke-size=&quot;size26&quot;&gt;연봉별 계산 구조 비교&lt;/h2&gt;
&lt;h3 data-end=&quot;800&quot; data-start=&quot;788&quot; data-ke-size=&quot;size23&quot;&gt;연봉 3,000만원 계산 구조&lt;/h3&gt;
&lt;pre id=&quot;code_1770618608558&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;총급여          30,000,000
근로소득공제   -10,000,000
기본공제        -1,500,000
과세표준 &amp;asymp;      18,500,000&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-start=&quot;788&quot; data-end=&quot;800&quot; data-ke-size=&quot;size23&quot;&gt;연봉 5,000만원 계산 구조&lt;/h3&gt;
&lt;pre id=&quot;code_1770618710807&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;총급여          50,000,000
근로소득공제   -13,250,000
기본공제        -1,500,000
과세표준 &amp;asymp;      35,250,000&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-start=&quot;788&quot; data-end=&quot;800&quot; data-ke-size=&quot;size23&quot;&gt;연봉 8,000만원 계산 구조&lt;/h3&gt;
&lt;pre id=&quot;code_1770618723726&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;총급여          80,000,000
근로소득공제   -16,500,000
기본공제        -1,500,000
과세표준 &amp;asymp;      62,000,000&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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>
      <category>연말정산</category>
      <category>연말정산쉽게</category>
      <category>연말정산정리</category>
      <category>연봉별연말정산</category>
      <category>연봉비교</category>
      <category>직장인세금</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/190</guid>
      <comments>https://hmw0908.tistory.com/190#entry190comment</comments>
      <pubDate>Mon, 9 Feb 2026 21:53:00 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 메일 헤더를 분석해보자</title>
      <link>https://hmw0908.tistory.com/191</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메일 헤더(Header)란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일 헤더는 &quot;&lt;b&gt;이 메일이 어디서, 누구에 의해, 어떤 방식으로 전달되었는지&lt;/b&gt;&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;본문은 사용자에게 보이는 영역이라면 헤더는 &lt;b&gt;메일 서버와 보안 시스템을 위한 영역&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;스팸 분석, 위&amp;middot;변조 판단, 발송 경로 추적 시 가장 먼저 확인하는 게 바로 이 메일 헤더다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;메일 헤더 분석 가이드&lt;/b&gt; (예시 헤더 기반 정리)&lt;/h3&gt;
&lt;pre id=&quot;code_1770626930089&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* ChatGPT를 통해 만든 샘플 메일 헤더입니다. */

Received: from mail.example-sender.com (203.0.113.10)
        by mail.example-receiver.com with ESMTP;
        Tue, 04 Feb 2026 15:20:11 +0900

Authentication-Results: mail.example-receiver.com;
        spf=pass smtp.mailfrom=mailer@example.com;
        dkim=pass header.d=example.com

Received-SPF: pass (mail.example-receiver.com: domain of mailer@example.com
        designates 203.0.113.10 as permitted sender)

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=example.com; s=default;
        h=From:To:Subject:Date;
        bh=abcdefg123456=;
        b=ZYX987654321=

From: &quot;Example Service&quot; &amp;lt;no-reply@example.com&amp;gt;
To: user@example-receiver.com
Reply-To: support@example.com
Subject: [Example] Sample Mail Header Guide
Date: Tue, 04 Feb 2026 15:20:11 +0900

Precedence: bulk
List-Unsubscribe: &amp;lt;mailto:unsubscribe@example.com&amp;gt;,
        &amp;lt;https://example.com/unsubscribe&amp;gt;

Message-ID: &amp;lt;20260204152011.12345@mail.example-sender.com&amp;gt;
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Received - 메일 전달 경로&lt;/h4&gt;
&lt;pre id=&quot;code_1770626982344&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Received: from mail.example-sender.com (203.0.113.10)
by mail.example-receiver.com with ESMTP;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할: 메일이 어떤 서버에서 어떤 서버로 전달되었는지 기록 (여러 줄일 경우 아래에서 위 순서로 해석)&lt;/li&gt;
&lt;li&gt;체크 포인트: 발송 서버 IP, 중간 경유 서버 존재 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. SPF (Sender Policy Framework)&lt;/h4&gt;
&lt;pre id=&quot;code_1770627105369&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Received-SPF: pass
spf=pass smtp.mailfrom=mailer@example.com&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할: 발송 서버 IP가 해당 도메인에서 허용된 서버인지 검증 (DNS SPF 레코드 기반 검사)&lt;/li&gt;
&lt;li&gt;체크 포인트: pass(정상), fail(스푸핑 의심), softfail(정책 미흡)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. DKIM (DomainKeys Identified Mail)&lt;/h4&gt;
&lt;pre id=&quot;code_1770627311345&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dkim=pass header.d=example.com&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할: 메일 전송 중 본문/헤더 위변조 여부 검증&lt;/li&gt;
&lt;li&gt;체크 포인트: dkim=pass header.d &amp;rarr; 서명 도메인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Authentication-Results&lt;/h4&gt;
&lt;pre id=&quot;code_1770627399856&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Authentication-Results:
spf=pass
dkim=pass&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할: SPF, DKIM, DMARC 최종 인증 결과 요약&lt;/li&gt;
&lt;li&gt;체크 포인트: pass가 아닐 경우 의심 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. From / Reply-To&lt;/h4&gt;
&lt;pre id=&quot;code_1770627596024&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;From: no-reply@example.com
Reply-To: support@example.com&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할&lt;br /&gt;- From=사용자에게 표시되는 발신자&lt;br /&gt;- Reply-To: 회신 시 실제 수신 주소&lt;/li&gt;
&lt;li&gt;체크 포인트&lt;br /&gt;- 외부 발송 서버 + 내부 도메인 From 구조 가능&lt;br /&gt;- SPF/DKIM 통과 여부가 핵심&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. Precedence - 메일 성격 구분&lt;/h4&gt;
&lt;pre id=&quot;code_1770627702728&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Precedence: bulk&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bulk: 대량 발송 메일&lt;/li&gt;
&lt;li&gt;list: 메일링 리스트&lt;/li&gt;
&lt;li&gt;normal: 일반 메일&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. List-Unsubscribe&lt;/h4&gt;
&lt;pre id=&quot;code_1770627759152&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List-Unsubscribe:
&amp;lt;mailto:unsubscribe@example.com&amp;gt;,
&amp;lt;https://example.com/unsubscribe&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할: 수신 거부 경로 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. Message-ID&lt;/h4&gt;
&lt;pre id=&quot;code_1770627804080&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Message-ID: &amp;lt;20260204152011.12345@mail.example-sender.com&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할: 메일 고유 식별자, 로그 추적, 발송 이력 확인 시 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. MIME / Content-Type&lt;/h4&gt;
&lt;pre id=&quot;code_1770627854121&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Content-Type: text/html; charset=UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메일 본문 형식, 문자셋(인코딩) 정보&lt;/li&gt;
&lt;li&gt;한글 깨짐 현상 발생 시 해당 헤더값과 연관됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메일 헤더 분석 체크리스트&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;확인 내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Received&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;발송 경로 정상 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;SPF&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;pass 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;DKIM&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;pass 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;From&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;도메인 정합성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Precedence&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;대량 메일 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;List-Unsubscribe&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;수신 거부 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Message-ID&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;로그 추적 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일 담당자이다보니, 잘 까먹는 나를 위해 정리해보았다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;044&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/044.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/044.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Dev/CS</category>
      <category>dkim</category>
      <category>mailheader</category>
      <category>received</category>
      <category>SPF</category>
      <category>메일</category>
      <category>메일헤더</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/191</guid>
      <comments>https://hmw0908.tistory.com/191#entry191comment</comments>
      <pubDate>Mon, 9 Feb 2026 18:10:44 +0900</pubDate>
    </item>
    <item>
      <title>메이플키우기 환불 방법 총정리 (환불 링크 포함)</title>
      <link>https://hmw0908.tistory.com/189</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;메이플키우기.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6jaKE/dJMcagYHTvy/aydgB4k6a7lU3On2IwHclk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6jaKE/dJMcagYHTvy/aydgB4k6a7lU3On2IwHclk/img.png&quot; data-alt=&quot;메이플키우기 환불&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6jaKE/dJMcagYHTvy/aydgB4k6a7lU3On2IwHclk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6jaKE%2FdJMcagYHTvy%2FaydgB4k6a7lU3On2IwHclk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;325&quot; data-filename=&quot;메이플키우기.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;325&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;/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;style6&quot; /&gt;
&lt;h2 data-end=&quot;395&quot; data-start=&quot;377&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메이플키우기 환불 대상 안내&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;397&quot; data-ke-size=&quot;size16&quot;&gt;이번 환불은 &lt;b&gt;메이플키우기에서 유료 결제를 진행한 사용자&lt;/b&gt;를 대상으로 진행된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;519&quot; data-start=&quot;446&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;482&quot; data-start=&quot;446&quot;&gt;메이플키우기 유료 상품 결제 이력 보유&lt;/li&gt;
&lt;li data-end=&quot;497&quot; data-start=&quot;483&quot;&gt;넥슨 계정 로그인 필요&lt;/li&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;498&quot;&gt;PC / 모바일 브라우저 모두 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;565&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;정확한 환불 대상 여부는 &lt;b&gt;환불 페이지 접속 후 자동으로 확인&lt;/b&gt;된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;590&quot; data-start=&quot;572&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메이플키우기 환불 신청 링크&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;627&quot; data-start=&quot;592&quot; data-ke-size=&quot;size16&quot;&gt;아래 링크를 통해 바로 환불 신청 페이지로 이동할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;629&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a title=&quot;메이플키우기 환불 바로가기&quot; href=&quot;https://maplestoryidle.nexon.com/ko/refund&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://maplestoryidle.nexon.com/ko/refund&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1770612932301&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;메이플 키우기&quot; data-og-description=&quot;출구 없는 무한 성장의 재미, 방치형 RPG로 돌아온 메이플스토리!&quot; data-og-host=&quot;maplestoryidle.nexon.com&quot; data-og-source-url=&quot;https://maplestoryidle.nexon.com/ko/refund&quot; data-og-url=&quot;https://maplestoryidle.nexon.com/ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ci963W/dJMb9ee9F2K/FjkSL0V5KzGXaC0SZYfv01/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ok2Hb/dJMb81fOmTl/yogXgvwGq7hvImPrrADIOk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://maplestoryidle.nexon.com/ko/refund&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://maplestoryidle.nexon.com/ko/refund&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ci963W/dJMb9ee9F2K/FjkSL0V5KzGXaC0SZYfv01/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ok2Hb/dJMb81fOmTl/yogXgvwGq7hvImPrrADIOk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;메이플 키우기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;출구 없는 무한 성장의 재미, 방치형 RPG로 돌아온 메이플스토리!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;maplestoryidle.nexon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;797&quot; data-start=&quot;769&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메이플키우기 환불 방법 (순서대로 따라 하기)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;829&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;환불 페이지 접속&lt;/b&gt;&lt;br /&gt;- 위 환불 링크 접속&lt;/p&gt;
&lt;p data-end=&quot;829&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;875&quot; data-start=&quot;831&quot; data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;넥슨 계정 로그인&lt;/b&gt;&lt;br /&gt;- 메이플키우기를 플레이했던 넥슨 ID로 로그인&lt;/p&gt;
&lt;p data-end=&quot;875&quot; data-start=&quot;831&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;920&quot; data-start=&quot;877&quot; data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;환불 대상 여부 확인&lt;/b&gt;&lt;br /&gt;- 결제 이력이 있는 경우 자동으로 표시됨&lt;/p&gt;
&lt;p data-end=&quot;920&quot; data-start=&quot;877&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;964&quot; data-start=&quot;922&quot; data-ke-size=&quot;size16&quot;&gt;4️⃣ &lt;b&gt;환불 신청 진행&lt;/b&gt;&lt;br /&gt;- 안내에 따라 환불 동의 및 신청 버튼 클릭&lt;/p&gt;
&lt;p data-end=&quot;964&quot; data-start=&quot;922&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1011&quot; data-start=&quot;966&quot; data-ke-size=&quot;size16&quot;&gt;5️⃣ &lt;b&gt;환불 완료&lt;/b&gt;&lt;br /&gt;- 결제 수단에 따라 환불까지 일정 기간 소요될 수 있음&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1035&quot; data-start=&quot;1018&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;환불 관련 자주 묻는 질문&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1062&quot; data-start=&quot;1037&quot; data-ke-size=&quot;size23&quot;&gt;Q. 모바일로도 환불 신청 가능한가요?&lt;/h3&gt;
&lt;p data-end=&quot;1102&quot; data-start=&quot;1063&quot; data-ke-size=&quot;size16&quot;&gt;▶ 네. &lt;b&gt;모바일 브라우저에서도 가능&lt;/b&gt;합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1127&quot; data-start=&quot;1104&quot; data-ke-size=&quot;size23&quot;&gt;Q. 환불 금액은 언제 들어오나요?&lt;/h3&gt;
&lt;p data-end=&quot;1170&quot; data-start=&quot;1128&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt; &lt;/span&gt;&lt;/span&gt;환불 신청 기간 종료 후로부터 약 1개월 이내&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;011&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/011.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/011.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>요고조고이고/꿀팁</category>
      <category>넥슨환불</category>
      <category>메이플키우기</category>
      <category>메이플키우기환불</category>
      <category>메이플키우기환불링크</category>
      <category>메이플키우기환불방법</category>
      <category>메이플키우기환불어디서</category>
      <author>싹다배워</author>
      <guid isPermaLink="true">https://hmw0908.tistory.com/189</guid>
      <comments>https://hmw0908.tistory.com/189#entry189comment</comments>
      <pubDate>Mon, 9 Feb 2026 13:59:05 +0900</pubDate>
    </item>
  </channel>
</rss>