<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>아리의 iOS 탐구생활</title>
    <link>https://leeari95.tistory.com/</link>
    <description>iOS 고수가 될거야.</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 08:45:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Ari Lee</managingEditor>
    <image>
      <title>아리의 iOS 탐구생활</title>
      <url>https://tistory1.daumcdn.net/tistory/4707673/attach/cf7ce7cad3fd47cf93cd09bfa890fa57</url>
      <link>https://leeari95.tistory.com</link>
    </image>
    <item>
      <title>[iOS] ChatGPT를 이용하여 WWDC 내용을 추출해보자</title>
      <link>https://leeari95.tistory.com/84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 공부할 때 구글링 보다는 GPT를 활용해서 공부를 하고 있는데요.&lt;br /&gt;이번에 WWDC24가 발표되면서 회사 팀 내에서 스터디를 시작하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면서 제가 &lt;u&gt;효율적으로 공부하기 위한 방법&lt;/u&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&lt;b&gt;특정 세션 내용을 간단하게 정리된 내용을 추출해보고 싶다.&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;세션 영상을 보기 전에 &lt;u&gt;약간의 이해도가 있는 상태에서 영상을 보면 좀 더 이해하기 쉽지 않을까?&lt;/u&gt; 해서 고민하다가 아래와 같은 방법을 생각하게 되었습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;특정 세션의 WWDC 유튜브 영상을 진입한다.&lt;/li&gt;
&lt;li&gt;해당 영상의 영어 자막 파일을 &lt;u&gt;.txt&lt;/u&gt; 파일로 추출한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 링크로 진입해서 유튜브 영상 링크를 붙여넣어 다운로드 버튼을 누르면 자막 파일을 만들어준다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;a href=&quot;https://downsub.com/&quot;&gt;https://downsub.com/&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GPT에게 파일과 함께 요청해본다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&quot;해당 자막 파일을 주제별로 내용을 정리해주라.&quot;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;좀 더 궁금한 주제는 더 자세히 정리해달라고 요청해본다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확하지 않은 내용이 있을 수 있으니 &lt;u&gt;요령껏 필터링&lt;/u&gt;해서 참고하자.&lt;/li&gt;
&lt;li&gt;GPT는 잘못된 내용을 기반으로 답변할 수 있으니 항상 의심해야한다. 제공받은 정보가 정확한지 궁금하다면 공식문서를 통해 직접 검증하기 바란다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1719964057416&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;Download subtitles from Youtube, Viki, Viu, Wetv, Kocowa and more&quot; data-og-description=&quot;DownSub is a free web application that can download subtitles directly from Youtube, Drive, Viu, Vimeo, Viki, Wetv, Kocowa and more.&quot; data-og-host=&quot;downsub.com&quot; data-og-source-url=&quot;https://downsub.com/&quot; data-og-url=&quot;https://downsub.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uMr4f/hyWrOCJBpx/MoAyS6HuvXajnZ0NkcT8zk/img.png?width=250&amp;amp;height=80&amp;amp;face=0_0_250_80&quot;&gt;&lt;a href=&quot;https://downsub.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://downsub.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uMr4f/hyWrOCJBpx/MoAyS6HuvXajnZ0NkcT8zk/img.png?width=250&amp;amp;height=80&amp;amp;face=0_0_250_80');&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;Download subtitles from Youtube, Viki, Viu, Wetv, Kocowa and more&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DownSub is a free web application that can download subtitles directly from Youtube, Drive, Viu, Vimeo, Viki, Wetv, Kocowa and more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;downsub.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;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;참고로 저는 유료버전인 &lt;u&gt;ChatGPT 4o&lt;/u&gt;을 사용했습니다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;2962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opiB5/btsImduUnB1/X9wx9BKKgYxklyqXz0Kxg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opiB5/btsImduUnB1/X9wx9BKKgYxklyqXz0Kxg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opiB5/btsImduUnB1/X9wx9BKKgYxklyqXz0Kxg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopiB5%2FbtsImduUnB1%2FX9wx9BKKgYxklyqXz0Kxg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1690&quot; height=&quot;2962&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;2962&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;2946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNhvsx/btsIlAqyQAd/AdKSjKNQLcqzWoa9tobtT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNhvsx/btsIlAqyQAd/AdKSjKNQLcqzWoa9tobtT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNhvsx/btsIlAqyQAd/AdKSjKNQLcqzWoa9tobtT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNhvsx%2FbtsIlAqyQAd%2FAdKSjKNQLcqzWoa9tobtT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1628&quot; height=&quot;2946&quot; data-origin-width=&quot;1628&quot; data-origin-height=&quot;2946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  주의사항&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 WWDC에 대한 새로운 내용이 GPT는 아직 학습되지 않은 경우가 많다.&lt;br /&gt;오직 &lt;u&gt;자막 내용을 기반으로 정보를 알려주기 때문에 정확도가 떨어진다. &lt;/u&gt;(엉뚱한 내용 덧붙혀서 설명할 수도 있음...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;자막을 기반으로 세션 내용 요약본을 추출한다&lt;/code&gt; 라는 것을 잘 기억하고,&lt;br /&gt;만약 세션 내용 일부분을 깊게 이해하고 싶다면, 영상과 Apple 공식문서를 함께 참고하면서 공부해보는 것을 권장한다.&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&lt;b&gt;WWDC 스크린샷 쉽게 찍는 방법&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&quot;&gt;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719964264364&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;Screenshot YouTube&quot; data-og-description=&quot;Take a screenshot of any YouTube video with one click.&quot; data-og-host=&quot;chromewebstore.google.com&quot; data-og-source-url=&quot;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&quot; data-og-url=&quot;https://chromewebstore.google.com/detail/screenshot-youtube/gjoijpfmdhbjkkgnmahganhoinjjpohk&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LxIS6/hyWrOpdrjO/xfKrX6gQXgIx4QTnpC202k/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LxIS6/hyWrOpdrjO/xfKrX6gQXgIx4QTnpC202k/img.jpg?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Screenshot YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Take a screenshot of any YouTube video with one click.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chromewebstore.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부한 내용을 정리하다보면, 세션 영상의 화면을 캡쳐할 일이 잦은데 그럴때 사용하기 좋다.&lt;/p&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;u&gt;&lt;b&gt;Screenshot&lt;/b&gt;&lt;/u&gt;이라는 버튼이 추가된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RqBuQ/btsIka7Hyr4/yhZ7BrwoG7fn85DAEMwtj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RqBuQ/btsIka7Hyr4/yhZ7BrwoG7fn85DAEMwtj0/img.png&quot; data-alt=&quot;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RqBuQ/btsIka7Hyr4/yhZ7BrwoG7fn85DAEMwtj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRqBuQ%2FbtsIka7Hyr4%2FyhZ7BrwoG7fn85DAEMwtj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;800&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://chrome.google.com/webstore/detail/gjoijpfmdhbjkkgnmahganhoinjjpohk&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;blockquote data-ke-style=&quot;style3&quot;&gt;저는 저장을 파일 대신 &lt;u&gt;클립보드로 설정을 바꾸어서 사용&lt;/u&gt;하고 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deJb5F/btsIlCBVzWo/sykD5qcFAgOt8sNKI0Xdf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deJb5F/btsIlCBVzWo/sykD5qcFAgOt8sNKI0Xdf0/img.png&quot; data-alt=&quot;Copy to clipboard&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deJb5F/btsIlCBVzWo/sykD5qcFAgOt8sNKI0Xdf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeJb5F%2FbtsIlCBVzWo%2FsykD5qcFAgOt8sNKI0Xdf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1196&quot; height=&quot;1228&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Copy to clipboard&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;  마무리&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;2554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Etxgz/btsIkjQS2cx/5ZsnuLvhpBqWzTMvqQfqlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Etxgz/btsIkjQS2cx/5ZsnuLvhpBqWzTMvqQfqlk/img.png&quot; data-alt=&quot;Meet Swift Testing 모두 정리했더니.. 목차가 기네요....... 근데 이거 재미써요.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Etxgz/btsIkjQS2cx/5ZsnuLvhpBqWzTMvqQfqlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEtxgz%2FbtsIkjQS2cx%2F5ZsnuLvhpBqWzTMvqQfqlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;734&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;2554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Meet Swift Testing 모두 정리했더니.. 목차가 기네요....... 근데 이거 재미써요.&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;저는 위 팁들을 활용해서 영상을 보기전에 GPT를 통해 세션의 작은 주제들을 먼저 얻어내고,&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;머리에 쏙쏙!! 이해도 빠르고 정리도 평소보다 빠르게 잘되는 것 같아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이전엔 이해가 안되도 두번 세번 보다보면 이해가 되겠지하고 때려박는 느낌이였는데...ㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;단 시간 안에 효율적으로 공부하는 느낌(?)이 들어서 이런 꿀팁은 나만 알고있으면 아까우니까... 하는 마음에 공유해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(나만 몰랐을수도...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkwkRb/btsIlBps1Wz/4JW5a4rkkeMdrqCFAc0qdk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkwkRb/btsIlBps1Wz/4JW5a4rkkeMdrqCFAc0qdk/img.jpg&quot; data-alt=&quot;마무리는 우리 귀염둥이 뿌꾸 사진으로~~~  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkwkRb/btsIlBps1Wz/4JW5a4rkkeMdrqCFAc0qdk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkwkRb%2FbtsIlBps1Wz%2F4JW5a4rkkeMdrqCFAc0qdk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마무리는 우리 귀염둥이 뿌꾸 사진으로~~~  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Swift/iOS</category>
      <category>Apple</category>
      <category>ChatGPT</category>
      <category>GPT</category>
      <category>IOS</category>
      <category>openAI</category>
      <category>Swift</category>
      <category>WWDC</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/84</guid>
      <comments>https://leeari95.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 3 Jul 2024 20:53:26 +0900</pubDate>
    </item>
    <item>
      <title>[iOS/Swift] 라이브러리 SwiftyUserDefaults를 알아보자~</title>
      <link>https://leeari95.tistory.com/83</link>
      <description>&lt;figure id=&quot;og_1704291462355&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 - sunshinejr/SwiftyUserDefaults: Modern Swift API for NSUserDefaults&quot; data-og-description=&quot;Modern Swift API for NSUserDefaults. Contribute to sunshinejr/SwiftyUserDefaults development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/sunshinejr/SwiftyUserDefaults&quot; data-og-url=&quot;https://github.com/sunshinejr/SwiftyUserDefaults&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uEcY6/hyUXUp8JbW/cWgLGXMNy0ESJ77ZC6bUyK/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_125_1036_183&quot;&gt;&lt;a href=&quot;https://github.com/sunshinejr/SwiftyUserDefaults&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/sunshinejr/SwiftyUserDefaults&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uEcY6/hyUXUp8JbW/cWgLGXMNy0ESJ77ZC6bUyK/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_125_1036_183');&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 - sunshinejr/SwiftyUserDefaults: Modern Swift API for NSUserDefaults&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Modern Swift API for NSUserDefaults. Contribute to sunshinejr/SwiftyUserDefaults development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;SwiftyUserDefaults는 한 곳에서 키를 정의하고, 값 유형을 쉽게 사용할 수 있으며, 컴파일 시 안전성과 편의성을 높여주는 컴파일 타임 검사를 무료로 이용할 수 있다고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;한마디로 UserDefaults를 사용할 때, &lt;u&gt;타입 안전성과 코드의 간결성을 동시에 얻을 수 있는&lt;/u&gt; 아주 편리한 라이브러리다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-size=&quot;0&quot; data-position=&quot;86&quot; data-endline=&quot;6&quot; data-startline=&quot;6&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Generic, Subscript, DynamicMemberLookup 등을 활용하여 &lt;br /&gt;UserDefaults를 아주 편안하게 사용할 수 있게 구현되어 있다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1 style=&quot;text-align: start;&quot; data-id=&quot;SwiftyUserDefaults로-특정-값을-접근하거나-저장하기&quot; data-endline=&quot;9&quot; data-startline=&quot;9&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;text-align: start;&quot; data-id=&quot;SwiftyUserDefaults로-특정-값을-접근하거나-저장하기&quot; data-endline=&quot;9&quot; data-startline=&quot;9&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;SwiftyUserDefaults로-특정-값을-접근하거나-저장하기&quot; style=&quot;text-align: start;&quot; data-id=&quot;SwiftyUserDefaults로-특정-값을-접근하거나-저장하기&quot; data-endline=&quot;9&quot; data-startline=&quot;9&quot;&gt;&lt;b&gt;  SwiftyUserDefaults로 특정 값을 접근하거나 저장하기&lt;/b&gt;&lt;/h1&gt;
&lt;h2 id=&quot;1-키-정의하기&quot; style=&quot;text-align: start;&quot; data-id=&quot;1-키-정의하기&quot; data-endline=&quot;11&quot; data-startline=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 키 정의하기&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;250&quot; data-endline=&quot;14&quot; data-startline=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;정의하는 방법은 &lt;u&gt;DefaultsKey&lt;/u&gt;라는 제네릭 타입을 활용하여 정의해준다. 이때 들어가는 타입은 &lt;u&gt;저장될 타입&lt;/u&gt;을 의미한다.&lt;br /&gt;타입을 옵셔널로 설정하지 않을경우 defaultValue를 꼭 &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;설정해 줘야 한다&lt;/span&gt;.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-position=&quot;364&quot; data-endline=&quot;19&quot; data-startline=&quot;16&quot;&gt;&lt;code&gt;let username: DefaultsKey&amp;lt;String?&amp;gt; = .init(&quot;username&quot;)
let launchCount: DefaultsKey&amp;lt;Int&amp;gt; = .init(&quot;launchCount&quot;, defaultValue: 0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;507&quot; data-endline=&quot;21&quot; data-startline=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;507&quot; data-endline=&quot;21&quot; data-startline=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;507&quot; data-endline=&quot;21&quot; data-startline=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;더 편리하게 사용하려면 아래 코드 예시와 같이 &lt;u&gt;DefaultsKeys&lt;/u&gt; 타입을 확장하여 프로퍼티를 정의해주면 된다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-position=&quot;572&quot; data-endline=&quot;28&quot; data-startline=&quot;23&quot;&gt;&lt;code&gt;extension DefaultsKeys {
    var username: DefaultsKey&amp;lt;String?&amp;gt; { .init(&quot;username&quot;) }
    var launchCount: DefaultsKey&amp;lt;Int&amp;gt; { .init(&quot;launchCount&quot;, defaultValue: 0) }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 위 방법이 편리한지는 아래를 살펴보면 이해할 수 있다.  &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sunshinejr/SwiftyUserDefaults#keypath-dynamicmemberlookup&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/sunshinejr/SwiftyUserDefaults#keypath-dynamicmemberlookup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-id=&quot;2-접근하기&quot; data-endline=&quot;32&quot; data-startline=&quot;32&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-id=&quot;2-접근하기&quot; data-endline=&quot;32&quot; data-startline=&quot;32&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;2-접근하기&quot; style=&quot;text-align: start;&quot; data-id=&quot;2-접근하기&quot; data-endline=&quot;32&quot; data-startline=&quot;32&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 접근하기&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-size=&quot;0&quot; data-position=&quot;768&quot; data-endline=&quot;34&quot; data-startline=&quot;34&quot; data-ke-style=&quot;style2&quot;&gt;DefaultsKeys를 확장하여 정의한 프로퍼티를 활용할 때&lt;/blockquote&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;text-align: start;&quot; data-position=&quot;804&quot; data-endline=&quot;39&quot; data-startline=&quot;36&quot;&gt;&lt;code&gt;// UserDefaults 값을 손쉽게 가져와 바로 할당할 수 있다.
let username: String? = Defaults.username
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-size=&quot;0&quot; data-position=&quot;900&quot; data-endline=&quot;41&quot; data-startline=&quot;41&quot; data-ke-style=&quot;style2&quot;&gt;DefaultsKey를 직접 사용할 때&lt;/blockquote&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-position=&quot;923&quot; data-endline=&quot;46&quot; data-startline=&quot;43&quot;&gt;&lt;code&gt;let username: DefaultsKey&amp;lt;String?&amp;gt; = .init(&quot;username&quot;)
let username: String? = Defaults[key: username]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-id=&quot;3-저장하기&quot; data-endline=&quot;49&quot; data-startline=&quot;49&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-id=&quot;3-저장하기&quot; data-endline=&quot;49&quot; data-startline=&quot;49&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;3-저장하기&quot; style=&quot;text-align: start;&quot; data-id=&quot;3-저장하기&quot; data-endline=&quot;49&quot; data-startline=&quot;49&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 저장하기&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-size=&quot;0&quot; data-position=&quot;1053&quot; data-endline=&quot;51&quot; data-startline=&quot;51&quot; data-ke-style=&quot;style2&quot;&gt;DefaultsKeys를 확장하여 정의한 프로퍼티를 활용할 때&lt;/blockquote&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;text-align: start;&quot; data-position=&quot;1089&quot; data-endline=&quot;56&quot; data-startline=&quot;53&quot;&gt;&lt;code&gt;// 값을 제자리에서 수정할 수 있다.
Defaults.launchCount += 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-size=&quot;0&quot; data-position=&quot;1151&quot; data-endline=&quot;58&quot; data-startline=&quot;58&quot; data-ke-style=&quot;style2&quot;&gt;DefaultsKey를 직접 사용할 때&lt;/blockquote&gt;
&lt;pre class=&quot;groovy&quot; style=&quot;text-align: start;&quot; data-position=&quot;1174&quot; data-endline=&quot;63&quot; data-startline=&quot;60&quot;&gt;&lt;code&gt;let launchCount: DefaultsKey&amp;lt;Int&amp;gt; = .init(&quot;launchCount&quot;, defaultValue: 0)
Defaults[key: launchCount] += 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-id=&quot;Defaults는-어떻게-정의되어있을까&quot; data-endline=&quot;65&quot; data-startline=&quot;65&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-id=&quot;Defaults는-어떻게-정의되어있을까&quot; data-endline=&quot;65&quot; data-startline=&quot;65&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;Defaults는-어떻게-정의되어있을까&quot; style=&quot;text-align: start;&quot; data-id=&quot;Defaults는-어떻게-정의되어있을까&quot; data-endline=&quot;65&quot; data-startline=&quot;65&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  Defaults는 어떻게 정의되어있을까?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;1321&quot; data-endline=&quot;67&quot; data-startline=&quot;67&quot; data-ke-size=&quot;size16&quot;&gt;전역적으로 사용되는 Defaults는 어떻게 구현되어있는지 살펴보니 아래와 같이 정의되어있었다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot; style=&quot;text-align: start;&quot; data-position=&quot;1376&quot; data-endline=&quot;71&quot; data-startline=&quot;69&quot;&gt;&lt;code&gt;public var Defaults = DefaultsAdapter&amp;lt;DefaultsKeys&amp;gt;(defaults: .standard, keyStore: .init())
&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;DefaultsAdapter는 UserDefaults를 래핑한 구조체이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-size=&quot;0&quot; data-position=&quot;1482&quot; data-endline=&quot;74&quot; data-startline=&quot;73&quot;&gt;&lt;a href=&quot;https://github.com/sunshinejr/SwiftyUserDefaults/blob/master/Sources/DefaultsAdapter.swift&quot;&gt;https://github.com/sunshinejr/SwiftyUserDefaults/blob/master/Sources/DefaultsAdapter.swift&lt;/a&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;defaults는 UserDefaults를 의미하고, KeyStore는 DefaultsKeyStore 프로토콜을 준수한 타입을 의미한다.&lt;br /&gt;기본적으로는 빈 구조체로 DefaultsKeys라는 구조체가 정의되어있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-size=&quot;0&quot; data-position=&quot;1617&quot; data-endline=&quot;78&quot; data-startline=&quot;76&quot;&gt;&lt;a href=&quot;https://github.com/sunshinejr/SwiftyUserDefaults/blob/master/Sources/DefaultsKeys.swift&quot;&gt;https://github.com/sunshinejr/SwiftyUserDefaults/blob/master/Sources/DefaultsKeys.swift&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;text-align: start;&quot; data-id=&quot;꿀팁-UserDefaults에-저장되어있는-모든-Key-Value-쌍을-가져오기&quot; data-endline=&quot;80&quot; data-startline=&quot;80&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&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;이렇게 SwiftyUserDefaults라는 라이브러리를 간단하게 살펴보았는데, &lt;br /&gt;추가로 KVO 기능을 제공하기도 하며, &lt;br /&gt;프로퍼티 래퍼를 활용하여 각 Key 값에 캐싱 및 관찰 옵션을 설정할 수도 있다. &lt;br /&gt;자세한 건 아래 링크를 참고해 보자.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/sunshinejr/SwiftyUserDefaults#property-wrappers&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/sunshinejr/SwiftyUserDefaults#property-wrappers&lt;/a&gt;&lt;/p&gt;
&lt;h1 style=&quot;text-align: start;&quot; data-id=&quot;꿀팁-UserDefaults에-저장되어있는-모든-Key-Value-쌍을-가져오기&quot; data-endline=&quot;80&quot; data-startline=&quot;80&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;꿀팁-UserDefaults에-저장되어있는-모든-Key-Value-쌍을-가져오기&quot; style=&quot;text-align: start;&quot; data-id=&quot;꿀팁-UserDefaults에-저장되어있는-모든-Key-Value-쌍을-가져오기&quot; data-endline=&quot;80&quot; data-startline=&quot;80&quot;&gt;&lt;b&gt;  꿀팁: UserDefaults에 저장되어있는 모든 Key-Value 쌍을 가져오기&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1704291990252&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;dictionaryRepresentation() | Apple Developer Documentation&quot; data-og-description=&quot;Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/foundation/userdefaults/1415919-dictionaryrepresentation&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/foundation/userdefaults/1415919-dictionaryrepresentation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DKI5R/hyUXQgY3bL/b4JG8sIkOPzFrLf9fAKFk0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/8N2z7/hyUXYswTwg/E5CHK7dXySyPYCMu5Mnm91/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/foundation/userdefaults/1415919-dictionaryrepresentation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/foundation/userdefaults/1415919-dictionaryrepresentation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DKI5R/hyUXQgY3bL/b4JG8sIkOPzFrLf9fAKFk0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/8N2z7/hyUXYswTwg/E5CHK7dXySyPYCMu5Mnm91/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;dictionaryRepresentation() | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.&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 style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;1875&quot; data-endline=&quot;82&quot; data-startline=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;1875&quot; data-endline=&quot;82&quot; data-startline=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;dictionaryRepresentation()&lt;/u&gt; 메소드를 활용하여 UserDefaults에 저장된 모든 Key와 Value를 딕셔너리 형태로 가져올 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;1875&quot; data-endline=&quot;82&quot; data-startline=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;아래는 활용 예시!&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-size=&quot;0&quot; data-position=&quot;1918&quot; data-endline=&quot;84&quot; data-startline=&quot;84&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-original-title=&quot;&quot; data-position=&quot;2066&quot; data-endline=&quot;95&quot; data-startline=&quot;89&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func removeAll() {
    for key in defaults.dictionaryRepresentation().keys {
        defaults.removeObject(forKey: key)
    }
}&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,&amp;nbsp; 공감  ㆍ 구독✅ ㆍ 공유  ㆍ댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;
&lt;div id=&quot;gtx-anchor&quot; style=&quot;position: absolute; visibility: hidden; left: -1.67772e+07px; top: 3618.16px; width: 523px; height: 161.688px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;jfk-bubble gtx-bubble&quot; style=&quot;visibility: visible; left: -3.35546e+07px; top: 3436px; opacity: 1;&quot; role=&quot;alertdialog&quot; aria-describedby=&quot;bubble-2&quot;&gt;
&lt;div id=&quot;bubble-2&quot; class=&quot;jfk-bubble-content-id&quot;&gt;
&lt;div id=&quot;gtx-host&quot; style=&quot;min-width: 200px; max-width: 400px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;jfk-bubble-closebtn-id jfk-bubble-closebtn&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-label=&quot;Close&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;jfk-bubble-arrow-id jfk-bubble-arrow jfk-bubble-arrowdown&quot; style=&quot;left: 15px;&quot;&gt;
&lt;div class=&quot;jfk-bubble-arrowimplbefore&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;jfk-bubble-arrowimplafter&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Swift/iOS</category>
      <category>Foundation</category>
      <category>IOS</category>
      <category>Swift</category>
      <category>SwiftyUserDefaults</category>
      <category>UserDefaults</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/83</guid>
      <comments>https://leeari95.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 3 Jan 2024 23:53:59 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] 웹뷰를 사용할 때 자바스크립트로 양방향 통신하기</title>
      <link>https://leeari95.tistory.com/82</link>
      <description>&lt;blockquote data-startline=&quot;4&quot; data-endline=&quot;4&quot; data-position=&quot;37&quot; data-size=&quot;0&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최근에 웹뷰 관련된 작업을 진행했는데, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;웹뷰에서 보내는 메시지를 전달받아 화면을 이동하거나 띄우는 동작을 구현하였다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사실 뭣도 모르고 기존 프로젝트에 작성되어있던 코드를 참고하여 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작업을 완료하였기 때문에...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그냥 넘어가기 굉장히 찝찝하고 이해가 부족하다고 느껴서 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정확히 이해하고 넘어가고 싶어서 정리하게 되었다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;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;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;6&quot; data-endline=&quot;6&quot; data-position=&quot;220&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;6&quot; data-endline=&quot;6&quot; data-position=&quot;220&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;내가 알아볼 키워드는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-startline=&quot;8&quot; data-endline=&quot;12&quot; data-position=&quot;241&quot; data-size=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;8&quot; data-endline=&quot;8&quot; data-position=&quot;243&quot; data-size=&quot;0&quot;&gt;WKScriptMessageHandler&lt;/li&gt;
&lt;li data-startline=&quot;9&quot; data-endline=&quot;9&quot; data-position=&quot;268&quot; data-size=&quot;0&quot;&gt;WKWebView&lt;/li&gt;
&lt;li data-startline=&quot;10&quot; data-endline=&quot;12&quot; data-position=&quot;280&quot; data-size=&quot;0&quot;&gt;evaluateJavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&lt;b&gt;iOS에서 웹뷰를 사용할 때 양방향 통신을 하는 방법&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1695564204244&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;WKScriptMessageHandler | Apple Developer Documentation&quot; data-og-description=&quot;An interface for receiving messages from JavaScript code running in a webpage.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/webkit/wkscriptmessagehandler&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/webkit/wkscriptmessagehandler&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csT83X/hyT2v4P3hV/CvG6TP1sEBwkx2tkdJi5O1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Zz0aV/hyTZcFQ212/m5ZvKjclMAXydLnqcBv6X1/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/webkit/wkscriptmessagehandler&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/webkit/wkscriptmessagehandler&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csT83X/hyT2v4P3hV/CvG6TP1sEBwkx2tkdJi5O1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Zz0aV/hyTZcFQ212/m5ZvKjclMAXydLnqcBv6X1/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;WKScriptMessageHandler | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interface for receiving messages from JavaScript code running in a webpage.&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 style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;15&quot; data-endline=&quot;16&quot; data-position=&quot;334&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;WKScriptMessageHandler는 &lt;u&gt;iOS의 WebKit 프레임워크에서 제공하는 프로토콜&lt;/u&gt;이다.&lt;br /&gt;이 프로토콜은 WKWebView 내부의 JavaScript에서 웹뷰의 호스트 애플리케이션으로 메시지를 보낼 수 있도록 도와준다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;18&quot; data-endline=&quot;18&quot; data-position=&quot;464&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;간단히 말해 WKScriptMessageHandler는 &lt;u&gt;웹 페이지 내의 JavaScript 코드와 네이티브 iOS 코드 사이에서 상호작용&lt;/u&gt;(메시지 전달)을 할 수 있다.&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;20&quot; data-endline=&quot;20&quot; data-id=&quot;JavaScript-&amp;rarr;-iOS&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;JavaScript-&amp;rarr;-iOS&quot; style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;20&quot; data-endline=&quot;20&quot; data-id=&quot;JavaScript-&amp;rarr;-iOS&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JavaScript &amp;rarr; iOS&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 내의 버튼을 클릭하면 JavaScript가 WKWebView의 네이티브 애플리케이션으로 어떤 정보나 명령을 보낼 수 있다.&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;25&quot; data-endline=&quot;25&quot; data-id=&quot;iOS-&amp;rarr;-JavaScript&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;25&quot; data-endline=&quot;25&quot; data-id=&quot;iOS-&amp;rarr;-JavaScript&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;iOS-&amp;rarr;-JavaScript&quot; style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;25&quot; data-endline=&quot;25&quot; data-id=&quot;iOS-&amp;rarr;-JavaScript&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;iOS &amp;rarr; JavaScript&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1695564226203&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;evaluateJavaScript(_:completionHandler:) | Apple Developer Documentation&quot; data-og-description=&quot;Evaluates the specified JavaScript string.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxEBGK/hyTZdrd6vV/E2xNkpN8boQK6wKZAi1xRK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hbtEh/hyT2urj4q7/tfUsBii9pl1N9H8SRKTxk1/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/webkit/wkwebview/1415017-evaluatejavascript&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxEBGK/hyTZdrd6vV/E2xNkpN8boQK6wKZAi1xRK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hbtEh/hyT2urj4q7/tfUsBii9pl1N9H8SRKTxk1/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;evaluateJavaScript(_:completionHandler:) | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Evaluates the specified JavaScript string.&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;iOS 앱에서 사용자의 액션에 대응하여 JavaScript 함수를 호출할 수 있다. 이 경우에는 WKWebView의 &lt;u&gt;evaluateJavaScript&lt;/u&gt; 메소드를 사용하면 된다.&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&lt;br /&gt;&lt;b&gt;사용 예시 (&lt;/b&gt;&lt;b&gt;JavaScript &amp;rarr; iOS&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h1&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;34&quot; data-endline=&quot;63&quot; data-position=&quot;793&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import UIKit
import WebKit

final class WebViewController: UIViewController, WKScriptMessageHandler {
    
    private weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let contentController = WKUserContentController()
        contentController.add(self, name: &quot;messageHandler&quot;) // 해당 이름으로 메시지를 식별하거나 보낼 수 있게 된다.

        let config = WKWebViewConfiguration()
        config.userContentController = contentController
        
        webView = WKWebView(frame: .zero, configuration: config)
        view.addSubview(webView)
        // ... (웹 뷰 레이아웃 및 URL 로딩 코드)
    }

    // WKScriptMessageHandler 프로토콜의 메서드. JavaScript로 부터 전달받은 메시지를 전달 받는다.
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == &quot;messageHandler&quot;, let messageBody = message.body as? [String: Any] {
            print(&quot;Received message from JavaScript: \(messageBody)&quot;) // 웹으로부터 받은 메시지를 파싱하여 print를 호출하는 코드.
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;65&quot; data-endline=&quot;66&quot; data-position=&quot;1778&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위 예제에서는 userContentController 메소드에서 JavaScript로부터 내려온 메시지를 받아서 간단하게 print를 실행하는 모습을 확인할 수 있다.&lt;/p&gt;
&lt;figure id=&quot;og_1695564303572&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;userContentController(_:didReceive:) | Apple Developer Documentation&quot; data-og-description=&quot;Tells the handler that a webpage sent a script message.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/webkit/wkscriptmessagehandler/1396222-usercontentcontroller&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/webkit/wkscriptmessagehandler/1396222-usercontentcontroller&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/emGNNN/hyT2DIy5hK/d9dfaK3jFR9dhwq2p0yPdk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/w2MfT/hyT2DV5Qvv/dePuVzhTgsBVFn4TWYd7ck/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/webkit/wkscriptmessagehandler/1396222-usercontentcontroller&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/webkit/wkscriptmessagehandler/1396222-usercontentcontroller&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/emGNNN/hyT2DIy5hK/d9dfaK3jFR9dhwq2p0yPdk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/w2MfT/hyT2DV5Qvv/dePuVzhTgsBVFn4TWYd7ck/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;userContentController(_:didReceive:) | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tells the handler that a webpage sent a script message.&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 style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;65&quot; data-endline=&quot;66&quot; data-position=&quot;1778&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;65&quot; data-endline=&quot;66&quot; data-position=&quot;1778&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;65&quot; data-endline=&quot;66&quot; data-position=&quot;1778&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;65&quot; data-endline=&quot;66&quot; data-position=&quot;1778&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;65&quot; data-endline=&quot;66&quot; data-position=&quot;1778&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위 예제를 참고하여 JavaScript에서는 다음과 같은 코드로 iOS에 메시지를 보낼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dart&quot; style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;68&quot; data-endline=&quot;71&quot; data-position=&quot;1928&quot;&gt;&lt;code&gt;// iOS에게 메시지를 보내는 코드.
window.webkit.messageHandlers.messageHandler.postMessage(&quot;Hello from JavaScript!&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;73&quot; data-endline=&quot;73&quot; data-position=&quot;2053&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위 코드를 보면 iOS에서 contentController에 &lt;u&gt;&lt;a href=&quot;https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;add&lt;/a&gt;&lt;/u&gt; 함수로 등록한 name과 일치하는 이름(window.webkit.messageHandlers.messageHandler.postMessage)으로 메시지를 보내는 모습을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;75&quot; data-endline=&quot;76&quot; data-position=&quot;2197&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;75&quot; data-endline=&quot;76&quot; data-position=&quot;2197&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;어떤 메시지를 주고 받을지에 대한 정의는 프론트와 iOS가 같이 인터페이스를 별도로 정의해야한다.&lt;br /&gt;위 코드는 간단한 예시라는 것을 명심하자&amp;hellip;!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;75&quot; data-endline=&quot;76&quot; data-position=&quot;2197&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;75&quot; data-endline=&quot;76&quot; data-position=&quot;2197&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1695564429364&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;WKScriptMessage | Apple Developer Documentation&quot; data-og-description=&quot;An object that encapsulates a message sent by JavaScript code from a webpage.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/webkit/wkscriptmessage&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/webkit/wkscriptmessage&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctvH8O/hyT2Ad0g12/YBYYzpxNqkkD0ukQfh3Nx1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bcJsvZ/hyT2stu1fh/pparceywDyAzbJy5Uz4oY0/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/webkit/wkscriptmessage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/webkit/wkscriptmessage&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctvH8O/hyT2Ad0g12/YBYYzpxNqkkD0ukQfh3Nx1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bcJsvZ/hyT2stu1fh/pparceywDyAzbJy5Uz4oY0/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;WKScriptMessage | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An object that encapsulates a message sent by JavaScript code from a webpage.&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;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-startline=&quot;78&quot; data-endline=&quot;84&quot; data-position=&quot;2278&quot; data-size=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;78&quot; data-endline=&quot;80&quot; data-position=&quot;2280&quot; data-size=&quot;0&quot;&gt;&lt;b&gt;message.name&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-position=&quot;2267&quot; data-size=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;79&quot; data-endline=&quot;79&quot; data-position=&quot;2299&quot; data-size=&quot;0&quot;&gt;iOS 측에서 WKUserContentController 객체를 사용하여 &lt;u&gt;메시지 핸들러를 추가할 때 지정한 이름&lt;/u&gt;이다.&lt;/li&gt;
&lt;li data-startline=&quot;80&quot; data-endline=&quot;80&quot; data-position=&quot;2375&quot; data-size=&quot;0&quot;&gt;이 이름을 통해 웹 페이지 내의 &lt;b&gt;JavaScript에서 해당 핸들러를 식별하고 메시지를 보낼 수 있다.&lt;/b&gt;  따라서, 앱 개발자가 미리 정의하고 웹 개발자에게 해당 이름을 알려줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;81&quot; data-endline=&quot;84&quot; data-position=&quot;2481&quot; data-size=&quot;0&quot;&gt;&lt;b&gt;message.body&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-position=&quot;2468&quot; data-size=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;82&quot; data-endline=&quot;82&quot; data-position=&quot;2500&quot; data-size=&quot;0&quot;&gt;&lt;u&gt;JavaScript에서 postMessage 메서드를 호출할 때 전달하는 데이터&lt;/u&gt;다.&lt;/li&gt;
&lt;li data-startline=&quot;83&quot; data-endline=&quot;84&quot; data-position=&quot;2557&quot; data-size=&quot;0&quot;&gt;이 데이터의 형태와 내용은 웹 개발자와 앱 개발자 사이의 약속에 따라 다를 수 있다.  예를 들어, &lt;u&gt;문자열을 보낼 수도 있고, JSON 형태의 데이터를 보낼 수도 있다.&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;text-align: start;&quot;&gt;&lt;b&gt;사용 예시 (&lt;/b&gt;&lt;b&gt;iOS &lt;b&gt;&amp;rarr;&lt;/b&gt; &lt;b&gt;JavaScript&lt;/b&gt;&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h1&gt;
&lt;pre id=&quot;code_1696383991249&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extension WebViewController {

    /// JavaScript 메소드를 호출하는 메소드
    func callJavaScript(script: String, completionHandler: @escaping (Any?, Error?) -&amp;gt; Void) {
        // evaluateJavaScript를 사용하여 웹 페이지 내의 JavaScript 함수를 호출할 수 있다.
        webView.evaluateJavaScript(script) { (result, error) in
            if let error = error {
                print(&quot;Error calling JS function: \(error)&quot;)
                completionHandler(nil, error)
            } else if let result = result {
                print(&quot;Received result from JS function: \(result)&quot;)
                completionHandler(result, nil)
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위 예제에서는 callJavaScript라는 메소드를 별도로 구현하였다.&lt;br /&gt;어떤 특정 상황에서 웹뷰의 기능을 수행해야한다면 위 웹뷰의 evaluateJavaScript 메소드를 통해 JavaScript 함수를 호출하도록 해볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696384089438&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxEBGK/hyTZdrd6vV/E2xNkpN8boQK6wKZAi1xRK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hbtEh/hyT2urj4q7/tfUsBii9pl1N9H8SRKTxk1/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot; data-og-host=&quot;developer.apple.com&quot; data-og-description=&quot;Evaluates the specified JavaScript string.&quot; data-og-title=&quot;evaluateJavaScript(_:completionHandler:) | Apple Developer Documentation&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot; data-source-url=&quot;https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxEBGK/hyTZdrd6vV/E2xNkpN8boQK6wKZAi1xRK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hbtEh/hyT2urj4q7/tfUsBii9pl1N9H8SRKTxk1/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;evaluateJavaScript(_:completionHandler:) | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Evaluates the specified JavaScript string.&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 style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;결론적으로 message.name과 message.body의 정확한 정의와 사용 방식은 &lt;u&gt;웹 개발자와 앱 개발자 사이의 협업과 의사소통을 통해 정의되어야 한다.&lt;/u&gt; 두 개발자는 서로 어떤 메시지 이름을 사용하며, 어떤 형태의 데이터를 주고받을 것인지 사전에 명확히 약속하고 이해해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;2657&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면, 공감  ㆍ 구독✅ ㆍ 공유  ㆍ댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;</description>
      <category>Swift/iOS</category>
      <category>evaluateJavaScript</category>
      <category>IOS</category>
      <category>JavaScript</category>
      <category>Swift</category>
      <category>webkit</category>
      <category>WKScriptMessageHandler</category>
      <category>WKWebView</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/82</guid>
      <comments>https://leeari95.tistory.com/82#entry82comment</comments>
      <pubDate>Sun, 24 Sep 2023 23:16:46 +0900</pubDate>
    </item>
    <item>
      <title>[iOS/Tuist] scafflod를 사용하여 모듈 생성 자동화하기</title>
      <link>https://leeari95.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 요즘에 취업 이후 글이 뜸해진 것 같아... 반성하고 다시 돌아온 아리입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직장생활 뿐만 아니라... 어쩌다가 갑자기 강아지를 키우게 되어서 육아하느라고 정신이 없었습니다. (TMI)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취업에 성공하고 개발자로 회사생활을 시작한지 5개월이 다 되어가네요. 울집 강쥐도 태어난지 5개월이 되었어요. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강아지와 함께 살게되면서 생각해야할 것과 할일이 많아져서 너무 바쁘지만 그래도 덕분에 행복하고 즐거운 생활을 하고 있답니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 제가 회사 프로젝트에 Tuist를 적용하게 되었는데, &lt;br /&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;zwj;♀️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;6000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7eQzS/btsmWl157tC/7swy2FaW7FscCRTqbLX7sK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7eQzS/btsmWl157tC/7swy2FaW7FscCRTqbLX7sK/img.jpg&quot; data-alt=&quot;울집 강쥐 뿌꾸... 우리집에 온지 100일 된 기념으로 케이크 먹고 행복해하고 있는 중...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7eQzS/btsmWl157tC/7swy2FaW7FscCRTqbLX7sK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7eQzS%2FbtsmWl157tC%2F7swy2FaW7FscCRTqbLX7sK%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;4000&quot; height=&quot;6000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;6000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;울집 강쥐 뿌꾸... 우리집에 온지 100일 된 기념으로 케이크 먹고 행복해하고 있는 중...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;text-align: start;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;tuist-scafflod&quot; data-size=&quot;0&quot; data-position=&quot;18&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;# tuist scafflod&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;5&quot; data-endline=&quot;5&quot; data-position=&quot;60&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;해당 명령어를 사용해서 자신만의 템플릿을 정의하거나 Tuist에서 제공하는 템플릿을 사용할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;7&quot; data-endline=&quot;7&quot; data-position=&quot;118&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;보통은 새로운 컴포넌트나 기능을 만드는 것을 시작할 때 사용해볼 수 있는 기능이다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;7&quot; data-endline=&quot;7&quot; data-position=&quot;118&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;7&quot; data-endline=&quot;7&quot; data-position=&quot;118&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;7&quot; data-endline=&quot;7&quot; data-position=&quot;118&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;템플릿-정의하기&quot; style=&quot;text-align: start;&quot; data-startline=&quot;9&quot; data-endline=&quot;9&quot; data-size=&quot;0&quot; data-position=&quot;178&quot; data-id=&quot;템플릿-정의하기&quot;&gt;&lt;b&gt;# 템플릿 정의하기&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;11&quot; data-endline=&quot;11&quot; data-position=&quot;178&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;먼저 프로젝트 내부 Tuist 디렉토리에 Templetes 디렉토리를 생성하고 그 내부에 템플릿을 추가해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;13&quot; data-endline=&quot;13&quot; data-position=&quot;241&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;중요한 것은&amp;hellip; 템플릿 디렉토리 내부&amp;nbsp;&lt;u&gt;디렉토리 이름&lt;/u&gt;과 &lt;u&gt;Template을 선언할&amp;nbsp;&lt;/u&gt;&lt;u&gt;.swift 파일 이름&lt;/u&gt;이 동일해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;17&quot; data-endline=&quot;17&quot; data-size=&quot;0&quot; data-position=&quot;325&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-position=&quot;318&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;경로 예시&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxKCI/btsm2HcprAq/krWrBK6vxejHhkA23Hv8m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxKCI/btsm2HcprAq/krWrBK6vxejHhkA23Hv8m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxKCI/btsm2HcprAq/krWrBK6vxejHhkA23Hv8m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxKCI%2Fbtsm2HcprAq%2FkrWrBK6vxejHhkA23Hv8m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2064&quot; height=&quot;1096&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;21&quot; data-endline=&quot;21&quot; data-position=&quot;372&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;21&quot; data-endline=&quot;21&quot; data-position=&quot;372&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;템플릿 디렉토리를 생성해주었다면, 내부에 디렉토리 이름과 동일한 &lt;u&gt;.swift&lt;/u&gt; 파일을 생성하여 아래와 같이 코드를 추가해준다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-position=&quot;443&quot; data-endline=&quot;65&quot; data-startline=&quot;23&quot; data-size=&quot;0&quot; data-original-title=&quot;&quot;&gt;&lt;code&gt;// Module.swift 파일
import ProjectDescription

// scaffold 명령어 시 받을 인자.
let name: Template.Attribute = .required(&quot;name&quot;)
let author: Template.Attribute = .required(&quot;author&quot;)
let currentDate: Template.Attribute = .required(&quot;currentDate&quot;)

// 템플릿 선언.
let moduleTemplate = Template(
    description: &quot;A template for a new feature module&quot;,
    attributes: [
        name,
        author,
        currentDate
    ],
    items: ModuleTemplate.allCases.map { $0.item }
)

enum ModuleTemplate: CaseIterable {
    case project
    case temp

    // 템플릿 내부에 추가할 파일.
    var item: Template.Item {
        switch self {
        case .project:
            return .file(path: .basePath + &quot;/Project.swift&quot;, templatePath: &quot;Project.stencil&quot;)

        case .temp:
            return .file(path: .basePath + &quot;/Sources/Temp.swift&quot;, templatePath: &quot;Temp.stencil&quot;)
        }
    }
}

// 템플릿을 추가할 기본 경로.
extension String {
    static var basePath: Self {
        return &quot;Grip/Projects/\(name)&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;보면 Templete 선언 외에도 여러가지가 있는데, 위에서부터 차례대로 알아가보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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 id=&quot;TemplateAttribute&quot; style=&quot;text-align: start;&quot; data-endline=&quot;67&quot; data-startline=&quot;67&quot; data-id=&quot;TemplateAttribute&quot; data-size=&quot;0&quot; data-position=&quot;1457&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;## Template.Attribute&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;69&quot; data-endline=&quot;69&quot; data-position=&quot;1457&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/attribute&quot;&gt;https://tuist.github.io/tuist/main/documentation/projectdescription/template/attribute&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688896346748&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;Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;tuist.github.io&quot; data-og-source-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/attribute&quot; data-og-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/attribute/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/attribute&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/attribute&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tuist.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;71&quot; data-endline=&quot;72&quot; data-position=&quot;1545&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;해당 타입은 커맨드의 옵션을 받는 변수를 선언할 수 있다.&lt;br /&gt;예를 들어 &lt;u&gt;name이라는 attribute&lt;/u&gt;가 존재한다면&amp;hellip;&lt;/p&gt;
&lt;pre class=&quot;ada&quot; style=&quot;text-align: start;&quot; data-startline=&quot;74&quot; data-endline=&quot;76&quot; data-position=&quot;1613&quot; data-size=&quot;0&quot;&gt;&lt;code&gt;tuist scafflod --name Ari
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;78&quot; data-endline=&quot;78&quot; data-position=&quot;1648&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;이런식으로 옵션을 추가적으로 받아볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;80&quot; data-endline=&quot;80&quot; data-position=&quot;1675&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;이 옵션은 위 예시처럼 required로 필수로 받아볼 수 있고 &lt;u&gt;optional&lt;/u&gt;하게 받아볼 수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;80&quot; data-endline=&quot;80&quot; data-position=&quot;1675&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;80&quot; data-endline=&quot;80&quot; data-position=&quot;1675&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Templete&quot; style=&quot;text-align: start;&quot; data-startline=&quot;83&quot; data-endline=&quot;83&quot; data-id=&quot;Templete&quot; data-size=&quot;0&quot; data-position=&quot;1748&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;## Templete&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-position=&quot;1748&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template&quot;&gt;https://tuist.github.io/tuist/main/documentation/projectdescription/template&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688896342548&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;Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;tuist.github.io&quot; data-og-source-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template&quot; data-og-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tuist.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;87&quot; data-endline=&quot;87&quot; data-position=&quot;1826&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;그 다음으로 템플릿 모델을 선언해준다. &lt;br /&gt;위에서 선언해준 attributes를 할당하고, items를 할당해줘야 하는데, 여기에는 &lt;u&gt;템플릿을 생성할 때 추가할 파일들을 할당&lt;/u&gt;해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;87&quot; data-endline=&quot;87&quot; data-position=&quot;1826&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;87&quot; data-endline=&quot;87&quot; data-position=&quot;1826&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;TempleteItem&quot; style=&quot;text-align: start;&quot; data-startline=&quot;89&quot; data-endline=&quot;89&quot; data-id=&quot;TempleteItem&quot; data-size=&quot;0&quot; data-position=&quot;1947&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;## Templete.Item&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;91&quot; data-endline=&quot;91&quot; data-position=&quot;1947&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/item&quot;&gt;https://tuist.github.io/tuist/main/documentation/projectdescription/template/item&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688896339337&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;Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;tuist.github.io&quot; data-og-source-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/item&quot; data-og-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/item/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/item&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tuist.github.io/tuist/main/documentation/projectdescription/template/item&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tuist.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;93&quot; data-endline=&quot;94&quot; data-position=&quot;2030&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;이 아이템은 템플릿을 생성할 때 추가될 파일을 의미한다.&lt;br /&gt;파일은 &lt;u&gt;경로&lt;/u&gt;로 전달해줄 수도 있고, &lt;u&gt;디렉토리&lt;/u&gt; 자체를 넘겨줄 수도 있으며, 단순히 &lt;u&gt;문자열&lt;/u&gt;로 생성해줄 수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;93&quot; data-endline=&quot;94&quot; data-position=&quot;2030&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;96&quot; data-endline=&quot;96&quot; data-position=&quot;2125&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위 코드에서는 ModuleTemplate라는 enum 타입을 만들어 items 할당을 손쉽게 할 수 있도록 작성해준 모습을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;98&quot; data-endline=&quot;98&quot; data-position=&quot;2205&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;이때 추가되는 파일에는 &lt;u&gt;stencil이라는 템플릿 언어를 사용하여 만든 파일&lt;/u&gt;을 추가해줘야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;98&quot; data-endline=&quot;98&quot; data-position=&quot;2205&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;98&quot; data-endline=&quot;98&quot; data-position=&quot;2205&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Stencil&quot; style=&quot;text-align: start;&quot; data-endline=&quot;100&quot; data-startline=&quot;100&quot; data-id=&quot;Stencil&quot; data-size=&quot;0&quot; data-position=&quot;2272&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;## Stencil&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;102&quot; data-endline=&quot;102&quot; data-position=&quot;2272&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/stencilproject/Stencil&quot;&gt;https://github.com/stencilproject/Stencil&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688897169019&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 - stencilproject/Stencil: Stencil is a simple and powerful template language for Swift.&quot; data-og-description=&quot;Stencil is a simple and powerful template language for Swift. - GitHub - stencilproject/Stencil: Stencil is a simple and powerful template language for Swift.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/stencilproject/Stencil&quot; data-og-url=&quot;https://github.com/stencilproject/Stencil&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cwERI2/hyTfvGgfMG/dGjKn3HyyFpcYeFt9Fuhhk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/stencilproject/Stencil&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/stencilproject/Stencil&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cwERI2/hyTfvGgfMG/dGjKn3HyyFpcYeFt9Fuhhk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - stencilproject/Stencil: Stencil is a simple and powerful template language for Swift.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Stencil is a simple and powerful template language for Swift. - GitHub - stencilproject/Stencil: Stencil is a simple and powerful template language for Swift.&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 style=&quot;text-align: start;&quot; data-startline=&quot;104&quot; data-endline=&quot;104&quot; data-position=&quot;2315&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;스텐실은 Swift를 이용한 템플릿 언어를 의미한다. &lt;br /&gt;(자세한건 위 링크 참고)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;106&quot; data-endline=&quot;106&quot; data-position=&quot;2394&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;106&quot; data-endline=&quot;106&quot; data-position=&quot;2394&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;아래는 .stencil 파일 예시이다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-position=&quot;2417&quot; data-endline=&quot;131&quot; data-startline=&quot;108&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;// Project.stencil 파일
import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: &quot;{{ name }}&quot;,
    product: .staticFramework,
    deploymentTarget: .iOS(targetVersion: &quot;14.0&quot;, devices: [.iphone, .ipad]),
    dependencies: [],
    sources: [
        &quot;Sources/**&quot;
    ],
    resources: nil,
    settings: .settings(
        base: SettingsDictionary(),
        configurations: [
            .debug(name: .debug),
            .release(name: .release),
            .release(name: .stage)
        ]
    )
)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-position=&quot;2977&quot; data-endline=&quot;146&quot; data-startline=&quot;133&quot; data-size=&quot;0&quot;&gt;&lt;code&gt;// Temp.stencil 파일
//
//  Temp.swift
//  Grip
//
//  Created by {{ author }} on {{ currentDate }}
//  Copyright &amp;copy; 2023 Grip Corp. All rights reserved.
//

import UIKit

struct Temp {}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; text-align: start;&quot; data-startline=&quot;148&quot; data-endline=&quot;150&quot; data-position=&quot;3175&quot; data-size=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;148&quot; data-endline=&quot;150&quot; data-position=&quot;3177&quot; data-size=&quot;0&quot;&gt;위 코드를 보면 커맨드로 받은 attribute를 코드 내부에 변수처럼 심어준 것을 확인할 수 있다.&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;h1 id=&quot;scafflod-명령어-실행&quot; style=&quot;text-align: start;&quot; data-endline=&quot;151&quot; data-startline=&quot;151&quot; data-id=&quot;scafflod-명령어-실행&quot; data-size=&quot;0&quot; data-position=&quot;3255&quot;&gt;&lt;b&gt;# scafflod 명령어 실행&lt;/b&gt;&lt;/h1&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;153&quot; data-endline=&quot;153&quot; data-position=&quot;3255&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 템플릿 작성을 마쳤다면, 명렁어를 실행해주면 되는데, 편의를 위해 Makefile을 작성해주면 좋다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;155&quot; data-endline=&quot;155&quot; data-position=&quot;3319&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;Makefile은 보통 git 명령어를 실행하는 프로젝트 디렉토리 내부에 생성해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;155&quot; data-endline=&quot;155&quot; data-position=&quot;3319&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;157&quot; data-endline=&quot;157&quot; data-position=&quot;3371&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;별도로 확장자는 필요없고&amp;nbsp;&lt;u&gt;Makefile&lt;/u&gt;이라는 파일을 생성해주면 된다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;text-align: start;&quot; data-startline=&quot;159&quot; data-endline=&quot;169&quot; data-position=&quot;3414&quot; data-size=&quot;0&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;USER_NAME = $(shell python3 scripts/author_name.py)
CURRENT_DATE = $(shell pipenv run python scripts/current_date.py)

# 사용법: make module name=모듈이름
module:
	@tuist scaffold Module \
	 --name ${name} \
	 --author &quot;$(USER_NAME)&quot; \
	 --current-date &quot;$(CURRENT_DATE)&quot;
	 
	@tuist edit&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;171&quot; data-endline=&quot;172&quot; data-position=&quot;3626&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;위는 Makefile의 예시이다.&lt;br /&gt;살펴보면 attribute를 전달해주고 수행 이후에는 &lt;u&gt;tuist edit&lt;/u&gt; 명령어를 실행하는 모습을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;171&quot; data-endline=&quot;172&quot; data-position=&quot;3626&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;새로운 모듈을 생성하고 매니페스트를 편집하기 위해서 해당 명령어로 구성해주었다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;171&quot; data-endline=&quot;172&quot; data-position=&quot;3626&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;174&quot; data-endline=&quot;174&quot; data-position=&quot;3711&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;상단에는 &lt;u&gt;USER_NAME&lt;/u&gt;과 &lt;u&gt;CURRENT_DATE&lt;/u&gt;라는 변수가 선언되어 있는데, 필수는 아니지만...&lt;br /&gt;파이썬으로 사용자 이름과 현재 날짜를 가져오는 스크립트를 실행하는 부분이다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;174&quot; data-endline=&quot;174&quot; data-position=&quot;3711&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;176&quot; data-endline=&quot;176&quot; data-position=&quot;3790&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;아래는 파이썬 코드의 예시다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;176&quot; data-endline=&quot;176&quot; data-position=&quot;3790&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;176&quot; data-endline=&quot;176&quot; data-position=&quot;3790&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;179&quot; data-endline=&quot;179&quot; data-position=&quot;3821&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-position=&quot;3811&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;작성자 가져오기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;text-align: start;&quot; data-startline=&quot;181&quot; data-endline=&quot;191&quot; data-position=&quot;3821&quot;&gt;&lt;code&gt;import subprocess

def get_full_name():
    command = 'osascript -e &quot;long user name of (system info)&quot;'
    process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
    output, _ = process.communicate()
    return output.decode().strip()

print(get_full_name())
&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;blockquote data-startline=&quot;193&quot; data-endline=&quot;193&quot; data-position=&quot;4125&quot; data-original-title=&quot;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-position=&quot;4114&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;현재 날짜 가져오기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;sas&quot; style=&quot;text-align: start;&quot; data-startline=&quot;194&quot; data-endline=&quot;203&quot; data-position=&quot;4125&quot; data-size=&quot;0&quot;&gt;&lt;code&gt;import datetime

def get_current_date():
    today = datetime.date.today() # Format the date as &quot;YYYY/MM/DD&quot;
    formatted_date = today.strftime('%Y/%m/%d')
    return formatted_date

print(get_current_date())
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;205&quot; data-endline=&quot;205&quot; data-position=&quot;4350&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;205&quot; data-endline=&quot;205&quot; data-position=&quot;4350&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-startline=&quot;205&quot; data-endline=&quot;205&quot; data-position=&quot;4350&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 커맨트 설정까지 마쳤다면 프로젝트 경로에서&amp;nbsp;&lt;u&gt;make module name=Core&lt;/u&gt;&amp;nbsp;라는 명령어를 수행해주면, &lt;br /&gt;작성된 템플릿을 통해 설정된 경로에 Core라는 이름을 가진 새로운 모듈을 생성해주게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;scafflod-명령어-실행&quot; style=&quot;text-align: start;&quot; data-endline=&quot;151&quot; data-startline=&quot;151&quot; data-id=&quot;scafflod-명령어-실행&quot; data-size=&quot;0&quot; data-position=&quot;3255&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1688896851403&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;tuist scaffold | Tuist Documentation&quot; data-og-description=&quot;Learn how to use the scaffold command to generate files from a pre-defined template.&quot; data-og-host=&quot;docs.tuist.io&quot; data-og-source-url=&quot;https://docs.tuist.io/commands/scaffold/&quot; data-og-url=&quot;https://docs.tuist.io/commands/scaffold&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.tuist.io/commands/scaffold/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.tuist.io/commands/scaffold/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;tuist scaffold | Tuist Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to use the scaffold command to generate files from a pre-defined template.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.tuist.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1688896840631&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 - minsOne/iOSApplicationTemplate: Tuist based iOS Application Project Template&quot; data-og-description=&quot;Tuist based iOS Application Project Template. Contribute to minsOne/iOSApplicationTemplate development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/minsOne/iOSApplicationTemplate&quot; data-og-url=&quot;https://github.com/minsOne/iOSApplicationTemplate&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c6FD7Z/hyTfFohHEv/Hi4bQ1PWss7gG6NOZdKsBK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/minsOne/iOSApplicationTemplate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/minsOne/iOSApplicationTemplate&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c6FD7Z/hyTfFohHEv/Hi4bQ1PWss7gG6NOZdKsBK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - minsOne/iOSApplicationTemplate: Tuist based iOS Application Project Template&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tuist based iOS Application Project Template. Contribute to minsOne/iOSApplicationTemplate development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1688896834694&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;Tuist 로 모듈 생성 자동화하기&quot; data-og-description=&quot;안녕하세요? iOS 엔지니어 박형석입니다. 이번 글에서는 Tuist 에서 모듈화 작업 중 실수하기 쉽고 번거로운 작업인 모듈 생성을 자동화해서 명령어 하나로 기본 모듈을 생성하는 방법을 소개하려&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@phs880623/tuist-%EB%A1%9C-%EB%AA%A8%EB%93%88-%EC%83%9D%EC%84%B1-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0-d39c63ead7ff&quot; data-og-url=&quot;https://medium.com/@phs880623/tuist-%EB%A1%9C-%EB%AA%A8%EB%93%88-%EC%83%9D%EC%84%B1-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0-d39c63ead7ff&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2jicQ/hyTftn9mdK/OOPTtblw1GYrTXBLnHvov0/img.png?width=1140&amp;amp;height=250&amp;amp;face=0_0_1140_250,https://scrap.kakaocdn.net/dn/pxwfP/hyTfG1Nb4r/tSJTmfiQfPzcMKSGAFfkMk/img.png?width=1358&amp;amp;height=679&amp;amp;face=0_0_1358_679&quot;&gt;&lt;a href=&quot;https://medium.com/@phs880623/tuist-%EB%A1%9C-%EB%AA%A8%EB%93%88-%EC%83%9D%EC%84%B1-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0-d39c63ead7ff&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@phs880623/tuist-%EB%A1%9C-%EB%AA%A8%EB%93%88-%EC%83%9D%EC%84%B1-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0-d39c63ead7ff&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2jicQ/hyTftn9mdK/OOPTtblw1GYrTXBLnHvov0/img.png?width=1140&amp;amp;height=250&amp;amp;face=0_0_1140_250,https://scrap.kakaocdn.net/dn/pxwfP/hyTfG1Nb4r/tSJTmfiQfPzcMKSGAFfkMk/img.png?width=1358&amp;amp;height=679&amp;amp;face=0_0_1358_679');&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;Tuist 로 모듈 생성 자동화하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요? iOS 엔지니어 박형석입니다. 이번 글에서는 Tuist 에서 모듈화 작업 중 실수하기 쉽고 번거로운 작업인 모듈 생성을 자동화해서 명령어 하나로 기본 모듈을 생성하는 방법을 소개하려&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;공감  ㆍ&amp;nbsp;구독✅ ㆍ&amp;nbsp;공유  ㆍ&lt;span&gt;&amp;nbsp;&lt;/span&gt;댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;</description>
      <category>Swift/iOS</category>
      <category>IOS</category>
      <category>scafflod</category>
      <category>stencil</category>
      <category>Swift</category>
      <category>templete</category>
      <category>tuist</category>
      <category>tuist scafflod</category>
      <category>Xcode</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/81</guid>
      <comments>https://leeari95.tistory.com/81#entry81comment</comments>
      <pubDate>Sun, 9 Jul 2023 19:14:34 +0900</pubDate>
    </item>
    <item>
      <title>[Figma/Tip] 디자인 가이드 확인할 때 유용한 꿀팁 모음</title>
      <link>https://leeari95.tistory.com/80</link>
      <description>&lt;blockquote data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;피그마 이용하면서 활용하면 유용한 단축키, 꿀팁들을 알아봅시다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;014&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/014.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/014.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;피그마 단축키 도우미&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;우측 하단 &lt;u&gt;?&lt;/u&gt; 버튼 &amp;gt; &lt;u&gt;Keyboard shortcuts&lt;/u&gt;를 클릭.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DXWir/btr95qoVnbh/Z5KBi5UROw40I8xkQnNSW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DXWir/btr95qoVnbh/Z5KBi5UROw40I8xkQnNSW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DXWir/btr95qoVnbh/Z5KBi5UROw40I8xkQnNSW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDXWir%2Fbtr95qoVnbh%2FZ5KBi5UROw40I8xkQnNSW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;261&quot; height=&quot;493&quot; data-origin-width=&quot;456&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;섹션별로&amp;nbsp;탭이&amp;nbsp;나누어져&amp;nbsp;있는데,&amp;nbsp;단축키를&amp;nbsp;누르면&amp;nbsp;아래&amp;nbsp;그림처럼&amp;nbsp;&lt;u&gt;파란색&lt;/u&gt;으로 채워진다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b96bIP/btsafNW2fD3/TQhLHgqrSYyeiJpaQZ1iPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b96bIP/btsafNW2fD3/TQhLHgqrSYyeiJpaQZ1iPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b96bIP/btsafNW2fD3/TQhLHgqrSYyeiJpaQZ1iPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb96bIP%2FbtsafNW2fD3%2FTQhLHgqrSYyeiJpaQZ1iPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2088&quot; height=&quot;478&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;478&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;(개발자는 단축키를 애용해야 제맛이지  )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;u&gt;Tools&lt;/u&gt;, &lt;u&gt;Zoom&lt;/u&gt; 쪽 단축키들이 가장 유용했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) &lt;span&gt;코멘트&lt;/span&gt; &lt;span&gt;달&lt;/span&gt; &lt;span&gt;때&lt;/span&gt; &lt;u&gt;c&lt;/u&gt; &lt;span&gt;누르면&lt;/span&gt; &lt;span&gt;코멘트&lt;/span&gt; &lt;span&gt;커서로&lt;/span&gt; &lt;span&gt;바뀐다&lt;/span&gt;. (Tools)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;컬러 코드 확인하기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;위 내용과 이어지는 내용인데,&amp;nbsp;&lt;u&gt; i &lt;/u&gt;버튼을 누르면 자동으로 pick color 툴로 &lt;u&gt;커서가 변하면서 아래처럼 컬러코드를 확인&lt;/u&gt;할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAknSf/btsaeuKME5t/RFNSBOGxhasqHm3yZAEXu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAknSf/btsaeuKME5t/RFNSBOGxhasqHm3yZAEXu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAknSf/btsaeuKME5t/RFNSBOGxhasqHm3yZAEXu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAknSf%2FbtsaeuKME5t%2FRFNSBOGxhasqHm3yZAEXu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;437&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;742&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;blockquote data-ke-style=&quot;style2&quot;&gt;또다른 방법은 이미지 요소를 선택한 후 우측 inspect 를 확인해서 아래처럼 확인할 수 있다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bblAUO/btsafOBEz1S/IpW1q1q0vouukOj5aKt4BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bblAUO/btsafOBEz1S/IpW1q1q0vouukOj5aKt4BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bblAUO/btsafOBEz1S/IpW1q1q0vouukOj5aKt4BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbblAUO%2FbtsafOBEz1S%2FIpW1q1q0vouukOj5aKt4BK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;506&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;이미지 리소스 간편 다운로드&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;아래 사진과 같이 + 버튼을 통해 여러 스케일의 이미지를 추가할 수 있고, &lt;br /&gt;선택한 이미지를 한꺼번에 Export할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;1708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q17wb/btsabeuPUjv/YbH525qGDy08wI4pdJaZe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q17wb/btsabeuPUjv/YbH525qGDy08wI4pdJaZe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q17wb/btsabeuPUjv/YbH525qGDy08wI4pdJaZe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq17wb%2FbtsabeuPUjv%2FYbH525qGDy08wI4pdJaZe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;1708&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;1708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한&lt;span&gt;&amp;nbsp;&lt;/span&gt;Xcode에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Assets을&lt;span&gt;&amp;nbsp;&lt;/span&gt;추가할&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;때도&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;2x, 3x&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;u&gt;같이&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;선택해서&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;드래그&lt;/u&gt;해서&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;넣어주면&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;자동으로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;하나로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;합쳐서&lt;span&gt;&amp;nbsp;&lt;/span&gt;2x, 3x&lt;span&gt;&amp;nbsp;&lt;/span&gt;별로&lt;span&gt;&amp;nbsp;&lt;/span&gt;추가&lt;/u&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;blockquote data-ke-style=&quot;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면, &lt;span&gt;&amp;nbsp;&lt;/span&gt;공감  ㆍ&amp;nbsp;구독✅ ㆍ&amp;nbsp;공유  ㆍ&lt;span&gt;&amp;nbsp;&lt;/span&gt;댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;</description>
      <category>Swift/iOS</category>
      <category>figma</category>
      <category>IOS</category>
      <category>tip</category>
      <category>꿀팁</category>
      <category>꿀팁모음</category>
      <category>피그마</category>
      <category>피그마꿀팁</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/80</guid>
      <comments>https://leeari95.tistory.com/80#entry80comment</comments>
      <pubDate>Fri, 14 Apr 2023 14:39:58 +0900</pubDate>
    </item>
    <item>
      <title>[후기] YAPP X 인프런 - UX/UI 시작하기 : Figma 입문</title>
      <link>https://leeari95.tistory.com/79</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;YAPP 후원을 통해 얻은 인프런 수강권으로 피그마 강의를 듣고, 스터디를 진행하며 작성하게 된 후기입니다.&lt;/blockquote&gt;
&lt;p data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;피그마 스터디를 시작하게된 계기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번 YAPP 21기 기수에서는 인프런과 연계하여 수강권을 제공해 주었고, 그중 피그마 강의를 선택하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이유는 iOS 개발자로서 디자이너와 협업하다 보면 Figma라는 툴을 많이 사용하게 되는데, 이 툴을 좀더 잘 활용할 수 있다면[?] 협업하는 데 있어서 도움이 되지 않을까 싶어서 배워보고 싶어졌고, 수강하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;스터디 진행&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&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-origin-width=&quot;1011&quot; data-origin-height=&quot;1369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K9EUu/btr2sWuu2G2/ydvGt13ORX9uEOBLgphq6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K9EUu/btr2sWuu2G2/ydvGt13ORX9uEOBLgphq6k/img.png&quot; data-alt=&quot;내가 처음으로 제대로 만들어본 간단한 프로토타이핑~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K9EUu/btr2sWuu2G2/ydvGt13ORX9uEOBLgphq6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK9EUu%2Fbtr2sWuu2G2%2FydvGt13ORX9uEOBLgphq6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;1369&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;1369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내가 처음으로 제대로 만들어본 간단한 프로토타이핑~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;후기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스터디 후반에는 면접 일정 및 YAPP 프로젝트 개발 활동 등등 겹치게 되어서 완주하지는 못했다. 하지만 피그마의 기초적인 부분에 대해서 배우게 되었고, 핵심 기능들을 잘 다룰 수 있게 되었다. 다만 Figma 업데이트 속도가 빠른건지 강의 중간 중간 현재 버전과 강의에 나오는 피그마 툴이 약간씩 상의했던 점이 아쉬웠다. (그래도 이 부분은 질문하면 빠르게 답변해주시는 것 같았다!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Figma로 협업하면서 마주했던 문제도 있었는데, 이 부분 또한 Figma 공식문서에 해결방안이 잘 나와있어 해결 후 동아리 동료분들에게 공유해주기도 하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euAEtw/btr2vTRmI2c/iGQ7kbZvGAQOmoVWa3ukk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euAEtw/btr2vTRmI2c/iGQ7kbZvGAQOmoVWa3ukk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euAEtw/btr2vTRmI2c/iGQ7kbZvGAQOmoVWa3ukk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuAEtw%2Fbtr2vTRmI2c%2FiGQ7kbZvGAQOmoVWa3ukk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;817&quot; height=&quot;1124&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;1124&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;Figma 툴을 익힌다고 해서 디자인을 잘할 수 있다거나 그런건 아니지만, 앞으로 iOS 개발하면서 디자이너 분들과 원활한 협업을 위해 한번쯤 배워보는 것도 나쁘지 않다고 생각한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 남은 강의들도 열심히 들어야지!!!  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbNrDJ/btr2hIjLRsn/1GZ1hTFm7vu7qwVJPuf4l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbNrDJ/btr2hIjLRsn/1GZ1hTFm7vu7qwVJPuf4l1/img.png&quot; data-alt=&quot;미래의 나.... 화이팅...!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbNrDJ/btr2hIjLRsn/1GZ1hTFm7vu7qwVJPuf4l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbNrDJ%2Fbtr2hIjLRsn%2F1GZ1hTFm7vu7qwVJPuf4l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;914&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;914&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;이곳은 다른 디자이너 분들이 만든 UI/UX를 엿볼 수 있는 링크다!! 나중에 따라 만들어봐야지 ㅎㅎ~&lt;/p&gt;
&lt;figure id=&quot;og_1678096398181&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;Lifeplus&quot; data-og-description=&quot;한국의 UI/UX 모바일 패턴을 수집합니다.&quot; data-og-host=&quot;wwit.design&quot; data-og-source-url=&quot;https://wwit.design/tag/life&quot; data-og-url=&quot;https://wwit.design//2021/02/16/lifeplus/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bD0oKV/hyRRBMKk9d/dYLbdtUF6bSKphTpur5slk/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840,https://scrap.kakaocdn.net/dn/vi7Yy/hyRQwzwhHn/Dvk6Pu3JmYbkUYYvvPOHTk/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840,https://scrap.kakaocdn.net/dn/bjNAPs/hyRQrdTD9W/095skgT63KpH7OAZQJWeA0/img.png?width=1125&amp;amp;height=2436&amp;amp;face=0_0_1125_2436&quot;&gt;&lt;a href=&quot;https://wwit.design/tag/life&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wwit.design/tag/life&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bD0oKV/hyRRBMKk9d/dYLbdtUF6bSKphTpur5slk/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840,https://scrap.kakaocdn.net/dn/vi7Yy/hyRQwzwhHn/Dvk6Pu3JmYbkUYYvvPOHTk/img.png?width=1600&amp;amp;height=840&amp;amp;face=0_0_1600_840,https://scrap.kakaocdn.net/dn/bjNAPs/hyRQrdTD9W/095skgT63KpH7OAZQJWeA0/img.png?width=1125&amp;amp;height=2436&amp;amp;face=0_0_1125_2436');&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;Lifeplus&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한국의 UI/UX 모바일 패턴을 수집합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wwit.design&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;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;내가 들었던 강의&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1678096229459&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;UX/UI 시작하기 : Figma 입문 (Inflearn Original) - 인프런 | 강의&quot; data-og-description=&quot;UI 디자인 스케치, 프로토타이핑 및 협업을 위한 디자인 도구 Figma(피그마)의 기본적인 사용법과 실무 활용법에 대해 학습해 봅니다., - 강의 소개 | 인프런&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/course/%ED%94%BC%EA%B7%B8%EB%A7%88-%EC%9E%85%EB%AC%B8-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90&quot; data-og-url=&quot;https://www.inflearn.com/course/%ED%94%BC%EA%B7%B8%EB%A7%88-%EC%9E%85%EB%AC%B8-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wfl5p/hyRQno1Wk7/Kf12dUdRfjthgDURKcm791/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/1QQrz/hyRQqMPEYv/7TKBfCgDVIStYIRqmbnJNK/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/N2gFr/hyRQiON0yH/McNP7ZTA956OGsESg6V66K/img.png?width=1200&amp;amp;height=730&amp;amp;face=0_0_1200_730&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%ED%94%BC%EA%B7%B8%EB%A7%88-%EC%9E%85%EB%AC%B8-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/course/%ED%94%BC%EA%B7%B8%EB%A7%88-%EC%9E%85%EB%AC%B8-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wfl5p/hyRQno1Wk7/Kf12dUdRfjthgDURKcm791/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/1QQrz/hyRQqMPEYv/7TKBfCgDVIStYIRqmbnJNK/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500,https://scrap.kakaocdn.net/dn/N2gFr/hyRQiON0yH/McNP7ZTA956OGsESg6V66K/img.png?width=1200&amp;amp;height=730&amp;amp;face=0_0_1200_730');&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;UX/UI 시작하기 : Figma 입문 (Inflearn Original) - 인프런 | 강의&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;UI 디자인 스케치, 프로토타이핑 및 협업을 위한 디자인 도구 Figma(피그마)의 기본적인 사용법과 실무 활용법에 대해 학습해 봅니다., - 강의 소개 | 인프런&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.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;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면, &lt;span&gt;&amp;nbsp;&lt;/span&gt;공감  ㆍ&amp;nbsp;구독✅ ㆍ&amp;nbsp;공유  ㆍ&lt;span&gt;&amp;nbsp;&lt;/span&gt;댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;</description>
      <category>쪼잘쪼잘</category>
      <category>figma</category>
      <category>inflearn</category>
      <category>IT동아리</category>
      <category>YAPP</category>
      <category>YAPP21기X인프런</category>
      <category>강의후기</category>
      <category>동아리</category>
      <category>얍</category>
      <category>인프런</category>
      <category>후기</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/79</guid>
      <comments>https://leeari95.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 6 Mar 2023 19:56:07 +0900</pubDate>
    </item>
    <item>
      <title>[iOS/Tuist] Objective-C 코드가 포함된 라이브러리 의존성 주입시 발생하는 문제</title>
      <link>https://leeari95.tistory.com/78</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;YAPP 동아리 21기 iOS 2팀 &lt;u&gt;&lt;a href=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;핏프티 프로젝트&lt;/a&gt;&lt;/u&gt;를 진행하면서 겪었던 문제입니다.&amp;nbsp;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Tuist 4 버전부터는 발생하지 않으니 참고해주세요.&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h1 data-startline=&quot;2&quot; data-endline=&quot;2&quot; data-id=&quot;문제-상황&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;2&quot; data-endline=&quot;2&quot; data-id=&quot;문제-상황&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;문제-상황&quot; data-startline=&quot;2&quot; data-endline=&quot;2&quot; data-id=&quot;문제-상황&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;3&quot; data-size=&quot;5&quot;&gt;# 문제 상황&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-startline=&quot;4&quot; data-endline=&quot;4&quot; data-position=&quot;10&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;10&quot; data-size=&quot;64&quot;&gt;먼저 dependencies에 Amplify 라이브러리 설치를 위해 SPM 목록에 아래와 같이 코드를 추가해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;lisp&quot; data-startline=&quot;6&quot; data-endline=&quot;33&quot; data-position=&quot;76&quot;&gt;&lt;code&gt;import ProjectDescription
import ProjectDescriptionHelpers

let dependencies = Dependencies(
    carthage: [],
    swiftPackageManager: [
        .remote(
            url: &quot;https://github.com/kakao/kakao-ios-sdk&quot;,
            requirement: .upToNextMajor(from: &quot;2.13.0&quot;)
        ),
        .remote(
            url: &quot;https://github.com/Moya/Moya.git&quot;,
            requirement: .upToNextMajor(from: &quot;15.0.0&quot;)
        ),
        .remote(
            url: &quot;https://github.com/onevcat/Kingfisher.git&quot;,
            requirement: .upToNextMajor(from: &quot;7.0.0&quot;)
        ),
        .remote( // 추가한 코드.
            url: &quot;https://github.com/aws-amplify/amplify-swift.git&quot;,
            requirement: .upToNextMajor(from: &quot;2.0.0&quot;)
        )
    ],
    platforms: [.iOS]
)

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;36&quot; data-endline=&quot;37&quot; data-position=&quot;848&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;848&quot; data-size=&quot;51&quot;&gt;그리고 tuist fetch 이후 tuist generator를 통해 프로젝트를 실행했더니,&lt;/span&gt;&lt;br /&gt;&lt;span data-position=&quot;900&quot; data-size=&quot;26&quot;&gt;다음과 같은 에러가 발생하면서 빌드에 실패했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;xquery&quot; data-startline=&quot;39&quot; data-endline=&quot;43&quot; data-position=&quot;928&quot;&gt;&lt;code&gt;Could not build Objective-C module 'libtommathAmplify'

'../amplify_tommath.h' file not found
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 data-startline=&quot;45&quot; data-endline=&quot;45&quot; data-id=&quot;이유&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;45&quot; data-endline=&quot;45&quot; data-id=&quot;이유&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;이유&quot; data-startline=&quot;45&quot; data-endline=&quot;45&quot; data-id=&quot;이유&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;1033&quot; data-size=&quot;2&quot;&gt;# 이유&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-startline=&quot;47&quot; data-endline=&quot;47&quot; data-position=&quot;1037&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1037&quot; data-size=&quot;34&quot;&gt;일반적으로 tuist에서 지원하는 외부 의존성은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;49&quot; data-endline=&quot;52&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;49&quot; data-endline=&quot;49&quot; data-position=&quot;1075&quot; data-size=&quot;0&quot;&gt;&lt;u&gt;SPM&lt;/u&gt;&lt;span data-position=&quot;1080&quot; data-size=&quot;33&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;49&quot; data-endline=&quot;49&quot; data-position=&quot;1075&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1080&quot; data-size=&quot;33&quot;&gt;Swift Package &lt;/span&gt;&lt;span data-position=&quot;1080&quot; data-size=&quot;33&quot;&gt;Manager 를 사용하는 의존성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;50&quot; data-endline=&quot;50&quot; data-position=&quot;1116&quot; data-size=&quot;0&quot;&gt;&lt;u&gt;Tuist + Swift Package&lt;/u&gt;&lt;span data-position=&quot;1139&quot; data-size=&quot;43&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;50&quot; data-endline=&quot;50&quot; data-position=&quot;1116&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1139&quot; data-size=&quot;43&quot;&gt;Dependencies.swift 를 이용한 Swift Pakcage 의존성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;51&quot; data-endline=&quot;52&quot; data-position=&quot;1185&quot; data-size=&quot;0&quot;&gt;&lt;u&gt;Tuist + Carthage&lt;/u&gt;&lt;span data-position=&quot;1203&quot; data-size=&quot;38&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;51&quot; data-endline=&quot;52&quot; data-position=&quot;1185&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1203&quot; data-size=&quot;38&quot;&gt;Dependencies.swift 를 이용한 Carthage 의존성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-startline=&quot;53&quot; data-endline=&quot;53&quot; data-position=&quot;1243&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1243&quot; data-size=&quot;14&quot;&gt;나의 경우 2번째 방식인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;Tuist + Swift Package&lt;/u&gt;&lt;span data-position=&quot;1280&quot; data-size=&quot;27&quot;&gt;을 통해 라이브러리 의존성을 주입시켜주고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;55&quot; data-endline=&quot;55&quot; data-position=&quot;1309&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1309&quot; data-size=&quot;85&quot;&gt;하지만 이 방법으로 Objective-C 코드가 포함되어있는 라이브러리 설치 및 의존성 주입을 해주게 되면, 몇가지 파일을 찾지 못하는 경우가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;1916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw4fbo/btr1fOcJaJi/KsE3DJeheCBk9B4O4hXH60/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw4fbo/btr1fOcJaJi/KsE3DJeheCBk9B4O4hXH60/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw4fbo/btr1fOcJaJi/KsE3DJeheCBk9B4O4hXH60/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bw4fbo/btr1fOcJaJi/KsE3DJeheCBk9B4O4hXH60/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;479&quot; height=&quot;1015&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;1916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-startline=&quot;59&quot; data-endline=&quot;59&quot; data-position=&quot;1434&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1434&quot; data-size=&quot;1&quot;&gt;ㅎㅎㅎ....&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;63&quot; data-endline=&quot;63&quot; data-position=&quot;1591&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1592&quot; data-size=&quot;91&quot;&gt;왜 헤더 파일이 Xcode 내부 경로에 등록되지 않는지는 정확한 이유는 모르겠다. tuist 내부적인 문제 같다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;63&quot; data-endline=&quot;63&quot; data-position=&quot;1591&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1592&quot; data-size=&quot;91&quot;&gt;해당 관련 내용이 tuist 공식 문서에 이슈로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;&lt;a href=&quot;https://docs.tuist.io/guides/third-party-dependencies#some-notes-on-the-integration-of-swift-packages&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span data-position=&quot;1683&quot; data-size=&quot;2&quot;&gt;박제&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;span data-position=&quot;1789&quot; data-size=&quot;58&quot;&gt;되어있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;63&quot; data-endline=&quot;63&quot; data-position=&quot;1591&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1789&quot; data-size=&quot;58&quot;&gt;아직까지 해결되지 않은 이슈같고&amp;hellip; 아래와 같이 별도로 설정해주어야 한다고 설명이 나와있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OACVq/btr0JAuyTQw/wETkkrvWo8Zk6Cbhof4BW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OACVq/btr0JAuyTQw/wETkkrvWo8Zk6Cbhof4BW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OACVq/btr0JAuyTQw/wETkkrvWo8Zk6Cbhof4BW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOACVq%2Fbtr0JAuyTQw%2FwETkkrvWo8Zk6Cbhof4BW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1770&quot; height=&quot;766&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;67&quot; data-endline=&quot;70&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;67&quot; data-endline=&quot;67&quot; data-position=&quot;1889&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1889&quot; data-size=&quot;101&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://docs.tuist.io/guides/third-party-dependencies#some-notes-on-the-integration-of-swift-packages&quot;&gt;https://docs.tuist.io/guides/third-party-dependencies#some-notes-on-the-integration-of-swift-packages&lt;/a&gt;&lt;/li&gt;
&lt;li data-startline=&quot;68&quot; data-endline=&quot;68&quot; data-position=&quot;1993&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1993&quot; data-size=&quot;42&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/tuist/tuist/issues/3762&quot;&gt;https://github.com/tuist/tuist/issues/3762&lt;/a&gt;&lt;/li&gt;
&lt;li data-startline=&quot;69&quot; data-endline=&quot;70&quot; data-position=&quot;2038&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;2038&quot; data-size=&quot;42&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/tuist/tuist/issues/4180&quot;&gt;https://github.com/tuist/tuist/issues/4180&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-startline=&quot;71&quot; data-endline=&quot;72&quot; data-position=&quot;2082&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2082&quot; data-size=&quot;40&quot;&gt;하지만 이슈와 해당 내용을 참고해서 설정을 어떻게든 해보려고 했지만&amp;hellip;&lt;/span&gt;&lt;br /&gt;&lt;span data-position=&quot;2123&quot; data-size=&quot;84&quot;&gt;애초에 나는 Objective-C에 대한 지식도 없으며, 내가 설정을 제대로 한게 맞는건지 조차 잘 파악이 안되서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;71&quot; data-endline=&quot;72&quot; data-position=&quot;2082&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2123&quot; data-size=&quot;84&quot;&gt;위 내용으로는 결국 해결하지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;71&quot; data-endline=&quot;72&quot; data-position=&quot;2082&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2123&quot; data-size=&quot;84&quot;&gt;(혹시 이 글을 보시는 분들 중에 정확한 해결 솔루션을 알고있으시다면... 댓글로 공유해주시면 정말 감사하겠습니다 ㅠㅠ)&lt;/span&gt;&lt;/p&gt;
&lt;h1 data-startline=&quot;75&quot; data-endline=&quot;75&quot; data-id=&quot;해결-방법&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;75&quot; data-endline=&quot;75&quot; data-id=&quot;해결-방법&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;해결-방법&quot; data-startline=&quot;75&quot; data-endline=&quot;75&quot; data-id=&quot;해결-방법&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;2212&quot; data-size=&quot;5&quot;&gt;# 해결 방법&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-startline=&quot;77&quot; data-endline=&quot;77&quot; data-position=&quot;2219&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2219&quot; data-size=&quot;100&quot;&gt;그래서 내가 해결한 방법은 바로 Dependencies.swift를 이용해서 라이브러리를 설치해주는 것이 아니라, &lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;77&quot; data-endline=&quot;77&quot; data-position=&quot;2219&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2219&quot; data-size=&quot;100&quot;&gt;&lt;u&gt;SPM을 직접 사용&lt;/u&gt;해서 라이브러리를 설치해주는 방법으로 해결했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;80&quot; data-endline=&quot;80&quot; data-position=&quot;2322&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;80&quot; data-endline=&quot;80&quot; data-position=&quot;2322&quot; data-size=&quot;0&quot; data-ke-style=&quot;style2&quot;&gt;먼저 Dependencies.swift 파일에서 SPM 쪽에 라이브러리를 추가해주던 코드를 제거해주었다.&lt;/blockquote&gt;
&lt;pre class=&quot;vim&quot; data-position=&quot;2382&quot; data-endline=&quot;114&quot; data-startline=&quot;82&quot;&gt;&lt;code&gt;// Dependencies.swift 파일 내부

import ProjectDescription
import ProjectDescriptionHelpers

let dependencies = Dependencies(
    carthage: [],
    swiftPackageManager: [
        .remote(
            url: &quot;https://github.com/kakao/kakao-ios-sdk&quot;,
            requirement: .upToNextMajor(from: &quot;2.13.0&quot;)
        ),
        .remote(
            url: &quot;https://github.com/Moya/Moya.git&quot;,
            requirement: .upToNextMajor(from: &quot;15.0.0&quot;)
        ),
        .remote(
            url: &quot;https://github.com/onevcat/Kingfisher.git&quot;,
            requirement: .upToNextMajor(from: &quot;7.0.0&quot;)
        )
/*
       // 아래 코드는 제거...
       .remote(
           url: &quot;https://github.com/aws-amplify/amplify-swift.git&quot;,
           requirement: .upToNextMajor(from: &quot;2.0.0&quot;)
       )
*/
    ],
    platforms: [.iOS]
)

&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;blockquote data-startline=&quot;116&quot; data-endline=&quot;116&quot; data-position=&quot;3195&quot; data-size=&quot;0&quot; data-ke-style=&quot;style2&quot;&gt;그리고 Project.swift에 직접 패키지를 추가하고, 해당 라이브러리의 의존성이 필요한 타겟에 모두 아래와 같이 의존성을 추가해주었다.&lt;/blockquote&gt;
&lt;pre class=&quot;groovy&quot; data-position=&quot;3275&quot; data-endline=&quot;143&quot; data-startline=&quot;118&quot;&gt;&lt;code&gt;// Project.swift 파일 내부
let project = Project.makeModule(
    name: &quot;Fitfty&quot;,
    platform: .iOS,
    product: .app,
    packages: [ // packages를 추가하여 Amplify 라이브러리 추가
        .remote(
            url: &quot;https://github.com/aws-amplify/amplify-swift.git&quot;,
            requirement: .upToNextMajor(from: &quot;2.0.0&quot;)
        )
    ],
    dependencies: [
        .project(target: &quot;Coordinator&quot;, path: .relativeToRoot(&quot;Projects/Coordinator&quot;)),
        .package(product: &quot;Amplify&quot;), // 라이브러리 관련 의존성 주입
        .package(product: &quot;AWSAPIPlugin&quot;),
        .package(product: &quot;AWSDataStorePlugin&quot;),
        .package(product: &quot;AWSCognitoAuthPlugin&quot;),
        .package(product: &quot;AWSS3StoragePlugin&quot;)
    ],
    resources: [&quot;Resources/**&quot;],
    infoPlist: .file(path: &quot;Support/Info.plist&quot;),
    entitlements: &quot;Fitfty.entitlements&quot;
)

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;145&quot; data-endline=&quot;145&quot; data-position=&quot;4103&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;145&quot; data-endline=&quot;145&quot; data-position=&quot;4103&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;145&quot; data-endline=&quot;145&quot; data-position=&quot;4103&quot; data-size=&quot;0&quot; data-ke-style=&quot;style2&quot;&gt;그리고 해당 라이브러리를 사용하는 모든 모듈에 아래와 같이 의존성을 추가해주었다.&lt;/blockquote&gt;
&lt;pre class=&quot;gradle&quot; data-position=&quot;4150&quot; data-endline=&quot;169&quot; data-startline=&quot;147&quot;&gt;&lt;code&gt;// Auth/Project.swift 파일 내부
import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: &quot;Auth&quot;,
    product: .staticFramework,
    dependencies: [
        .Project.Common,
        .Project.Core,
        .SPM.Moya,
        .SPM.Kingfisher,
        .package(product: &quot;Amplify&quot;), // 의존성 추가
        .package(product: &quot;AWSCognitoAuthPlugin&quot;),
        .package(product: &quot;AWSS3StoragePlugin&quot;),
        .package(product: &quot;AWSAPIPlugin&quot;),
        .package(product: &quot;AWSDataStorePlugin&quot;)
    ]
)

// 나머지 Core, 메인 화면 등등.. 사용되는 모든 모듈에 의존성을 추가해주었다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;171&quot; data-endline=&quot;171&quot; data-position=&quot;4744&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;171&quot; data-endline=&quot;171&quot; data-position=&quot;4744&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;171&quot; data-endline=&quot;171&quot; data-position=&quot;4744&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;171&quot; data-endline=&quot;171&quot; data-position=&quot;4744&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;4744&quot; data-size=&quot;141&quot;&gt;이렇게 설정한 후 &lt;u&gt;tuist clean&lt;/u&gt;으로 tuist에서 생성된 모든 파일을 깔끔하게 정리해준 후 &lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;171&quot; data-endline=&quot;171&quot; data-position=&quot;4744&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;4744&quot; data-size=&quot;141&quot;&gt;&lt;u&gt;tuist fetch&lt;/u&gt;를 통해 다시 라이브러리 설치를 해준 다음 &lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;171&quot; data-endline=&quot;171&quot; data-position=&quot;4744&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;4744&quot; data-size=&quot;141&quot;&gt;&lt;u&gt;tuist generator&lt;/u&gt;를 통해 프로젝트를 실행하면 아래와 같은 화면을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca91DM/btr0RKpDxba/YIoPuuQbJjli5qku3bZ2Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca91DM/btr0RKpDxba/YIoPuuQbJjli5qku3bZ2Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca91DM/btr0RKpDxba/YIoPuuQbJjli5qku3bZ2Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca91DM%2Fbtr0RKpDxba%2FYIoPuuQbJjli5qku3bZ2Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;449&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-startline=&quot;175&quot; data-endline=&quot;175&quot; data-position=&quot;4925&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;175&quot; data-endline=&quot;175&quot; data-position=&quot;4925&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;175&quot; data-endline=&quot;175&quot; data-position=&quot;4925&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;4925&quot; data-size=&quot;73&quot;&gt;기존에 Xcode에서 수동으로 SPM을 통해 라이브러리 설치를 하면 나타나는 화면과 동일하게 설정되어 있는 모습을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;177&quot; data-endline=&quot;177&quot; data-position=&quot;5000&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;5000&quot; data-size=&quot;58&quot;&gt;이 경우, tuist generator를 하면 package 를 resolve한 뒤 프로젝트가 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot; data-position=&quot;5060&quot; data-endline=&quot;199&quot; data-startline=&quot;179&quot;&gt;&lt;code&gt;❯ tuist generate
Resolved cache profile 'Development' from Tuist's defaults
Generating workspace Fitfty.xcworkspace
Generating project MainFeed
Generating project Setting
Generating project Common
Generating project Fitfty
Generating project Auth
Generating project Core
Generating project Alamofire
Generating project Coordinator
Generating project Profile
Generating project Onboarding
Generating project Kingfisher
Generating project Moya
Generating project KakaoOpenSDK
Resolving package dependencies using xcodebuild
Project generated.
Total time taken: 4.089s
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;201&quot; data-endline=&quot;201&quot; data-position=&quot;5640&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;201&quot; data-endline=&quot;201&quot; data-position=&quot;5640&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;201&quot; data-endline=&quot;201&quot; data-position=&quot;5640&quot; data-size=&quot;0&quot; data-ke-style=&quot;style2&quot;&gt;다시 에러가 났던 경로를 찾아서 들어가면 정상적으로 헤더 파일이 추가되어 있는 것을 확인할 수 있다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccOTfq/btr1bkXxUtk/ft6318Yxkq3d6ClBzZXZPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccOTfq/btr1bkXxUtk/ft6318Yxkq3d6ClBzZXZPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccOTfq/btr1bkXxUtk/ft6318Yxkq3d6ClBzZXZPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccOTfq%2Fbtr1bkXxUtk%2Fft6318Yxkq3d6ClBzZXZPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;568&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-startline=&quot;205&quot; data-endline=&quot;205&quot; data-position=&quot;5736&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;205&quot; data-endline=&quot;205&quot; data-position=&quot;5736&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;5736&quot; data-size=&quot;47&quot;&gt;그리고 더이상 발생했던 에러 메세지는 나타나지 않았으며, 빌드도 성공적으로 되었다&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;207&quot; data-endline=&quot;209&quot; data-position=&quot;5785&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;5785&quot; data-size=&quot;25&quot;&gt;이 문제로 몇일을 삽질했는지 모르겠다&amp;hellip;ㅠㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;207&quot; data-endline=&quot;209&quot; data-position=&quot;5785&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span data-position=&quot;5811&quot; data-size=&quot;58&quot;&gt;왜 옵젝씨 코드가 포함된 라이브러리는 이런 에러가 나는지 모르겠으나, 하루 빨리 개선되었으면 좋겠다&amp;hellip;&lt;/span&gt;&lt;br /&gt;&lt;span data-position=&quot;5870&quot; data-size=&quot;53&quot;&gt;왜냐하면 이렇게 설정하면 tuist의 중요한 기능을 사용할 수가 없어 &lt;u&gt;빌드 속도가 늘어나기 때문&lt;/u&gt;이다&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;1614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTjAX8/btr1fPvXn02/OqgPp9c8HToLqyHn2EekN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTjAX8/btr1fPvXn02/OqgPp9c8HToLqyHn2EekN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTjAX8/btr1fPvXn02/OqgPp9c8HToLqyHn2EekN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTjAX8%2Fbtr1fPvXn02%2FOqgPp9c8HToLqyHn2EekN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1790&quot; height=&quot;1614&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;1614&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;blockquote data-ke-style=&quot;style2&quot;&gt;당시 해결했던 PR 보러 가기&lt;/blockquote&gt;
&lt;figure id=&quot;og_1677506932340&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;[Feature] Amplify 라이브러리 설치 및 AmplifyManager 구현 by leeari95 &amp;middot; Pull Request #31 &amp;middot; YAPP-Github/21st-iOS-Team-&quot; data-og-description=&quot;  Issue 관련 이슈를 연결합니다. fix x   작업 내역 구현 내용 및 작업 했던 내역, 변경 사항을 포함합니다. 라이브러리 Amplify 설치 tuist+SPM으로 라이브러리 의존성 추가 시 에러가 발생합니다. [&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/pull/31&quot; data-og-url=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/pull/31&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vWn1z/hyRMpe14E5/fkkkEBfNmk9kEk1n7pZdXk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/pull/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/pull/31&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vWn1z/hyRMpe14E5/fkkkEBfNmk9kEk1n7pZdXk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Feature] Amplify 라이브러리 설치 및 AmplifyManager 구현 by leeari95 &amp;middot; Pull Request #31 &amp;middot; YAPP-Github/21st-iOS-Team-&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Issue 관련 이슈를 연결합니다. fix x   작업 내역 구현 내용 및 작업 했던 내역, 변경 사항을 포함합니다. 라이브러리 Amplify 설치 tuist+SPM으로 라이브러리 의존성 추가 시 에러가 발생합니다. [&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;h1 data-startline=&quot;214&quot; data-endline=&quot;214&quot; data-id=&quot;Reference&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;Reference&quot; data-startline=&quot;214&quot; data-endline=&quot;214&quot; data-id=&quot;Reference&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;5966&quot; data-size=&quot;9&quot;&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1677506352911&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;Adding external dependencies | Tuist Documentation&quot; data-og-description=&quot;Learn how to define the contract between the dependency managers and Tuist.&quot; data-og-host=&quot;docs.tuist.io&quot; data-og-source-url=&quot;https://docs.tuist.io/guides/third-party-dependencies&quot; data-og-url=&quot;https://docs.tuist.io/guides/third-party-dependencies&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.tuist.io/guides/third-party-dependencies&quot; data-source-url=&quot;https://docs.tuist.io/guides/third-party-dependencies&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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;Adding external dependencies | Tuist Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to define the contract between the dependency managers and Tuist.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.tuist.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1677506357046&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;Tuist 로 외부 의존성 관리하기&quot; data-og-description=&quot;오늘은 많은 분들이 질문해주셨던 Tuist 3.x 버전에서 변경된 외부 의존성 관리에 대해 알아보려고 합니다.&quot; data-og-host=&quot;okanghoon.medium.com&quot; data-og-source-url=&quot;https://okanghoon.medium.com/tuist-로-외부-의존성-관리하기-85609e70133c&quot; data-og-url=&quot;https://okanghoon.medium.com/tuist-%EB%A1%9C-%EC%99%B8%EB%B6%80-%EC%9D%98%EC%A1%B4%EC%84%B1-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0-85609e70133c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/baem53/hyRKYpOuPn/bw7ufeuq6zAkdOJ18ZQVk0/img.png?width=1200&amp;amp;height=481&amp;amp;face=0_0_1200_481&quot;&gt;&lt;a href=&quot;https://okanghoon.medium.com/tuist-%EB%A1%9C-%EC%99%B8%EB%B6%80-%EC%9D%98%EC%A1%B4%EC%84%B1-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0-85609e70133c&quot; data-source-url=&quot;https://okanghoon.medium.com/tuist-로-외부-의존성-관리하기-85609e70133c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/baem53/hyRKYpOuPn/bw7ufeuq6zAkdOJ18ZQVk0/img.png?width=1200&amp;amp;height=481&amp;amp;face=0_0_1200_481');&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;Tuist 로 외부 의존성 관리하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 많은 분들이 질문해주셨던 Tuist 3.x 버전에서 변경된 외부 의존성 관리에 대해 알아보려고 합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;okanghoon.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1677506359624&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;SPM external dependency SDWebImageSwiftUI  fails to build &amp;middot; Issue #3762 &amp;middot; tuist/tuist&quot; data-og-description=&quot;Describe the bug I created a dummy project depending on SDWebImageSwiftUI using SPM interface, and when I try build it, it fails. Error logs are like this: ❌ /Users/user/Library/Developer/Xcode/Der...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/tuist/tuist/issues/3762&quot; data-og-url=&quot;https://github.com/tuist/tuist/issues/3762&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/clRT0J/hyRMkLyB2E/ZX37sdeUo3utfcQZsNxpo0/img.png?width=1200&amp;amp;height=600&amp;amp;face=991_131_1041_187&quot;&gt;&lt;a href=&quot;https://github.com/tuist/tuist/issues/3762&quot; data-source-url=&quot;https://github.com/tuist/tuist/issues/3762&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/clRT0J/hyRMkLyB2E/ZX37sdeUo3utfcQZsNxpo0/img.png?width=1200&amp;amp;height=600&amp;amp;face=991_131_1041_187');&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;SPM external dependency SDWebImageSwiftUI fails to build &amp;middot; Issue #3762 &amp;middot; tuist/tuist&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug I created a dummy project depending on SDWebImageSwiftUI using SPM interface, and when I try build it, it fails. Error logs are like this: ❌ /Users/user/Library/Developer/Xcode/Der...&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;figure id=&quot;og_1677506317016&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;[Dependencies.swift]: cannot use external dependencies from ObjectiveC code &amp;middot; Issue #4180 &amp;middot; tuist/tuist&quot; data-og-description=&quot;Describe the bug Our project uses the well known CocoaLumberjack framework for logging. We come from CocoaPods and are converting to Tuist and its Dependencies. Our main project still has quite som...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/tuist/tuist/issues/4180&quot; data-og-url=&quot;https://github.com/tuist/tuist/issues/4180&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bqfFTV/hyRMkELt3r/7fsN7CeZekURpClZpskPUk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/tuist/tuist/issues/4180&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/tuist/tuist/issues/4180&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bqfFTV/hyRMkELt3r/7fsN7CeZekURpClZpskPUk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Dependencies.swift]: cannot use external dependencies from ObjectiveC code &amp;middot; Issue #4180 &amp;middot; tuist/tuist&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug Our project uses the well known CocoaLumberjack framework for logging. We come from CocoaPods and are converting to Tuist and its Dependencies. Our main project still has quite som...&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;공감  ㆍ&amp;nbsp;구독✅ ㆍ&amp;nbsp;공유  ㆍ&lt;span&gt;&amp;nbsp;&lt;/span&gt;댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;</description>
      <category>Swift/문제해결</category>
      <category>Could not build Objective-C module</category>
      <category>dependencies</category>
      <category>IOS</category>
      <category>Objective-C</category>
      <category>Swift</category>
      <category>tuist</category>
      <category>UIKit</category>
      <category>Xcode</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/78</guid>
      <comments>https://leeari95.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 27 Feb 2023 23:10:37 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] Github에서 API KEY를 숨기기 위한 여러가지 방법들</title>
      <link>https://leeari95.tistory.com/76</link>
      <description>&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다들 &lt;u&gt;API KEY 관리&lt;/u&gt;를 어떻게 하시나요?&lt;br /&gt;개발자마다 각각 방식이 다 다른 것 같아요.&lt;br /&gt;이 글에서는 제가 협업하면서, 개인 프로젝트를 진행하면서&lt;br /&gt;알게 된 관리 방법들을 적어보았습니다.&lt;br /&gt;&lt;/span&gt;혹시 또 다른 방법이 있다면 &lt;u&gt;공유&lt;/u&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;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;025&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/025.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/025.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;왜 API KEY를 숨겨야 할까?&lt;/b&gt;&lt;/h1&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 Key를 숨기지 않고 깃허브에 그대로 올리면 다른 사람들도 API key를 볼 수 있어서 되돌릴 수 없는 일들이 벌어질 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 해킹당한 경험담 실제로 Github에 API KEY를 숨기지 않고 올려서 &lt;u&gt;150만 원&lt;/u&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;따라서 아무나 API 요청을 하지 못하도록,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API KEY를 Github&amp;nbsp;레파지토리에 실수로라도 올리지 않도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt; 비밀스럽게 관리해주는 것&lt;/u&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;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;2&quot; data-size=&quot;1&quot;&gt;static 변수 활용하기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2&quot; data-size=&quot;1&quot;&gt;아래와 같은 방법으로 static 변수를 두어 &lt;u&gt;전역적으로 사용&lt;/u&gt;할 수 있게끔 구성하는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675132296394&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Foundation

struct APIKey {
    static let weatherApiKey = &quot;asdf&quot;
    static let kakaoApiKey = &quot;asdf&quot;
}

// 혹은...

enum Secrets {
    static let apiKey = &quot;asdf&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 쉽게 감출 수 있지만 개인적으로 선호하지 않는 방법 중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 remote에 코드를 올릴 때 &lt;u&gt;key를 수동으로 지우고 올려야 하기 때문&lt;/u&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간혹 key를 지우지 않고 커밋을 하게 된다면 remote에 API KEY가 실수로 올라가는 상황이 발생하기도 한다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;2&quot; data-size=&quot;1&quot;&gt;.gitignore와 .plist 활용&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;.gitignore에 아래와 같이 숨길 .plist 파일을 추가한다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675132486083&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .gitignore 중...
Secrets.plist&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;blockquote data-ke-style=&quot;style2&quot;&gt;그리고 .plist 내부에서 API KEY를 관리하는 방식이다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmX0YQ/btrXByM0xKJ/ZEZwxoOitJbAd23WLRl4G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmX0YQ/btrXByM0xKJ/ZEZwxoOitJbAd23WLRl4G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmX0YQ/btrXByM0xKJ/ZEZwxoOitJbAd23WLRl4G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmX0YQ%2FbtrXByM0xKJ%2FZEZwxoOitJbAd23WLRl4G0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;226&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;226&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;blockquote data-ke-style=&quot;style2&quot;&gt;코드상에서는 이런 식으로 &lt;u&gt;Bundle을 확장하여 apiKey라는 변수&lt;/u&gt;를 구현해두고 사용한다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675132736497&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extension Bundle {
    
    var apiKey: String? {
        guard let file = self.path(forResource: &quot;Secrets&quot;, ofType: &quot;plist&quot;),
              let resource = NSDictionary(contentsOfFile: file),
              let key = resource[&quot;API_KEY&quot;] as? String else {
            os_log(.error, log: .default, &quot;⛔️ API KEY를 가져오는데 실패하였습니다.&quot;)
            return nil
        }
        return key
    }
    
}

// Bundle.main.apiKey 이런식으로 호출해서...&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;하지만 이 방법도 실수로 Xcode project.pbxproj 내부 경로에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Secrets.plist라는 경로를 별도로 제외시킬 수 없어서, 커밋때 항상 Secrets.plist 파일 경로를 따로 제외한 후&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;물론 경로가 추가된다고 해서 remote에 실제 API KEY가 올라가는 것은 아니니 &lt;span&gt;경로에 추가되든 말든 신경쓰지 않아도&lt;span&gt;&amp;nbsp;무방하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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;그리고 간혹 info.plist에 API KEY를 설정해야하는 경우도 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 때는 이 방법이 통하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이런 경우에는 어떻게 하면 좋을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;첫&quot; data-startline=&quot;1&quot; data-endline=&quot;1&quot; data-id=&quot;첫&quot; data-original-title=&quot;&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;2&quot; data-size=&quot;1&quot;&gt;.xcconfig 활용하기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;.xcconfig 파일을 생성한다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1504&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qs1gW/btrXGUgt51Q/iFqpwrG8p3VnegrNsZKfpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qs1gW/btrXGUgt51Q/iFqpwrG8p3VnegrNsZKfpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qs1gW/btrXGUgt51Q/iFqpwrG8p3VnegrNsZKfpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQs1gW%2FbtrXGUgt51Q%2FiFqpwrG8p3VnegrNsZKfpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1504&quot; height=&quot;1064&quot; data-origin-width=&quot;1504&quot; data-origin-height=&quot;1064&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성한 .xcconfig 파일 안에 아래와 같이 환경변수를 정의해준다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675132992933&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//
//  Secrets.xcconfig
//  My App
//
//  Created by Ari on 2023/01/31.
//

// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974

KAKAO_APP_KEY = 123
FACEBOOK_APP_ID = 1234
FACEBOOK_CLIENT_TOKEN = 12345&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;그리고 프로젝트에 configurations를 위에서 만들었던 .xcconfig 파일로 설정해준다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y9WT1/btrXFvadhbX/A9LCkcWWkQncLoCGSBMPK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y9WT1/btrXFvadhbX/A9LCkcWWkQncLoCGSBMPK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y9WT1/btrXFvadhbX/A9LCkcWWkQncLoCGSBMPK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY9WT1%2FbtrXFvadhbX%2FA9LCkcWWkQncLoCGSBMPK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1614&quot; height=&quot;830&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;830&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;style2&quot;&gt;info.plist에서는 아래와 같이 환경변수를 활용하여 api key를 설정한다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kN1Ac/btrXCHoTRys/PBkyQgiMn3NRZ71L1uYWH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kN1Ac/btrXCHoTRys/PBkyQgiMn3NRZ71L1uYWH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kN1Ac/btrXCHoTRys/PBkyQgiMn3NRZ71L1uYWH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkN1Ac%2FbtrXCHoTRys%2FPBkyQgiMn3NRZ71L1uYWH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1246&quot; height=&quot;530&quot; data-origin-width=&quot;1246&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;blockquote data-ke-style=&quot;style2&quot;&gt;마지막으로 .gitignore에 해당 .xcconfig 파일을 추가해주면 된다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675133243325&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# .gitignore 내부...
*.xcconfig&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;이것도 물론 커밋할 때마다 Xcode project.pbxproj 파일 내 경로가 추가되지 않도록 신경써서 커밋 해줘야 한다는 건 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 간혹 Facebook 같이 info.plist에 API 관련된 값들을 설정해주어야 하는 경우가 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에도 remote에 올라가지 않도록 완벽하게 관리가 가능하다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;style3&quot;&gt;제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,&amp;nbsp; 공감  ㆍ 구독✅ ㆍ 공유  ㆍ 댓글✍ &amp;nbsp; 부탁드립니다.  &lt;/blockquote&gt;</description>
      <category>Swift/iOS</category>
      <category>API Key</category>
      <category>api key 감추기</category>
      <category>api key 숨기기</category>
      <category>Git</category>
      <category>github</category>
      <category>IOS</category>
      <category>secret key</category>
      <category>secret keys to protect</category>
      <category>Swift</category>
      <category>Xcode</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/76</guid>
      <comments>https://leeari95.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 31 Jan 2023 13:59:54 +0900</pubDate>
    </item>
    <item>
      <title>[Xcode Cloud] Tuist로 만든 프로젝트에 Xcode Cloud 적용하는 법</title>
      <link>https://leeari95.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;YAPP 동아리 Dev. Camp 1차때 팀원들과 함께 해결한 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 문제 상황&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tuist로 프로젝트 생성을 하였다.&lt;/li&gt;
&lt;li&gt;생성을 하니, .xcworkspace 파일이 자동으로 생성된 .gitignore에 포함되어있었다. 아마 충돌을 대비해서 추가해둔 것 같다.&lt;/li&gt;
&lt;li&gt;이후 Xcode Cloud 적용을 위해서 빌드를 시도했는데, .xcworkspace를 찾을 수 없다는 에러가 났다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CibKI/btrS1QLmszn/VuJrQlrNkKdOobDBBOJ3Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CibKI/btrS1QLmszn/VuJrQlrNkKdOobDBBOJ3Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CibKI/btrS1QLmszn/VuJrQlrNkKdOobDBBOJ3Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCibKI%2FbtrS1QLmszn%2FVuJrQlrNkKdOobDBBOJ3Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;432&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1670398655083&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Swift Package Dependencies
Workspace Fitfty.xcworkspace does not exist at Fitfty/Fitfty.xcworkspace&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해서 .gitignore에 등록되어있는 .xcworkspace를 제거하자니 매우 찝찝하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;협업 시 충돌 피하자고 등록해둔 것 같은데, Xcode Cloud의 에러를 해결하자고 제거하는 것은 용납할 수 없었다.&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;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 나의 추측&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 github 레파지토리를 클론 받아온 후 빌드를 시도하는 것이기 때문에 .gitignore에 등록되어있는 .xcworkspace 파일을 찾을 수 없는 상황인 것 같았다. 그래서 빌드를 시도하기 이전에 따로 스크립트를 추가하여 추가적인 명령어를 실행할 수는 없을까 고민해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 추가적인 명령어를 따로 실행할 수 있다면, tuist generate 명령어를 통해 .xcworkspace를 생성한 후 빌드를 돌리면 된다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플 공식문서를 뒤져보니 빌드 중간 중간에 스크립트를 추가할 수 있는 방법이 자세히 나와있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;1934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B7K0p/btrS5j65MQo/SVgIyugFIYpYl9Aak6N40k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B7K0p/btrS5j65MQo/SVgIyugFIYpYl9Aak6N40k/img.png&quot; data-alt=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B7K0p/btrS5j65MQo/SVgIyugFIYpYl9Aak6N40k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB7K0p%2FbtrS5j65MQo%2FSVgIyugFIYpYl9Aak6N40k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1658&quot; height=&quot;1934&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;1934&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1670398835211&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;Apple Developer Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot; data-og-url=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 해결 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfHY5L/btrS43i2FnL/lRpf7tCmpTa710Xt9ed4H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfHY5L/btrS43i2FnL/lRpf7tCmpTa710Xt9ed4H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfHY5L/btrS43i2FnL/lRpf7tCmpTa710Xt9ed4H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfHY5L%2FbtrS43i2FnL%2FlRpf7tCmpTa710Xt9ed4H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;528&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇번의 에러를 겪어 삽질을 한 결과, 스크립트를 실행하기 위해 먼저 &lt;u&gt;ci_scripts&lt;/u&gt;라는 디렉토리에 접근을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tuist의 xcworkspace를 실행하려면 해당 디렉토리를 나와서 &lt;u&gt;tuist generate&lt;/u&gt; 명령어를 실행해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;cd ..&lt;/u&gt; 명령어로 해당 디렉토리를 나오게 해주었지만 디렉토리를 상대경로로 접근하는 방법은 없을까... 고민하다가, 특별한 방법은 찾지 못해서 대신 주석을 달아 어떤 명령어인지 명시해주기로 타협했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;ci_post_clone.sh 파일 내용&lt;/blockquote&gt;
&lt;pre id=&quot;code_1670399002494&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/sh

# swiftlint 다운로드
brew install swiftlint 

# ci_scripts 디렉토리를 나와 프로젝트 경로인 Fitfty로 진입
# Fitfty 디렉토리로 경로 이동 -&amp;gt; /Volumes/workspace/repository/Fitfty
cd ..

# fetch를 통해 라이브러리 다운로드
.tuist-bin/tuist fetch 

# generate를 통해 .xcworkspace 받아오기
.tuist-bin/tuist generate&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;이렇게 스크립트를 추가해주니 정상적으로 xcworkspace를 생성하고 찾을 수 있어 빌드를 성공할 수 있었다...!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5iNxx/btrS6TzEyOj/f13FJJiLLLrPYwh5KAkkB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5iNxx/btrS6TzEyOj/f13FJJiLLLrPYwh5KAkkB0/img.png&quot; data-alt=&quot;success... 감격의 순간....&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5iNxx/btrS6TzEyOj/f13FJJiLLLrPYwh5KAkkB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5iNxx%2FbtrS6TzEyOj%2Ff13FJJiLLLrPYwh5KAkkB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;254&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;success... 감격의 순간....&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;그리고 .tuist-bin&amp;nbsp; 파일을 통해 fetch와 generate를 시도해서 그런지 따로 brew로 tuist를 설치하는 명령어는 필요하지 않다.&lt;/p&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;style3&quot;&gt;.tuist-bin/tuist ... 명령어를 사용하기 이전에 &lt;u&gt;tuist bundle&lt;/u&gt; 이라는 명령어를 통해 .tuist-bin 디렉토리를 생성해준 다음 레파지토리로 변경사항을 push하고 나서 위 작업을 해줘야 한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 별거아닌 팁&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode Cloud 빌드 실패시 로그를 확인해볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;빌드 숫자 부분을 클릭&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0X696/btrS1LiTlZB/zT3mzqmlVjNxzfhMOa3OEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0X696/btrS1LiTlZB/zT3mzqmlVjNxzfhMOa3OEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0X696/btrS1LiTlZB/zT3mzqmlVjNxzfhMOa3OEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0X696%2FbtrS1LiTlZB%2FzT3mzqmlVjNxzfhMOa3OEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2234&quot; height=&quot;1470&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1470&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;style2&quot;&gt;화살표를 눌러 메뉴를 열고 로그로 진입.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TxTav/btrS1J6sXhl/KfPJsHodBGXHnzQkksf3dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TxTav/btrS1J6sXhl/KfPJsHodBGXHnzQkksf3dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TxTav/btrS1J6sXhl/KfPJsHodBGXHnzQkksf3dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTxTav%2FbtrS1J6sXhl%2FKfPJsHodBGXHnzQkksf3dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2434&quot; height=&quot;1470&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;1470&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;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ezYxTn/btrS5jlEdjn/9QK7xOYJSIBwVKn0VJH6Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ezYxTn/btrS5jlEdjn/9QK7xOYJSIBwVKn0VJH6Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ezYxTn/btrS5jlEdjn/9QK7xOYJSIBwVKn0VJH6Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FezYxTn%2FbtrS5jlEdjn%2F9QK7xOYJSIBwVKn0VJH6Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2434&quot; height=&quot;1470&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;1470&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;# Tuist로 만든 프로젝트 테스트 빌드는 어떻게 해결할까?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1946&quot; data-origin-height=&quot;1278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chCwWU/btrS4YIXFJE/2zyf6zJKtZD8kOsF54meXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chCwWU/btrS4YIXFJE/2zyf6zJKtZD8kOsF54meXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chCwWU/btrS4YIXFJE/2zyf6zJKtZD8kOsF54meXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchCwWU%2FbtrS4YIXFJE%2F2zyf6zJKtZD8kOsF54meXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1946&quot; height=&quot;1278&quot; data-origin-width=&quot;1946&quot; data-origin-height=&quot;1278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjA5zs/btrS5y33lea/gggMqRKiVxurNUq7eKA0a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjA5zs/btrS5y33lea/gggMqRKiVxurNUq7eKA0a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjA5zs/btrS5y33lea/gggMqRKiVxurNUq7eKA0a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjA5zs%2FbtrS5y33lea%2FgggMqRKiVxurNUq7eKA0a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;315&quot; height=&quot;284&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;588&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;Scheme를 일반 프로젝트가 아니라 &lt;u&gt;Workspace가 붙어있는 Scheme&lt;/u&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;blockquote data-ke-style=&quot;style3&quot;&gt;구글링 키워드&lt;br /&gt;xcode cloud ci scripts brew&lt;/blockquote&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;# Reference&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1670399474569&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;Apple Developer Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot; data-og-url=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot; data-source-url=&quot;https://developer.apple.com/documentation/xcode/writing-custom-build-scripts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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;Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1670399460615&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;Xcode Cloud - overview &amp;amp; setup&quot; data-og-description=&quot;Xcode Cloud is now available to all Apple developers and recently I had a chance to try it out. In this post I gathered some howtos for a typical setup.&quot; data-og-host=&quot;wojciechkulik.pl&quot; data-og-source-url=&quot;https://wojciechkulik.pl/xcode/xcode-cloud-overview-and-setup&quot; data-og-url=&quot;https://wojciechkulik.pl/xcode/xcode-cloud-overview-and-setup&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://wojciechkulik.pl/xcode/xcode-cloud-overview-and-setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wojciechkulik.pl/xcode/xcode-cloud-overview-and-setup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Xcode Cloud - overview &amp;amp; setup&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Xcode Cloud is now available to all Apple developers and recently I had a chance to try it out. In this post I gathered some howtos for a typical setup.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wojciechkulik.pl&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1670399575639&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;Xcode Cloud &amp;ndash; 3. ci 스크립트 작성￼&quot; data-og-description=&quot;들어가며&amp;hellip; 1편에서는 Xcode Cloud 구성 방법, 2편에서는 조금 더 디테일한 구성 방법을 알아봤습니다. 이번 3편에서는 스크립트 작성 (ci_script) 에 대해 알아보겠습니다. 제가 담당하고 있는 프로젝&quot; data-og-host=&quot;y8k.me&quot; data-og-source-url=&quot;https://y8k.me/article/1089&quot; data-og-url=&quot;https://y8k.me/article/1089&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdVCre/hyQNS47zYO/1iqgqUdbhuJGNmxcKY6mg0/img.png?width=1199&amp;amp;height=438&amp;amp;face=0_0_1199_438,https://scrap.kakaocdn.net/dn/bVM1yI/hyQO8yuVTM/BrgNr4YMyGQ6KNXLcVzE1K/img.png?width=640&amp;amp;height=233&amp;amp;face=0_0_640_233&quot;&gt;&lt;a href=&quot;https://y8k.me/article/1089&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://y8k.me/article/1089&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdVCre/hyQNS47zYO/1iqgqUdbhuJGNmxcKY6mg0/img.png?width=1199&amp;amp;height=438&amp;amp;face=0_0_1199_438,https://scrap.kakaocdn.net/dn/bVM1yI/hyQO8yuVTM/BrgNr4YMyGQ6KNXLcVzE1K/img.png?width=640&amp;amp;height=233&amp;amp;face=0_0_640_233');&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;Xcode Cloud &amp;ndash; 3. ci 스크립트 작성￼&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;들어가며&amp;hellip; 1편에서는 Xcode Cloud 구성 방법, 2편에서는 조금 더 디테일한 구성 방법을 알아봤습니다. 이번 3편에서는 스크립트 작성 (ci_script) 에 대해 알아보겠습니다. 제가 담당하고 있는 프로젝&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;y8k.me&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;</description>
      <category>Swift/문제해결</category>
      <category>Apple</category>
      <category>ci scripts</category>
      <category>IOS</category>
      <category>Swift</category>
      <category>tuist</category>
      <category>Xcode</category>
      <category>Xcode Cloud</category>
      <category>xcworkspace does not exist</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/75</guid>
      <comments>https://leeari95.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 7 Dec 2022 16:54:09 +0900</pubDate>
    </item>
    <item>
      <title>[Xcode] Tuist를 활용하여 프로젝트를 관리해보기</title>
      <link>https://leeari95.tistory.com/74</link>
      <description>&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;br /&gt;프로젝트를 모듈화하여 관리해보자는 의견이 나와 Tuist를 사용해보게 되었다.&amp;nbsp;&lt;br /&gt;어떤 녀석인지 한번 알아보자!!!&lt;br /&gt;&lt;br /&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 data-position=&quot;11&quot; data-size=&quot;115&quot;&gt;Tuist는 Xcode 프로젝트와의 생성, 유지 관리 및 상호 작용을 용이하게 하는 것을 목표로 하는 커맨드 라인 인터페이스(CLI, 명령줄 도구, 터미널을 통해 사용자와 컴퓨터가 상호 작용하는 방식)이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;5&quot; data-endline=&quot;5&quot; data-position=&quot;128&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;128&quot; data-size=&quot;58&quot;&gt;바이너리로 배포되므로 종속성을 관리하기 위해 다른 도구에 의존하지 않고도 쉽게 설치하고 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h1 data-startline=&quot;7&quot; data-endline=&quot;7&quot; data-id=&quot;모듈화의-이점&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;모듈화의-이점&quot; data-startline=&quot;7&quot; data-endline=&quot;7&quot; data-id=&quot;모듈화의-이점&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;190&quot; data-size=&quot;7&quot;&gt;모듈화의 이점&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;9&quot; data-endline=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;9&quot; data-endline=&quot;9&quot; data-position=&quot;201&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;201&quot; data-size=&quot;59&quot;&gt;모듈화로 나누어져 있으면 빌드 시 변경된 부분만 빌드하면 되기 때문에 빌드 속도가 향상된다는 장점이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;10&quot; data-endline=&quot;10&quot; data-position=&quot;263&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;263&quot; data-size=&quot;24&quot;&gt;모듈간 결합도는 낮추고 응집도를 높이는 형태&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;11&quot; data-endline=&quot;12&quot; data-position=&quot;290&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;290&quot; data-size=&quot;46&quot;&gt;.pbxproj에 UUID의 conflict을 줄일 수 있다는 장점도 가지고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-startline=&quot;13&quot; data-endline=&quot;13&quot; data-id=&quot;Tuist를-사용하기-전에-알아야-할-개념&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;Tuist를-사용하기-전에-알아야-할-개념&quot; data-startline=&quot;13&quot; data-endline=&quot;13&quot; data-id=&quot;Tuist를-사용하기-전에-알아야-할-개념&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;340&quot; data-size=&quot;23&quot;&gt;Tuist를 사용하기 전에 알아야 할 개념&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;15&quot; data-endline=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;15&quot; data-endline=&quot;17&quot; data-position=&quot;367&quot; data-size=&quot;0&quot;&gt;&lt;u&gt;&lt;span data-position=&quot;367&quot; data-size=&quot;6&quot;&gt;Target&lt;/span&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;16&quot; data-endline=&quot;17&quot; data-position=&quot;380&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;380&quot; data-size=&quot;50&quot;&gt;project나 Workspace의 파일들을 빌드하여 생성되는 End Product를 의미&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;965&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NLaN6/btrSHXiAvLs/sxklT5H0Dulr3mxkk6HPHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NLaN6/btrSHXiAvLs/sxklT5H0Dulr3mxkk6HPHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NLaN6/btrSHXiAvLs/sxklT5H0Dulr3mxkk6HPHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNLaN6%2FbtrSHXiAvLs%2FsxklT5H0Dulr3mxkk6HPHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1267&quot; height=&quot;965&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;965&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-startline=&quot;22&quot; data-endline=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;22&quot; data-endline=&quot;25&quot; data-position=&quot;479&quot; data-size=&quot;0&quot;&gt;&lt;u&gt;&lt;span data-position=&quot;479&quot; data-size=&quot;7&quot;&gt;Project&lt;/span&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;23&quot; data-endline=&quot;23&quot; data-position=&quot;493&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;493&quot; data-size=&quot;41&quot;&gt;모든 파일, 리소스를 빌드하는데 필요한 정보의 저장소(repository)&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;24&quot; data-endline=&quot;25&quot; data-position=&quot;541&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;541&quot; data-size=&quot;52&quot;&gt;프로젝트는 빌드하는 방법을 명시하는 end product인 target을 하나 이상 포함한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVAw6n/btrSIsWUx5N/wzo7tKhX0HaWcetQnD98Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVAw6n/btrSIsWUx5N/wzo7tKhX0HaWcetQnD98Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVAw6n/btrSIsWUx5N/wzo7tKhX0HaWcetQnD98Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVAw6n%2FbtrSIsWUx5N%2Fwzo7tKhX0HaWcetQnD98Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;850&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;28&quot; data-endline=&quot;35&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;28&quot; data-endline=&quot;31&quot; data-position=&quot;635&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;635&quot; data-size=&quot;18&quot;&gt;Project가 가지고 있는 정보&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;29&quot; data-endline=&quot;29&quot; data-position=&quot;660&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;660&quot; data-size=&quot;11&quot;&gt;소스파일에 대한 참조&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;30&quot; data-endline=&quot;30&quot; data-position=&quot;678&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;678&quot; data-size=&quot;31&quot;&gt;Structure navigator에서 소스파일을 그룹화&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;31&quot; data-endline=&quot;31&quot; data-position=&quot;716&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;716&quot; data-size=&quot;45&quot;&gt;Debug, release와 같은 build configuration을 설정 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;32&quot; data-endline=&quot;35&quot; data-position=&quot;764&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;764&quot; data-size=&quot;49&quot;&gt;.xcodeproj라는 디렉토리에 터미널을 통해서 들어가면 아래와 같은 정보가 존재한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;33&quot; data-endline=&quot;35&quot; data-position=&quot;820&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;820&quot; data-size=&quot;15&quot;&gt;Project.pbxproj&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;34&quot; data-endline=&quot;35&quot; data-position=&quot;846&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;846&quot; data-size=&quot;30&quot;&gt;각 파일들의 참조값들을 UUID들로 정의되어 있는 파일&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;jboss-cli&quot; data-startline=&quot;36&quot; data-endline=&quot;40&quot; data-position=&quot;878&quot;&gt;&lt;code&gt;cd {projectName}.xcodeproj 
open .
ls -a
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;asciidoc&quot; data-startline=&quot;42&quot; data-endline=&quot;45&quot; data-position=&quot;928&quot;&gt;&lt;code&gt;.			project.pbxproj		xcuserdata
..			project.xcworkspace
&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-startline=&quot;49&quot; data-endline=&quot;53&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;49&quot; data-endline=&quot;53&quot; data-position=&quot;1003&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1003&quot; data-size=&quot;9&quot;&gt;Workspace&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;50&quot; data-endline=&quot;50&quot; data-position=&quot;1019&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1019&quot; data-size=&quot;57&quot;&gt;Xcode의 Project 및 기타 리소스를 그룹화하여 함께 작업할 수 있는 Xcode document&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;51&quot; data-endline=&quot;51&quot; data-position=&quot;1083&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1083&quot; data-size=&quot;41&quot;&gt;다수의 Project를 사용하고 싶은 경우, workspace 하위로 관리&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;52&quot; data-endline=&quot;53&quot; data-position=&quot;1131&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1131&quot; data-size=&quot;66&quot;&gt;각 Project의 파일을 구성하는 것 외에도 workspace에 포함된 Project들과 Target간의 관계를 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-startline=&quot;54&quot; data-endline=&quot;54&quot; data-position=&quot;1199&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1199&quot; data-size=&quot;73&quot;&gt;예시로 pod install시에 workspace가 생기는데 내부를 들어가보면 Pods Project가 생긴 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;56&quot; data-endline=&quot;56&quot; data-position=&quot;1274&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;1274&quot; data-size=&quot;93&quot;&gt;Project가 2개 이상되었기 때문에 이들의 관계를 하나로 묶어서 관리할 Workspace가 필요하여 pod install하면 자동으로 workspace가 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qb8mW/btrSGWrrDeR/k8fKrK5bgQz4ama4SDYqyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qb8mW/btrSGWrrDeR/k8fKrK5bgQz4ama4SDYqyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qb8mW/btrSGWrrDeR/k8fKrK5bgQz4ama4SDYqyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqb8mW%2FbtrSGWrrDeR%2Fk8fKrK5bgQz4ama4SDYqyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1422&quot; height=&quot;400&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qK71T/btrSHJERW1l/VeUOeWbw9gwqeICX4Hv131/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qK71T/btrSHJERW1l/VeUOeWbw9gwqeICX4Hv131/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qK71T/btrSHJERW1l/VeUOeWbw9gwqeICX4Hv131/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqK71T%2FbtrSHJERW1l%2FVeUOeWbw9gwqeICX4Hv131%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;308&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-startline=&quot;62&quot; data-endline=&quot;62&quot; data-id=&quot;도입-배경&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;62&quot; data-endline=&quot;62&quot; data-id=&quot;도입-배경&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;도입-배경&quot; data-startline=&quot;62&quot; data-endline=&quot;62&quot; data-id=&quot;도입-배경&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;1447&quot; data-size=&quot;5&quot;&gt;왜 Tuist를 사용하는 걸까?&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;64&quot; data-endline=&quot;68&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;64&quot; data-endline=&quot;64&quot; data-position=&quot;1456&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1456&quot; data-size=&quot;76&quot;&gt;Git을 사용하면서 Xcode 프로젝트 설정(.xcodeproj) 파일의 충돌은 협업을 불편하게 한다. 이를 개선해줄 수 있는 도구이다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;65&quot; data-endline=&quot;68&quot; data-position=&quot;1535&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1535&quot; data-size=&quot;43&quot;&gt;XcodeGen과 다르게 Swift로 프로젝트 설정이 가능하다는 장점이 있다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;66&quot; data-endline=&quot;68&quot; data-position=&quot;1585&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1585&quot; data-size=&quot;45&quot;&gt;XcodeGen은 yaml 혹은 json으로 프로젝트 설정 파일을 만들어야 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-startline=&quot;69&quot; data-endline=&quot;69&quot; data-id=&quot;모듈화를-적용했을시-기대되는-효과&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;69&quot; data-endline=&quot;69&quot; data-id=&quot;모듈화를-적용했을시-기대되는-효과&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;모듈화를-적용했을시-기대되는-효과&quot; data-startline=&quot;69&quot; data-endline=&quot;69&quot; data-id=&quot;모듈화를-적용했을시-기대되는-효과&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;1635&quot; data-size=&quot;18&quot;&gt;모듈화를 적용했을시 기대되는 효과&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;71&quot; data-endline=&quot;82&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;71&quot; data-endline=&quot;73&quot; data-position=&quot;1657&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1657&quot; data-size=&quot;6&quot;&gt;코드 안정성&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;72&quot; data-endline=&quot;72&quot; data-position=&quot;1670&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1670&quot; data-size=&quot;39&quot;&gt;모듈간 결합도가 낮아지고 응집도가 높아지는 만큼 안정성이 높아지길 기대&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;73&quot; data-endline=&quot;73&quot; data-position=&quot;1716&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1716&quot; data-size=&quot;22&quot;&gt;문제 발생시 분석이 수월해질 것으로 예상&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;74&quot; data-endline=&quot;76&quot; data-position=&quot;1741&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1741&quot; data-size=&quot;6&quot;&gt;개발 생산성&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;75&quot; data-endline=&quot;75&quot; data-position=&quot;1754&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1754&quot; data-size=&quot;41&quot;&gt;모듈별 의존성이 낮아지면 고려해야하는 범위가 낮아져 개발 속도가 향상된다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;76&quot; data-endline=&quot;76&quot; data-position=&quot;1802&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1802&quot; data-size=&quot;37&quot;&gt;코드 리뷰시 관련 모듈만 검토가 가능해 리뷰어에게 편의가 높아질 것&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;77&quot; data-endline=&quot;78&quot; data-position=&quot;1842&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1842&quot; data-size=&quot;5&quot;&gt;빌드 속도&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;78&quot; data-endline=&quot;78&quot; data-position=&quot;1854&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1854&quot; data-size=&quot;46&quot;&gt;자주 변경되지 않는 모듈의 빌드가 발생하지 않아 빌드 속도에도 작은 영향을 줄 것.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;79&quot; data-endline=&quot;82&quot; data-position=&quot;1903&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1903&quot; data-size=&quot;15&quot;&gt;사용 목적에 맞는 코드 배치&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;80&quot; data-endline=&quot;82&quot; data-position=&quot;1925&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;1925&quot; data-size=&quot;33&quot;&gt;용도와 목적에 맞는 코드 배치로 이해하기 쉬운 프로젝트 구성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-startline=&quot;83&quot; data-endline=&quot;83&quot; data-id=&quot;Tuist를-사용하여-모듈화하기&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-startline=&quot;83&quot; data-endline=&quot;83&quot; data-id=&quot;Tuist를-사용하여-모듈화하기&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 id=&quot;Tuist를-사용하여-모듈화하기&quot; data-startline=&quot;83&quot; data-endline=&quot;83&quot; data-id=&quot;Tuist를-사용하여-모듈화하기&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;1963&quot; data-size=&quot;17&quot;&gt;Tuist를 사용하여 모듈화하기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;blockquote data-startline=&quot;85&quot; data-endline=&quot;85&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-position=&quot;1984&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;Tuist 설치&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;shell&quot; data-startline=&quot;87&quot; data-endline=&quot;89&quot; data-position=&quot;1994&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;curl -Ls https://install.tuist.io | bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;93&quot; data-endline=&quot;93&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-position=&quot;2053&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;Tuist로 iOS 프로젝트 생성하기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-startline=&quot;95&quot; data-endline=&quot;95&quot; data-position=&quot;2075&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2075&quot; data-size=&quot;37&quot;&gt;터미널로 프로젝트를 생성할 폴더로 진입하여 아래 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-startline=&quot;97&quot; data-endline=&quot;100&quot; data-position=&quot;2114&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;tuist init --platform ios // UIKit
tuist init --platform ios --template swiftui // SwiftUI&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xNPqT/btrSHWKJeRV/IyiB1THtKY84YYiFUrS771/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xNPqT/btrSHWKJeRV/IyiB1THtKY84YYiFUrS771/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xNPqT/btrSHWKJeRV/IyiB1THtKY84YYiFUrS771/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxNPqT%2FbtrSHWKJeRV%2FIyiB1THtKY84YYiFUrS771%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1166&quot; height=&quot;292&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-startline=&quot;104&quot; data-endline=&quot;104&quot; data-position=&quot;2253&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2253&quot; data-size=&quot;20&quot;&gt;위 사진처럼 4개의 파일이 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-startline=&quot;108&quot; data-endline=&quot;108&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-position=&quot;2284&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;Project.swift를 수정하는 명령어 Tuist Edit을 실행한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-startline=&quot;110&quot; data-endline=&quot;110&quot; data-position=&quot;2327&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2327&quot; data-size=&quot;31&quot;&gt;명령어를 실행하면 Manifests 프로젝트가 오픈된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; data-startline=&quot;112&quot; data-endline=&quot;114&quot; data-position=&quot;2360&quot;&gt;&lt;code&gt;tuist edit
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;116&quot; data-endline=&quot;117&quot; data-position=&quot;2380&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2380&quot; data-size=&quot;28&quot;&gt;Project.swift 파일을 입맛대로 편집한다.&lt;/span&gt;&lt;br /&gt;&lt;span data-position=&quot;2409&quot; data-size=&quot;50&quot;&gt;이 파일은 Tuist에서 .xcodeproj, 프로젝트를 어떻게 만들지 정의하는 파일이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-startline=&quot;119&quot; data-endline=&quot;119&quot; data-id=&quot;Projectswift&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;Projectswift&quot; data-startline=&quot;119&quot; data-endline=&quot;119&quot; data-id=&quot;Projectswift&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;2464&quot; data-size=&quot;13&quot;&gt;Project.swift&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-startline=&quot;121&quot; data-endline=&quot;121&quot; data-position=&quot;2479&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;2479&quot; data-size=&quot;31&quot;&gt;Project는 아래와 같은 이니셜라이저를 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot; data-startline=&quot;123&quot; data-endline=&quot;136&quot; data-position=&quot;2512&quot;&gt;&lt;code&gt;public init(
    name: String,
    organizationName: String? = nil,
    options: ProjectDescription.Project.Options = .options(),
    packages: [ProjectDescription.Package] = [],
    settings: ProjectDescription.Settings? = nil,
    targets: [ProjectDescription.Target] = [],
    schemes: [ProjectDescription.Scheme] = [],
    fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil,
    additionalFiles: [ProjectDescription.FileElement] = [],
    resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default
)
&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-startline=&quot;140&quot; data-endline=&quot;158&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;140&quot; data-endline=&quot;141&quot; data-position=&quot;3068&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3068&quot; data-size=&quot;4&quot;&gt;name&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;141&quot; data-endline=&quot;141&quot; data-position=&quot;3079&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3079&quot; data-size=&quot;7&quot;&gt;프로젝트 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;142&quot; data-endline=&quot;143&quot; data-position=&quot;3089&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3089&quot; data-size=&quot;16&quot;&gt;organizationName&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;143&quot; data-endline=&quot;143&quot; data-position=&quot;3112&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3112&quot; data-size=&quot;16&quot;&gt;organization의 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;144&quot; data-endline=&quot;145&quot; data-position=&quot;3131&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3131&quot; data-size=&quot;7&quot;&gt;options&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;145&quot; data-endline=&quot;145&quot; data-position=&quot;3145&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3145&quot; data-size=&quot;41&quot;&gt;Tuist가 xcodeproj 파일을 만들 때의 옵션을 설정해줄 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;146&quot; data-endline=&quot;147&quot; data-position=&quot;3189&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3189&quot; data-size=&quot;8&quot;&gt;packages&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;147&quot; data-endline=&quot;147&quot; data-position=&quot;3204&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3204&quot; data-size=&quot;19&quot;&gt;SPM의 package를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;148&quot; data-endline=&quot;151&quot; data-position=&quot;3226&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3226&quot; data-size=&quot;8&quot;&gt;settings&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;149&quot; data-endline=&quot;149&quot; data-position=&quot;3241&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3241&quot; data-size=&quot;39&quot;&gt;프로젝트 파일에 있는 build settings의 정보들을 설정해준다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;150&quot; data-endline=&quot;151&quot; data-position=&quot;3287&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3287&quot; data-size=&quot;22&quot;&gt;Dictionary로 값을 줄 수 있다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;151&quot; data-endline=&quot;151&quot; data-position=&quot;3320&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3320&quot; data-size=&quot;31&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://xcodebuildsettings.com/&quot;&gt;https://xcodebuildsettings.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;152&quot; data-endline=&quot;153&quot; data-position=&quot;3354&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3354&quot; data-size=&quot;7&quot;&gt;targets&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;153&quot; data-endline=&quot;153&quot; data-position=&quot;3368&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3368&quot; data-size=&quot;15&quot;&gt;프로젝트의 타겟을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;154&quot; data-endline=&quot;155&quot; data-position=&quot;3386&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3386&quot; data-size=&quot;7&quot;&gt;schemes&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;155&quot; data-endline=&quot;155&quot; data-position=&quot;3400&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3400&quot; data-size=&quot;19&quot;&gt;프로젝트의 scheme를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;156&quot; data-endline=&quot;158&quot; data-position=&quot;3422&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3422&quot; data-size=&quot;18&quot;&gt;fileHeaderTemplate&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;157&quot; data-endline=&quot;158&quot; data-position=&quot;3447&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3447&quot; data-size=&quot;38&quot;&gt;내장 Xcode 템플릿에 Custom으로 파일 헤더를 만들 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-startline=&quot;159&quot; data-endline=&quot;160&quot; data-position=&quot;3487&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;3487&quot; data-size=&quot;7&quot;&gt;예를 들어서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;fileHeaderTemplate: &quot; ___COPYRIGHT___&quot;&lt;br /&gt;&lt;span data-position=&quot;3536&quot; data-size=&quot;33&quot;&gt;이렇게 만들고 프로젝트를 생성한 다음 swift파일을 만들면&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-startline=&quot;162&quot; data-endline=&quot;166&quot; data-position=&quot;3571&quot;&gt;&lt;code&gt;//  Copyright &amp;copy; 2022 tuist.io. All rights reserved.

import Foundation
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;168&quot; data-endline=&quot;168&quot; data-position=&quot;3656&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;3656&quot; data-size=&quot;12&quot;&gt;만약 &quot;&quot;으로 해놓으면&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-startline=&quot;170&quot; data-endline=&quot;174&quot; data-position=&quot;3670&quot;&gt;&lt;code&gt;//

import Foundation
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;176&quot; data-endline=&quot;176&quot; data-position=&quot;3706&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;3706&quot; data-size=&quot;22&quot;&gt;으로 생성된다. nil이면 기본 값으로&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-startline=&quot;178&quot; data-endline=&quot;186&quot; data-position=&quot;3730&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;//
//  File.swift
//  Fitfty
//
//  Created by Ari on 2022/12/02.
//  Copyright &amp;copy; 2022 baegteun. All rights reserved.
//&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;188&quot; data-endline=&quot;188&quot; data-position=&quot;3863&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;3863&quot; data-size=&quot;12&quot;&gt;이렇게 생성이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;190&quot; data-endline=&quot;197&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;190&quot; data-endline=&quot;193&quot; data-position=&quot;3879&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3879&quot; data-size=&quot;15&quot;&gt;additionalFiles&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;191&quot; data-endline=&quot;191&quot; data-position=&quot;3901&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3901&quot; data-size=&quot;61&quot;&gt;Tuist에서 프로젝트를 만들 때 Xcode에 자동으로 연결해주지 않는 파일을 넣으면 프로젝트에 연결시켜준다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;192&quot; data-endline=&quot;192&quot; data-position=&quot;3969&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;3969&quot; data-size=&quot;6&quot;&gt;예를 들어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://readme.md/&quot;&gt;&lt;span data-position=&quot;3975&quot; data-size=&quot;9&quot;&gt;README.md&lt;/span&gt;&lt;/a&gt;&lt;span data-position=&quot;3984&quot; data-size=&quot;69&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 파일은 프로젝트를 만들 때 Xcode에는 자동으로 보여지지 않는데, 여기에 추가해준다면 Xcode에서도 볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;193&quot; data-endline=&quot;193&quot; data-position=&quot;4060&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;4060&quot; data-size=&quot;62&quot;&gt;아니면 통신할 서버가 GraphQL이여서 Apollo-iOS를 쓴다면 .graphql 파일을 추가할 수도 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;194&quot; data-endline=&quot;197&quot; data-position=&quot;4125&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;4125&quot; data-size=&quot;20&quot;&gt;resourceSynthesizers&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;195&quot; data-endline=&quot;195&quot; data-position=&quot;4152&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;4152&quot; data-size=&quot;56&quot;&gt;Tuist는 프로젝트를 생성할 때 Resources/ 안에 파일 확장자에 따라 enum을 제공해준다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;196&quot; data-endline=&quot;197&quot; data-position=&quot;4215&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;4215&quot; data-size=&quot;48&quot;&gt;예시로 Assets에 색이랑 이미지를 넣었다면 아래처럼 enum을 자동으로 생성해준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FcdQm/btrSHkyRWK8/2toKuAIdBZgWiDoOW708d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FcdQm/btrSHkyRWK8/2toKuAIdBZgWiDoOW708d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FcdQm/btrSHkyRWK8/2toKuAIdBZgWiDoOW708d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFcdQm%2FbtrSHkyRWK8%2F2toKuAIdBZgWiDoOW708d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;126&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PK9Tt/btrSF6nzr3c/rs8OapjrEcqFJIoeVAYjMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PK9Tt/btrSF6nzr3c/rs8OapjrEcqFJIoeVAYjMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PK9Tt/btrSF6nzr3c/rs8OapjrEcqFJIoeVAYjMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPK9Tt%2FbtrSF6nzr3c%2Frs8OapjrEcqFJIoeVAYjMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;392&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;groovy&quot; data-startline=&quot;202&quot; data-endline=&quot;227&quot; data-position=&quot;4341&quot;&gt;&lt;code&gt;public enum CoreAsset {
  public enum Colors {
    public static let girgGray = CoreColors(name: &quot;GIRG_Gray&quot;)
    public static let grigBackground = CoreColors(name: &quot;GRIG_Background&quot;)
    public static let grigBlack = CoreColors(name: &quot;GRIG_Black&quot;)
    public static let grigCompetePrimary = CoreColors(name: &quot;GRIG_CompetePrimary&quot;)
    public static let grigCompeteSecondary = CoreColors(name: &quot;GRIG_CompeteSecondary&quot;)
    public static let grigOnboardMain = CoreColors(name: &quot;GRIG_OnboardMain&quot;)
    public static let grigPrimary = CoreColors(name: &quot;GRIG_Primary&quot;)
    public static let grigPrimaryTextColor = CoreColors(name: &quot;GRIG_PrimaryTextColor&quot;)
    public static let grigSecondaryTextColor = CoreColors(name: &quot;GRIG_SecondaryTextColor&quot;)
    public static let grigWhite = CoreColors(name: &quot;GRIG_White&quot;)
  }
  public enum Images {
    public static let grigCompeteIcon = CoreImages(name: &quot;GRIG_CompeteIcon&quot;)
    public static let grigGithubIcon = CoreImages(name: &quot;GRIG_GithubIcon&quot;)
    public static let grigLogo = CoreImages(name: &quot;GRIG_Logo&quot;)
    public static let grigOnboard1 = CoreImages(name: &quot;GRIG_Onboard1&quot;)
    public static let grigOnboard2 = CoreImages(name: &quot;GRIG_Onboard2&quot;)
    public static let grigOnboard3 = CoreImages(name: &quot;GRIG_Onboard3&quot;)
    public static let grigOnboard4 = CoreImages(name: &quot;GRIG_Onboard4&quot;)
    public static let grigSword = CoreImages(name: &quot;GRIG_Sword&quot;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;229&quot; data-endline=&quot;229&quot; data-position=&quot;5761&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;5761&quot; data-size=&quot;82&quot;&gt;따라서 resourceSynthesizers란 위에서 제공해주지 않는 확장자들이 Resources/ 에 들어가있을때 어떻게 자동 생성해줄지에 대해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.stencil&lt;span data-position=&quot;5853&quot; data-size=&quot;43&quot;&gt;파일로 정의해주면 프로젝트를 생성할 때 .stencil내용에 따라 생성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;231&quot; data-endline=&quot;231&quot; data-position=&quot;5898&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;5898&quot; data-size=&quot;37&quot;&gt;예시로 프로젝트에 Lottie를 사용한다면 Resources/ 에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.json&lt;span data-position=&quot;5942&quot; data-size=&quot;37&quot;&gt;파일이 들어갔을 때 어떻게 자동 생성 시킬지에 대해 만들 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;233&quot; data-endline=&quot;233&quot; data-position=&quot;5982&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;.default&lt;span data-position=&quot;5992&quot; data-size=&quot;45&quot;&gt;는 strings, plists, fonts, assets을 자동으로 생성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Workspaceswift&quot; data-startline=&quot;237&quot; data-endline=&quot;237&quot; data-id=&quot;Workspaceswift&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;6049&quot; data-size=&quot;15&quot;&gt;Workspace.swift&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-startline=&quot;239&quot; data-endline=&quot;239&quot; data-position=&quot;6066&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;6066&quot; data-size=&quot;25&quot;&gt;WorkSpace.swift는 Tuist에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.xcworkspace&lt;span data-position=&quot;6105&quot; data-size=&quot;27&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;워크스페이스를 어떻게 만들지 정의하는 파일이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;241&quot; data-endline=&quot;241&quot; data-position=&quot;6134&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;6134&quot; data-size=&quot;30&quot;&gt;Workspace는 아래와 같은 이니셜라이저를 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot; data-startline=&quot;243&quot; data-endline=&quot;252&quot; data-position=&quot;6166&quot;&gt;&lt;code&gt;public init(
    name: String,
    projects: [ProjectDescription.Path],
    schemes: [ProjectDescription.Scheme] = [],
    fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil,
    additionalFiles: [ProjectDescription.FileElement] = [],
    generationOptions: ProjectDescription.Workspace.GenerationOptions = .options()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;254&quot; data-endline=&quot;264&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;254&quot; data-endline=&quot;255&quot; data-position=&quot;6516&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6516&quot; data-size=&quot;4&quot;&gt;name&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;255&quot; data-endline=&quot;255&quot; data-position=&quot;6527&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6527&quot; data-size=&quot;10&quot;&gt;워크스페이스의 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;256&quot; data-endline=&quot;259&quot; data-position=&quot;6540&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6540&quot; data-size=&quot;8&quot;&gt;projects&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;257&quot; data-endline=&quot;257&quot; data-position=&quot;6555&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6555&quot; data-size=&quot;34&quot;&gt;Workspace에 등록할 프로젝트들의 경로를 넣어주면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;258&quot; data-endline=&quot;258&quot; data-position=&quot;6596&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6596&quot; data-size=&quot;35&quot;&gt;struct인 Path를 받지만 그냥 문자열을 넣어도 무방하다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;259&quot; data-endline=&quot;259&quot; data-position=&quot;6638&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6638&quot; data-size=&quot;30&quot;&gt;기본 경로는 프로젝트의 루트 디렉토리를 기준으로 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;260&quot; data-endline=&quot;261&quot; data-position=&quot;6671&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6671&quot; data-size=&quot;44&quot;&gt;schemes, fileHeaderTemplate, additionalFiles&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;261&quot; data-endline=&quot;261&quot; data-position=&quot;6722&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6722&quot; data-size=&quot;17&quot;&gt;Project.swift와 동일&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;262&quot; data-endline=&quot;264&quot; data-position=&quot;6742&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6742&quot; data-size=&quot;17&quot;&gt;generationOptions&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;263&quot; data-endline=&quot;264&quot; data-position=&quot;6766&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;6766&quot; data-size=&quot;43&quot;&gt;Tuist가 xcworkspace 파일을 만들 때의 옵션을 설정해줄 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Configswift&quot; data-startline=&quot;267&quot; data-endline=&quot;267&quot; data-id=&quot;Configswift&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;6821&quot; data-size=&quot;12&quot;&gt;Config.swift&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-startline=&quot;269&quot; data-endline=&quot;269&quot; data-position=&quot;6835&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;6835&quot; data-size=&quot;26&quot;&gt;프로젝트 전역으로 쓰이는 설정을 해줄 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;271&quot; data-endline=&quot;271&quot; data-position=&quot;6863&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;6863&quot; data-size=&quot;35&quot;&gt;예를 들어 Swift의 버전이나 Xcode의 버전 같은게 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;273&quot; data-endline=&quot;273&quot; data-position=&quot;6900&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;6900&quot; data-size=&quot;61&quot;&gt;Config.swift는 {프로젝트 루트 디렉토리}/Tuist/Config.swift 에 있을 때만 적용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Target&quot; data-startline=&quot;277&quot; data-endline=&quot;277&quot; data-id=&quot;Target&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;6973&quot; data-size=&quot;6&quot;&gt;Target&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-startline=&quot;279&quot; data-endline=&quot;280&quot; data-position=&quot;6981&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;6981&quot; data-size=&quot;28&quot;&gt;Project.swift에서 언급했던 Target.&lt;/span&gt;&lt;br /&gt;&lt;span data-position=&quot;7010&quot; data-size=&quot;30&quot;&gt;Target은 사용할 모듈을 정의하는 struct이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-startline=&quot;282&quot; data-endline=&quot;282&quot; data-position=&quot;7042&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;7042&quot; data-size=&quot;27&quot;&gt;Target은 아래와 같은 이니셜라이저를 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot; data-startline=&quot;284&quot; data-endline=&quot;306&quot; data-position=&quot;7071&quot;&gt;&lt;code&gt;public init(
    name: String,
    platform: ProjectDescription.Platform,
    product: ProjectDescription.Product,
    productName: String? = nil,
    bundleId: String,
    deploymentTarget: ProjectDescription.DeploymentTarget? = nil,
    infoPlist: ProjectDescription.InfoPlist? = .default,
    sources: ProjectDescription.SourceFilesList? = nil,
    resources: ProjectDescription.ResourceFileElements? = nil,
    copyFiles: [ProjectDescription.CopyFilesAction]? = nil,
    headers: ProjectDescription.Headers? = nil,
    entitlements: ProjectDescription.Path? = nil,
    scripts: [ProjectDescription.TargetScript] = [],
    dependencies: [ProjectDescription.TargetDependency] = [],
    settings: ProjectDescription.Settings? = nil,
    coreDataModels: [ProjectDescription.CoreDataModel] = [],
    environment: [String : String] = [:],
    launchArguments: [ProjectDescription.LaunchArgument] = [],
    additionalFiles: [ProjectDescription.FileElement] = []
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;308&quot; data-endline=&quot;346&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;308&quot; data-endline=&quot;309&quot; data-position=&quot;8048&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8048&quot; data-size=&quot;4&quot;&gt;name&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;309&quot; data-endline=&quot;309&quot; data-position=&quot;8059&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8059&quot; data-size=&quot;6&quot;&gt;타겟의 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;310&quot; data-endline=&quot;311&quot; data-position=&quot;8068&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8068&quot; data-size=&quot;8&quot;&gt;platform&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;311&quot; data-endline=&quot;311&quot; data-position=&quot;8083&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8083&quot; data-size=&quot;39&quot;&gt;iOS, macOS, tvOS, watchOS 같은 플랫폼을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;312&quot; data-endline=&quot;313&quot; data-position=&quot;8125&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8125&quot; data-size=&quot;7&quot;&gt;product&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;313&quot; data-endline=&quot;313&quot; data-position=&quot;8139&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8139&quot; data-size=&quot;60&quot;&gt;app, appClips, staticFramework, framework, unitTest 등을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;314&quot; data-endline=&quot;316&quot; data-position=&quot;8202&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8202&quot; data-size=&quot;11&quot;&gt;productName&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;315&quot; data-endline=&quot;315&quot; data-position=&quot;8220&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8220&quot; data-size=&quot;16&quot;&gt;만들어진 product의 이름&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;316&quot; data-endline=&quot;316&quot; data-position=&quot;8243&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8243&quot; data-size=&quot;22&quot;&gt;The build product name&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;317&quot; data-endline=&quot;318&quot; data-position=&quot;8268&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8268&quot; data-size=&quot;7&quot;&gt;bundled&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;318&quot; data-endline=&quot;318&quot; data-position=&quot;8282&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8282&quot; data-size=&quot;36&quot;&gt;프로젝트 파일을 열었을 때 보이는 Bundle Identifier&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;319&quot; data-endline=&quot;320&quot; data-position=&quot;8321&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8321&quot; data-size=&quot;16&quot;&gt;deploymentTarget&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;320&quot; data-endline=&quot;320&quot; data-position=&quot;8344&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8344&quot; data-size=&quot;16&quot;&gt;배포 타겟을 설정할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;321&quot; data-endline=&quot;322&quot; data-position=&quot;8363&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8363&quot; data-size=&quot;9&quot;&gt;infoPlist&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;322&quot; data-endline=&quot;322&quot; data-position=&quot;8379&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8379&quot; data-size=&quot;17&quot;&gt;info.plist를 정의한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;323&quot; data-endline=&quot;325&quot; data-position=&quot;8399&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8399&quot; data-size=&quot;7&quot;&gt;sources&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;324&quot; data-endline=&quot;324&quot; data-position=&quot;8413&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8413&quot; data-size=&quot;19&quot;&gt;소스코드의 경로를 입력해주면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;325&quot; data-endline=&quot;325&quot; data-position=&quot;8439&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8442&quot; data-size=&quot;21&quot;&gt;안에 문자열로 경로를 입력해도 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;326&quot; data-endline=&quot;328&quot; data-position=&quot;8466&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8466&quot; data-size=&quot;9&quot;&gt;resources&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;327&quot; data-endline=&quot;327&quot; data-position=&quot;8482&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8482&quot; data-size=&quot;102&quot;&gt;앞서서 resourceSynthesizers에서 Tuist가 Resources/ 의 리소스들을 자동으로 코드화한다고 했는데, 그때 이 리소스들이 어디에 있는지에 대한 경로를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;328&quot; data-endline=&quot;328&quot; data-position=&quot;8591&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8594&quot; data-size=&quot;21&quot;&gt;안에 문자열로 경로를 입력해도 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;329&quot; data-endline=&quot;330&quot; data-position=&quot;8618&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8618&quot; data-size=&quot;9&quot;&gt;copyFiles&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;330&quot; data-endline=&quot;330&quot; data-position=&quot;8634&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8634&quot; data-size=&quot;27&quot;&gt;타겟에 대한 Build Phase 파일 복사 작업&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;331&quot; data-endline=&quot;332&quot; data-position=&quot;8664&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8664&quot; data-size=&quot;7&quot;&gt;headers&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;332&quot; data-endline=&quot;332&quot; data-position=&quot;8678&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8678&quot; data-size=&quot;14&quot;&gt;타겟에 대한 headers&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;333&quot; data-endline=&quot;334&quot; data-position=&quot;8695&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8695&quot; data-size=&quot;12&quot;&gt;entitlements&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;334&quot; data-endline=&quot;334&quot; data-position=&quot;8714&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8714&quot; data-size=&quot;34&quot;&gt;타겟에 대한 entitlements의 경로를 입력해주면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;335&quot; data-endline=&quot;336&quot; data-position=&quot;8751&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8751&quot; data-size=&quot;7&quot;&gt;scripts&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;336&quot; data-endline=&quot;336&quot; data-position=&quot;8765&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8765&quot; data-size=&quot;26&quot;&gt;타겟에 대한 build Phase 스크립트 작업&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;337&quot; data-endline=&quot;339&quot; data-position=&quot;8794&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8794&quot; data-size=&quot;12&quot;&gt;dependencies&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;338&quot; data-endline=&quot;338&quot; data-position=&quot;8813&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8813&quot; data-size=&quot;20&quot;&gt;타겟의 의존성에 대한 것을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-startline=&quot;339&quot; data-endline=&quot;339&quot; data-position=&quot;8840&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8840&quot; data-size=&quot;30&quot;&gt;라이브러리나 다른 모듈을 의존성으로 넣을 때 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;340&quot; data-endline=&quot;341&quot; data-position=&quot;8873&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8873&quot; data-size=&quot;8&quot;&gt;settings&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;341&quot; data-endline=&quot;341&quot; data-position=&quot;8888&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8888&quot; data-size=&quot;13&quot;&gt;타겟의 세팅을 정의한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;342&quot; data-endline=&quot;343&quot; data-position=&quot;8904&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8904&quot; data-size=&quot;14&quot;&gt;coreDataModels&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;343&quot; data-endline=&quot;343&quot; data-position=&quot;8925&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8925&quot; data-size=&quot;28&quot;&gt;CoreData의 모델들의 경로랑 버전을 정의한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-startline=&quot;344&quot; data-endline=&quot;346&quot; data-position=&quot;8956&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8956&quot; data-size=&quot;11&quot;&gt;environment&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;345&quot; data-endline=&quot;346&quot; data-position=&quot;8974&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;8974&quot; data-size=&quot;102&quot;&gt;scheme에서 Edit Scheme&amp;hellip; 버튼을 누르면 나오는 창에서 Environment Variables를 설정할 수 있는데 이때 environment를 설정하면 자동으로 생성한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qPLpE/btrSHwTlsUW/kjGVRuosqi6petNCIqprq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qPLpE/btrSHwTlsUW/kjGVRuosqi6petNCIqprq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qPLpE/btrSHwTlsUW/kjGVRuosqi6petNCIqprq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqPLpE%2FbtrSHwTlsUW%2FkjGVRuosqi6petNCIqprq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1882&quot; height=&quot;1014&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;349&quot; data-endline=&quot;351&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;349&quot; data-endline=&quot;351&quot; data-position=&quot;9118&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;9118&quot; data-size=&quot;15&quot;&gt;launchArguments&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;350&quot; data-endline=&quot;351&quot; data-position=&quot;9140&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;9140&quot; data-size=&quot;110&quot;&gt;scheme에서 Edit Scheme&amp;hellip; 버튼을 누르면 나오는 창에서 Arguments Passed On Launch를 설정할 수 있는데 이때 launchArguments 설정하면 자동으로 생성한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UGkAX/btrSHUsCt73/45ITa3MxxYoBhM1hwsRCVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UGkAX/btrSHUsCt73/45ITa3MxxYoBhM1hwsRCVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UGkAX/btrSHUsCt73/45ITa3MxxYoBhM1hwsRCVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUGkAX%2FbtrSHUsCt73%2F45ITa3MxxYoBhM1hwsRCVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1878&quot; height=&quot;1008&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-startline=&quot;354&quot; data-endline=&quot;356&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;354&quot; data-endline=&quot;356&quot; data-position=&quot;9292&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;9292&quot; data-size=&quot;15&quot;&gt;additionalFiles&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-startline=&quot;355&quot; data-endline=&quot;356&quot; data-position=&quot;9314&quot; data-size=&quot;0&quot;&gt;&lt;span data-position=&quot;9314&quot; data-size=&quot;51&quot;&gt;프로젝트를 생성할 때 자동으로 생겨나지 않는 파일을 등록해놓으면 Xcode에서 볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-startline=&quot;360&quot; data-endline=&quot;360&quot; data-position=&quot;9380&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;360&quot; data-endline=&quot;360&quot; data-position=&quot;9380&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-startline=&quot;360&quot; data-endline=&quot;360&quot; data-position=&quot;9380&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-position=&quot;9380&quot; data-size=&quot;36&quot;&gt;편집을 모두 마치고 아래 명령어를 입력해주면 프로젝트가 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;verilog&quot; data-startline=&quot;362&quot; data-endline=&quot;364&quot; data-position=&quot;9418&quot;&gt;&lt;code&gt;tuist generate
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-startline=&quot;366&quot; data-endline=&quot;366&quot; data-position=&quot;9442&quot; data-size=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;.xcodeproj&lt;span data-position=&quot;9454&quot; data-size=&quot;2&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.xcworkspace&lt;span data-position=&quot;9470&quot; data-size=&quot;10&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일이 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;h1 data-startline=&quot;369&quot; data-endline=&quot;369&quot; data-id=&quot;Reference&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;Reference&quot; data-startline=&quot;369&quot; data-endline=&quot;369&quot; data-id=&quot;Reference&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;9485&quot; data-size=&quot;9&quot;&gt;  Tuist로 생성한 프로젝트 구경가기&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1669968326801&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 - YAPP-Github/21st-iOS-Team-2-iOS&quot; data-og-description=&quot;Contribute to YAPP-Github/21st-iOS-Team-2-iOS development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/tree/68c1ed227b9602e560133f1177e4cda49d5da59c&quot; data-og-url=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1kQx1/hyQKPULZ6M/qcSU6GP1ovxhOqG4qqx0Q1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/tree/68c1ed227b9602e560133f1177e4cda49d5da59c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/YAPP-Github/21st-iOS-Team-2-iOS/tree/68c1ed227b9602e560133f1177e4cda49d5da59c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1kQx1/hyQKPULZ6M/qcSU6GP1ovxhOqG4qqx0Q1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - YAPP-Github/21st-iOS-Team-2-iOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to YAPP-Github/21st-iOS-Team-2-iOS development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;Reference&quot; data-startline=&quot;369&quot; data-endline=&quot;369&quot; data-id=&quot;Reference&quot;&gt;&lt;b&gt;&lt;span data-position=&quot;9485&quot; data-size=&quot;9&quot;&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1669966743082&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;Get started | Tuist Documentation&quot; data-og-description=&quot;Learn how to install Tuist in your environment and generate your first project.&quot; data-og-host=&quot;docs.tuist.io&quot; data-og-source-url=&quot;https://docs.tuist.io/tutorial/get-started/&quot; data-og-url=&quot;https://docs.tuist.io/tutorial/get-started&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.tuist.io/tutorial/get-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.tuist.io/tutorial/get-started/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Get started | Tuist Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to install Tuist in your environment and generate your first project.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.tuist.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1669966731737&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] Tuist 모듈화 툴&quot; data-og-description=&quot;Tuist..! 모듈화를 위한 툴이에요 드디어 해보게 되었는데요... Tuist에대한 정보가 많이 부족하더라구요 정보에 보탬이되고자 정리를 해서 공유해보려고해요! Tuist에러 때문에 쉐도우복싱도 많이&quot; data-og-host=&quot;nsios.tistory.com&quot; data-og-source-url=&quot;https://nsios.tistory.com/183&quot; data-og-url=&quot;https://nsios.tistory.com/183&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qxn1C/hyQMxLAux6/5wPpeNcs17SMpWO8HRwPYK/img.png?width=410&amp;amp;height=200&amp;amp;face=0_0_410_200,https://scrap.kakaocdn.net/dn/irvSX/hyQKPN062p/GY5jPFc4FOnmrlGxoGou9K/img.png?width=410&amp;amp;height=200&amp;amp;face=0_0_410_200,https://scrap.kakaocdn.net/dn/dV5I4L/hyQMCTEU7C/TsnCmN5uVxR87Ihj0scaF0/img.png?width=678&amp;amp;height=452&amp;amp;face=0_0_678_452&quot;&gt;&lt;a href=&quot;https://nsios.tistory.com/183&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nsios.tistory.com/183&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qxn1C/hyQMxLAux6/5wPpeNcs17SMpWO8HRwPYK/img.png?width=410&amp;amp;height=200&amp;amp;face=0_0_410_200,https://scrap.kakaocdn.net/dn/irvSX/hyQKPN062p/GY5jPFc4FOnmrlGxoGou9K/img.png?width=410&amp;amp;height=200&amp;amp;face=0_0_410_200,https://scrap.kakaocdn.net/dn/dV5I4L/hyQMCTEU7C/TsnCmN5uVxR87Ihj0scaF0/img.png?width=678&amp;amp;height=452&amp;amp;face=0_0_678_452');&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] Tuist 모듈화 툴&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tuist..! 모듈화를 위한 툴이에요 드디어 해보게 되었는데요... Tuist에대한 정보가 많이 부족하더라구요 정보에 보탬이되고자 정리를 해서 공유해보려고해요! Tuist에러 때문에 쉐도우복싱도 많이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nsios.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1669966728681&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[iOS - swift] 4. 모듈화 개념 - Tuist로 프로젝트 관리 방법&quot; data-og-description=&quot;1. 모듈화 개념 - Library vs Framework (static library, dynamic library, static framework, dynamic  framework) 2. 모듈화 개념 - Binary File 개념 (Mach-O, CPU Architectures, Universal binary, lipo command) 3. 모듈화 개념 - XCFramework 생성&quot; data-og-host=&quot;ios-development.tistory.com&quot; data-og-source-url=&quot;https://ios-development.tistory.com/1006&quot; data-og-url=&quot;https://ios-development.tistory.com/1006&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bogUTC/hyQMBNZRIe/PdzsbTpcnlOvoISkBHrZ41/img.png?width=540&amp;amp;height=436&amp;amp;face=0_0_540_436,https://scrap.kakaocdn.net/dn/YJuSa/hyQMDrvj94/r1kRqsb0ooMuP0Nxe7PDUK/img.png?width=540&amp;amp;height=436&amp;amp;face=0_0_540_436,https://scrap.kakaocdn.net/dn/nJrv3/hyQMuBkBVu/aXiMVEA8dKLBhVRwSsXy81/img.png?width=1442&amp;amp;height=1022&amp;amp;face=0_0_1442_1022&quot;&gt;&lt;a href=&quot;https://ios-development.tistory.com/1006&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ios-development.tistory.com/1006&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bogUTC/hyQMBNZRIe/PdzsbTpcnlOvoISkBHrZ41/img.png?width=540&amp;amp;height=436&amp;amp;face=0_0_540_436,https://scrap.kakaocdn.net/dn/YJuSa/hyQMDrvj94/r1kRqsb0ooMuP0Nxe7PDUK/img.png?width=540&amp;amp;height=436&amp;amp;face=0_0_540_436,https://scrap.kakaocdn.net/dn/nJrv3/hyQMuBkBVu/aXiMVEA8dKLBhVRwSsXy81/img.png?width=1442&amp;amp;height=1022&amp;amp;face=0_0_1442_1022');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[iOS - swift] 4. 모듈화 개념 - Tuist로 프로젝트 관리 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 모듈화 개념 - Library vs Framework (static library, dynamic library, static framework, dynamic  framework) 2. 모듈화 개념 - Binary File 개념 (Mach-O, CPU Architectures, Universal binary, lipo command) 3. 모듈화 개념 - XCFramework 생성&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ios-development.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1669966724988&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;Tuist 사용법 - 1. 이론 및 샘플 예제&quot; data-og-description=&quot;Tuist? Xcode 프로젝트 관리 툴? Why Tuist? 설치 Manifests Project.swift Workspace.swift Config.swift Target 샘플 프로젝트 모듈 생성 Method 모듈 구조 만들기 결론 Tuist? Xcode 프로젝트를 관리하는 툴입니다. Project.swif&quot; data-og-host=&quot;baegteun.tistory.com&quot; data-og-source-url=&quot;https://baegteun.tistory.com/2&quot; data-og-url=&quot;https://baegteun.tistory.com/2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jLGL9/hyQL8S8RFR/14CcvfOeKMbcy5ilteKvH0/img.png?width=64&amp;amp;height=64&amp;amp;face=0_0_64_64,https://scrap.kakaocdn.net/dn/wcIWy/hyQKUu08qc/7Kk2Trg54CE6bY9w2uI3t1/img.png?width=64&amp;amp;height=64&amp;amp;face=0_0_64_64,https://scrap.kakaocdn.net/dn/3oVEo/hyQMwTsFt8/yydJCHv4PP3YDhngRgEuJ1/img.png?width=528&amp;amp;height=414&amp;amp;face=0_0_528_414&quot;&gt;&lt;a href=&quot;https://baegteun.tistory.com/2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://baegteun.tistory.com/2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jLGL9/hyQL8S8RFR/14CcvfOeKMbcy5ilteKvH0/img.png?width=64&amp;amp;height=64&amp;amp;face=0_0_64_64,https://scrap.kakaocdn.net/dn/wcIWy/hyQKUu08qc/7Kk2Trg54CE6bY9w2uI3t1/img.png?width=64&amp;amp;height=64&amp;amp;face=0_0_64_64,https://scrap.kakaocdn.net/dn/3oVEo/hyQMwTsFt8/yydJCHv4PP3YDhngRgEuJ1/img.png?width=528&amp;amp;height=414&amp;amp;face=0_0_528_414');&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;Tuist 사용법 - 1. 이론 및 샘플 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tuist? Xcode 프로젝트 관리 툴? Why Tuist? 설치 Manifests Project.swift Workspace.swift Config.swift Target 샘플 프로젝트 모듈 생성 Method 모듈 구조 만들기 결론 Tuist? Xcode 프로젝트를 관리하는 툴입니다. Project.swif&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;baegteun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Swift/iOS</category>
      <category>IOS</category>
      <category>Swift</category>
      <category>tuist</category>
      <category>Xcode</category>
      <category>XcodeGen</category>
      <author>Ari Lee</author>
      <guid isPermaLink="true">https://leeari95.tistory.com/74</guid>
      <comments>https://leeari95.tistory.com/74#entry74comment</comments>
      <pubDate>Fri, 2 Dec 2022 16:40:45 +0900</pubDate>
    </item>
  </channel>
</rss>