<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>quve.log</title>
    <link>https://quve.tistory.com/</link>
    <description>1인 모바일 게임 개발자 QUVE의
Unity 게임 개발 및 게임 운영 관련 기록들</description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 05:18:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>QUVE.</managingEditor>
    <image>
      <title>quve.log</title>
      <url>https://tistory1.daumcdn.net/tistory/5625130/attach/8f2d06c580a548f891bee91141315ebf</url>
      <link>https://quve.tistory.com</link>
    </image>
    <item>
      <title>[C#] 실제 활용 사례로 이해하는 확장 메서드 (Extension Method)</title>
      <link>https://quve.tistory.com/16</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;확장 메서드란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장 메서드(Extension Method)는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;이미 존재하는 클래스에 메서드를 추가&lt;/b&gt;&lt;/span&gt;하는 독특한 기능입니다. 예를 들면 다음과 같은 방식으로 개발이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709466592960&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string text = &quot;HELLO!&quot;
Debug.Log(text);              // HELLO!
Debug.Log(text.RemoveL());    // HEO!&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;C#의 string에 RemoveL()이라는 메서드는 없습니다. 하지만 확장 메서드를 정의하면 별도의 클래스를 생성하지 않아도 새로운 기능을 쉽게 실행할 수 있습니다. 위 예제의 기능을 수행하는 확장 메서드는 아래와 같이 선언하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709467134285&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static class MyStringExtension
{
  public static string RemoveL(this string str)
  {
    // str의 문자열 중 'L'을 삭제하는 코드 구현
    return str.Replace(&quot;L&quot;, &quot;&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;여기에서 핵심은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;정적 클래스 내에 선언된 정적 메서드로 확장&lt;/span&gt;&lt;/b&gt;이 된다는 것입니다. 또한 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;확장 메서드의 첫번째 인수에는 반드시 this 키워드를 가진 매개변수가 포함&lt;/b&gt;&lt;/span&gt;되어 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;확장 메서드는 static 메서드다!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 확장 메서드를 작성한다고 해서 실제로 해당 클래스에 인스턴스 메서드가 추가 되는 것은 아닙니다. 실제로는 &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods#binding-extension-methods-at-compile-time:~:text=Extension%20methods%20are%20static%20methods%2C%20but%20they%27re%20called%20as%20if%20they%20were%20instance%20methods%20on%20the%20extended%20type.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정적 메서드를 호출&lt;/a&gt;하는 것이지만 C#의 문법에 의해 마치 그렇게 보이는 것입니다. 아래의 아래의 두 코드는 같은 결과를 출력합니다. 확장 메서드를 사용하면 메서드의 호출을 더욱 간결하고 명확하게 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709500879563&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// static 메서드의 형태로 호출.
MyStringExtension.RemoveL(text);

// 확장 메서드의 형태로 호출.
text.RemoveL();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;확장 메서드는 바인딩 우선순위가 낮다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;확장 메서드를 통해서 클래스의 메서드를 재정의할 수 없습니다.&lt;/b&gt;&lt;/span&gt; string의 Replace라는 메서드를 확장 메서드로 구현한다고 해서 이를 오버라이딩 할 수 없는 것이지요. 컴파일러는 클래스의 인스턴스 메서드에 먼저 바인딩을 시도한 후, 인스턴스 메서드를 찾을 수 없으면 확장 메서드에 바인딩을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 프로젝트 적용 사례&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Unity를 이용해 게임을 개발하던 중 화면에 출력되는 UI.Text들에 언어 설정에 따라 번역된 문자열을 적용하는 기능이 필요했습니다. 이미 작성된 코드에는 수많은 UI.Text 객체들이 있었기 때문에 번역된 문자열을 각각 할당하는 것은 굉장히 많은 반복 작업이 필요한 일이었습니다. 새로운 유틸리티 클래스를 만들거나 UI.Text를 상속받는 클래스를 만들어서 해결할 수도 있었지만 최소한의 코드 변경으로 해당 기능을 구현하고 싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 문제를 해결하기 위해 확장 메서드를 사용했습니다. 다음과 같은 코드를 작성하여 UI.Text가 SetTerm이라는 메서드를 인스턴스 메서드처럼 실행할 수 있도록 구현했습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709502461492&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static class TextExtension
{
    public static void SetTerm(this Text text, string term)
    {
        // 번역 기능을 수행하는 컴포넌트를 가져온다.
        var localize = text.transform.GetComponent&amp;lt;I2.Loc.Localize&amp;gt;();
        if(localize == null)
        {
            Debug.LogError($&quot;[TextExtension] 현재 Text component에 I2.Loc.Localize가 추가되어 있지 않음&quot;);
            return;
        }

        // 번역 컴포넌트에 번역을 위한 키값을 입력한다. 이를 통해 번역된 문자열이 UI.Text에 자동으로 할당한다.
        localize.Term = $&quot;{term}&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;그 결과 아래와 같이 매우 간단한 형태로 원하는 기능을 구현할 수 있었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709502592627&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class AlertView : MonoBehaviour
{
    public Text m_Title;
    public Text m_Message;

    /* ... */

    public void Show(string titleKey, string messageKey)
    {
        m_Title.SetTerm(titleKey);
        m_Message.SetTerm(messageKey);

        /* ... */
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extension Methods (C# Programming Guide) (&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods#binding-extension-methods-at-compile-time&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;)&lt;/p&gt;</description>
      <category>C#</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/16</guid>
      <comments>https://quve.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 4 Mar 2024 06:57:48 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Android Force Resolve 사용 시 발생하는 duplicated class 문제 해결</title>
      <link>https://quve.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GPGS나 Firebase를 연동하면 Android Plugin 다운로드를 위해 External Dependency Manager를 사용하는 경우가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 External Dependency Manager 때문에 빌드 시 큰 고생을 하는 경우가 많습니다. 그 중 가장 흔하게 볼 수 있는 에러가 &lt;b&gt;Execution failed for task ':launcher:checkReleaseDuplicateClasses'&lt;/b&gt; 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제는 말 그대로 빌드 단계에서 중복된 클래스를 발생한 경우 출력됩니다. 개발을 할 때 동일한 클래스 이름을 가진 클래스를 구현하려고 하면 컴파일 에러가 나듯이, 빌드 시 여러 라이브러리를 병합하는데 동일한 클래스가 발견이 되어 빌드에 실패를 한 케이스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 시 중복된 라이브러리들이 존재하지 않도록 조치를 취해야 합니다. &lt;b&gt;가장 흔하게 사용 되는 방법은 Force Resolve를 사용하는 것&lt;/b&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-28 오전 7.58.55.jpg&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beWK3Q/btsAVqpB8dl/QYEL6SN1x3Twm6KpIrJCJ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beWK3Q/btsAVqpB8dl/QYEL6SN1x3Twm6KpIrJCJ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beWK3Q/btsAVqpB8dl/QYEL6SN1x3Twm6KpIrJCJ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeWK3Q%2FbtsAVqpB8dl%2FQYEL6SN1x3Twm6KpIrJCJ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;133&quot; data-filename=&quot;스크린샷 2023-11-28 오전 7.58.55.jpg&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;306&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;만일 Force Resolve를 이용했는데 Resolving Android Dependencies 창에서 라이브러리들을 다시 다운로드 받는 프로세스가 보이지 않고 바로 success가 출력되는 경우 불필요한 custom manifest와 custom gradle을 비활성화한 뒤 다시 시도를 해봐야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Force Resolve를 이용해도 해결되지 않고 동일하게 duplicateClasses 에러가 출력되는 경우에는 Plugin/Android 디렉토리에 있는 `androidx.-----.-----.jar`, `androidx.-----.-----.aar`, `com.google.-----.-----.jar`, `com.google.-----.-----aar`, `org.jetbrains.-----.-----.jar`, 와 같은 라이브러리들을 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;직접 모두 삭제&lt;/b&gt;&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Force Resolve를 사용했을때 버전업이 되어서 이름이 달라지게 된 라이브러리를 삭제하지 못합니다. (ex. androidx.core.core-1.2.0.aar과 androidx.core.core-1.1.3-alpha.aar) 이 경우 디렉토리에 구 버전의 라이브러리는 여전히 남아있는데 새로운 버전을 다운로드 받게 되어 빌드 과정 중 중복이 발생하게 됩니다.&lt;/p&gt;</description>
      <category>Unity</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/14</guid>
      <comments>https://quve.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 28 Nov 2023 08:14:17 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Android ANR 기호화</title>
      <link>https://quve.tistory.com/13</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Android Symbol 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Unity의 안내에 따라 Android Symbols를 생성해야 합니다. (&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://docs.unity3d.com/2022.3/Documentation/Manual/android-symbols.html&quot;&gt;관련 문서&lt;/a&gt;) 이렇게 생성된 Android Symbols를 Google Play Console에 업로드하면 Android Vitals를 통해 사람이 읽을 수 있는 Stack trace를 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Android Symbol은 &lt;b&gt;Public&lt;/b&gt;과 &lt;b&gt;Debug&lt;/b&gt;로 나뉘어 있습니다. Public은 심볼 테이블을 확인할 수 있는 작은 파일이며 Debug는 Public 심볼 파일을 포함한 모든 디버깅 정보가 포함 되어 있는 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;심볼 파일을 생성하기 위해서는 Build Settings에서 심볼 파일을 생성한다고 설정해야 합니다. 기본값은 심볼 생성이 비활성화 되어 있지만 Public 혹은 Debug 심볼을 생성할 수 있습니다. &lt;b&gt;Google Play Console에는 Public 심볼만 업로드 할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.00.16.jpg&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpnpvJ/btsAQgeR5Wb/6rGTptc3cBNMIN6Dook7HK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpnpvJ/btsAQgeR5Wb/6rGTptc3cBNMIN6Dook7HK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpnpvJ/btsAQgeR5Wb/6rGTptc3cBNMIN6Dook7HK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpnpvJ%2FbtsAQgeR5Wb%2F6rGTptc3cBNMIN6Dook7HK%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;561&quot; height=&quot;479&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.00.16.jpg&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설정 후 빌드가 완료되면 apk 혹은 aab 파일이 빌드 된 디렉토리에 심볼 압축파일이 생성되는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 생성된 심볼 압축 파일은 Google Play Console을 통해 업로드 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Symbol 업로드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성된 심볼 파일은 Google Play Console의 App Bundle 탐색기를 통해 업로드 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.21.36.jpg&quot; data-origin-width=&quot;3232&quot; data-origin-height=&quot;1744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u2a3N/btsAOUKpdHj/1NxMoZtFRtidzh7EClxTW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u2a3N/btsAOUKpdHj/1NxMoZtFRtidzh7EClxTW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u2a3N/btsAOUKpdHj/1NxMoZtFRtidzh7EClxTW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu2a3N%2FbtsAOUKpdHj%2F1NxMoZtFRtidzh7EClxTW0%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;3232&quot; height=&quot;1744&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.21.36.jpg&quot; data-origin-width=&quot;3232&quot; data-origin-height=&quot;1744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.22.49.jpg&quot; data-origin-width=&quot;3240&quot; data-origin-height=&quot;1766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b86ZO9/btsAPxH3RYd/Omf46Kl72LFYkHJwWDDaA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b86ZO9/btsAPxH3RYd/Omf46Kl72LFYkHJwWDDaA1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b86ZO9/btsAPxH3RYd/Omf46Kl72LFYkHJwWDDaA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb86ZO9%2FbtsAPxH3RYd%2FOmf46Kl72LFYkHJwWDDaA1%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;3240&quot; height=&quot;1766&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.22.49.jpg&quot; data-origin-width=&quot;3240&quot; data-origin-height=&quot;1766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;각 버전에 맞는 네이티브 디버그 심볼을 업로드 해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ANR Stack Trace 보기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 ANR이 발생하면 품질 &amp;gt; Android vitals &amp;gt; 비정상 종료 및 ANR을 통해 기호화 되어있던 stack trace를 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.25.06.jpg&quot; data-origin-width=&quot;3222&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QWM66/btsAPjQIC86/YsoAGi264ePJWXfpWsvr21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QWM66/btsAPjQIC86/YsoAGi264ePJWXfpWsvr21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QWM66/btsAPjQIC86/YsoAGi264ePJWXfpWsvr21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQWM66%2FbtsAPjQIC86%2FYsoAGi264ePJWXfpWsvr21%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;3222&quot; height=&quot;1606&quot; data-filename=&quot;스크린샷 2023-11-24 오전 7.25.06.jpg&quot; data-origin-width=&quot;3222&quot; data-origin-height=&quot;1606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Unity</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/13</guid>
      <comments>https://quve.tistory.com/13#entry13comment</comments>
      <pubDate>Fri, 24 Nov 2023 07:33:13 +0900</pubDate>
    </item>
    <item>
      <title>[etc] 티스토리 블로그 글이 구글에서 검색이 안되는 경우</title>
      <link>https://quve.tistory.com/12</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 블로그 글을 열심히 작성했는데 구글에서 검색이 안됐다. Google Search Console에 블로그를 등록했음에도 검색을 할 수 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모바일웹 자동 연결 비활성화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 티스토리 블로그의 모바일웹 자동 연결이 사용중인지 확인해야 한다. 별다른 설정을 하지 않았다면 기본값으로 모바일웹 자동 연결이 활성화 되어 있다. 그런데 이 모바일웹 자동 연결 기능으로 인해 리디렉션 오류가 발생하고 이로 인해 구글에서 색인을 생성하지 않는 경우가 발생할 수 있다. &lt;b&gt;모바일웹 자동 연결 기능을 비활성화 해야 한다&lt;/b&gt;. 블로그의 관리자 페이지에서 &lt;b&gt;꾸미기 &amp;gt; 모바일&lt;/b&gt; 항목을 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.03.37.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzxd1R/btszeKipdPF/vXVU3wBTz4W15B0MlV8Rlk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzxd1R/btszeKipdPF/vXVU3wBTz4W15B0MlV8Rlk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzxd1R/btszeKipdPF/vXVU3wBTz4W15B0MlV8Rlk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzxd1R%2FbtszeKipdPF%2FvXVU3wBTz4W15B0MlV8Rlk%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;450&quot; height=&quot;372&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.03.37.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그런 다음 티스토리 모바일웹 자동 연결을 &lt;b&gt;사용하지 않습니다&lt;/b&gt;로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.03.56.jpg&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMgE3e/btszdeD9Tli/X42Trm2l5mzTgA82e8xWRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMgE3e/btszdeD9Tli/X42Trm2l5mzTgA82e8xWRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMgE3e/btszdeD9Tli/X42Trm2l5mzTgA82e8xWRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMgE3e%2FbtszdeD9Tli%2FX42Trm2l5mzTgA82e8xWRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.03.56.jpg&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;352&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;h3 data-ke-size=&quot;size23&quot;&gt;색인 직접 요청&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색이 안되는 특정 게시글의 URL 검사를 수동으로 진행해준다. 아래의 필드에 검색이 안되는 블로그 게시글의 주소를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.34.45.jpg&quot; data-origin-width=&quot;3408&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BX1LE/btsxqsD6lVl/owXbMsPK4vzM9aMaLMugk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BX1LE/btsxqsD6lVl/owXbMsPK4vzM9aMaLMugk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BX1LE/btsxqsD6lVl/owXbMsPK4vzM9aMaLMugk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBX1LE%2FbtsxqsD6lVl%2FowXbMsPK4vzM9aMaLMugk1%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;3408&quot; height=&quot;812&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.34.45.jpg&quot; data-origin-width=&quot;3408&quot; data-origin-height=&quot;812&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.38.59.jpg&quot; data-origin-width=&quot;3412&quot; data-origin-height=&quot;1184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PXja0/btsxg1tUMqF/wEYEHVKaE9R19K8ClNZ0S0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PXja0/btsxg1tUMqF/wEYEHVKaE9R19K8ClNZ0S0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PXja0/btsxg1tUMqF/wEYEHVKaE9R19K8ClNZ0S0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPXja0%2Fbtsxg1tUMqF%2FwEYEHVKaE9R19K8ClNZ0S0%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;3412&quot; height=&quot;1184&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.38.59.jpg&quot; data-origin-width=&quot;3412&quot; data-origin-height=&quot;1184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 검색이 불가능한 경우에는 &lt;b&gt;'URL이 Google에 등록되어 있지 않음'&lt;/b&gt;이라는 문구가 출력된다. 우측 하단의 &lt;b&gt;'색인 생성 요청'&lt;/b&gt; 버튼을 눌러서 색인 생성을 요청한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.34.54.jpg&quot; data-origin-width=&quot;3310&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUgdpc/btsxri17zJL/YPRqZQVpkAa86lgFxV0jcK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUgdpc/btsxri17zJL/YPRqZQVpkAa86lgFxV0jcK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUgdpc/btsxri17zJL/YPRqZQVpkAa86lgFxV0jcK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUgdpc%2Fbtsxri17zJL%2FYPRqZQVpkAa86lgFxV0jcK%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;3310&quot; height=&quot;980&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.34.54.jpg&quot; data-origin-width=&quot;3310&quot; data-origin-height=&quot;980&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색인 생성 요청이 완료되면 다음과 같은 확인 창이 출력된다. 짧게는 하루, 길게는 2주 정도 기다리면 구글에서 내 블로그의 글이 정상적으로 검색 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.35.00.jpg&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;2128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4Jyok/btsxtTUZ1Gc/5xZ6EtnyjW9ju839mnMmp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4Jyok/btsxtTUZ1Gc/5xZ6EtnyjW9ju839mnMmp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4Jyok/btsxtTUZ1Gc/5xZ6EtnyjW9ju839mnMmp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4Jyok%2FbtsxtTUZ1Gc%2F5xZ6EtnyjW9ju839mnMmp0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;460&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.35.00.jpg&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;2128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.36.18.jpg&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;1592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tx9u4/btsxh6PmM4N/QMxBKKLNok8M5rXoLiHd7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tx9u4/btsxh6PmM4N/QMxBKKLNok8M5rXoLiHd7K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tx9u4/btsxh6PmM4N/QMxBKKLNok8M5rXoLiHd7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftx9u4%2Fbtsxh6PmM4N%2FQMxBKKLNok8M5rXoLiHd7K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;333&quot; data-filename=&quot;스크린샷 2023-10-08 오전 10.36.18.jpg&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;1592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구글 검색 여부 확인 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 검색창에 &lt;b&gt;site:블로그주소&lt;/b&gt;를 이용해 검색하면 색인이 정상적으로 등록됐는지 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-05 오전 6.16.14.jpg&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;2018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k0J0R/btsFt58vHJz/I2vRMl09e5dgVG6vf4eNx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k0J0R/btsFt58vHJz/I2vRMl09e5dgVG6vf4eNx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k0J0R/btsFt58vHJz/I2vRMl09e5dgVG6vf4eNx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk0J0R%2FbtsFt58vHJz%2FI2vRMl09e5dgVG6vf4eNx1%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;550&quot; height=&quot;566&quot; data-filename=&quot;스크린샷 2024-03-05 오전 6.16.14.jpg&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;2018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/12</guid>
      <comments>https://quve.tistory.com/12#entry12comment</comments>
      <pubDate>Sun, 8 Oct 2023 10:41:04 +0900</pubDate>
    </item>
    <item>
      <title>GUI Architecture 정리</title>
      <link>https://quve.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;상용 어플리케이션을 개발하다보면 유지보수가 용이한 코드를 찾게 되고 GUI Architecture에 많은 관심을 가지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 처음으로 접하게 되는 GUI Architecture는 MVC(Model-View-Controller) 패턴이다. 그 이후에 MVP(Model-View-Presenter), MVVM (Model-View-ViewModel) 등 다양한 패턴을 접하게 되고 머릿속이 뒤죽박죽이 된다. 모든 패턴이 비슷해보이고 무슨 얘기를 하는지 직관적으로 이해가 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로의 포스팅에서는 각각의 GUI Architecture에 대해 정리를 해보도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://martinfowler.com/eaaDev/uiArchs.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://martinfowler.com/eaaDev/uiArchs.html&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688279978562&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;GUI Architectures&quot; data-og-description=&quot;Describing the way architectures for UIs have evolved over the years, in particular the many and often misunderstood definitions for Model-View-Controller.&quot; data-og-host=&quot;martinfowler.com&quot; data-og-source-url=&quot;https://martinfowler.com/eaaDev/uiArchs.html&quot; data-og-url=&quot;https://martinfowler.com/eaaDev/uiArchs.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bR6SLn/hyTbbU95LX/itXPe89ymyHGzIYVpDftk0/img.png?width=144&amp;amp;height=144&amp;amp;face=0_0_144_144,https://scrap.kakaocdn.net/dn/b8VuhV/hyTa1kG87b/YfYKI5x6UZrJN14uo2DAPK/img.jpg?width=349&amp;amp;height=350&amp;amp;face=48_146_182_292&quot;&gt;&lt;a href=&quot;https://martinfowler.com/eaaDev/uiArchs.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://martinfowler.com/eaaDev/uiArchs.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bR6SLn/hyTbbU95LX/itXPe89ymyHGzIYVpDftk0/img.png?width=144&amp;amp;height=144&amp;amp;face=0_0_144_144,https://scrap.kakaocdn.net/dn/b8VuhV/hyTa1kG87b/YfYKI5x6UZrJN14uo2DAPK/img.jpg?width=349&amp;amp;height=350&amp;amp;face=48_146_182_292');&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;GUI Architectures&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describing the way architectures for UIs have evolved over the years, in particular the many and often misunderstood definitions for Model-View-Controller.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;martinfowler.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649571(v=pandp.10)&quot;&gt;https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649571(v=pandp.10)&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1688279994534&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;The Model-View-Presenter (MVP) Pattern&quot; data-og-description=&quot;Table of contents The Model-View-Presenter (MVP) Pattern Article 04/27/2010 In this article --&amp;gt; Context A Web page or Web Part in a SharePoint application contains controls that display application data. A user can modify the data and submit the changes. T&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649571(v=pandp.10)&quot; data-og-url=&quot;https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649571(v=pandp.10)&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AusYc/hyTa07aqNG/BNDGQHQSp8Y7eIhUFXS6i0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bZbPu6/hyTa9iIycC/tkPaTgeg21cRSAkFEjK1z1/img.png?width=584&amp;amp;height=210&amp;amp;face=0_0_584_210,https://scrap.kakaocdn.net/dn/rs6IO/hyTcLtLDVi/TOkCp5905kZQz5crVSrB31/img.png?width=278&amp;amp;height=304&amp;amp;face=0_0_278_304&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649571(v=pandp.10)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649571(v=pandp.10)&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AusYc/hyTa07aqNG/BNDGQHQSp8Y7eIhUFXS6i0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bZbPu6/hyTa9iIycC/tkPaTgeg21cRSAkFEjK1z1/img.png?width=584&amp;amp;height=210&amp;amp;face=0_0_584_210,https://scrap.kakaocdn.net/dn/rs6IO/hyTcLtLDVi/TOkCp5905kZQz5crVSrB31/img.png?width=278&amp;amp;height=304&amp;amp;face=0_0_278_304');&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;The Model-View-Presenter (MVP) Pattern&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Table of contents The Model-View-Presenter (MVP) Pattern Article 04/27/2010 In this article --&amp;gt; Context A Web page or Web Part in a SharePoint application contains controls that display application data. A user can modify the data and submit the changes. T&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.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;MVP 패턴이 처음으로 언급된 논문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.wildcrest.com/Potel/Portfolio/mvp.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.wildcrest.com/Potel/Portfolio/mvp.pdf&lt;/a&gt;&lt;/p&gt;</description>
      <category>Programming/Draft</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/11</guid>
      <comments>https://quve.tistory.com/11#entry11comment</comments>
      <pubDate>Sun, 2 Jul 2023 15:41:36 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Providing Android resources in Assets/Plugins/Android/res was removed 문제 해결 방법</title>
      <link>https://quve.tistory.com/10</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 원인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unity 2021.2 버전부터 안드로이드 빌드 시 Assets/Plugins/Android/res 디렉토리를 이용하여 리소스를 관리하는 방식이 제거 되었습니다. (&lt;a title=&quot;공식 문서 링크&quot; href=&quot;https://docs.unity3d.com/2021.2/Documentation/Manual/UpgradeGuide20212.html#:~:text=Unity%20no%20longer,the%20Gradle%20project.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 문서 링크&lt;/a&gt;)&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1683983200633&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;Unity - Manual:  Upgrading to Unity 2021.2&quot; data-og-description=&quot;Upgrading to Unity 2021.1 Upgrading to Unity 2021.2 Note: Follow the advice in this section in release order. For example, if you need to upgrade your project from 2018 to 2020, read the 2019 upgrade guides to see if there are any changes that you need to &quot; data-og-host=&quot;docs.unity3d.com&quot; data-og-source-url=&quot;https://docs.unity3d.com/2021.2/Documentation/Manual/UpgradeGuide20212.html#:~:text=Unity%20no%20longer,the%20Gradle%20project.&quot; data-og-url=&quot;https://docs.unity3d.com/2021.2/Documentation/Manual/UpgradeGuide20212.html#:~:text=Unity%20no%20longer,the%20Gradle%20project.&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5Ih88/hySBG13gjH/TcQQTMCYaU9H19nLX9qMg1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/2021.2/Documentation/Manual/UpgradeGuide20212.html#:~:text=Unity%20no%20longer,the%20Gradle%20project.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unity3d.com/2021.2/Documentation/Manual/UpgradeGuide20212.html#:~:text=Unity%20no%20longer,the%20Gradle%20project.&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5Ih88/hySBG13gjH/TcQQTMCYaU9H19nLX9qMg1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Unity - Manual: Upgrading to Unity 2021.2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Upgrading to Unity 2021.1 Upgrading to Unity 2021.2 Note: Follow the advice in this section in release order. For example, if you need to upgrade your project from 2018 to 2020, read the 2019 upgrade guides to see if there are any changes that you need to&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.unity3d.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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 발생 상황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets/Plugins/Android/res 디렉토리 내에 국가별로 values 디렉토리를 만들어서 앱 이름에 대해 localization을 했고 Assets/Plugins/Android/ assets 디렉토리 내에 게임의 설정을 관리하는 파일이 있는 상황입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 가장 빠르고 쉬운 방법은 Unity를 2020 버전으로 내리는 것입니다. 2021 버전의 기능이 필요한게 아니라면 2020 버전으로 내리는 것을 고려해보세요. 무식하다고 생각할 수 있겠지만 가장 빠르고 확실한 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Unity 2020 버전을 사용할 수 없다면 안드로이드 라이브러리 파일인 aar을 만드는 방식을 사용해야 합니다. 다음 단계를 통해 res 디렉토리와 assets 디렉토리 내의 파일들을 aar로 만들어서 Unity에 추가해주세요.&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;b&gt;  참고&lt;br /&gt;&lt;/b&gt;&amp;nbsp; res 디렉토리와 assets 디렉토리 중 하나만 있는 상황에서도 아래의 방법을 사용할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;res, assets 디렉토리의 파일을 aar 파일로 만드는 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 안드로이드 스튜디오를 다운로드 받아 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 새 프로젝트를 생성합니다. 라이브러리 파일이기 때문에 Activity가 필요하지 않습니다. No Activity로 생성해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-13 오후 10.25.17.jpg&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KmHIn/btsfg3VIjG5/6b18bPVqoV2JifYKKD0jK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KmHIn/btsfg3VIjG5/6b18bPVqoV2JifYKKD0jK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KmHIn/btsfg3VIjG5/6b18bPVqoV2JifYKKD0jK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKmHIn%2Fbtsfg3VIjG5%2F6b18bPVqoV2JifYKKD0jK0%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;2134&quot; height=&quot;1518&quot; data-filename=&quot;스크린샷 2023-05-13 오후 10.25.17.jpg&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;1518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 프로젝트 설정값을 입력합니다. 사이드 이펙트를 막기 위해 Minumum SDK 레벨은 Unity 프로젝트에서 지원하는 Minumum API Level과 일치 시키도록 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.11.17.jpg&quot; data-origin-width=&quot;2132&quot; data-origin-height=&quot;1516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIk5pq/btsfggHyUOU/1cqQP9kygwd0h6LadquPN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIk5pq/btsfggHyUOU/1cqQP9kygwd0h6LadquPN1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIk5pq/btsfggHyUOU/1cqQP9kygwd0h6LadquPN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIk5pq%2FbtsfggHyUOU%2F1cqQP9kygwd0h6LadquPN1%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;2132&quot; height=&quot;1516&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.11.17.jpg&quot; data-origin-width=&quot;2132&quot; data-origin-height=&quot;1516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 프로젝트를 생성하면 최초로 프로젝트를 구성하는 시간이 소요됩니다. 프로젝트 구성이 완료된 이후 'Gradle Scripts' 하위의 build.gradle (Module: app) 파일을 열어서 다음 내용들을 수정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.16.07.jpg&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckymiA/btsfcj6BYhq/gDpH9EO06hpVTpBrH6qLtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckymiA/btsfcj6BYhq/gDpH9EO06hpVTpBrH6qLtK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckymiA/btsfcj6BYhq/gDpH9EO06hpVTpBrH6qLtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckymiA%2Fbtsfcj6BYhq%2FgDpH9EO06hpVTpBrH6qLtK%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;2778&quot; height=&quot;646&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.16.07.jpg&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;plugins의 com.android.application을 com.android.library로 변경&lt;/li&gt;
&lt;li&gt;defaultConfig의 applicationId 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 수정이 완료되면 우측 상단의 'Sync Now'를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.19.20.jpg&quot; data-origin-width=&quot;2786&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm7hHu/btsfbiUoMlC/3ayoCSwP0Y4iJ5vFejd1z0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm7hHu/btsfbiUoMlC/3ayoCSwP0Y4iJ5vFejd1z0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm7hHu/btsfbiUoMlC/3ayoCSwP0Y4iJ5vFejd1z0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm7hHu%2FbtsfbiUoMlC%2F3ayoCSwP0Y4iJ5vFejd1z0%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;2786&quot; height=&quot;1000&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.19.20.jpg&quot; data-origin-width=&quot;2786&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 기존의 res 디렉토리 컨텐츠를 참고하는 부분을 삭제해야합니다. app 항목을 확장하여 manifests 디렉토리 하위의 AndroidManifest.xml 파일을 확인할 수 있습니다. 이 파일의 application 부분을 전부 삭제합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.30.23.jpg&quot; data-origin-width=&quot;2118&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8QuDu/btsfdauOiuX/R0kvxgH7if3NMUd6pt4Vxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8QuDu/btsfdauOiuX/R0kvxgH7if3NMUd6pt4Vxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8QuDu/btsfdauOiuX/R0kvxgH7if3NMUd6pt4Vxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8QuDu%2FbtsfdauOiuX%2FR0kvxgH7if3NMUd6pt4Vxk%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;2118&quot; height=&quot;1190&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.30.23.jpg&quot; data-origin-width=&quot;2118&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. assets 디렉토리도 추가를 해줍니다. Finder(탐색기)에서 직접 assets 디렉토리를 추가한 다음 Unity 프로젝트에 포함되어 있던 assets 디렉토리 내의 파일들을 복사합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.51.37.jpg&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sn7UM/btsfcNGr7Ob/qZkka718hoQtg6vGfxrFtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sn7UM/btsfcNGr7Ob/qZkka718hoQtg6vGfxrFtK/img.jpg&quot; data-alt=&quot;폴더를 직접 생성해주는게 편합니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sn7UM/btsfcNGr7Ob/qZkka718hoQtg6vGfxrFtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsn7UM%2FbtsfcNGr7Ob%2FqZkka718hoQtg6vGfxrFtK%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;1360&quot; height=&quot;448&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.51.37.jpg&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;폴더를 직접 생성해주는게 편합니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.52.32.jpg&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM3rE8/btsfCtsjBFQ/GTfLeJXHF7St7I946KVCQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM3rE8/btsfCtsjBFQ/GTfLeJXHF7St7I946KVCQk/img.jpg&quot; data-alt=&quot;assets 디렉토리 내의 파일을 복사합니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM3rE8/btsfCtsjBFQ/GTfLeJXHF7St7I946KVCQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM3rE8%2FbtsfCtsjBFQ%2FGTfLeJXHF7St7I946KVCQk%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;400&quot; height=&quot;219&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.52.32.jpg&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;assets 디렉토리 내의 파일을 복사합니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. aar 파일을 생성할 기본 설정이 끝났습니다. 이제 기존의 Unity 프로젝트에 있었던 res 디렉토리를 복사해줍니다. app 항목을 확장하면 res 디렉토리가 있는 것을 확인할 수 있습니다. Android Studio의 res 디렉토리 내의 모든 파일들을 Unity 프로젝트의 res 디렉토리로 교체해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.21.45.jpg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bofSBL/btsfdX9MYsT/6qksc4wX6440VUwGrFTiJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bofSBL/btsfdX9MYsT/6qksc4wX6440VUwGrFTiJK/img.jpg&quot; data-alt=&quot;파일들 교체 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bofSBL/btsfdX9MYsT/6qksc4wX6440VUwGrFTiJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbofSBL%2FbtsfdX9MYsT%2F6qksc4wX6440VUwGrFTiJK%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;400&quot; height=&quot;471&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.21.45.jpg&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일들 교체 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.25.23.jpg&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v4Bd4/btsfCtlxqRy/K4jGmjmxIcgrBZkWxjyKlk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v4Bd4/btsfCtlxqRy/K4jGmjmxIcgrBZkWxjyKlk/img.jpg&quot; data-alt=&quot;파일들 교체 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v4Bd4/btsfCtlxqRy/K4jGmjmxIcgrBZkWxjyKlk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv4Bd4%2FbtsfCtlxqRy%2FK4jGmjmxIcgrBZkWxjyKlk%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;400&quot; height=&quot;454&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.25.23.jpg&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;954&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;9. 이제 aar 파일을 빌드해줍니다. 다음과 같은 순서를 통해 프로젝트를 aar 파일로 빌드하는 task를 실행해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.29.14.jpg&quot; data-origin-width=&quot;2796&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFYhN5/btsfjJipGbw/BokYNVp8FVYi6IGQi3ByVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFYhN5/btsfjJipGbw/BokYNVp8FVYi6IGQi3ByVK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFYhN5/btsfjJipGbw/BokYNVp8FVYi6IGQi3ByVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFYhN5%2FbtsfjJipGbw%2FBokYNVp8FVYi6IGQi3ByVK%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;2796&quot; height=&quot;1050&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.29.14.jpg&quot; data-origin-width=&quot;2796&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; data-ke-style=&quot;floatLeft&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;파일 교체 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 이제 aar 빌드가 완료 됐습니다. '${AndroidStudio프로젝트경로}/app/build/outputs/aar' 경로에 빌드한 aar 파일이 생성되어 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.37.12.jpg&quot; data-origin-width=&quot;3402&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vwbdF/btsffvdSFQf/JCHK61bYBBwYlNWZJABUAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vwbdF/btsffvdSFQf/JCHK61bYBBwYlNWZJABUAK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vwbdF/btsffvdSFQf/JCHK61bYBBwYlNWZJABUAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvwbdF%2FbtsffvdSFQf%2FJCHK61bYBBwYlNWZJABUAK%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;3402&quot; height=&quot;1334&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.37.12.jpg&quot; data-origin-width=&quot;3402&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 완성이 된 aar 파일의 이름을 적당하게 변경하고 Unity 프로젝트에 복사합니다. 복사가 완료된 이후에는 기존의 res 디렉토리와 assets 디렉토리를 삭제해줍니다. &lt;a href=&quot;https://docs.unity3d.com/2021.2/Documentation/Manual/AndroidAARPlugins.html#:~:text=To%20add%20an%20AAR%20plug%2Din%20to%20your%20Project%2C%20copy%20the%20.aar%20file%20anywhere%20within%20the%20Unity%20project%2C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Unity 공식 문서에 따르면 aar 파일은 프로젝트 아무곳에나 배치를 해도 상관이 없다&lt;/a&gt;고 하지만 깔끔한 정리를 위해 관습적으로 사용하는 Plugins/Android 디렉토리의 하위에 배치합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.40.52.jpg&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6aXfc/btsfclJ8IiS/KjhGuLoOBUUyFJyCfWM2v1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6aXfc/btsfclJ8IiS/KjhGuLoOBUUyFJyCfWM2v1/img.jpg&quot; data-alt=&quot;aar 파일의 이름을 변경한 뒤 프로젝트에 복사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6aXfc/btsfclJ8IiS/KjhGuLoOBUUyFJyCfWM2v1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6aXfc%2FbtsfclJ8IiS%2FKjhGuLoOBUUyFJyCfWM2v1%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;1524&quot; height=&quot;1152&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.40.52.jpg&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;aar 파일의 이름을 변경한 뒤 프로젝트에 복사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.39.38.jpg&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w4xsS/btsfjJvVu3Y/t0cG0myRx7ctqb1PkpppsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w4xsS/btsfjJvVu3Y/t0cG0myRx7ctqb1PkpppsK/img.jpg&quot; data-alt=&quot;기존의 res와 assets 디렉토리 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w4xsS/btsfjJvVu3Y/t0cG0myRx7ctqb1PkpppsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw4xsS%2FbtsfjJvVu3Y%2Ft0cG0myRx7ctqb1PkpppsK%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;1524&quot; height=&quot;1150&quot; data-filename=&quot;스크린샷 2023-05-14 오전 9.39.38.jpg&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존의 res와 assets 디렉토리 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 모든 과정이 끝났습니다. 이제 정상적으로 프로젝트를 빌드할 수 있습니다.&lt;/p&gt;</description>
      <category>Unity/Trouble Shooting</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/10</guid>
      <comments>https://quve.tistory.com/10#entry10comment</comments>
      <pubDate>Sun, 14 May 2023 11:04:43 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 인게임 튜토리얼을 쉽게 개발하는 EasyTutorial 에셋 무료 배포</title>
      <link>https://quve.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 모바일 게임들을 개발하고 출시하면서 느꼈던 가장 개발하기 귀찮았던 요소는 바로 '튜토리얼'이었습니다. 유저들의 이탈을 막는 중요한 요소이긴 게임 자체의 핵심 요소가 아니면서 자잘하게 개발할 것들이 많기 때문에 아예 개발을 하지 않거나 굉장히 단순화 된 튜토리얼을 만들어서 배포를 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 이런 귀찮음 때문에 튜토리얼이라는 중요한 요소에 힘을 빼는 일을 방지하고자 튜토리얼 플로우를 쉽게 만들 수 있는 에셋인 Easy Tutorial을 개발했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Excellcube/EasyTutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Excellcube/EasyTutorial&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666974510817&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 - Excellcube/EasyTutorial&quot; data-og-description=&quot;Contribute to Excellcube/EasyTutorial development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Excellcube/EasyTutorial&quot; data-og-url=&quot;https://github.com/Excellcube/EasyTutorial&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kUu0r/hyQmwBd6Pq/1HKEJTvn4o73NMWAmAQkaK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Excellcube/EasyTutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Excellcube/EasyTutorial&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kUu0r/hyQmwBd6Pq/1HKEJTvn4o73NMWAmAQkaK/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 - Excellcube/EasyTutorial&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to Excellcube/EasyTutorial 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;Easy Tutorial을 이용한 첫 번째 게임은 가장 최근에 출시한 '고양이와 마법 상점'입니다. 이 에셋을 이용하여 아래와 같이 간단한 대화나 사용자 액션을 유도할 수 있는 튜토리얼을 쉽게 만들 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;198575165-c4feab4f-b1ca-43a2-b2e2-5a45fd93484e.gif&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1003&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Mre1/btrPQhkpaTB/Ht42GdPrIp7SSMh2n0mq20/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Mre1/btrPQhkpaTB/Ht42GdPrIp7SSMh2n0mq20/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Mre1/btrPQhkpaTB/Ht42GdPrIp7SSMh2n0mq20/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/5Mre1/btrPQhkpaTB/Ht42GdPrIp7SSMh2n0mq20/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;500&quot; height=&quot;1003&quot; data-filename=&quot;198575165-c4feab4f-b1ca-43a2-b2e2-5a45fd93484e.gif&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1003&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EasyTutorial 에셋을 최대한 코드리스 방식으로 제작해서 코드 수정 없이 쉽게 튜토리얼을 만들게 하고 싶었는데, UI와 게임의 로직에 강하게 물려있는 Tutorial 기능의 특성 상 완벽한 코드리스 방식은 구현이 어려웠습니다. 때문에 약간의 코드를 사용하는 튜토리얼 에셋으로 개발하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github의 README를 보시면 설명서가 꽤 길어서 사용이 어렵다고 느끼실 수도 있습니다. 하지만 최대한 직관적으로 사용할 수 있도록 개발했기 때문에&amp;nbsp; 한번 익숙해지면 굉장히 쉽게 튜토리얼을 만들 수 있도록 개발했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용이 어려우신 분들은 덧글을 달아주시면 최대한 빠르게 답변을 드리며 아무리 늦어도 24시간 내에는 답변을 드릴 수 있도록 노력하겠습니다. 버그 발견 시 본 포스팅의 덧글 혹은 이슈를 생성해주시면 더 좋은 에셋으로 개발하는데 큰 도움이 될 것 같습니다. 추가적인 기능 제안도 언제든지 환영입니다 &lt;/p&gt;</description>
      <category>Unity</category>
      <category>Unity #Asset</category>
      <category>에셋</category>
      <category>인디게임</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/9</guid>
      <comments>https://quve.tistory.com/9#entry9comment</comments>
      <pubDate>Sat, 29 Oct 2022 01:36:08 +0900</pubDate>
    </item>
    <item>
      <title>[Github] Support for password authentication was removed on August 13, 2021 오류 발생 해결 방법</title>
      <link>https://quve.tistory.com/8</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github repository에 접근을 할 때 올바른 아이디와 비밀번호를 입력했음에도 에러가 발생하며 다음과 같은 메시지를 출력&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Pushing to https://github.com/XXX/XXX.git&lt;br /&gt;&lt;br /&gt;remote: Support for password authentication was removed on August 13, 2021.&lt;br /&gt;remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.&lt;br /&gt;&lt;br /&gt;fatal: Authentication failed for 'https://github.com/XXX/XXX.git/'&lt;br /&gt;&lt;br /&gt;In a case you entered incorrect password, please&lt;br /&gt;update it in Keychain Access application.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 원인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github의 인증 방식이 변경 되었기 때문에 발생하는 문제. 에러 로그에 설명된 바와 같이 2021년 8월 13일을 기준으로 아이디, 패스워드 방식의 인증 방식이 폐기 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 repository에 push나 pull을 할 때 다음과 같이 계정 정보를 입력했다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID : 사용자의 Github Username&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PW : 사용자의 Github 패스워드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 이후에는 다음과 같이 로그인을 하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID : 사용자의 Github Username&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PW : &lt;span style=&quot;color: #ee2323;&quot;&gt;Github Username 계정에서 발급받은 Personal access token 값&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;그렇다면 이 Personal access token은 어떻게 발급 받을 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 절차를 통해 쉽게 발급 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Personal access token 발급 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 계정으로 로그인한 뒤 Settings 페이지로 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.13.15.png&quot; data-origin-width=&quot;2832&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HiBtU/btrPPiq6yPD/0wb8rP9UEpumuaeo0S6rIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HiBtU/btrPPiq6yPD/0wb8rP9UEpumuaeo0S6rIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HiBtU/btrPPiq6yPD/0wb8rP9UEpumuaeo0S6rIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHiBtU%2FbtrPPiq6yPD%2F0wb8rP9UEpumuaeo0S6rIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2832&quot; height=&quot;1120&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.13.15.png&quot; data-origin-width=&quot;2832&quot; data-origin-height=&quot;1120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 왼쪽 메뉴 항목들 중, 최하단의 &lt;b&gt;Developer settings&lt;/b&gt;를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.13.44.png&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;2120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNoxI1/btrPPwQdojF/PrDIKnepHyo9wei2ZhZ9hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNoxI1/btrPPwQdojF/PrDIKnepHyo9wei2ZhZ9hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNoxI1/btrPPwQdojF/PrDIKnepHyo9wei2ZhZ9hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNoxI1%2FbtrPPwQdojF%2FPrDIKnepHyo9wei2ZhZ9hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2632&quot; height=&quot;2120&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.13.44.png&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;2120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 왼쪽 메뉴 항목 중&lt;b&gt; Personal access tokens &amp;gt; Tokens (classic)&lt;/b&gt;을 클릭한 뒤 &lt;b&gt;Generate new token (classic)&lt;/b&gt;을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.15.17.png&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbf3EB/btrPRBCdZbz/X2czy8yr9SrKyoYXwqeEOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbf3EB/btrPRBCdZbz/X2czy8yr9SrKyoYXwqeEOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbf3EB/btrPRBCdZbz/X2czy8yr9SrKyoYXwqeEOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbf3EB%2FbtrPRBCdZbz%2FX2czy8yr9SrKyoYXwqeEOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2860&quot; height=&quot;664&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.15.17.png&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 뭔가 선택을 할 것들이 잔뜩 있는 페이지가 보이게 된다. 적당한 이름을 입력한 뒤 기호에 맞게 체크한다. 만일 혼자 관리하는 계정일 경우&amp;nbsp; &lt;b&gt;Expiration&lt;/b&gt;을 No expiration으로 설정하고&amp;nbsp;&lt;b&gt;Select scopes&lt;/b&gt;의 모든 것들을 체크해도 문제 없다. 그러나 여러 사람들이 접근하는 계정일 경우 상황에 맞게 값들을 설정해주는게 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.16.28.png&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;2498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vjrRL/btrPQMxodmk/EgcSHukAiwyuuS2xZ6hir0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vjrRL/btrPQMxodmk/EgcSHukAiwyuuS2xZ6hir0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vjrRL/btrPQMxodmk/EgcSHukAiwyuuS2xZ6hir0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvjrRL%2FbtrPQMxodmk%2FEgcSHukAiwyuuS2xZ6hir0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1664&quot; height=&quot;2498&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.16.28.png&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;2498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 모든 설정이 끝나면 아래와 같은 창이 출력된다. 이 때 출력되는 값은 지금 한 번만 볼 수 있으니 반드시 다른 곳에 메모해 놓도록 한다. 그렇다고 겁먹을 필요는 없다. 이 토큰을 잃어버린다고 해서 본 계정의 모든 repository에 접근하지 못하게 되는 그런 불상사는 일어나지 않는다. 만일 이 토큰을 잃어버렸다면 조금 귀찮겠지만 새로 발급해서 다시 접근하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.16.43.png&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtPN7a/btrPQeOM738/qWeLMK102KENqjw0hYICmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtPN7a/btrPQeOM738/qWeLMK102KENqjw0hYICmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtPN7a/btrPQeOM738/qWeLMK102KENqjw0hYICmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtPN7a%2FbtrPQeOM738%2FqWeLMK102KENqjw0hYICmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1648&quot; height=&quot;636&quot; data-filename=&quot;스크린샷 2022-10-28 오후 11.16.43.png&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 이렇게 생성한 토큰값을 계정의 비밀번호 대신에 입력하여 push, pull 등을 수행할 경우 정상적으로 진행 되는 것을 볼 수 있다.&lt;/p&gt;</description>
      <category>Programming/Trouble Shooting</category>
      <category>Authentication</category>
      <category>GIT</category>
      <category>Github</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/8</guid>
      <comments>https://quve.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 28 Oct 2022 23:33:28 +0900</pubDate>
    </item>
    <item>
      <title>쉽게 할 수 있는 것들을 너무 어렵게 돌아가고 있는걸까</title>
      <link>https://quve.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최소 노력의 법칙이라는 책을 읽고 있다. 아직 80페이지만 읽었지만 꽤 곱씹어볼 내용이 많은 것 같다. 이 책의 요지는 &lt;b&gt;'중요한 일을 괜히 어렵게 접근하지 말고 쉽게 해결하자'&lt;/b&gt; 라는 것이다. 자기개발 서적이 그렇듯이 너무나도 당연한 얘기를 하고 있지만 그 당연한걸 어떻게 하면 달성할 수 있을지 잘 정리해서 보여주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;달성하기 어려운 일을 쉽게 해결하는 방법으로는 두 가지 방법을 제시했다. 하나는 &lt;b&gt;'결과를 이루기 위한 가장 간단한 방법을 시도하기'&lt;/b&gt;이고 다른 하나는 &lt;b&gt;'어려운 일을 즐거운 일과 섞어서 시도하기'&lt;/b&gt;이다. 사실 두 번째 방법에 대한 몇가지 예시가 적혀있긴 했는데 약간 작위적이라는 느낌이 들기도 하고 별로 와닿지가 않아서 한번 읽고 넘겼다. 생각보다 첫 번째 방법을 보면서 감명을 많이 받았다. 같은 결과라면 당연히 가장 간단한 방법을 시도하는게 맞지만, 내가 지금 하고 있는게 진짜로 가장 간단한 방법이 맞나? 하는 생각을 계속 곱씹으며 내용을 읽어 나갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안의 개발 경험과 다양한 모바일 게임을 출시한 경험을 바탕으로 강의를 런칭할 준비를 하고 있다. 일반적인 게임 개발 강의하고는 조금 다른 느낌으로 제작할 예정인데, 그러다보니 단순히 스크린샷과 예제코드 몇개를 작성하면서 글을 작성하는 것보다 더 많은 작업들이 필요한 상태이다. 그런데 이렇게 진행을 하다보니 생각보다 너무 많은 시간이 걸리고 있다. 본래 계획이면 여름쯤에 결과물이 나왔어야 했는데 아직 제대로 된 시작조차 못하고 있다. 내가 하려고 하는게 기존의 모바일 게임 개발 강의와 조금 다르다보니 그러려니 하고 받아들이고 작업을 계속 하고 있었는데 &lt;b&gt;'이게 진짜 내가 원하는 최종 목표에 필수적인 요소인가?'라고 자문을 해보면 그렇지 않은것 같다는 느낌이 든다.&lt;/b&gt; 장인정신을 발휘하며 열심히 개발을 하고 있는데 너무 불필요하게 힘든 방식으로 진행을 하고 있다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고찰의 시간이 필요하다. 내가 원하는 최종 그림은 무엇일까? 그것을 위해 지금 하고 있는 일을 계속 진행하는 것이 맞을까? 작더라도 더 쉽고 빠르게 결과를 볼 수 있는 방법은 없을까? 어쩌면 이걸 더 고민해보는게 지금 당장 한 두 줄 개발을 더 하는 것보다 중요할 수도 있을 것 같다.&lt;/p&gt;</description>
      <category>칼럼</category>
      <category>최소노력의법칙</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/7</guid>
      <comments>https://quve.tistory.com/7#entry7comment</comments>
      <pubDate>Mon, 10 Oct 2022 23:27:41 +0900</pubDate>
    </item>
    <item>
      <title>집중력이 떨어지는 요즘</title>
      <link>https://quve.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;게임을 출시하고 난 뒤에 집중력이 조금 떨어지는 느낌이 들었다. 게임 출시라는 목표를 달성해서 그런지 개발을 하다보면 나도 모르게 유튜브나 유머사이트에 접속해서 시간을 허비하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 자기개발서를 좋아서 종종 읽곤 하는데, 최근 들어서 집중과 관련된 자기개발서의 내용이 떠오르곤 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 일에 집중을 하다가 잠깐 딴짓을 하고 다시 집중을 하려면 약 20분 정도의 시간이 걸린다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세하게 기억을 하기 위해서는 책을 다시 읽어야겠지만, 멀티태스킹의 단점을 얘기하면서 위와 같이 언급했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 일을 하다가 1분만 폰으로 딴짓을 해도 다시 방금 전의 몰입도가 되기 위해서는 20분이라는 시간이 필요하다는 것이다. 딴짓은 그만큼 비효율적이다.&lt;/p&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;딴짓으로 인해 업무 퍼포먼스가 떨어질때 큰 도움을 받았던 도구들이 있다. '디테일한 To do list', '뽀모도로 타이머', '시계부', '공부 타이머' 이렇게 네 가지 요소를 활용할 때 집중도가 크게 올라갔었다. &lt;b&gt;개인적으로는 디테일한 To do list를 작성하는게 굉장히 중요하다고 생각한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 몰입을 하다가 집중력이 흐려지는 경우는 막막한 일을 하고 있을때가 많았다. 뭘 해야하는지 명확하지 않을때 이것저것 고민을 하다가 결국 삼천포로 빠지게 되더라. 그런데 아무리 어려운 업무도 굉장히 세밀하게 나눠서 To do list로 정리를 하면 쉽게 정복이 가능했다. 마치 알고리즘에서 분할정복을 하는 것 같은 느낌이 든다.&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;게임 개발을 한다는 핑계로 책을 안 읽은지 조금 된것 같다. 다시 딥워크, 몰입, 초집중, 마지막 몰입을 빠르게 읽어봐야겠다. 내 집중력이 흐트려질때 많은 도움을 받았던 책들이다. 책을 읽고 한 페이지에 요약을 해서 두고두고 읽어 봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;작업 시작 시 먼저 해야할 것들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 화이트 노이즈를 이용해 주변 소음 억제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 해야할 일을 작은 단위로 나눠서 To do list 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 50-10 뽀모도로 타이머 시작 (Focus to do 적극 활용)&lt;/p&gt;</description>
      <category>칼럼</category>
      <category>집중력</category>
      <author>QUVE.</author>
      <guid isPermaLink="true">https://quve.tistory.com/6</guid>
      <comments>https://quve.tistory.com/6#entry6comment</comments>
      <pubDate>Sat, 8 Oct 2022 11:20:25 +0900</pubDate>
    </item>
  </channel>
</rss>