<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>shine.log</title>
    <link>https://shinejung.tistory.com/</link>
    <description>저의 블로그에 오신것을 환영합니다. 프론트엔드 개발을 많이 다룹니다.</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 05:30:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>shinejung</managingEditor>
    <image>
      <title>shine.log</title>
      <url>https://tistory1.daumcdn.net/tistory/7605638/attach/2747ff8773a444c5b84c45050ab07185</url>
      <link>https://shinejung.tistory.com</link>
    </image>
    <item>
      <title>2025 연말 회고 &amp;mdash; '작게 쌓더라도 끊기지 않게'</title>
      <link>https://shinejung.tistory.com/entry/2025-%EC%97%B0%EB%A7%90-%ED%9A%8C%EA%B3%A0-%E2%80%94-%EC%9E%91%EA%B2%8C-%EC%8C%93%EB%8D%94%EB%9D%BC%EB%8F%84-%EB%81%8A%EA%B8%B0%EC%A7%80-%EC%95%8A%EA%B2%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025년은 회사 프로젝트에 집중하면서도 재충전도 할 수 있었던 해였다. 그전에는 대학생활을 하면서 파트타임 외주 개발도 하고, 교육 프로그램과 동아리 활동도 하고, 팀 프로젝트도 하며 한 시즌에 여러 일을 병행해 왔다. 그런데 이렇게 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;회사에 들어온 지 2년째가 되면서 서비스에 대한 책임이 커졌고, 신경 써서 끝내야 하는 일도 많아졌다. 하지만 그만큼 내 역량을 보여줄 기회도 많았다. 계속되는 FE 프로젝트 개발 속에서, FE에 대한 내 기준과 판단도 선명해졌다.&lt;br /&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;code&gt;실내 위치추적&lt;/code&gt;, &lt;code&gt;경험으로 쌓여가는 FE 전문성&lt;/code&gt;, &lt;code&gt;재충전&lt;/code&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;code&gt;자산 관리 서비스(실내 위치추적 + 도면 뷰)&lt;/code&gt;를 성공적으로 만든 일이다. 이 프로젝트에 차출되어 TF팀에 합류했지만, 기존 서비스개발팀 업무도 계속 병행했다. 한 해 내내 컨텍스트가 자주 바뀌었고, 그래서 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;학생 때도 웹 서비스를 많이 만들었지만, 실무에서 제품을 굴려보는 경험은 확실히 달랐다. B2B 환경에서는 장애나 문제가 고객과 우리 모두의 손실로 이어질 수 있어서, 개발 스타일이 더 보수적이고 신중해졌다. 선택의 기로가 생기면 어떤 결정이 장기적으로 팀에 유리한지와 로드맵까지 함께 보게 됐다. 기능을 추가하거나 남이 만든 도구를 쓸 때도 어디서 문제가 날 수 있는지, 어떤 엣지 케이스를 먼저 막아야 하는지부터 생각하게 됐다.&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://www.linkedin.com/posts/seokmin-jung_%EC%9D%80%ED%98%9C-%EA%B0%9A%EC%9D%80-%EC%A1%B0%EC%B9%B4-%EC%A0%80%EC%97%90%EA%B2%8C%EB%8A%94-%EC%82%BC%EC%B4%8C%EC%9D%B4-%EB%91%90-%EB%B6%84-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4-%EC%97%84%EB%A7%88%EC%9D%98-%EB%8F%99%EC%83%9D%EB%93%A4%EC%9D%B8%EB%8D%B0-%EC%A0%9C%EA%B0%80-activity-7406607781073653760-m6Oa&quot;&gt;LinkedIn 글&lt;/a&gt;에 적어뒀다.&lt;br /&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;code&gt;재충전&lt;/code&gt;이라는 말이 잘 어울린다. 아내와 제주도에서 자유여행을 하면서, 커리어가 중요하긴 해도 20대를 일만으로 채우지는 말아야겠다는 생각이 들었다. 일정 시간은 일부러 가정과 즐거움을 위해 남겨두는 것도 중요하다고 느꼈다. 또 골든 리트리버 &lt;code&gt;해피&lt;/code&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2026 계획 (Continue / Start / Stop)&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;Continue&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;li&gt;가정에 집중하는 시간 지키기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Start&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;Stop&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;li&gt;컨텍스트 스위칭에 끌려다니는 일(우선순위/타임박스로 줄이기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아내와 함께 '월간 목표' 룰도 만들었다. 매달 5개의 목표를 정하고, 하나를 지킬 때마다 용돈 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;월간 목표 5개&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;/li&gt;
&lt;li&gt;구매한 강의 수강 4시간&lt;/li&gt;
&lt;li&gt;책 200페이지&lt;/li&gt;
&lt;li&gt;프론트엔드 기술 글 4개&lt;/li&gt;
&lt;li&gt;앱 1개 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년은 '작게 쌓더라도 끊기지 않게' 보내보자.&lt;/p&gt;</description>
      <category>회고</category>
      <category>2025</category>
      <category>B2B</category>
      <category>GoogleAds</category>
      <category>루틴</category>
      <category>사이드프로젝트</category>
      <category>실내위치추적</category>
      <category>연말회고</category>
      <category>프로덕트개발</category>
      <category>프론트엔드</category>
      <category>회고</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/13</guid>
      <comments>https://shinejung.tistory.com/entry/2025-%EC%97%B0%EB%A7%90-%ED%9A%8C%EA%B3%A0-%E2%80%94-%EC%9E%91%EA%B2%8C-%EC%8C%93%EB%8D%94%EB%9D%BC%EB%8F%84-%EB%81%8A%EA%B8%B0%EC%A7%80-%EC%95%8A%EA%B2%8C#entry13comment</comments>
      <pubDate>Wed, 31 Dec 2025 21:33:27 +0900</pubDate>
    </item>
    <item>
      <title>프론트엔드 개발자가 북마크해야 할 리소스 모음 (3/3) - 개발 &amp;amp; 테스트편</title>
      <link>https://shinejung.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B6%81%EB%A7%88%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%AA%A8%EC%9D%8C-33-%EA%B0%9C%EB%B0%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%8E%B8</link>
      <description>&lt;p&gt;프론트엔드 개발을 하면서 어떤 에디터, 테스트 도구 쓸까 라는 고민해 보신 적 있으신가요?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;개발 환경 구축부터 테스트, 최적화&lt;/strong&gt;에 필요한 도구들을 정리해 봤습니다. 필요할 때마다 찾아보세요!&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;  개발자 도구&lt;/h2&gt;
&lt;h3&gt;코드 에디터 &amp;amp; IDE&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;&lt;/strong&gt; - 마이크로소프트 코드 에디터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.jetbrains.com/webstorm/&quot;&gt;WebStorm&lt;/a&gt;&lt;/strong&gt; - JetBrains JavaScript IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cursor.com/&quot;&gt;Cursor&lt;/a&gt;&lt;/strong&gt; - AI 기반 코드 에디터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;코드 스니펫 &amp;amp; 템플릿&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.30secondsofcode.org/&quot;&gt;30 seconds of code&lt;/a&gt;&lt;/strong&gt; - 짧은 코드 스니펫&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://codepen.io/&quot;&gt;CodePen&lt;/a&gt;&lt;/strong&gt; - 프론트엔드 코드 공유&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://html5boilerplate.com/&quot;&gt;HTML5 Boilerplate&lt;/a&gt;&lt;/strong&gt; - HTML5 템플릿&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;API &amp;amp; 모킹&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot;&gt;JSON Placeholder&lt;/a&gt;&lt;/strong&gt; - 가짜 REST API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://randomuser.me/&quot;&gt;Random User Generator&lt;/a&gt;&lt;/strong&gt; - 랜덤 사용자 데이터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://loremipsum.io/&quot;&gt;Lorem Ipsum&lt;/a&gt;&lt;/strong&gt; - 더미 텍스트 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mswjs.io/&quot;&gt;MSW&lt;/a&gt;&lt;/strong&gt; - Mock Service Worker&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;브라우저 테스트 &amp;amp; 호환성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.browserstack.com/&quot;&gt;BrowserStack&lt;/a&gt;&lt;/strong&gt; - 크로스 브라우저 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://caniuse.com/&quot;&gt;Can I Use&lt;/a&gt;&lt;/strong&gt; - 브라우저 호환성 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://browsersl.ist/&quot;&gt;Browserslist&lt;/a&gt;&lt;/strong&gt; - 타겟 브라우저 쿼리 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;버전 관리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt; - Git 저장소 &amp;amp; 협업&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://about.gitlab.com/&quot;&gt;GitLab&lt;/a&gt;&lt;/strong&gt; - DevOps 플랫폼&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://bitbucket.org/&quot;&gt;Bitbucket&lt;/a&gt;&lt;/strong&gt; - Git 저장소&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  코드 품질 관리&lt;/h2&gt;
&lt;h3&gt;린터 &amp;amp; 포매터&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://eslint.org/&quot;&gt;ESLint&lt;/a&gt;&lt;/strong&gt; - JavaScript 린터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt;&lt;/strong&gt; - 코드 포매터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://stylelint.io/&quot;&gt;Stylelint&lt;/a&gt;&lt;/strong&gt; - CSS 린터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Git Hooks&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://typicode.github.io/husky/&quot;&gt;Husky&lt;/a&gt;&lt;/strong&gt; - Git hooks 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/okonet/lint-staged&quot;&gt;lint-staged&lt;/a&gt;&lt;/strong&gt; - Staged 파일 린트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;코드 분석&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.sonarqube.org/&quot;&gt;SonarQube&lt;/a&gt;&lt;/strong&gt; - 코드 품질 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://codeclimate.com/&quot;&gt;CodeClimate&lt;/a&gt;&lt;/strong&gt; - 코드 리뷰 &amp;amp; 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AI 코드 리뷰&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://coderabbit.ai/&quot;&gt;CodeRabbit&lt;/a&gt;&lt;/strong&gt; - AI 기반 PR 리뷰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.codium.ai/&quot;&gt;Codium AI&lt;/a&gt;&lt;/strong&gt; - AI PR 분석 &amp;amp; 테스트 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.jetbrains.com/qodana/&quot;&gt;Qodana&lt;/a&gt;&lt;/strong&gt; - JetBrains 코드 품질 플랫폼&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  테스트 &amp;amp; 디버깅&lt;/h2&gt;
&lt;h3&gt;테스트 프레임워크&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://vitest.dev/&quot;&gt;Vitest&lt;/a&gt;&lt;/strong&gt; - Vite 기반 테스트 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jestjs.io/&quot;&gt;Jest&lt;/a&gt;&lt;/strong&gt; - JavaScript 테스트 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://testing-library.com/react&quot;&gt;React Testing Library&lt;/a&gt;&lt;/strong&gt; - React 테스트 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;E2E 테스트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://playwright.dev/&quot;&gt;Playwright&lt;/a&gt;&lt;/strong&gt; - 모던 E2E 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cypress.io/&quot;&gt;Cypress&lt;/a&gt;&lt;/strong&gt; - JavaScript E2E 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;비주얼 테스트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.chromatic.com/&quot;&gt;Chromatic&lt;/a&gt;&lt;/strong&gt; - Storybook 비주얼 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://percy.io/&quot;&gt;Percy&lt;/a&gt;&lt;/strong&gt; - 비주얼 리뷰 플랫폼&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;디버깅 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/learn/react-developer-tools&quot;&gt;React DevTools&lt;/a&gt;&lt;/strong&gt; - React 디버깅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/reduxjs/redux-devtools&quot;&gt;Redux DevTools&lt;/a&gt;&lt;/strong&gt; - Redux 디버깅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developer.chrome.com/docs/devtools/&quot;&gt;Chrome DevTools&lt;/a&gt;&lt;/strong&gt; - 브라우저 개발자 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;API 테스트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.postman.com/&quot;&gt;Postman&lt;/a&gt;&lt;/strong&gt; - API 개발 &amp;amp; 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://insomnia.rest/&quot;&gt;Insomnia&lt;/a&gt;&lt;/strong&gt; - API 클라이언트&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  CI/CD &amp;amp; 배포&lt;/h2&gt;
&lt;h3&gt;CI/CD 플랫폼&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt;&lt;/strong&gt; - GitHub CI/CD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;GitLab CI&lt;/a&gt;&lt;/strong&gt; - GitLab CI/CD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://circleci.com/&quot;&gt;CircleCI&lt;/a&gt;&lt;/strong&gt; - 클라우드 CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;배포 플랫폼&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;&lt;/strong&gt; - Next.js 최적화 배포&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;&lt;/strong&gt; - JAMstack 배포&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://pages.cloudflare.com/&quot;&gt;Cloudflare Pages&lt;/a&gt;&lt;/strong&gt; - 엣지 배포&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://railway.app/&quot;&gt;Railway&lt;/a&gt;&lt;/strong&gt; - 풀스택 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;♿ 접근성 도구&lt;/h2&gt;
&lt;h3&gt;접근성 검사&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://wave.webaim.org/&quot;&gt;WAVE&lt;/a&gt;&lt;/strong&gt; - 웹 접근성 평가 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.deque.com/axe/devtools/&quot;&gt;Axe DevTools&lt;/a&gt;&lt;/strong&gt; - 접근성 테스트 확장 프로그램&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://pa11y.org/&quot;&gt;Pa11y&lt;/a&gt;&lt;/strong&gt; - 자동화된 접근성 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;색상 대비 확인&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://webaim.org/resources/contrastchecker/&quot;&gt;WebAIM Contrast Checker&lt;/a&gt;&lt;/strong&gt; - 색상 대비 검사&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://contrast-ratio.com/&quot;&gt;Contrast Ratio&lt;/a&gt;&lt;/strong&gt; - 대비율 계산기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://colororacle.org/&quot;&gt;Color Oracle&lt;/a&gt;&lt;/strong&gt; - 색맹 시뮬레이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;접근성 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react-spectrum.adobe.com/react-aria/&quot;&gt;React Aria&lt;/a&gt;&lt;/strong&gt; - Adobe의 접근성 후크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.radix-ui.com/&quot;&gt;Radix UI&lt;/a&gt;&lt;/strong&gt; - 접근성 우선 UI 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;⚡ 성능 &amp;amp; 최적화&lt;/h2&gt;
&lt;h3&gt;성능 측정&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/&quot;&gt;Lighthouse&lt;/a&gt;&lt;/strong&gt; - 웹 성능 감사&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.webpagetest.org/&quot;&gt;WebPageTest&lt;/a&gt;&lt;/strong&gt; - 웹 성능 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;/strong&gt; - Google 성능 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;번들 분석&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/webpack-contrib/webpack-bundle-analyzer&quot;&gt;Webpack Bundle Analyzer&lt;/a&gt;&lt;/strong&gt; - Webpack 번들 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/btd/rollup-plugin-visualizer&quot;&gt;Vite Bundle Visualizer&lt;/a&gt;&lt;/strong&gt; - Vite 번들 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://bundlephobia.com/&quot;&gt;Bundle Phobia&lt;/a&gt;&lt;/strong&gt; - npm 패키지 크기 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;이미지 최적화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://squoosh.app/&quot;&gt;Squoosh&lt;/a&gt;&lt;/strong&gt; - 이미지 압축 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://tinypng.com/&quot;&gt;TinyPNG&lt;/a&gt;&lt;/strong&gt; - PNG/JPG 압축&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://imageoptim.com/&quot;&gt;ImageOptim&lt;/a&gt;&lt;/strong&gt; - 이미지 최적화 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;모니터링 &amp;amp; 분석&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://sentry.io/&quot;&gt;Sentry&lt;/a&gt;&lt;/strong&gt; - 에러 모니터링&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://logrocket.com/&quot;&gt;LogRocket&lt;/a&gt;&lt;/strong&gt; - 세션 재생 &amp;amp; 모니터링&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://analytics.google.com/&quot;&gt;Google Analytics&lt;/a&gt;&lt;/strong&gt; - 웹 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://vercel.com/analytics&quot;&gt;Vercel Analytics&lt;/a&gt;&lt;/strong&gt; - Web Vitals 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  학습 리소스&lt;/h2&gt;
&lt;h3&gt;문서화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developer.mozilla.org/&quot;&gt;MDN Web Docs&lt;/a&gt;&lt;/strong&gt; - 웹 기술 문서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://web.dev/&quot;&gt;Web.dev&lt;/a&gt;&lt;/strong&gt; - Google의 웹 개발 가이드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://javascript.info/&quot;&gt;JavaScript.info&lt;/a&gt;&lt;/strong&gt; - 모던 JavaScript 튜토리얼&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;코딩 챌린지&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.frontendmentor.io/&quot;&gt;Frontend Mentor&lt;/a&gt;&lt;/strong&gt; - 프론트엔드 챌린지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.codewars.com/&quot;&gt;Codewars&lt;/a&gt;&lt;/strong&gt; - 코딩 문제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://leetcode.com/&quot;&gt;LeetCode&lt;/a&gt;&lt;/strong&gt; - 알고리즘 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;  도움이 되셨나요? 유용한 리소스가 있다면 댓글로 공유해 주세요!&lt;/p&gt;</description>
      <category>FRONTEND</category>
      <category>CI/CD</category>
      <category>개발도구</category>
      <category>개발환경</category>
      <category>리소스모음</category>
      <category>성능최적화</category>
      <category>접근성</category>
      <category>코드품질</category>
      <category>테스트</category>
      <category>프론트엔드</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/12</guid>
      <comments>https://shinejung.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B6%81%EB%A7%88%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%AA%A8%EC%9D%8C-33-%EA%B0%9C%EB%B0%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%8E%B8#entry12comment</comments>
      <pubDate>Wed, 12 Nov 2025 18:15:34 +0900</pubDate>
    </item>
    <item>
      <title>프론트엔드 개발자가 북마크해야 할 리소스 모음 (2/3) - UI &amp;amp; 인터랙션편</title>
      <link>https://shinejung.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B6%81%EB%A7%88%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%AA%A8%EC%9D%8C-23-UI-%EC%9D%B8%ED%84%B0%EB%9E%99%EC%85%98%ED%8E%B8</link>
      <description>&lt;p&gt;프론트엔드 개발을 하면서 어떤 CSS 프레임워크, 애니메이션 라이브러리 쓸까 라는 고민해 보신 적 있으신가요?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UI 구현과 시각적 표현&lt;/strong&gt;에 필요한 도구들을 정리해 봤습니다. 필요할 때마다 찾아보세요!&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt; ️ 디자인 &amp;amp; 프로토타이핑 도구&lt;/h2&gt;
&lt;h3&gt;디자인 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt;&lt;/strong&gt; - 협업 디자인 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.sketch.com/&quot;&gt;Sketch&lt;/a&gt;&lt;/strong&gt; - macOS 전용 디자인 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;프로토타이핑 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.framer.com/&quot;&gt;Framer&lt;/a&gt;&lt;/strong&gt; - 인터랙티브 프로토타이핑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.protopie.io/&quot;&gt;ProtoPie&lt;/a&gt;&lt;/strong&gt; - 코드 없는 프로토타이핑&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;디자인 to 코드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.figma.com/dev-mode/&quot;&gt;Figma Dev Mode&lt;/a&gt;&lt;/strong&gt; - Figma 디자인을 코드로&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.animaapp.com/&quot;&gt;Anima&lt;/a&gt;&lt;/strong&gt; - 디자인을 React/Vue 코드로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;온라인 디자인 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://canva.com/&quot;&gt;Canva&lt;/a&gt;&lt;/strong&gt; - 온라인 디자인 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  애니메이션 &amp;amp; 모션&lt;/h2&gt;
&lt;h3&gt;JavaScript 애니메이션 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://gsap.com/&quot;&gt;GSAP&lt;/a&gt;&lt;/strong&gt; - 고성능 JavaScript 애니메이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://motion.dev/&quot;&gt;Motion&lt;/a&gt;&lt;/strong&gt; - React 모던 모션 라이브러리 (구 Framer Motion)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.react-spring.dev/&quot;&gt;React Spring&lt;/a&gt;&lt;/strong&gt; - React 기반 물리 애니메이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://animejs.com/&quot;&gt;Anime.js&lt;/a&gt;&lt;/strong&gt; - 경량 JavaScript 애니메이션&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS 애니메이션&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://animate.style/&quot;&gt;Animate.css&lt;/a&gt;&lt;/strong&gt; - 즉시 사용 가능한 CSS 애니메이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://animista.net/&quot;&gt;Animista&lt;/a&gt;&lt;/strong&gt; - CSS 애니메이션 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;로티 &amp;amp; 벡터 애니메이션&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://lottiefiles.com/&quot;&gt;Lottie Files&lt;/a&gt;&lt;/strong&gt; - 로티 애니메이션 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/lottie-react&quot;&gt;Lottie React&lt;/a&gt;&lt;/strong&gt; - React용 Lottie&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  마이크로 인터렉션 &amp;amp; UI 효과&lt;/h2&gt;
&lt;h3&gt;Pre-made 컴포넌트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://ui.aceternity.com/&quot;&gt;Aceternity UI&lt;/a&gt;&lt;/strong&gt; - 고급 인터렉션 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://magicui.design/&quot;&gt;Magic UI&lt;/a&gt;&lt;/strong&gt; - React 애니메이션 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://ui.shadcn.com/&quot;&gt;shadcn/ui&lt;/a&gt;&lt;/strong&gt; - 복사 가능한 컴포넌트 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS 효과 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://ianlunn.github.io/Hover/&quot;&gt;Hover.css&lt;/a&gt;&lt;/strong&gt; - 호버 효과 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;로딩 &amp;amp; 인디케이터&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://uiball.com/loaders/&quot;&gt;UI Ball&lt;/a&gt;&lt;/strong&gt; - 로딩 애니메이션 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://tobiasahlin.com/spinkit/&quot;&gt;SpinKit&lt;/a&gt;&lt;/strong&gt; - CSS 스피너 모음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cssloaders.github.io/&quot;&gt;CSS Loaders&lt;/a&gt;&lt;/strong&gt; - 순수 CSS 로더&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;예제 &amp;amp; 영감&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://codepen.io/search/pens?q=micro+interaction&quot;&gt;CodePen Micro Interactions&lt;/a&gt;&lt;/strong&gt; - 실전 예제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://dribbble.com/tags/micro-interactions&quot;&gt;Dribbble Micro Interactions&lt;/a&gt;&lt;/strong&gt; - 디자인 영감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://uimovement.com/&quot;&gt;UI Movement&lt;/a&gt;&lt;/strong&gt; - UI 애니메이션 갤러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  3D 프로그래밍&lt;/h2&gt;
&lt;h3&gt;Three.js 학습 리소스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://threejs.org/docs/&quot;&gt;Three.js Documentation&lt;/a&gt;&lt;/strong&gt; - 공식 Three.js 문서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://threejs.org/manual/&quot;&gt;Three.js Manual&lt;/a&gt;&lt;/strong&gt; - Three.js 매뉴얼 가이드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://threejs-journey.com/&quot;&gt;Three.js Journey&lt;/a&gt;&lt;/strong&gt; - Bruno Simon의 Three.js 완전 강의&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;React Three Fiber&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.pmnd.rs/react-three-fiber/&quot;&gt;React Three Fiber&lt;/a&gt;&lt;/strong&gt; - React용 Three.js&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/pmndrs/drei&quot;&gt;Drei&lt;/a&gt;&lt;/strong&gt; - React Three Fiber 헬퍼 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/pmndrs/leva&quot;&gt;Leva&lt;/a&gt;&lt;/strong&gt; - React GUI 컨트롤&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebGL &amp;amp; 3D 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.babylonjs.com/&quot;&gt;Babylon.js&lt;/a&gt;&lt;/strong&gt; - 웹 3D 게임 엔진&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://aframe.io/&quot;&gt;A-Frame&lt;/a&gt;&lt;/strong&gt; - WebVR 프레임워크&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt; ️ CSS &amp;amp; UI 도구&lt;/h2&gt;
&lt;h3&gt;CSS 프레임워크&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt;&lt;/strong&gt; - 유틸리티 퍼스트 CSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;&lt;/strong&gt; - UI 컴포넌트 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://bulma.io/&quot;&gt;Bulma&lt;/a&gt;&lt;/strong&gt; - 모던 CSS 프레임워크&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS-in-JS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://styled-components.com/&quot;&gt;Styled Components&lt;/a&gt;&lt;/strong&gt; - React CSS-in-JS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://emotion.sh/&quot;&gt;Emotion&lt;/a&gt;&lt;/strong&gt; - CSS-in-JS 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS 생성기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cssgrid-generator.netlify.app/&quot;&gt;CSS Grid Generator&lt;/a&gt;&lt;/strong&gt; - CSS Grid 레이아웃 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://neumorphism.io/&quot;&gt;Neumorphism&lt;/a&gt;&lt;/strong&gt; - 뉴모피즘 CSS 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://9elements.github.io/fancy-border-radius/&quot;&gt;Fancy Border Radius&lt;/a&gt;&lt;/strong&gt; - border-radius 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://hype4.academy/tools/glassmorphism-generator&quot;&gt;Glassmorphism&lt;/a&gt;&lt;/strong&gt; - 글래스모피즘 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;그림자 &amp;amp; 효과&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.joshwcomeau.com/shadow-palette/&quot;&gt;Shadow Palette Generator&lt;/a&gt;&lt;/strong&gt; - 그림자 팔레트 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://box-shadows.co/&quot;&gt;Box Shadows&lt;/a&gt;&lt;/strong&gt; - box-shadow 예제 모음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://bennettfeely.com/clippy/&quot;&gt;CSS Clip-path Maker&lt;/a&gt;&lt;/strong&gt; - clip-path 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;레이아웃 학습 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://grid.layoutit.com/&quot;&gt;Grid.layoutit&lt;/a&gt;&lt;/strong&gt; - CSS Grid 시각화 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://flexboxfroggy.com/&quot;&gt;Flexbox Froggy&lt;/a&gt;&lt;/strong&gt; - Flexbox 학습 게임&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cssgridgarden.com/&quot;&gt;Grid Garden&lt;/a&gt;&lt;/strong&gt; - CSS Grid 학습 게임&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cssbattle.dev/&quot;&gt;CSS Battle&lt;/a&gt;&lt;/strong&gt; - CSS 챌린지 게임&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  UI 컴포넌트 라이브러리&lt;/h2&gt;
&lt;h3&gt;React UI 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mui.com/&quot;&gt;MUI (Material-UI)&lt;/a&gt;&lt;/strong&gt; - Material Design 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://ant.design/&quot;&gt;Ant Design&lt;/a&gt;&lt;/strong&gt; - 엔터프라이즈급 UI 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://chakra-ui.com/&quot;&gt;Chakra UI&lt;/a&gt;&lt;/strong&gt; - 접근성 우선 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mantine.dev/&quot;&gt;Mantine&lt;/a&gt;&lt;/strong&gt; - 풀스택 React 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Headless UI 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.radix-ui.com/&quot;&gt;Radix UI&lt;/a&gt;&lt;/strong&gt; - 무헤드 UI 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://headlessui.com/&quot;&gt;Headless UI&lt;/a&gt;&lt;/strong&gt; - Tailwind 팀이 만든 컴포넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react-spectrum.adobe.com/react-aria/&quot;&gt;React Aria&lt;/a&gt;&lt;/strong&gt; - Adobe의 접근성 후크&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  SVG &amp;amp; 벡터 도구&lt;/h2&gt;
&lt;h3&gt;SVG 편집 &amp;amp; 최적화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://jakearchibald.github.io/svgomg/&quot;&gt;SVGOMG&lt;/a&gt;&lt;/strong&gt; - SVG 최적화 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://boxy-svg.com/&quot;&gt;Boxy SVG&lt;/a&gt;&lt;/strong&gt; - 온라인 SVG 편집기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://yqnn.github.io/svg-path-editor/&quot;&gt;SVG Path Editor&lt;/a&gt;&lt;/strong&gt; - SVG 패스 편집기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SVG 애니메이션&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://svgartista.net/&quot;&gt;SVGArtista&lt;/a&gt;&lt;/strong&gt; - SVG 애니메이션 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://maxwellito.github.io/vivus/&quot;&gt;Vivus&lt;/a&gt;&lt;/strong&gt; - SVG 선 그리기 애니메이션&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;  도움이 되셨나요? 유용한 리소스가 있다면 댓글로 공유해 주세요!&lt;/p&gt;</description>
      <category>FRONTEND</category>
      <category>css</category>
      <category>UI</category>
      <category>개발도구</category>
      <category>리소스모음</category>
      <category>애니메이션</category>
      <category>인터랙션</category>
      <category>컴포넌트</category>
      <category>프로토타입</category>
      <category>프론트엔드</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/11</guid>
      <comments>https://shinejung.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B6%81%EB%A7%88%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%AA%A8%EC%9D%8C-23-UI-%EC%9D%B8%ED%84%B0%EB%9E%99%EC%85%98%ED%8E%B8#entry11comment</comments>
      <pubDate>Wed, 12 Nov 2025 18:10:02 +0900</pubDate>
    </item>
    <item>
      <title>프론트엔드 개발자가 북마크해야 할 리소스 모음 (1/3) - 디자인 에셋편</title>
      <link>https://shinejung.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B6%81%EB%A7%88%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%AA%A8%EC%9D%8C-13-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%97%90%EC%85%8B%ED%8E%B8</link>
      <description>&lt;p&gt;프론트엔드 개발을 하면서 좋은 아이콘, 이미지, 폰트 어디서 구하지 라는 고민해 보신 적 있으신가요?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;무료 또는 CC0 라이선스&lt;/strong&gt;로 사용 가능한 디자인 에셋을 정리해 봤습니다. 필요할 때마다 찾아보세요!&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;  일러스트레이션 &amp;amp; 아이콘&lt;/h2&gt;
&lt;h3&gt;벡터 일러스트레이션&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://illustroke.com/en/&quot;&gt;Illustroke&lt;/a&gt;&lt;/strong&gt; - AI 기반 벡터 일러스트레이션 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://storyset.com/&quot;&gt;Storyset&lt;/a&gt;&lt;/strong&gt; - 무료 편집 가능한 일러스트레이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blush.design/&quot;&gt;Blush&lt;/a&gt;&lt;/strong&gt; - 믹스 앤 매치 일러스트레이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.openpeeps.com/&quot;&gt;Open Peeps&lt;/a&gt;&lt;/strong&gt; - 손으로 그린 일러스트레이션 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://undraw.co/illustrations&quot;&gt;unDraw&lt;/a&gt;&lt;/strong&gt; - 오픈소스 일러스트레이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.manypixels.co/gallery&quot;&gt;ManyPixels&lt;/a&gt;&lt;/strong&gt; - 2,500개 이상의 무료 일러스트레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;아이콘 &amp;amp; 일러스트레이션 마켓플레이스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://iconscout.com/illustrations&quot;&gt;IconScout Illustrations&lt;/a&gt;&lt;/strong&gt; - 일러스트레이션 마켓플레이스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://iconscout.com/3d-illustrations&quot;&gt;IconScout 3D&lt;/a&gt;&lt;/strong&gt; - 3D 일러스트레이션 모음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://iconscout.com/ai&quot;&gt;IconScout AI&lt;/a&gt;&lt;/strong&gt; - AI 기반 아이콘 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://freepik.com/&quot;&gt;Freepik&lt;/a&gt;&lt;/strong&gt; - 벡터, 일러스트레이션, 사진 마켓플레이스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://flaticon.com/&quot;&gt;Flaticon&lt;/a&gt;&lt;/strong&gt; - 아이콘 전문 사이트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;무료 아이콘 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://heroicons.com/&quot;&gt;Heroicons&lt;/a&gt;&lt;/strong&gt; - Tailwind CSS 팀이 만든 깔끔한 아이콘 세트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://lucide.dev/&quot;&gt;Lucide Icons&lt;/a&gt;&lt;/strong&gt; - 아름답고 일관된 아이콘 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://iconify.design/&quot;&gt;Iconify&lt;/a&gt;&lt;/strong&gt; - 150,000개 이상의 아이콘 통합 플랫폼&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AI 일러스트레이션 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.krea.ai/&quot;&gt;Krea.ai&lt;/a&gt;&lt;/strong&gt; - AI 기반 크리에이티브 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://icons8.com/illustration-generator&quot;&gt;Icons8 Illustration Generator&lt;/a&gt;&lt;/strong&gt; - AI 일러스트레이션 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt; ️ 사진 &amp;amp; 이미지&lt;/h2&gt;
&lt;h3&gt;고품질 무료 사진&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://unsplash.com/&quot;&gt;Unsplash&lt;/a&gt;&lt;/strong&gt; - 고품질 무료 사진 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://pexels.com/&quot;&gt;Pexels&lt;/a&gt;&lt;/strong&gt; - 무료 사진 &amp;amp; 비디오 리소스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;이미지 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://tinypng.com/&quot;&gt;TinyPNG&lt;/a&gt;&lt;/strong&gt; - 이미지 압축 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://remove.bg/&quot;&gt;Remove.bg&lt;/a&gt;&lt;/strong&gt; - 배경 제거 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://picsum.photos/&quot;&gt;Lorem Picsum&lt;/a&gt;&lt;/strong&gt; - 더미 이미지 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  비디오 &amp;amp; 영상&lt;/h2&gt;
&lt;h3&gt;무료 스톡 비디오&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://pixabay.com/videos/&quot;&gt;Pixabay Videos&lt;/a&gt;&lt;/strong&gt; - 무료 스톡 비디오&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.pexels.com/videos/&quot;&gt;Pexels Videos&lt;/a&gt;&lt;/strong&gt; - 무료 영상 리소스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://coverr.co/&quot;&gt;Coverr&lt;/a&gt;&lt;/strong&gt; - 무료 배경 영상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.videvo.net/&quot;&gt;Videvo&lt;/a&gt;&lt;/strong&gt; - 무료 비디오 클립&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  폰트 &amp;amp; 타이포그래피&lt;/h2&gt;
&lt;h3&gt;무료 웹 폰트&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://fonts.google.com/&quot;&gt;Google Fonts&lt;/a&gt;&lt;/strong&gt; - 무료 웹 폰트 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.fontsquirrel.com/&quot;&gt;Font Squirrel&lt;/a&gt;&lt;/strong&gt; - 상업용 무료 폰트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.dafont.com/&quot;&gt;DaFont&lt;/a&gt;&lt;/strong&gt; - 폰트 아카이브&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;폰트 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.fontpair.co/&quot;&gt;FontPair&lt;/a&gt;&lt;/strong&gt; - Google Fonts 조합 추천&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://typescale.com/&quot;&gt;Type Scale&lt;/a&gt;&lt;/strong&gt; - 타이포그래피 스케일 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  사운드 &amp;amp; 오디오&lt;/h2&gt;
&lt;h3&gt;무료 사운드 라이브러리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://freesound.org/&quot;&gt;Freesound&lt;/a&gt;&lt;/strong&gt; - 무료 사운드 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://zapsplat.com/&quot;&gt;Zapsplat&lt;/a&gt;&lt;/strong&gt; - 사운드 이펙트 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://sound-effects.bbcrewind.co.uk/&quot;&gt;BBC Sound Effects&lt;/a&gt;&lt;/strong&gt; - BBC 사운드 이펙트 아카이브&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;무료 음악&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.youtube.com/audiolibrary&quot;&gt;YouTube Audio Library&lt;/a&gt;&lt;/strong&gt; - 로열티 프리 음악&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://freemusicarchive.org/&quot;&gt;Free Music Archive&lt;/a&gt;&lt;/strong&gt; - 무료 음악 아카이브&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  3D 아바타 &amp;amp; 캐릭터&lt;/h2&gt;
&lt;h3&gt;아바타 생성 &amp;amp; 커스터마이징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://readyplayer.me/&quot;&gt;Ready Player Me&lt;/a&gt;&lt;/strong&gt; - 크로스 게임 아바타 플랫폼&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://avatarsdk.com/&quot;&gt;Avatar SDK&lt;/a&gt;&lt;/strong&gt; - 리얼리스틱 아바타 생성 SDK&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://deepmotion.com/animate-3d&quot;&gt;Deep Motion&lt;/a&gt;&lt;/strong&gt; - 3D 캐릭터 애니메이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.mixamo.com/&quot;&gt;Mixamo&lt;/a&gt;&lt;/strong&gt; - 3D 캐릭터 애니메이션 (Adobe)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  3D 모델 &amp;amp; 에셋&lt;/h2&gt;
&lt;h3&gt;AI 기반 3D 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.meshy.ai/&quot;&gt;Meshy AI&lt;/a&gt;&lt;/strong&gt; - 텍스트/이미지에서 3D 모델 생성 (AI 기반)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3D 모델 마켓플레이스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://market.pmnd.rs/&quot;&gt;PMND Market&lt;/a&gt;&lt;/strong&gt; - React Three Fiber 에셋&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://sketchfab.com/search?features=downloadable&quot;&gt;Sketchfab&lt;/a&gt;&lt;/strong&gt; - 3D 모델 다운로드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://poly.pizza/&quot;&gt;Poly Pizza&lt;/a&gt;&lt;/strong&gt; - 무료 low-poly 3D 모델&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://kenney.nl/assets&quot;&gt;Kenney Assets&lt;/a&gt;&lt;/strong&gt; - 게임 개발 에셋&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;무료 3D 모델 리소스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cgtrader.com/free-3d-models&quot;&gt;CGTrader Free&lt;/a&gt;&lt;/strong&gt; - 무료 3D 모델&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.turbosquid.com/Search/3D-Models/free&quot;&gt;TurboSquid Free&lt;/a&gt;&lt;/strong&gt; - 무료 3D 모델&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blenderkit.com/&quot;&gt;BlenderKit&lt;/a&gt;&lt;/strong&gt; - Blender 애드온 에셋&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://quaternius.com/&quot;&gt;Quaternius&lt;/a&gt;&lt;/strong&gt; - 무료 CC0 3D 모델&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://clara.io/library&quot;&gt;Clara.io Library&lt;/a&gt;&lt;/strong&gt; - 온라인 3D 모델 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  텍스처 &amp;amp; 패턴&lt;/h2&gt;
&lt;h3&gt;무료 텍스처 리소스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://polyhaven.com/&quot;&gt;Poly Haven&lt;/a&gt;&lt;/strong&gt; - 고품질 무료 HDRI, 텍스처, 3D 모델&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cc0textures.com/&quot;&gt;CC0 Textures&lt;/a&gt;&lt;/strong&gt; - 무료 PBR 텍스처&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  색상 &amp;amp; 그라디언트&lt;/h2&gt;
&lt;h3&gt;색상 팔레트 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://coolors.co/&quot;&gt;Coolors&lt;/a&gt;&lt;/strong&gt; - 색상 팔레트 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://color.adobe.com/&quot;&gt;Adobe Color&lt;/a&gt;&lt;/strong&gt; - 색상 조합 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://realtimecolors.com/&quot;&gt;Realtime Colors&lt;/a&gt;&lt;/strong&gt; - 실시간 색상 미리보기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://paletton.com/&quot;&gt;Paletton&lt;/a&gt;&lt;/strong&gt; - 색상 조합 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;그라디언트 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://cssgradient.io/&quot;&gt;CSS Gradient&lt;/a&gt;&lt;/strong&gt; - CSS 그라디언트 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://gradienthunt.com/&quot;&gt;Gradient Hunt&lt;/a&gt;&lt;/strong&gt; - 그라디언트 컬렉션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://uigradients.com/&quot;&gt;uiGradients&lt;/a&gt;&lt;/strong&gt; - 그라디언트 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;색상 영감&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://colors.muz.li/&quot;&gt;Muzli Colors&lt;/a&gt;&lt;/strong&gt; - 색상 팔레트 영감&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://colorhunt.co/&quot;&gt;Color Hunt&lt;/a&gt;&lt;/strong&gt; - 트렌디한 색상 팔레트&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt; ️ 배경 &amp;amp; 패턴&lt;/h2&gt;
&lt;h3&gt;배경 패턴 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://heropatterns.com/&quot;&gt;Hero Patterns&lt;/a&gt;&lt;/strong&gt; - SVG 배경 패턴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://bansal.io/pattern-css&quot;&gt;pattern.css&lt;/a&gt;&lt;/strong&gt; - CSS 기반 배경 패턴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://bgjar.com/&quot;&gt;BGJar&lt;/a&gt;&lt;/strong&gt; - 무료 SVG 배경 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://haikei.app/&quot;&gt;Haikei&lt;/a&gt;&lt;/strong&gt; - 웹 디자인용 배경 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;그래픽 요소&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://getwaves.io/&quot;&gt;Get Waves&lt;/a&gt;&lt;/strong&gt; - SVG 웨이브 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  디자인 영감&lt;/h2&gt;
&lt;h3&gt;디자인 포트폴리오 &amp;amp; 커뮤니티&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://dribbble.com/&quot;&gt;Dribbble&lt;/a&gt;&lt;/strong&gt; - 디자인 영감 &amp;amp; 포트폴리오 플랫폼&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.behance.net/&quot;&gt;Behance&lt;/a&gt;&lt;/strong&gt; - 크리에이티브 포트폴리오 플랫폼&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.awwwards.com/&quot;&gt;Awwwards&lt;/a&gt;&lt;/strong&gt; - 웹 디자인 어워드 &amp;amp; 영감&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;디자인 시스템 &amp;amp; 파일&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://figma.com/community&quot;&gt;Figma Community&lt;/a&gt;&lt;/strong&gt; - 무료 디자인 파일 &amp;amp; 플러그인&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  목업 &amp;amp; 프로토타입&lt;/h2&gt;
&lt;h3&gt;목업 생성 도구&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mockuuups.studio/&quot;&gt;Mockuuups&lt;/a&gt;&lt;/strong&gt; - 제품 목업 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://smartmockups.com/&quot;&gt;Smartmockups&lt;/a&gt;&lt;/strong&gt; - 온라인 목업 도구&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://shots.so/&quot;&gt;Shots&lt;/a&gt;&lt;/strong&gt; - 디바이스 목업 생성기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.screely.com/&quot;&gt;Screely&lt;/a&gt;&lt;/strong&gt; - 브라우저 목업 생성기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;  추가 정보&lt;/h2&gt;
&lt;h3&gt;저작권 주의사항&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;각 리소스의 라이선스를 확인하고 사용&lt;/li&gt;
&lt;li&gt;상업적 프로젝트에서는 유료 라이선스 고려&lt;/li&gt;
&lt;li&gt;CC0 라이선스는 자유롭게 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;  도움이 되셨나요? 유용한 리소스가 있다면 댓글로 공유해 주세요!&lt;/p&gt;</description>
      <category>FRONTEND</category>
      <category>3D</category>
      <category>개발도구</category>
      <category>디자인</category>
      <category>리소스모음</category>
      <category>무료리소스</category>
      <category>아이콘</category>
      <category>이미지</category>
      <category>일러스트</category>
      <category>폰트</category>
      <category>프론트엔드</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/10</guid>
      <comments>https://shinejung.tistory.com/entry/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B6%81%EB%A7%88%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%AA%A8%EC%9D%8C-13-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%97%90%EC%85%8B%ED%8E%B8#entry10comment</comments>
      <pubDate>Wed, 12 Nov 2025 18:05:20 +0900</pubDate>
    </item>
    <item>
      <title>나는 왜 개발을 좋아할까?</title>
      <link>https://shinejung.tistory.com/entry/%EB%82%98%EB%8A%94-%EC%99%9C-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%A2%8B%EC%95%84%ED%95%A0%EA%B9%8C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현의 DNA&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초등학생 때 내 방은 늘 레고 블록과 과학상자로 어질러져 있었다. 침대에 누워 방 불을 끄는 장치를 고안해 보기도 했고, 유치하지만, 변신하는 자동차도 만들어봤다. 한동안은 루브 골드버그 장치 만들기에 빠져 있던 기억도 난다. 머릿속에 있는 복잡한 것들을 만들다 보면 시간 가는 줄 몰랐고, 그게 나에겐 최고의 놀이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마인크래프트 속 코딩 경험&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중학생이 되어 친구들과 마인크래프트를 하던 때, '더 편하고 빠르게 건물을 지을 수 없을까?' 하는 생각이 들었다. 그러다 공간 채우기, 공간 복사하기 같은 명령어를 찾아보고 능숙하게 쓸 수 있게 되었다. 전투 미니 게임을 만들고 싶어서 팀을 나누고 각 진영으로 순간이동 시키는 명령어, 게임을 초기화하고 다시 시작할 수 있는 명령어를 짜서 커맨드 블록에 저장했고, 원했던 대로 게임을 만들 수 있었다. 명령어를 짜는 과정 자체가 게임의 일부처럼 느껴져 재미있었다. 그때는 그게 코딩인 줄 몰랐지만, 지금 생각해 보면 스크립트로 코딩을 경험한 첫 순간이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코딩을 배운 첫 수업&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고등학교 1학년 정보 시간에 처음으로 정식 코딩 수업을 들었다. 선생님이 초심자도 따라가기 쉽게 차근차근 설명해 주셔서 코딩에 대한 좋은 인상을 가질 수 있었고, 실습으로 C 언어 기초 100제를 풀며 프로그래밍의 기본기를 익혀 갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 문제집을 미리 다 풀어낸 뒤에는 친구들을 도와주며 설명해 주는 시간이 즐거웠다. 정보 과목에서 총점 만점을 받으면서 컴퓨터공학을 전공해도 되겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;첫 프로젝트에서 마주한 격차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 인재 전형으로 대학에 입학하고 개발 동아리에 가입했다. 1학년 여름방학에 앱 개발 프로젝트에 참여했는데, UI 구현, 서버 구축, 크롤링, 깃 협업 등 무엇 하나 제대로 할 줄 몰라 막막했다. 선배들이 물리 서버를 다루고 앱을 완성해 스토어에 배포하는 모습을 보면서 실력 차이를 크게 실감했다. 결국 프로젝트에 뚜렷한 기여를 하지 못한 채 끝났고, 본격적인 개발 공부의 필요성을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;밤을 새웠던 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 강의를 듣고 개인 프로젝트를 하나씩 완성해 가면서, 개발에 대한 자신감이 조금씩 생겼다. 방학 동안에는 주로 웹 서비스를 만들었는데, 개발이 너무 재미있어서 밥 먹는 시간과 잠자는 시간조차 아까웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 자체도 재미있었지만, 나만의 멋진 결과물을 만들어 간다는 점이 더 큰 행복이었다. 그래서 멈출 수 없었고, 몰입할 수 있었다.&lt;br /&gt;이틀 연속 밤을 새우자, 어머니가 강제로 컴퓨터를 끄셨던 기억도 있다.&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://food-handong.vercel.app/&quot;&gt;완성한 서비스&lt;/a&gt;를 배포했을 때 학교 커뮤니티에서 좋은 반응을 얻었고, GA로 하루에 천 명 이상 접속하는 것을 확인했을 때(비록 며칠뿐이었지만) 짜릿함과 성취감을 느꼈다. '앞으로도 이 분야를 전문적으로 해보고 싶다'라는 생각이 굳어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자가 생기는 경험&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3학년 때 스타트업 외주로 &lt;a href=&quot;https://dutymaker.com/&quot;&gt;간호사 근무표를 자동으로 생성해 주는 웹 서비스&lt;/a&gt;를 구축했다. 기획부터 개발, 스테이징, QA, 상용 배포, CS 대응까지 서비스 운영의 전 과정을 경험했다.&lt;br /&gt;배포 후에는 6천 명 이상의 사용자가 가입했는데, 내가 만든 서비스가 실제 현장의 골치 아픈 문제를 해결했다는 사실이 믿기지 않았다. 여러 현장에서 큰 도움이 되었다는 피드백을 받으며 오히려 내가 감사함을 느꼈다.&lt;br /&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://hanq.netlify.app/&quot;&gt;출석 관리 서비스&lt;/a&gt;와 &lt;a href=&quot;https://bigdata-coss-university.vercel.app/&quot;&gt;장학금 신청 시스템&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4학년 때는 Apple Developer Academy 프로그램에 참여하며, 세상에 필요한 서비스를 만들기 위해 노력했다. 혼자가 아닌 팀원들과 함께했던 경험을 통해, 팀을 세워 나가는 법과 협업하며 개발하는 방법을 배울 수 있었다.&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년부터는 메를로랩에 입사해 전문연구요원으로 복무하며, 사물인터넷 도메인에서 실무 개발 경험을 쌓고 있다. 실무를 하면서 느낀 것은, 개인의 개발 실력도 중요하지만, 좋은 팀을 만들고, 개선점을 찾아내고 팀의 효율을 높이는 일 또한 중요하다는 점이었다.&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;</description>
      <category>회고</category>
      <category>개발</category>
      <category>개발자</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/9</guid>
      <comments>https://shinejung.tistory.com/entry/%EB%82%98%EB%8A%94-%EC%99%9C-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%A2%8B%EC%95%84%ED%95%A0%EA%B9%8C#entry9comment</comments>
      <pubDate>Tue, 14 Oct 2025 17:20:44 +0900</pubDate>
    </item>
    <item>
      <title>React Native WebView에서 네이티브와 데이터 주고받기</title>
      <link>https://shinejung.tistory.com/entry/React-Native-WebView%EC%97%90%EC%84%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A3%BC%EA%B3%A0%EB%B0%9B%EA%B8%B0</link>
      <description>&lt;p&gt;앱을 개발하다 보면 네이티브 화면과 웹뷰(WebView)를 함께 사용해야 할 때가 있습니다. 예를 들어, 네이티브에서 로그인한 사용자 정보를 웹뷰에서도 그대로 유지하려면 어떻게 해야 할까요? 매번 웹뷰에서 로그인하는 건 사용자 입장에서 불편한 일이겠죠.&lt;br&gt;&lt;br&gt;이 문제를 해결하려면 네이티브와 웹뷰가 데이터를 주고받을 수 있어야 합니다. &lt;code&gt;postMessage&lt;/code&gt;와 &lt;code&gt;onMessage&lt;/code&gt;를 사용하면 웹뷰에서 네이티브로 데이터를 전달할 수 있고, &lt;code&gt;injectJavaScript&lt;/code&gt;를 활용하면 네이티브에서 웹뷰로 데이터를 보낼 수 있습니다.&lt;br&gt;&lt;br&gt;같이 활용하면 좋은 기능으로는 &lt;code&gt;onNavigationStateChange&lt;/code&gt;가 있습니다.&lt;br&gt;&lt;code&gt;onNavigationStateChange&lt;/code&gt;를 이용하면 웹뷰에서 다른 페이지로 이동할 때를 감지해서 원하는 동작을 실행시킬 수 있습니다.&lt;br&gt;&lt;br&gt;이번 글에서는 이 기능들을 활용해서 네이티브와 웹뷰 간 데이터를 연동하는 방법을 알아보고, 다크 모드 적용과 로그인 상태 유지 같은 실용적인 예제도 한번 구현해 보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. injectJavaScript 활용&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;injectJavaScript&lt;/code&gt;는 네이티브에서 WebView 내부의 JavaScript 코드를 실행할 때 사용합니다. 웹뷰에 원하는 코드를 주입하거나 &lt;code&gt;document&lt;/code&gt; 속성을 변경할 수 있습니다.&lt;br&gt;&lt;br&gt;배포된 웹 페이지의 소스 코드를 수정하지 않고도 네이티브에서 웹뷰의 코드를 추가할 수 있기 때문에 잘 활용한다면 매우 유용합니다.&lt;/p&gt;
&lt;h3&gt;다크 모드 적용 예제 코드&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;import React, { useEffect, useRef } from &amp;quot;react&amp;quot;;
import { View, useColorScheme } from &amp;quot;react-native&amp;quot;;
import { WebView } from &amp;quot;react-native-webview&amp;quot;;

const MyWebView = () =&amp;gt; {
  const webViewRef = useRef(null);
  const colorScheme = useColorScheme(); // 기기의 다크 모드 여부 확인

  useEffect(() =&amp;gt; {
    if (webViewRef.current) {
      webViewRef.current.injectJavaScript(`
        document.body.style.backgroundColor = &amp;#39;${
          colorScheme === &amp;quot;dark&amp;quot; ? &amp;quot;black&amp;quot; : &amp;quot;white&amp;quot;
        }&amp;#39;;
        document.body.style.color = &amp;#39;${
          colorScheme === &amp;quot;dark&amp;quot; ? &amp;quot;white&amp;quot; : &amp;quot;black&amp;quot;
        }&amp;#39;;
      `);
    }
  }, [colorScheme]);

  return (
    &amp;lt;View style={{ flex: 1 }}&amp;gt;
      &amp;lt;WebView ref={webViewRef} source={{ uri: &amp;quot;https://example.com&amp;quot; }} /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default MyWebView;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예제 코드에서는 &lt;code&gt;useColorScheme()&lt;/code&gt;을 사용해 기기의 다크 모드 설정을 감지하고 WebView에 반영하고 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. postMessage와 onMessage 활용&lt;/h2&gt;
&lt;p&gt;웹뷰에서 로그인하면 네이티브에서 세션 정보를 저장해야 하는 경우가 있습니다. 이때 &lt;code&gt;postMessage&lt;/code&gt;를 사용하면 웹에서 네이티브로 데이터를 전달할 수 있습니다.&lt;/p&gt;
&lt;h3&gt;로그인 후 토큰 전달 예제 코드&lt;/h3&gt;
&lt;h4&gt;WebView에서 네이티브로 메시지 보내기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;import React, { useRef } from &amp;quot;react&amp;quot;;
import { View, Alert } from &amp;quot;react-native&amp;quot;;
import { WebView } from &amp;quot;react-native-webview&amp;quot;;

const MyWebView = () =&amp;gt; {
  const webViewRef = useRef(null);

  const onMessage = (event) =&amp;gt; {
    try {
      const data = JSON.parse(event.nativeEvent.data);
      Alert.alert(&amp;quot;토큰을 받았습니다!&amp;quot;, data.token);
    } catch (error) {
      console.error(&amp;quot;메세지 파싱 오류:&amp;quot;, error);
    }
  };

  return (
    &amp;lt;View style={{ flex: 1 }}&amp;gt;
      &amp;lt;WebView
        ref={webViewRef}
        source={{
          html: `
          &amp;lt;html&amp;gt;
          &amp;lt;body&amp;gt;
            &amp;lt;script&amp;gt;
              function sendToken() {
                const token = &amp;#39;auth-token&amp;#39;;
                window.ReactNativeWebView.postMessage(JSON.stringify({ token }));
              }
            &amp;lt;/script&amp;gt;
            &amp;lt;button onclick=&amp;quot;sendToken()&amp;quot;&amp;gt;Login&amp;lt;/button&amp;gt;
          &amp;lt;/body&amp;gt;
          &amp;lt;/html&amp;gt;
        `,
        }}
        onMessage={onMessage}
      /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default MyWebView;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 웹뷰에서 로그인 버튼을 누르면 네이티브로 토큰이 전달됩니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3. onNavigationStateChange 활용&lt;/h2&gt;
&lt;p&gt;웹뷰에서 로그인 후 완료 페이지(&lt;code&gt;success&lt;/code&gt; 페이지)로 이동하면 네이티브에서 이를 감지하고 자동으로 화면을 닫거나, 세션을 저장할 수 있습니다. 또한 &lt;code&gt;injectJavaScript&lt;/code&gt;를 함께 사용하면 웹뷰에서 다른 URL로 이동할 때 네이티브에서 추가적인 처리를 할 수도 있습니다.&lt;/p&gt;
&lt;h3&gt;로그인 완료 감지 후 알림 예제 코드&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;import React, { useRef } from &amp;quot;react&amp;quot;;
import { View, Alert } from &amp;quot;react-native&amp;quot;;
import { WebView } from &amp;quot;react-native-webview&amp;quot;;

const MyWebView = () =&amp;gt; {
  const webViewRef = useRef(null);

  const onLoad = () =&amp;gt; {
    webViewRef.current.injectJavaScript(
      &amp;quot;window.ReactNativeWebView.postMessage(&amp;#39;로그인 완료&amp;#39;)&amp;quot;
    );
  };

  const onNavigationStateChange = (navState) =&amp;gt; {
    if (navState.url.includes(&amp;quot;success&amp;quot;)) {
      Alert.alert(&amp;quot;로그인 성공&amp;quot;, &amp;quot;잠시 후 다른 화면으로 이동합니다.&amp;quot;);
      // 다른 화면으로 이동하는 코드
    }
  };

  return (
    &amp;lt;View style={{ flex: 1 }}&amp;gt;
      &amp;lt;WebView
        ref={webViewRef}
        source={{ uri: &amp;quot;https://example.com/login&amp;quot; }}
        onLoad={onLoad}
        onNavigationStateChange={onNavigationStateChange}
      /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default MyWebView;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 웹뷰에서 로그인 성공 페이지로 이동하면 네이티브에서 알림을 띄울 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;주의사항&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;보안을 위해 &lt;code&gt;postMessage&lt;/code&gt; 사용 시 &lt;code&gt;origin&lt;/code&gt;을 체크하는 것을 권장합니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;웹뷰 앱 구현 중에 어려운 점이 있다면 댓글로 남겨주세요. 같이 고민해 보겠습니다. 감사합니다!  ‍♂️&lt;/p&gt;</description>
      <category>MOBILE APP</category>
      <category>Android</category>
      <category>expo</category>
      <category>ios</category>
      <category>React Native</category>
      <category>webview</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/8</guid>
      <comments>https://shinejung.tistory.com/entry/React-Native-WebView%EC%97%90%EC%84%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A3%BC%EA%B3%A0%EB%B0%9B%EA%B8%B0#entry8comment</comments>
      <pubDate>Tue, 18 Mar 2025 18:00:18 +0900</pubDate>
    </item>
    <item>
      <title>Quantum Gomoku(양자 오목) 보드게임 소개</title>
      <link>https://shinejung.tistory.com/entry/Quantum-Gomoku%EC%96%91%EC%9E%90-%EC%98%A4%EB%AA%A9-%EB%B3%B4%EB%93%9C%EA%B2%8C%EC%9E%84-%EC%86%8C%EA%B0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저는 집에 보드게임이 100개 넘게 있을 정도로 보드게임을 좋아하는 프론트엔드 개발자입니다. 언제나 나만의 보드게임을 만들고 싶다는 꿈을 가지고 있었고, 일상 속에서 끊임없이 새로운 아이디어를 고민해 왔습니다.&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;Quantum Gomoku&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  중첩 상태 &amp;ndash; 측정 전까지 색이 확정되지 않는다!&lt;br /&gt;  얽힘 &amp;ndash; 하나가 변하면 연결된 다른 하나도 즉시 변화!&lt;br /&gt;⚡ 양자 도약 &amp;ndash; 내 돌을 순간이동시켜 예측할 수 없는 한 수!&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;Quantum Gomoku는 웹 브라우저에서 무료로 플레이할 수 있습니다.&lt;br /&gt;  &lt;a href=&quot;https://quantum-gomoku.vercel.app&quot;&gt;Quantum Gomoku 플레이하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741321704371&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;Quantum Gomoku&quot; data-og-description=&quot;양자 역학의 원리를 활용한 전략 게임&quot; data-og-host=&quot;quantum-gomoku.vercel.app&quot; data-og-source-url=&quot;https://quantum-gomoku.vercel.app&quot; data-og-url=&quot;https://quantum-gomoku.vercel.app&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBoPJT/hyYmSCP3sz/txaUo2uqIV1fUmaOkTU2kk/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840,https://scrap.kakaocdn.net/dn/0ubt9/hyYmWSEQVp/ic4E3SwVGSgGQQNwAXKCe1/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840&quot;&gt;&lt;a href=&quot;https://quantum-gomoku.vercel.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://quantum-gomoku.vercel.app&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBoPJT/hyYmSCP3sz/txaUo2uqIV1fUmaOkTU2kk/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840,https://scrap.kakaocdn.net/dn/0ubt9/hyYmWSEQVp/ic4E3SwVGSgGQQNwAXKCe1/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840');&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;Quantum Gomoku&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;quantum-gomoku.vercel.app&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;br /&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 각자 5장의 카드를 가지고, 먼저 자신의 모든 카드를 뒤집는 사람이 승리하는 형태로 구상했습니다. 하지만 플레이 테스트를 진행하면서, 2D 보드를 활용하면 더욱 전략적인 게임이 될 것 같다는 생각이 들었습니다. 최종적으로 오목을 기반으로 한 새로운 방향으로 수정하게 되었고, 아내와 둘째 형님(처남)과 함께 테스트를 거치며 세부 규칙을 다듬어 나갔습니다. 게임을 제작하는 과정에서 많은 도움을 주신 분들께 감사드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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/bowDkq/btsMCmppaqD/v3v8Zxf7hM9TULUSx8cEK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bowDkq/btsMCmppaqD/v3v8Zxf7hM9TULUSx8cEK1/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_4705.jpg&quot; style=&quot;width: 23.6309%; margin-right: 10px;&quot; data-widthpercent=&quot;24.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bowDkq/btsMCmppaqD/v3v8Zxf7hM9TULUSx8cEK1/img.jpg&quot; alt=&quot;프로토타입&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbowDkq%2FbtsMCmppaqD%2Fv3v8Zxf7hM9TULUSx8cEK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRICAS/btsMC3o9vAs/qaUhrCkIOH6ezAdykH412k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRICAS/btsMC3o9vAs/qaUhrCkIOH6ezAdykH412k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1890&quot; data-filename=&quot;스크린샷 2025-03-06 오전 10.03.32.png&quot; style=&quot;width: 50.4126%; margin-right: 10px;&quot; data-widthpercent=&quot;51.61&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRICAS/btsMC3o9vAs/qaUhrCkIOH6ezAdykH412k/img.png&quot; alt=&quot;완성된 사이트&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRICAS%2FbtsMC3o9vAs%2FqaUhrCkIOH6ezAdykH412k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;1890&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nhCX3/btsMC3o9u3T/AgFKyghqnNLOIW6TI2oXl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nhCX3/btsMC3o9u3T/AgFKyghqnNLOIW6TI2oXl0/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; data-filename=&quot;KakaoTalk_Photo_2025-03-06-10-08-46.jpeg&quot; style=&quot;width: 23.6309%;&quot; data-widthpercent=&quot;24.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nhCX3/btsMC3o9u3T/AgFKyghqnNLOIW6TI2oXl0/img.jpg&quot; alt=&quot;나의 보드게임 책장&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnhCX3%2FbtsMC3o9u3T%2FAgFKyghqnNLOIW6TI2oXl0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&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;AI&amp;nbsp;기술&amp;nbsp;덕분에&amp;nbsp;웹&amp;nbsp;프로토타입&amp;nbsp;제작이&amp;nbsp;훨씬&amp;nbsp;쉬워졌습니다.&amp;nbsp;게임을&amp;nbsp;만들어보고&amp;nbsp;싶은&amp;nbsp;분들에게&amp;nbsp;GPT나&amp;nbsp;Claude를&amp;nbsp;사용해서&amp;nbsp;빠르게&amp;nbsp;프로토타입을&amp;nbsp;만들어보는&amp;nbsp;것을&amp;nbsp;적극&amp;nbsp;추천합니다.&amp;nbsp;앞으로&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;플레이어가&amp;nbsp;참여한다면&amp;nbsp;온라인&amp;nbsp;멀티플레이&amp;nbsp;기능을&amp;nbsp;추가하고,&amp;nbsp;실제&amp;nbsp;보드게임으로도&amp;nbsp;제작해&amp;nbsp;보고&amp;nbsp;싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 어떤 주제로 게임을 만들어보면 좋을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재미있게 즐겨주시고, 여러분의 의견을 들려주세요!  &amp;zwj;♂&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>보드게임</category>
      <category>양자역학</category>
      <category>오목</category>
      <category>프로젝트</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/7</guid>
      <comments>https://shinejung.tistory.com/entry/Quantum-Gomoku%EC%96%91%EC%9E%90-%EC%98%A4%EB%AA%A9-%EB%B3%B4%EB%93%9C%EA%B2%8C%EC%9E%84-%EC%86%8C%EA%B0%9C#entry7comment</comments>
      <pubDate>Fri, 7 Mar 2025 18:00:37 +0900</pubDate>
    </item>
    <item>
      <title>React Native BLE에서 MTU 설정으로 데이터 전송량 늘리기 (Android)</title>
      <link>https://shinejung.tistory.com/entry/React-Native-BLE%EC%97%90%EC%84%9C-MTU-%EC%84%A4%EC%A0%95%EC%9C%BC%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1%EB%9F%89-%EB%8A%98%EB%A6%AC%EA%B8%B0-Android</link>
      <description>&lt;p&gt;BLE(Bluetooth Low Energy) 통신을 통해 데이터를 전송하는 과정에서, Android에서는 한 번에 20바이트까지만 전송되는 것을 확인했습니다. (20바이트를 초과하면 패킷이 자동으로 나뉘어 전송됩니다.)&lt;/p&gt;
&lt;p&gt;라이브러리 문서를 찾아보면서 MTU(Maximum Transmission Unit) 설정을 통해 데이터 전송량을 늘릴 수 있다는 것을 알게 되었습니다. 이 글에서는 React Native에서 MTU 크기를 설정하는 방법을 설명해 보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;MTU란?&lt;/h2&gt;
&lt;p&gt;MTU(Maximum Transmission Unit)는 한 번에 전송할 수 있는 최대 바이트 크기를 의미합니다. BLE의 기본 MTU는 23바이트이지만, 이 중 3바이트는 헤더로 사용되므로 실제 데이터는 20바이트까지만 전송할 수 있습니다.&lt;/p&gt;
&lt;p&gt;패킷을 여러 번 나눠 보내기보다 MTU 크기를 조정해 한 번에 더 많은 데이터를 전송하면 헤더 바이트를 아낄 수 있고 전송 속도도 높일 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Android와 iOS의 MTU 차이&lt;/h2&gt;
&lt;p&gt;Android에서는 MTU 크기를 요청할 수 있지만 요청한 크기보다 작은 값이 설정될 수도 있습니다. iOS에서는 자동으로 MTU 크기가 조정됩니다. iOS에서의 MTU 최대값은 187바이트입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;MTU 요청하기 (Android)&lt;/h2&gt;
&lt;p&gt;React Native에서 BLE를 다루는 대표적인 라이브러리는 &lt;code&gt;react-native-ble-manager&lt;/code&gt;와 &lt;code&gt;react-native-ble-plx&lt;/code&gt;가 있습니다. 두 라이브러리에서 MTU를 요청하는 방법을 살펴보겠습니다.&lt;/p&gt;
&lt;h3&gt;1. react-native-ble-manager&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;react-native-ble-manager&lt;/code&gt;에서는 &lt;code&gt;requestMTU&lt;/code&gt; 메서드를 사용해서 MTU를 요청할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import BleManager from &amp;quot;react-native-ble-manager&amp;quot;;

await BleManager.connect(deviceId);

const mtu = await BleManager.requestMTU(deviceId, 512);
console.log(`변경된 MTU: ${mtu}`);

const services = await BleManager.retrieveServices(deviceId);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;데이터를 전송할 때 &lt;code&gt;write&lt;/code&gt; 또는 &lt;code&gt;writeWithoutResponse&lt;/code&gt; 메서드를 사용하면, 다섯 번째 인자로 &lt;code&gt;maxByteSize&lt;/code&gt;를 지정할 수 있습니다. &lt;code&gt;maxByteSize&lt;/code&gt;를 지정하지 않으면 기본값인 20바이트로 설정되어 데이터가 나누어 전송됩니다. 따라서 한 번에 더 긴 데이터를 보내려면 &lt;code&gt;maxByteSize&lt;/code&gt;를 설정해야 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;await BleManager.write(deviceId, serviceUUID, characteristicUUID, data, 512);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. react-native-ble-plx&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;react-native-ble-plx&lt;/code&gt;에서는 &lt;code&gt;connectToDevice&lt;/code&gt; 메서드의 &lt;code&gt;requestMTU&lt;/code&gt; 옵션을 사용해서 MTU를 요청할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { BleManager } from &amp;quot;react-native-ble-plx&amp;quot;;

const manager = new BleManager();

const device = await manager.connectToDevice(deviceId, {
  requestMTU: 512,
});
console.log(`변경된 MTU: ${device.mtu}`);

// 다른 MTU로 요청하고 싶다면
await device.requestMTU(23);
console.log(`다시 변경된 MTU: ${device.mtu}`);&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;주의점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MTU 크기는 요청한 값보다 작을 수 있기 때문에 실제로 변경된 MTU 크기를 확인해야 합니다.&lt;/li&gt;
&lt;li&gt;모든 BLE 장치가 큰 MTU 크기를 지원하는 것은 아닙니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://innoveit.github.io/react-native-ble-manager/&quot;&gt;react-native-ble-manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/innoveit/react-native-ble-manager/issues/736#issuecomment-1655288597&quot;&gt;react-native-ble-manager issue #736&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dotintent/react-native-ble-plx&quot;&gt;react-native-ble-plx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dotintent/react-native-ble-plx/wiki/MTU-Negotiation&quot;&gt;react-native-ble-plx MTU Negotiation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;추가 정보나 궁금한 점이 있다면 댓글로 남겨주세요!&lt;/p&gt;</description>
      <category>MOBILE APP</category>
      <category>Android</category>
      <category>ble</category>
      <category>bluetooth</category>
      <category>React Native</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/6</guid>
      <comments>https://shinejung.tistory.com/entry/React-Native-BLE%EC%97%90%EC%84%9C-MTU-%EC%84%A4%EC%A0%95%EC%9C%BC%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1%EB%9F%89-%EB%8A%98%EB%A6%AC%EA%B8%B0-Android#entry6comment</comments>
      <pubDate>Fri, 14 Feb 2025 18:00:40 +0900</pubDate>
    </item>
    <item>
      <title>WWDC24 Swift Student Challenge 위너 선정 후기</title>
      <link>https://shinejung.tistory.com/entry/WWDC24-Swift-Student-Challenge-%EC%9C%84%EB%84%88-%EC%84%A0%EC%A0%95-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘부터 2025 Swift Student Challenge(스스챌) 제출이 시작되었습니다! 스스챌을 준비하는 분들을 위해 작년의 경험을 되살려 이 글을 작성했습니다. 저의 경험이 작게나마 도움이 되길 바랍니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Swift Student Challenge란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift Student Challenge는 애플이 매년 전 세계 학생들을 대상으로 개최하는 공모전입니다. 350명 안에 들면 애플 굿즈와 상장 등 다양한 혜택을 받을 수 있고, 그중에서도 50명의 우수 수상자로 선정된다면 WWDC에 초대되어 2박 3일 동안 Apple 엔지니어들과 함께 잊지 못할 경험을 쌓을 수 있다고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGDu8k/btsL5PYTvw3/vXG9DE365Cj5oQKdejAg30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGDu8k/btsL5PYTvw3/vXG9DE365Cj5oQKdejAg30/img.png&quot; data-alt=&quot;비용 부담 없이 쿠퍼티노를 다녀올 수 있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGDu8k/btsL5PYTvw3/vXG9DE365Cj5oQKdejAg30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGDu8k%2FbtsL5PYTvw3%2FvXG9DE365Cj5oQKdejAg30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;831&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;831&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;br /&gt;  &lt;a href=&quot;https://developer.apple.com/kr/swift-student-challenge/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;2025 Swift Student Challenge 참가하기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Swift Student Challenge&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Swift Student Challenge에 앱 플레이그라운드를 제출하여 코딩을 향한 열정을 보여 주세요.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/kr/swift-student-challenge/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eSr4w/hyX7UOxGg3/j12BeQww9wpmhGvMkQvDw0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/M3zxe/hyYcjePKWy/VPPD0VKPYS3GxkPLBtW9M0/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/ns3aN/hyYcjlBGYp/zIO4gkr35Ban9FV9US68Hk/img.png?width=950&amp;amp;height=950&amp;amp;face=0_0_950_950&quot; data-og-url=&quot;https://developer.apple.com/kr/swift-student-challenge/&quot;&gt;&lt;a href=&quot;https://developer.apple.com/kr/swift-student-challenge/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/kr/swift-student-challenge/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eSr4w/hyX7UOxGg3/j12BeQww9wpmhGvMkQvDw0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/M3zxe/hyYcjePKWy/VPPD0VKPYS3GxkPLBtW9M0/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/ns3aN/hyYcjlBGYp/zIO4gkr35Ban9FV9US68Hk/img.png?width=950&amp;amp;height=950&amp;amp;face=0_0_950_950');&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;Swift Student Challenge&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Swift Student Challenge에 앱 플레이그라운드를 제출하여 코딩을 향한 열정을 보여 주세요.&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;br /&gt;저는 2023년도에 처음 스스챌에 지원했지만 아쉽게도 수상까지는 이어지지 못했습니다. 카드 게임을 앱에서도 즐길 수 있게 개발했었는데, 심사위원들에게 인상을 남길만한 콘텐츠는 아니었던 것 같습니다.&lt;br /&gt;그리고 다음 해인 2024년도에 스스챌에 다시 지원하게 되었습니다. 대학 졸업 전 마지막으로 참여할 수 있는 기회였고, 애플에서 주는 한정판 굿즈도 꼭 받고 싶어서 수상하고자 하는 의지가 더 강해졌습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과물&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 만든 결과물은 'Real Craft'입니다. 이 앱은 증강현실(AR)에서 건축 블록을 쌓아 가상 건축물을 만들 수 있는 앱입니다. 저는 어릴 적부터 레고를 좋아했고, 중학생 때는 마인크래프트에서 커맨드 블록으로 코딩을 시작할 정도로 블록 건축에 관심이 많았습니다. 그래서 현실 세계 위에 내가 원하는 대로 건축물을 만들 수 있다면 정말 재미있겠다는 생각이 들었고, 스스챌의 주제로 가져가기로 결정했습니다.&lt;br /&gt;앱은 ARKit을 활용해 사용자가 실제 환경 위에 가상 건축물을 배치할 수 있도록 했고, RealityKit을 사용해 여러 색상의 3D 블록을 구현했습니다. 나중에는 비전 프로에서도 사용할 수 있도록 개발해서 더 몰입감 있고 재미있는 앱으로 발전시키고 싶습니다.&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/v4mtT/btsL5six8Ed/Ml829h1OxVpk8VNbjeeFLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v4mtT/btsL5six8Ed/Ml829h1OxVpk8VNbjeeFLk/img.png&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1170&quot; style=&quot;width: 81.4465%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v4mtT/btsL5six8Ed/Ml829h1OxVpk8VNbjeeFLk/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv4mtT%2FbtsL5six8Ed%2FMl829h1OxVpk8VNbjeeFLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2532&quot; height=&quot;1170&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b580HF/btsL6Lak8bh/11Hwqj0DcH7p7z8mI7ARD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b580HF/btsL6Lak8bh/11Hwqj0DcH7p7z8mI7ARD0/img.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; style=&quot;width: 17.3907%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b580HF/btsL6Lak8bh/11Hwqj0DcH7p7z8mI7ARD0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb580HF%2FbtsL6Lak8bh%2F11Hwqj0DcH7p7z8mI7ARD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 과정은 순조롭지 않았습니다. ARKit을 처음 접해서 3D 공간에서 좌표 처리를 이해하는 데 시간이 걸렸고, 내가 원하는 기능이 상상할 때는 간단해 보였지만 코드로 구현하려니 꽤나 복잡하다는 것을 알 수 있었습니다.&lt;br /&gt;결국에는 공중에 떠 있는 블록을 설치하거나, 꾹 눌러서 블록을 제거하는 기능은 완성하지 못했습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;몇 가지 팁&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조언&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역대 스스챌 수상작을 볼 수 있는 사이트들이 있습니다. 주제 선정이 막막하다면 다른 사람들은 어떤 주제로 앱을 만들었는지 구경해 보세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wwdcscholars.com/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;WWDC Scholars&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wwdc&quot; target=&quot;_self&quot;&gt;&lt;span&gt;GitHub WWDC&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wwdc-kr/Submissions&quot; target=&quot;_self&quot;&gt;&lt;span&gt;WWDC-KR Submissions&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;화려하고 완벽한 디자인이 아니어도 수상할 수 있습니다.&lt;/b&gt;&lt;br /&gt;투박하더라도 직접 그림을 그리고, 나만의 테마를 만든다면 좋은 점수를 받을 가능성이 높습니다.&lt;br /&gt;오히려 투박하지만 개성 있는 앱이 &quot;학생 챌린지&quot;에서 더 어울리는 결과물이라고 생각합니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;b&gt;끝까지 완성하세요.&lt;/b&gt;&lt;br /&gt;위너가 되든 안 되든, 나만의 앱을 만든다는 것 자체가 값진 경험입니다.&lt;br /&gt;개발을 통해 얻은 배움과 성장이 분명 크게 남을 것입니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제출에 관해서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;제출물 형식&lt;/b&gt;&lt;br /&gt;Swift Student Challenge에서는 iOS 앱이 아닌 &lt;b&gt;앱 플레이그라운드(.swiftpm) 형식&lt;/b&gt;으로 제출해야 합니다.&lt;br /&gt;앱을 다 완성한 후에 확장자를 바꾸기는 어렵기 때문에 처음부터 &lt;b&gt;플레이그라운드 프로젝트&lt;/b&gt;로 생성하세요.&lt;br /&gt;Xcode에서도 플레이그라운드 프로젝트 작업을 할 수 있습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;✅ &lt;b&gt;인터넷 연결이 없는 앱이어야 합니다.&lt;/b&gt;&lt;br /&gt;API를 활용하는 앱은 제출할 수 없으므로 주제 선정 시 참고하세요.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;✅ &lt;b&gt;타임어택 금지&lt;/b&gt;&lt;br /&gt;지원 폼에 써야 할 내용이 많고, 서버 문제가 발생할 수도 있습니다. &lt;b&gt;적어도 3시간 전에는 제출을 시작하세요.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;✅ &lt;b&gt;스크린샷 3장 첨부 가능&lt;/b&gt;&lt;br /&gt;영상은 첨부할 수 없습니다. 앱의 기능을 잘 보여주는 3개의 화면을 골라서 제출하세요.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;✅ &lt;a href=&quot;https://developer.apple.com/kr/swift-student-challenge/eligibility/&quot; target=&quot;_self&quot;&gt;&lt;span&gt;&lt;b&gt;자격 요건과 요구사항&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;b&gt;을 꼭 읽어보세요.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;위너가 된 소감&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위너로 선정되었다는 메일을 받았을 때, 처음엔 믿기지 않았고 새벽 5시에 자고 있던 아내를 깨울 정도로 기뻤습니다. 사실 작품을 끝까지 완성하지 못했고 여러 방면에서 부족한 점이 많다고 생각했는데도 선정을 해 주셔서 더욱 감사한 마음이 들었습니다.&lt;br /&gt;게다가, 2023년에는 상품이 에어팟 프로였던 것에 비해 2024년에는 에어팟 맥스  를 받아서 한 번 더 놀랐습니다. 조금이나마 집안 경제에 도움이 되어 기쁩니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;올해 상품은 무엇이 나올지 궁금하네요. 지금 시작해도 늦지 않았으니 스위프트를 몰라도 AI의 도움을 받아 도전해 보셨으면 좋겠습니다! 저에게 문의해 주셔도 아낌없는 조언과 도움을 드리겠습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  수상 상품&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Apple 공식 수상 인증서&lt;/li&gt;
&lt;li&gt;애플 개발자 프로그램 1년 무료 이용권&lt;/li&gt;
&lt;li&gt;App Development with Swift 인증 시험 응시 코드 제공&lt;/li&gt;
&lt;li&gt;AirPods Max&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgjKIO/btsL4YCha0j/w7kj7Wn33MjCXfPJpgR0L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgjKIO/btsL4YCha0j/w7kj7Wn33MjCXfPJpgR0L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgjKIO/btsL4YCha0j/w7kj7Wn33MjCXfPJpgR0L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgjKIO%2FbtsL4YCha0j%2Fw7kj7Wn33MjCXfPJpgR0L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2040&quot; height=&quot;1860&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3023&quot; data-origin-height=&quot;2267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CwIxZ/btsL4HU4bnj/zuHTHjobignl0Yxgi5gftK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CwIxZ/btsL4HU4bnj/zuHTHjobignl0Yxgi5gftK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CwIxZ/btsL4HU4bnj/zuHTHjobignl0Yxgi5gftK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCwIxZ%2FbtsL4HU4bnj%2FzuHTHjobignl0Yxgi5gftK%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;3023&quot; height=&quot;2267&quot; data-origin-width=&quot;3023&quot; data-origin-height=&quot;2267&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;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스스챌 참여를 고민하는 분들은 기회가 있을 때 꼭 도전해 보시길 추천합니다!&lt;br /&gt;저는 작년에 학교를 졸업했고 직장에 다니기 시작했기 때문에 앞으로 참여할 기회가 없답니다.  &lt;br /&gt;&lt;i&gt;(졸업했더라도 정말 참여하고 싶다면 애플 아카데미에 들어가 기회를 얻는 방법도 있습니다.  )&lt;/i&gt;&lt;/p&gt;</description>
      <category>후기</category>
      <category>apple</category>
      <category>AR</category>
      <category>ios</category>
      <category>SWIFT</category>
      <category>swift student challenge</category>
      <category>WWDC</category>
      <category>스위프트 스튜던트 챌린지</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/5</guid>
      <comments>https://shinejung.tistory.com/entry/WWDC24-Swift-Student-Challenge-%EC%9C%84%EB%84%88-%EC%84%A0%EC%A0%95-%ED%9B%84%EA%B8%B0#entry5comment</comments>
      <pubDate>Mon, 3 Feb 2025 18:00:33 +0900</pubDate>
    </item>
    <item>
      <title>React Native에서 SSL 인증서 검증 우회하기 (Expo 포함)</title>
      <link>https://shinejung.tistory.com/entry/React-Native%EC%99%80-Expo%EC%97%90%EC%84%9C-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%AC%B4%EC%8B%9C%ED%95%98%EA%B3%A0-HTTPS-%EC%9A%94%EC%B2%AD%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;React Native 또는 Expo를 사용하여 HTTPS 요청을 보낼 때, 자체 서명된 인증서나 만료된 인증서로 인해 요청이 실패할 수 있습니다. 대표적으로 아래와 같은 오류 메시지가 발생할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Error: The certificate for this server is invalid. You might be connecting to a server that is pretending to be &amp;quot;[서버 주소]&amp;quot; which could put your confidential information at risk.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또한, axios를 사용할 경우 &lt;code&gt;Network Error&lt;/code&gt;가 발생할 수도 있습니다.&lt;/p&gt;
&lt;p&gt;이 글에서는 SSL 인증서 검증을 우회해서 HTTPS 요청을 보내는 방법을 설명하겠습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;주의: 이 방법은 보안상 위험하므로 개발 환경에서만 사용할 것을 권장합니다. 프로덕션 환경에서 사용하면 앱 스토어 심사에서 거부될 가능성이 큽니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;1. Expo 프로젝트인 경우 (React Native 프로젝트는 2번부터)&lt;/h2&gt;
&lt;p&gt;Expo 프로젝트에서는 먼저 Android 및 iOS 프로젝트 폴더를 생성해야 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx expo prebuild&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;2. Android에서 SSL 인증서 검증 우회하기&lt;/h2&gt;
&lt;p&gt;Android에서 SSL 인증서 검증을 우회하려면 &lt;code&gt;MainApplication.java&lt;/code&gt; 파일과 동일한 경로에 &lt;code&gt;IgnoreSSLFactory.java&lt;/code&gt; 파일을 생성해야 합니다.&lt;/p&gt;
&lt;h3&gt;2.1. IgnoreSSLFactory.java 파일 생성&lt;/h3&gt;
&lt;p&gt;아래 코드를 복사하고, 첫 줄의 패키지명을 &lt;strong&gt;앱의 패키지명&lt;/strong&gt;으로 변경해주세요.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.yourapp; // 패키지명을 수정하세요

import com.facebook.react.modules.network.OkHttpClientFactory;
import com.facebook.react.modules.network.OkHttpClientProvider;
import com.facebook.react.modules.network.ReactCookieJarContainer;
import java.security.cert.CertificateException;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;

public class IgnoreSSLFactory implements OkHttpClientFactory {
    @Override
    public OkHttpClient createNewNetworkModuleClient() {
        try {
            final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
            };

            SSLContext sslContext = SSLContext.getInstance(&amp;quot;SSL&amp;quot;);
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(0, TimeUnit.MILLISECONDS)
                .readTimeout(0, TimeUnit.MILLISECONDS)
                .writeTimeout(0, TimeUnit.MILLISECONDS)
                .cookieJar(new ReactCookieJarContainer());

            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier((hostname, session) -&amp;gt; true);

            return builder.build();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2. &lt;code&gt;MainApplication.java&lt;/code&gt; 파일 수정&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;import&lt;/code&gt;문을 추가하고, &lt;code&gt;onCreate&lt;/code&gt; 메서드 내에 &lt;code&gt;OkHttpClientProvider.setOkHttpClientFactory(new IgnoreSSLFactory());&lt;/code&gt;를 추가합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.facebook.react.modules.network.OkHttpClientProvider; // 추가

@Override
public void onCreate() {
  super.onCreate();
  SoLoader.init(this, /* native exopackage */ false);
  OkHttpClientProvider.setOkHttpClientFactory(new IgnoreSSLFactory()); // 추가
  initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3. 코틀린 프로젝트인 경우 &lt;code&gt;MainApplication.kt&lt;/code&gt; 파일 수정&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;import com.facebook.react.modules.network.OkHttpClientProvider // 추가

override fun onCreate() {
  super.onCreate()
  SoLoader.init(this, false)
  OkHttpClientProvider.setOkHttpClientFactory(IgnoreSSLFactory()) // 추가
  ApplicationLifecycleDispatcher.onApplicationCreate(this)
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;3. iOS에서 SSL 인증서 검증 우회하기&lt;/h2&gt;
&lt;p&gt;iOS에서 SSL 인증서 검증을 우회하려면 &lt;code&gt;Info.plist&lt;/code&gt; 파일에 아래 내용을 추가하세요.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;key&amp;gt;NSAppTransportSecurity&amp;lt;/key&amp;gt;
&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;NSAllowsArbitraryLoads&amp;lt;/key&amp;gt;
  &amp;lt;true/&amp;gt;
&amp;lt;/dict&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그다음, Xcode에서 프로젝트를 열고 &lt;code&gt;RCTHTTPRequestHandler.m&lt;/code&gt; 파일을 수정해야 합니다.&lt;/p&gt;
&lt;p&gt;파일 위치: &lt;strong&gt;Pods/Development Pods/React-RCTNetwork&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;3.1. &lt;code&gt;NSURLSession&lt;/code&gt; 델리게이트 함수 추가&lt;/h3&gt;
&lt;p&gt;아래 함수를 &lt;code&gt;#pragma mark - NSURLSession delegate&lt;/code&gt; 주석 아래에 추가하세요.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-objectivec&quot;&gt;#pragma mark - NSURLSession delegate

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
  completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@rushitjivani/how-to-ignore-ssl-for-react-native-android-ios-4942e10ea667&quot;&gt;How to Ignore SSL for React Native (Android/iOS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/36603666/26289222&quot;&gt;Stack Overflow 답변&lt;/a&gt; (iOS 해결 방법 참고)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;위 방법으로 해결되지 않거나 궁금한 점이 있다면 댓글로 남겨주세요!&lt;/p&gt;</description>
      <category>MOBILE APP</category>
      <category>Android</category>
      <category>expo</category>
      <category>https</category>
      <category>ios</category>
      <category>React Native</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/4</guid>
      <comments>https://shinejung.tistory.com/entry/React-Native%EC%99%80-Expo%EC%97%90%EC%84%9C-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%AC%B4%EC%8B%9C%ED%95%98%EA%B3%A0-HTTPS-%EC%9A%94%EC%B2%AD%ED%95%98%EA%B8%B0#entry4comment</comments>
      <pubDate>Fri, 31 Jan 2025 18:00:55 +0900</pubDate>
    </item>
    <item>
      <title>React Native에서 로컬 서버에 접속하기 (Expo 포함)</title>
      <link>https://shinejung.tistory.com/entry/React-Native%EC%99%80-Expo%EC%97%90%EC%84%9C-%EB%A1%9C%EC%BB%AC-%EC%84%9C%EB%B2%84%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;React Native 또는 Expo를 사용하여 애플리케이션을 개발할 때, 개발 중인 컴퓨터에서 실행 중인 서버에 접속해야 할 때가 있습니다. 이 글에서는 시뮬레이터나 실제 기기에서 로컬 서버에 접속하는 방법을 설명해 보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. 로컬 서버 실행 확인&lt;/h2&gt;
&lt;p&gt;먼저, 개발 중인 컴퓨터에서 서버가 잘 실행되고 있어야 합니다. 컴퓨터의 브라우저에서 &lt;code&gt;http://localhost:3000&lt;/code&gt; 같은 주소로 접속해서 서버가 정상적으로 작동하는지 확인해 보세요.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. IP 주소 알아내기&lt;/h2&gt;
&lt;p&gt;시뮬레이터나 기기가 로컬 서버에 접근하려면 개발 중인 컴퓨터의 IP 주소를 알아야 합니다.&lt;br&gt;아래 방법을 참고해 주세요.&lt;/p&gt;
&lt;h3&gt;Windows&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;  1. 명령 프롬프트(cmd)를 엽니다.
  2. `ipconfig` 명령을 입력하고 Enter를 누릅니다.
  3. `IPv4 Address` 항목에서 IP 주소를 확인합니다.&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Mac/Linux&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;  1. 터미널을 엽니다.
  2. `ifconfig | grep inet` 또는 `ip addr` 명령을 실행합니다.
  3. 네트워크 연결(Wi-Fi 등)의 IP 주소를 확인합니다.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;192.168.1.10&lt;/code&gt; 같은 형식의 주소를 복사해 두세요.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3. 서버 주소 설정하기&lt;/h2&gt;
&lt;p&gt;앱 코드에서 서버 주소를 설정해야 합니다. IP 주소와 서버의 포트를 서버 URL로 사용하세요.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const SERVER_URL = &amp;quot;http://192.168.1.10:3000&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;네트워크 요청을 보낼 때 이 URL을 사용하면 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// fetch를 사용하는 예시
fetch(`${SERVER_URL}/api/data`)
  .then((response) =&amp;gt; response.json())
  .then((data) =&amp;gt; console.log(data))
  .catch((error) =&amp;gt; console.error(&amp;quot;Error:&amp;quot;, error));&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;4. 시뮬레이터에서 테스트할 때&lt;/h2&gt;
&lt;h3&gt;iOS 시뮬레이터&lt;/h3&gt;
&lt;p&gt;iOS 시뮬레이터는 &lt;code&gt;http://localhost&lt;/code&gt;를 사용해도 됩니다.&lt;/p&gt;
&lt;p&gt;하지만 실제 iOS 기기에서는 개발 중인 컴퓨터의 IP 주소를 사용해야 합니다.&lt;/p&gt;
&lt;h3&gt;Android 에뮬레이터&lt;/h3&gt;
&lt;p&gt;Android 에뮬레이터는 특별한 주소인 &lt;code&gt;http://10.0.2.2&lt;/code&gt;를 사용하여 개발 중인 컴퓨터의 &lt;code&gt;localhost&lt;/code&gt;에 접속할 수 있습니다. 자세한 내용은 &lt;a href=&quot;https://developer.android.com/studio/run/emulator-networking&quot;&gt;Android Developers - Emulator Networking&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;Android도 마찬가지로 실제 Android 기기에서는 개발 중인 컴퓨터의 IP 주소를 사용해야 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. 자주 발생하는 문제&lt;/h2&gt;
&lt;h3&gt;같은 네트워크에 연결되어 있지 않는 경우&lt;/h3&gt;
&lt;p&gt;개발 중인 컴퓨터와 기기가 같은 Wi-Fi 네트워크에 연결되어 있어야 합니다.&lt;/p&gt;
&lt;h3&gt;CORS(Cross-Origin Resource Sharing) 오류&lt;/h3&gt;
&lt;p&gt;서버가 외부 요청을 허용하지 않을 경우 CORS 오류가 발생할 수 있습니다. 개발 중에는 아래와 같이 모든 요청을 허용하도록 설정하면 편리합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const cors = require(&amp;quot;cors&amp;quot;);
app.use(cors());&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Windows 방화벽 문제&lt;/h3&gt;
&lt;p&gt;방화벽이 있다면 연결이 차단될 수 있습니다. 방화벽에서 예외 규칙을 추가해 주세요.&lt;/p&gt;
&lt;p&gt;참고 문서: &lt;a href=&quot;https://support.microsoft.com/ko-kr/help/4028544/windows-10-turn-windows-defender-firewall-on-or-off&quot;&gt;Windows 방화벽 예외 추가하기&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;질문이나 추가 정보가 있으면 댓글로 남겨주세요!&lt;/p&gt;</description>
      <category>MOBILE APP</category>
      <category>Android</category>
      <category>expo</category>
      <category>ios</category>
      <category>React Native</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/3</guid>
      <comments>https://shinejung.tistory.com/entry/React-Native%EC%99%80-Expo%EC%97%90%EC%84%9C-%EB%A1%9C%EC%BB%AC-%EC%84%9C%EB%B2%84%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0#entry3comment</comments>
      <pubDate>Fri, 24 Jan 2025 18:00:58 +0900</pubDate>
    </item>
    <item>
      <title>Expo에서 pod install 오류: &amp;quot;cannot load such file -- ./scripts/autolinking&amp;quot; 해결 방법</title>
      <link>https://shinejung.tistory.com/entry/Expo%EC%97%90%EC%84%9C-pod-install-%EC%98%A4%EB%A5%98-cannot-load-such-file-scriptsautolinking-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;Expo로 iOS 빌드를 준비하거나 &lt;code&gt;expo prebuild&lt;/code&gt;를 실행할 때, &lt;code&gt;pod install&lt;/code&gt; 과정에서 아래와 같은 오류가 발생할 수 있습니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[!] Invalid `Podfile` file: cannot load such file -- ./scripts/autolinking.

#  from [프로젝트 디렉토리]/ios/Podfile:1
#  -------------------------------------------
&amp;gt;  require File.join(File.dirname(`node --print &amp;quot;require.resolve(&amp;#39;expo/package.json&amp;#39;)&amp;quot;`), &amp;quot;scripts/autolinking&amp;quot;)
#  require File.join(File.dirname(`node --print &amp;quot;require.resolve(&amp;#39;react-native/package.json&amp;#39;)&amp;quot;`), &amp;quot;scripts/react_native_pods&amp;quot;)
#  -------------------------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저는 &lt;a href=&quot;https://github.com/expo/expo/issues/15865&quot;&gt;Expo GitHub 이슈&lt;/a&gt;의 &lt;a href=&quot;https://github.com/expo/expo/issues/15865#issuecomment-2024048553&quot;&gt;한 코멘트&lt;/a&gt;를 통해 문제를 해결할 수 있었습니다. 이 문제의 원인과 해결 방법을 정리해 보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;오류 원인&lt;/h2&gt;
&lt;p&gt;이 오류는 &lt;strong&gt;CocoaPods 버전이 오래되어 Podfile과 호환되지 않기 때문&lt;/strong&gt;에 발생합니다. Expo의 최신 프로젝트에서는 최신 CocoaPods 버전을 요구하기 때문에, 오래된 버전을 사용하는 경우 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;h3&gt;1. CocoaPods 최신 버전으로 업데이트&lt;/h3&gt;
&lt;p&gt;CocoaPods를 최신 버전으로 업데이트하세요. 업데이트 방법은 사용 중인 설치 방법에 따라 다릅니다.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Ruby Gems를 사용하는 경우&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;gem install cocoapods&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;Homebrew를 사용하는 경우&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install cocoapods&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;이미 설치된 경우 덮어씌우기&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew link --overwrite cocoapods&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. CocoaPods 버전 확인&lt;/h3&gt;
&lt;p&gt;업데이트가 완료되면 아래 명령어로 현재 CocoaPods 버전을 확인해 보세요:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pod --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;최신 버전이라면 다음 단계로 넘어갑니다.&lt;/p&gt;
&lt;h3&gt;3. &lt;code&gt;pod install&lt;/code&gt; 다시 실행&lt;/h3&gt;
&lt;p&gt;CocoaPods를 업데이트한 후, iOS 디렉토리에서 &lt;code&gt;pod install&lt;/code&gt;을 다시 실행하거나 &lt;code&gt;expo prebuild&lt;/code&gt; 명령어를 재시도해 보세요. 오류가 해결되었다면 빌드가 정상적으로 진행될 것입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;그래도 안 될 때는?&lt;/h2&gt;
&lt;p&gt;만약 위 방법으로도 문제가 해결되지 않는다면, 다음 단계를 시도해 보세요:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;node_modules&lt;/code&gt;와 &lt;code&gt;ios/&lt;/code&gt; 디렉토리 삭제&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rm -rf node_modules ios&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;다시 설치 및 설정&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install
expo prebuild&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이후 &lt;code&gt;pod install&lt;/code&gt;을 실행하세요.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;끝으로&lt;/h2&gt;
&lt;p&gt;다른 문제가 있거나, 궁금한 점이 있다면 댓글로 남겨주세요!&lt;/p&gt;</description>
      <category>MOBILE APP</category>
      <category>expo</category>
      <category>ios</category>
      <category>React Native</category>
      <category>오류 해결</category>
      <author>shinejung</author>
      <guid isPermaLink="true">https://shinejung.tistory.com/2</guid>
      <comments>https://shinejung.tistory.com/entry/Expo%EC%97%90%EC%84%9C-pod-install-%EC%98%A4%EB%A5%98-cannot-load-such-file-scriptsautolinking-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry2comment</comments>
      <pubDate>Thu, 23 Jan 2025 18:00:45 +0900</pubDate>
    </item>
  </channel>
</rss>