<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>simzard</title>
    <link>https://simzard.tistory.com/</link>
    <description>옷 잘 입는 개발자가 될래요</description>
    <language>ko</language>
    <pubDate>Wed, 12 Aug 2026 07:27:26 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>simzard</managingEditor>
    <image>
      <title>simzard</title>
      <url>https://tistory1.daumcdn.net/tistory/7523741/attach/f55c8f1ce9a843a9963ba4b301596727</url>
      <link>https://simzard.tistory.com</link>
    </image>
    <item>
      <title>[회고] 중견기업 인턴, 대기업 인턴에서 정규직 전환까지 - 백엔드 개발자 취준 기간의 기록</title>
      <link>https://simzard.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정말 열심히 살았던 2025년, 2026년 상반기다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LL0CU/dJMcag0vpf8/wQoieGIRMzGkfu4EMqvuAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LL0CU/dJMcag0vpf8/wQoieGIRMzGkfu4EMqvuAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LL0CU/dJMcag0vpf8/wQoieGIRMzGkfu4EMqvuAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLL0CU%2FdJMcag0vpf8%2FwQoieGIRMzGkfu4EMqvuAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;249&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;249&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;이 글은 2024년(대학교 3학년)부터 시작된 취준 준비와 본격적으로 취준을 했던 과정을 담은 글이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약보다는 흐름을 한 번 쭉 정리해보고 싶어서, 두서없이 그냥 그때의 느낌 그대로 적는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취준 팁이라기보다는 그냥 네이버 블로그식 사진 정리에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 흐름은 &lt;b&gt;3학년 &amp;rarr; 4학년 1학기 SW캡스톤디자인 &amp;rarr; 4학년 2학기 안랩 인턴 &amp;rarr; 졸업 이후 넷마블 인턴&lt;/b&gt; 순이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타임라인&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mE80a/dJMcagTVCse/2V6nAgZvg6Xu3TyyfkMBsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mE80a/dJMcagTVCse/2V6nAgZvg6Xu3TyyfkMBsK/img.png&quot; data-alt=&quot;서류 준비와 인턴 지원은 3학년 여름방학부터 시작했다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mE80a/dJMcagTVCse/2V6nAgZvg6Xu3TyyfkMBsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmE80a%2FdJMcagTVCse%2F2V6nAgZvg6Xu3TyyfkMBsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;558&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서류 준비와 인턴 지원은 3학년 여름방학부터 시작했다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취준 전에 3가지를 목표로 삼았다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;4학년 때 취준에만 집중할 수 있도록 학점을 미리 들어두고 평점 3.8 이상 유지 (졸업 학점이 140학점이라 부담이 컸다)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 하나를 꾸준히 이어가며 의미 있는 성과나 실제 사용자 수를 만들어보기 (가능하면 수익까지)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인턴 경험 쌓기&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 덕분에 3학년 2학기와 4학년 1&amp;middot;2학기에는 각각 12학점씩만 들으면서 사이드 프로젝트, SW캡스톤디자인, 인턴, 취업 준비에 시간을 쏟을 수 있었고, 적은 수강 학점 덕분에 학점도 잘 유지되어 &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;2번 덕분에 &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;3번 덕분에 신입 채용에서 가장 중요한 &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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2024년) 정병의 3학년&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;1380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VOYeq/dJMcaftOhdY/4ljKCPeYq4CbEDtDyLvXM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VOYeq/dJMcaftOhdY/4ljKCPeYq4CbEDtDyLvXM0/img.png&quot; data-alt=&quot;지금 생각해보면 어떻게 했지?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VOYeq/dJMcaftOhdY/4ljKCPeYq4CbEDtDyLvXM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVOYeq%2FdJMcaftOhdY%2F4ljKCPeYq4CbEDtDyLvXM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;569&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;1380&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;2학년 2학기와 3학년 1학기 때는 각각 &lt;b&gt;24학점&lt;/b&gt;씩 들으며, 나중에 취업 준비 시기가 오면 오직 취준에만 집중할 수 있도록 미리 대비했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 그 대가로 학점은 말아먹었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3학년 1학기부터는 정말 &lt;b&gt;도서관에 살았다&lt;/b&gt;고 해도 무방할 정도였다. 본가도 학교 앞이라 방학 때도 빠짐없이 개근했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년에는 소프트웨어학과 학술소학회 회장도 맡았는데, 돌이켜보면 이게 나를 더 빨리 지치게 만든 이유 중 하나였던 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8i7N0/dJMcag7i1jq/lfofAWNtgmd8pT1Vv4aglK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8i7N0/dJMcag7i1jq/lfofAWNtgmd8pT1Vv4aglK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; width=&quot;306&quot; height=&quot;408&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8i7N0/dJMcag7i1jq/lfofAWNtgmd8pT1Vv4aglK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8i7N0%2FdJMcag7i1jq%2FlfofAWNtgmd8pT1Vv4aglK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8j0tU/dJMcaf1CdHM/qNGF9mbSrK24USY5KRDvcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8j0tU/dJMcaf1CdHM/qNGF9mbSrK24USY5KRDvcK/img.png&quot; style=&quot;width: 49.4193%;&quot; width=&quot;537&quot; height=&quot;716&quot; data-widthpercent=&quot;50&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8j0tU/dJMcaf1CdHM/qNGF9mbSrK24USY5KRDvcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8j0tU%2FdJMcaf1CdHM%2FqNGF9mbSrK24USY5KRDvcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;그래도 소학회 회장하면서 새내기 시절 코로나 때문에 못 갔던 새내기 배움터도 가봤다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YZl4U/dJMcabx9AuU/07xNgy3PJ7fPw4u9BV8n51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YZl4U/dJMcabx9AuU/07xNgy3PJ7fPw4u9BV8n51/img.png&quot; data-alt=&quot;다음년도 동아리방도 배정 받았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YZl4U/dJMcabx9AuU/07xNgy3PJ7fPw4u9BV8n51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYZl4U%2FdJMcabx9AuU%2F07xNgy3PJ7fPw4u9BV8n51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;118&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;180&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2024년 겨울 방학) SW융합교육원 방학 코테 강의&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0NoLT/dJMcacqn8ad/P1ui8VmJ3qaPu709zX2MT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0NoLT/dJMcacqn8ad/P1ui8VmJ3qaPu709zX2MT1/img.png&quot; data-alt=&quot;SW융합교육원 2024-동계 코딩집중교육(코딩테스트 집중 훈련)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0NoLT/dJMcacqn8ad/P1ui8VmJ3qaPu709zX2MT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0NoLT%2FdJMcacqn8ad%2FP1ui8VmJ3qaPu709zX2MT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;548&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SW융합교육원 2024-동계 코딩집중교육(코딩테스트 집중 훈련)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3학년에서 4학년으로 올라가는 겨울방학만큼은 좀 더 의미 있게 보내고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 코딩테스트를 제대로 준비해본 적이 없어서 이 부분에 대한 대비가 필요하다고 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 방학 때마다 기상 시각이 규칙적이지 않은 것도 고민이었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트 준비 프로그램 덕분에 일찍 일어나는 습관도 만들고, 덕분에 알찬 방학을 보낼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(물론 결과론적으로 코딩테스트 없이 취업을 하긴했다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2025년 1학기) 4학년, 휴학 없이 달리다&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDPAV/dJMcadJseKh/vVcPYIGhuf2B5YmNkqCzu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDPAV/dJMcadJseKh/vVcPYIGhuf2B5YmNkqCzu1/img.png&quot; data-alt=&quot;휴학 안하길 잘했다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDPAV/dJMcadJseKh/vVcPYIGhuf2B5YmNkqCzu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDPAV%2FdJMcadJseKh%2FvVcPYIGhuf2B5YmNkqCzu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;642&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;642&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;b&gt;휴학을 할 것인가, 그냥 이대로 달릴 것인가&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 지쳐있던 상태라 쉬고 싶은 마음도 컸지만, 막상 쉰다고 해도 교환학생이나 부트캠프, 워홀처럼 구체적인 계획이 없다면 그 시간이 그냥 의미 없이 흘러가 버릴 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 휴학하지 않고 계속 달린다면 SW캡스톤디자인을 수강해야 했는데, 마침 현지 누나가 같이 하자고 제안이 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 SW캡스톤디자인은 졸업 작품이기도 하고 포트폴리오에 무조건 들어갈 프로젝트였기 때문에, 여기에 100%를 갈아넣고 싶어서 오히려 고민이 더 깊어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 함께할 사람이 있을 때 해야 한다고 생각했고, 결국 달리기로 결정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;뒤돌아보면 이때 멈추지 않고 그냥 달렸던 게 정말 좋은 선택이었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2025년 1학기) 마지막 코딩 트레이너 활동&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/si7as/dJMcac4UOBC/kQJD5Op2V39nIYeF1WIvKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/si7as/dJMcac4UOBC/kQJD5Op2V39nIYeF1WIvKK/img.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;596&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5192%; margin-right: 10px;&quot; data-widthpercent=&quot;33.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/si7as/dJMcac4UOBC/kQJD5Op2V39nIYeF1WIvKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsi7as%2FdJMcac4UOBC%2FkQJD5Op2V39nIYeF1WIvKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXKdvw/dJMcaazj6ha/cukB4vCMqAk9JZv0bMHQWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXKdvw/dJMcaazj6ha/cukB4vCMqAk9JZv0bMHQWK/img.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;712&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5937%; margin-right: 10px;&quot; data-widthpercent=&quot;33.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXKdvw/dJMcaazj6ha/cukB4vCMqAk9JZv0bMHQWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXKdvw%2FdJMcaazj6ha%2FcukB4vCMqAk9JZv0bMHQWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xM3vD/dJMcaazj6ih/GEi4nr1nbs5W4v0sxRvpAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xM3vD/dJMcaazj6ih/GEi4nr1nbs5W4v0sxRvpAK/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;716&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5643%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xM3vD/dJMcaazj6ih/GEi4nr1nbs5W4v0sxRvpAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxM3vD%2FdJMcaazj6ih%2FGEi4nr1nbs5W4v0sxRvpAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;3학기 동안 진행한 SW융합교육원 코딩 트레이너&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 1학기부터 이어오던 코딩 트레이너 활동도 2025년 1학기를 끝으로 마무리하게 되었다(아래에 나오는 인턴 이슈로).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW캡스톤디자인 기간에 담당했던 실습반은 제대로 챙겨주지 못한 것 같아서 그 부분은 아쉬움으로 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교를 다니는 동안 따로 알바는 하지 않았는데, 나름의 대안이 되어주었고 뿌듯함도 느낄 수 있었던 활동이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 후기는 아래 블로그 글에도 남겨두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1784266280799&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;아주대학교 SW중심대학 코딩 트레이너 후기 (2024-1학기 ~ 2025-1학기)&quot; data-og-description=&quot;2024-1학기부터 2025-1학기까지, 총 3학기 동안 아주대학교 객체지향프로그래밍 및 실습(Java)강의에서 코딩 트레이너로 활동했습니다.앞으로 이 활동을 해보고 싶은 후배들이나, 관심 있는 분들에&quot; data-og-host=&quot;simzard.tistory.com&quot; data-og-source-url=&quot;https://simzard.tistory.com/4&quot; data-og-url=&quot;https://simzard.tistory.com/4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vrZpk/dJMb87gi8es/YHIL7IdQW9pBh8MNAGTlt0/img.png?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/i2s28/dJMb8Xkr9Yg/qyWKLiDgQP9tSpyxSyYbAK/img.png?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/UCeLp/dJMb82eZAHc/dD0tTxj6DnZNJjHK7Oy14K/img.png?width=1064&amp;amp;height=596&amp;amp;face=0_0_1064_596&quot;&gt;&lt;a href=&quot;https://simzard.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://simzard.tistory.com/4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vrZpk/dJMb87gi8es/YHIL7IdQW9pBh8MNAGTlt0/img.png?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/i2s28/dJMb8Xkr9Yg/qyWKLiDgQP9tSpyxSyYbAK/img.png?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/UCeLp/dJMb82eZAHc/dD0tTxj6DnZNJjHK7Oy14K/img.png?width=1064&amp;amp;height=596&amp;amp;face=0_0_1064_596');&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;아주대학교 SW중심대학 코딩 트레이너 후기 (2024-1학기 ~ 2025-1학기)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024-1학기부터 2025-1학기까지, 총 3학기 동안 아주대학교 객체지향프로그래밍 및 실습(Java)강의에서 코딩 트레이너로 활동했습니다.앞으로 이 활동을 해보고 싶은 후배들이나, 관심 있는 분들에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;simzard.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2025년 1학기) SW캡스톤디자인&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b84M45/dJMcaixsg9I/v1Z1gYgcMRxtbnbaMko4kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b84M45/dJMcaixsg9I/v1Z1gYgcMRxtbnbaMko4kK/img.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;1390&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;57.94&quot; data-filename=&quot;blob&quot; style=&quot;width: 57.2683%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b84M45/dJMcaixsg9I/v1Z1gYgcMRxtbnbaMko4kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb84M45%2FdJMcaixsg9I%2Fv1Z1gYgcMRxtbnbaMko4kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;1390&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pDmPL/dJMcacYayYZ/ukc2sd1WkpZKr896QnBspk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pDmPL/dJMcacYayYZ/ukc2sd1WkpZKr896QnBspk/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.5703%;&quot; data-widthpercent=&quot;42.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pDmPL/dJMcacYayYZ/ukc2sd1WkpZKr896QnBspk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpDmPL%2FdJMcacYayYZ%2Fukc2sd1WkpZKr896QnBspk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;오전 4시에 팀원 모두가 답장을 보는&amp;hellip; / 내가 봐도 초췌하다&amp;hellip;&lt;/figcaption&gt;
&lt;/figure&gt;
&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;&lt;b&gt;근태, 근로계약서, 정산, 업무 인수인계&lt;/b&gt; 등 여러 재미있는 기능들이 많아서 개발하는 입장에서도 즐거웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 팀원들이 다들 알바 경험이 많아서, 다 같이 즐기면서 개발할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Ajou Softcon 대회에도 참가했는데, 사실 최우수상(1위)은 일찌감치 포기했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 1등이 정해져 있다고 느낄만큼 압도적인걸 들고온 팀이 있어서&amp;hellip; (윈도우 서버 취약점 분석으로 65,000$ 버그바운티를 받은 팀&amp;hellip; 환율 올랐으니까 더 받았겠네)&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;중간 자랑 타임&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0j09F/dJMcadvZLjx/RbDiVLDtsWkkUgA8xalJE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0j09F/dJMcadvZLjx/RbDiVLDtsWkkUgA8xalJE0/img.png&quot; data-alt=&quot;2024-2학기(3학년), 2025-1학기(4학년) 학업우수자 선정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0j09F/dJMcadvZLjx/RbDiVLDtsWkkUgA8xalJE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0j09F%2FdJMcadvZLjx%2FRbDiVLDtsWkkUgA8xalJE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;530&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2024-2학기(3학년), 2025-1학기(4학년) 학업우수자 선정&lt;/figcaption&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;a href=&quot;https://sw.ajou.ac.kr/sw/introduction/honor03.do&quot;&gt;https://sw.ajou.ac.kr/sw/introduction/honor03.do&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2학년 2학기, 3학년 1학기에 24학점씩 들으며 학점을 망치긴했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 학점을 미리 채워둔 덕분에 3학년 2학기와 4학년 1학기에는 12학점씩만 들으면서 &lt;b&gt;학점 4.5&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2025년 여름방학) 저 또 달려요? - 안랩 인턴 합격&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7YgTe/dJMb991t0pA/l0Sp3NSMtjU26VE6j6PT4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7YgTe/dJMb991t0pA/l0Sp3NSMtjU26VE6j6PT4k/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2285&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.28&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.6988%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7YgTe/dJMb991t0pA/l0Sp3NSMtjU26VE6j6PT4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7YgTe%2FdJMb991t0pA%2Fl0Sp3NSMtjU26VE6j6PT4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2285&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HupqS/dJMcacjv6yR/PPsrqGEk1BKoLmnIqBMCtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HupqS/dJMcacjv6yR/PPsrqGEk1BKoLmnIqBMCtk/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2311&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.72&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.1397%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HupqS/dJMcacjv6yR/PPsrqGEk1BKoLmnIqBMCtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHupqS%2FdJMcacjv6yR%2FPPsrqGEk1BKoLmnIqBMCtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2311&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;당시 상황이 뚜렷하게 기억이 난다. 1차 합격 문자는 명건이랑 같이 교직원 식당에서 밥 먹다가 받았고, / 최종 합격 문자는 배드민턴 과목 기말고사 끝난 뒤 체육관에서 나오고 받았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW캡스톤디자인을 하면서 가장 힘들었던 점은, 동시에 4학년 2학기 인턴도 지원해야 했다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 안랩은 학점연계도 가능했고, 마침 과 후배(나현이)가 상반기 인턴을 하고 있었는데 추천해서 꼭 넣어야겠다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 인턴 시작일이, 종강 바로 다음주부터라 전형 과정이 너무 빡셌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서울로 이사하면서 학교랑 거리도 멀어진 데다, 6/10 Ajou Softcon 대회, 6/12 안랩 인턴 면접이 연달아 잡혀있었고, 중간에 가족 일도 있어서 이때가 진짜 힘들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 나름대로 잘 준비한 덕분에 면접에 합격할 수 있었고, 본의 아니게 1학기가 끝나자마자 곧바로 또 한 번 달리게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2025년 여름방학 ~ 2학기) 안랩 체험형 인턴 6개월(막학기)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loUWO/dJMcacYazfC/9hm1kU9lFTYYGIswZokui1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loUWO/dJMcacYazfC/9hm1kU9lFTYYGIswZokui1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loUWO/dJMcacYazfC/9hm1kU9lFTYYGIswZokui1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloUWO%2FdJMcacYazfC%2F9hm1kU9lFTYYGIswZokui1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8bGf/dJMcagGk8eI/reZ1vO3PYPg8DdBkbIxgx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8bGf/dJMcagGk8eI/reZ1vO3PYPg8DdBkbIxgx0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8bGf/dJMcagGk8eI/reZ1vO3PYPg8DdBkbIxgx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8bGf%2FdJMcagGk8eI%2FreZ1vO3PYPg8DdBkbIxgx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1CrVj/dJMcadbB8Lt/N3h1tiJKKSP5aIitpzeKo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1CrVj/dJMcadbB8Lt/N3h1tiJKKSP5aIitpzeKo0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.559%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1CrVj/dJMcadbB8Lt/N3h1tiJKKSP5aIitpzeKo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1CrVj%2FdJMcadbB8Lt%2FN3h1tiJKKSP5aIitpzeKo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;판교역에서 가까워서 좋았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&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;태도 부분에 대해서는 긍정적인 피드백을 많이 받아서, 이 자세를 계속 가져가면 되겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안랩 체험형 인턴을 하면서는 여러 컨퍼런스랑 행사도 다니면서 나름 회사원 코스프레를 하려고했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;여러 컨퍼런스와 행사 참여&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVuWe0/dJMcabdOa3y/7NaKBK1p8P3Q7cpSpzYPJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVuWe0/dJMcabdOa3y/7NaKBK1p8P3Q7cpSpzYPJK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.4343%; margin-right: 10px;&quot; data-widthpercent=&quot;54.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVuWe0/dJMcabdOa3y/7NaKBK1p8P3Q7cpSpzYPJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVuWe0%2FdJMcabdOa3y%2F7NaKBK1p8P3Q7cpSpzYPJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5FIzY/dJMcaae1dcO/ZBW1mD5pnLKL6XV4wboRX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5FIzY/dJMcaae1dcO/ZBW1mD5pnLKL6XV4wboRX0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;3214&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.4042%;&quot; data-widthpercent=&quot;45.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5FIzY/dJMcaae1dcO/ZBW1mD5pnLKL6XV4wboRX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5FIzY%2FdJMcaae1dcO%2FZBW1mD5pnLKL6XV4wboRX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;3214&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;카카오 컨퍼런스(운좋게 추첨에서 당첨이 되었다) / 안랩 인턴십 당시 사내 개발자 컨퍼런스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FiqVu/dJMcaaF7ODK/UqkPAwCbIExMr1OkcRijq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FiqVu/dJMcaaF7ODK/UqkPAwCbIExMr1OkcRijq0/img.png&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2731&quot; data-origin-width=&quot;2048&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FiqVu/dJMcaaF7ODK/UqkPAwCbIExMr1OkcRijq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFiqVu%2FdJMcaaF7ODK%2FUqkPAwCbIExMr1OkcRijq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0AbGu/dJMcacDWj0G/cI4fUgQ6PkbmlXhJBv02JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0AbGu/dJMcacDWj0G/cI4fUgQ6PkbmlXhJBv02JK/img.png&quot; style=&quot;width: 49.4193%;&quot; data-widthpercent=&quot;50&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2731&quot; data-origin-width=&quot;2048&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0AbGu/dJMcacDWj0G/cI4fUgQ6PkbmlXhJBv02JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0AbGu%2FdJMcacDWj0G%2FcI4fUgQ6PkbmlXhJBv02JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;잡코리아 퇴근 후 밋업 / 밋업 이후 네트워킹 시간에 같은 테이블에서 인턴이라고 말씀드리니까 다들 많은 조언을 해주셨다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;다양한 회사 이벤트&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmJjb2/dJMcacKHNoU/hXMiUKbCMeKqCMTiHnjV6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmJjb2/dJMcacKHNoU/hXMiUKbCMeKqCMTiHnjV6K/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot; data-is-animation=&quot;false&quot; style=&quot;width: 22.9958%; margin-right: 10px;&quot; data-widthpercent=&quot;23.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmJjb2/dJMcacKHNoU/hXMiUKbCMeKqCMTiHnjV6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmJjb2%2FdJMcacKHNoU%2FhXMiUKbCMeKqCMTiHnjV6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2436&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0mIxf/dJMcab52bId/QesOOp7t6HgQknmBh6v9nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0mIxf/dJMcab52bId/QesOOp7t6HgQknmBh6v9nK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.3407%; margin-right: 10px;&quot; data-widthpercent=&quot;38.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0mIxf/dJMcab52bId/QesOOp7t6HgQknmBh6v9nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0mIxf%2FdJMcab52bId%2FQesOOp7t6HgQknmBh6v9nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMEBH/dJMcab52bIh/Hjl1QkzT3y3KrkkRJXJftK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMEBH/dJMcab52bIh/Hjl1QkzT3y3KrkkRJXJftK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.3407%;&quot; data-widthpercent=&quot;38.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMEBH/dJMcab52bIh/Hjl1QkzT3y3KrkkRJXJftK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMEBH%2FdJMcab52bIh%2FHjl1QkzT3y3KrkkRJXJftK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;러닝 열풍 동참&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TMzZ9/dJMcahyqeBx/OKnsMK1Bok0hhK9I9I20O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TMzZ9/dJMcahyqeBx/OKnsMK1Bok0hhK9I9I20O1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.7571%; margin-right: 10px;&quot; data-widthpercent=&quot;60.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TMzZ9/dJMcahyqeBx/OKnsMK1Bok0hhK9I9I20O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTMzZ9%2FdJMcahyqeBx%2FOKnsMK1Bok0hhK9I9I20O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db0Hsh/dJMcah6jEBD/4H4Olu4MzmF6kVEKUb6Ic0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db0Hsh/dJMcah6jEBD/4H4Olu4MzmF6kVEKUb6Ic0/img.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2459&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.0814%;&quot; data-widthpercent=&quot;39.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db0Hsh/dJMcah6jEBD/4H4Olu4MzmF6kVEKUb6Ic0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb0Hsh%2FdJMcah6jEBD%2F4H4Olu4MzmF6kVEKUb6Ic0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;2459&quot;/&gt;&lt;/span&gt;&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SW중심대학 연합 SW페스티벌 참여&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HMePN/dJMcadpa8nV/Ii5ILKbLso07pE84xYqBvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HMePN/dJMcadpa8nV/Ii5ILKbLso07pE84xYqBvk/img.png&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HMePN/dJMcadpa8nV/Ii5ILKbLso07pE84xYqBvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHMePN%2FdJMcadpa8nV%2FIi5ILKbLso07pE84xYqBvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw9VDP/dJMcabSsoDX/wpYlHAYZIjNYVz1DNkoyPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw9VDP/dJMcabSsoDX/wpYlHAYZIjNYVz1DNkoyPk/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw9VDP/dJMcabSsoDX/wpYlHAYZIjNYVz1DNkoyPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw9VDP%2FdJMcabSsoDX%2FwpYlHAYZIjNYVz1DNkoyPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ufVSa/dJMcagTO9BJ/DrRvtwLo6gzdC5dFu5Pbs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ufVSa/dJMcagTO9BJ/DrRvtwLo6gzdC5dFu5Pbs1/img.png&quot; style=&quot;width: 47.4135%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;47.97&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2731&quot; data-origin-width=&quot;2048&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ufVSa/dJMcagTO9BJ/DrRvtwLo6gzdC5dFu5Pbs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FufVSa%2FdJMcagTO9BJ%2FDrRvtwLo6gzdC5dFu5Pbs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PVyQx/dJMcai44J03/CeDBJqcnIspmVZhWTMOLT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PVyQx/dJMcai44J03/CeDBJqcnIspmVZhWTMOLT1/img.jpg&quot; style=&quot;width: 51.4251%; margin-top: 10px;&quot; data-origin-width=&quot;2314&quot; data-origin-height=&quot;2845&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;52.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PVyQx/dJMcai44J03/CeDBJqcnIspmVZhWTMOLT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPVyQx%2FdJMcai44J03%2FCeDBJqcnIspmVZhWTMOLT1%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;2314&quot; height=&quot;2845&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;형모 생각이 나서 전화했는데, 진짜 우연히 형모도 행사장인 도서관을 나가는 중이었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW캡스톤디자인 수상팀들 대상으로 신청을 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경희대학교 국제캠퍼스(영통)에서 행사를 했는데, 같은 팀에서 직장인 2명이 반차를 쓰고 참석하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아쉽게도 무관에 그쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 캠퍼스 분위기를 느끼고 싶어서 그냥 반차 쓰고간건데, 쓰지말걸&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 우연히 군대 동기 형모도 만나고 재밌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;팀 워크샵&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2j7lG/dJMcabdObm3/8bwo9LmKXoopxcSLDd7lj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2j7lG/dJMcabdObm3/8bwo9LmKXoopxcSLDd7lj0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5508%; margin-right: 10px;&quot; data-widthpercent=&quot;33.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2j7lG/dJMcabdObm3/8bwo9LmKXoopxcSLDd7lj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2j7lG%2FdJMcabdObm3%2F8bwo9LmKXoopxcSLDd7lj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDU7RE/dJMcaijMXKq/zYpoWISttX9ikwmn9JEkKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDU7RE/dJMcaijMXKq/zYpoWISttX9ikwmn9JEkKk/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5508%; margin-right: 10px;&quot; data-widthpercent=&quot;33.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDU7RE/dJMcaijMXKq/zYpoWISttX9ikwmn9JEkKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDU7RE%2FdJMcaijMXKq%2FzYpoWISttX9ikwmn9JEkKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yQh0P/dJMcahZrlmX/s4O2MWWLTSzFZ9l7SjMnzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yQh0P/dJMcahZrlmX/s4O2MWWLTSzFZ9l7SjMnzk/img.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;2100&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5755%;&quot; data-widthpercent=&quot;33.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yQh0P/dJMcahZrlmX/s4O2MWWLTSzFZ9l7SjMnzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyQh0P%2FdJMcahZrlmX%2Fs4O2MWWLTSzFZ9l7SjMnzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;2100&quot;/&gt;&lt;/span&gt;&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;황금 연휴 때 돈 받고 쉬기 - 미국 동부 여행(워싱턴DC, 나이아가라, 뉴욕 - 10박 12일)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 2025년 2학기에 꼭 인턴을 하고 있어야겠다고 생각했던 이유 중 하나는 추석 황금연휴 때문이었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아직도 기억나는 게, 고등학교 시절 친구들끼리 &quot;2025년 이맘때는 무조건 일하고 있어야 한다&quot;고 이야기했던 기억이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 기간을 백수로 보내고 싶지는 않았다. 돈을 받으면서 쉬고 싶었고, 안랩 인턴 덕분에 그 목표를 이룰 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXxSgO/dJMcahd89Rt/nYSD9fVh7BcqeLedVrHzUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXxSgO/dJMcahd89Rt/nYSD9fVh7BcqeLedVrHzUK/img.png&quot; width=&quot;356&quot; height=&quot;420&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;1214&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.4884%; margin-right: 10px;&quot; data-widthpercent=&quot;40.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXxSgO/dJMcahd89Rt/nYSD9fVh7BcqeLedVrHzUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXxSgO%2FdJMcahd89Rt%2FnYSD9fVh7BcqeLedVrHzUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;1214&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yv0Ei/dJMcafndItj/39cGr7eckEv7HS52LOIAc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yv0Ei/dJMcafndItj/39cGr7eckEv7HS52LOIAc1/img.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;440&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.3501%;&quot; data-widthpercent=&quot;59.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yv0Ei/dJMcafndItj/39cGr7eckEv7HS52LOIAc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyv0Ei%2FdJMcafndItj%2F39cGr7eckEv7HS52LOIAc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;진짜 다시봐도 엄청난 연휴였다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SXN8R/dJMcah6p80E/kk9AtTKDA2e1kwQDru5Z30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SXN8R/dJMcah6p80E/kk9AtTKDA2e1kwQDru5Z30/img.png&quot; style=&quot;width: 32.9402%; margin-right: 10px;&quot; data-widthpercent=&quot;33.72&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1380&quot; data-origin-width=&quot;790&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SXN8R/dJMcah6p80E/kk9AtTKDA2e1kwQDru5Z30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSXN8R%2FdJMcah6p80E%2Fkk9AtTKDA2e1kwQDru5Z30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;1380&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQqqe/dJMcac4UPZI/3IImKig2K59u1MUOCphiZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQqqe/dJMcac4UPZI/3IImKig2K59u1MUOCphiZ1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;3641&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.3658%; margin-right: 10px;&quot; data-widthpercent=&quot;33.14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQqqe/dJMcac4UPZI/3IImKig2K59u1MUOCphiZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQqqe%2FdJMcac4UPZI%2F3IImKig2K59u1MUOCphiZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;3641&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl15tP/dJMcac4UPZN/Jk7pq4l0pHf5xRkUpSVfZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl15tP/dJMcac4UPZN/Jk7pq4l0pHf5xRkUpSVfZ0/img.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;2517&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.3711%;&quot; data-widthpercent=&quot;33.14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl15tP/dJMcac4UPZN/Jk7pq4l0pHf5xRkUpSVfZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl15tP%2FdJMcac4UPZN%2FJk7pq4l0pHf5xRkUpSVfZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;2517&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;워싱턴DC 내셔널 갤러리 오브 아트 - 모네, 양산을 든 여인 / 워싱턴DC 국회의사당 앞 / 나이아가라 폭포뷰 호텔&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuGj8/dJMcacYgL6s/VU6qtc5kmSsR2swJ9y50g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuGj8/dJMcacYgL6s/VU6qtc5kmSsR2swJ9y50g1/img.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1434&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.4047%; margin-right: 10px;&quot; data-widthpercent=&quot;36.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuGj8/dJMcacYgL6s/VU6qtc5kmSsR2swJ9y50g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuuGj8%2FdJMcacYgL6s%2FVU6qtc5kmSsR2swJ9y50g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;1434&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XXnTS/dJMcahrNPRH/i0kjYJ3mdyp27nbY1jSieK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XXnTS/dJMcahrNPRH/i0kjYJ3mdyp27nbY1jSieK/img.jpg&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2096&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.69%; margin-right: 10px;&quot; data-widthpercent=&quot;27.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XXnTS/dJMcahrNPRH/i0kjYJ3mdyp27nbY1jSieK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXXnTS%2FdJMcahrNPRH%2Fi0kjYJ3mdyp27nbY1jSieK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;2096&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwM2QM/dJMcac4UP0I/qkxnoA5aiXC7eYNZuGwqv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwM2QM/dJMcac4UP0I/qkxnoA5aiXC7eYNZuGwqv1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.5824%;&quot; data-widthpercent=&quot;36.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwM2QM/dJMcac4UP0I/qkxnoA5aiXC7eYNZuGwqv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwM2QM%2FdJMcac4UP0I%2FqkxnoA5aiXC7eYNZuGwqv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;메디슨 스퀘어 가든 - 뉴욕 닉스 NBA 프리시즌 경기(이 시즌에 우승할 줄은 몰랐다) / 뉴욕 양키 스타디움 - MLB 포스트시즌 / 뉴욕 센트럴파크&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;p data-ke-size=&quot;size16&quot;&gt;시차 적응이 안 돼서 잠와 죽는 줄 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 제대로 해외여행을 다녀온 덕분인지, 지금까지도 딱히 해외여행 생각이 나지 않는다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;콘서트(잔나비, 오아시스, 한로로)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/truvj/dJMcadiwGaP/zSxfzVpES1qsiLq9lNXa0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/truvj/dJMcadiwGaP/zSxfzVpES1qsiLq9lNXa0K/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/truvj/dJMcadiwGaP/zSxfzVpES1qsiLq9lNXa0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftruvj%2FdJMcadiwGaP%2FzSxfzVpES1qsiLq9lNXa0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be3sgR/dJMcajiHyFD/o4uREJFnNicBk7Sz7T4DqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be3sgR/dJMcajiHyFD/o4uREJFnNicBk7Sz7T4DqK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be3sgR/dJMcajiHyFD/o4uREJFnNicBk7Sz7T4DqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe3sgR%2FdJMcajiHyFD%2Fo4uREJFnNicBk7Sz7T4DqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;잔나비 앵콜 콘서트 &amp;lsquo;모든소년소녀들 2125&amp;rsquo;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brHGMK/dJMcaccMOvN/kDWkzsKWmj4nSoFuMFmGT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brHGMK/dJMcaccMOvN/kDWkzsKWmj4nSoFuMFmGT1/img.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1943&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.2267%; margin-right: 10px;&quot; data-widthpercent=&quot;46.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brHGMK/dJMcaccMOvN/kDWkzsKWmj4nSoFuMFmGT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrHGMK%2FdJMcaccMOvN%2FkDWkzsKWmj4nSoFuMFmGT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;1943&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Y6AP/dJMcag7i2sM/k0BkyokscsLbWMl1p1cVW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Y6AP/dJMcag7i2sM/k0BkyokscsLbWMl1p1cVW0/img.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2896&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.6118%;&quot; data-widthpercent=&quot;53.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Y6AP/dJMcag7i2sM/k0BkyokscsLbWMl1p1cVW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Y6AP%2FdJMcag7i2sM%2Fk0BkyokscsLbWMl1p1cVW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;2896&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;오아시스 콘서트. 반반차 쓰고 고양까지 갔다. GTX는 혁명이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLwZIx/dJMcabZj1E5/hBvSR2070F81pKMNZR9uf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLwZIx/dJMcabZj1E5/hBvSR2070F81pKMNZR9uf0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.477%; margin-right: 10px;&quot; data-widthpercent=&quot;57.14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLwZIx/dJMcabZj1E5/hBvSR2070F81pKMNZR9uf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLwZIx%2FdJMcabZj1E5%2FhBvSR2070F81pKMNZR9uf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJzrPx/dJMcacRlqYD/Hl13s0CgTyLlsiRclZiLT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJzrPx/dJMcacRlqYD/Hl13s0CgTyLlsiRclZiLT1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;3641&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.3616%;&quot; data-widthpercent=&quot;42.86&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJzrPx/dJMcacRlqYD/Hl13s0CgTyLlsiRclZiLT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJzrPx%2FdJMcacRlqYD%2FHl13s0CgTyLlsiRclZiLT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;3641&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;한로로 자몽살구클럽 콘서트. 한로로 붐은 왔다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년 군대를 다녀온 뒤에 코로나가 끝나고 복학하면서 콘서트도 다니기로 마음먹었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 막상 수원에서 가기엔 공연장도 멀고 티켓값도 부담스러워서 그냥 그렇게 흘러갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 서울로 이사 온 뒤, 마침 가고 싶었던 콘서트들의 티켓팅이 연달아 열리면서 보고 싶었던 공연을 하나씩 다 다녀올 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 한로로 콘서트에서는, 3학년 때 매일 도서관을 다니며 밤늦게 집으로 돌아오던 길에 듣던 &amp;lsquo;거울&amp;rsquo;을 라이브로 듣는데, 그때 생각이 많이 났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인턴 끝, 대학 생활 끝&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSRRnI/dJMcagM60cR/phiylaSMHBsh4nt5udzBK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSRRnI/dJMcagM60cR/phiylaSMHBsh4nt5udzBK0/img.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;1094&quot; data-is-animation=&quot;false&quot; width=&quot;426&quot; height=&quot;764&quot; style=&quot;width: 42.1501%; margin-right: 10px;&quot; data-widthpercent=&quot;42.65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSRRnI/dJMcagM60cR/phiylaSMHBsh4nt5udzBK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSRRnI%2FdJMcagM60cR%2FphiylaSMHBsh4nt5udzBK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yxEVR/dJMcagGk90T/lw4Ti3RzxHi3mmm0af60T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yxEVR/dJMcagGk90T/lw4Ti3RzxHi3mmm0af60T1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.6884%;&quot; data-widthpercent=&quot;57.35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yxEVR/dJMcagGk90T/lw4Ti3RzxHi3mmm0af60T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyxEVR%2FdJMcagGk90T%2Flw4Ti3RzxHi3mmm0af60T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;판교 이가네양꼬치를 접한 이후로 양꼬치 + 맥주는 최애 회식 메뉴가 되었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 안랩 인턴의 끝과 함께 내 대학생활도 끝났다는 것을 수료증을 받으면서 실감했다. 막학기 종강도 같이 한 것이구나&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한 가지 아쉬운 부분이 있다면, 그냥 기숙사 생활이나 자취를 하면서 좀 더 대학생활을 마지막까지 즐겼어야 했나? 싶기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막상 회사생활에 집중한다고 또 못 즐겼을 수도 있지만.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 사실 회사 생활 자체보다, 판교로 출퇴근하며 &lt;b&gt;9호선과 신분당선 지옥철&lt;/b&gt;에서 겪었던 기 빨림이 더 힘들었다(직장인 분들 리스펙합니다&amp;hellip;).&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2026년 시작) 취준 정병...&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwRvUq/dJMcaaTz9il/9mYngdiSgbGF4zOHTn2akK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwRvUq/dJMcaaTz9il/9mYngdiSgbGF4zOHTn2akK/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.4219%; margin-right: 10px;&quot; data-widthpercent=&quot;31.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwRvUq/dJMcaaTz9il/9mYngdiSgbGF4zOHTn2akK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwRvUq%2FdJMcaaTz9il%2F9mYngdiSgbGF4zOHTn2akK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qt0V7/dJMcaasywRm/7SeCWBEiHYJOh3NSFiTATK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qt0V7/dJMcaasywRm/7SeCWBEiHYJOh3NSFiTATK/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2279&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;27.33&quot; data-filename=&quot;blob&quot; style=&quot;width: 26.6976%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qt0V7/dJMcaasywRm/7SeCWBEiHYJOh3NSFiTATK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqt0V7%2FdJMcaasywRm%2F7SeCWBEiHYJOh3NSFiTATK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2279&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbciWG/dJMcag7i2B2/pQjtS02Ifd5zXqrYxObUwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbciWG/dJMcag7i2B2/pQjtS02Ifd5zXqrYxObUwK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.5576%;&quot; data-widthpercent=&quot;41.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbciWG/dJMcag7i2B2/pQjtS02Ifd5zXqrYxObUwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbciWG%2FdJMcag7i2B2%2FpQjtS02Ifd5zXqrYxObUwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;캡디 후반부에 이사를 하게 되어서 남은 기간 동안 고통 받았다 / 왜 중앙대는 안돼요... / 중앙대 앞 할리스 2층 뷰&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡스톤디자인 기간(2025년 1학기)에 본가가 수원에서 서울, 중앙대 근처로 이사를 갔었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안랩 인턴 중에는 못 느꼈는데, 막상 백수가 되니까 중앙대 앞을 지나다니며 살짝 기분이 이상했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대학 입시 때 1지망 학교여서 그런가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*TMI로 입시 때 중앙대, 건국대, 동국대, 숭실대, 아주대, 서울과기대 컴공으로 6학종 수시를 넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주대학교 중앙도서관 커뮤니티라운지(일명 커라)에서 코딩, 공부할 때는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 다른 열람실과 다르게 커라가 노트북을 사용할 수 있다보니까, 소프트웨어학과 학우가 많아서 묘한 동질감이 느껴졌는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흑석에서는 구립도서관에서 하다보니 좀 외롭기도했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구립도서관에서 취준하는 사람은 나혼자라 더 외로웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 기간 동안 만나는 사람이 1주일에 4명을 안넘어 갔었다(가족 포함).&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2026년 2월) 넷마블 채용전환형 인턴 시작&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나름 한 달 정도 취준정병을 겪다가, 2025년 하반기에 넣었던 기업들은 다 떨어지고&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;넷마블은 솔직히 아예 기대를 하지 않았었는데, 갑자기 서류에 합격해서 AI역량검사를 보라고 하는 연락이 오고, 역량검사 이후에는 면접 보러 오라는 메일이 와서 좀 당황스러웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 기회가 주어진 만큼 정말 열심히 준비했고, 후회없이 면접을 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 이렇게까지 면접을 잘 봤는데도 떨어지면 얼마나 더 잘 봐야하지 싶을 정도로 나의 입장에서는 후회가 없었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHRg2Z/dJMcaa0k8V0/RIsSUCYiV5WlHKBS9Zobp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHRg2Z/dJMcaa0k8V0/RIsSUCYiV5WlHKBS9Zobp0/img.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;1888&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.4642%; margin-right: 10px;&quot; data-widthpercent=&quot;46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHRg2Z/dJMcaa0k8V0/RIsSUCYiV5WlHKBS9Zobp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHRg2Z%2FdJMcaa0k8V0%2FRIsSUCYiV5WlHKBS9Zobp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;1888&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baxy63/dJMcaa0k8Wg/BEImdV7WJnlG3IbXU0wAd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baxy63/dJMcaa0k8Wg/BEImdV7WJnlG3IbXU0wAd0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.3743%;&quot; data-widthpercent=&quot;54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baxy63/dJMcaa0k8Wg/BEImdV7WJnlG3IbXU0wAd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaxy63%2FdJMcaa0k8Wg%2FBEImdV7WJnlG3IbXU0wAd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;사실 채용검진 이후의 최종 인턴십 안내 메일인데, 채용검진에서도 떨어질까봐 살짝 불안했다. 진짜 쫄보인가. / 구로에서 제일 높은 건물이어서 너무 잘보였다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WSu6g/dJMcaftOjQQ/HrKVX0NANbnUwoArgDpUT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WSu6g/dJMcaftOjQQ/HrKVX0NANbnUwoArgDpUT1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WSu6g/dJMcaftOjQQ/HrKVX0NANbnUwoArgDpUT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWSu6g%2FdJMcaftOjQQ%2FHrKVX0NANbnUwoArgDpUT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEdH9t/dJMcaa7byrR/k0mFnSlLWuob0y7KkF48n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEdH9t/dJMcaa7byrR/k0mFnSlLWuob0y7KkF48n0/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEdH9t/dJMcaa7byrR/k0mFnSlLWuob0y7KkF48n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEdH9t%2FdJMcaa7byrR%2Fk0mFnSlLWuob0y7KkF48n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;안랩 첫 출근 때도 그렇고, 첫 날에는 거의 잠을 못 자고 간다. / 노란색 목걸이를 인턴 기간 동안 차고 다녔다. 병아리가 된 느낌&amp;hellip;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mrgu6/dJMcajplI4I/oKtgd5VN2VqfuW4tJQrd2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mrgu6/dJMcajplI4I/oKtgd5VN2VqfuW4tJQrd2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mrgu6/dJMcajplI4I/oKtgd5VN2VqfuW4tJQrd2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMrgu6%2FdJMcajplI4I%2FoKtgd5VN2VqfuW4tJQrd2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;191&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인턴십 면접을 본 이후 1주일 동안은 잠도 제대로 못 자고 살도 계속 빠지는, 또 한 번의 &lt;b&gt;'정병'&lt;/b&gt; 기간을 거쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 결국 인턴십에 합격했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 안랩 인턴 이후 실업급여를 받으려면 한 달 정도 아르바이트 같은 걸로 조건을 채워야 했는데, 그 공백을 넷마블 인턴으로 자연스럽게 채울 수 있어서 다행이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안랩은 체험형 인턴이었지만, 넷마블은 채용전환형 인턴이었기 때문에 임하는 마음가짐 자체가 달랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'올인하자'&lt;/b&gt;는 마음으로, 주말에도 온통 과제 생각만 하며 지냈다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약속도 잡지 않고, 주말에는 구립도서관에 가서 공부했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;넷마블 인턴 기간 동안은 AI를 최대한 활용하면서 정말 많이 성장할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기들과 함께 열심히 달리다 보니 시간도 유독 빨리 갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인생에서 가장 빠르게 지나간 8주였다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2026년 2월) 졸업식&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7dzNS/dJMcaijMY2Y/wCnkda9PQnhC5Pu53UMMG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7dzNS/dJMcaijMY2Y/wCnkda9PQnhC5Pu53UMMG0/img.png&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7dzNS/dJMcaijMY2Y/wCnkda9PQnhC5Pu53UMMG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7dzNS%2FdJMcaijMY2Y%2FwCnkda9PQnhC5Pu53UMMG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FyCrq/dJMcabdObOk/e0Ro838kapKeKGy6cei9jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FyCrq/dJMcabdObOk/e0Ro838kapKeKGy6cei9jk/img.png&quot; style=&quot;width: 32.559%; margin-right: 10px;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FyCrq/dJMcabdObOk/e0Ro838kapKeKGy6cei9jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyCrq%2FdJMcabdObOk%2Fe0Ro838kapKeKGy6cei9jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7iaaK/dJMcaic5M6P/Taep2thKXK8ckX3xxTWIP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7iaaK/dJMcaic5M6P/Taep2thKXK8ckX3xxTWIP1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.559%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7iaaK/dJMcaic5M6P/Taep2thKXK8ckX3xxTWIP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7iaaK%2FdJMcaic5M6P%2FTaep2thKXK8ckX3xxTWIP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;최종 전환이 되어서 왔으면 조금 더 마음이 편했겠지만, 그래도 주어진 기회를 잡아보자는 동기부여를 얻고 갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2026년 4월) 실업급여 요건 충족, 진짜 백수&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nbhbs/dJMcabLOWg9/nZkSLGsIeA0JeC7CRCaCD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nbhbs/dJMcabLOWg9/nZkSLGsIeA0JeC7CRCaCD0/img.png&quot; data-alt=&quot;8주 간의 넷마블 인턴 생활&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nbhbs/dJMcabLOWg9/nZkSLGsIeA0JeC7CRCaCD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNbhbs%2FdJMcabLOWg9%2FnZkSLGsIeA0JeC7CRCaCD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;456&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;8주 간의 넷마블 인턴 생활&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c69uYV/dJMcagGlaJj/f0O6EGLvwqkWwjFskKkuUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c69uYV/dJMcagGlaJj/f0O6EGLvwqkWwjFskKkuUK/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.5181%; margin-right: 10px;&quot; data-widthpercent=&quot;36.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c69uYV/dJMcagGlaJj/f0O6EGLvwqkWwjFskKkuUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc69uYV%2FdJMcagGlaJj%2Ff0O6EGLvwqkWwjFskKkuUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgt8vx/dJMcahLVAw9/zzzZ7RloSoxzenHx6ZXe5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgt8vx/dJMcahLVAw9/zzzZ7RloSoxzenHx6ZXe5K/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.5181%; margin-right: 10px;&quot; data-widthpercent=&quot;36.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgt8vx/dJMcahLVAw9/zzzZ7RloSoxzenHx6ZXe5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgt8vx%2FdJMcahLVAw9%2FzzzZ7RloSoxzenHx6ZXe5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN7xUJ/dJMcahLVAxj/FLVV33QUSiwUYKYJNtQnB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN7xUJ/dJMcahLVAxj/FLVV33QUSiwUYKYJNtQnB1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;3641&quot; data-is-animation=&quot;false&quot; style=&quot;width: 26.641%;&quot; data-widthpercent=&quot;27.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN7xUJ/dJMcahLVAxj/FLVV33QUSiwUYKYJNtQnB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN7xUJ%2FdJMcahLVAxj%2FFLVV33QUSiwUYKYJNtQnB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;3641&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;온 세상이 토스다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷마블 인턴 기간이 끝나고&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;안랩 6개월 + 넷마블 인턴 8주&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;p data-ke-size=&quot;size16&quot;&gt;인턴 전환 결과까지는 1주일 정도 걸린다고 들었는데, 이 기간 동안은 정말 오만 상상을 다 했었다. 떨어지면 어떨지, 뭘 할지 등등&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 인턴 끝나고 나니까 벚꽃이 만개하고 날씨도 좋아서 열심히 돌아다녔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Duc9N/dJMcaixlzqv/rp7kwirygfkMvdkWN25KuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Duc9N/dJMcaixlzqv/rp7kwirygfkMvdkWN25KuK/img.png&quot; data-alt=&quot;흑석동 주민이 추천하는 야경 명소 - 용양봉저정 공원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Duc9N/dJMcaixlzqv/rp7kwirygfkMvdkWN25KuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDuc9N%2FdJMcaixlzqv%2Frp7kwirygfkMvdkWN25KuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;362&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;흑석동 주민이 추천하는 야경 명소 - 용양봉저정 공원&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc2xeD/dJMb991t1ZC/f5Ig1JjHRCunJDTclE3WY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc2xeD/dJMb991t1ZC/f5Ig1JjHRCunJDTclE3WY0/img.png&quot; data-alt=&quot;동작구에 사육신공원이 있는데, 홍보 차원에서 무료 관람을 신청 받았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc2xeD/dJMb991t1ZC/f5Ig1JjHRCunJDTclE3WY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc2xeD%2FdJMb991t1ZC%2Ff5Ig1JjHRCunJDTclE3WY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;423&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동작구에 사육신공원이 있는데, 홍보 차원에서 무료 관람을 신청 받았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwFUK/dJMcadbCatW/HkanHJhatJU9miR2Fvwzc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwFUK/dJMcadbCatW/HkanHJhatJU9miR2Fvwzc0/img.png&quot; style=&quot;width: 17.8033%; margin-right: 10px;&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2622&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;18.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwFUK/dJMcadbCatW/HkanHJhatJU9miR2Fvwzc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwFUK%2FdJMcadbCatW%2FHkanHJhatJU9miR2Fvwzc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;2622&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WBF4A/dJMcajplJhW/3xkZAYsSLKjChEFqaSQzF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WBF4A/dJMcajplJhW/3xkZAYsSLKjChEFqaSQzF1/img.png&quot; style=&quot;width: 50.8474%; margin-right: 10px;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1559&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;52.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WBF4A/dJMcajplJhW/3xkZAYsSLKjChEFqaSQzF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWBF4A%2FdJMcajplJhW%2F3xkZAYsSLKjChEFqaSQzF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1559&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUoWH/dJMcabEVnT1/XVqXPOtbWz8KPYINKHLnK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUoWH/dJMcabEVnT1/XVqXPOtbWz8KPYINKHLnK0/img.png&quot; style=&quot;width: 29.0264%;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;29.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUoWH/dJMcabEVnT1/XVqXPOtbWz8KPYINKHLnK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUoWH%2FdJMcabEVnT1%2FXVqXPOtbWz8KPYINKHLnK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;취소표로 용아맥 겨우 잡았다 / 영화 시작 전 나왔던 반가운(?) 넷마블 로고&amp;hellip; / 왜 용아맥용아맥하는지 알겠더라&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwBNn/dJMcahyqgDL/icq8mVDz375jkcjQmNNz9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwBNn/dJMcahyqgDL/icq8mVDz375jkcjQmNNz9K/img.png&quot; data-alt=&quot;4D &amp;amp;lsquo;입체기동장치관&amp;amp;rsquo;에서 땅울림, 조사병단 체험&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwBNn/dJMcahyqgDL/icq8mVDz375jkcjQmNNz9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlwBNn%2FdJMcahyqgDL%2Ficq8mVDz375jkcjQmNNz9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;607&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4D &amp;lsquo;입체기동장치관&amp;rsquo;에서 땅울림, 조사병단 체험&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;p data-ke-size=&quot;size16&quot;&gt;진격의 거인을 선택한 게 하나도 후회되지 않았다. 마지막 시즌은 영화관에서 봤는데, 정말 최고의 선택이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;진격의 거인은 역사가 맞다&amp;hellip;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;(2026년 4월) 최종합격 및 신입사원 입사&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba9nwF/dJMcadphF2d/E8NUTeKM5rjAngsddDihbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba9nwF/dJMcadphF2d/E8NUTeKM5rjAngsddDihbk/img.png&quot; data-alt=&quot;다시 출근하게 되어서 너무 좋았다(이제 구로 사옥은 팔렸고, 2028년 과천 신사옥으로 이전한다).&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba9nwF/dJMcadphF2d/E8NUTeKM5rjAngsddDihbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba9nwF%2FdJMcadphF2d%2FE8NUTeKM5rjAngsddDihbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;535&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다시 출근하게 되어서 너무 좋았다(이제 구로 사옥은 팔렸고, 2028년 과천 신사옥으로 이전한다).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 1주일의 기다림 끝에 &lt;b&gt;최종합격 &lt;/b&gt;소식을 듣게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사 입장에서는 3년 만의 기술직군 신입이었고, 역시나 입사하고 보니 내가 막내였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종합격 소식을 듣기 직전에는 다른 기업의 AI 역량검사를 보던 중이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전화가 한 통 와 있길래 살짝 기대를 했는데, 역량검사 설문이 끝나자마자 '잠깐 쉴게요' 버튼을 누르고 핸드폰 알림을 확인해보니 합격 메일이 와 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보던 역량검사는 곧바로 닫아버리고, 마침 부모님이 집에 계셔서 함께 합격의 기쁨을 나눴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그날은 날씨도 유독 좋았고, 세상이 아름다워 보였다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eh2usn/dJMcaazj8qk/7Aqi5UHgz57pZ3ZekkkTb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eh2usn/dJMcaazj8qk/7Aqi5UHgz57pZ3ZekkkTb0/img.png&quot; style=&quot;width: 50.0436%; margin-right: 10px;&quot; width=&quot;371&quot; height=&quot;482&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;1152&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eh2usn/dJMcaazj8qk/7Aqi5UHgz57pZ3ZekkkTb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feh2usn%2FdJMcaazj8qk%2F7Aqi5UHgz57pZ3ZekkkTb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8F8uO/dJMcaazj8qJ/6UjgcLPcM7YZkspm070En1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8F8uO/dJMcaazj8qJ/6UjgcLPcM7YZkspm070En1/img.png&quot; style=&quot;width: 48.795%;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8F8uO/dJMcaazj8qJ/6UjgcLPcM7YZkspm070En1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8F8uO%2FdJMcaazj8qJ%2F6UjgcLPcM7YZkspm070En1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JAiP8/dJMcaazj8qN/2tCNtnOCMTh2Z9q46x6aQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JAiP8/dJMcaazj8qN/2tCNtnOCMTh2Z9q46x6aQk/img.png&quot; style=&quot;width: 25.1184%; margin-right: 10px; margin-top: 10px;&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;25.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JAiP8/dJMcaazj8qN/2tCNtnOCMTh2Z9q46x6aQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJAiP8%2FdJMcaazj8qN%2F2tCNtnOCMTh2Z9q46x6aQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRLIM3/dJMcajiNVyi/Hf1X7Ers2LyZTLSArDKFh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRLIM3/dJMcajiNVyi/Hf1X7Ers2LyZTLSArDKFh0/img.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1436&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.7848%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;45.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRLIM3/dJMcajiNVyi/Hf1X7Ers2LyZTLSArDKFh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRLIM3%2FdJMcajiNVyi%2FHf1X7Ers2LyZTLSArDKFh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1436&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhvtd5/dJMcadvT2lZ/FoL02imoQylOZCKZbtYAkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhvtd5/dJMcadvT2lZ/FoL02imoQylOZCKZbtYAkK/img.png&quot; style=&quot;width: 27.7739%; margin-top: 10px;&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2412&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;28.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhvtd5/dJMcadvT2lZ/FoL02imoQylOZCKZbtYAkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhvtd5%2FdJMcadvT2lZ%2FFoL02imoQylOZCKZbtYAkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;2412&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;꽃다발과 선물을 집으로 보내주셨는데 진짜 뽕차더라...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd9B5r/dJMcahrHohw/oVD6gh5dlokcbPJOKnOTJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd9B5r/dJMcahrHohw/oVD6gh5dlokcbPJOKnOTJ0/img.png&quot; data-alt=&quot;생각보다 빠르게 달성했다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd9B5r/dJMcahrHohw/oVD6gh5dlokcbPJOKnOTJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd9B5r%2FdJMcahrHohw%2FoVD6gh5dlokcbPJOKnOTJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;212&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;282&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2026년 4월 ~ 7월) 수습기간&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EbdqD/dJMcagl2kcV/YKtp0fVUREbmlhgkBkVCE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EbdqD/dJMcagl2kcV/YKtp0fVUREbmlhgkBkVCE1/img.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;1154&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; style=&quot;width: 35.7344%; margin-right: 10px;&quot; data-widthpercent=&quot;36.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EbdqD/dJMcagl2kcV/YKtp0fVUREbmlhgkBkVCE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEbdqD%2FdJMcagl2kcV%2FYKtp0fVUREbmlhgkBkVCE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1074&quot; height=&quot;1154&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6MnZh/dJMcacquwo2/vM1rnGZ1o6UHS2iz1IAe90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6MnZh/dJMcacquwo2/vM1rnGZ1o6UHS2iz1IAe90/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;29.48&quot; style=&quot;width: 28.7936%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6MnZh/dJMcacquwo2/vM1rnGZ1o6UHS2iz1IAe90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6MnZh%2FdJMcacquwo2%2FvM1rnGZ1o6UHS2iz1IAe90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejUl9t/dJMcafU2DxH/hZO7alHoDHNe62BWxtkNSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejUl9t/dJMcafU2DxH/hZO7alHoDHNe62BWxtkNSk/img.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;1244&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.1491%;&quot; data-widthpercent=&quot;33.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejUl9t/dJMcafU2DxH/hZO7alHoDHNe62BWxtkNSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejUl9t%2FdJMcafU2DxH%2FhZO7alHoDHNe62BWxtkNSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1074&quot; height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;입사하고 '몬길: STAR DIVE' 론칭이 바로 있었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FqCwM/dJMcafndHvN/ltPK81Zp8Yq9grs79iYAVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FqCwM/dJMcafndHvN/ltPK81Zp8Yq9grs79iYAVK/img.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2306&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.944%; margin-right: 10px;&quot; data-widthpercent=&quot;41.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FqCwM/dJMcafndHvN/ltPK81Zp8Yq9grs79iYAVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFqCwM%2FdJMcafndHvN%2FltPK81Zp8Yq9grs79iYAVK%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;1206&quot; height=&quot;2306&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5S4h4/dJMcaf8r8CT/ephtzDaVfEO0cTymwKQ6bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5S4h4/dJMcaf8r8CT/ephtzDaVfEO0cTymwKQ6bk/img.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1428&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.8946%;&quot; data-widthpercent=&quot;58.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5S4h4/dJMcaf8r8CT/ephtzDaVfEO0cTymwKQ6bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5S4h4%2FdJMcaf8r8CT%2FephtzDaVfEO0cTymwKQ6bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1056&quot; height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;학교 다닐 때는 한 번도 안왔는데... 졸업하니까 바로 오는 잔나비 / '꿈과 책과 힘과 벽'도 새벽 도서관에서 집으로 돌아가는 길에 정말 많이 들었는데, 학교 축제에서 들으니 그때 생각이 많이 났다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qpYrf/dJMcaa0q6kt/RKjSz4Kf88Ou32SxZFrPR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qpYrf/dJMcaa0q6kt/RKjSz4Kf88Ou32SxZFrPR1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5561%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qpYrf/dJMcaa0q6kt/RKjSz4Kf88Ou32SxZFrPR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqpYrf%2FdJMcaa0q6kt%2FRKjSz4Kf88Ou32SxZFrPR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUddvI/dJMcajprw5e/lbu7jlHqxSDIi0BkY6zF1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUddvI/dJMcajprw5e/lbu7jlHqxSDIi0BkY6zF1K/img.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1420&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.7129%; margin-right: 10px;&quot; data-widthpercent=&quot;33.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUddvI/dJMcajprw5e/lbu7jlHqxSDIi0BkY6zF1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUddvI%2FdJMcajprw5e%2Flbu7jlHqxSDIi0BkY6zF1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJepb0/dJMcaidb8WI/TKYFeqktPXozmEpv2wNlak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJepb0/dJMcaidb8WI/TKYFeqktPXozmEpv2wNlak/img.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1428&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4081%;&quot; data-widthpercent=&quot;33.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJepb0/dJMcaidb8WI/TKYFeqktPXozmEpv2wNlak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJepb0%2FdJMcaidb8WI%2FTKYFeqktPXozmEpv2wNlak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;넷마블 개발자 포럼 후드티 굿즈 / 사내 카페(ㅋㅋ다방) 망고빙수 / 동기들이랑 같이 찍은 포토이즘&amp;amp;넷마블 콜라보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채용전환형 인턴에서 정규직으로 전환된 이후에도 3개월간의 수습 기간을 거쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기간 동안 간단한 게임을 직접 개발해보고, 사내 SDK와 플랫폼을 연동하는 온보딩 프로젝트를 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 테스트용이었지만 실제로 구글 플레이에 올려보기까지 했는데, 그 과정 자체가 정말 재미있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 게임 산업의 구조, 게임 퍼블리싱 사업, 플랫폼과 SDK, 마켓 정책 등 글로벌 게임을 운영하기 위한 대규모 시스템이 어떻게 구축되어 있는지를 배울 수 있었던 값진 경험이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;졸업하고 취업한 뒤 다시 학교를 찾으니 기분이 색달랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 학교 앞에 살던 시절, 도서관에서 집으로 걸어가던 그 길을 자주 듣던 노래를 들으며 다시 걸으니 감회가 새로웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 수습 기간 동안 여러 컨퍼런스와 사내 AI 교육에도 참석하면서 많은 인사이트를 얻었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb4hJA/dJMcahefsb8/2FrstFnHmBakDOBhdJsRLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb4hJA/dJMcahefsb8/2FrstFnHmBakDOBhdJsRLK/img.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;1046&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.0837%; margin-right: 10px;&quot; data-widthpercent=&quot;57.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb4hJA/dJMcahefsb8/2FrstFnHmBakDOBhdJsRLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb4hJA%2FdJMcahefsb8%2F2FrstFnHmBakDOBhdJsRLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;1046&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc4kv3/dJMcabSyzhz/ujtXgWb0DFInRiL0jOW1JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc4kv3/dJMcabSyzhz/ujtXgWb0DFInRiL0jOW1JK/img.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;1430&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.7549%;&quot; data-widthpercent=&quot;42.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc4kv3/dJMcabSyzhz/ujtXgWb0DFInRiL0jOW1JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc4kv3%2FdJMcabSyzhz%2FujtXgWb0DFInRiL0jOW1JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;1430&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8YuKV/dJMcaf8r3Pd/aFRF2e9xj6JcfU6KY03lc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8YuKV/dJMcaf8r3Pd/aFRF2e9xj6JcfU6KY03lc1/img.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;976&quot; data-is-animation=&quot;false&quot; style=&quot;width: 36.1235%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;36.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8YuKV/dJMcaf8r3Pd/aFRF2e9xj6JcfU6KY03lc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8YuKV%2FdJMcaf8r3Pd%2FaFRF2e9xj6JcfU6KY03lc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgiPVh/dJMcagGrsMW/YHOmJ0kodZYoHfGLsnUK1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgiPVh/dJMcagGrsMW/YHOmJ0kodZYoHfGLsnUK1k/img.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1002&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.0546%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;35.89&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgiPVh/dJMcagGrsMW/YHOmJ0kodZYoHfGLsnUK1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgiPVh%2FdJMcagGrsMW%2FYHOmJ0kodZYoHfGLsnUK1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;1002&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byMpmg/dJMb99NV2nv/4kJfYSXx3XJgPafIX58rgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byMpmg/dJMb99NV2nv/4kJfYSXx3XJgPafIX58rgK/img.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;1328&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;27.13&quot; style=&quot;width: 26.499%; margin-top: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byMpmg/dJMb99NV2nv/4kJfYSXx3XJgPafIX58rgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyMpmg%2FdJMb99NV2nv%2F4kJfYSXx3XJgPafIX58rgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1068&quot; height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsPKJ3/dJMcaae7tQy/gs6iVEkrNKE5wxWWWxQXD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsPKJ3/dJMcaae7tQy/gs6iVEkrNKE5wxWWWxQXD0/img.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;1434&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.6819%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;46.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsPKJ3/dJMcaae7tQy/gs6iVEkrNKE5wxWWWxQXD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsPKJ3%2FdJMcaae7tQy%2Fgs6iVEkrNKE5wxWWWxQXD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1914&quot; height=&quot;1434&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4HkTO/dJMcadCJFKL/ZnFIYypFpVwp90XrbQ6SA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4HkTO/dJMcadCJFKL/ZnFIYypFpVwp90XrbQ6SA1/img.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;998&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;26.96&quot; data-filename=&quot;blob&quot; style=&quot;width: 26.338%; margin-right: 10px; margin-top: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4HkTO/dJMcadCJFKL/ZnFIYypFpVwp90XrbQ6SA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4HkTO%2FdJMcadCJFKL%2FZnFIYypFpVwp90XrbQ6SA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyIPky/dJMcaa7hXZs/hHPj1KnDMXpzJ2j3UOx7I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyIPky/dJMcaa7hXZs/hHPj1KnDMXpzJ2j3UOx7I0/img.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1430&quot; data-is-animation=&quot;false&quot; style=&quot;width: 25.6573%; margin-top: 10px;&quot; data-widthpercent=&quot;26.27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyIPky/dJMcaa7hXZs/hHPj1KnDMXpzJ2j3UOx7I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyIPky%2FdJMcaa7hXZs%2FhHPj1KnDMXpzJ2j3UOx7I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;1430&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;많이도 돌아다녔다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2026년 7월) 수습 끝, 부서 배치&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qsSxm/dJMcafndDDG/81jegKkD4TKcM53CQf6j50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qsSxm/dJMcafndDDG/81jegKkD4TKcM53CQf6j50/img.png&quot; data-origin-width=&quot;2382&quot; data-origin-height=&quot;1428&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1716%; margin-right: 10px;&quot; data-widthpercent=&quot;49.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qsSxm/dJMcafndDDG/81jegKkD4TKcM53CQf6j50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqsSxm%2FdJMcafndDDG%2F81jegKkD4TKcM53CQf6j50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2382&quot; height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL51bl/dJMcabE09iz/c8XIC3NH0415EHwNVPg9Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL51bl/dJMcabE09iz/c8XIC3NH0415EHwNVPg9Dk/img.png&quot; data-origin-width=&quot;2406&quot; data-origin-height=&quot;1428&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.667%;&quot; data-widthpercent=&quot;50.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL51bl/dJMcabE09iz/c8XIC3NH0415EHwNVPg9Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL51bl%2FdJMcabE09iz%2Fc8XIC3NH0415EHwNVPg9Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2406&quot; height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/div&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;지금은 정말 너무 바쁘다&amp;hellip; 하루하루가 빠르게 지나가고, 일주일이 순식간에 지나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그만큼 일이 재미있고 배우는 것도 많으며, 실제 실무에 기여할 수 있어서 뿌듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신입 때는 마음껏 굴러보고 싶었는데, 정말 잘 구르고 있다고 생각한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;합격한 공고&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;안랩 현장실습인턴(6개월) - 모바일 서버 개발&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYufrW/dJMb998cKzU/9U2CiShzjxVp3fGvnonB41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYufrW/dJMb998cKzU/9U2CiShzjxVp3fGvnonB41/img.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;1760&quot; data-is-animation=&quot;false&quot; style=&quot;width: 36.332%; margin-right: 10px;&quot; data-widthpercent=&quot;36.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYufrW/dJMb998cKzU/9U2CiShzjxVp3fGvnonB41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYufrW%2FdJMb998cKzU%2F9U2CiShzjxVp3fGvnonB41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YXQhz/dJMcaftO7Hx/qXNbgev0dnehgGKX4HkGIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YXQhz/dJMcaftO7Hx/qXNbgev0dnehgGKX4HkGIK/img.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;1023&quot; data-is-animation=&quot;false&quot; style=&quot;width: 62.5066%;&quot; data-widthpercent=&quot;63.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YXQhz/dJMcaftO7Hx/qXNbgev0dnehgGKX4HkGIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYXQhz%2FdJMcaftO7Hx%2FqXNbgev0dnehgGKX4HkGIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;1023&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;안랩 인턴은 매 상반기/하반기마다 뽑는다. 현장실습 학점연계도 가능하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;넷마블 채용전환형 인턴(8주) - SW개발&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWqvdV/dJMcahLWjBd/JqIAcIepuxvG7EyGidLYyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWqvdV/dJMcahLWjBd/JqIAcIepuxvG7EyGidLYyK/img.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1341&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.4939%; margin-right: 10px;&quot; data-widthpercent=&quot;54.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWqvdV/dJMcahLWjBd/JqIAcIepuxvG7EyGidLYyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWqvdV%2FdJMcahLWjBd%2FJqIAcIepuxvG7EyGidLYyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;1341&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPsbjT/dJMcabkJyrO/Nlq1v9XDq6rihHgsv8BEl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPsbjT/dJMcabkJyrO/Nlq1v9XDq6rihHgsv8BEl0/img.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1582&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.3447%;&quot; data-widthpercent=&quot;45.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPsbjT/dJMcabkJyrO/Nlq1v9XDq6rihHgsv8BEl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPsbjT%2FdJMcabkJyrO%2FNlq1v9XDq6rihHgsv8BEl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;1582&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;넷마블은 2022년 이후로 3년 만에 기술직군 신입사원 공채를 진행했다.&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;잘했던 점/좋았던 점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;꾸준히 한 가지 프로젝트를 오래한 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lsquo;아주대학교 공지사항 알림 서비스&amp;rsquo;&lt;/b&gt;라는 프로젝트를 3학년 1학기 첫 프로젝트로 시작해서(파란학기제) 지금까지 계속 운영했던 것이 포트폴리오나 자기소개서 스토리를 만들어나가는 데 좋았다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주어진 상황에서 최선을 다했다.&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;b&gt;최선을 다 안했을 때 나중에 후회하는게 두려워서&lt;/b&gt; 더 열심히했던 것도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그래도 하나씩 스펙을 쌓아가는 과정이 있었다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;만족할만한 결과를 가지고 취준판을 떠나다.&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;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;b&gt; 미련이 없다.&lt;/b&gt;&lt;/p&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;아쉬웠던 점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;너무 혼자하려고 했던 것?&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;p data-ke-size=&quot;size16&quot;&gt;연합동아리도 하고 싶었지만 결국 지원하지 않았는데, 취준을 길게 놓고 봤을 때는 멘탈 관리 측면에서도, 네트워킹 측면에서도 도움이 되었을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 막상 인턴에 합격하고 나니 연합동아리 자기소개서를 쓰는 게 귀찮아진 것도 사실이지만.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이사를 하면서 혼자 취업 준비를 이어갔던 것도 멘탈적으로 쉽지 않은 시기였다. 그래서 러닝과 헬스를 열심히 했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;조급함&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;p data-ke-size=&quot;size16&quot;&gt;이런 조급함은 과제를 진행하는 과정에서도 그대로 드러났고, 관련된 피드백을 받기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 조급한 마음에 군 휴학을 제외하고는 따로 휴학 없이 졸업했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌이켜보면 진로를 찾고 교환학생이나 좋아하는 것, 재밌는 것을 하고 찾아가는 과정이 더 소중하다고 생각한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;운이 좋았다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경쟁률이 기본적으로 100대 1을 넘는 시장에서 합격한다는 건 '운' 없이는 불가능하다고 생각한다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;복권 당첨자들의 공통점은 복권을 구매했다는 것&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 운이 작용하려면 그만큼 시행 횟수를 늘려야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 어떤 취업 수기에서 봤던 문장 중, &lt;b&gt;&quot;복권 당첨자들의 공통점은 복권을 구매했다는 것&quot;&lt;/b&gt;이라는 문장이 유독 기억에 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;IT업계는 참 좁구나&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인턴 생활을 하며 만난 사람들 중에 의외로 겹치는 지인이 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대학교 학술소학회 회장을 하던 시절, 세미나 연사로 섭외드렸던 선배가 넷마블에 재직 중이셨는데, 2년 뒤 넷마블 면접을 준비하며 그 인연으로 도움을 받게 될 줄은 전혀 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;대학 입시 이후로 이렇게까지 간절했던 순간이 있었나 싶다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 회사 생활을 하고 연차가 쌓이면 마음가짐도 달라지겠지만, 지금 이 초심만큼은 기억하고 싶다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;중고신입이 못 들어오는 영역 &amp;rarr; 채용전환형 인턴&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중고신입이 판치는 지금의 취업 시장에서, 채용전환형&amp;middot;채용연계형 인턴을 선택하는 건 나쁘지 않은 선택지라고 생각한다.&lt;/li&gt;
&lt;li&gt;물론 채용전환형 인턴에만 집중하다 보면 다른 곳에 지원하지 못하게 되고, 떨어졌을 때의 리스크가 커지는 것도 사실이다. 하지만 채용전환형 인턴 경험 역시 하나의 경력이자 차별점이 된다고 생각하고,&lt;/li&gt;
&lt;li&gt;무엇보다 지금은 가릴 상황이 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;중요한 것은 태도&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 시대에 오히려 더 중요해진 건 &lt;b&gt;'태도'&lt;/b&gt;라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진정성은 어떻게든 티가 나기 마련이고, 면접관 분들은 몇 년간 수백 명을 면접 봐온 사람들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 태도는 취업 준비 기간에 벼락치기로 만들어지는 게 아니라, 평소 학교 생활이나 프로젝트에서 최선을 다하고 협력하는 과정에서 자연스럽게 쌓이는 것이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최선을 다하는 자세만 잃지 않는다면, 언젠가는 반드시 빛을 볼 수 있다고 믿는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;도전적인 상황을 만들자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에는 PPT도 잘 만들지 못하고 발표도 서툴다고 생각했는데, 인턴 기간 동안 도전적인 상황들과 마주하면서 많이 발전할 수 있었다.&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;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;한 챕터의 끝, Next?&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FZqbu/dJMcaglWMsQ/A7hNdM7DelZC0hsJNjL5mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FZqbu/dJMcaglWMsQ/A7hNdM7DelZC0hsJNjL5mk/img.png&quot; style=&quot;width: 37.3763%; margin-right: 10px;&quot; data-widthpercent=&quot;38.27&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2731&quot; data-origin-width=&quot;2048&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FZqbu/dJMcaglWMsQ/A7hNdM7DelZC0hsJNjL5mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFZqbu%2FdJMcaglWMsQ%2FA7hNdM7DelZC0hsJNjL5mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rEODi/dJMcaaMQF0V/TtKy9BxItc4F6AdjoJvLH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rEODi/dJMcaaMQF0V/TtKy9BxItc4F6AdjoJvLH1/img.png&quot; style=&quot;width: 22.9246%; margin-right: 10px;&quot; data-widthpercent=&quot;23.47&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2622&quot; data-origin-width=&quot;1206&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rEODi/dJMcaaMQF0V/TtKy9BxItc4F6AdjoJvLH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrEODi%2FdJMcaaMQF0V%2FTtKy9BxItc4F6AdjoJvLH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;2622&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/elNnCC/dJMcaalHsi8/yf9X98ThoGa1gW3xKF1YuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/elNnCC/dJMcaalHsi8/yf9X98ThoGa1gW3xKF1YuK/img.png&quot; style=&quot;width: 37.3763%;&quot; data-widthpercent=&quot;38.26&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2731&quot; data-origin-width=&quot;2048&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/elNnCC/dJMcaalHsi8/yf9X98ThoGa1gW3xKF1YuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FelNnCC%2FdJMcaalHsi8%2Fyf9X98ThoGa1gW3xKF1YuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;흑석동은 바로 앞이 한강이라 러닝하기 너무 좋은 동네다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSSQB8/dJMcaf1H36k/viOk4KYyG34XKPfkFNbIek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSSQB8/dJMcaf1H36k/viOk4KYyG34XKPfkFNbIek/img.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;1260&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4716%; margin-right: 10px;&quot; data-widthpercent=&quot;33.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSSQB8/dJMcaf1H36k/viOk4KYyG34XKPfkFNbIek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSSQB8%2FdJMcaf1H36k%2FviOk4KYyG34XKPfkFNbIek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baAFaa/dJMcagGrs2C/KcGueyAyKpDLZZywwkTQIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baAFaa/dJMcagGrs2C/KcGueyAyKpDLZZywwkTQIK/img.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;1424&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.8399%; margin-right: 10px;&quot; data-widthpercent=&quot;29.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baAFaa/dJMcagGrs2C/KcGueyAyKpDLZZywwkTQIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaAFaa%2FdJMcagGrs2C%2FKcGueyAyKpDLZZywwkTQIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1068&quot; height=&quot;1424&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCTrd7/dJMcaaGd3PZ/OB1CIup7u24yUVdtaBwUz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCTrd7/dJMcaaGd3PZ/OB1CIup7u24yUVdtaBwUz1/img.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1142&quot; data-is-animation=&quot;false&quot; style=&quot;width: 36.3656%;&quot; data-widthpercent=&quot;37.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCTrd7/dJMcaaGd3PZ/OB1CIup7u24yUVdtaBwUz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCTrd7%2FdJMcaaGd3PZ%2FOB1CIup7u24yUVdtaBwUz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;한때 도시공학과를 꿈꿨었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xatup/dJMcabLVlqL/pABn3RyKI9XnIKZ9qRwuM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xatup/dJMcabLVlqL/pABn3RyKI9XnIKZ9qRwuM1/img.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1118&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.0289%; margin-right: 10px;&quot; data-widthpercent=&quot;34.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xatup/dJMcabLVlqL/pABn3RyKI9XnIKZ9qRwuM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXatup%2FdJMcabLVlqL%2FpABn3RyKI9XnIKZ9qRwuM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;1118&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDLeP0/dJMcacRq3F8/lMRmok9B6QT3wlfxOHRzv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDLeP0/dJMcacRq3F8/lMRmok9B6QT3wlfxOHRzv0/img.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;1192&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.6782%; margin-right: 10px;&quot; data-widthpercent=&quot;32.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDLeP0/dJMcacRq3F8/lMRmok9B6QT3wlfxOHRzv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDLeP0%2FdJMcacRq3F8%2FlMRmok9B6QT3wlfxOHRzv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKNyOo/dJMcabLVlqQ/hLVzNZb5U0njMGKvBybxL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKNyOo/dJMcabLVlqQ/hLVzNZb5U0njMGKvBybxL1/img.png&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1190&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.97%;&quot; data-widthpercent=&quot;32.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKNyOo/dJMcabLVlqQ/hLVzNZb5U0njMGKvBybxL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKNyOo%2FdJMcabLVlqQ%2FhLVzNZb5U0njMGKvBybxL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/div&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;하지만 이게 끝이라고는 생각하지 않는다. 당장 언제 대체될지 모르는 AI시대이니까&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자기계발, 특히 영어는 꾸준히 하려고 한다. 운동도 열심히 하고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;앞으로도 다양한 경험을 쌓고 싶다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말했던 것 처럼 회사 안에서도 주니어 때는 정말 굴려지면서 열심히 배우고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Appendix&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;신인류&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eILOwR/dJMcacDXdvf/O8ZDZpYuEvNiVVveNIHZfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eILOwR/dJMcacDXdvf/O8ZDZpYuEvNiVVveNIHZfK/img.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2377&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.2435%; margin-right: 10px;&quot; data-widthpercent=&quot;27.56&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eILOwR/dJMcacDXdvf/O8ZDZpYuEvNiVVveNIHZfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeILOwR%2FdJMcacDXdvf%2FO8ZDZpYuEvNiVVveNIHZfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;2377&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF7q4G/dJMcadQfNCf/fkFCfzlSiEPCdXw7cVDk50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF7q4G/dJMcadQfNCf/fkFCfzlSiEPCdXw7cVDk50/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot; data-is-animation=&quot;false&quot; style=&quot;width: 71.5951%;&quot; data-widthpercent=&quot;72.44&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF7q4G/dJMcadQfNCf/fkFCfzlSiEPCdXw7cVDk50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF7q4G%2FdJMcadQfNCf%2FfkFCfzlSiEPCdXw7cVDk50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm8idV/dJMcacYboew/Ba42QdYR65HPSkmY4CzkX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm8idV/dJMcacYboew/Ba42QdYR65HPSkmY4CzkX1/img.png&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;1958&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.2709%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;58.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm8idV/dJMcacYboew/Ba42QdYR65HPSkmY4CzkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm8idV%2FdJMcacYboew%2FBa42QdYR65HPSkmY4CzkX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1582&quot; height=&quot;1958&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9UVpp/dJMcaae11r4/kEde0nliKVRfX5ckcLikhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9UVpp/dJMcaae11r4/kEde0nliKVRfX5ckcLikhk/img.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2144&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.5677%; margin-top: 10px;&quot; data-widthpercent=&quot;41.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9UVpp/dJMcaae11r4/kEde0nliKVRfX5ckcLikhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9UVpp%2FdJMcaae11r4%2FkEde0nliKVRfX5ckcLikhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;2144&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;날씨의 요정, 미완성 효과, 송곳니, 이상하고 아름다운, 푸른 공상 등 노래가 다 좋다&lt;/figcaption&gt;
&lt;/figure&gt;
&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;lsquo;신인류&amp;rsquo;의 &amp;lsquo;빛나는 스트라이크&amp;rsquo;가 최우수 얼터너티브 록 음반을 수상했다는 걸 알게되고 들었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정면돌파 말고도 &amp;lsquo;이상하고 아름다운&amp;rsquo;, &amp;lsquo;일인칭 관찰자 시점&amp;rsquo;, &amp;lsquo;Huf&amp;rsquo; 등 전반적으로 곡들이 너무 좋고 명반이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 잔나비 특유의 얼터니티브 록 음악을 좋아하는데, 내가 좋아하는 장르의 노래였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종합격 이후에 한대음 페스티벌에 가서 라이브도 들었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한대음 페스티벌에서 마지막 아티스트 공연 전에 미리 나왔는데, 우연히 멤버들과도 만나서 사진도 찍었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;쿵야&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDA32n/dJMcahSJlZl/kZ9SJFpr1KH8qJvxm01ri1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDA32n/dJMcahSJlZl/kZ9SJFpr1KH8qJvxm01ri1/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDA32n/dJMcahSJlZl/kZ9SJFpr1KH8qJvxm01ri1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDA32n%2FdJMcahSJlZl%2FkZ9SJFpr1KH8qJvxm01ri1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2TwsB/dJMcadiDaCD/7w245aNrOkwzMyYCyIWlLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2TwsB/dJMcadiDaCD/7w245aNrOkwzMyYCyIWlLk/img.png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;2731&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4193%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2TwsB/dJMcadiDaCD/7w245aNrOkwzMyYCyIWlLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2TwsB%2FdJMcadiDaCD%2F7w245aNrOkwzMyYCyIWlLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;2731&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLRYZU/dJMcacRq3xI/zOWdrToa5jF0ALgOsm3Mok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLRYZU/dJMcacRq3xI/zOWdrToa5jF0ALgOsm3Mok/img.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;1440&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.3145%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;42.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLRYZU/dJMcacRq3xI/zOWdrToa5jF0ALgOsm3Mok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLRYZU%2FdJMcacRq3xI%2FzOWdrToa5jF0ALgOsm3Mok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ll5rq/dJMcaaMV5G6/ivvcG08D0FQSxbPkHmskc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ll5rq/dJMcaaMV5G6/ivvcG08D0FQSxbPkHmskc1/img.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.524%; margin-top: 10px;&quot; data-widthpercent=&quot;57.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ll5rq/dJMcaaMV5G6/ivvcG08D0FQSxbPkHmskc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fll5rq%2FdJMcaaMV5G6%2FivvcG08D0FQSxbPkHmskc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;회사 깃허브, JIRA 프사를 양파쿵야로 해놓으신 직원 분들이 엄청 많다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿵야가 넷마블 IP인걸 들어가서 알게 되었다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;넷마블과의 인연&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDjkn9/dJMcaiRJTxJ/AkxpXCQKfgS4N6kkmiKkn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDjkn9/dJMcaiRJTxJ/AkxpXCQKfgS4N6kkmiKkn0/img.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;480&quot; data-is-animation=&quot;false&quot; width=&quot;298&quot; height=&quot;398&quot; data-filename=&quot;blob&quot; data-widthpercent=&quot;80.56&quot; style=&quot;width: 79.6281%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDjkn9/dJMcaiRJTxJ/AkxpXCQKfgS4N6kkmiKkn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDjkn9%2FdJMcaiRJTxJ%2FAkxpXCQKfgS4N6kkmiKkn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk7J4K/dJMcabrw7jN/nCSfxuKRKvyiN3kfFKRFP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk7J4K/dJMcabrw7jN/nCSfxuKRKvyiN3kfFKRFP0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1192&quot; data-origin-width=&quot;538&quot; style=&quot;width: 19.2104%;&quot; data-widthpercent=&quot;19.44&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk7J4K/dJMcabrw7jN/nCSfxuKRKvyiN3kfFKRFP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk7J4K%2FdJMcabrw7jN%2FnCSfxuKRKvyiN3kfFKRFP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;초등학교 3학년 때 가입한 넷마블 아이디. 인턴 면접 '마지막 한마디'에서 넷마블 계정 가입일자와 마구마구 이야기도 했다. / 진짜 초딩이 지을법한 닉네임이다 ㅋㅋ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷마블 마구마구가 첫 PC게임이었는데, 이렇게 다시 만나게 되어서 너무 반갑다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 저금통 뒤져서 현질도 꽤 했었는데, 이제 월급으로 페이백 받을 수 있겠다.&lt;/p&gt;</description>
      <category>회고</category>
      <category>백엔드</category>
      <category>인턴</category>
      <author>simzard</author>
      <guid isPermaLink="true">https://simzard.tistory.com/6</guid>
      <comments>https://simzard.tistory.com/6#entry6comment</comments>
      <pubDate>Sun, 26 Jul 2026 16:07:08 +0900</pubDate>
    </item>
    <item>
      <title>유튜브처럼, 구독한 공지사항별 알림 설정 기능을 도입해보자</title>
      <link>https://simzard.tistory.com/5</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;script&gt;
const _0x5eef=['classList','92935nhtnYq','setAttribute','push','innerHTML','getElementById','toLowerCase','tt_adsense_top','another_category','style','//p[contains(text(),\x27[목차여기]\x27)]','1954669aacfHB','div','appendChild','toc-ym','title','forEach','DOMContentLoaded','call','addEventListener','length','insertBefore','firstElementChild','log','27309qNoTHN','62SuwPRc','parentNode','querySelector','revenue_unit_wrap','tagName','23736mMyuUa','singleNodeValue','trim','17723tUfPMr','textContent','1STKGDu','getAttribute','contains','nextSibling','791846eKKEom','createElement','outerText','FIRST_ORDERED_NODE_TYPE','querySelectorAll','72wJWnLP','hasAttribute','669103LLOFBD','toc'];function _0x330c(_0x5d40d0,_0x4afdad){_0x5d40d0=_0x5d40d0-0xec;let _0x5eef71=_0x5eef[_0x5d40d0];return _0x5eef71;}const _0x2078d2=_0x330c;(function(_0xbea334,_0x392453){const _0x2c3076=_0x330c;while(!![]){try{const _0x5a087d=-parseInt(_0x2c3076(0x117))+parseInt(_0x2c3076(0xf7))+parseInt(_0x2c3076(0xfa))+-parseInt(_0x2c3076(0x11a))*-parseInt(_0x2c3076(0xf5))+parseInt(_0x2c3076(0x112))*parseInt(_0x2c3076(0x111))+parseInt(_0x2c3076(0xec))*-parseInt(_0x2c3076(0xf0))+-parseInt(_0x2c3076(0x104));if(_0x5a087d===_0x392453)break;else _0xbea334['push'](_0xbea334['shift']());}catch(_0x47ff63){_0xbea334['push'](_0xbea334['shift']());}}}(_0x5eef,0xea9e9),document[_0x2078d2(0x10c)](_0x2078d2(0x10a),function(){const _0x7eb51e=_0x2078d2;try{const _0x591681=document[_0x7eb51e(0x114)]('.contents_style'),_0x1762f9=document[_0x7eb51e(0xfe)](_0x7eb51e(0x107));if(_0x591681&amp;&amp;!_0x1762f9)htmlTableOfContents();else return![];}catch(_0x250abc){console[_0x7eb51e(0x110)]('');}}));function htmlTableOfContents(_0x4f1c99){const _0x388803=_0x2078d2;var _0x4f1c99=_0x4f1c99||document;const _0x44fb35=document[_0x388803(0xf1)]('div');_0x44fb35[_0x388803(0xfb)]('id',_0x388803(0x107));const _0x2117e2=document['querySelector']('.contents_style');var _0x35e549=_0x388803(0x103),_0x552a33=document['evaluate'](_0x35e549,document,null,XPathResult[_0x388803(0xf3)],null)[_0x388803(0x118)];let _0x407aa0;_0x552a33?(_0x407aa0=_0x552a33,_0x407aa0[_0x388803(0x11b)]='',_0x407aa0[_0x388803(0x106)](_0x44fb35)):(_0x407aa0=_0x2117e2[_0x388803(0x10f)],_0x407aa0['classList'][_0x388803(0xee)](_0x388803(0x100))||_0x407aa0[_0x388803(0xf9)]['contains'](_0x388803(0x115))?_0x2117e2['insertBefore'](_0x44fb35,_0x407aa0[_0x388803(0xef)]):_0x407aa0[_0x388803(0x113)][_0x388803(0x10e)](_0x44fb35,_0x407aa0));const _0x3e06b5=document['getElementById'](_0x388803(0x107)),_0x5ee2f2=[]['slice'][_0x388803(0x10b)](_0x2117e2[_0x388803(0xf4)]('h1,\x20h2,\x20h3,\x20h4,\x20h5,\x20h6')),_0x454032=[];for(i=0x0;i&lt;_0x5ee2f2[_0x388803(0x10d)];i++){if(_0x5ee2f2[i][_0x388803(0xf2)][_0x388803(0x119)]()==='')continue;else{if(_0x5ee2f2[i][_0x388803(0xf9)][_0x388803(0xee)](_0x388803(0x108)))continue;else{if(_0x5ee2f2[i][_0x388803(0x113)]['classList'][_0x388803(0xee)](_0x388803(0x101)))continue;else _0x454032[_0x388803(0xfc)](_0x5ee2f2[i]);}}}_0x454032[_0x388803(0x109)](function(_0x5d97e0,_0x2112a5){const _0x4b3465=_0x388803;var _0x94aa2e=_0x4b3465(0xf8)+_0x2112a5;if(_0x5d97e0[_0x4b3465(0xf6)]('id'))_0x94aa2e=_0x5d97e0[_0x4b3465(0xed)]('id');else _0x5d97e0[_0x4b3465(0xfb)]('id',_0x94aa2e);var _0x34278b=_0x4f1c99[_0x4b3465(0xf1)]('a');_0x34278b[_0x4b3465(0xfb)]('href','#'+_0x94aa2e),_0x34278b['textContent']='•\x20'+_0x5d97e0[_0x4b3465(0x11b)];var _0x118edf=_0x4f1c99[_0x4b3465(0xf1)](_0x4b3465(0x105));_0x118edf[_0x4b3465(0xfb)]('class',_0x5d97e0[_0x4b3465(0x116)][_0x4b3465(0xff)]()),_0x118edf[_0x4b3465(0x106)](_0x34278b),_0x3e06b5[_0x4b3465(0x106)](_0x118edf);});const _0xd72dc='\x0a\x20\x20\x20\x20#toc-ym\x20div.h1\x20{\x20margin-left:\x200em\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div.h2\x20{\x20margin-left:\x200.5em\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div.h3\x20{\x20margin-left:\x201em\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div.h4\x20{\x20margin-left:\x201.5em\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div.h5\x20{\x20margin-left:\x202em\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div.h6\x20{\x20margin-left:\x202.5em\x20}\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20#toc-ym\x20{\x0a\x20\x20\x20\x20\x20\x20margin:\x2030px\x200px\x2030px\x200px;\x0a\x20\x20\x20\x20\x20\x20padding:\x2020px\x2020px\x2010px\x2015px;\x0a\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20#dadada;\x0a\x20\x20\x20\x20\x20\x20background-color:\x20#ffffff;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20#toc-ym::before\x20{\x0a\x20\x20\x20\x20\x20\x20content:\x20\x22목\x20\x20차\x22;\x0a\x20\x20\x20\x20\x20\x20display:\x20block;\x0a\x20\x20\x20\x20\x20\x20width:\x20120px;\x0a\x20\x20\x20\x20\x20\x20background-color:\x20rgb(255,\x20255,\x20255);\x0a\x20\x20\x20\x20\x20\x20text-align:\x20center;\x0a\x20\x20\x20\x20\x20\x20font-size:\x2018px;\x0a\x20\x20\x20\x20\x20\x20font-weight:\x20bold;\x0a\x20\x20\x20\x20\x20\x20margin:\x20-40px\x20auto\x200px;\x0a\x20\x20\x20\x20\x20\x20padding:\x205px\x200px;\x0a\x20\x20\x20\x20\x20\x20border-width:\x201px;\x0a\x20\x20\x20\x20\x20\x20border-style:\x20solid;\x0a\x20\x20\x20\x20\x20\x20border-color:\x20rgb(218,\x20218,\x20218);\x0a\x20\x20\x20\x20\x20\x20border-image:\x20initial;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div{\x0a\x20\x20\x20\x20\x20\x20margin:\x205px\x200px;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div:first-child{\x0a\x20\x20\x20\x20\x20\x20margin-top:\x2015px;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div:last-child{\x0a\x20\x20\x20\x20\x20\x20margin-bottom:\x2015px;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div\x20a\x20{\x0a\x20\x20\x20\x20\x20\x20text-decoration:\x20none;\x0a\x20\x20\x20\x20\x20\x20color:\x20#337ab7;\x0a\x20\x20\x20\x20\x20\x20transition:\x20all\x20ease\x200.2s;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20#toc-ym\x20div\x20a:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20color:\x20#333333;\x0a\x20\x20\x20\x20\x20\x20background-color:\x20#ecc7ff;\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20/*\x0a\x20\x20\x20\x20.contents_style\x20h3{\x0a\x20\x20\x20\x20\x20\x20margin-bottom:7px;\x0a\x20\x20\x20\x20\x20\x20padding:\x2010px\x2015px;\x0a\x20\x20\x20\x20\x20\x20border-left:\x205px\x20solid\x20#757575;\x0a\x20\x20\x20\x20\x20\x20background-color:\x20#e5e5e5;\x0a\x20\x20\x20\x20\x20\x20font-weight:\x20500;\x0a\x20\x20\x20\x20\x20\x20color:\x20#000000\x20!important;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20*/\x0a\x20\x20\x20\x20',_0x3ed036=document[_0x388803(0xf1)](_0x388803(0x102));_0x3ed036[_0x388803(0xfd)]=_0xd72dc,_0x2117e2[_0x388803(0x10e)](_0x3ed036,_0x407aa0);}
&lt;/script&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기능 개발 배경 - 푸시 알림이 너무 많이 와요&amp;hellip;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YqcOa/btsQvP1GbNN/Klunrwn6xZbJ9TLqCnSXoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YqcOa/btsQvP1GbNN/Klunrwn6xZbJ9TLqCnSXoK/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot; data-is-animation=&quot;false&quot; width=&quot;178&quot; height=&quot;385&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YqcOa/btsQvP1GbNN/Klunrwn6xZbJ9TLqCnSXoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYqcOa%2FbtsQvP1GbNN%2FKlunrwn6xZbJ9TLqCnSXoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2436&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qno0t/btsQxsdzReW/v1N5w2kdWJoLaE34ksdTEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qno0t/btsQxsdzReW/v1N5w2kdWJoLaE34ksdTEK/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot; data-is-animation=&quot;false&quot; width=&quot;127&quot; height=&quot;275&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qno0t/btsQxsdzReW/v1N5w2kdWJoLaE34ksdTEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQno0t%2FbtsQxsdzReW%2Fv1N5w2kdWJoLaE34ksdTEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2436&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;아주대학교-일반 공지사항은 하루에도 30~50건씩 올라온다. &quot;구독&quot;탭에서는 구독한 공지사항 글을 확인할 수 있다.&lt;/figcaption&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;&amp;ldquo;하루 30~50건씩 올라오는 공지로 인해 푸시 알림이 너무 자주 와서 부담스럽다&amp;rdquo;&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 입장에서는 특정 공지사항에 대해 &amp;ldquo;&lt;b&gt;구독은 유지하고, 알림만 끄고 싶어요&lt;/b&gt;&amp;rdquo;라는 니즈가 존재했다.&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;Topic(공지사항) 구독 = 푸시 알림 수신&lt;/b&gt;이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 사용자가 알림을 끄려면 선택지는 두 가지뿐이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 핸드폰 앱 설정에서 ajouevent.com 서비스의 &lt;b&gt;모든 알림을 차단&lt;/b&gt;하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 부담스러운 공지사항의 &lt;b&gt;구독을 취소&lt;/b&gt;하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 서비스를 운영하는 나의 입장에서는 두 선택지 모두 리스크가 컸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 1번 선택지의 경우, 앱 설정에서 전체 알림을 꺼버리면 다시 켜는 경우가 드물기 때문에, 특정 공지사항 단위로 알림을 제어할 수 있도록 하는 것이 더 합리적이었다.&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;을 제공하는 것이 사용자 경험(UX) 측면에서도 필요하다고 판단했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;p data-ke-size=&quot;size16&quot;&gt;이 부분에서 &lt;b&gt;유튜브&lt;/b&gt;의 &lt;b&gt;채널별 알림 설정&lt;/b&gt; 기능이 생각났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브가 채널 &lt;b&gt;&quot;구독&quot;&lt;/b&gt;과 &lt;b&gt;&quot;알림 설정&quot;(전체/맞춤설정/끔)&lt;/b&gt;으로 분리하는 것에서 힌트를 얻어 동일한 UX를 목표로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주이벤트에서도 &amp;ldquo;&lt;b&gt;구독은 유지하면서 알림만 끌 수 있는 구조&lt;/b&gt;&amp;rdquo;를 구현하고자 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;유튜브 vs 아주이벤트&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;알림 설정 - 유튜브&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmNTf2/btsQuZjtatk/R90rElp6sxAIDTnxqkEXw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmNTf2/btsQuZjtatk/R90rElp6sxAIDTnxqkEXw1/img.png&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;394&quot; data-is-animation=&quot;false&quot; width=&quot;470&quot; height=&quot;166&quot; data-widthpercent=&quot;63.54&quot; style=&quot;width: 62.8046%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmNTf2/btsQuZjtatk/R90rElp6sxAIDTnxqkEXw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmNTf2%2FbtsQuZjtatk%2FR90rElp6sxAIDTnxqkEXw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1114&quot; height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdAJhW/btsQvWzLjhB/XIQwhPh0qcLSAnKFxegsA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdAJhW/btsQvWzLjhB/XIQwhPh0qcLSAnKFxegsA1/img.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;704&quot; data-is-animation=&quot;false&quot; width=&quot;248&quot; height=&quot;153&quot; style=&quot;width: 36.0326%;&quot; data-widthpercent=&quot;36.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdAJhW/btsQvWzLjhB/XIQwhPh0qcLSAnKFxegsA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdAJhW%2FbtsQvWzLjhB%2FXIQwhPh0qcLSAnKFxegsA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1142&quot; height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OimcJ/btsQuX61Sc7/aTx6FSGRD0rh2WYu0xJ3hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OimcJ/btsQuX61Sc7/aTx6FSGRD0rh2WYu0xJ3hk/img.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;404&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.7569%; margin-right: 10px;&quot; data-widthpercent=&quot;50.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OimcJ/btsQuX61Sc7/aTx6FSGRD0rh2WYu0xJ3hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOimcJ%2FbtsQuX61Sc7%2FaTx6FSGRD0rh2WYu0xJ3hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxuax/btsQt0Xfofz/EgzlT3t3E0RtjLxLA7jEg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxuax/btsQt0Xfofz/EgzlT3t3E0RtjLxLA7jEg0/img.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;408&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.0803%;&quot; data-widthpercent=&quot;49.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxuax/btsQt0Xfofz/EgzlT3t3E0RtjLxLA7jEg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foxuax%2FbtsQt0Xfofz%2FEgzlT3t3E0RtjLxLA7jEg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;알림 설정 - 아주이벤트&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kExsY/btsQujoJdCZ/Y7sg5e99hva8Kyb4skl1QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kExsY/btsQujoJdCZ/Y7sg5e99hva8Kyb4skl1QK/img.png&quot; data-alt=&quot;지금은 구독/구독 취소 밖에 없으며, 구독일 때만 알림을 받을 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kExsY/btsQujoJdCZ/Y7sg5e99hva8Kyb4skl1QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkExsY%2FbtsQujoJdCZ%2FY7sg5e99hva8Kyb4skl1QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;176&quot; height=&quot;381&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구독 탭 - 유튜브&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDEk3/btsQwkAlh1A/2PKS8edTBskfrKqsdEaQIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDEk3/btsQwkAlh1A/2PKS8edTBskfrKqsdEaQIk/img.png&quot; data-alt=&quot;유튜버 채널에 들어가면 유튜버의 동영상을 볼 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDEk3/btsQwkAlh1A/2PKS8edTBskfrKqsdEaQIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDEk3%2FbtsQwkAlh1A%2F2PKS8edTBskfrKqsdEaQIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;299&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유튜버 채널에 들어가면 유튜버의 동영상을 볼 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;1688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ24jx/btsQusMLyBN/uiaf4L6IfMFmOnXMcTAHC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ24jx/btsQusMLyBN/uiaf4L6IfMFmOnXMcTAHC0/img.png&quot; data-alt=&quot;자신의 구독 페이지에서는 구독한 유튜버의 업로드한 동영상을 볼 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ24jx/btsQusMLyBN/uiaf4L6IfMFmOnXMcTAHC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ24jx%2FbtsQusMLyBN%2Fuiaf4L6IfMFmOnXMcTAHC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;512&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;1688&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구독 탭 - 아주이벤트&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGfFMS/btsQwdBcunc/EOdqkEiCVKbpT0pXQAMmP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGfFMS/btsQwdBcunc/EOdqkEiCVKbpT0pXQAMmP1/img.png&quot; data-alt=&quot;구독탭에서 구독한 공지사항을 볼 수 있는데, 지금은 구독을 하면 무조건 알림을 받는 구조다(따로 앱 설정에서 알림을 끄지 않는 이상)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGfFMS/btsQwdBcunc/EOdqkEiCVKbpT0pXQAMmP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGfFMS%2FbtsQwdBcunc%2FEOdqkEiCVKbpT0pXQAMmP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;192&quot; height=&quot;416&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;*우선 FCM의 Token과 Topic이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선&amp;nbsp;&lt;a href=&quot;https://www.ajouevent.com&quot;&gt;https://www.ajouevent.com&lt;/a&gt;&amp;nbsp;서비스의 푸시 알림은 FCM의 Topic을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCM Token과 Topic의 차이는 아래와 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FCM&amp;nbsp;Token&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brldfX/btsQxtwDmDf/ucTnnPEr0kJML96BE3qhc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brldfX/btsQxtwDmDf/ucTnnPEr0kJML96BE3qhc1/img.png&quot; data-alt=&quot;출처:&amp;amp;nbsp; https://zuminternet.github.io/FCM-PUSH/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brldfX/btsQxtwDmDf/ucTnnPEr0kJML96BE3qhc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrldfX%2FbtsQxtwDmDf%2FucTnnPEr0kJML96BE3qhc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;276&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;nbsp; https://zuminternet.github.io/FCM-PUSH/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱이 FCM 서버와 통신하기 위해 사용되는&amp;nbsp;&lt;b&gt;고유한 식별자&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;앱은 서버와 통신할 때 토큰을 사용하여&amp;nbsp;&lt;b&gt;FCM 서버에서 앱을 식별&lt;/b&gt;하고, 이를 통해&amp;nbsp;&lt;b&gt;메시지 전송&lt;/b&gt;을 할 수 있다.&lt;/li&gt;
&lt;li&gt;FCM의 토큰은&amp;nbsp;&lt;b&gt;앱이 설치된 디바이스마다 고유&lt;/b&gt;하다.&amp;nbsp;&lt;b&gt;앱이 설치된 디바이스를 추가하거나 삭제할때 토큰이 변경&lt;/b&gt;될 수 있다.&amp;nbsp;&lt;b&gt;(refresh)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버는 이러한&amp;nbsp;&lt;b&gt;FCM 토큰을 사용하여 특정 디바이스에 메시지를 전송&lt;/b&gt;할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Token은 Firebase에서 관리하는&amp;nbsp;&lt;b&gt;프로젝트별 접속하는 기기의 고유 ID&lt;/b&gt;로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FCM Topic&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boIDxi/btsQwySV4eU/aD7kfKFpWI7LsqWj0kVZQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boIDxi/btsQwySV4eU/aD7kfKFpWI7LsqWj0kVZQk/img.png&quot; data-alt=&quot;출처:&amp;amp;nbsp; https://zuminternet.github.io/FCM-PUSH/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boIDxi/btsQwySV4eU/aD7kfKFpWI7LsqWj0kVZQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboIDxi%2FbtsQwySV4eU%2FaD7kfKFpWI7LsqWj0kVZQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;358&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;nbsp; https://zuminternet.github.io/FCM-PUSH/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM의 Topic(토픽)은 일종의&amp;nbsp;&lt;b&gt;채널&lt;/b&gt;로서, 미리 Topic을 구독한 사용자(토큰)들에게 메시지를 전송할 수 있다.&lt;/li&gt;
&lt;li&gt;Topic을 구독, 구독 취소 요청시에, FCM은 구독한 유저들을 내부적으로 관리한다.&lt;/li&gt;
&lt;li&gt;FCM의 subscribe, unsubscribe 메서드를 통해 구독과 구독 취소 요청을 FCM에 전송할 수 있다.&lt;/li&gt;
&lt;li&gt;Topic을 통해서 푸시 알림을 발송하면, Topic을 구독한 사용자들에게만 메시지를 전송할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FCM 개념 정리 (Token vs Topic)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FCM Token&lt;/b&gt;: 디바이스(앱 설치 단위) 식별자. 서버는 이 토큰으로 &lt;b&gt;특정 기기&lt;/b&gt;에 보낸다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FCM Topic&lt;/b&gt;: 채널 개념. 토픽을 구독한 &lt;b&gt;모든 기기&lt;/b&gt;에 보낸다. 구독/해지는 FCM이 내부적으로 관리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Topic 방식에선 서버가 반드시 FCM 라이브러리를 사용해 대상 Token과 구독할 Topic 정보를 담아 subscribeToTopic() / unsubscribeFromTopic()를 호출해 토큰-토픽 관계를 FCM에게 알려줘야 한다. 이후 푸시 메시지를 발송할 때 해당 Topic 정보를 포함해 FCM으로 요청하면, FCM이 사전에 해당 Topic을 구독한 모든 Token으로 알림을 전송하는 구조이다.&lt;/p&gt;
&lt;/blockquote&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;관련 테이블&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Topic - 구독할 수 있는 공지사항 단위&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = &quot;topic&quot;)
public class Topic {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column
	private String department;

	@Enumerated(EnumType.STRING)
	@Column(unique = true)
	private Type type;

	@Column
	private String classification;

	@Column
	private String koreanTopic;

	@Column
	private Long koreanOrder;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교 공지사항마다 Topic을 두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 Topic을 구독하면, 해당 Topic의 공지사항이 올라올 때 푸시 알림을 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 학교 공지사항은 FCM에서 Topic 이름으로 소프트웨어학과면 Software , 간호학과면 Nursing으로 설정하여 사용자들이 Topic을 구독할 수 있도록 했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TopicMember - Topic과 Member를 매핑 (사용자가 어떤 공지사항을 구독하는지)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = &quot;topic_member&quot;)
public class TopicMember extends BaseTimeEntity {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = &quot;topic_id&quot;)
	private Topic topic;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = &quot;member_id&quot;)
	private Member member;

	@Column(nullable = false, columnDefinition = &quot;TINYINT(1)&quot;)
	private boolean isRead;

	@Column(nullable = false, columnDefinition = &quot;TINYINT(1)&quot;) // 새로 추가하는 필드
	private boolean receiveNotification;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자마다 구독하고 있는 개별 Topic (ex. Software, Nursing &amp;hellip;)에 대한 정보를 가지고 있는 테이블이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;b&gt;oken - 기기마다 부여되는 고유한 식별자, 사용자 1명이 여러개를 가질 수 있음&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = &quot;token&quot;)
public class Token {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column(unique = true)
	private String tokenValue;

	@Column(nullable = false)
	private LocalDate expirationDate;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = &quot;member_id&quot;)
	private Member member;

	@Column(nullable = false)
	private boolean isDeleted = false;

	public void markAsDeleted() {
		this.isDeleted = true;
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 공지사항 Topic(ex. Software)를 구독하기 위해 FCM 서버에 요청하면 해당 Token 단위로 보내진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TopicToken - Topic과 Token을 매핑&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = &quot;topic_token&quot;)
public class TopicToken {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = &quot;topic_id&quot;)
	private Topic topic;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = &quot;token_id&quot;)
	private Token token;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 특정 공지사항 ex. Software를 구독하면 사용자가 가지고 있는 Token을 가져와서, 각각 TopicToken을 생성한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;고민한 방법들&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법1 - 알림 여부를 저장하는 필드 추가(기존 구조 유지)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 구조에서, TopicMember에 receiveNotification 필드를 추가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;receiveNotification 필드: 사용자가 구독하고 있는 &lt;b&gt;특정 Topic에 대한 알림 수신 여부&lt;/b&gt;를 설정하는 필드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;receiveNotification == true: 푸시 알림 &lt;b&gt;수신&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;receiveNotification == false: 푸시 알림 &lt;b&gt;거부&lt;/b&gt; (구독만 한 상태, 구독한 공지사항 글은 볼 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;알림 해제 시 FCM unsubscribeFromTopic()을 호출하여 푸시 자체를 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황별 정리 ( A &amp;rarr; B, 즉 A 상태에서 B 상태가 될 때 변경 사항들)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 102.44%; height: 219px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;text-align: center; width: 18.4635%; height: 36px;&quot;&gt;&lt;b&gt;상태전환&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 42.4288%; height: 36px;&quot;&gt;&lt;b&gt;FCM 동작&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 22.3403%; height: 36px;&quot;&gt;&lt;b&gt;DB 필드 변화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 19.0734%; height: 36px;&quot;&gt;TopicMember 변화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 18.4635%; height: 37px;&quot;&gt;&lt;b&gt;구독 X &amp;rarr; 새로 구독&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.4288%; height: 37px;&quot;&gt;FCM subscribeToTopic() 호출 - Software 구독&lt;/td&gt;
&lt;td style=&quot;width: 22.3403%; height: 37px;&quot;&gt;receiveNotification = true&lt;/td&gt;
&lt;td style=&quot;width: 19.0734%; height: 37px; text-align: center;&quot;&gt;새로 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 18.4635%; height: 37px;&quot;&gt;&lt;b&gt;구독 상태 &amp;rarr; 알림 해제&lt;br /&gt;(알림만 끄고 싶을 때)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.4288%; height: 37px;&quot;&gt;FCM unsubscribeFromTopic() 호출 - Software 구독 해제&lt;/td&gt;
&lt;td style=&quot;width: 22.3403%; height: 37px;&quot;&gt;receiveNotification = false&lt;/td&gt;
&lt;td style=&quot;width: 19.0734%; height: 37px; text-align: center;&quot;&gt;유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 18.4635%; height: 36px;&quot;&gt;&lt;b&gt;알림 해제 &amp;rarr; 알림 설정&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.4288%; height: 36px;&quot;&gt;FCM subscribeToTopic() 호출 - Software 구독&lt;/td&gt;
&lt;td style=&quot;width: 22.3403%; height: 36px;&quot;&gt;receiveNotification = true&lt;/td&gt;
&lt;td style=&quot;width: 19.0734%; height: 36px; text-align: center;&quot;&gt;유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 18.4635%; height: 36px;&quot;&gt;&lt;b&gt;구독 상태(알림 해제) &amp;rarr; 구독 취소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.4288%; height: 36px;&quot;&gt;(이미 해제된 상태, FCM 호출 없음)&lt;/td&gt;
&lt;td style=&quot;width: 22.3403%; height: 36px;&quot;&gt;TopicMember 삭제&lt;/td&gt;
&lt;td style=&quot;width: 19.0734%; height: 36px; text-align: center;&quot;&gt;삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 18.4635%; height: 37px;&quot;&gt;&lt;b&gt;구독 상태(알림 설정) &amp;rarr; 구독 취소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.4288%; height: 37px;&quot;&gt;FCM unsubscribeFromTopic() 호출 - Software 구독 해제&lt;/td&gt;
&lt;td style=&quot;width: 22.3403%; height: 37px;&quot;&gt;TopicMember 삭제&lt;/td&gt;
&lt;td style=&quot;width: 19.0734%; height: 37px; text-align: center;&quot;&gt;삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&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;여전히 Topic 기반 전송이라 대량 전송 성능 우수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제점&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;FCM 구독 상태와 DB 간 동기화 위험(정합성 일치 X)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버(DB)의 receiveNotification = false만으로는 FCM 알림 차단이 되지 않는다&lt;/li&gt;
&lt;li&gt;FCM의 unsubscribeFromTopic() 호출이 누락되거나 실패할 경우, 알림을 꺼둔 사용자에게도 알림이 전송될 수 있다&lt;/li&gt;
&lt;li&gt;스프링 서버에서 알림 수신 여부를 통제하는 것이 아니라 FCM이 알림 설정을 통제&lt;/li&gt;
&lt;li&gt;로직 자체가 복잡하다&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자별 맞춤 데이터 포함 불가&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM 토픽 메시지는 모든 사용자에게 동일한 메시지만 전송됨&lt;/li&gt;
&lt;li&gt;사용자별 맞춤 알림 (예: 읽지 않은 개수에 따른 badge 수 전달)은 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 검증 어려움&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Firebase에서는 &amp;ldquo;누가 어떤 토픽에 구독돼 있는지&amp;rdquo;를 조회하는 API를 제공하지 않음&lt;/li&gt;
&lt;li&gt;DB 상태와 FCM 서버 상태의 불일치를 감지하거나 복구하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 2 - 알림 여부를 다루는 Topic 추가 &amp;amp; FCM 조건식&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 공지사항마다 &lt;i&gt;*_NoNotify&lt;/i&gt; Topic을 추가해, &lt;b&gt;알림을 끄고 싶을 때는 두 토픽을 동시에 구독&lt;/b&gt;하도록 설계.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 Topic: &lt;i&gt;Software&lt;/i&gt; &amp;rarr; 모든 소프트웨어 공지사항 구독자.&lt;/li&gt;
&lt;li&gt;알림 제외 Topic: &lt;i&gt;Software_NoNotify&lt;/i&gt; &amp;rarr; 소프트웨어 공지사항을 구독하지만 &lt;b&gt;알림은 받지 않으려는&lt;/b&gt; 사용자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;알림 전송 시 조건식을 사용하여 NoNotify 구독자를 제외.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging/ios/topic-messaging?hl=ko#node.js_3&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://firebase.google.com/docs/cloud-messaging/ios/topic-messaging?hl=ko#node.js_3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FCM의 조건식 (Condition)을 활용해 Software 토픽을 구독하지만 Software_NoNotify를 구독하지 않은 사용자에게만 알림 전송.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;{
  &quot;condition&quot;: &quot;'Software' in topics &amp;amp;&amp;amp; !('Software_NoNotify' in topics)&quot;,
  &quot;notification&quot;: {
    &quot;title&quot;: &quot;새로운 공지사항&quot;,
    &quot;body&quot;: &quot;소프트웨어학과 공지사항이 올라왔습니다!&quot;
  }
}.
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5mZpN/btsQueg6al5/NUTfXU3QTmC3x4K4e4CGE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5mZpN/btsQueg6al5/NUTfXU3QTmC3x4K4e4CGE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5mZpN/btsQueg6al5/NUTfXU3QTmC3x4K4e4CGE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5mZpN%2FbtsQueg6al5%2FNUTfXU3QTmC3x4K4e4CGE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;431&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;1064&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알림 받기: Software만 구독&lt;/li&gt;
&lt;li&gt;알림 끄기: Software + Software_NoNotify 모두 구독&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알림 해제: Software_NoNotify를 구독&lt;/li&gt;
&lt;li&gt;알림 받기: Software_NoNotify를 구독 해제&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알림을 받고 있는 사용자: Software만 구독해제&lt;/li&gt;
&lt;li&gt;알림을 끄고 있는 사용자: Software, Software_NoNotify를 모두 구독해제&lt;/li&gt;
&lt;/ul&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;상태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구독 Topic 조합&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;조건식 매칭&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;전송 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;비고&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구독 중 + 알림 받기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Software&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Condition &amp;rarr; Topic 전송&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;기본&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구독 중 + 알림 없음&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Software + Software_NoNotify&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;❌ 제외&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;조건식에 의해 미전송&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;상태 표현을 토픽 조합으로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구독 취소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;(둘 다 해제)&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;(무관)&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;관리 복잡도&amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Topic 기반의 전송 성능 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제점&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;토픽 관리 증가&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;조건식 복잡성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알림 전송 시 FCM 조건식이 복잡해지고, 조건식 작성 오류 시 의도치 않은 사용자에게 알림 발송 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 3 - 알림 여부를 저장하는 필드 추가 + Topic &amp;rarr; Token 구조로 변경&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 구독하고 있는 TopicMember 엔티티에 receiveNotification 필드를 추가하여, 알림 수신 여부를 사용자 별로 설정할 수 있게 한다.&lt;/li&gt;
&lt;li&gt;공지사항 알림을 발송할 때, 구독 중이면서 receiveNotification == true인 사용자만 필터링 &amp;rarr; Token 기반 개별 메시지를 전송한다.&lt;/li&gt;
&lt;li&gt;더 이상 Fcm subscribe / unsubscribe 호출에 의존하지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 FCM Topic 발송과 달리, 토큰이 어떤 토픽을 구독하는지 FCM에 따로 알려줄 필요가 없다. (즉, subscribeToTopic() / unsubscribeFromTopic() 호출이 필요 없음. 전송 대상은 DB에서 직접 필터링한다.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table style=&quot;border-collapse: collapse; width: 101.395%; height: 131px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 16.9576%;&quot;&gt;&lt;b&gt;상태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 16.7472%;&quot;&gt;&lt;b&gt;DB TopicMember&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 17.5682%;&quot;&gt;&lt;b&gt;receiveNotification&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 14.4185%;&quot;&gt;&lt;b&gt;FCM Topic 구독&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 14.5291%;&quot;&gt;&lt;b&gt;전송 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 21.0519%;&quot;&gt;&lt;b&gt;비고&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 16.9576%;&quot;&gt;&lt;b&gt;구독 중 + 알림 받기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 16.7472%;&quot;&gt;✅ 존재&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 17.5682%;&quot;&gt;true&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 14.4185%;&quot;&gt;(무관)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 14.5291%;&quot;&gt;&lt;b&gt;Token 개별 전송&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 21.0519%;&quot;&gt;개인화 데이터 가능 &lt;br /&gt;(예: unread_count)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 16.9576%;&quot;&gt;&lt;b&gt;구독 중 + 알림 없음&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 16.7472%;&quot;&gt;✅ 존재&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 17.5682%;&quot;&gt;false&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 14.4185%;&quot;&gt;(무관)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 14.5291%;&quot;&gt;&lt;b&gt;미전송&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 37px; width: 21.0519%;&quot;&gt;&lt;b&gt;FCM 구독/해지 호출 &lt;br /&gt;불필요&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px; width: 16.9576%;&quot;&gt;&lt;b&gt;구독 취소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px; width: 16.7472%;&quot;&gt;❌ 삭제&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px; width: 17.5682%;&quot;&gt;(삭제)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px; width: 14.4185%;&quot;&gt;(무관)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px; width: 14.5291%;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px; width: 21.0519%;&quot;&gt;단일 소스(DB)로 정합성&amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&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;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;/li&gt;
&lt;li&gt;발송 결과에 대한 개별 토큰 결과 확인 가능&lt;/li&gt;
&lt;li&gt;FCM이 알림 설정을 통제하는 것이 아니라, 스프링 서버에서 알림 수신 여부 통제 (DB에서 알림을 받는 사용자만 필터링해서 FCM으로 전달) &amp;rarr; &lt;b&gt;정합성&lt;/b&gt; 리스크가 줄어듦
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM에게 구독 정보를 전달할 필요가 없다. (subscribeToTopic() / unsubscribeFromTopic() 호출 x)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제점&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공지사항을 Topic으로 보내지 못함 &amp;rarr; 지금은 공지사항을 보낼 때 Topic만 담아서 보내고, 따로 사용자 Token이나 TopicMember를 확인하지 않음&amp;rarr; 공지사항을 보내는 로직을 &lt;b&gt;Token 구조로 수정해야 함&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Token 구조로 수정하게 되면, 공지사항 푸시 알림을 보낼 때 &lt;b&gt;서버에서 검증하는 시간이 길어짐&lt;/b&gt; (반면 Topic은 이미 구독을 FCM 서버에서 관리했다고 가정해서 그냥 Topic으로 보내면 됨)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FCM 전송 성능 저하&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽을 사용하지 않고 &lt;b&gt;FCM Token&lt;/b&gt;으로 개별 전송하면 다수의 사용자에게 알림을 보낼 때 비효율적.&lt;/li&gt;
&lt;li&gt;사용자 수가 많아질수록 처리 비용 증가.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추가 로직&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;FCM 토픽의 장점 포기&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM 토픽의 전송 효율성과 단순함을 활용하지 못함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방식별 장단점 정리&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 183px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 56px;&quot;&gt;
&lt;td style=&quot;width: 33.9536%; height: 56px;&quot;&gt;&lt;b&gt;방법 1&lt;/b&gt;(Topic 유지 + receiveNotification)&lt;/td&gt;
&lt;td style=&quot;width: 38.0232%; height: 56px;&quot;&gt;- 기존 구조 변경 최소화&lt;br /&gt;- 구현 간단&lt;br /&gt;- 여전히 Topic 기반이라 대량 전송 성능 우수&lt;/td&gt;
&lt;td style=&quot;width: 28.0232%; height: 56px;&quot;&gt;- DB &amp;harr; FCM 상태 불일치 가능&lt;br /&gt;- 사용자 맞춤 데이터 불가&lt;br /&gt;- 상태 검증 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 33.9536%; height: 37px;&quot;&gt;&lt;b&gt;방법 2&lt;/b&gt;(알림 전용 Topic 추가 + 조건식)&lt;/td&gt;
&lt;td style=&quot;width: 38.0232%; height: 37px;&quot;&gt;- Topic 기반 성능 활용&lt;br /&gt;- 알림 여부를 Topic 조합으로 단순히 표현&lt;/td&gt;
&lt;td style=&quot;width: 28.0232%; height: 37px;&quot;&gt;- 토픽 관리 복잡도 &amp;uarr;&lt;br /&gt;- 조건식 작성 번거로움/실수 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 56px;&quot;&gt;
&lt;td style=&quot;width: 33.9536%; height: 56px;&quot;&gt;&lt;b&gt;방법 3&lt;/b&gt;(Token 전송 + DB 필터링)&lt;/td&gt;
&lt;td style=&quot;width: 38.0232%; height: 56px;&quot;&gt;- 사용자별 맞춤 데이터 가능 (unread_count 등)&lt;br /&gt;- 전송 결과 추적 용이&lt;br /&gt;- 단일 소스(DB)로 정합성 확보&lt;/td&gt;
&lt;td style=&quot;width: 28.0232%; height: 56px;&quot;&gt;- Topic 기반보다 성능 저하&lt;br /&gt;- 토큰 필터링/조회 로직 추가 필요&lt;br /&gt;- 대량 전송 시 서버 부하 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;b&gt;1차&lt;/b&gt;: receiveNotification 필드 추가 &amp;rarr; Topic 기반 유지하면서 알림 ON/OFF 기능 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2차&lt;/b&gt;: Token 기반 전송으로 전환 &amp;rarr; 사용자별 맞춤 알림(배지 수, 통계) + 정합성 개선&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1차 채택 - 방법1: 기존 Topic 구조 + receiveNotification 필드 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장 사용자에게 기능을 빠르게 제공해야 했기 때문에, 기존 구조를 크게 바꾸지 않고도 구현 가능한 &lt;b&gt;방법 1&lt;/b&gt;을 우선 적용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TopicMember 엔티티에 &lt;b&gt;receiveNotification 필드를 추가&lt;/b&gt;하여, 사용자가 &lt;b&gt;알림을 해제하면 FCM에 토픽 구독 해제 요청&lt;/b&gt;(unsubscribeFromTopic)을 보내고, &lt;b&gt;해당 필드 값만 false&lt;/b&gt;로 바꾸도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공지사항이 기존처럼 &lt;b&gt;FCM Topic으로 전송되더라도&lt;/b&gt;, 알림을 해제한 사용자는 실제로 푸시를 받지 않게 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, FCM 서버에서 구독이 해제되어 있기 때문에, 동일한 Topic으로 발송하더라도 &lt;b&gt;알림을 받는 사용자와 받지 않는 사용자를 구분할 수 있게&lt;/b&gt; 되었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2차 채택 - 방법3: Topic &amp;rarr; Token 구조로 변경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 운영 중에 &lt;b&gt;정합성 문제&lt;/b&gt;가 터졌다. 구독을 했는데도, &lt;b&gt;푸시 알림이 오지 않는&lt;/b&gt; 사례가 발생했다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정합성 이슈의 원인&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;FCM Token의 특성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM Token은 기기마다 발급되며, PWA 재설치나 토큰 만료 시 새로 발급된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구독 정보 갱신 과정&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 Token이 발급되면(아이폰에서 우리 서비스를 쓰다가, 아이패드에서도 쓰기 위해 로그인하는 경우), 기존에 구독하던 Topic들을 다시 &lt;b&gt;FCM 서버로 subscribeToTopic()를 호출&lt;/b&gt;해서 연결해야 한다.&lt;/li&gt;
&lt;li&gt;이 과정이 &lt;b&gt;로그인 시점에 처리&lt;/b&gt;되었는데 사용자가 기존에 구독한 공지사항, 키워드가 많을수록 &lt;b&gt;호출이 많아져&lt;/b&gt; 로그인 속도가 느려졌다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 새로고침 문제&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 도중 사용자가 새로고침을 해버리면, 일부 subscribeToTopic() 요청이 끝나기 전에 끊겨버린다.&lt;/li&gt;
&lt;li&gt;이 때문에 &lt;b&gt;DB에는 구독 상태로 기록됐지만, FCM 서버에는 구독 정보가 반영되지 않아&lt;/b&gt; 푸시 알림이 오지 않는 현상이 발생했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 즉, 처음 우려했던 알림 ON/OFF 정합성 문제와 유사한 문제이다. &lt;b&gt;구독 상태를 FCM에서 제어&amp;middot;관리하는 구조 자체가 정합성 리스크&lt;/b&gt;를 안고 있음을 확인할 수 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;추가 요구사항&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 더불어 새로운 요구사항도 생겼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;118&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vvy03/btsQxaqv1hX/7EZkeLTwIzS6LVqkbEoyck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vvy03/btsQxaqv1hX/7EZkeLTwIzS6LVqkbEoyck/img.png&quot; data-alt=&quot;앱 뱃지 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vvy03/btsQxaqv1hX/7EZkeLTwIzS6LVqkbEoyck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvvy03%2FbtsQxaqv1hX%2F7EZkeLTwIzS6LVqkbEoyck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;118&quot; height=&quot;106&quot; data-origin-width=&quot;118&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 뱃지 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;FCM 메시지에 &amp;ldquo;사용자별로 읽지 않은 알림 개수&amp;rdquo;를 data에 담아 전송한 뒤, PWA 앱 배지 UI에 띄워야 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 FCM Topic 전송 방식은 &lt;b&gt;모든 사용자에게 동일한 메시지만 전송할 수 있기 때문에&lt;/b&gt;, 사용자별 맞춤 데이터 전송이 불가능했다. 클릭률, 수신율 같은 &lt;b&gt;사용자별 통계&lt;/b&gt;와 개별 토큰에 대한 푸시 전송 결과와 같은 로그를 수집하는 것에도 한계가 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구조 전환&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 가지 이유(정합성 리스크 + 맞춤 데이터 요구)로 인해, 기존 Topic 중심 구조에서 &lt;b&gt;Token 기반 전송 방식&lt;/b&gt;으로 전환했다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 108px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 18px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 18px;&quot;&gt;&lt;b&gt;이전(Topic 전송)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 18px;&quot;&gt;&lt;b&gt;이후(Token 전송)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;전송 단위&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;Topic&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;알림 ON/OFF&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;FCM 토픽 구독/해지 필요&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;DB receiveNotification으로 필터링 (FCM 호출 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;정합성&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;DB &amp;harr; FCM 상태 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;불일치&lt;/span&gt; &lt;/b&gt;가능&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;단일 소스(DB)로 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;정합성&lt;/span&gt; &lt;/b&gt;확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;개인화 데이터&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;불가(동일 메시지)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;가능&lt;/span&gt;&lt;/b&gt;(ex: unread_count)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;전송 성능&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;대량에 유리&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;배치/비동기로 보완&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 사용자별로 읽지 않은 알림 개수를 계산하고, 해당 값을 담은 메시지를 &lt;b&gt;Token을 통해 개별 전송&lt;/b&gt;함으로써 프론트엔드 앱의 &lt;b&gt;배지 UI&lt;/b&gt;에 정확한 정보를 반영할 수 있도록 했다.&lt;/li&gt;
&lt;li&gt;물론 Topic 방식이 성능적으로는 더 뛰어나지만, 전체 사용자 수가 감당 가능한 수준이고, 비동기 + 논블로킹 방식의 ThreadPool 구조를 도입하여 &lt;b&gt;전송 성능을 충분히 최적화&lt;/b&gt;할 수 있었다.&lt;/li&gt;
&lt;li&gt;구조 변경 이후에도 TopicMember 엔티티의 receiveNotification 필드는 유지되며, 공지사항 크롤링 &amp;rarr; 구독 사용자 조회 &amp;rarr; 푸시 전송 로직에서 &lt;b&gt;해당 필드(&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;receiveNotification&lt;/span&gt;)가 false인 사용자에겐 알림을 보내지 않도록&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;분기 처리하고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Topic &amp;rarr; Token으로의 푸시 알림 구조 전환 과정은 따로 글을 작성해 보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;최종 구현 정리: 알림 설정 추가 및 Token 기반 전송&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알림 설정 추가&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;TopicMember에&amp;nbsp; receiveNotification 필드 도입&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;@Column(nullable = false, columnDefinition = &quot;TINYINT(1)&quot;)
private boolean receiveNotification;
&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;b&gt;receiveNotification:&lt;/b&gt; 사용자의 &lt;b&gt;알림 수신 여부&lt;/b&gt;를 나타내는 필드&lt;/li&gt;
&lt;li&gt;구독 시 기본값은 **true**이며, 사용자가 알림을 해제하면 **false**로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용자가 구독한 Topic에 대해 알림 설정을 ON/OFF할 수 있도록 API를 제공&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public record NotificationPreferenceRequest(String topic, boolean receiveNotification) {
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@PreAuthorize(&quot;isAuthenticated()&quot;)
@PostMapping(&quot;/subscriptions/notification&quot;)
public ResponseEntity&amp;lt;ResponseDto&amp;gt; updateNotificationPreference(
			@AuthenticationPrincipal CustomUserDetails userDetails,
			@RequestBody NotificationPreferenceRequest request) {
	topicService.updateNotificationPreference(request);
	return ResponseEntity.ok().body(ResponseDto.builder()
		.successStatus(HttpStatus.OK)
		.successContent(request.getTopic() + &quot; 알림 수신 설정이 &quot; + request.isReceiveNotification() + &quot;로 변경되었습니다.&quot;)
		.build()
	);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;@Transactional
public void updateNotificationPreference(
							CustomUserDetails userDetails,
							NotificationPreferenceRequest request) {
	Member member = memberRepository.findByEmail(userDetails.getEmail())
		.orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.USER_NOT_FOUND));

	Topic topic = topicRepository.findByDepartment(request.getTopic())
		.orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.TOPIC_NOT_FOUND));

	TopicMember topicMember = topicMemberRepository.findByMemberAndTopic(member, topic)
		.orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.SUBSCRIBE_FAILED));

	topicMember.changeReceiveNotification(request.isReceiveNotification());
}
&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;요청 시 NotificationPreferenceRequest로 topic 이름과 알림 여부를 전달받아, 해당 TopicMember의 receiveNotification 필드를 갱신한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Token 기반 발송 로직&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;알림 전송 전 사용자 필터링&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// Topic을 구독 중이고, 알림을 수신 허용한 TopicMember 조회
List&amp;lt;TopicMember&amp;gt; topicMembers = topicMemberRepository
    .findByTopicWithNotificationEnabledAndTokens(topic);
&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;receiveNotification = true인 사용자만 필터링하여 알림 전송 대상으로 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// PushClusterTokens 생성
List&amp;lt;PushClusterToken&amp;gt; clusterTokens = topicTokens.stream()
	.map(token -&amp;gt; PushClusterToken.builder()
		.pushCluster(pushCluster)
		.token(token.getToken()) // TopicToken에 연결된 Token 가져오기
		.jobStatus(JobStatus.PENDING) // 초기 상태: PENDING
		.requestTime(LocalDateTime.now()) // 요청 시간 기록
		.build())
	.collect(Collectors.toList());
pushClusterTokenBulkRepository.saveAll(clusterTokens);
&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;b&gt;유효한 FCM 토큰&lt;/b&gt;을 바탕으로, 실제 알림 전송 대상인 PushClusterToken을 생성하고 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용자 개별 푸시 메시지를 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;@Transactional
public void sendNoticeNotification(NoticeDto noticeDto, Long eventId, Long pushClusterId) {
    PushCluster pushCluster = pushClusterRepository.findById(pushClusterId)
        .orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.PUSH_CLUSTER_NOT_FOUND));

    List&amp;lt;PushClusterToken&amp;gt; clusterTokens = pushClusterTokenRepository.findAllByPushClusterWithTokenAndMember(pushCluster);

    // 사용자별 읽지 않은 알림 개수 조회
    Map&amp;lt;Long, Long&amp;gt; unreadCountMap = pushNotificationRepository.countUnreadNotificationsForTopic(noticeDto.getKoreanTopic())
        .stream()
        .collect(Collectors.toMap(UnreadNotificationCountDto::getMemberId, UnreadNotificationCountDto::getUnreadNotificationCount));

    sendPushClusterNotification(
        clusterTokens,
        pushCluster,
        composeMessageTitle(noticeDto),
        composeBody(noticeDto),
        getFirstImageUrl(noticeDto),
        getRedirectionUrl(noticeDto, eventId),
        unreadCountMap
    );
}
&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;사용자의 FCM 토큰별로 읽지 않은 알림 수를 함께 포함해 전송하기 위해, unreadCountMap을 생성&lt;/li&gt;
&lt;li&gt;이후 각 사용자에게 전송할 메시지를 PushClusterToken 기준으로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;FCM으로 전송&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;public void sendPushClusterNotification(List&amp;lt;PushClusterToken&amp;gt; clusterTokens, PushCluster pushCluster, String title, String body, String imageUrl, String clickUrl, Map&amp;lt;Long, Long&amp;gt; unreadCountMap) {
    List&amp;lt;List&amp;lt;PushClusterToken&amp;gt;&amp;gt; batches = splitIntoBatches(clusterTokens, 400);

    // 메시지에 알림 수를 담음
    List&amp;lt;Message&amp;gt; messages = batch.stream()
        .map(token -&amp;gt; buildMessage(pushCluster.getId(), token, title, body, imageUrl, clickUrl, unreadCountMap))
        .collect(Collectors.toList());

    // 푸시 알림 FCM 발송 로직
    ApiFuture&amp;lt;BatchResponse&amp;gt; responseFuture = FirebaseMessaging.getInstance().sendEachAsync(messages);
    /*
    	..
    */
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;private Message buildMessage(Long pushClusterId, PushClusterToken token, String title, String body, String imageUrl, String clickUrl, Map&amp;lt;Long, Long&amp;gt; unreadCountMap) {
    Long unreadCount = unreadCountMap.getOrDefault(token.getToken().getMember().getId(), 0L);

    return Message.builder()
        .setToken(token.getToken().getTokenValue())
        .setNotification(Notification.builder()
            .setTitle(title)
            .setBody(body)
            .setImage(imageUrl)
            .build())
        .putData(&quot;click_action&quot;, clickUrl)
        .putData(&quot;push_cluster_id&quot;, String.valueOf(pushClusterId))
        .putData(&quot;unread_count&quot;, String.valueOf(unreadCount)) // 사용자 맞춤 badge 수
        .build();
}&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;메시지는 FCM의 data 필드에 &lt;b&gt;사용자 맞춤 정보&lt;/b&gt;(클러스터 ID, 알림 수 등)를 담아 개별적으로 생성&lt;/li&gt;
&lt;li&gt;프론트엔드에서는 받은 메시지의 unread_count 값을 기반으로 배지를 정확히 렌더링 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;UI 반영&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;118&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3KL63/btsQvxf3631/vPYG7GGgykVlFkngkkTsg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3KL63/btsQvxf3631/vPYG7GGgykVlFkngkkTsg1/img.png&quot; data-alt=&quot;앱 뱃지 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3KL63/btsQvxf3631/vPYG7GGgykVlFkngkkTsg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3KL63%2FbtsQvxf3631%2FvPYG7GGgykVlFkngkkTsg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;118&quot; height=&quot;106&quot; data-origin-width=&quot;118&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 뱃지 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cz4n5a/btsQx6HX4ak/dHV5Ex3xdA7w2RdBfNR4a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cz4n5a/btsQx6HX4ak/dHV5Ex3xdA7w2RdBfNR4a0/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cz4n5a/btsQx6HX4ak/dHV5Ex3xdA7w2RdBfNR4a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcz4n5a%2FbtsQx6HX4ak%2FdHV5Ex3xdA7w2RdBfNR4a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2436&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgPl63/btsQwQTqaGg/3wrfjOR2Wolya8laFlTaw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgPl63/btsQwQTqaGg/3wrfjOR2Wolya8laFlTaw0/img.png&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgPl63/btsQwQTqaGg/3wrfjOR2Wolya8laFlTaw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgPl63%2FbtsQwQTqaGg%2F3wrfjOR2Wolya8laFlTaw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;2436&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;공지사항별 알림 설정 적용 / 알림 없음을 하더라도 구독 탭에서는 구독한 글을 볼 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 공지사항의 푸시 알림이 너무 많다는 사용자 피드백이 있었고, 이를 해결하기 위해 처음에는 &lt;b&gt;구독한 공지사항의 알림 설정 필드&lt;/b&gt;(TopicMember.receiveNotification)를 추가해 &lt;b&gt;기존 Topic 구조 내에서 알림 ON/OFF&lt;/b&gt;를 제어했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 운영 과정에서 &lt;b&gt;FCM Topic 방식의 정합성 리스크&lt;/b&gt;가 드러났고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 &lt;b&gt;Token 기반 전송 구조&lt;/b&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;b&gt;알림 수신 여부(receiveNotification)를 직접 관리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;사용자별 unread_count 등을 메시지에 담아 &lt;b&gt;맞춤 푸시 제공&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;발송 &lt;b&gt;로그 및 통계 수집&lt;/b&gt;&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;사용자는 이제 &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;nbsp;&lt;/p&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;b&gt;사용자 경험(UX)을 세심히 이해하는 것&lt;/b&gt;과, &lt;b&gt;요구사항을 빠르게 반영할 수 있는 확장성 있는 코드 구조&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;p data-ke-size=&quot;size16&quot;&gt;키워드 알림은 &lt;b&gt;당근마켓&amp;middot;번개장터&lt;/b&gt;, 공지사항별 알림 설정은 &lt;b&gt;유튜브&lt;/b&gt;를 참고해 구현했는데, 실제 운영 서비스에서 얻은 아이디어가 프로젝트 완성도를 높이는 데 많은 역할을 했다.&lt;/p&gt;</description>
      <category>ajouevent.com</category>
      <category>ajouevent</category>
      <category>FCM</category>
      <category>firebase</category>
      <category>구독</category>
      <category>알림설정</category>
      <category>유튜브</category>
      <category>푸시알림</category>
      <author>simzard</author>
      <guid isPermaLink="true">https://simzard.tistory.com/5</guid>
      <comments>https://simzard.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 2 Oct 2025 15:49:58 +0900</pubDate>
    </item>
    <item>
      <title>아주대학교 SW중심대학 코딩 트레이너 후기 (2024-1학기 ~ 2025-1학기)</title>
      <link>https://simzard.tistory.com/4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;1684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXzIDJ/btsPMCoADI2/HYIoAOfvQX3JkefvUyAKpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXzIDJ/btsPMCoADI2/HYIoAOfvQX3JkefvUyAKpk/img.png&quot; data-alt=&quot;2025-2학기 코딩 트레이너 모집 공고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXzIDJ/btsPMCoADI2/HYIoAOfvQX3JkefvUyAKpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXzIDJ%2FbtsPMCoADI2%2FHYIoAOfvQX3JkefvUyAKpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;366&quot; height=&quot;518&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;1684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2025-2학기 코딩 트레이너 모집 공고&lt;/figcaption&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;2024-1학기부터 2025-1학기까지, 총 3학기 동안 &lt;b&gt;아주대학교 객체지향프로그래밍 및 실습(Java)강의에서&lt;/b&gt; 코딩 트레이너로 활동했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 이 활동을 해보고 싶은 후배들이나, 관심 있는 분들에게 도움이 되고 싶어 글을 작성하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;아주대학교가 2022년 SW중심대학 사업에 신규 선정되면서, 신설된 SW융합교육원에서 진행하는 활동입니다. 매 학기마다 아래 두 과목(2025-2학기 기준)에서 코딩 트레이너를 모집하고 있습니다.&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;컴퓨터프로그래밍 및 실습&lt;/b&gt; - 주로 1학년 대상, &lt;b&gt;C언어&lt;/b&gt;로 실습 진행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;객체지향프로그래밍 및 실습&lt;/b&gt; - 주로 2~3학년 대상, &lt;b&gt;JAVA&lt;/b&gt;로 실습 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 과목의 여러 강의(ex.컴프실 - F026, 컴프실 - F027)와 실습 반(ex.F026-1반, F026-2반)마다 코딩 트레이너를 모집하여 배정합니다. 두 과목 모두 1학기가 정규 과정이라서 보통 2학기는 1학기에 비해 강의 수가 적기 때문에 모집하는 코딩 트레이너 수도 적은 편입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7ZFXY/btsPMRyYFYD/ZTQkT4OUPEC4COE73gWtKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7ZFXY/btsPMRyYFYD/ZTQkT4OUPEC4COE73gWtKk/img.png&quot; data-alt=&quot;시급 13,000원!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7ZFXY/btsPMRyYFYD/ZTQkT4OUPEC4COE73gWtKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7ZFXY%2FbtsPMRyYFYD%2FZTQkT4OUPEC4COE73gWtKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;131&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시급 13,000원!&lt;/figcaption&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;월 최대 40시간&lt;/b&gt;이며, &lt;b&gt;기본 20시간&lt;/b&gt;은 &lt;b&gt;실습 준비와 참여&lt;/b&gt;로 채워지고(실습 시간과 휴일이 안 겹친다는 가정) &lt;b&gt;나머지 20시간&lt;/b&gt;은 &lt;b&gt;수강생과의 튜터링&lt;/b&gt;을 통해 채울 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모집 공고상 코딩 트레이너 역할은 다음과 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;코딩 과목 수강에 어려움이 있거나, 코딩 과제를 완성하지 못한 학생의 코드 점검 및 해결 가이드 / 실습수업 참여 필수&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;실습 준비&lt;/b&gt;: 매주 실습 시간 전에 조교님께 해당 주 실습 과제를 미리 받아 문제를 검토하고 풀어봅니다. 이때 실습 문제 오류를 찾거나 난이도 측면에서 피드백을 제공하기도 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실습 시간 참여&lt;/b&gt;: 실습 과제 수행에 어려움을 겪는 학생들에게 문제 해결을 조언해 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;튜터링&lt;/b&gt;(과제 코드 리뷰): 과제 제출에 실패한 학생들에게는 원할 경우 코드의 오류를 검토하고 해결 방안을 조언해 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기타 업무&lt;/b&gt;: 외국인 교수님 강의의 경우 과제 번역 업무도 수행했습니다. 다른 코딩 트레이너 중에서는 시험 감독으로 들어간 경우도 있었습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 교수님에 따라, 실습 시간 또는 특정 기간 내에 과제를 완료하지 못한 경우 코딩 트레이너와의 상담을 통해 실습 점수의 일부/전체를 복구할 수 있는 제도를 운영하기도 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 별도의 튜터링 시간을 마련해, 실습 과제를 해결하지 못한 학생들에게 피드백을 제공하고, 강의 자료를 바탕으로 이해하지 못한 개념에 대해서는 보충 설명도 진행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코딩 트레이너를 하려고 했던 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2학년 2학기 무렵 백엔드 개발자로 직무를 정하고 Java와 객체지향을 계속 공부해야 하는 시점에서 코딩 트레이너 활동을 알게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부를 하는데 동기부여 측면에서, 또 최저시급을 주는 알바가 아니라 기본 시급도 13,000원 정도라 나름 꿀 알바라고 생각했습니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코딩 트레이너 꿀팁?&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;상담 횟수를 늘리자!&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 트레이너는 월 최대 40시간까지 활동할 수 있는데, 이 중 절반인 20시간은 실습 준비와 실습 시간 참여로 자연스럽게 채워집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 20시간은 학생들과의 튜터링 상담을 통해 채울 수 있기 때문에, 상담 횟수를 늘리는 것이 중요합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;학생들과의 관계 형성 - 열심히 실습실을 돌아다니자 (적극적인 자세)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 모르는 부분이 있어도 교수님께 잘 안 물어보는 것처럼, 학생들도 모르는 부분이 있어도 질문하는 것을 두려워하는 학생들이 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 먼저 다가가 도움이 필요한지 물어보고, &lt;b&gt;&amp;ldquo;여기 구현 부분 이해하셨어요?&amp;rdquo;&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;p data-ke-size=&quot;size16&quot;&gt;실습을 따라가기 어려워하고, 수강에 어려움을 겪는 학생들의 경우에는 1주일에 1번 시간을 잡아서 주기적으로 튜터링을 통해 개념 복습을 위해 도움을 주는 방법도 학생에게 큰 도움을 줬던 거 같습니다.&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;아무래도 과개총, 소학회나 동아리에서 만난 1, 2학년 친구들이 컴퓨터프로그래밍 및 실습이나 객체지향 프로그래밍 및 실습 강의를 많이 듣다 보니, 안면이 있는 친구들이 있으면 좀 더 상담하기 쉬웠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실습 시간 튜터링 홍보&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;1374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECyEA/btsPMNcs0nv/ikPXUqAWC1boxeyYQ6uSc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECyEA/btsPMNcs0nv/ikPXUqAWC1boxeyYQ6uSc0/img.png&quot; data-alt=&quot;학생과의 상담 예약에 사용했던 클래스 커넥트 사이트(현재 운영 X)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECyEA/btsPMNcs0nv/ikPXUqAWC1boxeyYQ6uSc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECyEA%2FbtsPMNcs0nv%2FikPXUqAWC1boxeyYQ6uSc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;428&quot; height=&quot;344&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;1374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;학생과의 상담 예약에 사용했던 클래스 커넥트 사이트(현재 운영 X)&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;s&gt;튜터링의 경우에는 &lt;a href=&quot;https://class-connect.kr&quot;&gt;https://class-connect.kr&lt;/a&gt;를 사용해서 진행하는데, 아무래도 처음 사용해 보면 어려울 수도 있기 때문에, 실습 끝나고 실습실에서 ClassConnect 신청을 도와주던가,&amp;nbsp;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전화번호를 주고 받든 튜터링의 물꼬를 트는 것이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 한 번 튜터링을 진행하고 나면 이후에는 계속 많이 신청했던 거 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;*2025-1학기를 마지막으로 &lt;a href=&quot;https://class-connect.kr&quot;&gt;https://class-connect.kr&lt;/a&gt; 서비스가 종료되었습니다. 따라서 &lt;a href=&quot;https://whattime.co.kr/&quot;&gt;https://whattime.co.kr/&lt;/a&gt; (되는시간, 유료), 구글 워크스페이스를 활용하여 상담 예약을 하거나 아니면 첫 시간에 본인의 전화번호를 알려주거나 카카오톡 1:1 오픈채팅방을 만들어서 홍보한 다음, 조교님이나 교수님께 부탁드려 아주BB 공지사항에 올리는 것도 좋은 방법입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;교수님, 조교님과의 소통&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 중요한 부분이 교수님, 조교님과의 소통입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 트레이너를 시작하기 전에 담당 교수님, 조교님들과 회의를 하게 됩니다. 이때 실습 제출 마감 시간이나 점수 기준을 정하게 되는데, 실습 제출 시간까지 제출하지 못하거나 감점된 학생들에게 점수 복구 제도를 도입하자고 어필하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생들이 코딩 트레이너 상담을 신청할 명분이 있으면 상담을 하기 수월합니다(점수 복구는 해야 하니까).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교수님, 조교님들께서도 코딩 트레이너를 많이 배려해 주시고 적극적으로 의견을 반영하려고 하십니다. 실습 점수에 큰 변별력을 두지 않으려는 분들도 많아 괜찮은 전략?이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 점수 복구 제도가 있을 때 평균 상담 횟수가 훨씬 많았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코딩 트레이너를 하면서 느낀 점&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9gtu/btsPLWU4ODO/3zFuAuUHYG78xFnSFL6jK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9gtu/btsPLWU4ODO/3zFuAuUHYG78xFnSFL6jK1/img.png&quot; data-alt=&quot;객체지향프로그래밍및실습 4수강&amp;amp;hellip;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9gtu/btsPLWU4ODO/3zFuAuUHYG78xFnSFL6jK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9gtu%2FbtsPLWU4ODO%2F3zFuAuUHYG78xFnSFL6jK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;386&quot; height=&quot;447&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;객체지향프로그래밍및실습 4수강&amp;hellip;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 트레이너를 하면서 어떻게 보면 저는 &lt;b&gt;객체지향프로그래밍 및 실습 강의를 4번 수강&lt;/b&gt;했다고 느낍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024-1학기부터 2025-1학기까지 3학기 동안 활동하며, 매 학기마다 제 자신이 성장하고 있다는 것을 확실히 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 과제를 풀고, 학생들과 튜터링을 진행하면서 매번 내용을 복습하게 되었고, 그 과정에서 객체지향 프로그래밍과 Java에 대한 이해를 더 깊게 다질 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 코딩 트레이너를 맡았을 땐, 마치 객체지향프로그래밍 및 실습 강의를 재수강하는 기분이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 완벽히 이해하지 못한 부분도 있었고, 수강생들의 질문에 제대로 답변하지 못해 당황했던 순간도 많았습니다. 그래서 처음 한 학기는 수강생들보다 더 열심히 공부했던 시기였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TY5uf/btsPL30Y2m8/R9wvvpBUPGHZCb67WqOXb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TY5uf/btsPL30Y2m8/R9wvvpBUPGHZCb67WqOXb0/img.png&quot; data-alt=&quot;실습 과제에서 나온 개념들을 정리한 글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TY5uf/btsPL30Y2m8/R9wvvpBUPGHZCb67WqOXb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTY5uf%2FbtsPL30Y2m8%2FR9wvvpBUPGHZCb67WqOXb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;281&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;334&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;과제 관련해서 상담을 신청한 학생들에게는 준비한 자료를 활용해 과제의 전체적인 흐름을 설명하고, 특히 JVM 메모리 같은 부분도 설명해 주면서 학생들의 이해를 높였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 Java와 객체지향에 대한 이해가 점점 깊어졌고, 또한 학생들이 제출한 다양한 코드들을 분석하고 피드백을 주면서 문제를 바라보는 시야가 훨씬 넓어졌습니다.&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;ldquo;남들이 이해하기 쉽게 설명할 수 있다는 것이 진짜 아는 것&amp;rdquo;이라고 많이들 표현합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생들에게 설명해 주기 위해 자료를 정리하고, 어떻게 하면 내가 이해한 내용을 상대방이 이해하기 쉽게 설명할지 고민하는 과정은 개념 정리와 말하는 방식에도 큰 도움이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 튜터링을 통해 학생들과 자연스럽게 친분을 쌓을 수 있었고, 수업 외적으로도 진로나 대학생활 이야기를 나누며 네트워크를 형성할 수 있었던 점도 좋았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇보다 나의 성장과 함께 다른 학생들의 성장을 도울 수 있어서 큰 보람을 느낄 수 있는 의미 있는 활동이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;무조건 추천하는 활동!&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csKAql/btsPO2TMTWH/XR7xxZDSAnrPPfPCsDkk4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csKAql/btsPO2TMTWH/XR7xxZDSAnrPPfPCsDkk4K/img.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;596&quot; data-is-animation=&quot;false&quot; width=&quot;509&quot; height=&quot;285&quot; style=&quot;width: 32.5315%; margin-right: 10px;&quot; data-widthpercent=&quot;33.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csKAql/btsPO2TMTWH/XR7xxZDSAnrPPfPCsDkk4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsKAql%2FbtsPO2TMTWH%2FXR7xxZDSAnrPPfPCsDkk4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjBtRF/btsPM0pbngq/Y16ZmY66hN71ektlj057OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjBtRF/btsPM0pbngq/Y16ZmY66hN71ektlj057OK/img.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;712&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.606%; margin-right: 10px;&quot; data-widthpercent=&quot;33.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjBtRF/btsPM0pbngq/Y16ZmY66hN71ektlj057OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjBtRF%2FbtsPM0pbngq%2FY16ZmY66hN71ektlj057OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u8bDy/btsPMYLDrjj/UMTaPu5koaaAYYGiB21qVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u8bDy/btsPMYLDrjj/UMTaPu5koaaAYYGiB21qVk/img.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;802&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.537%;&quot; data-widthpercent=&quot;33.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u8bDy/btsPMYLDrjj/UMTaPu5koaaAYYGiB21qVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu8bDy%2FbtsPMYLDrjj%2FUMTaPu5koaaAYYGiB21qVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1432&quot; height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;3학기 동안의 코딩 트레이너 활동 참여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGuHk7/dJMcabQuO0W/Y41kTf1dzhA5BCDZL4NSg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGuHk7/dJMcabQuO0W/Y41kTf1dzhA5BCDZL4NSg0/img.png&quot; data-alt=&quot;(추가) 2025-2학기 코딩트레이너 오리엔테이션에 내가 작성한 후기가 올라갔다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGuHk7/dJMcabQuO0W/Y41kTf1dzhA5BCDZL4NSg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGuHk7%2FdJMcabQuO0W%2FY41kTf1dzhA5BCDZL4NSg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;301&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(추가) 2025-2학기 코딩트레이너 오리엔테이션에 내가 작성한 후기가 올라갔다.&lt;/figcaption&gt;
&lt;/figure&gt;
&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;따라서 실습 시간이 맞는다면 꼭 한 번 해보시길 권하고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말씀드린 것처럼, &lt;b&gt;활동비도 받고&lt;/b&gt;, &lt;b&gt;실력도 키우고&lt;/b&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;저는 이번 2025-1학기를 마지막으로, 2학기에는 인턴십을 하게 되어 더 이상 코딩 트레이너 활동을 이어가진 못하지만, 주변 후배들에게는 꼭 추천하고 싶은 정말 값진 경험이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 인턴 면접에서도 이 활동에 대해 질문을 받은 적이 있었고, 면접관 분들도 매우 흥미롭게 들어주셨습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 트레이너 활동을 고려하고 있는 분들께 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 언제든지 연락 주세요! (&lt;a href=&quot;mailto:jysim0326@ajou.ac.kr&quot;&gt;jysim0326@ajou.ac.kr&lt;/a&gt;)&lt;/p&gt;</description>
      <category>SW융합교육원</category>
      <category>SW중심대학</category>
      <category>아주대학교</category>
      <category>코딩트레이너</category>
      <author>simzard</author>
      <guid isPermaLink="true">https://simzard.tistory.com/4</guid>
      <comments>https://simzard.tistory.com/4#entry4comment</comments>
      <pubDate>Sun, 10 Aug 2025 19:36:07 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] URL 저장을 위한 데이터 타입 VARCHAR vs TEXT</title>
      <link>https://simzard.tistory.com/3</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 상황 - URL 길이 초과로 인한 에러 발생&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7pBAc/btsLSMnDRQI/zFCLvMBTioTB0yUwxwj5s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7pBAc/btsLSMnDRQI/zFCLvMBTioTB0yUwxwj5s0/img.png&quot; data-alt=&quot;[MYSQL] &amp;amp;ldquo;Data truncation: Data too long for column&amp;amp;rdquo;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7pBAc/btsLSMnDRQI/zFCLvMBTioTB0yUwxwj5s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7pBAc%2FbtsLSMnDRQI%2FzFCLvMBTioTB0yUwxwj5s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1890&quot; height=&quot;116&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[MYSQL] &amp;ldquo;Data truncation: Data too long for column&amp;rdquo;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://ajouevent.com&quot;&gt;ajouevent.com&lt;/a&gt; 서비스에서 학교 공지사항을 크롤링하던 중, 데이터베이스에 이미지 URL을 저장하는 과정에서 다음과 같은 에러가 발생했다.&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;2025/01/03 16:11:24 utils.go:156: {&quot;timestamp&quot;:&quot;2025-01-03T07:11:24.327+00:00&quot;,&quot;message&quot;:&quot;could not execute statement [Data truncation: Data too long for column 'url' at row 1] [insert into club_event_image (club_event_id,url) values (?,?)]; SQL [insert into club_event_image (club_event_id,url) values (?,?)]&quot;,&quot;details&quot;:&quot;uri=/api/webhook/crawling&quot;}&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;크롤링 중 에러가 발생한 이미지 URL은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://job.ajou.ac.kr/upload/Recruit/20250103_96001865/250103%20[%EC%A0%95%EA%B7%9C,%EA%B3%84%EC%95%BD][%EB%B8%8C%EB%A6%BF%EC%A7%95%EA%B7%B8%EB%A3%B9%EC%BD%94%EB%A6%AC%EC%95%84]%20%ED%95%B4%EC%99%B8%EC%98%81%EC%97%85%ED%8C%80(MICE)%20%EC%B1%84%EC%9A%A9%EA%B3%B5%EA%B3%A01.jpg&quot;&gt;https://job.ajou.ac.kr/upload/Recruit/20250103_96001865/250103%20[%EC%A0%95%EA%B7%9C,%EA%B3%84%EC%95%BD][%EB%B8%8C%EB%A6%BF%EC%A7%95%EA%B7%B8%EB%A3%B9%EC%BD%94%EB%A6%AC%EC%95%84]%20%ED%95%B4%EC%99%B8%EC%98%81%EC%97%85%ED%8C%80(MICE)%20%EC%B1%84%EC%9A%A9%EA%B3%B5%EA%B3%A01.jpg&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;원인 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boBIlp/btsLS934rdF/PY8pIvURjzrpn9k9W1xjr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boBIlp/btsLS934rdF/PY8pIvURjzrpn9k9W1xjr1/img.png&quot; data-alt=&quot;varchar(255) 타입으로 url을 저장하고 있었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boBIlp/btsLS934rdF/PY8pIvURjzrpn9k9W1xjr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboBIlp%2FbtsLS934rdF%2FPY8pIvURjzrpn9k9W1xjr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;270&quot; height=&quot;56&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;varchar(255) 타입으로 url을 저장하고 있었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 URL의 길이가 총 276자로 VARCHAR(255)의 최대 길이를 초과했기 때문에 &lt;b&gt;&amp;ldquo;Data truncation: Data too long for column &amp;lsquo;url&amp;rsquo; at row1&amp;rdquo;&lt;/b&gt; 에러가 발생한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 URL 저장 시 데이터 타입과 길이를 재설정해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 URL 저장 방식, 데이터 타입, 그리고 URL의 길이 제한을 다시 고려했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;URL 저장 방식&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공지사항 크롤링을 통해 가져온 이미지 URL&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학교 공지사항 글에 포함된 이미지는 이미 학교 서비스를 통해 URL 형태로 생성된 상태다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ex)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.ajou.ac.kr/_attach/ajou/editor-image/2024/12/lwDjcIfEGlYfXOdCCNwsPtkhVK.png&quot;&gt;https://www.ajou.ac.kr/_attach/ajou/editor-image/2024/12/lwDjcIfEGlYfXOdCCNwsPtkhVK.png&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;*학교 공지사항 글을 크롤링 하고, 이미지를 따로 AWS S3, Google Cloud Storage, Firbase Storage 같은 스토리지 서비스를 통해 저장하지는 않았다. 학교 공지사항 글에 포함된 이미지는 이미 학교 서비스를 통해 URL 형태로 생성된 상태다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W8Mxl/btsLSqkP5ej/8qieVtocxBRSKBUxazqXFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W8Mxl/btsLSqkP5ej/8qieVtocxBRSKBUxazqXFk/img.png&quot; data-alt=&quot;https://www.ajou.ac.kr/_attach/ajou/editor-image/2024/12/lwDjcIfEGlYfXOdCCNwsPtkhVK.pngaj&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W8Mxl/btsLSqkP5ej/8qieVtocxBRSKBUxazqXFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW8Mxl%2FbtsLSqkP5ej%2F8qieVtocxBRSKBUxazqXFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;446&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1291&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.ajou.ac.kr/_attach/ajou/editor-image/2024/12/lwDjcIfEGlYfXOdCCNwsPtkhVK.pngaj&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ajouevent.com에서 게시글을 작성하면서 첨부하는 이미지&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 &lt;a href=&quot;http://ajouevent.com&quot;&gt;ajouevent.com&lt;/a&gt;에서 게시글을 작성할 때, 이미지는 Presigned URL을 통해 AWS S3에 업로드된다.&lt;/li&gt;
&lt;li&gt;업로드된 이미지는 S3의 객체 URL을 통해 조회가 가능하다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ex) &lt;a href=&quot;https://ajouevent-image.s3.ap-northeast-2.amazonaws.com/img-symbol.png&quot;&gt;https://{버킷이름}.s3.ap-northeast-2.amazonaws.com/img-symbol.png&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;DB에 이미지 URL 저장 vs 이미지 데이터 직접 저장&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 데이터를 직접 저장하려면 BLOB, LONGBLOB과 같은 데이터 타입을 사용해야 하지만, 이는 아래와 같은 문제를 유발한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터베이스 크기 증가: 이미지 파일이 데이터베이스의 크기를 증가시킴&lt;/li&gt;
&lt;li&gt;데이터베이스 성능 저하: 이미지를 바이너리 데이터로 변환하여 데이터베이스에 저장하고 읽는, 이미지 읽기와 쓰기 과정에서 느려질 가능성이 높다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이미 학교 서비스를 통해 만들어진 URL, S3를 통해 만들어진 이미지 URL을 바로 &lt;b&gt;MySQL DB의 column으로 저장하는 방식을 택했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;데이터 타입 결정: CHAR vs VARCHAR vs TEXT&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL을 DB column으로 저장할 때 데이터 타입을 어떻게 할지 고민이 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;CHAR vs VARCHAR&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CHAR: 고정 길이 데이터(&lt;b&gt;고정형&lt;/b&gt;) 저장에 적합.&lt;/li&gt;
&lt;li&gt;VARCHAR: 가변 길이 데이터(&lt;b&gt;가변형&lt;/b&gt;) 저장에 적합하며, 길이에 따라 메모리 공간을 효율적으로 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; URL의 길이는 고정되지 않는 &lt;b&gt;가변 길이&lt;/b&gt;이므로, &lt;b&gt;VARCHAR&lt;/b&gt;가 더 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;VARCHAR vs TEXT&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VARCHAR와 TEXT의 차이에 대해서는 Real MySQL 8.0의 저자인 이성욱 당근 DBA께서 잘 설명해놓으신 글이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/daangn/varchar-vs-text-230a718a22a1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737277267538&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;VARCHAR vs TEXT&quot; data-og-description=&quot;개요&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; data-og-url=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x95zF/hyX0xfbpXX/xzK1s2kXl5pGUBKsMONYN0/img.png?width=1200&amp;amp;height=457&amp;amp;face=0_0_1200_457&quot;&gt;&lt;a href=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x95zF/hyX0xfbpXX/xzK1s2kXl5pGUBKsMONYN0/img.png?width=1200&amp;amp;height=457&amp;amp;face=0_0_1200_457');&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;VARCHAR vs TEXT&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;medium.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;요약하자면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL 서버는 레코드의 컬럼 데이터를 B-Tree(Clustering Index)에 Inline으로 저장한다. 만약 레코드의 전체 크기가 InnoDB 스토리지 엔진의 최대 레코드 크기 제한(16KB 페이지에서는 8,117 바이트)을 초과하면, 길이가 긴 컬럼을 선택해서 off-Page로 저장하게 된다. (*이때, VARCHAR, TEXT 두 타입의 컬럼 모두 컬럼에 저장된 값으로 인해 최대 레코드 크기 제한을 넘어서면 off-page로 저장된다)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;rarr; VARCHAR 컬럼에 너무 큰 길이를 사용하면, off-Page에 저장될 수 있고, 이는 성능 이슈와 직결된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VARCHAR 타입은 최대 크기가 설정되기 때문에, 메모리 공간을 records[2] 버퍼에 최대 크기로 미리 할당해두어 메모리를 활용한다. records[2] 메모리 버퍼에 할당되면 많은 커넥션에 의해 재사용된다. 반면에 TEXT는 실제 최대 크기만큼 메모리를 할당해두면 메모리 낭비가 너무 심해진다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;대신, VARCHAR 타입에 저장된 값이 길어서 off-Page로 저장된 경우 MySQL 서버는 records[2] 버퍼를 사용하지 못하고 새롭게 메모리 공간을 할당해서 사용한다. 그래서 VARCHAR 타입에 매우 큰 값이 빈번하게 저장되는 경우는 주의가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;따라서 VARCHAR에 저장되는 URL의 최대 길이를 정하고, VARCHAR 컬럼이 추가되면서 레코드의 크기가 InnoDB 스토리지 엔진의 최대 레코드 크기 제한을 넘는지 비교해야했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;URL 길이 제한&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL DB의 column으로 저장되는 URL의 길이가 어느정도인지에 따라 VARCHAR를 쓸지 TEXT를 쓸지 정해진다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;일반적인 브라우저 지원 길이&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V4ayy/btsLTwScKSX/DVm1liUrkRc2KwCL9lFCsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V4ayy/btsLTwScKSX/DVm1liUrkRc2KwCL9lFCsk/img.png&quot; data-alt=&quot;출처: Chronium 공식 문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V4ayy/btsLTwScKSX/DVm1liUrkRc2KwCL9lFCsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV4ayy%2FbtsLTwScKSX%2FDVm1liUrkRc2KwCL9lFCsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;208&quot; data-origin-width=&quot;1974&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: Chronium 공식 문서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2xtou/btsLSlc4r54/kyeMoSSTAIgCMoEyQ1a6NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2xtou/btsLSlc4r54/kyeMoSSTAIgCMoEyQ1a6NK/img.png&quot; data-alt=&quot;출처: https://support.microsoft.com/ko-kr/topic/internet-explorer%EC%9D%98-%EC%B5%9C%EB%8C%80-url-%EA%B8%B8%EC%9D%B4%EB%8A%94-2-083%EC%9E%90%EC%9E%85%EB%8B%88%EB%8B%A4-174e7c8a-6666-f4e0-6fd6-908b53c12246&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2xtou/btsLSlc4r54/kyeMoSSTAIgCMoEyQ1a6NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2xtou%2FbtsLSlc4r54%2FkyeMoSSTAIgCMoEyQ1a6NK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;381&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://support.microsoft.com/ko-kr/topic/internet-explorer%EC%9D%98-%EC%B5%9C%EB%8C%80-url-%EA%B8%B8%EC%9D%B4%EB%8A%94-2-083%EC%9E%90%EC%9E%85%EB%8B%88%EB%8B%A4-174e7c8a-6666-f4e0-6fd6-908b53c12246&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwuPsr/btsLSPY46fV/64YpbQcN5nSE1UxNCr8CIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwuPsr/btsLSPY46fV/64YpbQcN5nSE1UxNCr8CIK/img.png&quot; data-alt=&quot;출처: https://saturncloud.io/blog/what-is-the-maximum-length-of-a-url-in-different-browsers/, 출처: https://serpstat.com/blog/how-long-should-be-the-page-url-length-for-seo/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwuPsr/btsLSPY46fV/64YpbQcN5nSE1UxNCr8CIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwuPsr%2FbtsLSPY46fV%2F64YpbQcN5nSE1UxNCr8CIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;388&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://saturncloud.io/blog/what-is-the-maximum-length-of-a-url-in-different-browsers/, 출처: https://serpstat.com/blog/how-long-should-be-the-page-url-length-for-seo/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;2,083자&lt;/b&gt; Firefox는 &lt;b&gt;65,536자,&lt;/b&gt; Safari는 &lt;b&gt;80,000자&lt;/b&gt;까지 허용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Presigned URL 및 CDN URL&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Presigned URL&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS S3 Presigned URL, Google Cloud Storage와 같은 스토리지에서 생성되는 URL은 보안 토큰, 만료 시간, 키 경로 등을 포함하여 길이가 길어질 수 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;따라서 복잡한 쿼리 파라미터가 추가되면 더 늘어날 가능성은 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기존 DB에 저장된 이미지 URL과 비교&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0qDV8/btsLSzB91vC/fQho043NnLKEfMT4Gx50HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0qDV8/btsLSzB91vC/fQho043NnLKEfMT4Gx50HK/img.png&quot; data-alt=&quot;왼쪽: DB에 저장된 이미지 URL 길이 탑10, 오른쪽: 현재 DB에 저장되어있는 이미지 URL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0qDV8/btsLSzB91vC/fQho043NnLKEfMT4Gx50HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0qDV8%2FbtsLSzB91vC%2FfQho043NnLKEfMT4Gx50HK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1794&quot; height=&quot;632&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왼쪽: DB에 저장된 이미지 URL 길이 탑10, 오른쪽: 현재 DB에 저장되어있는 이미지 URL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 DB에 저장된 2016년부터의 아주대학교 공지사항의 20만 개 이미지 URL을 분석했을 때, 2025년 1월 18일 기준 가장 긴 URL의 길이는 &lt;b&gt;291&lt;/b&gt;자다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미지 생성 패턴&lt;/b&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;아주대 도메인(&lt;a href=&quot;http://ajou.ac.kr&quot;&gt;ajou.ac.kr&lt;/a&gt;)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이미지가 아주대 도메인(&lt;a href=&quot;http://ajou.ac.kr&quot;&gt;ajou.ac.kr&lt;/a&gt;)의 다양한 하위 도메인에서 업로드 됨.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아주대 공식 홈페이지 - &lt;a href=&quot;https://www.ajou.ac.kr/_attach/ajou/editor-image/2024/12/lwDjcIfEGlYfXOdCCNwsPtkhVK.png&quot;&gt;https://www.ajou.ac.kr/_attach/ajou/editor-image/2024/12/lwDjcIfEGlYfXOdCCNwsPtkhVK.png&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;아주대 소프트웨어학과 홈페이지 - &lt;a href=&quot;http://software.ajou.ac.kr/smart_editor/upload/20241211161530891547026.jpg&quot;&gt;http://software.ajou.ac.kr/smart_editor/upload/20241211161530891547026.jpg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;아주대 일자리센터 홈페이지 -&lt;a href=&quot;https://job.ajou.ac.kr/upload/Recruit/20250107_40001543/250107%20[%EC%A0%95%EA%B7%9C][%EC%97%A0%EB%84%A5%EC%8A%A4]%20%EC%83%9D%EC%82%B0%EA%B4%80%EB%A6%AC,%EC%97%B0%EA%B5%AC%EA%B8%B0%ED%9A%8D%ED%8C%80%20%EC%B6%94%EC%B2%9C%EC%B1%84%EC%9A%A9.jpg&quot;&gt;https://job.ajou.ac.kr/upload/Recruit/20250107_40001543/250107%20[%EC%A0%95%EA%B7%9C][%EC%97%A0%EB%84%A5%EC%8A%A4]%20%EC%83%9D%EC%82%B0%EA%B4%80%EB%A6%AC,%EC%97%B0%EA%B5%AC%EA%B8%B0%ED%9A%8D%ED%8C%80%20%EC%B6%94%EC%B2%9C%EC%B1%84%EC%9A%A9.jpg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;URL 구조:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;저장 디렉토리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;대부분 /_attach/editor-image/나 /_resources/_upload_image/ 디렉토리 하위에 저장됨. 공지사항 작성 시스템에서 자동으로 지정된 경로로 업로드.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일 이름 규칙
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;랜덤 ID 방식&lt;/b&gt;: 난수 조합으로 파일 이름이 자동 생성되어 중복 방지 (lwDjcIfEGlYfXOdCCNwsPtkhVK.png).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제목 포함 방식&lt;/b&gt;: 제목이나 작성자 정보를 인코딩 (250107 [%EC%A0%95%EA%B7%9C] [%EC%97%A0%EB%84%A5%EC%8A%A4] 생...jpg).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Google Drive 링크&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;공지사항에 Google Drive에서 공유된 이미지를 포함.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ci6.googleusercontent.com/proxy/HBt0wkH6g5gZgygDhf34URNhDNIMK3OcGm76gQx8DLM8DzCHPcYpX98oNaQE_WXp8JZLimBQXKUCa32Na4wT44Mt2abONYNQbfYNz3MYVGbRCjoQB51-Uf2qRrIbvw=s0-d-e1-ft#&quot;&gt;https://ci6.googleusercontent.com/proxy/HBt0wkH6g5gZgygDhf34URNhDNIMK3OcGm76gQx8DLM8DzCHPcYpX98oNaQE_WXp8JZLimBQXKUCa32Na4wT44Mt2abONYNQbfYNz3MYVGbRCjoQB51-Uf2qRrIbvw=s0-d-e1-ft#&lt;/a&gt;&lt;a href=&quot;https://ci6.googleusercontent.com/proxy/HBt0wkH6g5gZgygDhf34URNhDNIMK3OcGm76gQx8DLM8DzCHPcYpX98oNaQE_WXp8JZLimBQXKUCa32Na4wT44Mt2abONYNQbfYNz3MYVGbRCjoQB51-Uf2qRrIbvw=s0-d-e1-ft#http://drive.google.com/uc?export=view&amp;amp;id=1LsA9ZoYfcBS5zRtEmo2nxtUzthBMjeAU&quot;&gt;&amp;lt;&lt;/a&gt;&lt;a href=&quot;http://drive.google.com/uc?export=view&amp;amp;id=1LsA9ZoYfcBS5zRtEmo2nxtUzthBMjeAU&quot;&gt;http://drive.google.com/uc?export=view&amp;amp;id=1LsA9ZoYfcBS5zRtEmo2nxtUzthBMjeAU&lt;/a&gt;&lt;a href=&quot;https://ci6.googleusercontent.com/proxy/HBt0wkH6g5gZgygDhf34URNhDNIMK3OcGm76gQx8DLM8DzCHPcYpX98oNaQE_WXp8JZLimBQXKUCa32Na4wT44Mt2abONYNQbfYNz3MYVGbRCjoQB51-Uf2qRrIbvw=s0-d-e1-ft#http://drive.google.com/uc?export=view&amp;amp;id=1LsA9ZoYfcBS5zRtEmo2nxtUzthBMjeAU&quot;&gt;&amp;gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;링크에 export=view&amp;amp;id=&amp;lt;파일ID&amp;gt;와 같은 매개변수가 포함됨.&lt;/li&gt;
&lt;li&gt;외부 클라우드 기반 스토리지를 이용하는 방식으로, 학교 서버에 이미지를 저장하지 않는 경우 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 도메인 (&lt;a href=&quot;http://sktelecom.com&quot;&gt;sktelecom.com&lt;/a&gt;)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;외부 협력업체나 제휴 프로그램(예: SK텔레콤)과 관련된 이미지.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.raoncorp.com/data/eDM/220530/02/img/main.png&quot;&gt;https://www.raoncorp.com/data/eDM/220530/02/img/main.png&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hrd.sktelecom.com/Tearning/T_earning_mail/AI_Live/001.png&quot;&gt;http://hrd.sktelecom.com/Tearning/T_earning_mail/AI_Live/001.png&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;외부 도메인의 리소스를 직접 참조.&lt;/li&gt;
&lt;li&gt;URL은 외부 시스템에서 관리됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그래서 DB column에 저장되는 URL 길이 제한은 얼마로?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;따라서 URL의 길이 제한은&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금까지 저장된 아주대학교 공지사항의 이미지 URL 길이가 300자를 넘지 않았다.&lt;/li&gt;
&lt;li&gt;외부 URL을 가져오는 경우는 드물며, 가져오더라도 길이가 짧은 편이다.&lt;/li&gt;
&lt;li&gt;URL에 쿼리 매개변수가 과도하게 포함되거나, 이미지 데이터를 base64로 인코딩하거나, AWS S3, 구글 드라이브처럼 외부 서비스에서 생성된 링크가 길고 복잡하더라도 &lt;b&gt;브라우저에서 지원하는 URL 길이 제한을 초과하는 경우는 거의 없다는 점&lt;/b&gt;을 고려하여&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 점유율이 가장 높은 크롬 브라우저의 URL 길이 제한과 동일하게 2083자로 설정했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*그래도 추가적으로 백엔드 로직에서 URL 길이가 2,083자를 넘으면 로그를 기록하거나 에러 메시지를 반환하도록 처리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론 - VARCHAR(2083) 선택&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 &lt;b&gt;VARCHAR(2083)&lt;/b&gt;를 선택한 이유는 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 url을 사용하는 이미지 테이블의 레코드가 image_id(bigint), url(VARCHAR(2083), post_id(bigint)로 설정하면 기타 오버헤드를 포함해도 2100바이트 정도로, 현재 &lt;b&gt;InnoDB 스토리지 엔진의 최대 레코드 크기 제한(16KB 페이지에서는 8,117 바이트)을 넘어서지 않는다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;club_event_image 테이블에 &lt;b&gt;추가적인 컬럼이 들어갈 가능성이 낮다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;추가되더라도 VARCHAR(2083) 같은 긴 컬럼이 3개~4개 추가될 가능성이 적기 때문에, 컬럼이 추가되면서 &lt;b&gt;레코드 용량을 넘어설 가능성이 적다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1737281734251&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE club_event_image (
    image_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 8바이트
    club_event_id BIGINT NOT NULL, -- 8바이트
    url VARCHAR(2083) NOT NULL -- 최대 2083바이트 + 2바이트(길이 오버헤드)
);
image_id (8) + club_event_id (8) + url(2085) + 기타 오버헤드 &amp;lt;= 8117바이트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCjni/btsLTahEsns/e76snLBtPOm8hBkkRaux6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCjni/btsLTahEsns/e76snLBtPOm8hBkkRaux6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCjni/btsLTahEsns/e76snLBtPOm8hBkkRaux6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCjni%2FbtsLTahEsns%2Fe76snLBtPOm8hBkkRaux6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;172&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/couaEm/btsLS7L1JEy/fFldCrcTNxQCCA8ecPa6E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/couaEm/btsLS7L1JEy/fFldCrcTNxQCCA8ecPa6E0/img.png&quot; data-alt=&quot;InnoDB 스토리지 엔진의 레코드 크기 제한은 페이지 크기의 약 절반. 즉 현재 DB에서 페이지 크기 = 16KB, 최대 레코드 크기 &amp;amp;asymp; 8,117 바이트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/couaEm/btsLS7L1JEy/fFldCrcTNxQCCA8ecPa6E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcouaEm%2FbtsLS7L1JEy%2FfFldCrcTNxQCCA8ecPa6E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;437&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;InnoDB 스토리지 엔진의 레코드 크기 제한은 페이지 크기의 약 절반. 즉 현재 DB에서 페이지 크기 = 16KB, 최대 레코드 크기 &amp;asymp; 8,117 바이트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL의 길이는 일반적으로 2,083자를 넘지 않는다. &amp;rarr; VARCHAR(2083)을 사용하면 &amp;ldquo;&lt;b&gt;inline&lt;/b&gt;&amp;rdquo; 방식으로 데이터를 저장하여 효율적인 처리가 가능
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;매우 긴 URL이라고 하더라도 브라우저에서 지원하는 URL을 넘길 가능성이 적다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;게시글을 조회할 때마다 이미지 테이블을 조회하고, &lt;b&gt;항상 URL(이미지) 컬럼의 데이터가 필요하다. (자주 접근)&lt;/b&gt; &amp;rarr; TEXT보다 &lt;b&gt;VARCHAR가 효율적&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;글을 작성하며 알게 된 사실&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VARCHAR라고 무조건 Inline으로 저장하고, TEXT라고 무조건 off-Page 저장 X
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InnoDB 스토리지 엔진은 레코드의 전체 크기가 제한을 초과하면 길이가 긴 컬럼을 선택해서&amp;nbsp;Off-Page로 저장하게 된다 &amp;rarr; &lt;b&gt;VARCHAR 컬럼에 저장된 값이 큰 경우에도 off-Page로 저장된다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;VARCHAR를 사용한다고 하더라도 off-Page로 넘어가면(off-page 저장소로 분리 저장되는 순간) &lt;b&gt;메모리 버퍼를 사용할 수 없기 때문에&lt;/b&gt; 조심해야 한다. (매번 매모리를 새로 할당 및 해제)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VARCHAR를 쓰면 실제 저장되는 데이터 크기 만큼 메모리 공간을 차지함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) VARCHAR(2083) 컬럼에 &amp;ldquo;Hello&amp;rdquo;라는 5글자를 저장하면: 저장 공간 = 5(데이터) + 1(오버헤드) = 6바이트만 사용.&lt;/li&gt;
&lt;li&gt;다만 TABLE 구조체의 records[2]&amp;nbsp;버퍼를 이용하는 과정에서 &lt;b&gt;실제 레코드의 데이터 크기에 관계 없이 최대 크기로 메모리 할당&lt;/b&gt;을 해두기 때문에 VARCHAR(255)와 VARCHAR(2083)의 성능 차이가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VARCHAR는 index를 생성할 수 있고,&amp;nbsp;TEXT는 index를 생성할 수 없다. X
&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;B-Tree 인덱스뿐만 아니라 전문 검색 인덱스도&amp;nbsp;TEXT&amp;nbsp;타입과&amp;nbsp;VARCHAR&amp;nbsp;타입 컬럼 모두 동일하게 생성할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1737281944171&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- // 컬럼 그대로 사용시, 인덱스 생성 불가
mysql&amp;gt; ALTER TABLE tb_varchar ADD INDEX ix_fd (fd);
ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

mysql&amp;gt; ALTER TABLE tb_lob ADD INDEX ix_fd (fd);
ERROR 1170 (42000): BLOB/TEXT column 'fd' used in key specification without a key length

-- // 컬럼 값의 길이(프리픽스)를 지정하면, 인덱스 생성 가능
mysql&amp;gt; ALTER TABLE tb_varchar ADD INDEX ix_fd ( fd(50) );
mysql&amp;gt; ALTER TABLE tb_lob ADD INDEX ix_fd ( fd(50) );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;b&gt;&lt;a href=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/daangn/varchar-vs-text-230a718a22a1&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737281967260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;VARCHAR vs TEXT&quot; data-og-description=&quot;개요&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; data-og-url=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x95zF/hyX0xfbpXX/xzK1s2kXl5pGUBKsMONYN0/img.png?width=1200&amp;amp;height=457&amp;amp;face=0_0_1200_457&quot;&gt;&lt;a href=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/daangn/varchar-vs-text-230a718a22a1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x95zF/hyX0xfbpXX/xzK1s2kXl5pGUBKsMONYN0/img.png?width=1200&amp;amp;height=457&amp;amp;face=0_0_1200_457');&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;VARCHAR vs TEXT&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;medium.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>ajouevent.com</category>
      <category>MySQL</category>
      <category>URL</category>
      <category>url 데이터 타입</category>
      <category>varchar vs text</category>
      <author>simzard</author>
      <guid isPermaLink="true">https://simzard.tistory.com/3</guid>
      <comments>https://simzard.tistory.com/3#entry3comment</comments>
      <pubDate>Sun, 19 Jan 2025 20:01:59 +0900</pubDate>
    </item>
    <item>
      <title>FCM 키워드 알림 기능 개발기 feat. FCM Topic 한글, 특수문자 사용 가능 여부</title>
      <link>https://simzard.tistory.com/2</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zYsF5/btsLLum87nz/0m7M9y2877PMiNrhmlNsFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zYsF5/btsLLum87nz/0m7M9y2877PMiNrhmlNsFk/img.png&quot; data-alt=&quot;이 푸시 알림을 받기 위해 ajouevent.com 서비스를 만들었다고 해도 과언이 아니다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zYsF5/btsLLum87nz/0m7M9y2877PMiNrhmlNsFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzYsF5%2FbtsLLum87nz%2F0m7M9y2877PMiNrhmlNsFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;420&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 푸시 알림을 받기 위해 ajouevent.com 서비스를 만들었다고 해도 과언이 아니다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 아주대학교 공지사항을 유튜브처럼 구독하여 푸시 알림을 받을 수 있는 &lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.ajouevent.com&quot;&gt;https://www.ajouevent.com&lt;/a&gt; 서비스를 운영중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주대학교의 공지사항 ex) 아주대학교 일반, 소프트웨어학과, 경영대학, 기숙사 등등 다양한 학과/단과대/장학 공지사항을 구독할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 &lt;b&gt;장학, 공모전, 인턴, 수강신청&lt;/b&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;ajouevent 서비스의 &lt;b&gt;키워드 알림 기능&lt;/b&gt;을 개발하면서 겪은 시행착오를 이 글에 적어보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개발배경&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;레퍼런스&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생각했던 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;시스템적 한계&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예시 로직&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아직 남은 개선점&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;후기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개발배경&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIdxg/btsLFLb4Hno/pgXdcSzbaG89eofkTuGMlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIdxg/btsLFLb4Hno/pgXdcSzbaG89eofkTuGMlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIdxg/btsLFLb4Hno/pgXdcSzbaG89eofkTuGMlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIdxg%2FbtsLFLb4Hno%2FpgXdcSzbaG89eofkTuGMlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;676&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1134&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;a href=&quot;https://www.ajouevent.com&quot;&gt;https://www.ajouevent.com&lt;/a&gt;&amp;nbsp;서비스를 만들게 된 가장 큰 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년 1학기 복학 후 학교에서 일본(도쿄)을 보내준다는 해외현장연수 프로그램이 있다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겨울 방학 때 오사카, 교토를 다녀온 뒤에 도쿄를 가고 싶다는 생각이 계속 들었기 때문에 공지가 올라올 날만을 기다렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여느 때와 같이 강의가 끝나고 동기들이랑 쓰리팝에서 롤을 하고 있었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5인큐가 끝난 이후에 다른 친구의 카톡을 통해 선발 공지사항이 올라왔다는 걸 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신청은 2인 1팀으로 나는 지석이와 같이 신청을 했다. 나와 지석이는 군대 전역 후 복학한 직후라 활동을 한 것이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 신청서에도 적을만한 내용이 없어 선발 인원 중 20%를 뽑는 선착순을 노려야 했는데 이미 늦은 뒤였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NwsRQ/btsLFPk7VK4/QA9XoqIOQWjD3qW5GUFq3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NwsRQ/btsLFPk7VK4/QA9XoqIOQWjD3qW5GUFq3k/img.png&quot; data-alt=&quot;조회수가 3700이 넘어가는, 학교에서 인기가 많은 프로그램이었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NwsRQ/btsLFPk7VK4/QA9XoqIOQWjD3qW5GUFq3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNwsRQ%2FbtsLFPk7VK4%2FQA9XoqIOQWjD3qW5GUFq3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;417&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조회수가 3700이 넘어가는, 학교에서 인기가 많은 프로그램이었다.&lt;/figcaption&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;그리고 24년 1학기 다시 공지사항이 올라올 시기가 되었다. 이때는 사실 ajouevent를 파란학기로 개발하고 있는 시점이었지만, 아직 개발이 완성되지 않았다. 그래서 시간만 나면&lt;span data-token-index=&quot;1&quot;&gt; &lt;/span&gt;소프트웨어융합대학 공지사항에 들어가 선발 공지사항이 올라왔는지 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWA08O/btsLFQqQ4xm/9K4v2r7HSK35MsZhGtgwi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWA08O/btsLFQqQ4xm/9K4v2r7HSK35MsZhGtgwi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWA08O/btsLFQqQ4xm/9K4v2r7HSK35MsZhGtgwi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWA08O%2FbtsLFQqQ4xm%2F9K4v2r7HSK35MsZhGtgwi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;257&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모집공고가 2023년과 다르게 2024년에는 좀 더 늦게 올라왔고, 나의 노가다 기간도 길어졌다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 비효율적인 일을 반복하면서 &lt;b&gt;키워드 알림 기능&lt;/b&gt;이 반드시 필요하구나라는 것을 깨달았다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아쉬운 부분이 있으면 직접 만들어야겠다고 생각해서, 기존에 파란학기제를 같이 하기로 한 동기 2명에게 아이디어를 말했고,&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2024-1학기 파란학기제 도전 과제로 제출했다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;레퍼런스&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXZMfr/btsLGk63poC/mTG7fhnQMUW8pGrVUcpC11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXZMfr/btsLGk63poC/mTG7fhnQMUW8pGrVUcpC11/img.png&quot; data-alt=&quot;(왼쪽부터) 당근, 번개장터, 네이버카페의 키워드 알림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXZMfr/btsLGk63poC/mTG7fhnQMUW8pGrVUcpC11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXZMfr%2FbtsLGk63poC%2FmTG7fhnQMUW8pGrVUcpC11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1768&quot; height=&quot;780&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(왼쪽부터) 당근, 번개장터, 네이버카페의 키워드 알림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzwQId/btsLGg4DHVl/UptkCfKlfhFSLYymfC0QGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzwQId/btsLGg4DHVl/UptkCfKlfhFSLYymfC0QGk/img.png&quot; data-alt=&quot;(왼쪽부터) 당근, 당근, 번개장터, 번개장터, 네이버카페의 키워드 구독 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzwQId/btsLGg4DHVl/UptkCfKlfhFSLYymfC0QGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzwQId%2FbtsLGg4DHVl%2FUptkCfKlfhFSLYymfC0QGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1812&quot; height=&quot;792&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;792&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;3가지 앱 모두 자주 접속하기보다는, 내가 등록한 키워드에 해당하는 판매글이 올라오면 들어가서 확인하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ajouevent.com&quot;&gt;https://www.ajouevent.com&lt;/a&gt; 서비스도 사용자가 구독한 공지사항이나 키워드에 대한 알림이 올라오면 사용자들이 이를 확인하기 위해 주로 클릭(접속)하는 특성과 유사하다고 생각하여 구조를 비슷하게 가져갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;a href=&quot;https://www.ajouevent.com&quot;&gt;https://www.ajouevent.com&lt;/a&gt; 서비스의 푸시 알림은 FCM의 Topic을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCM Token과 Topic의 차이는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;FCM Token&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/39Xxi/btsLGYityKc/I8u2un5CBRZkndtCGteK1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/39Xxi/btsLGYityKc/I8u2un5CBRZkndtCGteK1k/img.png&quot; data-alt=&quot;출처: https://zuminternet.github.io/FCM-PUSH/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/39Xxi/btsLGYityKc/I8u2un5CBRZkndtCGteK1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F39Xxi%2FbtsLGYityKc%2FI8u2un5CBRZkndtCGteK1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;289&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://zuminternet.github.io/FCM-PUSH/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱이 FCM 서버와 통신하기 위해 사용되는&amp;nbsp;&lt;b&gt;고유한 식별자&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;앱은 서버와 통신할 때 토큰을 사용하여&amp;nbsp;&lt;b&gt;FCM 서버에서 앱을 식별&lt;/b&gt;하고, 이를 통해&amp;nbsp;&lt;b&gt;메시지 전송&lt;/b&gt;을 할 수 있다.&lt;/li&gt;
&lt;li&gt;FCM의 토큰은&amp;nbsp;&lt;b&gt;앱이 설치된 디바이스마다 고유&lt;/b&gt;하다. &lt;b&gt;앱이 설치된 디바이스를 추가하거나 삭제할때 토큰이 변경&lt;/b&gt;될 수 있다. &lt;b&gt;(refresh)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버는 이러한&amp;nbsp;&lt;b&gt;FCM 토큰을 사용하여 특정 디바이스에 메시지를 전송&lt;/b&gt;할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Token은 Firebase에서 관리하는&amp;nbsp;&lt;b&gt;프로젝트별 접속하는 기기의 고유 ID&lt;/b&gt;로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;FCM Topic&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brmM2t/btsLF1tfRHs/2xdd7n8OxF2SMKhkdd5Mx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brmM2t/btsLF1tfRHs/2xdd7n8OxF2SMKhkdd5Mx0/img.png&quot; data-alt=&quot;출처: https://zuminternet.github.io/FCM-PUSH/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brmM2t/btsLF1tfRHs/2xdd7n8OxF2SMKhkdd5Mx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrmM2t%2FbtsLF1tfRHs%2F2xdd7n8OxF2SMKhkdd5Mx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;585&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;1487&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://zuminternet.github.io/FCM-PUSH/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM의 Topic(토픽)은 일종의 &lt;b&gt;채널&lt;/b&gt;로서, 미리 Topic을 구독한 사용자(토큰)들에게 메시지를 전송할 수 있다.&lt;/li&gt;
&lt;li&gt;Topic을 구독, 구독 취소 요청시에, FCM은 구독한 유저들을 내부적으로 관리한다.&lt;/li&gt;
&lt;li&gt;FCM의 subscribe, unsubscribe 메서드를 통해 구독과 구독 취소 요청을 FCM에 전송할 수 있다.&lt;/li&gt;
&lt;li&gt;Topic을 통해서 푸시 알림을 발송하면, Topic을 구독한 사용자들에게만 메시지를 전송할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&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;Topic 이름의 유일성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Topic 이름의 경우 유일성을 가져야하는데, 만약 유일성을 확보하지 못하면, 같은 이름의 Topic으로 인해 중복 구독 문제가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 방지하기 위해 중복되지 않는 학과/단과대의 &lt;b&gt;영문 표기&lt;/b&gt;를&amp;nbsp;&lt;b&gt;Topic 이름&lt;/b&gt;으로 사용하여 식별 가능하도록 했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLQl6E/btsLGeFRIXP/R8NLkKOxXtbfMeiEddn6ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLQl6E/btsLGeFRIXP/R8NLkKOxXtbfMeiEddn6ZK/img.png&quot; data-alt=&quot;공지사항마다 Topic명은 겹치지 않게 학과의 영문 표기로 설정했다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLQl6E/btsLGeFRIXP/R8NLkKOxXtbfMeiEddn6ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLQl6E%2FbtsLGeFRIXP%2FR8NLkKOxXtbfMeiEddn6ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;402&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공지사항마다 Topic명은 겹치지 않게 학과의 영문 표기로 설정했다&lt;/figcaption&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;학교 공지사항마다 Topic을 두고 사용자가 Topic을 구독하면, 해당 Topic의 공지사항이 올라올 때 푸시 알림을 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 학교 공지사항은 fcm에서 topic 이름으로 소프트웨어학과면 Software , 간호학과면 Nursing 으로 설정하여 사용자들이 topic을 구독할 수 있도록 했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGIIPy/btsLGPrj7v4/RDYKGC8G0dtgsf6Jc81mdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGIIPy/btsLGPrj7v4/RDYKGC8G0dtgsf6Jc81mdK/img.png&quot; data-alt=&quot;학교 공지사항마다 Topic을 두고, Topic을 구독하면 해당 Topic에 대한 푸시 알림과 글을 확인할 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGIIPy/btsLGPrj7v4/RDYKGC8G0dtgsf6Jc81mdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGIIPy%2FbtsLGPrj7v4%2FRDYKGC8G0dtgsf6Jc81mdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;1022&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1022&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;학교 공지사항마다 Topic을 두고, Topic을 구독하면 해당 Topic에 대한 푸시 알림과 글을 확인할 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q40hc/btsLLz9GL2u/CC4Or94G2sfGWqJzt7C6y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q40hc/btsLLz9GL2u/CC4Or94G2sfGWqJzt7C6y0/img.png&quot; data-alt=&quot;사용자는 구독한 Topic에 대해서 공지사항이 올라오면 알림을 받을 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q40hc/btsLLz9GL2u/CC4Or94G2sfGWqJzt7C6y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq40hc%2FbtsLLz9GL2u%2FCC4Or94G2sfGWqJzt7C6y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1314&quot; height=&quot;976&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자는 구독한 Topic에 대해서 공지사항이 올라오면 알림을 받을 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FCM Topic (키워드)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQpns/btsLK49YIfV/1FEWYsTcdLrkHyZA9yAq8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQpns/btsLK49YIfV/1FEWYsTcdLrkHyZA9yAq8K/img.png&quot; data-alt=&quot;DB에서 소프트웨어학과 Topic에 등록된 키워드를 가져오고, 공지사항의 제목에 키워드가 포함되어있는지 확인하는 과정이 추가됐다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQpns/btsLK49YIfV/1FEWYsTcdLrkHyZA9yAq8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQpns%2FbtsLK49YIfV%2F1FEWYsTcdLrkHyZA9yAq8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1414&quot; height=&quot;996&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DB에서 소프트웨어학과 Topic에 등록된 키워드를 가져오고, 공지사항의 제목에 키워드가 포함되어있는지 확인하는 과정이 추가됐다&lt;/figcaption&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;키워드 알림도 마찬가지로 Topic을 활용해서,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 구독한 키워드가 공지사항 제목에 포함된 경우, 해당 키워드와 연계된 푸시 알림을 받을 수 있는 구조를 생각했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt;이를 위해 DB에서 소프트웨어학과 Topic에 등록된 키워드를 가져온 뒤, 공지사항의 제목에 키워드가 포함되어 있는지 확인하는 과정만 추가하면 됐기 때문에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;확장성 측면에서도 좋다고 판단했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;시스템적 한계&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Fcm Topic을 구독할 때 &lt;b&gt;한글이 안된다는 것&lt;/b&gt;이 가장 큰 한계였다. &amp;ldquo;해외현장연수&amp;rdquo;, &amp;ldquo;아르바이트&amp;rdquo;. &amp;ldquo;장학&amp;rdquo;, &amp;ldquo;대회&amp;rdquo;, &amp;ldquo;프로젝트&amp;rdquo;, &amp;ldquo;공모전&amp;rdquo; 처럼 대부분의 공지사항들이 한글로 올라오고, 사용자들이 등록하는 키워드들도 한글이라 반드시 해결해야하는 문제였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3CTmg/btsLELRxztw/AVQdEcenOykeQnpkRrUq81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3CTmg/btsLELRxztw/AVQdEcenOykeQnpkRrUq81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3CTmg/btsLELRxztw/AVQdEcenOykeQnpkRrUq81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3CTmg%2FbtsLELRxztw%2FAVQdEcenOykeQnpkRrUq81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1520&quot; height=&quot;212&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot;&gt;앱 서버 전송 요청 작성 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736236063254&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;앱 서버 전송 요청 작성 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&quot; data-og-description=&quot;2024년 데모 데이에서, Firebase를 사용하여 AI 기반 앱을 빌드하고 실행하는 방법에 관한 데모를 시청하세요. 지금 시청하기 의견 보내기 앱 서버 전송 요청 작성 컬렉션을 사용해 정리하기 내 환경&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&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;앱 서버 전송 요청 작성 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024년 데모 데이에서, Firebase를 사용하여 AI 기반 앱을 빌드하고 실행하는 방법에 관한 데모를 시청하세요. 지금 시청하기 의견 보내기 앱 서버 전송 요청 작성 컬렉션을 사용해 정리하기 내 환경&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.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;ldquo;topics/[a-zA-Z0-9-_.~%]+&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[a-zA-Z0-9-_.~%]+:&lt;/li&gt;
&lt;li&gt;a-z: 소문자 알파벳&lt;/li&gt;
&lt;li&gt;A-Z: 대문자 알파벳&lt;/li&gt;
&lt;li&gt;0-9: 숫자&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;p data-ke-size=&quot;size16&quot;&gt;따라서 이 표현식에 따르면 /topics/ 경로 뒤에 오는 문자열에는 +&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;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;토픽 이름은 900자를 넘길 수 없습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdtbdT/btsLJBHV3Op/NSNJdJ1ZJBMUXlRMd2d2YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdtbdT/btsLJBHV3Op/NSNJdJ1ZJBMUXlRMd2d2YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdtbdT/btsLJBHV3Op/NSNJdJ1ZJBMUXlRMd2d2YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdtbdT%2FbtsLJBHV3Op%2FNSNJdJ1ZJBMUXlRMd2d2YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;183&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byMihS/btsLLUlvc22/jPuFsv8SkKnC5Z4Kl4L0k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byMihS/btsLLUlvc22/jPuFsv8SkKnC5Z4Kl4L0k1/img.png&quot; data-alt=&quot;900자가 넘는 Topic 이름으로 구독할 시에 오류가 발생한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byMihS/btsLLUlvc22/jPuFsv8SkKnC5Z4Kl4L0k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyMihS%2FbtsLLUlvc22%2FjPuFsv8SkKnC5Z4Kl4L0k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;335&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;900자가 넘는 Topic 이름으로 구독할 시에 오류가 발생한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yYa4H/btsLFyxlnCL/YbUWaokKDHnrkhX0a1FkW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yYa4H/btsLFyxlnCL/YbUWaokKDHnrkhX0a1FkW1/img.png&quot; data-alt=&quot;한글은 FCM Topic으로 사용할 수 없다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yYa4H/btsLFyxlnCL/YbUWaokKDHnrkhX0a1FkW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyYa4H%2FbtsLFyxlnCL%2FYbUWaokKDHnrkhX0a1FkW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;441&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한글은 FCM Topic으로 사용할 수 없다&lt;/figcaption&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;span data-token-index=&quot;0&quot;&gt;가장 큰 문제는 한글을 사용할 수 없다는 점이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 공지사항마다 구독은 공지사항별로 학과 이름을 영어로 번역하거나 공지사항 홈페이지의 이름을 따와서 Topic으로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 소프트웨어학과는 &lt;b&gt;Software&lt;/b&gt;, 간호학과는 &lt;b&gt;Nursing&lt;/b&gt;과 같이 Topic 이름을 부여했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 새로운 학과나 단과대가 추가되더라도 해당 Topic만 추가하면 되기 때문에 큰 문제가 없었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSZr7J/btsLGbVIuTf/ROnPydWaMaYe5lLfZPKD31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSZr7J/btsLGbVIuTf/ROnPydWaMaYe5lLfZPKD31/img.png&quot; data-alt=&quot;공지사항마다 구별할 수 있는 Topic 이름을 영어로 부여했다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSZr7J/btsLGbVIuTf/ROnPydWaMaYe5lLfZPKD31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSZr7J%2FbtsLGbVIuTf%2FROnPydWaMaYe5lLfZPKD31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;489&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공지사항마다 구별할 수 있는 Topic 이름을 영어로 부여했다&lt;/figcaption&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;키워드의 경우에는 사용자들이 주로 한글로 키워드를 등록하며, 사람마다 등록하는 키워드가 모두 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 한글로 등록한 키워드를 영어로 번역해서 하기에는 현실적으로 어려웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/h2&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;그래서 생각한 방법이 총 3가지가 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법1 - 한글 &amp;rarr; 영타 변환 라이브러리 사용&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;예를 들어, 사용자가 &amp;ldquo;해외현장연수&amp;rdquo;를 키워드로 등록하면 이걸 그대로 영타로 바꿔서 &lt;b&gt;&lt;u&gt;godhlguswkddustn&lt;/u&gt;&lt;/b&gt;으로 변환하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 한글 쌍자음의 경우에는 영어의 대문자를 활용하면 된다. &lt;b&gt;ex)&lt;/b&gt; &lt;u&gt;&lt;b&gt;&amp;ldquo;빨강색&amp;rdquo; &amp;rarr; Qkfrkdtor&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 이 기능을 어떻게 구현할 것인가였는데. 다행히 이와 같은 기능을 지원하는 라이브러리를 개발한 분이 계셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/738/inko&quot;&gt;https://github.com/738/inko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736236379972&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - 738/inko:  영타를 한글로, 한타를 영어로 변환해주는 자바스크립트 오픈소스 라이브러&quot; data-og-description=&quot; 영타를 한글로, 한타를 영어로 변환해주는 자바스크립트 오픈소스 라이브러리. Contribute to 738/inko development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/738/inko&quot; data-og-url=&quot;https://github.com/738/inko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/738/inko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/738/inko&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;GitHub - 738/inko:  영타를 한글로, 한타를 영어로 변환해주는 자바스크립트 오픈소스 라이브러&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt; 영타를 한글로, 한타를 영어로 변환해주는 자바스크립트 오픈소스 라이브러리. Contribute to 738/inko development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz93Ud/btsLHvy1K1u/apnABBqDW6RTlR82Klher0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz93Ud/btsLHvy1K1u/apnABBqDW6RTlR82Klher0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz93Ud/btsLHvy1K1u/apnABBqDW6RTlR82Klher0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz93Ud%2FbtsLHvy1K1u%2FapnABBqDW6RTlR82Klher0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;386&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영타-&amp;gt;한타, 한타-&amp;gt;영타 전부 다 지원하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬, 자바스크립트, 코틀린 등 다양한 곳에서 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;한글과 영어를 같이 사용할 수 없다 - ex) ICT 학점연계 프로젝트&lt;/li&gt;
&lt;li&gt;라이브러리 의존성 추가 - 특정 라이브러리에 의존하므로 추가적인 유지보수 부담이 생긴다.&lt;/li&gt;
&lt;li&gt;가독성이 좋지 않음&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법2 - 해시값 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 입력한 키워드를 받아 해시 알고리즘(SHA-1, SHA-256 등)을 통해 고유값을 가지는 고정된 길이의 문자열로 변환해 관리하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 생성된 해시값을 FCM Topic의 식별자로 사용한다.&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고유성 보장: 해싱 알고리즘은 동일한 입력에 대해 항상 같은 출력을 생성하므로, 키워드 충돌 가능성이 극히 낮음.&lt;/li&gt;
&lt;li&gt;보안성: 키워드가 해시값으로 변환되므로 원본 데이터가 외부로 노출되지 않음.&lt;/li&gt;
&lt;li&gt;한글, 영어 혼용 지원: 원본 데이터의 언어와 무관하게 항상 동일한 방식으로 처리 가능.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;예를 들어, &amp;ldquo;해외현장연수&amp;rdquo;가 e89f29d...로 변환되면 해당 키워드가 무엇을 의미하는지 알 수 없음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;특히 SHA-256이나 SHA-512 같은 복잡한 알고리즘은 연산량이 많음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드 원본 데이터의 암호화가 딱히 중요하지 않고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드를 구독할 때 공지사항을 지정한다는 점, 중복이 되더라도 상관이 없다는 점 때문에 해시값 사용은 고려하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법3 - URL 인코딩 사용&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드를 URL-safe 방식으로 인코딩해 ASCII 문자열로 변환하는 방식이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) &amp;ldquo;해외현장연수&amp;rdquo; &amp;rarr; %ED%95%B4%EC%99%B8%ED%98%84%EC%9E%A5%EC%97%B0%EC%88%98&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;간단한 구현 - 한글을 한글을 인코딩하여 ASCII 문자로 변환하므로 별도 라이브러리가 없어도 구현 가능.&lt;/li&gt;
&lt;li&gt;한글과 영어 같이 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가독성 유지 가능&lt;/b&gt;: 인코딩 전후가 유사하게 보여 사람이 직관적으로 이해 가능.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;길이 증가: 한글 문자 하나가 %ED%95%9C처럼 길게 변환되므로 결과 문자열의 길이가 길어짐.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;rarr; 인코딩된 결과가 너무 길면 FCM 주제 제한(최대 900자)을 초과할 가능성이 있음.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;복원 필요: 원본 데이터를 다시 사용할 때 디코딩 과정이 필요.&lt;/li&gt;
&lt;li&gt;충돌 가능성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드의 길이는 키워드를 구독할 때 글자수를 제한을 두면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 데이터에 대해서는 따로 DB에 해외현장연수라는 키워드와 Topic용으로 인코딩한 키워드인 %ED%95%B4%EC%99%B8%ED%98%84%EC%9E%A5%EC%97%B0%EC%88%98_ComputingInformatics를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장해 복원에 대해서는 문제가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충돌 가능성에 대해서는 아래에서도 설명하지만, 키워드 알림을 받을 공지사항을 지정해서(ex. 소프트웨어학과) Topic의 명칭이 유일성을 가지도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1차 채택: 방법1 - 한글 &amp;rarr; 영타 변환 라이브러리 사용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 처음에는&amp;nbsp;&lt;b&gt;한글 -&amp;gt; 영타 변환 라이브러리&lt;/b&gt;를 활용하는 방식을 선택했고, 이를 적용하고 배포까지 완료했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이후에 URL 인코딩을 사용하면 된다는 사실을 뒤늦게 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 Fcm Topic을 다루는 대부분의 블로그에서 Topic의 이름에 특수문자를 사용할 수 없다고 언급했기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로 인해 &lt;b&gt;%&lt;/b&gt;가 포함되는 URL 인코딩 방식은 배제하고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(특수문자를 못 쓰는줄 알고 한글 -&amp;gt; 영타 변환 라이브러리를 사용할 때도 키워드마다 Topic을 구별하기 위해 특수문자 대신 숫자 8을 써서(ex. 장학 - wkdgkr8Software) 공백을 대체했다...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 경험을 통해 공식 문서를 꼼꼼히 확인하는 것이 얼마나 중요한지, 테스트를 직접 해봐야한다는 점,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 블로그 글을 무조건 신뢰해서는 안된다는 교훈을 얻었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나도 블로그 글을 작성하면서 잘못된 정보를 주지 않기 위해 최대한 검토를 잘해야겠다는 생각이 들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6bbzt/btsLGiByziP/8zWbmoA3jhUQjih8Ds0Aek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6bbzt/btsLGiByziP/8zWbmoA3jhUQjih8Ds0Aek/img.png&quot; data-alt=&quot;한글 &amp;amp;rarr; 영타, 한글 &amp;amp;rarr; 영타 변환 라이브러리라서 한글과 영어가 섞인 키워드는 구독하지 못했다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6bbzt/btsLGiByziP/8zWbmoA3jhUQjih8Ds0Aek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6bbzt%2FbtsLGiByziP%2F8zWbmoA3jhUQjih8Ds0Aek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;238&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한글 &amp;rarr; 영타, 한글 &amp;rarr; 영타 변환 라이브러리라서 한글과 영어가 섞인 키워드는 구독하지 못했다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;최종 채택: URL 인코딩 사용&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be5Shv/btsLG2k4pAP/PoWZw0ASH9BESfiKgKb9G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be5Shv/btsLG2k4pAP/PoWZw0ASH9BESfiKgKb9G1/img.png&quot; data-alt=&quot;FCM 공식 문서에서 나와있는 topic 정규 표현식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be5Shv/btsLG2k4pAP/PoWZw0ASH9BESfiKgKb9G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe5Shv%2FbtsLG2k4pAP%2FPoWZw0ASH9BESfiKgKb9G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1520&quot; height=&quot;212&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FCM 공식 문서에서 나와있는 topic 정규 표현식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에 FCM 공식문서를 다시 읽으며 FCM topic의 정규식을 찾을 수 있었고, 결국 URL 인코딩 방식으로 다시 리팩토링을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 작성하면서 다시 한 번 테스트를 해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 정규식에 따라 topic에 특수문자(%, _)를 넣어도 구독이 되었고&lt;/b&gt;, 정상적으로 알림을 받을 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NaIZF/btsLG7zwyaT/FQZQTGnk43g2IEvnDyvyt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NaIZF/btsLG7zwyaT/FQZQTGnk43g2IEvnDyvyt0/img.png&quot; data-alt=&quot;특수문자 %, _가 들어간 Topic이 정상적으로 구독이 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NaIZF/btsLG7zwyaT/FQZQTGnk43g2IEvnDyvyt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNaIZF%2FbtsLG7zwyaT%2FFQZQTGnk43g2IEvnDyvyt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1676&quot; height=&quot;268&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특수문자 %, _가 들어간 Topic이 정상적으로 구독이 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;키워드 Topic 이름 중복 관련&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &amp;ldquo;공모전&amp;rdquo;이라는 키워드를 소프트웨어학과 학생은 소프트웨어학과 공지사항에 올라오는 &amp;ldquo;공모전&amp;rdquo; 키워드만 받고 싶을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건축학과의 &amp;ldquo;공모전&amp;rdquo; 키워드 알림은 받고 싶지 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 그냥 키워드로 공모전을 등록한다면 모든 종류의 공지사항에 공모전이 들어갈 때마다 푸시 알림을 받게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 FCM Topic으로 구독할 때, 단순히 &lt;u&gt;&lt;b&gt;공모전 &amp;rarr; %EA%B3%B5%EB%AA%A8%EC%A0%84&lt;/b&gt;&lt;/u&gt; 으로 인코딩해서 등록하는게 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에 %EA%B3%B5%EB%AA%A8%EC%A0%84_&lt;b&gt;Software&lt;/b&gt; 식으로 &lt;b&gt;키워드 알림을 받는 공지사항 종류(Topic)를 덧붙힌 뒤&lt;/b&gt; Topic을 등록해서 구분을 지었다. 대신 사용자가 키워드를 등록할 때, 어느 공지사항의 키워드를 등록할지는 정해줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIYMB4/btsLK1MfjXY/soaBeRLrbRJk9Gpp6XrU6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIYMB4/btsLK1MfjXY/soaBeRLrbRJk9Gpp6XrU6k/img.png&quot; data-alt=&quot;사용자는 어느 공지사항의 키워드 알림을 받을지 선택해야한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIYMB4/btsLK1MfjXY/soaBeRLrbRJk9Gpp6XrU6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIYMB4%2FbtsLK1MfjXY%2FsoaBeRLrbRJk9Gpp6XrU6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;223&quot; height=&quot;483&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2436&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프론트에서 백엔드로 구독 요청&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1736692084768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;koreanKeyword&quot;: &quot;장학&quot;,  // 알림을 받을 키워드
	&quot;topicName&quot;: &quot;Software&quot; // 알림을 받을 키워드의 공지사항 종류 Topic
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프론트에서 백엔드로 구독 취소 요청&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1736692106848&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;encodedKeyword&quot;: &quot;%EC%9E%A5%ED%95%99_Software&quot; // Topic으로 등록된 키워드
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 키워드 정보를 DB에 등록할 때 어느 공지사항의 키워드인지 같이 매핑을 해준다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1624&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yhOk1/btsLK8YQw8y/OkNTPVRz03y7jHScdXm9w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yhOk1/btsLK8YQw8y/OkNTPVRz03y7jHScdXm9w1/img.png&quot; data-alt=&quot;keyword 테이블에 Topic을 같이 매핑한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yhOk1/btsLK8YQw8y/OkNTPVRz03y7jHScdXm9w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyhOk1%2FbtsLK8YQw8y%2FOkNTPVRz03y7jHScdXm9w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;198&quot; data-origin-width=&quot;1624&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;keyword 테이블에 Topic을 같이 매핑한다&lt;/figcaption&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;그리고 공지사항을 크롤링하면 해당 공지사항 (ex. Software)에 등록된 키워드(ex. 공모전, 해외현장연수, 장학, 자격증)를 가져와서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공지사항 제목에 키워드가 포함되어있는지 확인 후에 해당 키워드를 Topic으로 하여 FCM 푸시 알림을 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예시 로직&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자가 소프트웨어학과 공지사항의 해외현장연수 키워드를 구독
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;rarr; DB에 키워드를 알림 받는 공지사항(Topic, 예시에서는 Software)과 키워드인 해외현장연수, 검색용 키워드인 해외현장연수_Software, Topic 등록용 인코딩 키워드인 %ED%95%B4%EC%99%B8%ED%98%84%EC%9E%A5%EC%97%B0%EC%88%98_Software를 저장 후 인코딩 키워드 이름으로 Topic을 구독&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;소프트웨어학과 공지사항이 올라오고 크롤링을 함 - 이때 제목은 &lt;b&gt;2024-하계 소프트웨어융합대학 IP-IT해외현장연수 모집 공고&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;소프트웨어학과 Topic에 등록된 키워드 확인(ex. 장학, 실전코딩, 해외현장연수.. 등등)&lt;/li&gt;
&lt;li&gt;해외현장연수 키워드가 등록되어있으므로, 해당 키워드를 구독하는 사용자들에게 푸시 알림&lt;/li&gt;
&lt;li&gt;FCM 메시지를 구성할 때 Topic에 %ED%95%B4%EC%99%B8%ED%98%84%EC%9E%A5%EC%97%B0%EC%88%98_Software 를 지정&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1736692814518&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// FCM 푸시 알림 메시지 구성
private Message createFcmMessage(String topic, String messageTitle, String body,
    String imageUrl, String url) {
    return Message.builder()
        .setTopic(topic)
        .setNotification(Notification.builder()
            .setTitle(messageTitle)
            .setBody(body)
            .setImage(imageUrl)
            .build())
        .putData(&quot;click_action&quot;, url)
        .build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;*인코딩시 유의사항&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공백 문자 +, %20&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 인코딩을 보면 보통 공백을 &lt;b&gt;+&lt;/b&gt; 또는 &lt;b&gt;%20&lt;/b&gt;로 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링-자바에서 인코딩을 할때 공백이 &lt;b&gt;+&lt;/b&gt;가 되는경우가 있는데,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pSs5N/btsLLQpTY5R/kzTRKUA36G8saF0Ik72otk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pSs5N/btsLLQpTY5R/kzTRKUA36G8saF0Ik72otk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pSs5N/btsLLQpTY5R/kzTRKUA36G8saF0Ik72otk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpSs5N%2FbtsLLQpTY5R%2FkzTRKUA36G8saF0Ik72otk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;92&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r2yiF/btsLJbihihM/J6kOg6K5pz3kwp9Y4k3tc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r2yiF/btsLJbihihM/J6kOg6K5pz3kwp9Y4k3tc0/img.png&quot; data-alt=&quot;&amp;amp;ldquo;동계 현장실습&amp;amp;rdquo;을 키워드로 구독할 때 java.net.URLEncoder 라이브러리를 import하여 .encode()를 사용했다. 인코딩 직후에 공백은 &amp;amp;ldquo;+&amp;amp;rdquo;로 치환된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r2yiF/btsLJbihihM/J6kOg6K5pz3kwp9Y4k3tc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr2yiF%2FbtsLJbihihM%2FJ6kOg6K5pz3kwp9Y4k3tc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2182&quot; height=&quot;98&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;ldquo;동계 현장실습&amp;rdquo;을 키워드로 구독할 때 java.net.URLEncoder 라이브러리를 import하여 .encode()를 사용했다. 인코딩 직후에 공백은 &amp;ldquo;+&amp;rdquo;로 치환된다&lt;/figcaption&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;topics/[a-zA-Z0-9-_.~%]+&lt;/b&gt;에서 볼 수 있듯이 &lt;b&gt;+&lt;/b&gt;는 topic이름으로 쓸 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;encodedKeyword = encodedKeyword.replace(&quot;+&quot;, &quot;%20&quot;);&lt;/b&gt; 이런식으로 공백을 &lt;b&gt;+&lt;/b&gt;가 아닌 &lt;b&gt;%20&lt;/b&gt;로 대체해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rCdXn/btsLKs4yImo/NjdWg0kflq5AhBsi0KgJv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rCdXn/btsLKs4yImo/NjdWg0kflq5AhBsi0KgJv1/img.png&quot; data-alt=&quot;공백을 +로 인코딩해서 구독 요청을 하면 구독이 되지 않는다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rCdXn/btsLKs4yImo/NjdWg0kflq5AhBsi0KgJv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrCdXn%2FbtsLKs4yImo%2FNjdWg0kflq5AhBsi0KgJv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;421&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공백을 +로 인코딩해서 구독 요청을 하면 구독이 되지 않는다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjp7K3/btsLKKRrSWX/Oh7QEGdAplcM2hWT7j2Nk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjp7K3/btsLKKRrSWX/Oh7QEGdAplcM2hWT7j2Nk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjp7K3/btsLKKRrSWX/Oh7QEGdAplcM2hWT7j2Nk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjp7K3%2FbtsLKKRrSWX%2FOh7QEGdAplcM2hWT7j2Nk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;110&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzsTI/btsLLu1Hvmm/SKLr1k9DzrKTVUKx0FnMyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzsTI/btsLLu1Hvmm/SKLr1k9DzrKTVUKx0FnMyK/img.png&quot; data-alt=&quot;공백을 인코딩 할 때 +가 아닌 %20로 대체하는 부분을 추가한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzsTI/btsLLu1Hvmm/SKLr1k9DzrKTVUKx0FnMyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzsTI%2FbtsLLu1Hvmm%2FSKLr1k9DzrKTVUKx0FnMyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;782&quot; height=&quot;40&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공백을 인코딩 할 때 +가 아닌 %20로 대체하는 부분을 추가한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;키워드 푸시 알림 발송&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1736679722654&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// FCM 메시지 생성 - topic
Message message = createFcmMessage(topicName, messageTitle, body, imageUrl, url);
send(message);

// 공지사항에 해당하는 토픽 찾기
Topic topic = topicRepository.findByDepartment(topicName)
    .orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.TOPIC_NOT_FOUND));

// 공지사항에 해당하는 토픽을 구독 중인 모든 키워드 찾기
List&amp;lt;Keyword&amp;gt; keywords = keywordRepository.findByTopic(topic);

for (Keyword keyword : keywords) {
    String koreanKeyword = keyword.getKoreanKeyword();

    // 공지사항의 제목이나 본문에 키워드가 포함되어 있는지 확인
    if (noticeDto.getTitle().contains(koreanKeyword)) {
        messageTitle = koreanKeyword + &quot;-&quot; + messageTitle;
        String encodedKeyword = keyword.getEncodedKeyword();
        
        // FCM 메시지 생성 - keyword
        Message keywordMessage = createFcmMessage(encodedKeyword, messageTitle, body, imageUrl, url);
        
        // 비동기적으로 알림 전송
        send(keywordMessage);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;키워드 구독&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1736343875441&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 키워드 구독 - 키워드 하나씩
// KeywordRequest 예시
// 소프트웨어학과(topicName) 공지사항의 
// 해외현장연수(koreanKeyword) 키워드 구독
@Transactional
public void subscribeToKeyword(KeywordRequest keywordRequest) { 

	// URL 인코딩과 Topic ID 결합하여 고유한 formattedKeyword 생성
	String encodedKeyword = URLEncoder.encode(koreanKeyword, StandardCharsets.UTF_8);
	String searchKeyword = koreanKeyword + &quot;_&quot; + topicName;
	encodedKeyword = encodedKeyword.replace(&quot;+&quot;, &quot;%20&quot;); // 인코딩시 공백을 +로 하는 경우를 %로 대체
	String formattedKeyword = encodedKeyword + &quot;_&quot; + topicName;

	Topic topic = topicRepository.findByDepartment(topicName)
		.orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.TOPIC_NOT_FOUND));

	// 입력된 키워드가 존재하는지 확인하고, 없다면 새로 생성
	Keyword keyword = keywordRepository.findByEncodedKeyword(formattedKeyword)
		.orElseGet(() -&amp;gt; createNewTopic(keywordRequest, searchKeyword, formattedKeyword, topic));

	// 이미 해당 키워드를 구독 중인지 확인
	if (keywordMemberRepository.existsByKeywordAndMember(keyword, member)) {
		throw new CustomException(CustomErrorCode.ALREADY_SUBSCRIBED_KEYWORD);
	}

	// 사용자가 이미 구독한 키워드 개수를 확인
	long subscribedKeywordCount = keywordMemberRepository.countByMember(member);
	if (subscribedKeywordCount &amp;gt;= 10) {
		throw new CustomException(CustomErrorCode.MAX_KEYWORD_LIMIT_EXCEEDED);
	}

	List&amp;lt;Token&amp;gt; memberTokens = member.getTokens();
	KeywordMember keywordMember = KeywordMember.builder()
		.keyword(keyword)
		.member(member)
		.isRead(false)
		.lastReadAt(LocalDateTime.now())
		.build();
	keywordMemberRepository.save(keywordMember);

	// 토픽과 토큰을 매핑하여 저장 -&amp;gt; 사용자가 가지고 있는 토큰들이 topic을 구독
	List&amp;lt;KeywordToken&amp;gt; keywordTokens = memberTokens.stream()
		.map(token -&amp;gt; new KeywordToken(keyword, token))
		.collect(Collectors.toList());
	keywordTokenBulkRepository.saveAll(keywordTokens);

	// FCM 서비스를 사용하여 토픽에 대한 구독 진행
	List&amp;lt;String&amp;gt; tokenValues = memberTokens.stream()
		.map(Token::getTokenValue)
		.collect(Collectors.toList());
	fcmService.subscribeToTopic(formattedKeyword, tokenValues);
}

// 새로운 키워드 생성 메서드
private Keyword createNewTopic(KeywordRequest keywordRequest, String searchKeyword, String formattedKeyword, Topic topic) {
	// 새로운 토픽 생성 로직
	Keyword newKeyword = Keyword.builder()
		.encodedKeyword(formattedKeyword)
		.koreanKeyword(keywordRequest.getKoreanKeyword())
		.searchKeyword(searchKeyword)
		.topic(topic)
		.build();
	keywordRepository.save(newKeyword);

	keywordLogger.log(&quot;새로운 키워드 생성 : &quot; + newKeyword.getKoreanKeyword());
	return newKeyword;
}&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;&lt;span data-token-index=&quot;0&quot;&gt;FcmService.java&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736343916479&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void subscribeToTopic(String topicName, List&amp;lt;String&amp;gt; tokens) {
	try {
		TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopicAsync(tokens, topicName).get();
		topicLogger.log(&quot;Subscribed to topic: &quot; + topicName);
		topicLogger.log(response.getSuccessCount() + &quot; tokens were subscribed successfully&quot;);
		if (response.getFailureCount() &amp;gt; 0) {
			topicLogger.log(response.getFailureCount() + &quot; tokens failed to subscribe&quot;);
			response.getErrors().forEach(error -&amp;gt; {
				String failedToken = tokens.get(error.getIndex());
				topicLogger.log(&quot;Error for token at index &quot; + error.getIndex() + &quot;: &quot; + error.getReason() + &quot; (Token: &quot; + failedToken + &quot;)&quot;);
			});
		}
	} catch (InterruptedException | ExecutionException e) {
		// 구독에 실패한 경우에 대한 처리
		throw new CustomException(CustomErrorCode.SUBSCRIBE_FAILED);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;키워드 구독 취소&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1736344103572&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 키워드 구독 취소 - 키워드 하나씩
@Transactional
public void unsubscribeFromKeyword(UnsubscribeKeywordRequest unsubscribeKeywordRequest) {
	String memberEmail = SecurityContextHolder.getContext().getAuthentication().getName();
	String encodedKeyword = unsubscribeKeywordRequest.getEncodedKeyword();

	Member member = memberRepository.findByEmailWithTokens(memberEmail)
		.orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.USER_NOT_FOUND));

	Keyword keyword = keywordRepository.findByEncodedKeyword(encodedKeyword)
		.orElseThrow(() -&amp;gt; new CustomException(CustomErrorCode.KEYWORD_NOT_FOUND));

	// 유저가 설정한 키워드를 찾아서 삭제
	keywordMemberRepository.deleteByKeywordAndMember(keyword, member);

	// 해당 키워드에 관련된 토큰을 찾아서 삭제
	List&amp;lt;Token&amp;gt; memberTokens = member.getTokens();
	keywordTokenRepository.deleteByKeywordAndTokens(keyword, memberTokens);

	// FCM 서비스를 사용하여 키워드에 대한 구독 취소 진행
	List&amp;lt;String&amp;gt; tokenValues = memberTokens.stream()
		.map(Token::getTokenValue)
		.collect(Collectors.toList());
	fcmService.unsubscribeFromTopic(encodedKeyword, tokenValues);
	keywordLogger.log(&quot;키워드 구독 취소 : &quot; + keyword.getKoreanKeyword());
}&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;&lt;span data-token-index=&quot;0&quot;&gt;FcmService.java&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736344124548&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void unsubscribeFromTopic(String topicName, List&amp;lt;String&amp;gt; tokens) {
	try {
		TopicManagementResponse response = FirebaseMessaging.getInstance().unsubscribeFromTopicAsync(tokens, topicName).get();
		topicLogger.log(&quot;Unsubscribed to topic: &quot; + topicName);
		topicLogger.log(response.getSuccessCount() + &quot; tokens were unsubscribed successfully&quot;);
		if (response.getFailureCount() &amp;gt; 0) {
			topicLogger.log(response.getFailureCount() + &quot; tokens failed to unsubscribe&quot;);
			response.getErrors().forEach(error -&amp;gt; {
				String failedToken = tokens.get(error.getIndex());
				topicLogger.log(&quot;Error for token at index &quot; + error.getIndex() + &quot;: &quot; + error.getReason() + &quot; (Token: &quot; + failedToken + &quot;)&quot;);
			});
		}
	} catch (InterruptedException | ExecutionException e) {
		// 구독 해지에 실패한 경우에 대한 처리
		throw new CustomException(CustomErrorCode.SUBSCRIBE_CANCEL_FAILED);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;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;사전에 사용자가 소프트웨어학과 공지사항의 해외연장연수 키워드를 구독&lt;/li&gt;
&lt;li&gt;학교 소프트웨어학과 홈페이지 공지사항에 새로운 글이 올라옴 - 이때 제목은 &lt;b&gt;2024-하계 소프트웨어융합대학 IP-IT해외현장연수 모집 공고&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;크롤링 서버에서 새로운 글이 올라왔다는 사실을 알고, 소프트웨어학과 공지사항 글을 크롤링 함&lt;/li&gt;
&lt;li&gt;해당 소프트웨어학과 공지사항(Topic)을 구독하고 있는 사용자에게 푸시 알림&lt;/li&gt;
&lt;li&gt;소프트웨어학과 공지사항(Topic)에 등록된 키워드 확인(ex. 장학, 실전코딩, 해외현장연수.. 등등)&lt;/li&gt;
&lt;li&gt;공지사항의 제목에 키워드가 포함되어있는지 확인&lt;/li&gt;
&lt;li&gt;포함되어있다면 해당 키워드를 구독하는 사용자에게 푸시 알림&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;rarr; 해외현장연수 키워드가 등록되어있으므로, 해당 키워드를 구독하는 사용자들에게 푸시 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 5, 6, 7 과정에서 특정 공지사항에 키워드가 많이 구독되어있을 수록,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공지사항의 제목에 키워드가 포함되어있는지 확인하는 로직과 푸시 알림을 보내주는 과정에서 로직이 오래 걸린다. 이 부분에 대해서 개선이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 지금은 Topic으로 푸시 알림을 보내는 방식이라 전송 시간이 덜 걸리지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 푸시 알림 모니터링으로 인해 Token 방식으로 전환 한다면(특정 토큰에 대한 푸시 알림 성공/실패 확인을 하려면 Token 방식으로 해야한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 개선이 더욱 필요해진다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BtGP2/btsLIimAnrg/sTGbwT6Mm3zpQHQ915KHaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BtGP2/btsLIimAnrg/sTGbwT6Mm3zpQHQ915KHaK/img.png&quot; data-alt=&quot;키워드 푸시 알림, 키워드 구독 화면, 구독한 키워드 관련 글 모음 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BtGP2/btsLIimAnrg/sTGbwT6Mm3zpQHQ915KHaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBtGP2%2FbtsLIimAnrg%2FsTGbwT6Mm3zpQHQ915KHaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1804&quot; height=&quot;1036&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;키워드 푸시 알림, 키워드 구독 화면, 구독한 키워드 관련 글 모음 탭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;1046&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V9QsH/btsLIdsouXq/xibsTyxlBPjBF5BY0vFLak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V9QsH/btsLIdsouXq/xibsTyxlBPjBF5BY0vFLak/img.png&quot; data-alt=&quot;후배, 동기들의 키워드 알림 기능 후기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V9QsH/btsLIdsouXq/xibsTyxlBPjBF5BY0vFLak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV9QsH%2FbtsLIdsouXq%2FxibsTyxlBPjBF5BY0vFLak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1396&quot; height=&quot;1046&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;1046&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;정상적으로 키워드 알림 기능이 작동하는 것을 확인할 수 있었고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;http://ajouevent.com/&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;ajouevent.com&lt;/span&gt;&lt;/a&gt;의 키워드 알림 기능을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기와 후배들이 유용하게 활용했다는 말을 듣고 큰 보람을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 또한 키워드 알림 기능 덕분에 학교에서 지원하는 클라이밍 클래스(선착순)와 면접 스태프를 빠르게 신청할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7XW8k/btsLHUsYPLF/FnwIzgtOKCqpjIcccEapI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7XW8k/btsLHUsYPLF/FnwIzgtOKCqpjIcccEapI1/img.png&quot; data-alt=&quot;에브리타임의 키워드 알림 기능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7XW8k/btsLHUsYPLF/FnwIzgtOKCqpjIcccEapI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7XW8k%2FbtsLHUsYPLF%2FFnwIzgtOKCqpjIcccEapI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1228&quot; height=&quot;664&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;664&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, &lt;a style=&quot;color: #000000;&quot; href=&quot;http://ajouevent.com/&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;ajouevent.com&lt;/span&gt;&lt;/a&gt;에서 키워드 알림 기능을 개발한 뒤, 에브리타임에도 비슷한 키워드 알림 기능이 도입된 것을 보고 흥미로웠다. 에브리타임의 키워드 알림은 어떻게 개발되었는지 궁금하며, 에브리타임을 개발하는 VINU팀 개발 블로그가 있는걸로 아는데 빨리 관련 글이 올라왔으면 좋겠다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCM에서 한글 토픽(topic)을 사용하고 싶으면 인코딩을 해서 쓰자. FCM topic 이름으로 +를 쓸 수 없으니 인코딩을 할때 공백은 + 가 아닌 &lt;b&gt;%20&lt;/b&gt; 로 replaceAll()을 해줘야한다.&lt;/li&gt;
&lt;li&gt;현재 FCM topic 이름에 적용되는 정규식은 다음과 같다 (24년 12월 기준) (이것도 바뀔 수도 있으니 직접 테스트해보자)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;[a-zA-Z0-9-_.~%]+&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FCM 공식 문서&lt;/b&gt;를 참고하자(&lt;b&gt;영어 문서&lt;/b&gt;를 참고하는게 좋다)&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: left;&quot; href=&quot;https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/FirebaseMessaging&quot;&gt;FirebaseMessaging&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736343775709&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;FirebaseMessaging&quot; data-og-description=&quot;&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/FirebaseMessaging&quot; data-og-url=&quot;https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/FirebaseMessaging&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/FirebaseMessaging&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/FirebaseMessaging&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;FirebaseMessaging&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging?hl=ko&quot;&gt;Firebase 클라우드 메시징 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736343781411&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;Firebase Cloud Messaging&quot; data-og-description=&quot;Firebase 클라우드 메시징(FCM)은 무료로 메시지를 안정적으로 전송할 수 있는 크로스 플랫폼 메시징 솔루션입니다.&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/cloud-messaging?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/docs/cloud-messaging?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/cloud-messaging?hl=ko&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;Firebase Cloud Messaging&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Firebase 클라우드 메시징(FCM)은 무료로 메시지를 안정적으로 전송할 수 있는 크로스 플랫폼 메시징 솔루션입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot;&gt;앱 서버 전송 요청 작성 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736343802676&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;앱 서버 전송 요청 작성 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&quot; data-og-description=&quot;2024년 데모 데이에서, Firebase를 사용하여 AI 기반 앱을 빌드하고 실행하는 방법에 관한 데모를 시청하세요. 지금 시청하기 의견 보내기 앱 서버 전송 요청 작성 컬렉션을 사용해 정리하기 내 환경&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko&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;앱 서버 전송 요청 작성 &amp;nbsp;|&amp;nbsp; Firebase Cloud Messaging&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2024년 데모 데이에서, Firebase를 사용하여 AI 기반 앱을 빌드하고 실행하는 방법에 관한 데모를 시청하세요. 지금 시청하기 의견 보내기 앱 서버 전송 요청 작성 컬렉션을 사용해 정리하기 내 환경&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.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;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;b&gt;&lt;a href=&quot;https://zuminternet.github.io/FCM-PUSH/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://zuminternet.github.io/FCM-PUSH/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736680035318&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;FCM 푸시 파헤치기&quot; data-og-description=&quot;파일럿부터 적용까지 진행했던 FCM 푸시를 파헤치며 기초 가이드북처럼 정리해보았습니다.&quot; data-og-host=&quot;zuminternet.github.io&quot; data-og-source-url=&quot;https://zuminternet.github.io/FCM-PUSH/&quot; data-og-url=&quot;https://zuminternet.github.io/FCM-PUSH/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ylMKZ/hyX0mwIAsU/s18wBNCJk339KFnVKZSoG0/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080,https://scrap.kakaocdn.net/dn/cvVaBR/hyX0ABJb3Y/1rpBGkkHo9O85J2YzK1Yo0/img.png?width=1620&amp;amp;height=1487&amp;amp;face=103_392_247_548,https://scrap.kakaocdn.net/dn/AZ3qs/hyX0vNXUOL/hESXFnuZLFtk518TdL0NtK/img.png?width=1660&amp;amp;height=472&amp;amp;face=0_0_1660_472&quot;&gt;&lt;a href=&quot;https://zuminternet.github.io/FCM-PUSH/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zuminternet.github.io/FCM-PUSH/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ylMKZ/hyX0mwIAsU/s18wBNCJk339KFnVKZSoG0/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080,https://scrap.kakaocdn.net/dn/cvVaBR/hyX0ABJb3Y/1rpBGkkHo9O85J2YzK1Yo0/img.png?width=1620&amp;amp;height=1487&amp;amp;face=103_392_247_548,https://scrap.kakaocdn.net/dn/AZ3qs/hyX0vNXUOL/hESXFnuZLFtk518TdL0NtK/img.png?width=1660&amp;amp;height=472&amp;amp;face=0_0_1660_472');&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;FCM 푸시 파헤치기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파일럿부터 적용까지 진행했던 FCM 푸시를 파헤치며 기초 가이드북처럼 정리해보았습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zuminternet.github.io&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>ajouevent.com</category>
      <category>FCM</category>
      <category>fcm topic</category>
      <category>fcm 키워드 알림</category>
      <category>키워드 알림</category>
      <author>simzard</author>
      <guid isPermaLink="true">https://simzard.tistory.com/2</guid>
      <comments>https://simzard.tistory.com/2#entry2comment</comments>
      <pubDate>Sun, 12 Jan 2025 23:58:07 +0900</pubDate>
    </item>
    <item>
      <title>ajouevent.com 소개 - 아주대 공지사항 및 이벤트 알림 웹앱(PWA, FCM)</title>
      <link>https://simzard.tistory.com/1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;서비스 소개&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2024년 1학기부터 2학기까지 개발한 서비스를 소개하려고 합니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;아주대학교 공지사항&lt;/span&gt;&lt;/b&gt;을 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;유튜브&lt;/span&gt;&lt;/b&gt;처럼 구독할 수 있는 서비스인데요,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;핵심 기능은 학교 공지사항과 키워드를 구독해서 푸시 알림을 받을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반, 장학/학과/단과대/기숙사 공지사항 푸시 알림을 제공해주는 것 외에도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 배너, 이번주 인기글, 찜하기, 구독한 공지사항&amp;amp;키워드 글 확인, 구글 캘린더 연동을 도입해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대한 사용자들이 교내 공지사항이나 이벤트들을 놓치지 않도록 제작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;거두절미하고, 사이트 링크와 서비스 화면을 보여드리겠습니다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아래 설명부터는 편의상 반말로 작성하겠습니다... ㅎㅎ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ajouevent.com&quot;&gt;https://ajouevent.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735911919660&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;아주대학교 이벤트 알림 웹앱&quot; data-og-description=&quot;팀 이쿠죠&quot; data-og-host=&quot;www.ajouevent.com&quot; data-og-source-url=&quot;https://ajouevent.com&quot; data-og-url=&quot;https://www.ajouevent.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ajouevent.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ajouevent.com&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;아주대학교 이벤트 알림 웹앱&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;www.ajouevent.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coYFup/btsLCtJUE9O/PrRdgdEoPl4s5Z5iDHxBD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coYFup/btsLCtJUE9O/PrRdgdEoPl4s5Z5iDHxBD0/img.png&quot; data-alt=&quot;아이폰에서 받은 ajouevent.com의 푸시 알림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coYFup/btsLCtJUE9O/PrRdgdEoPl4s5Z5iDHxBD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoYFup%2FbtsLCtJUE9O%2FPrRdgdEoPl4s5Z5iDHxBD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;840&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아이폰에서 받은 ajouevent.com의 푸시 알림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;푸시 알림&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWbNu/btsLBW6z7P7/UxLnA6UC9htdu0Deed7QGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWbNu/btsLBW6z7P7/UxLnA6UC9htdu0Deed7QGk/img.png&quot; data-alt=&quot;(왼쪽부터) 아이폰, 갤럭시, 맥북, 윈도우 노트북에서의 푸시 알림 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWbNu/btsLBW6z7P7/UxLnA6UC9htdu0Deed7QGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWbNu%2FbtsLBW6z7P7%2FUxLnA6UC9htdu0Deed7QGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2144&quot; height=&quot;1164&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(왼쪽부터) 아이폰, 갤럭시, 맥북, 윈도우 노트북에서의 푸시 알림 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구독&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2192&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0dE81/btsLCEkm2Zz/QO1Nno8tuMfpKi2d1wRkKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0dE81/btsLCEkm2Zz/QO1Nno8tuMfpKi2d1wRkKk/img.png&quot; data-alt=&quot;(왼쪽부터) 구독 탭, 구독 설정 창, 키워드 탭, 키워드 설정 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0dE81/btsLCEkm2Zz/QO1Nno8tuMfpKi2d1wRkKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0dE81%2FbtsLCEkm2Zz%2FQO1Nno8tuMfpKi2d1wRkKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2192&quot; height=&quot;1180&quot; data-origin-width=&quot;2192&quot; data-origin-height=&quot;1180&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;홈화면, 검색, 찜하기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYgQI8/btsLDfqQ1gy/KQzNXQMquXbviEgzmUF0EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYgQI8/btsLDfqQ1gy/KQzNXQMquXbviEgzmUF0EK/img.png&quot; data-alt=&quot;(왼쪽부터) 홈, 검색, 찜&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYgQI8/btsLDfqQ1gy/KQzNXQMquXbviEgzmUF0EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYgQI8%2FbtsLDfqQ1gy%2FKQzNXQMquXbviEgzmUF0EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1174&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1174&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상세페이지 &amp;amp; 바로가기 &amp;amp; 구글 캘린더 연동&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MdtFB/btsLBZCgTBZ/3xhMiQKnWhSXLScuHF9PHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MdtFB/btsLBZCgTBZ/3xhMiQKnWhSXLScuHF9PHk/img.png&quot; data-alt=&quot;(왼쪽부터) 게시글 상세페이지, 바로가기 클릭시 기존 공지사항 이동, 캘린더에 추가 버튼 클릭 시 구글 캘린더 연동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MdtFB/btsLBZCgTBZ/3xhMiQKnWhSXLScuHF9PHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMdtFB%2FbtsLBZCgTBZ%2F3xhMiQKnWhSXLScuHF9PHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;790&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;790&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2406&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh3XbB/btsLEF9LssZ/gqPWEJ7yNze5SEk4O0CKz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh3XbB/btsLEF9LssZ/gqPWEJ7yNze5SEk4O0CKz1/img.png&quot; data-alt=&quot;(왼쪽부터) 안드로이드, 아이폰, 노트북에서의 설치 안내 화면 (PWA 기반)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh3XbB/btsLEF9LssZ/gqPWEJ7yNze5SEk4O0CKz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh3XbB%2FbtsLEF9LssZ%2FgqPWEJ7yNze5SEk4O0CKz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2406&quot; height=&quot;1330&quot; data-origin-width=&quot;2406&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(왼쪽부터) 안드로이드, 아이폰, 노트북에서의 설치 안내 화면 (PWA 기반)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnDind/btsLBXErohc/oQhohrDcpL2z9IKLTAuovK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnDind/btsLBXErohc/oQhohrDcpL2z9IKLTAuovK/img.png&quot; data-alt=&quot;아이폰, 갤럭시, 맥북, 윈도우 노트북 모두 설치가 가능하다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnDind/btsLBXErohc/oQhohrDcpL2z9IKLTAuovK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnDind%2FbtsLBXErohc%2FoQhohrDcpL2z9IKLTAuovK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1524&quot; height=&quot;1262&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1262&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구글 로그인&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QmKc7/btsLDXQAkIh/vn7fMfNSewBDjWNe98R2uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QmKc7/btsLDXQAkIh/vn7fMfNSewBDjWNe98R2uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QmKc7/btsLDXQAkIh/vn7fMfNSewBDjWNe98R2uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQmKc7%2FbtsLDXQAkIh%2Fvn7fMfNSewBDjWNe98R2uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;473&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;878&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개발 배경&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsRzIW/btsLCqfghPg/cXvOVNVBFpLb6ONHRuoPYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsRzIW/btsLCqfghPg/cXvOVNVBFpLb6ONHRuoPYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsRzIW/btsLCqfghPg/cXvOVNVBFpLb6ONHRuoPYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsRzIW%2FbtsLCqfghPg%2FcXvOVNVBFpLb6ONHRuoPYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1100&quot; height=&quot;138&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byGpmJ/btsLC3KNnQd/XhCJ4GRVG1ahPOmfxkkpT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byGpmJ/btsLC3KNnQd/XhCJ4GRVG1ahPOmfxkkpT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byGpmJ/btsLC3KNnQd/XhCJ4GRVG1ahPOmfxkkpT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyGpmJ%2FbtsLC3KNnQd%2FXhCJ4GRVG1ahPOmfxkkpT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1100&quot; height=&quot;130&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 학교 공지사항을 올려주는 오픈채팅방이 있었고, 이미 많은 분들이 사용을 하고 계시지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 공지사항만 제공하는 점,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학과, 단과대, 기숙사 등의 공지사항은 제공해주지 않아 아쉬움이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 카카오톡 오픈채팅방의 참가 인원수는 1500명으로 제한되어 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 카카오톡은 주로 메신저로 사용하는 만큼, 학교 공지사항을 따로 알림 받을 수 있는 앱이 있으면 좋겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;1476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1SbJZ/btsLC4v6zuD/8e4C1l9dj2kUsSkgMg6QL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1SbJZ/btsLC4v6zuD/8e4C1l9dj2kUsSkgMg6QL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1SbJZ/btsLC4v6zuD/8e4C1l9dj2kUsSkgMg6QL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1SbJZ%2FbtsLC4v6zuD%2F8e4C1l9dj2kUsSkgMg6QL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1666&quot; height=&quot;1476&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;1476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇보다 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;키워드 알림&lt;/b&gt;&lt;/span&gt;이 &lt;a href=&quot;https://www.ajouevent.com&quot;&gt;https://www.ajouevent.com&lt;/a&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;2023년 1학기 복학 후 학교에서 일본(도쿄)을 보내준다는 해외현장연수 프로그램이 있다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겨울 방학 때 오사카, 교토를 다녀온 뒤에 도쿄를 가고 싶다는 생각이 계속 들었기 때문에 공지가 올라올 날만을 기다렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여느 때와 같이 강의가 끝나고 동기들이랑 쓰리팝에서 롤을 하고 있었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5인큐가 끝난 이후에 다른 친구의 카톡을 통해 선발 공지사항이 올라왔다는 걸 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신청은 2인 1팀으로 나는 지석이와 같이 신청을 했다. 나와 지석이는 군대 전역 후 복학한 직후라 활동을 한 것이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 신청서에도 적을만한 내용이 없어 선발 인원 중 20%를 뽑는 선착순을 노려야 했는데 이미 늦은 뒤였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VYHmF/btsLBXqWbjc/Rx4QlbWYkBmyLNT1uuMAN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VYHmF/btsLBXqWbjc/Rx4QlbWYkBmyLNT1uuMAN1/img.png&quot; data-alt=&quot;조회수가 3700이 넘어가는, 학교에서 인기가 많은 프로그램이었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VYHmF/btsLBXqWbjc/Rx4QlbWYkBmyLNT1uuMAN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVYHmF%2FbtsLBXqWbjc%2FRx4QlbWYkBmyLNT1uuMAN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;568&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조회수가 3700이 넘어가는, 학교에서 인기가 많은 프로그램이었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 24년 1학기 다시 공지사항이 올라올 시기가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때는 사실 ajouevent를 파란학기로 개발하고 있는 시점이었지만, 아직 개발이 완성되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 시간만 나면&lt;span data-token-index=&quot;1&quot;&gt; &lt;/span&gt;소프트웨어융합대학 공지사항에 들어가 선발 공지사항이 올라왔는지 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/482rA/btsLDw60TXs/vb8S0Dg7b4Z0LzpEFUQfR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/482rA/btsLDw60TXs/vb8S0Dg7b4Z0LzpEFUQfR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/482rA/btsLDw60TXs/vb8S0Dg7b4Z0LzpEFUQfR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F482rA%2FbtsLDw60TXs%2Fvb8S0Dg7b4Z0LzpEFUQfR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;336&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모집공고가 2023년과 다르게 2024년에는 좀 더 늦게 올라왔고, 나의 노가다 기간도 길어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 비효율적인 일을 반복하면서 키워드 알림 기능이 반드시 필요하구나라는 것을 깨달았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉬운 부분이 있으면 직접 만들어야겠다고 생각해서, 기존에 파란학기제를 같이 하기로 한 동기 2명에게 아이디어를 말했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024-1학기 파란학기제 도전 과제로 제출했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;알림 수단에 대한 고민&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링 부분은 이전에 장원이형이 GO로 만들어놓은 크롤링 프로그램을 물려받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 장원이형이 만든 공지사항 크롤링 프로그램은 공지사항을 슬랙 채널로 올려서 알림을 띄우는 방식이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 슬랙에 익숙하지않은 사람도 많았고, 설치부터 사용까지 다소 러닝커브가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;a href=&quot;http://ajouevent.com&quot;&gt;ajouevent.com&lt;/a&gt; 을 개발할 때는 사용자들에게 익숙한 수단으로 알림을 제공하고자했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PRePJ/btsLC2ZBVDT/Cp9fKuCJdnX8KDah3hEBeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PRePJ/btsLC2ZBVDT/Cp9fKuCJdnX8KDah3hEBeK/img.png&quot; data-alt=&quot;아주대 장원영이 개발한 아주대 공지사항 알리미 by Slack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PRePJ/btsLC2ZBVDT/Cp9fKuCJdnX8KDah3hEBeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPRePJ%2FbtsLC2ZBVDT%2FCp9fKuCJdnX8KDah3hEBeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1398&quot; height=&quot;976&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아주대 장원영이 개발한 아주대 공지사항 알리미 by Slack&lt;/figcaption&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;카카오톡, 텔레그램, 디스코드, 메일, PWA(Progressive Web App)+FCM(Firebase Cloud Messaging)&lt;/b&gt;&lt;/span&gt;이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오톡은 이미 공지사항 오픈채팅방이 있었고, 비즈니스 채널로 하기엔 사업자 등록번호가 있어야 해서 제외했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텔레그램/디스코드는 사용자들이 익숙하지 않다고 판단하여 제외했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일의 경우에는 사용자 수가 1000명, 2000명이 커질수록 메일 전송에 제약이 생길 수 있다는 문제가 있었다.&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;PWA+FCM&lt;/b&gt; &lt;span style=&quot;color: #000000;&quot;&gt;조합&lt;/span&gt;&lt;/span&gt;을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PWA를 통해 사용자들이 앱처럼 쓸 수 있고, 브라우저 기반으로 동작해 다양한 플랫폼에서 접근성을 높일 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 PWA는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;푸시 알림&lt;/span&gt;&lt;/b&gt;을 지원하고, 서비스 워커(Service Worker)를 통해 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;오프라인 상태&lt;/span&gt;&lt;/b&gt;에서도 알림을 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 사용자가 브라우저에서 &amp;lsquo;홈화면에 추가&amp;rsquo;를 통해 설치 과정을 거쳐야 하므로 이 점이 생소할 수 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 가이드를 명확히 제공하고 노트북과 갤럭시에서는 클릭을 통한 설치 팝업, iOS에서는 '홈화면에 추가' 방식을 설명하는 팝업을 통해 보완하고자 했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2406&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh3XbB/btsLEF9LssZ/gqPWEJ7yNze5SEk4O0CKz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh3XbB/btsLEF9LssZ/gqPWEJ7yNze5SEk4O0CKz1/img.png&quot; data-alt=&quot;(왼쪽부터) 안드로이드, 아이폰, 노트북에서의 설치 안내 화면 (PWA 기반)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh3XbB/btsLEF9LssZ/gqPWEJ7yNze5SEk4O0CKz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh3XbB%2FbtsLEF9LssZ%2FgqPWEJ7yNze5SEk4O0CKz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2406&quot; height=&quot;1330&quot; data-origin-width=&quot;2406&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(왼쪽부터) 안드로이드, 아이폰, 노트북에서의 설치 안내 화면 (PWA 기반)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;푸시 알림 방식으로 FCM(Firebase Cloud Messaging)을 선택한 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;푸시 알림을 구현하는 방법으로는 주로 &lt;b&gt;SSE&lt;/b&gt;(Server-Sent-Events)와 &lt;b&gt;FCM&lt;/b&gt;(Firebase Cloud Messaging)을 사용하는 방식이 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SSE(Server-Sent-Events)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 HTTP 통신에서는 클라이언트가 서버에 요청을 보내야만 서버가 응답을 보낼 수 있다. 그러나 푸시 알림 시스템에서는, 클라이언트의 요청이 없이도 공지사항이 등록되면 서버에서 클라이언트로 즉시 알림을 보내야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSE는 서버에서 클라이언트로 데이터를 실시간으로 전송하는 기술이다. 일반적으로 HTTP 연결을 유지하며, 서버가 새로운 데이터를 생성할 때마다 클라이언트로 전송할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점으로, 모바일 기기에서는 브라우저가 백그라운드로 전환되거나 클라이언트가 애플리케이션을 닫으면 알림을 수신할 수 없다. 또한 서버와 지속적으로 연결을 유지해야 하므로 네트워크 비용이 증가한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;FCM(Firebase Cloud Messaging)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCM은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;교차 플랫폼 메시징 솔루션&lt;/span&gt;&lt;/b&gt;으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web, iOS, Android 등의 &lt;b&gt;특정 플랫폼에 종속되지 않고&lt;/b&gt; 메시지를 전송할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션 서버가 아니라 클라우드 메시징 서버가 메시지 전송의 역할을 담한다. 따라서 애플리케이션이 계속 실행 중일 필요 없이 낮은 배터리 소모와 네트워크 사용만으로도 실시간 메시지 송수신이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 FCM을 이용하면 사용자가 &lt;b&gt;앱을 실행하고 있지 않을 때에도&lt;/b&gt;&amp;nbsp;푸시 알림을 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 FCM 서버에 의존하기 때문에, FCM 서버 상태에 따라 지연이나 장애가 발생할 수 있는건 단점이다. SSE의 실시간성에 비해서도 느린 편이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 서비스는 웹 브라우저 뿐만 아니라, iOS, Android 등 모바일 기기까지 다양한 기기에서 사용될 것을 고려하여, 많은 플랫폼을 수용할 수 있는 FCM을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, 주로 모바일 기기에서 푸시 알림을 확인한다고 생각하여 배터리를 크게 소모하지 않으면서, PWA가 실행 중이지 않더라도 알림을 받을 수 있는 FCM이 적합하다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pZRmn/btsLCZhJg6v/nHjYh3X7LFGGKGYITqIg5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pZRmn/btsLCZhJg6v/nHjYh3X7LFGGKGYITqIg5k/img.png&quot; data-alt=&quot;FCM은 무료로 제공된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pZRmn/btsLCZhJg6v/nHjYh3X7LFGGKGYITqIg5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpZRmn%2FbtsLCZhJg6v%2FnHjYh3X7LFGGKGYITqIg5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1618&quot; height=&quot;102&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FCM은 무료로 제공된다&lt;/figcaption&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;FCM에서 제공하는 여러 기능들도 활용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Topic 기능을 활용해 학교 공지사항이나 사용자 맞춤형 키워드마다 별도의 Topic을 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCM에서 발급하는 Token을 활용해 사용자 1명이 여러 개의 토큰을 가질 수 있도록 하여 여러 기기에서 푸시 알림을 받을 수 있도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;아키텍처&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bID4e0/btsLCESehB5/gBOEjZVxY25IBZNErzHRU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bID4e0/btsLCESehB5/gBOEjZVxY25IBZNErzHRU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bID4e0/btsLCESehB5/gBOEjZVxY25IBZNErzHRU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbID4e0%2FbtsLCESehB5%2FgBOEjZVxY25IBZNErzHRU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;665&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Xvuh/btsLCJllWVt/9LCi5Kk1RJpUiJAVXqkPzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Xvuh/btsLCJllWVt/9LCi5Kk1RJpUiJAVXqkPzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Xvuh/btsLCJllWVt/9LCi5Kk1RJpUiJAVXqkPzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Xvuh%2FbtsLCJllWVt%2F9LCi5Kk1RJpUiJAVXqkPzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1117&quot; height=&quot;535&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프라는 비용 최적화를 중점으로 설계했다. AWS 프리티어를 최대한 활용한 아키텍처다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC와 서브넷 구축, 백엔드 CI/CD 파이프라인 구성은 영준이 형과 함께했다. 서비스로 아키텍처까지 그려줬는데 너무 마음에 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿도 받았는데 앞으로 요긴하게 활용할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Fronted CI/CD pipeline&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfJV2/btsLCZoimko/qImhKWCZKA2QfjC1GXXKck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfJV2/btsLCZoimko/qImhKWCZKA2QfjC1GXXKck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfJV2/btsLCZoimko/qImhKWCZKA2QfjC1GXXKck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfJV2%2FbtsLCZoimko%2FqImhKWCZKA2QfjC1GXXKck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1117&quot; height=&quot;498&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 배포에서도 &lt;b&gt;Vercel 무료 플랜&lt;/b&gt;을 최대한 활용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub Organization의 레포지토리를 Vercel에 배포하려면 유료 플랜인 Team Plan을 써야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 절감을 위해 팀 레포지토리를 나의 개인 레포지토리로 fork(public) 한 뒤, Vercel에 배포하는 방식을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 이 방식은 팀 레포지토리와 개인 레포지토리 간의 싱크가 맞지 않는 문제가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 &lt;b&gt;Github Actions&lt;/b&gt;를 설정해서 팀 레포지토리의 main 브랜치에 commit이나 push가 발생하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 개인 레포지토리로 변경 사항을 push 하도록 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prod와 dev 환경을 나누기 위해 Vercel의 브랜치별 배포 기능도 활용하여 dev 브랜치에도 Github Actions을 적용했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;React+PWA를 선택한 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란학기제를 함께하는 석찬이가 아무래도 React를 주로 개발해 왔기 때문에 React Native, Flutter나 Swift, 코틀린을 새로 배우기에는 러닝 커브가 크고 무리라고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 React + PWA(Progressive Web Application) 조합을 채택해서 앱 형태로 제공할 수 있도록 하여 사용자 경험을 향상하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, PWA는 브라우저 기반으로 작동하면서도 네이티브 앱과 유사한 UX를 제공하며, 알림 기능까지 구현할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, iOS의 경우, 기존에는 웹 푸시 알림 기능을 지원하지 않았지만, iOS 16.4 버전부터 웹 푸시 알림 기능을 지원하게 되었고, 이 점이 PWA 선택에 큰 영향을 주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyLBAt/btsLE3idZj9/hTh7KEzTM3wKo6cpJSDfc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyLBAt/btsLE3idZj9/hTh7KEzTM3wKo6cpJSDfc1/img.png&quot; data-alt=&quot;iOS는 Safari 16.4 버전부터 PWA에서 푸시 알림을 지원한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyLBAt/btsLE3idZj9/hTh7KEzTM3wKo6cpJSDfc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyLBAt%2FbtsLE3idZj9%2FhTh7KEzTM3wKo6cpJSDfc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;700&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;iOS는 Safari 16.4 버전부터 PWA에서 푸시 알림을 지원한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot;&gt;Safari 16.4 Release Notes | Apple Developer Documentation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735907210210&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;Safari 16.4 Release Notes | Apple Developer Documentation&quot; data-og-description=&quot;Released March 27, 2023 &amp;mdash;&amp;nbsp;Version 16.4 (18615.1.26)&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dhjG2M/hyXWxSsHYd/8rmCBXDjzx0TKRugXbrPd1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dlegkn/hyXWuVIUCN/4ZP2qXm1kXkHmw7ARXcxA0/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dhjG2M/hyXWxSsHYd/8rmCBXDjzx0TKRugXbrPd1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dlegkn/hyXWuVIUCN/4ZP2qXm1kXkHmw7ARXcxA0/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Safari 16.4 Release Notes | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Released March 27, 2023 &amp;mdash;&amp;nbsp;Version 16.4 (18615.1.26)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers&quot;&gt;Sending web push notifications in web apps and browsers | Apple Developer Documentation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735907298892&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;Sending web push notifications in web apps and browsers | Apple Developer Documentation&quot; data-og-description=&quot;Update your web server and website to send push notifications that work in Safari, other browsers, and web apps, following cross-browser standards.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/daT4hR/hyXWBm1zpZ/1IjHDEvBWtcSGaa7H8IW00/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/9XZgE/hyXWunWTbi/KZjKm12aZ0l49pHoFOJY50/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/daT4hR/hyXWBm1zpZ/1IjHDEvBWtcSGaa7H8IW00/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/9XZgE/hyXWunWTbi/KZjKm12aZ0l49pHoFOJY50/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Sending web push notifications in web apps and browsers | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Update your web server and website to send push notifications that work in Safari, other browsers, and web apps, following cross-browser standards.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 개강하기 전 2024년 2월, iOS 17.4 버전부터 PWA 지원을 중단한다는 애플의 발표를 듣고 심장이 철렁했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvJksh/btsLCsEcHnZ/l1YCMccrj3bXEDQeOJpBIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvJksh/btsLCsEcHnZ/l1YCMccrj3bXEDQeOJpBIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvJksh/btsLCsEcHnZ/l1YCMccrj3bXEDQeOJpBIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvJksh%2FbtsLCsEcHnZ%2Fl1YCMccrj3bXEDQeOJpBIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1704&quot; height=&quot;1248&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.to/lilxyzz/ios-174-update-ends-pwa-support-in-the-european-union-3p95&quot;&gt;iOS 17.4 Update Ends PWA Support in the European Union&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735907193582&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;iOS 17.4 Update Ends PWA Support in the European Union&quot; data-og-description=&quot;In the latest iOS 17.4 beta update, Apple made a significant move by disabling the functionality of...&quot; data-og-host=&quot;dev.to&quot; data-og-source-url=&quot;https://dev.to/lilxyzz/ios-174-update-ends-pwa-support-in-the-european-union-3p95&quot; data-og-url=&quot;https://dev.to/lilxyzz/ios-174-update-ends-pwa-support-in-the-european-union-3p95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bK9OJ2/hyXWn3o8T7/Nf9h8yGFJlqkgDnv2RlpwK/img.jpg?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500,https://scrap.kakaocdn.net/dn/oxalY/hyXWnbg1ss/pAYuCC7J9F0caLw8QMkaQ1/img.jpg?width=1000&amp;amp;height=420&amp;amp;face=0_0_1000_420&quot;&gt;&lt;a href=&quot;https://dev.to/lilxyzz/ios-174-update-ends-pwa-support-in-the-european-union-3p95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.to/lilxyzz/ios-174-update-ends-pwa-support-in-the-european-union-3p95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bK9OJ2/hyXWn3o8T7/Nf9h8yGFJlqkgDnv2RlpwK/img.jpg?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500,https://scrap.kakaocdn.net/dn/oxalY/hyXWnbg1ss/pAYuCC7J9F0caLw8QMkaQ1/img.jpg?width=1000&amp;amp;height=420&amp;amp;face=0_0_1000_420');&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;iOS 17.4 Update Ends PWA Support in the European Union&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In the latest iOS 17.4 beta update, Apple made a significant move by disabling the functionality of...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.to&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;하지만 유럽에서 보이콧이라는 강수를 둔 바람에 지원 철회를 철회했고(?) 무사히 프로젝트를 진행할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dacKqe/btsLEKpDYKb/UVo9pdYTtLrs0WBvEaOun0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dacKqe/btsLEKpDYKb/UVo9pdYTtLrs0WBvEaOun0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dacKqe/btsLEKpDYKb/UVo9pdYTtLrs0WBvEaOun0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdacKqe%2FbtsLEKpDYKb%2FUVo9pdYTtLrs0WBvEaOun0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1324&quot; height=&quot;960&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/support/dma-and-apps-in-the-eu/#ntfqa&quot;&gt;Update on apps distributed in the European Union - Support - Apple Developer&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735907252017&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;Update on apps distributed in the European Union - Support - Apple Developer&quot; data-og-description=&quot;Update on apps distributed in the European&amp;nbsp;Union&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/support/dma-and-apps-in-the-eu/#ntfqa&quot; data-og-url=&quot;https://developer.apple.com/support/dma-and-apps-in-the-eu/#ntfqa&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/support/dma-and-apps-in-the-eu/#ntfqa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/support/dma-and-apps-in-the-eu/#ntfqa&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;Update on apps distributed in the European Union - Support - Apple Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Update on apps distributed in the European&amp;nbsp;Union&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스프링을 선택한 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란학기제를 같이하는 나와 은정이 둘 다 스프링을 주력으로 개발했기 때문에 스프링 + JPA를 선택했다. 개발한 뒤에 이유를 덧붙이자면, 위의 아키텍처에서 볼 수 있듯이 스프링이 크롤링 서버가 보낸 공지사항을 특정 API로 받는 역할도 하고, 일반 API 서버로서의 역할도 하고, FCM으로 푸시 요청도 해주는 여러 가지 역할을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이렇게 여러 역할을 수행하고, 크롤링한 공지사항을 받아서, DB에 저장하고, FCM에 푸시 알림 요청까지 하는 과정이, 동시에 일어나는 경우도 있기 때문에 멀티스레드로 다루는 것이 적합하다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에는 이를 분리할 계획이지만, 단일 서버로 다루기에는 스프링이 적합하다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;현황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 6월 파란학기제 성과 발표제에서 배포한 이후로 지금까지 계속해서 운영 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가입자 수는 2024년 12월 18일 기준 240명이며, 단과대 축제 부스 이후에 MAU가 170명은 찍힌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 사용자가 있으니까 더 잘 운영하고 싶고, 리팩토링 할 욕심이 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1FB3q/btsLEL3dRbW/jzRn8wufWFwI2eQ9fE0XF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1FB3q/btsLEL3dRbW/jzRn8wufWFwI2eQ9fE0XF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1FB3q/btsLEL3dRbW/jzRn8wufWFwI2eQ9fE0XF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1FB3q%2FbtsLEL3dRbW%2FjzRn8wufWFwI2eQ9fE0XF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;194&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxeX9I/btsLEGU7SjG/m6xQPg7mxChqAekTcB8Lck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxeX9I/btsLEGU7SjG/m6xQPg7mxChqAekTcB8Lck/img.png&quot; data-alt=&quot;Google Analytics&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxeX9I/btsLEGU7SjG/m6xQPg7mxChqAekTcB8Lck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxeX9I%2FbtsLEGU7SjG%2Fm6xQPg7mxChqAekTcB8Lck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;642&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Google Analytics&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;앞으로의 계획&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버비 충당: 현재 월 3만원 정도의 AWS 서버비가 나가는데(prod + dev) 이 돈을 충당할 방법을 강구 중이다&amp;hellip; 도와줘요 아주대&amp;hellip;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예산을 충분히 지원 받는다면, 쿠버네티스, Kafka, ELK 같은 오픈스택도 마음껏 써보고 싶다. 그전까지 리팩토링을 통해 코드를 유지보수하기 좋게 만들려고한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;신설학과, 단과대 추가: -자유전공학부, 프런티어과학학부, 경제정치사회융합학부, 응용화학과, 첨단바이오융합대학이 추가되었다. 서비스의 구독 목록에 추가해야 한다.&lt;/li&gt;
&lt;li&gt;알림 ON/OFF 옵션 추가: 현재는 구독 탭에서 구독한 공지사항에 대해서는 무조건 푸시 알림을 받는다. 특히 아주대학교-일반 공지사항은 하루에 30개가 넘게 공지사항이 올라와 너무 자주 알림이 온다는 의견을 반영하여 결정했다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;유튜브의 구독 기능처럼, 구독은 하고 알림은 받지 않는 기능을 추가할 생각이다. 구독한 공지사항에 푸시 알림이 오지 않더라도 , 네비게이션바의 구독탭에 뱃지가 바뀌기 때문에 종종 올라오면서 확인을 할 것이라고 생각했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBGqA/btsLDZgyKZx/kl5XWwmfz9u8PkgogS0zkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBGqA/btsLDZgyKZx/kl5XWwmfz9u8PkgogS0zkk/img.png&quot; data-alt=&quot;유튜브의 알림 옵션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBGqA/btsLDZgyKZx/kl5XWwmfz9u8PkgogS0zkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBGqA%2FbtsLDZgyKZx%2Fkl5XWwmfz9u8PkgogS0zkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;404&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;404&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vNH7I/btsLCFp1hg5/KmxlqFIAjnGbtI9Zgksvn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vNH7I/btsLCFp1hg5/KmxlqFIAjnGbtI9Zgksvn1/img.png&quot; data-alt=&quot;일반 앱처럼 PWA에서도 뱃지 API를 지원한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vNH7I/btsLCFp1hg5/KmxlqFIAjnGbtI9Zgksvn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvNH7I%2FbtsLCFp1hg5%2FKmxlqFIAjnGbtI9Zgksvn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;354&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반 앱처럼 PWA에서도 뱃지 API를 지원한다&lt;/figcaption&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;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/How_to/Display_badge_on_app_icon&quot;&gt;Display a badge on the app icon - Progressive web apps | MDN&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735907599269&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;Display a badge on the app icon - Progressive web apps | MDN&quot; data-og-description=&quot;Applications native to mobile and desktop operating systems can display badges on top of their app icons to inform users that new content is available. For example, an email client application can display the total number of unread messages in a badge and &quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/How_to/Display_badge_on_app_icon&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/How_to/Display_badge_on_app_icon&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBFur2/hyXWxdRbcA/iVcUh6UkZAczjHANBopFpk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/How_to/Display_badge_on_app_icon&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/How_to/Display_badge_on_app_icon&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBFur2/hyXWxdRbcA/iVcUh6UkZAczjHANBopFpk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;Display a badge on the app icon - Progressive web apps | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Applications native to mobile and desktop operating systems can display badges on top of their app icons to inform users that new content is available. For example, an email client application can display the total number of unread messages in a badge and&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;푸시 알림 및 크롤링 모니터링: FCM을 사용하기 때문에 현재 Firebase 콘솔을 통해 메시지의 전송량은 모니터링할 수 있지만, 클릭률이나 수신률에 대해서는 모니터링이 되지 않는다. 따라서 클릭률과 수신률 같은 푸시 알림 데이터를 모니터링하는 시스템을 구축할 계획이다. 또한 크롤링을 할때도 실패 처리, 누락 처리와 같은 예외처리를 정교화하고 안정적인 서비스 운영을 위한 모니터링을 구축할 계획이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1046&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdTb3j/btsLCrL6Bbj/6D2NJAUCav4PVKZwUDkZj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdTb3j/btsLCrL6Bbj/6D2NJAUCav4PVKZwUDkZj0/img.png&quot; data-alt=&quot;Firebase의 푸시 알림 모니터링&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdTb3j/btsLCrL6Bbj/6D2NJAUCav4PVKZwUDkZj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdTb3j%2FbtsLCrL6Bbj%2F6D2NJAUCav4PVKZwUDkZj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1046&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1046&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Firebase의 푸시 알림 모니터링&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ajouevent.com</category>
      <category>FCM</category>
      <category>firebasecloudmessaging</category>
      <category>PWA</category>
      <category>푸시알림</category>
      <author>simzard</author>
      <guid isPermaLink="true">https://simzard.tistory.com/1</guid>
      <comments>https://simzard.tistory.com/1#entry1comment</comments>
      <pubDate>Sun, 5 Jan 2025 16:11:06 +0900</pubDate>
    </item>
  </channel>
</rss>