<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Thor의 개발자 성장 일기</title>
    <link>https://yeomir.tistory.com/</link>
    <description>꾸준히 공부해가는 개발자</description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 06:44:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Thor_yeom</managingEditor>
    <image>
      <title>Thor의 개발자 성장 일기</title>
      <url>https://tistory1.daumcdn.net/tistory/5517712/attach/cccc7c91e6284ea3816a7726109b83be</url>
      <link>https://yeomir.tistory.com</link>
    </image>
    <item>
      <title>iOS Background Task 적용 ( 백그라운드에서 API 호출하기 )</title>
      <link>https://yeomir.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요!&amp;nbsp;&lt;br /&gt;오늘은 Background에서 API 호출 및 앱 갱신을 통해 사용자에게 지속적인 데이터를&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 예제를 통해 브레이크 포인트를 사용해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 구성되어 있는지 확인해보는 것도 좋을 거 같습니다. 아래는 공식문서에 있는 예제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/refreshing-and-maintaining-your-app-using-background-tasks&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/backgroundtasks/refreshing-and-maintaining-your-app-using-background-tasks&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721271025971&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;Refreshing and Maintaining Your App Using Background Tasks | Apple Developer Documentation&quot; data-og-description=&quot;Use scheduled background tasks for refreshing your app content and for performing maintenance.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/backgroundtasks/refreshing-and-maintaining-your-app-using-background-tasks&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/backgroundtasks/refreshing-and-maintaining-your-app-using-background-tasks&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JoT4d/hyWCKeaAP4/UuQJFtpHYGjQaLCkbD399k/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c7IPyX/hyWCNaT6R9/7RntGOAdq6ub32KnxdJZ31/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/refreshing-and-maintaining-your-app-using-background-tasks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/backgroundtasks/refreshing-and-maintaining-your-app-using-background-tasks&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JoT4d/hyWCKeaAP4/UuQJFtpHYGjQaLCkbD399k/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c7IPyX/hyWCNaT6R9/7RntGOAdq6ub32KnxdJZ31/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Refreshing and Maintaining Your App Using Background Tasks | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use scheduled background tasks for refreshing your app content and for performing maintenance.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자. 그럼 본격적으로 시작하겠습니다. Background Task에는 &lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/bgapprefreshtask&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BGAppRefreshTask&lt;/a&gt;와 &lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/bgprocessingtask&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BGProcessingTask&lt;/a&gt;가 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;b&gt;BGAppRefreshTask&lt;/b&gt;와 &lt;b&gt;BGProcessingTask&lt;/b&gt; 모두 동일하게 백그라운드에서 작업을 처리 하긴 하지만&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;가장 큰 차이점은 &lt;b&gt;시간&lt;/b&gt;에 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;30초 정도 걸리는 작업은 &lt;b&gt;BGAppRefreshTask&lt;/b&gt;을 사용하고&amp;nbsp;&lt;br /&gt;그 이상 걸리는 작업( 대용량 파일 업로드/다운로드, 데이터베이스 유지관리, 백그라운드에서 실행 ) 할때 &lt;b&gt;BGProcessingTask&lt;/b&gt;를 실행합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;이번 포스팅에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;&lt;span data-v-2883a6a9=&quot;&quot;&gt;BGAppRefreshTask을 중점적으로 다루겠습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Background Task를 적용하면서 느낀점은 크게&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;등록&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스케쥴링&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;완료&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정을 거쳐서 Background에서 Task가 작동 된다는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;등록&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. background Mode 설정 및 Info.plist 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-18 오전 11.55.32.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0VtT1/btsICyghgZ9/DrYyptSWUAhxIoyuv3V5TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0VtT1/btsICyghgZ9/DrYyptSWUAhxIoyuv3V5TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0VtT1/btsICyghgZ9/DrYyptSWUAhxIoyuv3V5TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0VtT1%2FbtsICyghgZ9%2FDrYyptSWUAhxIoyuv3V5TK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;400&quot; data-filename=&quot;스크린샷 2024-07-18 오전 11.55.32.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-18 오전 11.56.41.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z9oUb/btsIDWfVc5b/Qrpz9WNChgXOlqrgNZFsI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z9oUb/btsIDWfVc5b/Qrpz9WNChgXOlqrgNZFsI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z9oUb/btsIDWfVc5b/Qrpz9WNChgXOlqrgNZFsI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ9oUb%2FbtsIDWfVc5b%2FQrpz9WNChgXOlqrgNZFsI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;147&quot; data-filename=&quot;스크린샷 2024-07-18 오전 11.56.41.png&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Info.plist에서 Source Code를 통해 추가해 줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대체적으로 item 0에는&amp;nbsp; &lt;span style=&quot;color: #006dd7;&quot;&gt;Bundle&lt;/span&gt;에 &lt;span style=&quot;color: #006dd7;&quot;&gt;.refresh&lt;/span&gt;를 붙이는 편임 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;( 하지만 예제이기 때문에 example.com으로 함 )&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721271534359&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;key&amp;gt;BGTaskSchedulerPermittedIdentifiers&amp;lt;/key&amp;gt;
	&amp;lt;array&amp;gt;
	&amp;lt;string&amp;gt;example.com&amp;lt;/string&amp;gt;
	&amp;lt;/array&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;AppDelegate&lt;/b&gt;에서 Baground Task를 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import와 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;앱이 시작 되었을때&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Background에서 Task가 호출될 수 있게 &lt;b&gt;등록(register)&lt;/b&gt;을 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-18 오후 12.03.09.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wv03I/btsIEwuifH6/U0sGDcKcnYip2nllTN2OR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wv03I/btsIEwuifH6/U0sGDcKcnYip2nllTN2OR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wv03I/btsIEwuifH6/U0sGDcKcnYip2nllTN2OR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwv03I%2FbtsIEwuifH6%2FU0sGDcKcnYip2nllTN2OR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1374&quot; height=&quot;596&quot; data-filename=&quot;스크린샷 2024-07-18 오후 12.03.09.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스케쥴링&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케쥴링은 언제 Background Task를 실행하는지를 스케쥴( 시간 )을 조정하는 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만!! Background Task가 실행하는 것은 &lt;span style=&quot;color: #ee2323;&quot;&gt;시스템에 의해 자동으로 실행 되기 때문에 사용자가 정할 순 없습니다. ( 애플 맘대루... )&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-18 오후 12.22.11.png&quot; data-origin-width=&quot;1692&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BTKaO/btsIENvZDn2/gDUFawM0XT86puTvuzmCK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BTKaO/btsIENvZDn2/gDUFawM0XT86puTvuzmCK0/img.png&quot; data-alt=&quot;공식문서 출처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BTKaO/btsIENvZDn2/gDUFawM0XT86puTvuzmCK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBTKaO%2FbtsIENvZDn2%2FgDUFawM0XT86puTvuzmCK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2024-07-18 오후 12.22.11.png&quot; data-origin-width=&quot;1692&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공식문서 출처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AppDelegate에 추가로 scheduleAppRefresh()를 만들어 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템에 의해 Background Task가 실행되면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;try 문에 submit 부분이 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-18 오후 12.23.46.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0gbbf/btsIDNDrAM7/kusG9ojGxNeFqTiicKqILk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0gbbf/btsIDNDrAM7/kusG9ojGxNeFqTiicKqILk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0gbbf/btsIDNDrAM7/kusG9ojGxNeFqTiicKqILk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0gbbf%2FbtsIDNDrAM7%2FkusG9ojGxNeFqTiicKqILk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;256&quot; data-filename=&quot;스크린샷 2024-07-18 오후 12.23.46.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;백그라운드에서 시스템에 의해서 &lt;b&gt;자동으로&lt;/b&gt; 실행된다면... &lt;br /&gt;언제 되는지 계속 기다려야 하나요?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;네니요.&lt;/b&gt; ( 그렇게 매정하진 않더라구요... &lt;span style=&quot;color: #9d9d9d;&quot;&gt;물론 debug 한정이지만...&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/starting-and-terminating-tasks-during-development&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/backgroundtasks/starting-and-terminating-tasks-during-development&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721701745237&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;Starting and Terminating Tasks During Development | Apple Developer Documentation&quot; data-og-description=&quot;Use the debugger during development to start tasks and to terminate them before completion.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/backgroundtasks/starting-and-terminating-tasks-during-development&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/backgroundtasks/starting-and-terminating-tasks-during-development&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cj7908/hyWCLSLY95/pK5zitRLsx5DKnRwuJUs90/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/iA4cE/hyWCEznxAp/NKye0VwUJmk8JL3M1RdzBK/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/starting-and-terminating-tasks-during-development&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/backgroundtasks/starting-and-terminating-tasks-during-development&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cj7908/hyWCLSLY95/pK5zitRLsx5DKnRwuJUs90/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/iA4cE/hyWCEznxAp/NKye0VwUJmk8JL3M1RdzBK/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Starting and Terminating Tasks During Development | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use the debugger during development to start tasks and to terminate them before completion.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서를 살펴볼게요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약해서 말씀드리면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Background Tasks가 실행 될때까지 &lt;span style=&quot;color: #ee2323;&quot;&gt;수 시간이&lt;/span&gt; 걸릴 수 있으니&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일찍이 Background Tasks를 실행 할 수 있게 하는&lt;span style=&quot;color: #ee2323;&quot;&gt; LLDB 명령어가 있다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;단, debug 상태일만 사용해라&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.24.55.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqZrP/btsIIYkUQKG/k3gGchXedyyhOGG3BIM8m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqZrP/btsIIYkUQKG/k3gGchXedyyhOGG3BIM8m1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqZrP/btsIIYkUQKG/k3gGchXedyyhOGG3BIM8m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlqZrP%2FbtsIIYkUQKG%2Fk3gGchXedyyhOGG3BIM8m1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.24.55.png&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서를 보면 해당 명령어가 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721701787237&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@&quot;Info.plist에 적은 item 0 Bundle.refresh&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 사용하는지는 실행을 하면서 보여드리겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실행&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접적으로 Task가 실행되어 작업이 진행되는 부분입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서에 보면 OperationQueue를 사용하여 비동적으로 실행 수 있게 해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왜 OperationQueue를 사용하여 &lt;br /&gt;비동기 작업을 했을까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 딥하게 들어가면 주제에서 벗어나기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 느꼈던 부분은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OperationQueue를 사용할때의 장점들 때문이라고 생각했습니다. 크게 3가지 정도 입니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작업을 취소하거나 중지할 수 있음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존성 관리로 인해 순서대로 작업 할 수 있음 ex) 1번 끝나면 2번 실행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 모니터링을 통한 관리&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;OperationQueue&lt;/span&gt;가 &lt;span style=&quot;color: #8a3db6;&quot;&gt;DispatchQueue&lt;/span&gt;보다 유연하게 작업 관리가 가능하구나&lt;/b&gt; 라고만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고 가시면 좋을거 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서에 있는 코드를 거의 그대로 가져왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.44.12.png&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;1052&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYpV6m/btsIJysI8U9/ulQWs5p7071qR78OtiJz2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYpV6m/btsIJysI8U9/ulQWs5p7071qR78OtiJz2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYpV6m/btsIJysI8U9/ulQWs5p7071qR78OtiJz2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYpV6m%2FbtsIJysI8U9%2FulQWs5p7071qR78OtiJz2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;633&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.44.12.png&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;1052&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 상태에서 반복적으로 실행하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scheduleAppRefresh()를 추가하여 Background Tasks가 실행할때마다&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행할 작업은&amp;nbsp;&lt;br /&gt;만들어 놓은 RefreshAppContentsOperation()를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721702978484&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let operation = RefreshAppContentsOperation()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RefreshAppContentsOperation 클래스를 간단히 살펴보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 백그라운드 실행 시간을 UserDefaults에 담아주고 저장하는 클래스 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721703056469&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Foundation

class RefreshAppContentsOperation: Operation {
    override func main() {
        if isCancelled {
            return
        }
        
        // 현재 날짜를 UserDefaults에 저장하는 작업을 수행
        let date = Date()
        // UserDefault를 사용하여 add 및 save 
        TaskModel.shared.addTaskDate(date)
        
        // 작업 완료 시 로그 출력
        print(&quot;Background task executed and date saved at \(date)&quot;)
    }
}

class TaskModel {
    static let shared = TaskModel()
    
    private let userdefaultsKey = &quot;TaskDates&quot;
    
    private init () { }
    
    func addTaskDate(_ date: Date) {
        var dates = fetchTaskDates()
        dates.append(date)
        saveTaskDates(dates)
    }
    
    func fetchTaskDates() -&amp;gt; [Date] {
        let dateArray = UserDefaults.standard.array(forKey: userdefaultsKey) as? [Date] ?? []
        print(&quot;백그라운드에서 쌓인 date : \(dateArray)&quot;)
        return dateArray
    }
    
    private func saveTaskDates(_ dates: [Date]) {
        UserDefaults.standard.setValue(dates, forKey: userdefaultsKey)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이렇게 되면 모든 준비가 끝났습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 진행 되는지 순서도로 표현하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백그라운드 상태 진입 -&amp;gt; 스케쥴 실행 -&amp;gt; 등록한 Background Task 실행 -&amp;gt; HandleAppRefresh 실행 ( 작업 ) -&amp;gt; 다음 Background Task 예약 -&amp;gt; 작업 비동기적으로 실행 -&amp;gt; 완료&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.52.54.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpkeIV/btsIHX1fmWz/jhlIK4lQ5aZRev7p6K9FB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpkeIV/btsIHX1fmWz/jhlIK4lQ5aZRev7p6K9FB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpkeIV/btsIHX1fmWz/jhlIK4lQ5aZRev7p6K9FB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpkeIV%2FbtsIHX1fmWz%2FjhlIK4lQ5aZRev7p6K9FB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;312&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.52.54.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.12.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGArOb/btsIKgZcSCv/hF4TVaoGD6VOQCWUhOle91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGArOb/btsIKgZcSCv/hF4TVaoGD6VOQCWUhOle91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGArOb/btsIKgZcSCv/hF4TVaoGD6VOQCWUhOle91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGArOb%2FbtsIKgZcSCv%2FhF4TVaoGD6VOQCWUhOle91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;476&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.12.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.24.png&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2y8Rs/btsIHK8YcBc/NiiO9ybBc7bKprsCL0hkeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2y8Rs/btsIHK8YcBc/NiiO9ybBc7bKprsCL0hkeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2y8Rs/btsIHK8YcBc/NiiO9ybBc7bKprsCL0hkeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2y8Rs%2FbtsIHK8YcBc%2FNiiO9ybBc7bKprsCL0hkeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1716&quot; height=&quot;290&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.24.png&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.37.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1028&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO8Tm1/btsIJd3rgVm/EuYkNZ69YMaTiKdgDcGum1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO8Tm1/btsIJd3rgVm/EuYkNZ69YMaTiKdgDcGum1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO8Tm1/btsIJd3rgVm/EuYkNZ69YMaTiKdgDcGum1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO8Tm1%2FbtsIJd3rgVm%2FEuYkNZ69YMaTiKdgDcGum1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;1028&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.37.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1028&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.46.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paSHo/btsIJy0yvlK/DoieWCsPBgskUCLJml9kNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paSHo/btsIJy0yvlK/DoieWCsPBgskUCLJml9kNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paSHo/btsIJy0yvlK/DoieWCsPBgskUCLJml9kNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaSHo%2FbtsIJy0yvlK%2FDoieWCsPBgskUCLJml9kNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;622&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.53.46.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.54.15.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwKYp/btsIHIQO3HD/aql9gmUzwovUseSwyIRUnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwKYp/btsIHIQO3HD/aql9gmUzwovUseSwyIRUnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwKYp/btsIHIQO3HD/aql9gmUzwovUseSwyIRUnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwKYp%2FbtsIHIQO3HD%2Faql9gmUzwovUseSwyIRUnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;202&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.54.15.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이렇게 하면 실행이 됩니다.!!! 끝!!&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.59.09.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfh5uZ/btsIIic4QgH/6WyPkuowIK8AJ18dbzqnDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfh5uZ/btsIIic4QgH/6WyPkuowIK8AJ18dbzqnDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfh5uZ/btsIIic4QgH/6WyPkuowIK8AJ18dbzqnDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdfh5uZ%2FbtsIIic4QgH%2F6WyPkuowIK8AJ18dbzqnDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;346&quot; data-filename=&quot;스크린샷 2024-07-23 오전 11.59.09.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 한가지 잊은 사실이 있지 않으신가요?? ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;바로...&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오후 12.00.33.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l7HYb/btsIJEfatTf/5ZHlT5TmoMQcij7rK2KhC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l7HYb/btsIJEfatTf/5ZHlT5TmoMQcij7rK2KhC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l7HYb/btsIJEfatTf/5ZHlT5TmoMQcij7rK2KhC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl7HYb%2FbtsIJEfatTf%2F5ZHlT5TmoMQcij7rK2KhC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;347&quot; data-filename=&quot;스크린샷 2024-07-23 오후 12.00.33.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 조기 실행하는 LLDB 명령어를 사용안했습니다..&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;물론 앱을 백그라운드 상태에 두고 Xcode 계속 열어두시면&amp;nbsp; print찍어 놓은 부분이&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 될테지만... 언제 되냐고.... 퇴근 안하냐고...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자.!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 어디에서 LLDB를 명령어를 실행하면 좋냐!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;백그라운드 상태에 진입했을 시점&lt;/b&gt;&lt;/span&gt;에 브레이크 포인트를 걸고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLDB 명령어를 실행하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-23 오후 12.04.13.png&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSKFWJ/btsIIyNuWMr/M6xAv9XQPJ2u2BtCBkGwGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSKFWJ/btsIIyNuWMr/M6xAv9XQPJ2u2BtCBkGwGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSKFWJ/btsIIyNuWMr/M6xAv9XQPJ2u2BtCBkGwGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSKFWJ%2FbtsIIyNuWMr%2FM6xAv9XQPJ2u2BtCBkGwGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1978&quot; height=&quot;1192&quot; data-filename=&quot;스크린샷 2024-07-23 오후 12.04.13.png&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단, 백구라운드 상태 진입하고 브레이크 포인트 걸자마자&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 LLDB에 명령어 입력을...... 해도 되긴 하지만!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5분에서 10분정도 시간이 흐른뒤 LLDB 명령어를 적으면 더 극적으로 결과가 보이실 겁니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 고생하셨습니다! 긴글 봐주셔서 감사합니다.&lt;/p&gt;</description>
      <category>iOS</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/76</guid>
      <comments>https://yeomir.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 23 Jul 2024 20:08:52 +0900</pubDate>
    </item>
    <item>
      <title>Custom SPM 제작기 part2.</title>
      <link>https://yeomir.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 시작하겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UIComponents 폴더 생성 -&amp;gt; BaseLabel 파일 생성&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.05.50.png&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUYFJo/btsH121yWmJ/bqrD3UVXeEd8jnp30k7hN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUYFJo/btsH121yWmJ/bqrD3UVXeEd8jnp30k7hN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUYFJo/btsH121yWmJ/bqrD3UVXeEd8jnp30k7hN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUYFJo%2FbtsH121yWmJ%2FbqrD3UVXeEd8jnp30k7hN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;161&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.05.50.png&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;하지만 Import UIKit을 하는 순간 Error 발생&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 어떤 Error인지 확인해보니&lt;/p&gt;
&lt;pre id=&quot;code_1718528900331&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UIKit is not available when building for macOS. Consider using #if canImport(UIKit)
to conditionally import this framework.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: UIKit이 macOS에서 사용할 수 없음을 의미&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방법으로는 조건문을 설정해주면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;# if canImport(UIKit)&amp;nbsp; ~ #endif&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718528977692&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#if canImport(UIKit)
import Foundation
import UIKit

open class BaseLabel: UILabel {
    public init() {
        super.init(frame: .zero)
        self.text = &quot;ExampleLabel&quot;
    }
    // add
    
    public required init?(coder: NSCoder) {
        fatalError(&quot;init(coder:) has not been implemented&quot;)
    }
}
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.10.21.png&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bChgNv/btsHZSNo3BT/3KLe9gqGGl99ze6fo6ZHt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bChgNv/btsHZSNo3BT/3KLe9gqGGl99ze6fo6ZHt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bChgNv/btsHZSNo3BT/3KLe9gqGGl99ze6fo6ZHt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbChgNv%2FbtsHZSNo3BT%2F3KLe9gqGGl99ze6fo6ZHt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;441&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.10.21.png&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그렇다면 package.swift로 이동해서 마무리 지어 볼게요&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;.library로 UIComponents를 추가해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;targets에도 만들어줄게요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.06.01.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0tkH8/btsH1h5ZfoL/DHjKwKPKmksc0mNp2ECKgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0tkH8/btsH1h5ZfoL/DHjKwKPKmksc0mNp2ECKgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0tkH8/btsH1h5ZfoL/DHjKwKPKmksc0mNp2ECKgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0tkH8%2FbtsH1h5ZfoL%2FDHjKwKPKmksc0mNp2ECKgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;318&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.06.01.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에 추가하게되면 이렇게 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.12.15.png&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6zn0a/btsH1OPTov7/G4Ju7bKpxYzgPshRLkIObK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6zn0a/btsH1OPTov7/G4Ju7bKpxYzgPshRLkIObK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6zn0a/btsH1OPTov7/G4Ju7bKpxYzgPshRLkIObK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6zn0a%2FbtsH1OPTov7%2FG4Ju7bKpxYzgPshRLkIObK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;370&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.12.15.png&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPM을 설치하고 적용해 볼게요&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.13.00.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UGh1q/btsH1LTaNYS/gE2CuI2M3deOwvCBl8zUh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UGh1q/btsH1LTaNYS/gE2CuI2M3deOwvCBl8zUh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UGh1q/btsH1LTaNYS/gE2CuI2M3deOwvCBl8zUh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUGh1q%2FbtsH1LTaNYS%2FgE2CuI2M3deOwvCBl8zUh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;506&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.13.00.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 완성으로 잘 적용되는 것을 볼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 쉽죠??&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리를 해보자면&lt;br /&gt;&lt;br /&gt;폴더 생성 -&amp;gt; Base 파일 생성 -&amp;gt; package.swift 폴더 이동 -&amp;gt; &lt;b&gt;products, targets에 만든 폴더명 추가&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구성이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;custom SPM만 깔아도 SnapKit이나 Alamofire를 한번에 깔 수 있는 방법은 어떤게 있을까요?&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.swift 파일에 dependencies를 추가할게요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.17.18.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RK2os/btsH18gjnkG/QoVacJK1Mw3eNn5CuRA2Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RK2os/btsH18gjnkG/QoVacJK1Mw3eNn5CuRA2Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RK2os/btsH18gjnkG/QoVacJK1Mw3eNn5CuRA2Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRK2os%2FbtsH18gjnkG%2FQoVacJK1Mw3eNn5CuRA2Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;371&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.17.18.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 자동으로 설치되는 라이브러리를 git 주소만 있으면 추가할 수 있어요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SnapKit을 예시를 들면 SnapKit GitHub에 들어가보면 SPM 설치하는 부분이 있어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url을 복사해주세요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.20.16.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjIMp/btsHZ6xP7UM/iVHCTL7139d4rHWXipiVQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjIMp/btsHZ6xP7UM/iVHCTL7139d4rHWXipiVQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjIMp/btsHZ6xP7UM/iVHCTL7139d4rHWXipiVQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsjIMp%2FbtsHZ6xP7UM%2FiVHCTL7139d4rHWXipiVQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;423&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.20.16.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dependencies에 추가해줄게요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 CustomSPM을 설치하면 자동으로 SnapKit도 자동으로 설치 할 수 있데 dependence를 추가해 줄게요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.31.37.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE3xF4/btsH1me2D0K/k4nPTnbETtHECxkSDb0M91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE3xF4/btsH1me2D0K/k4nPTnbETtHECxkSDb0M91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE3xF4/btsH1me2D0K/k4nPTnbETtHECxkSDb0M91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE3xF4%2FbtsH1me2D0K%2Fk4nPTnbETtHECxkSDb0M91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;406&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.31.37.png&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이렇게 했는데... 기존 CustomSPM과 구분 짓기 위해 &lt;b&gt;tag&lt;/b&gt;를 사용하여 버전 관리를 할 수 있어요&amp;nbsp;&lt;br /&gt;마치 SnapKit에서 exact: 5.0.1 처럼요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718529926478&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git tag // 현재 tag 버전 확인 

git tag 1.0.1 // tag Up 시키기
git add . // 모든 변경사항 올리기 
git commit -m &quot;add version 1.0.1&quot; // commit 메시지
git push origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 push 까지 맞췄다면 SPM이 적용된 프로젝트를 가서 확인해볼게요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.26.32.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gp9d1/btsHZZFDjyx/d68lK7yXthj2FP4NAcbKhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gp9d1/btsHZZFDjyx/d68lK7yXthj2FP4NAcbKhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gp9d1/btsHZZFDjyx/d68lK7yXthj2FP4NAcbKhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGp9d1%2FbtsHZZFDjyx%2Fd68lK7yXthj2FP4NAcbKhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;442&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.26.32.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음... 변한게 없네요... 분명 Snapkit을 존속 시켰는데 말이죠 ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 아무런 변화가 없냐면 &lt;b&gt;SPM은 업데이트가 되었는데&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;현재 프로젝트는 업데이트가 되기전 버전&lt;/b&gt;&lt;/span&gt;이에요 그래서 적용되지 않은 것이에요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 수동으로 SPM을 업데이트 해줄게요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode -&amp;gt; File - &amp;gt; Packages를 보면 &lt;b&gt;Update to Latest Package Versions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SPM을 업데이트 하게 되면 SnapKit이 설치되는 것을 볼 수 있어요&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.33.28.png&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpE1vM/btsH0ko4nEU/KvP65INldDWBdqmptQcMzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpE1vM/btsH0ko4nEU/KvP65INldDWBdqmptQcMzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpE1vM/btsH0ko4nEU/KvP65INldDWBdqmptQcMzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpE1vM%2FbtsH0ko4nEU%2FKvP65INldDWBdqmptQcMzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;424&quot; data-filename=&quot;스크린샷 2024-06-16 오후 6.33.28.png&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CustomSPM을 만들어 놓으면 불필요하게&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 구성할때마다 Snapkit, alamofire, tabman 이런것들을 일일히 설치 안해도 되겠죠??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에는 현재는 CustomSPM이 업데이트 될때마다 프로젝트에서 수동으로 SPM을 업데이트 해주고 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI / CD 중 CI를 사용하여 자동으로 관리 할 수 있게 해볼게요&amp;nbsp;&lt;br /&gt;고생하셨습니다!&lt;/p&gt;</description>
      <category>iOS</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/75</guid>
      <comments>https://yeomir.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 16 Jun 2024 18:38:23 +0900</pubDate>
    </item>
    <item>
      <title>Custom SPM 제작기 part 1.</title>
      <link>https://yeomir.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 입사한지 5개월된 따끈따끈 신입 개발자입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 블로그를 써서 감회가 새롭습니다. ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 챕터는 회사에서 일하면서 UI를 구성할 때 편하게 적용 할 수 있는&amp;nbsp; Base UI와 다른 SPM을 같이 사용할 수 있는 SPM을 만들어 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;( UI를 구성할때마다 BaseLabel, BaseButton 만드는게 귀찮아요... ㅠ )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;편한 말투로 시작하겠습니다! 그럼 시작!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 3.27.49.png&quot; data-origin-width=&quot;166&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdsxOW/btsH1NwEZMK/i190Nyx7hwoB4SlOBBbKqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdsxOW/btsH1NwEZMK/i190Nyx7hwoB4SlOBBbKqk/img.png&quot; data-alt=&quot;집도를 시작한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdsxOW/btsH1NwEZMK/i190Nyx7hwoB4SlOBBbKqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdsxOW%2FbtsH1NwEZMK%2Fi190Nyx7hwoB4SlOBBbKqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2024-06-16 오후 3.27.49.png&quot; data-origin-width=&quot;166&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;집도를 시작한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode를 사용하면서 SPM은 다들 사용해보셨죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 주로 SnapKit, Alamofire, Firebase 을 사용하는데... 필요할때마다 일일히 설치를 하는게&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;은근 귀찮더라구요... &lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;s&gt;( 아니 이게 귀찮으면... )&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한번에 설치하는 방법은 없을까?&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Base가 되는 것들을 같이 추가하는 방법을 없을까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 &lt;b&gt;Custom SPM&lt;/b&gt;을 만들게 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹자는 Custom Framework를 만들 수 있고, Cocoapods으로도 만들 수 있는데 왜 SPM으로 만들었냐 라고 하시는데...&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;SPM으로 만들었때의 장점이 있어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Xcode에 내장되어 있어서 프로젝트 설정, 종속성 관리하는데 용이&lt;/li&gt;
&lt;li&gt;불필요한 의존성을 최소화하여 빌드 시간 단축 =&amp;gt; 경량화&lt;/li&gt;
&lt;li&gt;Git 기반 버전 관리 가능 =&amp;gt; 버전 호환성 문제를 줄이고 코드 일관성 유지&lt;/li&gt;
&lt;li&gt;자동 의존성 해결 =&amp;gt; 의존성만 주입해주면 자동으로 설치 가능&lt;/li&gt;
&lt;li&gt;빠른 업데이트 및 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;Xcode -&amp;gt; Pakage -&amp;gt; 프로젝트 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.02.46.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1m6vp/btsH0OiQvDR/J6vzGV33ATFSG2f8kkdlyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1m6vp/btsH0OiQvDR/J6vzGV33ATFSG2f8kkdlyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1m6vp/btsH0OiQvDR/J6vzGV33ATFSG2f8kkdlyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1m6vp%2FbtsH0OiQvDR%2FJ6vzGV33ATFSG2f8kkdlyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;815&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.02.46.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 명 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.03.08.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w9mpD/btsH0witQtn/w8U6GOXVEiObi8Iyvqy2Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w9mpD/btsH0witQtn/w8U6GOXVEiObi8Iyvqy2Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w9mpD/btsH0witQtn/w8U6GOXVEiObi8Iyvqy2Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw9mpD%2FbtsH0witQtn%2Fw8U6GOXVEiObi8Iyvqy2Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;487&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.03.08.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.03.44.png&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDxKJ/btsHZZyPkoX/JUJOhyPjwcQHwGdKt5gsN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDxKJ/btsHZZyPkoX/JUJOhyPjwcQHwGdKt5gsN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDxKJ/btsHZZyPkoX/JUJOhyPjwcQHwGdKt5gsN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDxKJ%2FbtsHZZyPkoX%2FJUJOhyPjwcQHwGdKt5gsN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;330&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.03.44.png&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성을 살펴보겠습니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;여기서 중요하니 집중해주세요&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;name&lt;/b&gt; : SPM을 설치하면 나오는 이름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) snapKit 부분을 말함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.09.01.png&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNVTEJ/btsHZ6LjuPv/hu4nXjrGnR7Z6yeIvkhKR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNVTEJ/btsHZ6LjuPv/hu4nXjrGnR7Z6yeIvkhKR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNVTEJ/btsHZ6LjuPv/hu4nXjrGnR7Z6yeIvkhKR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNVTEJ%2FbtsHZ6LjuPv%2Fhu4nXjrGnR7Z6yeIvkhKR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;134&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.09.01.png&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.09.46.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjhNVe/btsH2arCpZu/rN6mGQUmLcZHNpUIntSVA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjhNVe/btsH2arCpZu/rN6mGQUmLcZHNpUIntSVA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjhNVe/btsH2arCpZu/rN6mGQUmLcZHNpUIntSVA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjhNVe%2FbtsH2arCpZu%2FrN6mGQUmLcZHNpUIntSVA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;187&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.09.46.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;priducts&lt;/b&gt; 배열 안에 .library부분은 어떤 것을 설치 할지 선택 할 수 있게 나오는 부분&lt;/p&gt;
&lt;pre id=&quot;code_1718522076903&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.library(name: Snapkit, target: [ ~ ],
.library(name: Snapkit-Dynamic, tartget: [ ~ ])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.09.07.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XP9Tp/btsH1NDqToB/AkUtMfWMvL8W4vkA8r4N2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XP9Tp/btsH1NDqToB/AkUtMfWMvL8W4vkA8r4N2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XP9Tp/btsH1NDqToB/AkUtMfWMvL8W4vkA8r4N2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXP9Tp%2FbtsH1NDqToB%2FAkUtMfWMvL8W4vkA8r4N2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;70&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.09.07.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.11.16.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8UeG/btsHZK20Gnc/9l6OLdzDYFLoCRF7A0VjQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8UeG/btsHZK20Gnc/9l6OLdzDYFLoCRF7A0VjQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8UeG/btsHZK20Gnc/9l6OLdzDYFLoCRF7A0VjQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8UeG%2FbtsHZK20Gnc%2F9l6OLdzDYFLoCRF7A0VjQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;139&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.11.16.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tartgets은 SPM을 어디에 적용할 지 target을 설정 할 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 난 프로젝트와 test에도 spm을 적용하고 싶어라고 하면 이렇게 설정됨&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.16.28.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4Dzkm/btsHZMzKk4L/0KKecbea55yHuGpVgJMsw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4Dzkm/btsHZMzKk4L/0KKecbea55yHuGpVgJMsw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4Dzkm/btsHZMzKk4L/0KKecbea55yHuGpVgJMsw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4Dzkm%2FbtsHZMzKk4L%2F0KKecbea55yHuGpVgJMsw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;141&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.16.28.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package로 SPM을 만들면 test 파일도 만들어지므로 default로 되어있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.17.52.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nD0oi/btsH0xuSQxt/iitk0A3gCn4LI1RrXDcXy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nD0oi/btsH0xuSQxt/iitk0A3gCn4LI1RrXDcXy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nD0oi/btsH0xuSQxt/iitk0A3gCn4LI1RrXDcXy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnD0oi%2FbtsH0xuSQxt%2Fiitk0A3gCn4LI1RrXDcXy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;570&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.17.52.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;단 주의할 점은 target을 추가해주고 싶을때는 폴더를 만들어줘야함&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 부분은 추후에 다시 설명해드릴게요&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 설명은 끝났고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 테스트를 해보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;접근제어자와 static으로 Text를 만들어봤습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.23.23.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgtUg7/btsH0yHnNsW/ufN2e3jJgW0hopjUkM1Na1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgtUg7/btsH0yHnNsW/ufN2e3jJgW0hopjUkM1Na1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgtUg7/btsH0yHnNsW/ufN2e3jJgW0hopjUkM1Na1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgtUg7%2FbtsH0yHnNsW%2FufN2e3jJgW0hopjUkM1Na1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;158&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.23.23.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;195&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;blockquote data-ke-style=&quot;style1&quot;&gt;해당 package를 만들었는데 다른 프로젝트에서 사용하려면 어떻게 해야될까요?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 만든 package를 Github에 올리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github에 올리는 방법은 많지만 Xcode를 활용하여 올려볼게요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 아시리라 믿고 다른 설명없이 사진으로만 대체할게요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.26.55.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2NPxC/btsH1FS1Iyu/vn3OeynGpknSzYQt2JBqok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2NPxC/btsH1FS1Iyu/vn3OeynGpknSzYQt2JBqok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2NPxC/btsH1FS1Iyu/vn3OeynGpknSzYQt2JBqok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2NPxC%2FbtsH1FS1Iyu%2Fvn3OeynGpknSzYQt2JBqok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;401&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.26.55.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.27.01.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ej5EZ9/btsHZS7EfSL/BVCshPXn469aATwvftZ3Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ej5EZ9/btsHZS7EfSL/BVCshPXn469aATwvftZ3Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ej5EZ9/btsHZS7EfSL/BVCshPXn469aATwvftZ3Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fej5EZ9%2FbtsHZS7EfSL%2FBVCshPXn469aATwvftZ3Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;469&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.27.01.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.27.17.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CKC4d/btsH004qUJY/n9OhhjVklkfqmUxUnm6O8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CKC4d/btsH004qUJY/n9OhhjVklkfqmUxUnm6O8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CKC4d/btsH004qUJY/n9OhhjVklkfqmUxUnm6O8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCKC4d%2FbtsH004qUJY%2Fn9OhhjVklkfqmUxUnm6O8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;582&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.27.17.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.27.37.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjFbkw/btsH0YTfkKY/TlW0ZenmVEAL5urlUSMgxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjFbkw/btsH0YTfkKY/TlW0ZenmVEAL5urlUSMgxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjFbkw/btsH0YTfkKY/TlW0ZenmVEAL5urlUSMgxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjFbkw%2FbtsH0YTfkKY%2FTlW0ZenmVEAL5urlUSMgxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;602&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.27.37.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Github에 올렸으면 해당 URL 주소를 확인 할 수 있어요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.29.36.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WnIDK/btsHZURW3YI/uC3nzzmIDHaTLeugCqOjJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WnIDK/btsHZURW3YI/uC3nzzmIDHaTLeugCqOjJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WnIDK/btsHZURW3YI/uC3nzzmIDHaTLeugCqOjJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWnIDK%2FbtsHZURW3YI%2FuC3nzzmIDHaTLeugCqOjJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;369&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.29.36.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 생성 -&amp;gt; SPM 적용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.33.32.png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c30aeZ/btsHZYUdKWg/9keaeRkvAtAQAGPSDZSqWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c30aeZ/btsHZYUdKWg/9keaeRkvAtAQAGPSDZSqWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c30aeZ/btsHZYUdKWg/9keaeRkvAtAQAGPSDZSqWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc30aeZ%2FbtsHZYUdKWg%2F9keaeRkvAtAQAGPSDZSqWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;153&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.33.32.png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.34.02.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEbkPF/btsH0MeiVNs/Kl0aiyKUhy57vfZ78IIUEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEbkPF/btsH0MeiVNs/Kl0aiyKUhy57vfZ78IIUEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEbkPF/btsH0MeiVNs/Kl0aiyKUhy57vfZ78IIUEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEbkPF%2FbtsH0MeiVNs%2FKl0aiyKUhy57vfZ78IIUEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.34.02.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어때요 참 쉽죠?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하는 방법은... SPM을 사용하는거랑 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.38.03.png&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjRlni/btsH0WOBSwi/SASW43e17i3GsN5ndR4sa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjRlni/btsH0WOBSwi/SASW43e17i3GsN5ndR4sa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjRlni/btsH0WOBSwi/SASW43e17i3GsN5ndR4sa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjRlni%2FbtsH0WOBSwi%2FSASW43e17i3GsN5ndR4sa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;311&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.38.03.png&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;311&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;pre id=&quot;code_1718523528519&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit
import CustomSPM // SPM import 시키기

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        Example_TextLabel.text // SPM에서 만들어 놓은 클래스 사용
    }


}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;So~~~~~~~~ EASY&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.43.21.png&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8yPUe/btsH01hXNDF/EDV9GSNQuEC05fFGVJuMA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8yPUe/btsH01hXNDF/EDV9GSNQuEC05fFGVJuMA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8yPUe/btsH01hXNDF/EDV9GSNQuEC05fFGVJuMA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8yPUe%2FbtsH01hXNDF%2FEDV9GSNQuEC05fFGVJuMA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2024-06-16 오후 4.43.21.png&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 간단하게 Custom SPM을 만드는 법을 설정해보았는데요. 다음 파트에서는&amp;nbsp;&lt;br /&gt;파일을 만들어서 관리하는 법과 다른 SPM 추가 및 업데이트에 대해 알아볼게요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/74</guid>
      <comments>https://yeomir.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 16 Jun 2024 16:43:41 +0900</pubDate>
    </item>
    <item>
      <title>ViewController에 Tabman 넣는 방법 ( ContainerView 활용 )</title>
      <link>https://yeomir.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;simulator_screenshot_7A0079AA-F658-46E4-B901-18F477888983.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqXRjX/btsBVF5zpVL/AgynSTBeWt8eF7tpRQnDfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqXRjX/btsBVF5zpVL/AgynSTBeWt8eF7tpRQnDfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqXRjX/btsBVF5zpVL/AgynSTBeWt8eF7tpRQnDfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqXRjX%2FbtsBVF5zpVL%2FAgynSTBeWt8eF7tpRQnDfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1084&quot; data-filename=&quot;simulator_screenshot_7A0079AA-F658-46E4-B901-18F477888983.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진과 보는것 같이 중간에 Tabman을 넣으려면 어떻게 해야할까?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 쉽고 따라 할 수 있는 방법을 알려드리겠습니다!! ㅎㅎ&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 일단 Tabman 라이브러를 설치하고 Tabman 기본 구성을 따라 적습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.27.31.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIKBaR/btsBJcxq6EI/p1GEILKvWnGGl8h4oNCJH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIKBaR/btsBJcxq6EI/p1GEILKvWnGGl8h4oNCJH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIKBaR/btsBJcxq6EI/p1GEILKvWnGGl8h4oNCJH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIKBaR%2FbtsBJcxq6EI%2Fp1GEILKvWnGGl8h4oNCJH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;276&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.27.31.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.28.10.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKzGAf/btsBSaFeter/7ZEgpkhSVOqLpT2rMGKS60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKzGAf/btsBSaFeter/7ZEgpkhSVOqLpT2rMGKS60/img.png&quot; data-alt=&quot;barItem은 index를 기준으로 커스텀하게 생성할 수 있어요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKzGAf/btsBSaFeter/7ZEgpkhSVOqLpT2rMGKS60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKzGAf%2FbtsBSaFeter%2F7ZEgpkhSVOqLpT2rMGKS60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;394&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.28.10.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;barItem은 index를 기준으로 커스텀하게 생성할 수 있어요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 여기서 가장 중요한 점은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변수로 설정한 &lt;b&gt;baseView&lt;/b&gt;의 역할입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;역할은 Tabman의 버튼의 레이아웃을 설정하는 겁니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.29.44.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6GFwy/btsBTYrigzO/AgVPqb4DRDencpwlioCQHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6GFwy/btsBTYrigzO/AgVPqb4DRDencpwlioCQHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6GFwy/btsBTYrigzO/AgVPqb4DRDencpwlioCQHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6GFwy%2FbtsBTYrigzO%2FAgVPqb4DRDencpwlioCQHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;292&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.29.44.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp; Tabman의 버튼을 설정합니다.&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;여기서 핵심은 .custom으로에 레이아웃 설정한 &lt;b&gt;baseView&lt;/b&gt;가 들어간다는 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.31.47.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccpdkF/btsBJb6i959/bUtUyukOOcl8bKGXxIK7L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccpdkF/btsBJb6i959/bUtUyukOOcl8bKGXxIK7L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccpdkF/btsBJb6i959/bUtUyukOOcl8bKGXxIK7L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccpdkF%2FbtsBJb6i959%2FbUtUyukOOcl8bKGXxIK7L0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;728&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.31.47.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 기초적인 부분은 끝났습니다. 참 쉽죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 정리를 하자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tabman 라이브러리 설치 -&amp;gt; import -&amp;gt; baseView 생성 -&amp;gt; 레이아웃 조정 -&amp;gt; bar 설정 -&amp;gt; addBar에 설정한 baseView 적용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ViewController 중간에 배치하는 방법은?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이렇게 만들어진 TabManVC를 만들려고하는 VC에 인스턴스를 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. VC 자체를 레이아웃을 잡을 수 없으니&lt;b&gt; VC에서 UIView를 만들어주고, TabMan의 View를 넣어주는겁니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.36.41.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKPLLe/btsBKkh9pBE/bvbwpLsl3DpekhWcJlB1pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKPLLe/btsBKkh9pBE/bvbwpLsl3DpekhWcJlB1pK/img.png&quot; data-alt=&quot;ViewDidload() 밖에서 만들어줘야 되는건 다들 아시죠?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKPLLe/btsBKkh9pBE/bvbwpLsl3DpekhWcJlB1pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKPLLe%2FbtsBKkh9pBE%2FbvbwpLsl3DpekhWcJlB1pK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.36.41.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ViewDidload() 밖에서 만들어줘야 되는건 다들 아시죠?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.37.03.png&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boZ8ou/btsBVBIQNzw/sbBccGGKQnsdA1n9AP1yok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boZ8ou/btsBVBIQNzw/sbBccGGKQnsdA1n9AP1yok/img.png&quot; data-alt=&quot;ViewDidLoad() 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boZ8ou/btsBVBIQNzw/sbBccGGKQnsdA1n9AP1yok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboZ8ou%2FbtsBVBIQNzw%2FsbBccGGKQnsdA1n9AP1yok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;145&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.37.03.png&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ViewDidLoad() 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이렇게하면&amp;nbsp; containerView 안에 addSubView를 통해 TabmanVC의 view를 올려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 마무리로 containerView의 레이아웃만 잡아주면 끝!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.38.16.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhK2H5/btsBOg7x271/vl9u5KXMjicTwP5okgD0I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhK2H5/btsBOg7x271/vl9u5KXMjicTwP5okgD0I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhK2H5/btsBOg7x271/vl9u5KXMjicTwP5okgD0I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhK2H5%2FbtsBOg7x271%2Fvl9u5KXMjicTwP5okgD0I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;132&quot; data-filename=&quot;스크린샷 2023-12-13 오전 12.38.16.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>새싹</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/69</guid>
      <comments>https://yeomir.tistory.com/69#entry69comment</comments>
      <pubDate>Wed, 13 Dec 2023 00:40:42 +0900</pubDate>
    </item>
    <item>
      <title>RxSwift flatMap vs map 차이</title>
      <link>https://yeomir.tistory.com/66</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; RxSwift를 사용할때 flatMap에 대해 어디까지 알고 계신가요?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는&amp;nbsp; flatMap에 대해 뜯고 맛보고  즐겨보고 map과의 차이점에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.25.04.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eXj5g5/btsAvjQAd2p/u3P0CCtlEHl4kYKr48iFl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eXj5g5/btsAvjQAd2p/u3P0CCtlEHl4kYKr48iFl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eXj5g5/btsAvjQAd2p/u3P0CCtlEHl4kYKr48iFl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeXj5g5%2FbtsAvjQAd2p%2Fu3P0CCtlEHl4kYKr48iFl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;322&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.25.04.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;그럼 시작 !!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하기에 앞서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단! 간단히 map부터 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희가 알고 있던 map에 대해 예시를 통해 복습해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700152439061&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let exampleInt = [1, 2, 3]

let exampleString = exampleInt.map { value -&amp;gt; String in
    return String(value)
} 

// [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 배열에서 하나씩 뽑아서 String으로 만든 다음 배열에 담는것이&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;map&lt;/span&gt;의 역할인데요&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RxSwift에서도 똑같은 역할을 합니다.&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;현재 Observable.just(1)의 타입은 &lt;b&gt;Observable&amp;lt;Int&amp;gt; 입니다. 여기서 &lt;span style=&quot;color: #006dd7;&quot;&gt;map&lt;/span&gt;을 한다면 obser1은 어떤 타입이 될까요?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.03.38.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rCGVN/btsAuMSZu6G/zV4a2Fz4YcRS9YghXqjbA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rCGVN/btsAuMSZu6G/zV4a2Fz4YcRS9YghXqjbA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rCGVN/btsAuMSZu6G/zV4a2Fz4YcRS9YghXqjbA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrCGVN%2FbtsAuMSZu6G%2FzV4a2Fz4YcRS9YghXqjbA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;211&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.03.38.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답은 &lt;b&gt;Observable&amp;lt;Strting&amp;gt;&lt;/b&gt;이 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.05.26.png&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbuDh7/btsAtafJKw0/mW5b4ZKiQhDIENlVcfYpL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbuDh7/btsAtafJKw0/mW5b4ZKiQhDIENlVcfYpL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbuDh7/btsAtafJKw0/mW5b4ZKiQhDIENlVcfYpL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbuDh7%2FbtsAtafJKw0%2FmW5b4ZKiQhDIENlVcfYpL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;261&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.05.26.png&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;218&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;즉, return&amp;nbsp; 값으로 나온&lt;span style=&quot;color: #8a3db6;&quot;&gt; 결과 값&lt;/span&gt;에 Observable이 &lt;span style=&quot;color: #8a3db6;&quot;&gt;추가&lt;/span&gt;로 붙는 겁니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 예시를 들어볼까요??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 코드에서 obser의 값의 타입은 무엇일까요??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.08.08.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpHXqy/btsAonUVp7w/wHHneLcsJOLk8IERoyQvrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpHXqy/btsAonUVp7w/wHHneLcsJOLk8IERoyQvrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpHXqy/btsAonUVp7w/wHHneLcsJOLk8IERoyQvrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpHXqy%2FbtsAonUVp7w%2FwHHneLcsJOLk8IERoyQvrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;281&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.08.08.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 답이 틀리신 분들은 직접 만들어보시고 map에 다시한번 복습해보시길 바랍니다.!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flatMap을 알기전에 정말 알고 넘어가야 됩니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정답은 Observable&amp;lt;Observable&amp;lt;ValidateEmailResponse&amp;gt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.11.04.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daCoBa/btsAsxWmU5m/5XYRFGDLqtxCjXn6sIbetk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daCoBa/btsAsxWmU5m/5XYRFGDLqtxCjXn6sIbetk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daCoBa/btsAsxWmU5m/5XYRFGDLqtxCjXn6sIbetk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaCoBa%2FbtsAsxWmU5m%2F5XYRFGDLqtxCjXn6sIbetk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.11.04.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 한번더 말씀 드리면&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;return&amp;nbsp; 값으로 나온&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;결과 값&lt;/span&gt;에 Observable이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;추가&lt;/span&gt;로 붙는 겁니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇다면 왜?? Observable이 추가로 붙는걸까??&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 간단합니다. RxSwift에서 map의 역할을 그렇게 만들었기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map의 타입을 보면 Return 값으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Observable&amp;lt;Result&amp;gt;을 return&lt;/b&gt;&lt;/span&gt; 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.13.32.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWMfE/btsAp15a0ps/ijqiLNUDL9KQ1ltTpkX4N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWMfE/btsAp15a0ps/ijqiLNUDL9KQ1ltTpkX4N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWMfE/btsAp15a0ps/ijqiLNUDL9KQ1ltTpkX4N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWMfE%2FbtsAp15a0ps%2FijqiLNUDL9KQ1ltTpkX4N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.13.32.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;자 그렇다면 flatMap은 어떻게 사용하는 걸까요??&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 내린 결론 부터 말씀드리면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;지정한 리턴값으로 커스텀하게 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엥? 이게 무슨 말이지?&amp;nbsp;&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;span style=&quot;color: #ee2323;&quot;&gt;flatMap을 사용하지 않을때&lt;/span&gt; 어떻게 RxSwift로 만들수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 저는 버튼을 탭 했을때 네트워크 통신을 하려고 이렇게 구성했었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700155775714&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; /// 이메일 검증
        // 회원가입 할때 Email TextField에서 검증해야함
        validEmailBtn.rx.tap
            .bind(with: self) { owner, _ in
                APIManager.shared.requestIsValidateEmail(api: Router.valid(emial: &quot;aas1234@sdsc1aa.com&quot;))
                    .asDriver(onErrorJustReturn: ValidateEmailResponse(message: &quot;&quot;))
                    .drive(with: self) { owner, response in
                        dump(response)
                    }
                    .disposed(by: owner.disposeBag)
            }
            .disposed(by: disposeBag)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에 대해 뜯어보면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 탭 -&amp;gt; 네트워크 통신 -&amp;gt; ( 에러 발생시 asDriver로 핸들링 )&amp;nbsp; -&amp;gt; drive를 통해 response ( 현재 코드에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ValidateEmailResponse) 방출 -&amp;gt; dispose -&amp;gt; dispose 이렇게 됩니다.&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;버튼 탭을 했을 떄도 dispose를 해줘야하고 API통신이 끝났을때도 dispose를 해주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드를 해보면 동작하는데 문제가 되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;But dispose가 두번되기 때문에 문제가 생길 수 있는 확률이 있습니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;또한 RxSwift 공식문서에서도 dispose를 두 번 쓰지 말라고 적혀있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇다면 버튼을 탭하고 네트워크 통신을 할때&lt;br /&gt;dispose가 두번 쓰이는데 구현 할 수 있는 방법은 없을까??&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;여기서 나온것이 flatMap입니다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;물논! flatMap이 이렇게 나왔다는것은 없고... 뇌피셜입니다 하핫!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 제가 프로젝트를 구현할때 이런 느낌으로 많이 사용했습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;각설 하고 다시 본론으로 돌아오면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여타 블로그에서 보면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;평탄화 작업이다&quot;라고 표현되는 부분이 있는데&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 평탄화 작업&lt;/b&gt;이이라고 부르냐면&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;현재 코드에서의&lt;span style=&quot;color: #ee2323;&quot;&gt; 두 개의 dispose&lt;/span&gt;를 &lt;span style=&quot;color: #006dd7;&quot;&gt;한개의 dispose&lt;/span&gt;를 사용해서 구현 할 수 있습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이제 코드를 보면서 &lt;b&gt;지정한 커스텀 리턴값으로 반환 할 수 있다 &lt;/b&gt;에 대해서 알아 보겠습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.45.40.png&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byG6kN/btsAqIqNMSC/fy0kCUbjWZUTB49njMDOsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byG6kN/btsAqIqNMSC/fy0kCUbjWZUTB49njMDOsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byG6kN/btsAqIqNMSC/fy0kCUbjWZUTB49njMDOsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyG6kN%2FbtsAqIqNMSC%2Ffy0kCUbjWZUTB49njMDOsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;107&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.45.40.png&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;duplicatdTapped&lt;/b&gt; : 버튼을 터치했을때&amp;nbsp; 타입 &lt;b&gt;ControlProperty&amp;lt;Void&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;withLatestFrom&lt;/b&gt; : 사용자가 적는 emailText를 나타냅니다. 타입은 &lt;b&gt;ControlProperty&amp;lt;String&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;value의 타입은 &lt;b&gt;ControlProperty&amp;lt;String&amp;gt; 이것이 되겠죠?&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &lt;b&gt;controlProperty&amp;lt;String&amp;gt;&lt;/b&gt;값을 가지고&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt; Observable&amp;lt;ValidateEmailResponse&amp;gt;&lt;/b&gt;&lt;/span&gt;로 만들고 싶습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.52.28.png&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lq3VH/btsAvX7zCq9/vHzOkE0bxa7O6h9OVPI1k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lq3VH/btsAvX7zCq9/vHzOkE0bxa7O6h9OVPI1k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lq3VH/btsAvX7zCq9/vHzOkE0bxa7O6h9OVPI1k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flq3VH%2FbtsAvX7zCq9%2FvHzOkE0bxa7O6h9OVPI1k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;139&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.52.28.png&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때 flatMap을 사용합니다.&amp;nbsp; flatMap의 정의에 대해 다시 한번 말씀드리면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;지정한 리턴값으로 커스텀하게 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 그렇다면 map을 쓰면 어떻게 될까요??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저희가 지정한 return 값에 Observable이 감싸줘서 return이 됩니다...&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.53.04.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byqHpI/btsArwDprMm/wDnxthwaoVJaor2QQA3UV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byqHpI/btsArwDprMm/wDnxthwaoVJaor2QQA3UV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byqHpI/btsArwDprMm/wDnxthwaoVJaor2QQA3UV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyqHpI%2FbtsArwDprMm%2FwDnxthwaoVJaor2QQA3UV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;187&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.53.04.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기가 이해되셨으면 다 이해하신겁니다!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리를 해보자면&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;아! flatMap은 &lt;span style=&quot;color: #006dd7;&quot;&gt;사용자가 지정한 return 값으로 그대로 나오고&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;map은 지정한&lt;span style=&quot;color: #ee2323;&quot;&gt; return 값에 Observable이 감싸줘서 나오는군아&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기까지는 이해 완료 ! 그렇다면 문제가 되었던 코드를 다시보겠습니다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700157358458&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; /// 이메일 검증
        // 회원가입 할때 Email TextField에서 검증해야함
        validEmailBtn.rx.tap
            .bind(with: self) { owner, _ in
                APIManager.shared.requestIsValidateEmail(api: Router.valid(emial: &quot;aas1234@sdsc1aa.com&quot;))
                    .asDriver(onErrorJustReturn: ValidateEmailResponse(message: &quot;&quot;))
                    .drive(with: self) { owner, response in
                        dump(response)
                    }
                    .disposed(by: owner.disposeBag)
            }
            .disposed(by: disposeBag)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 코드에서 네트워크 통신하는 APIManager의 return 값은&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Observable&amp;lt;ValidationResponse&amp;gt;입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이것을 flatMap으로 바꿔보면 이렇게 바꿀 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700157720215&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/// 이메일 검증
        //  회원가입 할때 Email TextField에서 검증해야함
        duplicateBtn.rx.tap
            .flatMap { touchEvent -&amp;gt; Observable&amp;lt;ValidateEmailResponse&amp;gt; in
                return APIManager.shared.requestIsValidateEmail(api: Router.valid(email: &quot;aas1234@sdsc1aa.com&quot;))
                
            }
            .bind(with: self) { owner, response in
               print(response)
            }
            .disposed(by: disposeBag)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 위의 코드의 타입이 어떤 타입인지 확인 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 왜 flatMap을 사용하는지 아시겠죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.07.33.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y5S90/btsAw5dTCUE/7SMBWJRmw4wRgUNV93mE1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y5S90/btsAw5dTCUE/7SMBWJRmw4wRgUNV93mE1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y5S90/btsAw5dTCUE/7SMBWJRmw4wRgUNV93mE1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy5S90%2FbtsAw5dTCUE%2F7SMBWJRmw4wRgUNV93mE1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;396&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.07.33.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 꼭 아셔야 됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;flatMap은 사용자가 지정한 return 값으로 방출함!!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, 기존 스트림를 가공해서 -&amp;gt; 새로운 스트림을 만든다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 플로우로 봤을때는 이렇게 진행됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700201363866&quot; class=&quot;xl&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;버튼 탭 -&amp;gt; flatMap -&amp;gt; ControlEvent&amp;lt;Void&amp;gt; -&amp;gt; 사용자가 만든 Return&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flatMap에 대해 뜯어보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.09.46.png&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s2hhm/btsAr4t0y7u/jcaq8Q2y1v6KkzROKUdYjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s2hhm/btsAr4t0y7u/jcaq8Q2y1v6KkzROKUdYjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s2hhm/btsAr4t0y7u/jcaq8Q2y1v6KkzROKUdYjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs2hhm%2FbtsAr4t0y7u%2Fjcaq8Q2y1v6KkzROKUdYjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.09.46.png&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return 값을 보면 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;where&lt;/b&gt;&lt;/span&gt;이 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot; ~ 이러한 조건일때 -&amp;gt; Observable&amp;lt;Source.Element&amp;gt;로 return 해줘&quot;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map과 비교해서 봐보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤점이 다른지 보이시나요??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;map은 Return값을 Observable로 감싼다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;flatMap은 조건을 만족하면 Observable&amp;lt;Source.Element&amp;gt;로 만들어준다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWMfE/btsAp15a0ps/ijqiLNUDL9KQ1ltTpkX4N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWMfE/btsAp15a0ps/ijqiLNUDL9KQ1ltTpkX4N0/img.png&quot; width=&quot;600&quot; height=&quot;337&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2023-11-17 오전 2.13.32.png&quot; data-origin-height=&quot;270&quot; data-origin-width=&quot;481&quot; style=&quot;width: 51.8547%; margin-right: 10px;&quot; data-widthpercent=&quot;52.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWMfE/btsAp15a0ps/ijqiLNUDL9KQ1ltTpkX4N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWMfE%2FbtsAp15a0ps%2FijqiLNUDL9KQ1ltTpkX4N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s2hhm/btsAr4t0y7u/jcaq8Q2y1v6KkzROKUdYjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s2hhm/btsAr4t0y7u/jcaq8Q2y1v6KkzROKUdYjK/img.png&quot; width=&quot;600&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.09.46.png&quot; data-origin-height=&quot;596&quot; data-origin-width=&quot;962&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.9825%;&quot; data-widthpercent=&quot;47.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s2hhm/btsAr4t0y7u/jcaq8Q2y1v6KkzROKUdYjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs2hhm%2FbtsAr4t0y7u%2Fjcaq8Q2y1v6KkzROKUdYjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼 map 오 flatMap&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 코드에 적용해 보면서 map과 flatMap의 return 값을 비교해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이점이 보이시나요??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujxGy/btsAw467H02/Ak9WklbW7jnOZ9Twna2vfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujxGy/btsAw467H02/Ak9WklbW7jnOZ9Twna2vfK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;714&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.15.30.png&quot; style=&quot;width: 50.8714%; margin-right: 10px;&quot; data-widthpercent=&quot;51.47&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujxGy/btsAw467H02/Ak9WklbW7jnOZ9Twna2vfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujxGy%2FbtsAw467H02%2FAk9WklbW7jnOZ9Twna2vfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1146&quot; height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y5S90/btsAw5dTCUE/7SMBWJRmw4wRgUNV93mE1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y5S90/btsAw5dTCUE/7SMBWJRmw4wRgUNV93mE1K/img.png&quot; width=&quot;600&quot; height=&quot;396&quot; data-filename=&quot;스크린샷 2023-11-17 오후 3.07.33.png&quot; data-origin-height=&quot;748&quot; data-origin-width=&quot;1132&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.9658%;&quot; data-widthpercent=&quot;48.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y5S90/btsAw5dTCUE/7SMBWJRmw4wRgUNV93mE1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy5S90%2FbtsAw5dTCUE%2F7SMBWJRmw4wRgUNV93mE1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 이렇게 map 과 flatMap에 대해 알아봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 차이점을 확인해가니 왜 flatMap에 대해 쓰는지에 대해 바로 알 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스를 던져주신 새싹 멘토님 ㅋㅋㅈ님께 이 영광을 돌리겠습니다 ^^&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/66</guid>
      <comments>https://yeomir.tistory.com/66#entry66comment</comments>
      <pubDate>Fri, 17 Nov 2023 09:26:00 +0900</pubDate>
    </item>
    <item>
      <title>DiffableDataSource + SkeletonView 라이브러리 적용하기</title>
      <link>https://yeomir.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SkeletionView를 적용하는 방법은 아래 링크를 통해서 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Juanpe/SkeletonView&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Juanpe/SkeletonView&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699516459976&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Juanpe/SkeletonView: ☠️ An elegant way to show users that something is happening and also prepare them to which con&quot; data-og-description=&quot;☠️ An elegant way to show users that something is happening and also prepare them to which contents they are awaiting - GitHub - Juanpe/SkeletonView: ☠️ An elegant way to show users that something ...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Juanpe/SkeletonView&quot; data-og-url=&quot;https://github.com/Juanpe/SkeletonView&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNxamm/hyUuWgB1Wy/D692tVKdCWZIGKUwJHqUv1/img.png?width=1200&amp;amp;height=600&amp;amp;face=958_133_1063_247&quot;&gt;&lt;a href=&quot;https://github.com/Juanpe/SkeletonView&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Juanpe/SkeletonView&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNxamm/hyUuWgB1Wy/D692tVKdCWZIGKUwJHqUv1/img.png?width=1200&amp;amp;height=600&amp;amp;face=958_133_1063_247');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Juanpe/SkeletonView: ☠️ An elegant way to show users that something is happening and also prepare them to which con&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;☠️ An elegant way to show users that something is happening and also prepare them to which contents they are awaiting - GitHub - Juanpe/SkeletonView: ☠️ An elegant way to show users that something ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 원하는건 DiffableDataSource인데 어떻게 적용하지?&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 해서 현재 앱 출시한 프로젝트에서 DiffableDataSource와 SkeletonView를 적용해보기로 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View 전체에 적용하지는 못했고... Cell에만 적용해봤습니다.&lt;span style=&quot;color: #dddddd;&quot;&gt; ( 어떻게 해야할지... )&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 첫번째 방법&amp;nbsp; - 메서드 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cell에만 적용할 것이기 때문에 Cell 에 import SkeletionView를 해주었고 공식문서에 나온대로 해당 View에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isSkeletonable을 true로 설정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 4.59.34.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AalYr/btsz6vXXikP/oniIY40Ufk9oiMwEo1Gvek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AalYr/btsz6vXXikP/oniIY40Ufk9oiMwEo1Gvek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AalYr/btsz6vXXikP/oniIY40Ufk9oiMwEo1Gvek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAalYr%2Fbtsz6vXXikP%2FoniIY40Ufk9oiMwEo1Gvek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;347&quot; data-filename=&quot;스크린샷 2023-11-09 오후 4.59.34.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 4.59.46.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blUcyr/btsz6yG76P7/uYSFVMJnxGqzZHX3F021k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blUcyr/btsz6yG76P7/uYSFVMJnxGqzZHX3F021k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blUcyr/btsz6yG76P7/uYSFVMJnxGqzZHX3F021k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblUcyr%2Fbtsz6yG76P7%2FuYSFVMJnxGqzZHX3F021k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;289&quot; data-filename=&quot;스크린샷 2023-11-09 오후 4.59.46.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Cell이 &lt;b&gt;그려지기 전에 애니메이션을 적용&lt;/b&gt;하고 Cell이 &lt;b&gt;그려졌을때는 애니메이션이 끝내는 코드&lt;/b&gt;를 작성했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.01.25.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btcC8B/btsz3foiot7/EPjqyiqPcpOd6QUmATAOj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btcC8B/btsz3foiot7/EPjqyiqPcpOd6QUmATAOj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btcC8B/btsz3foiot7/EPjqyiqPcpOd6QUmATAOj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtcC8B%2Fbtsz3foiot7%2FEPjqyiqPcpOd6QUmATAOj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.01.25.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ViewController에서 데이터를 전달해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.14.49.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CbFja/btsz52PjNHD/W8ieIsuCdVgTmh2CtJAXN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CbFja/btsz52PjNHD/W8ieIsuCdVgTmh2CtJAXN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CbFja/btsz52PjNHD/W8ieIsuCdVgTmh2CtJAXN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCbFja%2Fbtsz52PjNHD%2FW8ieIsuCdVgTmh2CtJAXN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;161&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.14.49.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드를 해서 보면&amp;nbsp; SkeletonView가 적용하는 모습을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-video-to-gif (22).gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDmKu/btsz2nNI9xk/pNdCokKHlgzmCmfYv9JT0K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDmKu/btsz2nNI9xk/pNdCokKHlgzmCmfYv9JT0K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDmKu/btsz2nNI9xk/pNdCokKHlgzmCmfYv9JT0K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/FDmKu/btsz2nNI9xk/pNdCokKHlgzmCmfYv9JT0K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1302&quot; data-filename=&quot;ezgif.com-video-to-gif (22).gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 두번째 방법 - didSet 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; Cell에 데이터가 전달되면 실시간으로 SkeletionView를 볼 수 있도록 코드를 개선해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 configureUI 메서드로 데이터를 넘기고 있습니다. 실시간으로 반응을 할 수 있도록 &lt;b&gt;didSet&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;그래서 Cell에 &lt;b&gt;data: ExampleModel?&lt;/b&gt; 변수를 만들어주고 didSet으로 configureUI 메서드를 호출했습니다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.14.49.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CbFja/btsz52PjNHD/W8ieIsuCdVgTmh2CtJAXN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CbFja/btsz52PjNHD/W8ieIsuCdVgTmh2CtJAXN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CbFja/btsz52PjNHD/W8ieIsuCdVgTmh2CtJAXN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCbFja%2Fbtsz52PjNHD%2FW8ieIsuCdVgTmh2CtJAXN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;161&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.14.49.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보여지는 Cell 부분에서 개선된 코드&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.25.37.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chjhGz/btsz1gohQVO/N5AXO6FZkhlFQ6Lo9hMX3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chjhGz/btsz1gohQVO/N5AXO6FZkhlFQ6Lo9hMX3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chjhGz/btsz1gohQVO/N5AXO6FZkhlFQ6Lo9hMX3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchjhGz%2Fbtsz1gohQVO%2FN5AXO6FZkhlFQ6Lo9hMX3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;472&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.25.37.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.26.06.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnFoN8/btsz5kbHJLI/vMiVgwre27rPERHrWYLaR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnFoN8/btsz5kbHJLI/vMiVgwre27rPERHrWYLaR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnFoN8/btsz5kbHJLI/vMiVgwre27rPERHrWYLaR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnFoN8%2Fbtsz5kbHJLI%2FvMiVgwre27rPERHrWYLaR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;289&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.26.06.png&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ViewController에서 개선된 코드&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.27.13.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blO89f/btsz1Rha0YL/4iAaZbjWVkkIPp6lkyOe80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blO89f/btsz1Rha0YL/4iAaZbjWVkkIPp6lkyOe80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blO89f/btsz1Rha0YL/4iAaZbjWVkkIPp6lkyOe80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblO89f%2Fbtsz1Rha0YL%2F4iAaZbjWVkkIPp6lkyOe80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;175&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.27.13.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드된 것을 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-video-to-gif (21).gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgREK3/btsz1gu4DlF/KKlnziBo4QlKUJSETbRnuk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgREK3/btsz1gu4DlF/KKlnziBo4QlKUJSETbRnuk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgREK3/btsz1gu4DlF/KKlnziBo4QlKUJSETbRnuk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bgREK3/btsz1gu4DlF/KKlnziBo4QlKUJSETbRnuk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1302&quot; data-filename=&quot;ezgif.com-video-to-gif (21).gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;현재 적용된 코드에서 가장 중요한 부분이 있습니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Skeleton이 적용되는 시점을&amp;nbsp; 데이터가 전달 될 때&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp; 먼저 적용을 해주는 겁니다 .&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;그 후 일정한 시간이 지난 후 hideSkeletion을 시켜줍니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.42.23.png&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck7CzX/btsz1tgGgHz/vopLJ7rtGUmah9GZkMSpiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck7CzX/btsz1tgGgHz/vopLJ7rtGUmah9GZkMSpiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck7CzX/btsz1tgGgHz/vopLJ7rtGUmah9GZkMSpiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck7CzX%2Fbtsz1tgGgHz%2FvopLJ7rtGUmah9GZkMSpiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1620&quot; height=&quot;764&quot; data-filename=&quot;스크린샷 2023-11-09 오후 5.42.23.png&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>새싹</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/65</guid>
      <comments>https://yeomir.tistory.com/65#entry65comment</comments>
      <pubDate>Thu, 9 Nov 2023 17:41:15 +0900</pubDate>
    </item>
    <item>
      <title>앱 스토어 KO 언어 설정 방법</title>
      <link>https://yeomir.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱 커넥트에서&amp;nbsp; 기본언어 &lt;b&gt;한국어&lt;/b&gt;로 설정 했는데, 앱 스토어 EN으로 올라간적이 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설정 방법을 공유해보려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_BB74860E5098-1.jpeg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOuP8i/btsz5DoHy1k/pDfscGoXsoUkQB3WTAgotK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOuP8i/btsz5DoHy1k/pDfscGoXsoUkQB3WTAgotK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOuP8i/btsz5DoHy1k/pDfscGoXsoUkQB3WTAgotK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOuP8i%2Fbtsz5DoHy1k%2FpDfscGoXsoUkQB3WTAgotK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;186&quot; data-filename=&quot;IMG_BB74860E5098-1.jpeg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 첫번째 해당 xcode 파일의 오른쪽 클릭해서 &lt;b&gt;패키지 내용 보기&lt;/b&gt;로 들어갑니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 8.35.59.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWypFN/btsz53gz2Bb/wkXEh8bKDJPKvy2EURWppk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWypFN/btsz53gz2Bb/wkXEh8bKDJPKvy2EURWppk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWypFN/btsz53gz2Bb/wkXEh8bKDJPKvy2EURWppk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWypFN%2Fbtsz53gz2Bb%2FwkXEh8bKDJPKvy2EURWppk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2023-11-09 오후 8.35.59.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;pbxproj&lt;/b&gt; 파일을 엽니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 8.36.55.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P2Knq/btsz3eJXFa8/okMzQDPrGk1P8j5VBm38w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P2Knq/btsz3eJXFa8/okMzQDPrGk1P8j5VBm38w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P2Knq/btsz3eJXFa8/okMzQDPrGk1P8j5VBm38w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP2Knq%2Fbtsz3eJXFa8%2FokMzQDPrGk1P8j5VBm38w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;556&quot; data-filename=&quot;스크린샷 2023-11-09 오후 8.36.55.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;developmentRegion&lt;/b&gt;를 찾아서&amp;nbsp; en으로 되어 있는 부분을 &lt;b&gt;ko&lt;/b&gt;로 변경해주고 닫을 닫아주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-09 오후 8.38.42.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EeZfH/btsz1SgksSH/TYi1izTThhAIrhwU2s4mi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EeZfH/btsz1SgksSH/TYi1izTThhAIrhwU2s4mi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EeZfH/btsz1SgksSH/TYi1izTThhAIrhwU2s4mi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEeZfH%2Fbtsz1SgksSH%2FTYi1izTThhAIrhwU2s4mi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;258&quot; data-filename=&quot;스크린샷 2023-11-09 오후 8.38.42.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;Archive&lt;/b&gt;를 통해 업데이트를 합니다.&lt;/p&gt;</description>
      <category>새싹</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/64</guid>
      <comments>https://yeomir.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 31 Oct 2023 14:09:16 +0900</pubDate>
    </item>
    <item>
      <title>새싹 - 앱 출시 프로젝트 회고</title>
      <link>https://yeomir.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새싹 과정 2개월차에 앱 출시 프로젝트를 진행하게 되었습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개월동안 정말 많은 것들을 배웠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크(URLSesseion, Alamofire), DB(Realm), 다국어, UIButtonConfiguration, Delegate패턴, 싱글톤 패턴, AutoLayout, 값 전달 , CodeBase, ARC, MVC, MVVM, DiffableDataSource... 등등... (&lt;span style=&quot;color: #dddddd;&quot;&gt;이왜진... 2개월 동안 정말 쉴 새없이 달려왔네요&lt;/span&gt;)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개월이란 시간내에 단순히 지식을 전달하는 형식이 아니라 멘토님께서 정말 기초 개념부터 시작해서 빌드업으로 (&lt;span style=&quot;color: #dddddd;&quot;&gt;진짜 빌드업이... 넘사벽임...&lt;span style=&quot;color: #ffffff;&quot;&gt;갓잭&lt;/span&gt;&lt;/span&gt;) 비전공자들도 쉽게 이해 할 수 있게 &lt;s&gt;머리속에 때려 넣어주었고&lt;/s&gt; 데일리 과제를 통해 복습을 하며 배운 기술을 직접 적용해보며 습득 할 수 있게 해주었습니다. (&lt;span style=&quot;color: #dddddd;&quot;&gt;수업듣고 복습하고 데일리 과제하면... 보통 마무리 되는 시간은 새벽 1 ~ 2시였음...&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 11.51.25.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWSk1a/btsy5deaapO/YTLsfHMdsGjEGkqMwYLYE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWSk1a/btsy5deaapO/YTLsfHMdsGjEGkqMwYLYE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWSk1a/btsy5deaapO/YTLsfHMdsGjEGkqMwYLYE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWSk1a%2Fbtsy5deaapO%2FYTLsfHMdsGjEGkqMwYLYE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;370&quot; data-filename=&quot;스크린샷 2023-10-24 오후 11.51.25.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 담궈진 지식을 이제야 뽐낼 수 있는 앱 출시 프로젝트를 한다니 설레였고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획을 수정하고 수정하고 기능 추가하고 수정하고 기능 추가하고... 그렇게 앱은 거대해져갔습니다. (&lt;span style=&quot;color: #dddddd;&quot;&gt;이거... 한달만에 가능한거냐??&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 11.58.05.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEkAV/btsy4rjoSIb/eTMeWBxITwKQrSojAypOZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEkAV/btsy4rjoSIb/eTMeWBxITwKQrSojAypOZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEkAV/btsy4rjoSIb/eTMeWBxITwKQrSojAypOZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEkAV%2Fbtsy4rjoSIb%2FeTMeWBxITwKQrSojAypOZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;스크린샷 2023-10-24 오후 11.58.05.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막상 &lt;b&gt;이터레이션(기간에 내에 구현 정도)과&lt;/b&gt; &lt;b&gt;공수산정(해당 기능에 대한 구현 시간)&lt;/b&gt;을 해보니... 한 달안에 할 수없을 정도로 기능이 많아져서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능을 다시 빼서 공수산정을 다시 했습니다. 버전 1.0.0 에 꼭 들어가야할 핵심기능과 추후 업데이트 사항을 나누었고 우당탕탕 앱 만들기 시작하겠습니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 12.06.50.png&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NOukc/btsy6hgAFwr/Gy22dpeexQAJcVfKLJC2Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NOukc/btsy6hgAFwr/Gy22dpeexQAJcVfKLJC2Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NOukc/btsy6hgAFwr/Gy22dpeexQAJcVfKLJC2Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNOukc%2Fbtsy6hgAFwr%2FGy22dpeexQAJcVfKLJC2Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;560&quot; data-filename=&quot;스크린샷 2023-10-25 오전 12.06.50.png&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 12.10.07.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBpMzO/btsy03p3fNa/K6lEVuPLaZX8vkyzfER2t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBpMzO/btsy03p3fNa/K6lEVuPLaZX8vkyzfER2t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBpMzO/btsy03p3fNa/K6lEVuPLaZX8vkyzfER2t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBpMzO%2Fbtsy03p3fNa%2FK6lEVuPLaZX8vkyzfER2t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;201&quot; data-filename=&quot;스크린샷 2023-10-25 오전 12.10.07.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;앱 기획 배경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분들은 혹시 어렸을때 아파트 혹은 동네에서 아나바다 장터 열릴때면 신나서 이것저것 구경도 하고 먹을 걸 사먹었던 기억이 있으신가요? ( &lt;span style=&quot;color: #dddddd;&quot;&gt;피캬츄... 컵떡볶이...쥐포... &lt;span style=&quot;color: #dddddd;&quot;&gt;포켓몬 딱지..&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;) 장터가 열리는 기간에는 동네 전체가 놀이터가 되었었죠? ㅎㅎ 이러한 장터가 열릴때면 동네의 모든 이웃들이 나와 이야기 보따리를 풀고 물건을 사고 팔면서 한국의 정과 이웃사촌의 정을 느낄 수 있었고, 동네 전체가 활기가 돌았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 12.36.48.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UgOb3/btsy8lCIF2Y/4pMLQuMDPib4Bu8aSHhcBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UgOb3/btsy8lCIF2Y/4pMLQuMDPib4Bu8aSHhcBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UgOb3/btsy8lCIF2Y/4pMLQuMDPib4Bu8aSHhcBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUgOb3%2Fbtsy8lCIF2Y%2F4pMLQuMDPib4Bu8aSHhcBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2023-10-25 오전 12.36.48.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 점차 개인주의로 사회가 발전해가면서 아나바다 장터도 없어지고 이웃들간의 교류가 없어지면서 이웃사촌이라는 개념도 없어지고... 이웃간의 정도 없어지면서 &quot;1인분&quot; 이라는 것에 중점이 되가는 사회에서 &lt;b&gt;사람들간의 감정과 이야기가 오가는 곳이 어디에 있을까&lt;/b&gt;? 를 고민하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통시장을 떠 올리게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 여러분들은 현재 거주하는 곳에 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전통시장&lt;/b&gt;&lt;/span&gt;이&lt;/span&gt; 어디에 있는지 아시나요? 더 나아가 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;오일장&lt;/b&gt;&lt;/span&gt;이라고 들어보셨나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 요즘 트렌드로&amp;nbsp;&lt;b&gt;할매니얼( 할머니 + 밀레니얼 ) &lt;/b&gt;이라고 불립니다. 전통 디저트에 관심이 높아면서 약과, 떡, 한과 등 많은 부분이 재조명받고 있습니다. 이렇게 다시금 전통 디저트가 재조명을 받으면서 전통시장에 대해 관심도 높아졌지만, 막상 내 근처 전통시장이 어딨는지 모르는 경우가 많고 이러한 전통시장 위치 찾기는 인터넷 홈페이지에 있어 불편한 부분이 있었습니다. 이렇게 만들게 된 앱이&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;저잣거리&lt;/b&gt;&amp;nbsp; 앱입니다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_268EAB1590DC-1.jpeg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTNua/btsy4kdMvw0/gKVcMOPJIawiwWul9lNXj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTNua/btsy4kdMvw0/gKVcMOPJIawiwWul9lNXj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTNua/btsy4kdMvw0/gKVcMOPJIawiwWul9lNXj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTNua%2Fbtsy4kdMvw0%2FgKVcMOPJIawiwWul9lNXj0%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;500&quot; height=&quot;228&quot; data-filename=&quot;IMG_268EAB1590DC-1.jpeg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핵심 기능 보고 가실게요 ~&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ePpR/btszcpTc8lF/STmAvuEI798311YhnTNIc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ePpR/btszcpTc8lF/STmAvuEI798311YhnTNIc1/img.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1792&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_3527.PNG&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ePpR/btszcpTc8lF/STmAvuEI798311YhnTNIc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ePpR%2FbtszcpTc8lF%2FSTmAvuEI798311YhnTNIc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;1792&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCxav4/btszeh743QI/lWobUinnzFjXQFoaMHLG1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCxav4/btszeh743QI/lWobUinnzFjXQFoaMHLG1k/img.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1792&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_3529.PNG&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCxav4/btszeh743QI/lWobUinnzFjXQFoaMHLG1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCxav4%2Fbtszeh743QI%2FlWobUinnzFjXQFoaMHLG1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;1792&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch353e/btszcH0vPnI/kT46WDJJ5uUkr4Jc0eEvW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch353e/btszcH0vPnI/kT46WDJJ5uUkr4Jc0eEvW1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1792&quot; data-filename=&quot;IMG_3531.PNG&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch353e/btszcH0vPnI/kT46WDJJ5uUkr4Jc0eEvW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch353e%2FbtszcH0vPnI%2FkT46WDJJ5uUkr4Jc0eEvW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;1792&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전국 전통시장 위치 및 지역별 필터링 기능&amp;nbsp;&lt;/li&gt;
&lt;li&gt;클러스터 어노테이션을 사용하여 어노테이션 그룹화 구현&lt;/li&gt;
&lt;li&gt;커스텀 어노테이션 뷰 구현&lt;/li&gt;
&lt;li&gt;Pin 선택했을때 해당 시장 정보 및 기록 가능&amp;nbsp;&lt;/li&gt;
&lt;li&gt; 지도 축척에 따라 어노테이션 생성&lt;/li&gt;
&lt;li&gt;Realm을 사용하여 데이터 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;앱을 만들고 나서 느낀점&amp;nbsp; 보고 가실게요~&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 앱을 만들기 시작하면서 공수산정을 평소 구현 시간의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2.5 ~ 3배&lt;/b&gt;를 정했습니다.&amp;nbsp; 그 이유는 데일리 과제를 하면서 구현하는데만 집중했는데 이번에 앱을 만들면서 업데이트를 지속적으로 할 것이기 때문에 가독성과 리팩토링이 쉽게 구현하는것을 목표로 했습니다.&amp;nbsp; 그렇기 때문에 한줄의 코드를 작성하더라도 &quot;내가 한 달 후에 봐도 이해가능한 코드&quot;를 작성하는데 힘썼습니다. (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;많이 노력했지만... 아직도 갈길이 멀다 ㅠㅠ&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이번 3기에는&amp;nbsp; 오프라인과 온라인을 병행 했는데, 전 오프라인으로 매일 출근?했습니다. 오프라인에는 항상 멘토님들이 계셨고, 구현하려는 기능에 대해 5 ~ 7시간씩 붙잡고 있을때 멘토님께 피드백을 받을 수 있었고,&amp;nbsp;멘토님들이 업무를 보시다가 지나가시면서 &quot;이렇게 해보는건 어떨까요?&quot; 라는 소스를 던져주셔서 기능 구현하는데 정말 많은 도움이 되었습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Shout out Hue, Jack, Kokojong, Bran 그리고 팀원들!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;( 앱의 전체적인 플로우를 짧은 시간에 캐치하시고 설명해주시는데... 저도 열심히 공부해서 그런 역할을 하고 싶었습니다 ㅎㅎ )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 출시하면서 cs수업과 git 수업도 진행했고 학생들이 과부화 걸리지 않게 짧은 시간에 때려 넣어주시고... 또한 앱 출시 기간에 수업시간을 오전 10시로 변경하여 학생들에게 조금이라도 더 쉴 수 있게 배려해주셨습니다. (&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;어느새 배운 개념이 스며들어와 버렸다...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;늦은 새벽 시간까지 피드백을 주시고 누구보다 일찍 출근하시는&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;( 새벽 5시 출근...Hue님, Jack님 그저 빛...)&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;멘토님들을 보면서... 진짜 아낌없이 주는 나무 같다고 느꼈습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-29 오후 9.38.00.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7Lfr8/btszkpeKzca/Hqe6l9Krw0gatwN24IssJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7Lfr8/btszkpeKzca/Hqe6l9Krw0gatwN24IssJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7Lfr8/btszkpeKzca/Hqe6l9Krw0gatwN24IssJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7Lfr8%2FbtszkpeKzca%2FHqe6l9Krw0gatwN24IssJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;456&quot; data-filename=&quot;스크린샷 2023-10-29 오후 9.38.00.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉬웠던점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2달간 정말 많은 기술을 짧은 시간에 배웠지만... 이번 앱 출시했을때 많이 활용하지 못한거 같아서 아쉬운점이 남았습니다. 특히 출시하기 전에 배운 DiffableDatasource와 CompositionalLayout을 시도했지만 제대로 활용하지 못해서 기존에 사용하던 UITableView와 UICollectionView를 사용했습니다. 그래서 지속적으로 부족한 부분을 공부해가면서 활용하지 못했던 기술을 업데이트 하면서 앱을 더욱 풍성하고 사용자가 사용하기 편한 앱으로 발전해나가도록 하겠습니다.&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;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 앱을 구현하면서 겪었던 트러블 슈팅입니다&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;트러블 슈팅&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전통시장 API를 Realm에 저장할때 MainThread에서 작업이 이뤄졌을때 대략 1500개 가량의 데이터를 Realm에 저장하는데 걸리는 시간은 대략 9 ~ 11초 정도 걸렸고, 그동안 사용자의 터치 이벤트를 받을 수 없었음&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 4.44.28.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QwuOs/btszf6kBIWy/MElEGHaV8nHThaLs8C87u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QwuOs/btszf6kBIWy/MElEGHaV8nHThaLs8C87u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QwuOs/btszf6kBIWy/MElEGHaV8nHThaLs8C87u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQwuOs%2Fbtszf6kBIWy%2FMElEGHaV8nHThaLs8C87u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;112&quot; data-filename=&quot;스크린샷 2023-10-26 오후 4.44.28.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결 방법 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DispathGroup&lt;/b&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DispatchQueue.global()&lt;/b&gt;을 사용하여 데이터를 한번에 모으고 다른 쓰레드에서 저장하도록 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. API 데이터를 DispathGroup으로 묶는 작업 - 공공데이터 포털에서 한번의 API 콜로 최대 100개까지밖에 얻을 수 없어서 총 16번의 반복을 거쳐 데이터 저장했음&lt;/p&gt;
&lt;pre id=&quot;code_1698305384773&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MarketAPIManager {
    static let shared = MarketAPIManager()
    
    private init() { }
    
    let realm = try! Realm()
    
    var pageCount = Array(1...16)
    
    let realmManager = RealmManager()
    
    var aa: [Item] = []
    
    var marketList: TraditionalMarket = TraditionalMarket(response: Response.init(body: Body.init(items: [], totalCount: &quot;&quot;, numOfRows: &quot;&quot;, pageNo: &quot;&quot;)))
    
    let group = DispatchGroup()
    
    func request() {
        for page in pageCount {
            group.enter()
            NetworkManager.shared.request(api: .marketInfomation(page: &quot;\(page)&quot;)) { [weak self] response in
                
                guard let self else { return }
                marketList.response.body.items.append(contentsOf:response)
                group.leave()
            }
        }
        
        group.notify(queue: DispatchQueue.main) { [weak self] in
            guard let self else { return }
            
            self.realmManager.addDatas(markets: self.marketList.response.body.items)
            print(&quot;마켓 이름들 : \(self.marketList.response.body.items.count)&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. Realm이 DispatchQueue.global()을 사용해서 비동기로 저장&lt;/p&gt;
&lt;pre id=&quot;code_1698305617309&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    func addDatas(markets: [Item]) {
        let latitudeZeroFilterdMarket = markets.filter { $0.latitude != &quot;&quot;}
        DispatchQueue.global().async {
            let realm = try! Realm()
            let traditionalMarkets = latitudeZeroFilterdMarket.map {
                TraditionalMarketRealm(marketName: $0.marketName, marketType: $0.marketType, loadNameAddress: $0.loadNameAddress, address: $0.address, marketOpenCycle: $0.marketOpenCycle, publicToilet: $0.publicToilet, latitude: $0.latitude, longitude: $0.longitude, popularProducts: $0.popularProducts, phoneNumber: $0.phoneNumber)
                
            }
            
            let allOfTraditionalMarket = traditionalMarkets + self.userDirectAddMarket()
            
            try! realm.write {
                realm.add(allOfTraditionalMarket)
            }
        }
        
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Realm은 무결성 및 일관성을 유지하기 위해 다른쓰레드에서 이벤트가 들어오는것을 지양하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서를 보면&amp;nbsp; DB에 락을 사용한다고 적혀있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 4.38.37.png&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkOat1/btszcoUmFfS/AkFzxjk1COkSmK9KwLK6EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkOat1/btszcoUmFfS/AkFzxjk1COkSmK9KwLK6EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkOat1/btszcoUmFfS/AkFzxjk1COkSmK9KwLK6EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkOat1%2FbtszcoUmFfS%2FAkFzxjk1COkSmK9KwLK6EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2023-10-26 오후 4.38.37.png&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이번 프로젝트의 경우 단지 저장만 하는 경우이기 때문에 비동기로 저장이 가능 했고, 비동기로 저장되는 동안 MainThread에서는 단지 Read만 하고 있기에 충돌 없이 적용 할 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TimeInterval을 사용해서 결과를 비교해보았습니다.&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/QwuOs/btszf6kBIWy/MElEGHaV8nHThaLs8C87u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QwuOs/btszf6kBIWy/MElEGHaV8nHThaLs8C87u1/img.png&quot; style=&quot;width: 48.9053%; margin-right: 10px;&quot; data-widthpercent=&quot;49.48&quot; data-filename=&quot;스크린샷 2023-10-26 오후 4.44.28.png&quot; data-origin-height=&quot;150&quot; data-origin-width=&quot;1048&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QwuOs/btszf6kBIWy/MElEGHaV8nHThaLs8C87u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQwuOs%2Fbtszf6kBIWy%2FMElEGHaV8nHThaLs8C87u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cINcly/btszdeYaqco/Ru2SflWqTi3z4EK7JkwNH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cINcly/btszdeYaqco/Ru2SflWqTi3z4EK7JkwNH0/img.png&quot; style=&quot;width: 49.9319%;&quot; data-widthpercent=&quot;50.52&quot; data-filename=&quot;스크린샷 2023-10-26 오후 4.44.49.png&quot; data-origin-height=&quot;150&quot; data-origin-width=&quot;1070&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cINcly/btszdeYaqco/Ru2SflWqTi3z4EK7JkwNH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcINcly%2FbtszdeYaqco%2FRu2SflWqTi3z4EK7JkwNH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;150&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;&lt;span style=&quot;color: #8a3db6;&quot;&gt;2023.10.30 수정 ---&amp;gt; Realm에 비동기 처리를 해주는 메서드가 있었습니다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-30 오후 6.02.03.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lVtE7/btszuxiuaiA/fKzcKHXqDS3JNeqU2EKv4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lVtE7/btszuxiuaiA/fKzcKHXqDS3JNeqU2EKv4K/img.png&quot; data-alt=&quot;Realm 공식문서 출처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lVtE7/btszuxiuaiA/fKzcKHXqDS3JNeqU2EKv4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlVtE7%2FbtszuxiuaiA%2FfKzcKHXqDS3JNeqU2EKv4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;371&quot; data-filename=&quot;스크린샷 2023-10-30 오후 6.02.03.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Realm 공식문서 출처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 왜 이제야 알았는지... Realm에 비동기로 저장하려고 3일 꼬박 했었는데... 리팩토링한 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698656644006&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    func addDatas(markets: [Item]) {
        let latitudeZeroFilterdMarket = markets.filter { $0.latitude != &quot;&quot;}

        realm.writeAsync {
            let traditionalMarkets = latitudeZeroFilterdMarket.map {
                TraditionalMarketRealm(marketName: $0.marketName, marketType: $0.marketType, loadNameAddress: $0.loadNameAddress, address: $0.address, marketOpenCycle: $0.marketOpenCycle, publicToilet: $0.publicToilet, latitude: $0.latitude, longitude: $0.longitude, popularProducts: $0.popularProducts, phoneNumber: $0.phoneNumber)
                
            }
            
            let allOfTraditionalMarket = traditionalMarkets + self.userDirectAddMarket()
            
            self.realm.add(allOfTraditionalMarket)
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MapViewController의 비대해진 코드량 -&amp;gt; CustomView를 만들고 Viewmodel 접목&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MapViewController에 많은 기능이 있다보니 코드량이 700줄 정도였기에 리팩토링이 필요했습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CustomView&lt;/b&gt;에 CLLocation과 Mapkit를 코드 분리를 하였고,&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Viewmodel을 활용&lt;/b&gt;하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가독성과 기능 분리&lt;/b&gt;에 했습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;CustomView로 리팩토링후 데이터 전달을 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;delegate&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;completion&lt;/b&gt;을 활용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;코드의 가독성&lt;/b&gt;을 높였습니다.&lt;/li&gt;
&lt;/ul&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/JI2MV/btszbNNO1pp/XJrlpFc1XyyzF3HHR9xi50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JI2MV/btszbNNO1pp/XJrlpFc1XyyzF3HHR9xi50/img.png&quot; style=&quot;width: 30.9488%; margin-right: 10px;&quot; data-widthpercent=&quot;31.69&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.13.43.png&quot; data-origin-height=&quot;496&quot; data-origin-width=&quot;1132&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JI2MV/btszbNNO1pp/XJrlpFc1XyyzF3HHR9xi50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJI2MV%2FbtszbNNO1pp%2FXJrlpFc1XyyzF3HHR9xi50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E5xrs/btszcomAJBg/ZRtQVMKDoHJ1kuQ3PfMn61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E5xrs/btszcomAJBg/ZRtQVMKDoHJ1kuQ3PfMn61/img.png&quot; style=&quot;width: 32.3204%; margin-right: 10px;&quot; data-widthpercent=&quot;33.09&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.14.38.png&quot; data-origin-height=&quot;506&quot; data-origin-width=&quot;1206&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E5xrs/btszcomAJBg/ZRtQVMKDoHJ1kuQ3PfMn61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE5xrs%2FbtszcomAJBg%2FZRtQVMKDoHJ1kuQ3PfMn61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfaTuY/btszf1RlJqO/6GpSEN8rNK6ikzxRrnHUyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfaTuY/btszf1RlJqO/6GpSEN8rNK6ikzxRrnHUyk/img.png&quot; style=&quot;width: 34.4052%;&quot; data-widthpercent=&quot;35.22&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.20.34.png&quot; data-origin-height=&quot;350&quot; data-origin-width=&quot;888&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfaTuY/btszf1RlJqO/6GpSEN8rNK6ikzxRrnHUyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfaTuY%2Fbtszf1RlJqO%2F6GpSEN8rNK6ikzxRrnHUyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Alamofire URLRequestConvertible를 활용한 네트워크 통신&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;공공데이터 포털 전통시장 API 와 네이버 이미지 API 를 활용하기 때문에 Network파일에 따로 처리를 해주었습니다. 코드의 간결함과 기능 분리를 위해 Router 패턴을 활용하여 코드 정리 했습니다. 그렇기에 Network 파일에는 문자열이 들어가지 않게 되었고, 가독성이 증가했습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.29.02.png&quot; data-origin-width=&quot;1740&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d34bDR/btszfGT45TA/l1fKT5IsUbLknrUmCHUxcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d34bDR/btszfGT45TA/l1fKT5IsUbLknrUmCHUxcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d34bDR/btszfGT45TA/l1fKT5IsUbLknrUmCHUxcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd34bDR%2FbtszfGT45TA%2Fl1fKT5IsUbLknrUmCHUxcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;345&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.29.02.png&quot; data-origin-width=&quot;1740&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Router 파일의 일부분을 보여주자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enum으로 전통시장 API와 네이버 이미지 API를 구분하고 EndPoint와 Header,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Parameter의 방식으로 설정했습니다.&lt;/span&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/ckJIyX/btszbhazLLf/7FfPQzudR3kvKLjVIMbJ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckJIyX/btszbhazLLf/7FfPQzudR3kvKLjVIMbJ70/img.png&quot; style=&quot;width: 33.1734%; margin-right: 10px;&quot; data-widthpercent=&quot;33.56&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.30.15.png&quot; data-origin-height=&quot;1020&quot; data-origin-width=&quot;1720&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckJIyX/btszbhazLLf/7FfPQzudR3kvKLjVIMbJ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckJIyX%2FbtszbhazLLf%2F7FfPQzudR3kvKLjVIMbJ70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0aTP6/btszfIRWwqw/7Q42Kr9EHghRIv4tmivd91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0aTP6/btszfIRWwqw/7Q42Kr9EHghRIv4tmivd91/img.png&quot; style=&quot;width: 65.6639%;&quot; data-widthpercent=&quot;66.44&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.31.00.png&quot; data-origin-height=&quot;592&quot; data-origin-width=&quot;1976&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0aTP6/btszfIRWwqw/7Q42Kr9EHghRIv4tmivd91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0aTP6%2FbtszfIRWwqw%2F7Q42Kr9EHghRIv4tmivd91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1976&quot; height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Map의 축척에 따라 해당 영역에 포함된 Realm 데이터 필터링하기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; map의 축척에 따라 해당 영역의 Realm 데이터만 불러오기 위해서는 일단 map의 최소 최대 span값을 구해야 했습니다. 현재 map의 보여지는 영역에서 상,하,좌,우 span 값을 구했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.47.50.png&quot; data-origin-width=&quot;2162&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJNIX/btszgn7Ji1d/iXtZi3GNgk75Jz6H7l4zn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJNIX/btszgn7Ji1d/iXtZi3GNgk75Jz6H7l4zn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJNIX/btszgn7Ji1d/iXtZi3GNgk75Jz6H7l4zn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJNIX%2Fbtszgn7Ji1d%2FiXtZi3GNgk75Jz6H7l4zn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2162&quot; height=&quot;830&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.47.50.png&quot; data-origin-width=&quot;2162&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상, 하, 좌 , 우 값으로 나온 데이터를 기준으로 해당 값의 사이값에 있는 것들만 가져오기 위한 필터링은 Realm에서 제공해주는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;filter&lt;/b&gt;메서드를 이용했습니다.&amp;nbsp; Realm에서는 필터링을 할때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;where&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;filter&lt;/b&gt;를 제공하는데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;filter가 속도 측면&lt;/b&gt;에서 더 빠르기 때문에 사용했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.52.41.png&quot; data-origin-width=&quot;2178&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBFYBX/btszgZesxs8/FdcAupTGFfCaRjX6ByGsnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBFYBX/btszgZesxs8/FdcAupTGFfCaRjX6ByGsnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBFYBX/btszgZesxs8/FdcAupTGFfCaRjX6ByGsnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBFYBX%2FbtszgZesxs8%2FFdcAupTGFfCaRjX6ByGsnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2178&quot; height=&quot;606&quot; data-filename=&quot;스크린샷 2023-10-26 오후 5.52.41.png&quot; data-origin-width=&quot;2178&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;Realm에서 filter를 사용하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;BETWEEN&lt;/b&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: left;&quot;&gt;을 사용하여 Latitude의 상, 하 값 사이에 있는 Realm 데이터를 필터링 적용함&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>새싹</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/62</guid>
      <comments>https://yeomir.tistory.com/62#entry62comment</comments>
      <pubDate>Wed, 25 Oct 2023 01:17:10 +0900</pubDate>
    </item>
    <item>
      <title>Realm을 사용시 이미지를 Documents에 저장할때 이미지 URL로 저장하는 방법은?</title>
      <link>https://yeomir.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size14&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Realm을&amp;nbsp;사용시&amp;nbsp;이미지를&amp;nbsp;Documents에&amp;nbsp;저장할때&amp;nbsp;이미지&amp;nbsp;URL로&amp;nbsp;저장하는&amp;nbsp;방법은?&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;결론을 미리 말하자면&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;고유한 ID로 설정하자!!&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;경로와 jpg로 변환하는 함수를 만들고&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693927296775&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    // MARK: - 도큐먼트 폴더에 이미지 파일 저장하는 메서드
    func saveImageFileToDocument(fileName: String, image: UIImage) {
        
        // 1. 도큐먼트 폴더 경로 찾기
        guard let documnentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        // 2. 경로 찾기
        let fileUrl = documnentDirectory.appendingPathComponent(fileName)
        print(&quot;fileUrl&quot;,fileUrl)
        // 3. 이미지 변환
        guard let data = image.jpegData(compressionQuality: 0.5) else { return }
        
        // 4. 이미지 저장
        do {
            try data.write(to: fileUrl)
            print(&quot;document에 생성된 사진 주소 : \(data)&quot;)
        } catch {
            print(error)
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 이렇게 사용합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.22.16.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;29&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYOs4Q/btss9CxsTj7/hdOpodwKb8LA2rMwr6k561/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYOs4Q/btss9CxsTj7/hdOpodwKb8LA2rMwr6k561/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYOs4Q/btss9CxsTj7/hdOpodwKb8LA2rMwr6k561/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYOs4Q%2Fbtss9CxsTj7%2FhdOpodwKb8LA2rMwr6k561%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;785&quot; height=&quot;29&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.22.16.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;29&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 의문이 하나 들었습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;고유한것만 들어가면 되는거 아니야?? 굳이 ID만 넣어야돼??&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 의문점과 호기심에서 시작한 포스팅입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;(참 사서 고생한다 그쵸? ㅋㅋ)&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Documents 파일에 이미지가 어떻게 저장되는지 부터 뜯어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;saveImageFileToDoucumnet(fileName: tasks._id, image: cell.bookImage.image!)메소드가 실행이되면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.31.42.png&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t3eVE/btsteAFGvOq/YdqkGnajDZSgEujKZdPxk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t3eVE/btsteAFGvOq/YdqkGnajDZSgEujKZdPxk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t3eVE/btsteAFGvOq/YdqkGnajDZSgEujKZdPxk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft3eVE%2FbtsteAFGvOq%2FYdqkGnajDZSgEujKZdPxk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1239&quot; height=&quot;419&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.31.42.png&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다음과 같이 Document 파일에 id.jpg 형식으로 저장이 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.33.57.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXg5XK/btstfRGVmlf/RlNmkM0TlUcflrDuyG4grk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXg5XK/btstfRGVmlf/RlNmkM0TlUcflrDuyG4grk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXg5XK/btstfRGVmlf/RlNmkM0TlUcflrDuyG4grk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXg5XK%2FbtstfRGVmlf%2FRlNmkM0TlUcflrDuyG4grk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1062&quot; height=&quot;291&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.33.57.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 고유한 ID 말고 임의의 값을 만들어서 넣게되면 어떻게 될까요??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.37.00.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wgrKA/btstfRGVnVo/TZeFapeojiT6W9FujrEuF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wgrKA/btstfRGVnVo/TZeFapeojiT6W9FujrEuF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wgrKA/btstfRGVnVo/TZeFapeojiT6W9FujrEuF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwgrKA%2FbtstfRGVnVo%2FTZeFapeojiT6W9FujrEuF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;50&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.37.00.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.39.00.png&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/szg2O/btss85s74Z2/FB624iwjthfuxWXe1RFfrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/szg2O/btss85s74Z2/FB624iwjthfuxWXe1RFfrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/szg2O/btss85s74Z2/FB624iwjthfuxWXe1RFfrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fszg2O%2Fbtss85s74Z2%2FFB624iwjthfuxWXe1RFfrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;84&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.39.00.png&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 저희가 정한 이름으로 저장은 되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;saveImageFileToDocument 메소드를 호출하게 되면&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;새로운 이미지 파일이 생성되지 않고&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp; 기존 이미지에 덮어 씌어지게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 다들 아시죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(영차!)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 ~ 그래서 고유한 ID를 사용해서 겹치지 않게 저장하는거구나&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 여기서 기출변형 들어갑니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 고유한게 ID만 있는게 아닌데... &lt;span style=&quot;color: #006dd7;&quot;&gt;이미지의 주소값&lt;/span&gt;도 고유하니까 가능하지 않아?&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 해봤습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693928796892&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;selectedItem.thumbnail : 카카오톡 book url 입니다.
saveImageFileToDocument(fileName: &quot;\(selectedItem.thumbnail).jpg&quot;, image: cell.bookImage.image!)

// 카카오톡 url 주소 : https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F6092351%3Ftimestamp%3D20230905155030&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 발생하고 Document 파일에 이미지는 추가되지 않았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 12.47.03.png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pAf04/btstaA7fV86/jAdRb1hplLz7tFOBxDUwK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pAf04/btstaA7fV86/jAdRb1hplLz7tFOBxDUwK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pAf04/btstaA7fV86/jAdRb1hplLz7tFOBxDUwK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpAf04%2FbtstaA7fV86%2FjAdRb1hplLz7tFOBxDUwK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;92&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 12.47.03.png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.47.51.png&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yijVP/btsteT6dgPd/h96X1VdGrWBNEn0yEYhlN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yijVP/btsteT6dgPd/h96X1VdGrWBNEn0yEYhlN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yijVP/btsteT6dgPd/h96X1VdGrWBNEn0yEYhlN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyijVP%2FbtsteT6dgPd%2Fh96X1VdGrWBNEn0yEYhlN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;72&quot; data-filename=&quot;스크린샷 2023-09-06 오전 12.47.51.png&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;주소 &quot;http ~~&quot; 가 존재하지 않아&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;엥? 이게 무슨일이죠?&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;009&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분명 각 이미지마다 고유한 주소를 갖고 있는데 말이죠...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;받아온 이미지 url ( 여기서는 카카오톡 book 이미지 url)에...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;/&amp;nbsp; 가 있기 때문입니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 무슨 일이죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;s&gt;(오늘 포스팅 쉽지 않을거 같다...그 춋?)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 디렉토리는&lt;b&gt; 파일을 읽을때 / 를 기준으로 인식하게 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 현재 프로젝트가 어디에 위치에 있는 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 1.07.34.png&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck0EBN/btss9A0IYXl/0Kp7k9vgsMAZZEMpZZifW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck0EBN/btss9A0IYXl/0Kp7k9vgsMAZZEMpZZifW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck0EBN/btss9A0IYXl/0Kp7k9vgsMAZZEMpZZifW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck0EBN%2Fbtss9A0IYXl%2F0Kp7k9vgsMAZZEMpZZifW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1124&quot; height=&quot;66&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 1.07.34.png&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.11.39.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqo2dl/btstfnTyzrz/wCHKNfNlTCKW9RiJf4DfV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqo2dl/btstfnTyzrz/wCHKNfNlTCKW9RiJf4DfV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqo2dl/btstfnTyzrz/wCHKNfNlTCKW9RiJf4DfV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqo2dl%2FbtstfnTyzrz%2FwCHKNfNlTCKW9RiJf4DfV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;89&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.11.39.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ 를 기준으로 파일로 접근하는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그렇다면 컴파일 오류가 났던 부분을 다시 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 1.17.42.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baifjs/btss706DEov/e3UxshP1Rry2zoQq56HD6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baifjs/btss706DEov/e3UxshP1Rry2zoQq56HD6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baifjs/btss706DEov/e3UxshP1Rry2zoQq56HD6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaifjs%2Fbtss706DEov%2Fe3UxshP1Rry2zoQq56HD6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;113&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 1.17.42.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;~ &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Documents/&lt;/b&gt;&lt;/span&gt; 뒤로 보면 https:&lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt;/&amp;nbsp; 쏼라 쏼라 &lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt; 쏼 / ....&lt;span style=&quot;color: #ee2323;&quot;&gt;/&amp;nbsp;&lt;/span&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;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt;가 있네? 그럼 &lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt;를 기준으로 파일에 접근하자...&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.42.20.png&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4biML/btss3H0tidU/NK8eT3hzo3QHjUTaajezuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4biML/btss3H0tidU/NK8eT3hzo3QHjUTaajezuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4biML/btss3H0tidU/NK8eT3hzo3QHjUTaajezuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4biML%2Fbtss3H0tidU%2FNK8eT3hzo3QHjUTaajezuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;204&quot; height=&quot;175&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.42.20.png&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇다면... 받아온 이미지URL를 로직을 통해&lt;br /&gt;/ 를 모두 제거하면 가능하지 않나요?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 가능은 합니다만 그것은 독자분들께 양보겠습니다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;(절대 하기 싫어서 아님니다... 아닐게요...)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오 url에서 / 만 제거하는 방법은 무엇이 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로&amp;nbsp; replacingOccurrences 메소드를 이용하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694020021989&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;replacingOccurrences(of: , with: )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용해보도록하죠&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-07 오전 2.10.56.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EjcqG/btstkrorKRM/CkJ5Zde8ORqdhHJ6ZDiBBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EjcqG/btstkrorKRM/CkJ5Zde8ORqdhHJ6ZDiBBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EjcqG/btstkrorKRM/CkJ5Zde8ORqdhHJ6ZDiBBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEjcqG%2FbtstkrorKRM%2FCkJ5Zde8ORqdhHJ6ZDiBBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;200&quot; data-filename=&quot;스크린샷 2023-09-07 오전 2.10.56.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-07 오전 2.07.42.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsqmPu/btstmrORnY6/rKV1kkOg5Mb36vF1lSjVaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsqmPu/btstmrORnY6/rKV1kkOg5Mb36vF1lSjVaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsqmPu/btstmrORnY6/rKV1kkOg5Mb36vF1lSjVaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsqmPu%2FbtstmrORnY6%2FrKV1kkOg5Mb36vF1lSjVaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1308&quot; height=&quot;148&quot; data-filename=&quot;스크린샷 2023-09-07 오전 2.07.42.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-07 오전 2.08.23.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzQU1t/btsteLVJc0E/6AzOLJpyVIZkbdGDY1JdZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzQU1t/btsteLVJc0E/6AzOLJpyVIZkbdGDY1JdZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzQU1t/btsteLVJc0E/6AzOLJpyVIZkbdGDY1JdZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzQU1t%2FbtsteLVJc0E%2F6AzOLJpyVIZkbdGDY1JdZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1694&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2023-09-07 오전 2.08.23.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Documents / 뒤로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/가 모두 빠진 것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;s&gt;쉽고 간단한 ID를 쓰면... 번거로운 작업 안해도 되겠죠? ㅎㅎ&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FileManager는 디렉토리를&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt; /&lt;/span&gt; 를 기준으로 인식하기 때문에&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;url에 &lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt;가 있으면 컴파일 에러가 발생하고 이미지가 Documents에 저장되지 않는다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(심심하면 직접 해보세요...권장합니다 ㅎㅎ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇다면 / 가 없으면 어떤것이든 되나요?&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;s&gt;(너 참 끈질기구나...)&lt;/s&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt; 만 없다면 무엇이든 이름을 정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.23.05.png&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baw47S/btss92CMhvq/Uy2YnotiIe4nKcJkYoB8A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baw47S/btss92CMhvq/Uy2YnotiIe4nKcJkYoB8A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baw47S/btss92CMhvq/Uy2YnotiIe4nKcJkYoB8A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaw47S%2Fbtss92CMhvq%2FUy2YnotiIe4nKcJkYoB8A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;41&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.23.05.png&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실헹을 해보면 새롭게 정의한 이름으로 만들어진것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.24.03.png&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JRhyJ/btss3X3yiZd/odjkfdPYZp6BnLhusK4E51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JRhyJ/btss3X3yiZd/odjkfdPYZp6BnLhusK4E51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JRhyJ/btss3X3yiZd/odjkfdPYZp6BnLhusK4E51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJRhyJ%2Fbtss3X3yiZd%2FodjkfdPYZp6BnLhusK4E51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;93&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.24.03.png&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론... saveImageFileToDocument()메소드를 또 실행하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유하지 않기 때문에 파일이 덮어씌어 집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;아 ~ 카카오톡 이미지 url이 잘못된게 아니고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;디렉토리 인식문제구나&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;네 맞습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이대로 끝내면 재미없겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그렇게 인식하는지 찾아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바탕화면에 /test 파일명으로 만들어보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.29.11.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBBmyV/btstbdDZjrh/fGiiJV0YprceA7KZk7I8sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBBmyV/btstbdDZjrh/fGiiJV0YprceA7KZk7I8sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBBmyV/btstbdDZjrh/fGiiJV0YprceA7KZk7I8sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBBmyV%2FbtstbdDZjrh%2FfGiiJV0YprceA7KZk7I8sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;274&quot; height=&quot;268&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.29.11.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널로 현재 바탕화면에 있는 것들을 찍어보면&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;:test 라고 보입니다.&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.30.44.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjsLTw/btss3HF8Taw/PofB2tpidMRhLRfQw9wuBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjsLTw/btss3HF8Taw/PofB2tpidMRhLRfQw9wuBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjsLTw/btss3HF8Taw/PofB2tpidMRhLRfQw9wuBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjsLTw%2Fbtss3HF8Taw%2FPofB2tpidMRhLRfQw9wuBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;96&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.30.44.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명을&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt;test라고 만들었는데... 어떻게 된 일까요??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플에서는 파일명에 &lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt; 가 들어가 있으면 디렉토리 인식을 위해 : 으로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이런 경우에는 어떻게 터미널에 표현 될까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.37.37.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sugqU/btss72pYYFu/qOLRBzaJujHIzacjUKcXeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sugqU/btss72pYYFu/qOLRBzaJujHIzacjUKcXeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sugqU/btss72pYYFu/qOLRBzaJujHIzacjUKcXeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsugqU%2Fbtss72pYYFu%2FqOLRBzaJujHIzacjUKcXeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2023-09-06 오전 1.37.37.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 1.38.13.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dnxs7/btstgg7IGlk/m0zxMFwO5Jc76yjSoBM1kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dnxs7/btstgg7IGlk/m0zxMFwO5Jc76yjSoBM1kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dnxs7/btstgg7IGlk/m0zxMFwO5Jc76yjSoBM1kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDnxs7%2Fbtstgg7IGlk%2Fm0zxMFwO5Jc76yjSoBM1kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;36&quot; data-filename=&quot;edited_스크린샷 2023-09-06 오전 1.38.13.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\가 있기는 하지만 &lt;span style=&quot;color: #ee2323;&quot;&gt;/&lt;/span&gt; 자리는 &lt;span style=&quot;color: #006dd7;&quot;&gt;:&lt;/span&gt; 으로 대체되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;애플의 정책을 따르는 Xcode에서도 역시나 적용하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의 한줄 평 : 고유 ID를 사용하자...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 먼저해보고 대신해보는 아무 개발자 였습니다.&lt;/p&gt;</description>
      <category>새싹</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/59</guid>
      <comments>https://yeomir.tistory.com/59#entry59comment</comments>
      <pubDate>Wed, 6 Sep 2023 01:58:33 +0900</pubDate>
    </item>
    <item>
      <title>URLSession에서 Generic 사용하기</title>
      <link>https://yeomir.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;API 통신 하면서 여러 API를 불러오게 되면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 URLSession을 만들어 데이터를 불러와야 됐다...&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;한개의 URLSession만 만들어서&lt;/b&gt; 사용할 수 있는 방법은 없을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 출발한 포스팅입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 시작하겠습니다.&amp;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;일단 VC를 깔끔하게 사용하기 위해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VC, View, Cell을 분리해주었습니다.&lt;br /&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;( 배운거 사용하고 싶었어요...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cell을 먼저 만듭니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1693549742597&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit
import SnapKit

class FirstCell : UICollectionViewCell {
    
    let imageView = {
        let image = UIImageView()
        image.backgroundColor = .gray
        image.contentMode = .scaleToFill
        return image
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        configureView()
        setConstraints()
    }
    
    required init?(coder: NSCoder) {
        fatalError(&quot;init(coder:) has not been implemented&quot;)
    }
    
    func configureView() {
       contentView.addSubview(imageView)
    }
    
    func setConstraints() {
        imageView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;View를 만들어 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1693549727477&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class FirstView: UIView {
    
    lazy var collectionView = {
        let view = UICollectionView(frame: .zero, collectionViewLayout: setCollectionViewFlowLayout())
        view.register(FirstCell.self, forCellWithReuseIdentifier: String(describing: FirstCell.self))
        return view
    }()
    
    private func setCollectionViewFlowLayout() -&amp;gt; UICollectionViewFlowLayout {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        let spacing: CGFloat = 8
        let width = UIScreen.main.bounds.width - (spacing * 4)
        layout.itemSize = CGSize(width: width / 3, height: width / 3)
        layout.minimumLineSpacing = spacing
        layout.minimumInteritemSpacing = spacing
        layout.sectionInset = UIEdgeInsets(top: spacing, left: spacing, bottom: spacing, right: spacing)
        return layout
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        configureView()
        setConstraints()
    }
    
    required init?(coder: NSCoder) {
        fatalError(&quot;init(coder:) has not been implemented&quot;)
    }
    
    func configureView() {
        self.addSubview(collectionView)
    }
    
    func setConstraints() {
        collectionView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;viewDidLoad()가 로드 되기 전에 loadView()에서 먼저 로드를 진행시킵니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜냐하면 FirstVC의 &lt;b&gt;RootView&lt;/b&gt;에 먼저&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;커스텀 FirstView를 적용&lt;/span&gt;하기 위해서 입니다. &amp;lt;- 시점의 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 3.33.00.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oyfik/btssPuTtcxG/wLkVVd4KwfyMH3WvuE2Pak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oyfik/btssPuTtcxG/wLkVVd4KwfyMH3WvuE2Pak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oyfik/btssPuTtcxG/wLkVVd4KwfyMH3WvuE2Pak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOyfik%2FbtssPuTtcxG%2FwLkVVd4KwfyMH3WvuE2Pak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;234&quot; data-filename=&quot;스크린샷 2023-09-01 오후 3.33.00.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;300&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 코드 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1693553998772&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//
//  ViewController.swift
//  URLSession+Generic
//
//  Created by 염성필 on 2023/09/01.
//

import UIKit

class FristViewController: UIViewController {
    
    let firstView = FirstView()
    
    override func loadView() {
        self.view = firstView
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()
        configureView()
    }
    
    func configureView() {
        firstView.collectionView.dataSource = self
        firstView.collectionView.delegate = self
        firstView.collectionView.register(FirstCell.self, forCellWithReuseIdentifier: String(describing: FirstCell.self))
    }
}

extension FristViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&amp;gt; Int {
        return 10
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&amp;gt; UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: FirstCell.self), for: indexPath) as? FirstCell else { return UICollectionViewCell() }
        return cell
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 VC에 다 넣은것보다 간결해졌쥬?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;simulator_screenshot_BA3195E0-0A59-46D2-B3F7-BDBB8572D621.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9alj/btssHzhCmYz/yMTYFN4bLtuQH57kKkR13k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9alj/btssHzhCmYz/yMTYFN4bLtuQH57kKkR13k/img.png&quot; data-alt=&quot;시뮬레이터 콜렉션 뷰&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9alj/btssHzhCmYz/yMTYFN4bLtuQH57kKkR13k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9alj%2FbtssHzhCmYz%2FyMTYFN4bLtuQH57kKkR13k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-filename=&quot;simulator_screenshot_BA3195E0-0A59-46D2-B3F7-BDBB8572D621.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시뮬레이터 콜렉션 뷰&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이제 네트워크 통신을 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델과 URLSesstion을 만들어 보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째로&amp;nbsp; 모델 두개를 만들어 주겠습니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;unsplash 와 TMDB의 이미지 데이터 모델을 만들었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.03.07.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceywot/btssSAzjnSt/iNqKMAPtTKp4KLNgsaDMd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceywot/btssSAzjnSt/iNqKMAPtTKp4KLNgsaDMd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceywot/btssSAzjnSt/iNqKMAPtTKp4KLNgsaDMd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fceywot%2FbtssSAzjnSt%2FiNqKMAPtTKp4KLNgsaDMd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;492&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.03.07.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TMDBPhotoResult에 연산 프로퍼티로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따로 작성된 이유는TMDB에서는 이미지 query만 주기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;baseURL을 추가해줬습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 API를 불러올 때 이렇게 작성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.02.43.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EnJBW/btssHClaRJN/Vo9vkXaqFrQnu9JlWtIpFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EnJBW/btssHClaRJN/Vo9vkXaqFrQnu9JlWtIpFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EnJBW/btssHClaRJN/Vo9vkXaqFrQnu9JlWtIpFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEnJBW%2FbtssHClaRJN%2FVo9vkXaqFrQnu9JlWtIpFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.02.43.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VC에 적용해보겠습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;simulator_screenshot_C05BF73F-F71C-40F7-BF16-24EB85E95462.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejOHMb/btssN1Ecxjx/ZZgRjA3Ag89g7Q4BVLsvyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejOHMb/btssN1Ecxjx/ZZgRjA3Ag89g7Q4BVLsvyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejOHMb/btssN1Ecxjx/ZZgRjA3Ag89g7Q4BVLsvyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejOHMb%2FbtssN1Ecxjx%2FZZgRjA3Ag89g7Q4BVLsvyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;650&quot; data-filename=&quot;simulator_screenshot_C05BF73F-F71C-40F7-BF16-24EB85E95462.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 역시나 잘 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kingfisher를 사용하지 않고 직접적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Image에 비동기 작업을 적용해줬습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.08.06.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfcb87/btssNtgEkx5/eIxEvxqHxb37OMnfuKKX7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfcb87/btssNtgEkx5/eIxEvxqHxb37OMnfuKKX7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfcb87/btssNtgEkx5/eIxEvxqHxb37OMnfuKKX7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfcb87%2FbtssNtgEkx5%2FeIxEvxqHxb37OMnfuKKX7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.08.06.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 어렵지 않게 다들 하셨죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.08.40.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0zxHt/btssS2I52Xd/YQbkJ5UjjcSpWI2DeVLH00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0zxHt/btssS2I52Xd/YQbkJ5UjjcSpWI2DeVLH00/img.png&quot; data-alt=&quot;밥 아저씨...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0zxHt/btssS2I52Xd/YQbkJ5UjjcSpWI2DeVLH00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0zxHt%2FbtssS2I52Xd%2FYQbkJ5UjjcSpWI2DeVLH00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;792&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.08.40.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;밥 아저씨...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 오늘의 본론이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;추가로 두번째 모델인 unsplash를 데이터 통신 하려면&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;NetworkManager에 또 다른 callRequest 함수를 만들어줘야 할까요?&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A : 당연 빠따루이지... 말모!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;s&gt;( 만약에 충 아니에요 ㅡ,ㅡ)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;데이터 통신을 5개, 10개 해야된다면... 하나씩 다 만들어 줄건가요??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... (&lt;span style=&quot;color: #dddddd;&quot;&gt; 거 말씀이 너무 심한거 아니오&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 방법이 있습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;Generic에 대해 아시나요?&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.22.58.png&quot; data-origin-width=&quot;1750&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F69cj/btssUbFzWUA/RrmeKaA3krN18ceqKCv1F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F69cj/btssUbFzWUA/RrmeKaA3krN18ceqKCv1F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F69cj/btssUbFzWUA/RrmeKaA3krN18ceqKCv1F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF69cj%2FbtssUbFzWUA%2FRrmeKaA3krN18ceqKCv1F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;246&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.22.58.png&quot; data-origin-width=&quot;1750&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서에 보면...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 포인트가 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;플렉시블 하고 함수를 재사용 가능하게 사용할 수있는 코드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 제네릭은 Swift의 아주 강려크한 특징이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 그렇습니다. Generic을 사용해서 한번 적용해보겠습니다&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;혹시 Generic에 대해 모르시는 분들은 개발자들에게 한 줄기 빛이 되어 주시는 소들이님의 블로그를 참고해보시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://babbab2.tistory.com/136&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693556842355&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift) 제네릭(Generic) 정복하기&quot; data-og-description=&quot;안녕하세요 :) 소들입니다! 오늘의 두 번째 포스팅은 Generic에 대한 것입니다! 범용 타입이라구 하죠!! 어렵지 않은 문법이라 호딱 끝내 봅시다 :)) 모든 포스팅은 편의 말투로 합니다~!! 1. Generic이&quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/136&quot; data-og-url=&quot;https://babbab2.tistory.com/136&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQJlMN/hyTMaVRgT1/lgKXLaAAJzBqaxRk5XLXs0/img.png?width=800&amp;amp;height=54&amp;amp;face=0_0_800_54,https://scrap.kakaocdn.net/dn/97pyJ/hyTPJbcO5t/zgmHhMdm0pOiVRagKKvBBK/img.png?width=800&amp;amp;height=54&amp;amp;face=0_0_800_54,https://scrap.kakaocdn.net/dn/bEHs6j/hyTPCQGPdh/V5iqkW9BhPyy9ClegrP3Fk/img.png?width=2168&amp;amp;height=264&amp;amp;face=0_0_2168_264&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/136&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQJlMN/hyTMaVRgT1/lgKXLaAAJzBqaxRk5XLXs0/img.png?width=800&amp;amp;height=54&amp;amp;face=0_0_800_54,https://scrap.kakaocdn.net/dn/97pyJ/hyTPJbcO5t/zgmHhMdm0pOiVRagKKvBBK/img.png?width=800&amp;amp;height=54&amp;amp;face=0_0_800_54,https://scrap.kakaocdn.net/dn/bEHs6j/hyTPCQGPdh/V5iqkW9BhPyy9ClegrP3Fk/img.png?width=2168&amp;amp;height=264&amp;amp;face=0_0_2168_264');&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) 제네릭(Generic) 정복하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 :) 소들입니다! 오늘의 두 번째 포스팅은 Generic에 대한 것입니다! 범용 타입이라구 하죠!! 어렵지 않은 문법이라 호딱 끝내 봅시다 :)) 모든 포스팅은 편의 말투로 합니다~!! 1. Generic이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자. 그렇다면 저희 프로젝트에 어떻게 적용해보면 좋을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터 앞에 &amp;lt;T: Codable&amp;gt;을 적용해주고 해당 모델이 들어갔던 자리에 T를 넣어주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.28.44.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjHeGM/btssLDRFAFv/Nr3pgMJH7LpYkFWvypJACK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjHeGM/btssLDRFAFv/Nr3pgMJH7LpYkFWvypJACK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjHeGM/btssLDRFAFv/Nr3pgMJH7LpYkFWvypJACK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjHeGM%2FbtssLDRFAFv%2FNr3pgMJH7LpYkFWvypJACK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;452&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.28.44.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generic을 사용하실때 이것만 기억하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T: placeHolder - 그냥 플레이스홀더 임...&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;lt;T: &lt;span style=&quot;color: #006dd7;&quot;&gt;~&lt;/span&gt; &amp;gt; : &lt;span style=&quot;color: #006dd7;&quot;&gt;~&lt;/span&gt; 에는 타입이 들어감&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음과 비교해보면 TMDB의 자료형은 Codable로 되어있습니다.&amp;nbsp; 고로 &lt;span style=&quot;color: #006dd7;&quot;&gt;TMDB(T) : Codable&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;와 같은 의미입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.02.43.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EnJBW/btssHClaRJN/Vo9vkXaqFrQnu9JlWtIpFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EnJBW/btssHClaRJN/Vo9vkXaqFrQnu9JlWtIpFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EnJBW/btssHClaRJN/Vo9vkXaqFrQnu9JlWtIpFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEnJBW%2FbtssHClaRJN%2FVo9vkXaqFrQnu9JlWtIpFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.02.43.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 어떻게 적용하면 될까요??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.38.20.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X62mf/btssUcxKY3Z/erUpcxBOYo0H6TyGUqeBn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X62mf/btssUcxKY3Z/erUpcxBOYo0H6TyGUqeBn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X62mf/btssUcxKY3Z/erUpcxBOYo0H6TyGUqeBn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX62mf%2FbtssUcxKY3Z%2FerUpcxBOYo0H6TyGUqeBn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.38.20.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해석을 해보면 &quot; Codable 타입인건 알겠는데 그래서 뭘 넣어줄건데? 그냥 response만 넣으면 끝이 아니잖아? &quot;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;s&gt;(너가 generic을 선택한 결과물이다...견뎌라...)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자 그렇다면 어떻게 해줘야 할까요? 아주 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.41.02.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNgSS7/btssThfgOtl/SPBzF0iLUFNH02CzkrKGok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNgSS7/btssThfgOtl/SPBzF0iLUFNH02CzkrKGok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNgSS7/btssThfgOtl/SPBzF0iLUFNH02CzkrKGok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNgSS7%2FbtssThfgOtl%2FSPBzF0iLUFNH02CzkrKGok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;167&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.41.02.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TMDB의 자료형 Codable이었죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;response의 자료형을 TMDB로 설정합니다.&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;그렇게 되면 response == TMDB와 같아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;(와웅미...)&lt;/span&gt; 참 신기하죠? 역시 파워풀하네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 EBS&amp;nbsp; 수학 교재였다면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;주의 ❗️&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금부터 &lt;b&gt;숨마쿰라우데 버젼 시작하겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;( 벌써...싫다..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면... unsplash를 불러볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해야되는 부분이 제네릭으로 만든 함수를 보면 baseUrl을 받아와서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URLSession에 적용시켜 주니까 열거형을 만들어서 human Error를 최대한 없애줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째로 열거형을 먼저 만들어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.55.54.png&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBnKh4/btssN2iURbi/GjxLwdeKCihO6C75Zstwrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBnKh4/btssN2iURbi/GjxLwdeKCihO6C75Zstwrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBnKh4/btssN2iURbi/GjxLwdeKCihO6C75Zstwrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBnKh4%2FbtssN2iURbi%2FGjxLwdeKCihO6C75Zstwrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.55.54.png&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;switch 문을 통해서 &lt;b&gt;들어오는 파라미터의 값에 따라&lt;/b&gt; 다른 url이 할당 받을 수 있도록 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.57.03.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blZ3II/btssPwqxY6v/4Pufrg7AiC4wm1s4dUhEAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blZ3II/btssPwqxY6v/4Pufrg7AiC4wm1s4dUhEAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blZ3II/btssPwqxY6v/4Pufrg7AiC4wm1s4dUhEAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblZ3II%2FbtssPwqxY6v%2F4Pufrg7AiC4wm1s4dUhEAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;231&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.57.03.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Network를 만들어주고 호출해주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.58.50.png&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buWGSs/btssN1qN6i4/IOqVH7Ty6RaLNku1hyMlTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buWGSs/btssN1qN6i4/IOqVH7Ty6RaLNku1hyMlTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buWGSs/btssN1qN6i4/IOqVH7Ty6RaLNku1hyMlTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuWGSs%2FbtssN1qN6i4%2FIOqVH7Ty6RaLNku1hyMlTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;294&quot; data-filename=&quot;스크린샷 2023-09-01 오후 5.58.50.png&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참 쉽죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 unsplashList를 만들어줘야 되는 센스 다 아시죠?&lt;/p&gt;
&lt;pre id=&quot;code_1693558811598&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var list: TMDB = TMDB(results: [])
var unsplashList: Photo = Photo(total: 0, total_pages: 0, results: [])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 것만 보여주기 위해 주석 처리를 하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.01.29.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nc6Mr/btssOsPwafl/3osXSU4IqBIfNEVHPRYvtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nc6Mr/btssOsPwafl/3osXSU4IqBIfNEVHPRYvtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nc6Mr/btssOsPwafl/3osXSU4IqBIfNEVHPRYvtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNc6Mr%2FbtssOsPwafl%2F3osXSU4IqBIfNEVHPRYvtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;98&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.01.29.png&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자... 여기서 끝나면 아쉽겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;(그...그만 이러다가 다 죽어 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번에 두 API를 불러봅시다.&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;어떻게 한 VC에서 두가지의 API를 보여줄 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Collection Section 추가&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재까지는 한개의 section에서 해주었다면 section을 2개로 설정해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.40.33.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXISc/btssN3PKcep/fKAIT28owWkLHyPNzJK1Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXISc/btssN3PKcep/fKAIT28owWkLHyPNzJK1Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXISc/btssN3PKcep/fKAIT28owWkLHyPNzJK1Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXISc%2FbtssN3PKcep%2FfKAIT28owWkLHyPNzJK1Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;90&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.40.33.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음은 section에 맞게 보여주고싶은 데이터를 나눠주기만 하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693561484074&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&amp;gt; UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: FirstCell.self), for: indexPath) as? FirstCell else { return UICollectionViewCell() }
        
        
        if indexPath.section == 0 {
            let unsplashItem = unsplashList.results[indexPath.item].urls.thumb
            let unsplashurl = URL(string: unsplashItem)!
            // 비동기로 작업
            DispatchQueue.global().async {
                // 이미지 주소 Data화 시키기
                let data = try! Data(contentsOf: unsplashurl)
                
                // Main Thread에서 그려주기
                DispatchQueue.main.async {
                    // 데이터 통신 해서 image에 넣기
                    cell.imageView.image = UIImage(data: data)
                }
            }
        } else {
            let item = list.results[indexPath.item].imageUrl
            let url = URL(string: item)!
            // 비동기로 작업
            DispatchQueue.global().async {
                // 이미지 주소 Data화 시키기
                let data = try! Data(contentsOf: url)
                
                // Main Thread에서 그려주기
                DispatchQueue.main.async {
                    // 데이터 통신 해서 image에 넣기
                    cell.imageView.image = UIImage(data: data)
                }
            }
        }
        return cell
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흠... 코드가 조금 지저분한 느낌이 들죠? 리팩토링 해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.50.21.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CzSHS/btssJkSiLd8/Ja6h2BxWltdr8hJ9b3Hld0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CzSHS/btssJkSiLd8/Ja6h2BxWltdr8hJ9b3Hld0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CzSHS/btssJkSiLd8/Ja6h2BxWltdr8hJ9b3Hld0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCzSHS%2FbtssJkSiLd8%2FJa6h2BxWltdr8hJ9b3Hld0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;184&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.50.21.png&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 줄여 볼 수 있겠네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cellForRowAt 부분에 cell.setConfigure부분이 중복되긴 하네요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기도 한번 더 리팩토링 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;( 적당히 해라... !!!)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;section에 따라 들어오는 url을 담을 변수를 지정해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.55.11.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq5oFu/btssLDRQOLP/VCQ54OYngev8zqev3PKX8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq5oFu/btssLDRQOLP/VCQ54OYngev8zqev3PKX8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq5oFu/btssLDRQOLP/VCQ54OYngev8zqev3PKX8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq5oFu%2FbtssLDRQOLP%2FVCQ54OYngev8zqev3PKX8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;44&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.55.11.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;section 별로 담긴 sectionImageurl을&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막에 담아주기만 하면 끝!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.55.00.png&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVLSS/btssNumz6oh/H3IW4y8r1HgAfFCMcfcyk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVLSS/btssNumz6oh/H3IW4y8r1HgAfFCMcfcyk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVLSS/btssNumz6oh/H3IW4y8r1HgAfFCMcfcyk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVLSS%2FbtssNumz6oh%2FH3IW4y8r1HgAfFCMcfcyk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;190&quot; data-filename=&quot;스크린샷 2023-09-01 오후 6.55.00.png&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Section별로 이미지가 다른것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;simulator_screenshot_7611A71A-0161-4B35-B2C1-F92614305701.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgASZ9/btssMEpl3XJ/gMtdeqkpBNNbTZpPkckkn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgASZ9/btssMEpl3XJ/gMtdeqkpBNNbTZpPkckkn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgASZ9/btssMEpl3XJ/gMtdeqkpBNNbTZpPkckkn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgASZ9%2FbtssMEpl3XJ%2FgMtdeqkpBNNbTZpPkckkn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1084&quot; data-filename=&quot;simulator_screenshot_7611A71A-0161-4B35-B2C1-F92614305701.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 먼저해주고 대신해주는 아무개 발자였습니다. 감사합니다.&lt;/p&gt;</description>
      <category>새싹</category>
      <author>Thor_yeom</author>
      <guid isPermaLink="true">https://yeomir.tistory.com/57</guid>
      <comments>https://yeomir.tistory.com/57#entry57comment</comments>
      <pubDate>Fri, 1 Sep 2023 18:58:18 +0900</pubDate>
    </item>
  </channel>
</rss>