<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 이야기</title>
    <link>https://faith-developer.tistory.com/</link>
    <description>KYU development 스토리에 오신걸 환영합니다.
개발도 소통도 빛나게 함께 성장하는 규샤인의 기록 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 9 Jul 2026 12:42:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>규샤인</managingEditor>
    <image>
      <title>개발 이야기</title>
      <url>https://tistory1.daumcdn.net/tistory/2855847/attach/505e634e89ea4fec9157231b88fbc19f</url>
      <link>https://faith-developer.tistory.com</link>
    </image>
    <item>
      <title>AI 와 함께 앱 개발하기</title>
      <link>https://faith-developer.tistory.com/252</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxB503/btsP33GqdYv/rUroNThoJHkb1zLrEqwd4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxB503/btsP33GqdYv/rUroNThoJHkb1zLrEqwd4K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxB503/btsP33GqdYv/rUroNThoJHkb1zLrEqwd4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxB503%2FbtsP33GqdYv%2FrUroNThoJHkb1zLrEqwd4K%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-origin-width=&quot;500&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;최근&amp;nbsp;재미있는&amp;nbsp;실험(?)&amp;nbsp;을&amp;nbsp;하였는데요.&amp;nbsp;&lt;br&gt;&lt;br&gt;이번에&amp;nbsp;처음으로&amp;nbsp;Flutter를&amp;nbsp;사용해&amp;nbsp;하나의&amp;nbsp;앱을&amp;nbsp;개발하게&amp;nbsp;되었고,&amp;nbsp;이&amp;nbsp;과정을&amp;nbsp;공유&amp;nbsp;드리려고&amp;nbsp;합니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;글을&amp;nbsp;시작하기&amp;nbsp;앞써&amp;nbsp;필자는&amp;nbsp;안드로이드&amp;nbsp;앱&amp;nbsp;개발을&amp;nbsp;10년&amp;nbsp;이상,&amp;nbsp;iOS&amp;nbsp;앱&amp;nbsp;개발을&amp;nbsp;약&amp;nbsp;3년이상&amp;nbsp;개발&amp;nbsp;경력을&amp;nbsp;갖고&amp;nbsp;있습니다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xMXLe/btsP3zFjxaG/jkV1rYDFZKilan9cNWoQIK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xMXLe/btsP3zFjxaG/jkV1rYDFZKilan9cNWoQIK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xMXLe/btsP3zFjxaG/jkV1rYDFZKilan9cNWoQIK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxMXLe%2FbtsP3zFjxaG%2FjkV1rYDFZKilan9cNWoQIK%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;480&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br&gt;들어가기 앞써&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Flutter로 개발한 프로젝트는 Dobilbe 이라는 앱입니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;DoBible은&amp;nbsp;바쁜&amp;nbsp;일상&amp;nbsp;속에서도&amp;nbsp;단&amp;nbsp;한&amp;nbsp;줄의&amp;nbsp;말씀으로&amp;nbsp;마음의&amp;nbsp;중심을&amp;nbsp;잡고,&amp;nbsp;하루를&amp;nbsp;새롭게&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;앱입니다.&amp;nbsp;&lt;br&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;&lt;br&gt;이번 프로젝트의 가장 큰 특징은 공식 문서나 강의 없이, 오로지 AI(ChatGPT)의 도움만으로 앱을 완성했다는 점입니다.&lt;br&gt;&lt;br&gt;Flutter&amp;nbsp;는&amp;nbsp;하나의&amp;nbsp;언어로&amp;nbsp;여러&amp;nbsp;플랫폼을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;장점이&amp;nbsp;있습니다.&amp;nbsp;예를들어&amp;nbsp;코드&amp;nbsp;1개로&amp;nbsp;안드로이드,&amp;nbsp;iOS&amp;nbsp;앱을&amp;nbsp;출시&amp;nbsp;할&amp;nbsp;&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그러다&amp;nbsp;보니&amp;nbsp;네이티브(Android,&amp;nbsp;iOS)의&amp;nbsp;UI&amp;nbsp;구성&amp;nbsp;방식이나&amp;nbsp;상태&amp;nbsp;관리,&amp;nbsp;네비게이션&amp;nbsp;등&amp;nbsp;기존&amp;nbsp;네이티브&amp;nbsp;개발과는&amp;nbsp;다른&amp;nbsp;철학을&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;프레임워크&amp;nbsp;입니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;이번&amp;nbsp;프로젝트의&amp;nbsp;시작은&amp;nbsp;단순한&amp;nbsp;호기심에서&amp;nbsp;시작하였는데요.&amp;nbsp;평소라면&amp;nbsp;문서나&amp;nbsp;튜토리얼부터&amp;nbsp;살펴봤겠지만,&amp;nbsp;이번에는&amp;nbsp;AI의&amp;nbsp;응답만으로&amp;nbsp;어디까지&amp;nbsp;개발이&amp;nbsp;가능할까?&amp;nbsp;라는&amp;nbsp;호기심에서&amp;nbsp;실험을&amp;nbsp;시작했습니다.&lt;br&gt;&lt;br&gt;참고로&amp;nbsp;공부는&amp;nbsp;하지&amp;nbsp;않았습니다.&amp;nbsp;대신&amp;nbsp;AI&amp;nbsp;에게&amp;nbsp;질문했습니다.&lt;br&gt;Flutter의&amp;nbsp;구조는&amp;nbsp;물론,&amp;nbsp;세부&amp;nbsp;위젯&amp;nbsp;활용&amp;nbsp;방법조차&amp;nbsp;모르던&amp;nbsp;상태였지만,&amp;nbsp;필요한&amp;nbsp;것이&amp;nbsp;생기면&amp;nbsp;그때그때&amp;nbsp;질문하며&amp;nbsp;구현하는&amp;nbsp;방식으로&amp;nbsp;진행했습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br&gt;어떻게 질문 하였는가?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;AI&amp;nbsp;로&amp;nbsp;개발을&amp;nbsp;할&amp;nbsp;때에&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;어떤&amp;nbsp;프롬프트를&amp;nbsp;작성하는가?&amp;nbsp;라고&amp;nbsp;생각됩니다.&lt;br&gt;&lt;br&gt;프롬프트는&amp;nbsp;AI에게&amp;nbsp;원하는&amp;nbsp;결과를&amp;nbsp;얻기&amp;nbsp;위해&amp;nbsp;입력하는&amp;nbsp;텍스트&amp;nbsp;지시문입니다.&lt;br&gt;&lt;br&gt;AI&amp;nbsp;의&amp;nbsp;프롬프트는&amp;nbsp;웹&amp;nbsp;브라우저의&amp;nbsp;검색과&amp;nbsp;다르게&amp;nbsp;문장으로&amp;nbsp;프롬프트를&amp;nbsp;작성할&amp;nbsp;수록&amp;nbsp;좋은&amp;nbsp;피드백을&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그래서&amp;nbsp;저의&amp;nbsp;첫&amp;nbsp;프롬프트는&amp;nbsp;AI&amp;nbsp;에게&amp;nbsp;‘개발하고자&amp;nbsp;하는&amp;nbsp;앱의&amp;nbsp;배경과’과&amp;nbsp;‘앱&amp;nbsp;화면&amp;nbsp;구성&amp;nbsp;방법’&amp;nbsp;에&amp;nbsp;대해서&amp;nbsp;질문을&amp;nbsp;하였습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VNHRx/btsP4l7PUL9/ZRiLrNkkvZPDzgJkB7cTsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VNHRx/btsP4l7PUL9/ZRiLrNkkvZPDzgJkB7cTsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VNHRx/btsP4l7PUL9/ZRiLrNkkvZPDzgJkB7cTsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVNHRx%2FbtsP4l7PUL9%2FZRiLrNkkvZPDzgJkB7cTsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;818&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;생각보다 AI 의 답변은 구체적이었습니다.&lt;br&gt;&lt;br&gt;메인화면,&amp;nbsp;말씀&amp;nbsp;뽑기화면,&amp;nbsp;설정&amp;nbsp;화면까지&amp;nbsp;전체적인&amp;nbsp;앱의&amp;nbsp;구성에&amp;nbsp;대한&amp;nbsp;정의를&amp;nbsp;내려주었고,&amp;nbsp;화면&amp;nbsp;구성&amp;nbsp;방향을&amp;nbsp;제시&amp;nbsp;해주었습니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;무엇보다&amp;nbsp;구성&amp;nbsp;예시를&amp;nbsp;제안하면서&amp;nbsp;각&amp;nbsp;구성요소의&amp;nbsp;역할이&amp;nbsp;무엇인지&amp;nbsp;자세히&amp;nbsp;알려주었습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQklbU/btsP28VxT57/1oF1xs8IinMPSwJGSIw4n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQklbU/btsP28VxT57/1oF1xs8IinMPSwJGSIw4n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQklbU/btsP28VxT57/1oF1xs8IinMPSwJGSIw4n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQklbU%2FbtsP28VxT57%2F1oF1xs8IinMPSwJGSIw4n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;858&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;페이지&amp;nbsp;기획의&amp;nbsp;큰&amp;nbsp;그림이&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;완성되어,&amp;nbsp;이제&amp;nbsp;본격적으로&amp;nbsp;개발을&amp;nbsp;시작했습니다.&lt;br&gt;&lt;br&gt;스플래시&amp;nbsp;화면을&amp;nbsp;구성하고,&amp;nbsp;'오늘의&amp;nbsp;말씀'을&amp;nbsp;보여주었는지&amp;nbsp;여부에&amp;nbsp;따라&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;엔드포인트&amp;nbsp;화면으로&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;로직을&amp;nbsp;만들&amp;nbsp;계획을&amp;nbsp;갖고&amp;nbsp;프롬프트에&amp;nbsp;입력하였습니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dp4d0o/btsP5GiRLfu/RPR1s11iT7rJN5YQEeIodk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dp4d0o/btsP5GiRLfu/RPR1s11iT7rJN5YQEeIodk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dp4d0o/btsP5GiRLfu/RPR1s11iT7rJN5YQEeIodk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdp4d0o%2FbtsP5GiRLfu%2FRPR1s11iT7rJN5YQEeIodk%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;581&quot; height=&quot;201&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8FKwe/btsP4Uomd7p/3zXHPqLGkzkUn1it24Tkh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8FKwe/btsP4Uomd7p/3zXHPqLGkzkUn1it24Tkh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8FKwe/btsP4Uomd7p/3zXHPqLGkzkUn1it24Tkh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8FKwe%2FbtsP4Uomd7p%2F3zXHPqLGkzkUn1it24Tkh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1620&quot; height=&quot;986&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;AI의&amp;nbsp;피드백을&amp;nbsp;보면서&amp;nbsp;놀란것은&amp;nbsp;구현&amp;nbsp;방식에&amp;nbsp;대한&amp;nbsp;설명과&amp;nbsp;그와&amp;nbsp;맞는&amp;nbsp;예제&amp;nbsp;코드를&amp;nbsp;제공한다는&amp;nbsp;것입니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;제공한&amp;nbsp;예제&amp;nbsp;코드에&amp;nbsp;대한&amp;nbsp;설명도&amp;nbsp;함께&amp;nbsp;제공하여,&amp;nbsp;코드에&amp;nbsp;대한&amp;nbsp;이해하는데&amp;nbsp;어려움이&amp;nbsp;없었습니다.&amp;nbsp;그러다보니&amp;nbsp;제공한&amp;nbsp;코드를&amp;nbsp;그대로&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;아닌&amp;nbsp;제공된&amp;nbsp;코드를&amp;nbsp;바탕으로&amp;nbsp;재구성하여&amp;nbsp;개발하였습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DnPG4/btsP2ZR2sEs/WxJySwXXZzGJqb5sGaIeak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DnPG4/btsP2ZR2sEs/WxJySwXXZzGJqb5sGaIeak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DnPG4/btsP2ZR2sEs/WxJySwXXZzGJqb5sGaIeak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDnPG4%2FbtsP2ZR2sEs%2FWxJySwXXZzGJqb5sGaIeak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1586&quot; height=&quot;784&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br&gt;&lt;br&gt;JSON 데이터 구성&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;단순히 프롬프트를 입력하는 것만으로 기획과 개발이 가능하다는 점을 확인했고, 데이터 구성도 프롬프트를 통해 시도해보았습니다.&lt;br&gt;&lt;br&gt;데이터&amp;nbsp;구성&amp;nbsp;JSON&amp;nbsp;으로&amp;nbsp;데이터를&amp;nbsp;구성하고&amp;nbsp;이&amp;nbsp;JSON을&amp;nbsp;어떻게&amp;nbsp;파싱해야하는&amp;nbsp;것에&amp;nbsp;대해서도&amp;nbsp;AI&amp;nbsp;가&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;실험을&amp;nbsp;하였습니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;먼저는&amp;nbsp;필요한&amp;nbsp;JSON&amp;nbsp;을&amp;nbsp;생성해달라고&amp;nbsp;하였습니다.&amp;nbsp;예를&amp;nbsp;들어서&amp;nbsp;‘사람들에게&amp;nbsp;힘이&amp;nbsp;되는&amp;nbsp;문구&amp;nbsp;100개를&amp;nbsp;만들어줘’&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;JSON&amp;nbsp;을&amp;nbsp;AI&amp;nbsp;에게&amp;nbsp;요청하면&amp;nbsp;100개의&amp;nbsp;문구로&amp;nbsp;구성된&amp;nbsp;JSON을&amp;nbsp;제공해줍니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;여기서&amp;nbsp;더&amp;nbsp;나아가&amp;nbsp;JSON&amp;nbsp;구성도&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;reference,&amp;nbsp;referenceFullName,&amp;nbsp;Topics&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;필드를&amp;nbsp;추가해서&amp;nbsp;변경해달라는&amp;nbsp;프롬프트를&amp;nbsp;작성하였고,&amp;nbsp;AI는&amp;nbsp;의도에&amp;nbsp;맞게&amp;nbsp;JSON을&amp;nbsp;재구성하여&amp;nbsp;제공하였습니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dY0AaZ/btsP4x1iQid/50k03aJjNZOXpOY5nh5491/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dY0AaZ/btsP4x1iQid/50k03aJjNZOXpOY5nh5491/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dY0AaZ/btsP4x1iQid/50k03aJjNZOXpOY5nh5491/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdY0AaZ%2FbtsP4x1iQid%2F50k03aJjNZOXpOY5nh5491%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1606&quot; height=&quot;690&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;JSON&amp;nbsp;이&amp;nbsp;구성되었으니&amp;nbsp;파싱을&amp;nbsp;해야했습니다.&amp;nbsp;이번에도&amp;nbsp;AI&amp;nbsp;에게&amp;nbsp;JSON&amp;nbsp;파싱하는&amp;nbsp;방법에&amp;nbsp;대해서&amp;nbsp;물어봤습니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;JSON&amp;nbsp;파싱&amp;nbsp;시&amp;nbsp;필요한&amp;nbsp;Dart&amp;nbsp;모델&amp;nbsp;구성과&amp;nbsp;JSON&amp;nbsp;파싱&amp;nbsp;방법을&amp;nbsp;코드로&amp;nbsp;알려주어&amp;nbsp;적용하는데&amp;nbsp;어려움이&amp;nbsp;없었습니다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beGG65/btsP4bda1iP/f6b00QSK6kdFnRduyoWjs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beGG65/btsP4bda1iP/f6b00QSK6kdFnRduyoWjs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beGG65/btsP4bda1iP/f6b00QSK6kdFnRduyoWjs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeGG65%2FbtsP4bda1iP%2Ff6b00QSK6kdFnRduyoWjs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1582&quot; height=&quot;442&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1604&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNxNPx/btsP4gS5xfN/qKbZwSp3Mdmvv54V40ytv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNxNPx/btsP4gS5xfN/qKbZwSp3Mdmvv54V40ytv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNxNPx/btsP4gS5xfN/qKbZwSp3Mdmvv54V40ytv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNxNPx%2FbtsP4gS5xfN%2FqKbZwSp3Mdmvv54V40ytv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1604&quot; height=&quot;680&quot; data-origin-width=&quot;1604&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;개발에&amp;nbsp;필요한&amp;nbsp;질문을&amp;nbsp;AI에게&amp;nbsp;던졌고,&amp;nbsp;그&amp;nbsp;응답을&amp;nbsp;기반으로&amp;nbsp;코드를&amp;nbsp;수정·적용하면서&amp;nbsp;빠르게&amp;nbsp;기능을&amp;nbsp;완성해&amp;nbsp;나갔습니다.&amp;nbsp;개발&amp;nbsp;경력이&amp;nbsp;있다보니&amp;nbsp;AI의&amp;nbsp;답변을&amp;nbsp;그대로&amp;nbsp;사용하기&amp;nbsp;보다&amp;nbsp;응용해서&amp;nbsp;사용하였고,&amp;nbsp;AI&amp;nbsp;응답에&amp;nbsp;추가된&amp;nbsp;설명을&amp;nbsp;보면서&amp;nbsp;개발&amp;nbsp;학습이&amp;nbsp;되면서&amp;nbsp;간단한&amp;nbsp;기능은&amp;nbsp;직접&amp;nbsp;개발하면서&amp;nbsp;진행하였습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br&gt;에러에 대한 처리&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;개발 시&amp;nbsp;&amp;nbsp;에러가 발생하면 에러 메시지는 그대로 붙여넣고 원인을 파악하고, 대안을 얻는 방식이었습니다.&lt;br&gt;&lt;br&gt;에러&amp;nbsp;메시지만&amp;nbsp;던져도&amp;nbsp;AI가&amp;nbsp;그동안&amp;nbsp;질문한&amp;nbsp;것과&amp;nbsp;맥락을&amp;nbsp;파악해서&amp;nbsp;그런지&amp;nbsp;프로젝트에&amp;nbsp;맞는&amp;nbsp;답변을&amp;nbsp;주었습니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1adOC/btsP4hxHixQ/sLBhmouvcFEJdMkglWcEx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1adOC/btsP4hxHixQ/sLBhmouvcFEJdMkglWcEx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1adOC/btsP4hxHixQ/sLBhmouvcFEJdMkglWcEx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1adOC%2FbtsP4hxHixQ%2FsLBhmouvcFEJdMkglWcEx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1700&quot; height=&quot;1024&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;br&gt;플로터는&amp;nbsp;멀리&amp;nbsp;플랫폼을&amp;nbsp;지원하지만&amp;nbsp;에러에&amp;nbsp;대한&amp;nbsp;처리는&amp;nbsp;플랫폼에&amp;nbsp;대한&amp;nbsp;이해가&amp;nbsp;있어야&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;플랫폼에&amp;nbsp;나오는&amp;nbsp;이슈까지&amp;nbsp;AI&amp;nbsp;도움으로&amp;nbsp;해결&amp;nbsp;하면서&amp;nbsp;플랫폼&amp;nbsp;특성의&amp;nbsp;이슈를&amp;nbsp;빠르게&amp;nbsp;해결하며&amp;nbsp;개발에&amp;nbsp;속도를&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있었습니다.&lt;br&gt;&lt;br&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;br&gt;1인 개발자로써 가장 어려운 것은 디자인 입니다. 이 디자인 부분을 AI의 도움으로 어느정도 해결하였습니다.&lt;br&gt;&lt;br&gt;원하는&amp;nbsp;색상과&amp;nbsp;앱의&amp;nbsp;컨셉을&amp;nbsp;간단히&amp;nbsp;기록하여&amp;nbsp;이것과&amp;nbsp;부합되는&amp;nbsp;아이콘&amp;nbsp;만들어줄&amp;nbsp;것을&amp;nbsp;요청하였고,&lt;br&gt;&lt;br&gt;그&amp;nbsp;결과&amp;nbsp;받은&amp;nbsp;앱&amp;nbsp;아이콘&amp;nbsp;기반으로&amp;nbsp;앱&amp;nbsp;아이콘을&amp;nbsp;구성하였습니다.&amp;nbsp;&lt;br&gt;&lt;br&gt;아쉽게도&amp;nbsp;제가&amp;nbsp;사용한&amp;nbsp;AI&amp;nbsp;툴에서&amp;nbsp;제공하는&amp;nbsp;앱&amp;nbsp;아이콘은&amp;nbsp;앱에&amp;nbsp;바로&amp;nbsp;사용은&amp;nbsp;힘들어서,&amp;nbsp;디자인&amp;nbsp;시안&amp;nbsp;기반으로&amp;nbsp;앱&amp;nbsp;아이콘을&amp;nbsp;디자인&amp;nbsp;하여&amp;nbsp;적용하였습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;1052&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02iKJ/btsP4Yj1Vlv/ckoEIryTcRpRkmunPhw1ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02iKJ/btsP4Yj1Vlv/ckoEIryTcRpRkmunPhw1ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02iKJ/btsP4Yj1Vlv/ckoEIryTcRpRkmunPhw1ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02iKJ%2FbtsP4Yj1Vlv%2FckoEIryTcRpRkmunPhw1ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1660&quot; height=&quot;1052&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;1052&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br&gt;&lt;br&gt;마무리&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;바이브 코딩이라는 말이 요즘 주변에서 쉽게 들을 수 있습니다. 자연어인 프롬프트 기반으로 코딩하는 바이브 코딩은 개발 언어를 모르는 개발자에게 개발 속도를 올릴 수 있는 코딩 방법이라고 생각합니다.&amp;nbsp;&lt;br&gt;이번&amp;nbsp;개발&amp;nbsp;과정은&amp;nbsp;단순히&amp;nbsp;검색의&amp;nbsp;연장선이&amp;nbsp;아닌,&amp;nbsp;대화&amp;nbsp;기반&amp;nbsp;개발에&amp;nbsp;가까웠습니다.&amp;nbsp;AI&amp;nbsp;와&amp;nbsp;대화를&amp;nbsp;앱의&amp;nbsp;구조부터&amp;nbsp;상세&amp;nbsp;기능까지&amp;nbsp;대부분이&amp;nbsp;아래&amp;nbsp;흐름으로&amp;nbsp;진행되었습니다.&lt;br&gt;&lt;br&gt;&quot;이런&amp;nbsp;걸&amp;nbsp;만들고&amp;nbsp;싶어.&quot;&lt;br&gt;AI가&amp;nbsp;구조&amp;nbsp;제안&amp;nbsp;및&amp;nbsp;코드&amp;nbsp;스니펫&amp;nbsp;제공&lt;br&gt;코드&amp;nbsp;적용&amp;nbsp;및&amp;nbsp;수정&lt;br&gt;예상치&amp;nbsp;못한&amp;nbsp;이슈&amp;nbsp;발생&amp;nbsp;→&amp;nbsp;다시&amp;nbsp;질문&lt;br&gt;(반복)&lt;br&gt;&lt;br&gt;이처럼,&amp;nbsp;개발&amp;nbsp;과정&amp;nbsp;전체가&amp;nbsp;질문과&amp;nbsp;응답의&amp;nbsp;흐름으로&amp;nbsp;구성되었고,&amp;nbsp;저는&amp;nbsp;그&amp;nbsp;흐름을&amp;nbsp;빠르게&amp;nbsp;따라가며&amp;nbsp;앱을&amp;nbsp;완성할&amp;nbsp;수&amp;nbsp;있었습니다.&lt;br&gt;&lt;br&gt;Flutter를&amp;nbsp;처음&amp;nbsp;접한&amp;nbsp;입장에서,&amp;nbsp;AI를&amp;nbsp;통해&amp;nbsp;질문하고&amp;nbsp;구현하는&amp;nbsp;방식만으로도&amp;nbsp;앱을&amp;nbsp;개발할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;경험은&amp;nbsp;인상&amp;nbsp;깊었습니다.&amp;nbsp;물론&amp;nbsp;기존의&amp;nbsp;개발&amp;nbsp;지식과&amp;nbsp;경험이&amp;nbsp;기반이&amp;nbsp;되었지만,&amp;nbsp;이번&amp;nbsp;프로젝트를&amp;nbsp;통해&amp;nbsp;공부의&amp;nbsp;흐름&amp;nbsp;자체가&amp;nbsp;질문&amp;nbsp;중심으로&amp;nbsp;변화하고&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;실감하게&amp;nbsp;됐습니다.&lt;br&gt;&lt;br&gt;이번&amp;nbsp;프로젝트를&amp;nbsp;통해&amp;nbsp;질문력만으로도&amp;nbsp;앱을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;결론을&amp;nbsp;내릴&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;앞으로의&amp;nbsp;개발&amp;nbsp;문화와&amp;nbsp;환경이&amp;nbsp;변화될&amp;nbsp;것으로&amp;nbsp;생각됩니다.&amp;nbsp;질문을&amp;nbsp;잘하는&amp;nbsp;개발자가&amp;nbsp;높은&amp;nbsp;대우를&amp;nbsp;받는&amp;nbsp;날이&amp;nbsp;머지않은&amp;nbsp;거&amp;nbsp;같습니다.&lt;/p&gt;</description>
      <category>프로그래밍/Flutter</category>
      <category>4차산업</category>
      <category>AI</category>
      <category>IOS</category>
      <category>개발</category>
      <category>안드로이드</category>
      <category>앱</category>
      <category>앱개발</category>
      <category>인공지능</category>
      <category>프롬프트</category>
      <category>플로터</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/252</guid>
      <comments>https://faith-developer.tistory.com/252#entry252comment</comments>
      <pubDate>Sun, 24 Aug 2025 23:42:59 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 말씀 앱 DoBible 출시</title>
      <link>https://faith-developer.tistory.com/notice/251</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Android&lt;/b&gt;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kcs.dobible&amp;amp;hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;다운로드 가기&lt;/u&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;iOS&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-filename=&quot;1LbxA.jpg&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;357&quot;&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/dobible/id6744367429&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh8zBJ/btsOSjieKHN/uVi8RErff1j1ivDH7dkCSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh8zBJ%2FbtsOSjieKHN%2FuVi8RErff1j1ivDH7dkCSK%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;357&quot; height=&quot;357&quot; data-filename=&quot;1LbxA.jpg&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;u&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://apps.apple.com/kr/app/dobible/id6744367429&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다운로드로 이동&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h2&gt;</description>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/notice/251</guid>
      <pubDate>Wed, 9 Apr 2025 12:15:00 +0900</pubDate>
    </item>
    <item>
      <title>DoBible 개인정보 처리 방침</title>
      <link>https://faith-developer.tistory.com/250</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본 개발자가 작성한 앱은 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원할하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-96a6df1f-fcd8-4bac-814e-83c1b8119a1e&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​1. 개인정보의 처리 목적&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5c9c6fd4-fa22-41fb-a546-30e1b07adc7c&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;- 광고ID(AdID) 수집 목적&lt;br /&gt;&lt;/span&gt;Google은 사용자에게 더 많은 선택권을 제공하기 위해 광고 및 분석 작업에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 대표적으로 게재할 광고를 맞춤설정하고 앱 사용 방식을 파악하는데 유용합니다.&lt;br /&gt;예를 들어 광고를 게재한 뒤에 마케팅 측에서 문맥광고, 게재빈도 설정, 전환 추적, 보고 및 보안, 사기 감지 작업을 수행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;자세히 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://support.google.com/googleplay/answer/3405269&quot;&gt;https://support.google.com/googleplay/answer/3405269&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744125594657&quot; style=&quot;color: #333333; text-align: start;&quot; contenteditable=&quot;false&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-og-source-url=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-og-host=&quot;support.google.com&quot; data-og-description=&quot;Google Play는 사용자 관리 기능의 향상을 위해 광고 및 분석에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고 ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 특히나 광고를 맞춤설정하고&quot; data-og-title=&quot;광고 ID - Google Play 고객센터&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-source-url=&quot;https://support.google.com/googleplay/answer/3405269&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 ID - Google Play 고객센터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Play는 사용자 관리 기능의 향상을 위해 광고 및 분석에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고 ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 특히나 광고를 맞춤설정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;support.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;SE-7c7d8816-789f-4de7-9ff2-bb111e5d90c2&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span&gt;가. 애드몹 관련 정보&lt;br /&gt;- 애드몹 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://admob.google.com/home/&quot;&gt;https://admob.google.com/home/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2. 개인정보의 처리 및 보유 기간&lt;br /&gt;앱은 정보 주체로부터 개인정보를 수집 할 때 동의 받은 개인정보 보유 이용기간 또는 법령에 따른 개인정보 보유 이용기간 내에서 개인정보를 처리 보유하며 구체적인 개인정보 처리 및 보유 기간은 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;가. 개발자가 데이터를 수집하거나 저장하지 않습니다.&lt;br /&gt;&lt;br /&gt;광고 및 광고분석 서비스에서(이하 Google) 수집하는 광고 ID에 관한 자세한 사항은 해당 서비스의 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko)를&quot;&gt;https://policies.google.com/privacy?hl=ko)를&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;참고해 주시기 바랍니다.&lt;br /&gt;&lt;br /&gt;3. 개인정보의 제 3자 제공&lt;br /&gt;앱은 정보주체의 별도 동의, 법률의 특별한 규정 등 개인정보 보호법 제 17조에 해당하는 경우 외에는 개인정보를 제 3자에게 제공하지 않습니다.&lt;br /&gt;&lt;br /&gt;4. 개인정보처리 위탁&lt;br /&gt;위탁하는 업무의 내용 : 광고 및 광고 분석 서비스&lt;br /&gt;Google 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko&quot;&gt;https://policies.google.com/privacy?hl=ko&lt;/a&gt;)&lt;br /&gt;Google 광고 개인정보 보호 및 약관 (&lt;a href=&quot;https://policies.google.com/technologies/ads?hl=ko&quot;&gt;https://policies.google.com/technologies/ads?hl=ko&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;5. 처리하는 개인정보의 항목&lt;br /&gt;- 광고ID(AdID) 수집 (과정에서 사용자의 IP수집이 포함될 수 있습니다.)&lt;br /&gt;개발자 본인이 아닌 광고 및 광고 분석 서비스(이하 Google)에 의해 광고 식별자인 Android 광고 ID가 수집 될 수 있습니다.&lt;br /&gt;이는 기기의 설정(Google 설정앱 -&amp;gt; Google -&amp;gt; 광고 또는 설정 -&amp;gt; 계정 -&amp;gt; Google -&amp;gt; 광고)을 변경함으로 사용을 거부 할 수 있습니다.&lt;br /&gt;또한 광고 추적을 선택 해제한 사용자가 해당 식별자를 재설정하여 광고 추적을 선택 해제하기 전에 수집 및 전달된 리마케팅 데이터로부터 기기의 연결을 해제 할 수 있습니다.&lt;br /&gt;Google 서비스에서 수집하는 정보는 각 서비스가 사용하는 저장소에만 수집, 저장되며 본 서비스에서 별도로 저장하지 않습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;6. 개인정보의 파기에 관한 사항&lt;br /&gt;개발자가 데이터를 수집하거나 저장하지 않습니다.&lt;br /&gt;광고 및 광고분석 서비스에서(이하 Google) 수집하는 광고 ID에 관한 자세한 사항은 해당 서비스의 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko&quot;&gt;https://policies.google.com/privacy?hl=ko&lt;/a&gt;)을 참고해 주시길 바랍니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;7. 개인정보 관리 책임자 및 담당자의 연락처&lt;br /&gt;귀하께서는 앱의 서비스를 이용하시며 발생하는 모든 개인정보 보호 관련 민원을 개인정보 관리 책임자 혹은 담당부서로 신고하실 수 있습니다. 앱은 이용자들의 신고사항에 대해 신속하게 충분한 답변을 드릴 것입니다.&lt;br /&gt;이름 : 신규찬&lt;br /&gt;메일 :  dev.faithpeole@gmail.com&lt;/p&gt;</description>
      <category>Application/DoBible</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/250</guid>
      <comments>https://faith-developer.tistory.com/250#entry250comment</comments>
      <pubDate>Wed, 9 Apr 2025 00:20:34 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 앱 개발 네이티브, Kotlin Multiplatform, Flutter 어떤 것으로 해야하는가?</title>
      <link>https://faith-developer.tistory.com/249</link>
      <description>&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;가장 기본이 되는 네이티브 SDK 을 활용해서 개발 시 장점과 단점, 멀티 플랫폼 Flutter을 활용 시 장점과 단점 마지막으로 Kotlin Multiplatform 줄여서 KMP 의 장점과 단점에 대해서&amp;nbsp; ChatGPT의 도움과 함께 정리한 내용을 포스트 하였습니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 네이티브 개발&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네이티브 앱 개발의 정의 및 주요 특징은 무엇일까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 네이티브 앱 개발은 Java나 Kotlin과 같은 프로그래밍 언어를 사용하여 직접 개발하는 방식입니다.&lt;br /&gt;Android&amp;nbsp;SDK를&amp;nbsp;통해&amp;nbsp;디바이스의&amp;nbsp;하드웨어&amp;nbsp;기능에&amp;nbsp;직접&amp;nbsp;접근&amp;nbsp;가능합니다.&lt;br /&gt;&lt;br /&gt;반면에&amp;nbsp;iOS는&amp;nbsp;object-c&amp;nbsp;또는&amp;nbsp;swift과&amp;nbsp;같은&amp;nbsp;프로그래밍&amp;nbsp;언어를&amp;nbsp;사용하여&amp;nbsp;개발하는&amp;nbsp;방식이고,&amp;nbsp;xcode&amp;nbsp;SDK&amp;nbsp;을&amp;nbsp;통해&amp;nbsp;디바이스&amp;nbsp;하드웨어&amp;nbsp;기능에&amp;nbsp;직접&amp;nbsp;접근&amp;nbsp;가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;네이티브&amp;nbsp;앱&amp;nbsp;개발의&amp;nbsp;장점에&amp;nbsp;대해&amp;nbsp;알아보자!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능측면&lt;/b&gt;에서 보면 최적화된 성능 제공하며, 하드웨어 가속 기능 활용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;사용자 경험&lt;/b&gt; 측면에서 보면 각 플랫폼의 UI 가이드라인에 따라 설계되어 친숙한 인터페이스와 우수한 사용자 경험 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;기능&amp;nbsp;접근성&lt;/b&gt; 측면에서&amp;nbsp;보면&amp;nbsp;카메라,&amp;nbsp;마이크,&amp;nbsp;GPS&amp;nbsp;등&amp;nbsp;디바이스&amp;nbsp;기능을&amp;nbsp;완벽하게&amp;nbsp;활용&amp;nbsp;가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보안성&lt;/b&gt;&amp;nbsp;측면에서&amp;nbsp;보면&amp;nbsp;플랫폼&amp;nbsp;별&amp;nbsp;보안&amp;nbsp;기능과&amp;nbsp;정책을&amp;nbsp;최대한&amp;nbsp;활용&amp;nbsp;가능합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;플랫폼&amp;nbsp;특화&amp;nbsp;기능&amp;nbsp;사용&lt;/b&gt;&amp;nbsp;측면에서&amp;nbsp;보면&amp;nbsp;각&amp;nbsp;플랫폼의&amp;nbsp;최신&amp;nbsp;기능을&amp;nbsp;즉시&amp;nbsp;사용&amp;nbsp;가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;네이티브&amp;nbsp;앱&amp;nbsp;개발의&amp;nbsp;단점은&amp;nbsp;없을까?&lt;/h2&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;2️⃣ Kotlin Multiplatform (KMP) 개발&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;KMP&amp;nbsp;정의&amp;nbsp;및&amp;nbsp;주요&amp;nbsp;특징에&amp;nbsp;대해&amp;nbsp;알아보자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Kotlin 언어를 기반으로 다양한 플랫폼에서 실행되는 프레임워크 입니다.&lt;br /&gt;KMP의&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;장점이라고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;코드&amp;nbsp;작성으로&amp;nbsp;안드로이드,&amp;nbsp;iOS,&amp;nbsp;웹,&amp;nbsp;데스크톱&amp;nbsp;등에서&amp;nbsp;동작&amp;nbsp;가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;KMP&amp;nbsp;의&amp;nbsp;장점은&amp;nbsp;무엇일까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&lt;b&gt;유지 보수 용이성&lt;/b&gt; 측면에서 보면 공통 코드 베이스 사용으로 버그 수정과 기능 업데이트가 용이 합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;플랫폼&amp;nbsp;별&amp;nbsp;공통의&amp;nbsp;아키텍처&amp;nbsp;구성&lt;/b&gt;이&amp;nbsp;가능합니다.&amp;nbsp;중요한&amp;nbsp;비즈니스&amp;nbsp;로직을&amp;nbsp;한&amp;nbsp;번만&amp;nbsp;개발하고&amp;nbsp;여러&amp;nbsp;플랫폼에서&amp;nbsp;재사용&amp;nbsp;가능하여&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;장점이라고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;단점은 없을까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아무래도 멀티 플랫폼을 제공하다보니 플랫폼&amp;nbsp;특화&amp;nbsp;기능&amp;nbsp;제한이&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;플랫폼의&amp;nbsp;특화된&amp;nbsp;기능을&amp;nbsp;최대한&amp;nbsp;활용하기&amp;nbsp;어렵습니다.&lt;br /&gt;&lt;br /&gt;커뮤니티와&amp;nbsp;지원이&amp;nbsp;아직은&amp;nbsp;부족합니다.&amp;nbsp;비교적&amp;nbsp;새로운&amp;nbsp;기술,&amp;nbsp;네이티브&amp;nbsp;개발&amp;nbsp;환경만큼의&amp;nbsp;폭넓은&amp;nbsp;지원&amp;nbsp;부족합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;3️⃣ Flutter 개발&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Flutter&amp;nbsp;의&amp;nbsp;정의&amp;nbsp;및&amp;nbsp;주요&amp;nbsp;특징에&amp;nbsp;대해&amp;nbsp;알아보자!&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;Flutter는&amp;nbsp;Google&amp;nbsp;개발의&amp;nbsp;오픈&amp;nbsp;소스&amp;nbsp;UI&amp;nbsp;소프트웨어&amp;nbsp;개발&amp;nbsp;키트로써&amp;nbsp;구글의&amp;nbsp;지원을&amp;nbsp;받고&amp;nbsp;있는&amp;nbsp;플랫폼&amp;nbsp;입니다.&lt;br /&gt;&lt;br /&gt;Flutter는&amp;nbsp;Dart&amp;nbsp;언어&amp;nbsp;사용하고&amp;nbsp;있으며,&amp;nbsp;iOS,&amp;nbsp;안드로이드,&amp;nbsp;웹,&amp;nbsp;데스크톱에서&amp;nbsp;하나의&amp;nbsp;코드베이스로&amp;nbsp;앱&amp;nbsp;구축&amp;nbsp;가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;Flutter의&amp;nbsp;장점은&amp;nbsp;무엇일까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;개발&amp;nbsp;속도의&amp;nbsp;향상&lt;/b&gt;이&amp;nbsp;있습니다.&amp;nbsp;핫&amp;nbsp;리로드&amp;nbsp;기능으로&amp;nbsp;코드&amp;nbsp;변경&amp;nbsp;사항&amp;nbsp;즉시&amp;nbsp;반영,&amp;nbsp;개발&amp;nbsp;시간&amp;nbsp;단축&amp;nbsp;됩니다.&amp;nbsp;&lt;br /&gt;즉,&amp;nbsp;코드만&amp;nbsp;입렫하면&amp;nbsp;바로&amp;nbsp;화면에&amp;nbsp;반영&amp;nbsp;된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UI&amp;nbsp;일관성&lt;/b&gt;을&amp;nbsp;제공합니다.&amp;nbsp;단일&amp;nbsp;코드베이스로&amp;nbsp;모든&amp;nbsp;플랫폼에서&amp;nbsp;UI&amp;nbsp;일관성&amp;nbsp;유지&amp;nbsp;하게&amp;nbsp;됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;성능&lt;/b&gt;측면에서는&amp;nbsp;네이티브&amp;nbsp;앱과&amp;nbsp;비슷한&amp;nbsp;수준의&amp;nbsp;성능&amp;nbsp;제공하게&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;Flutter 의 단점은 무엇일까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;파일&amp;nbsp;크기의&amp;nbsp;단점이&amp;nbsp;있습니다.&amp;nbsp;큰&amp;nbsp;파일&amp;nbsp;크기로&amp;nbsp;인해&amp;nbsp;다운로드&amp;nbsp;시간과&amp;nbsp;장치&amp;nbsp;저장&amp;nbsp;공간에&amp;nbsp;영향을&amp;nbsp;받습니다.&lt;br /&gt;&lt;br /&gt;새로운&amp;nbsp;언어&amp;nbsp;학습&amp;nbsp;필요&amp;nbsp;합니다.&amp;nbsp;Flutter는&amp;nbsp;Dart&amp;nbsp;언어로써&amp;nbsp;Dart&amp;nbsp;언어에&amp;nbsp;익숙하지&amp;nbsp;않은&amp;nbsp;분들은&amp;nbsp;학습&amp;nbsp;필요합니다.&lt;br /&gt;&lt;br /&gt;하드웨어&amp;nbsp;기능&amp;nbsp;접근&amp;nbsp;제한이&amp;nbsp;있습니다.&amp;nbsp;특정&amp;nbsp;플랫폼의&amp;nbsp;고유&amp;nbsp;기능에&amp;nbsp;접근하는&amp;nbsp;데&amp;nbsp;제한이&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;안드로이드&amp;nbsp;앱&amp;nbsp;개발에&amp;nbsp;있어&amp;nbsp;기술&amp;nbsp;선택은&amp;nbsp;프로젝트의&amp;nbsp;성공에&amp;nbsp;결정적인&amp;nbsp;요소입니다.&amp;nbsp;각&amp;nbsp;기술의&amp;nbsp;장단점을&amp;nbsp;잘&amp;nbsp;이해하고&amp;nbsp;프로젝트의&amp;nbsp;목표에&amp;nbsp;맞춰&amp;nbsp;적절한&amp;nbsp;기술을&amp;nbsp;선택하는&amp;nbsp;것이&amp;nbsp;중요합니다.&lt;br /&gt;&lt;br /&gt;네이티브&amp;nbsp;개발은&amp;nbsp;최적의&amp;nbsp;성능을&amp;nbsp;필요로&amp;nbsp;하는&amp;nbsp;앱에&amp;nbsp;적합하며,&amp;nbsp;Kotlin&amp;nbsp;Multiplatform은&amp;nbsp;코드&amp;nbsp;재사용성과&amp;nbsp;유지&amp;nbsp;보수의&amp;nbsp;편리함을&amp;nbsp;중요시하는&amp;nbsp;프로젝트에,&amp;nbsp;Flutter는&amp;nbsp;빠른&amp;nbsp;개발과&amp;nbsp;플랫폼&amp;nbsp;간&amp;nbsp;일관된&amp;nbsp;사용자&amp;nbsp;경험을&amp;nbsp;제공합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;좀&amp;nbsp;더&amp;nbsp;현업&amp;nbsp;입장에서&amp;nbsp;말씀드리자면,&amp;nbsp;인력이&amp;nbsp;부족하고&amp;nbsp;빠른&amp;nbsp;결과물을&amp;nbsp;만들어서&amp;nbsp;수익을&amp;nbsp;얻어야하는&amp;nbsp;스타트업에서&amp;nbsp;사용하기에는&amp;nbsp;Flutter로&amp;nbsp;개발하는&amp;nbsp;것을&amp;nbsp;추천&amp;nbsp;드립니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;인력이&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;갖추어지며&amp;nbsp;안정적이며&amp;nbsp;최적화된&amp;nbsp;프로잭트를&amp;nbsp;진행해야&amp;nbsp;한다면&amp;nbsp;네이티브를&amp;nbsp;추천&amp;nbsp;드립니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Android,&amp;nbsp;ios&amp;nbsp;를&amp;nbsp;개발&amp;nbsp;시&amp;nbsp;공통&amp;nbsp;비즈니스&amp;nbsp;로직을&amp;nbsp;갖은&amp;nbsp;코드는&amp;nbsp;Kotlin&amp;nbsp;Multiplatform&amp;nbsp;로&amp;nbsp;라이브러리를&amp;nbsp;만들어서&amp;nbsp;사용&amp;nbsp;할&amp;nbsp;것을&amp;nbsp;추천&amp;nbsp;드립니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;최종적으로&amp;nbsp;개발&amp;nbsp;팀의&amp;nbsp;전문성과&amp;nbsp;프로젝트&amp;nbsp;요구&amp;nbsp;사항을&amp;nbsp;기반으로&amp;nbsp;최적의&amp;nbsp;기술을&amp;nbsp;선택함으로써,&amp;nbsp;효율적이고&amp;nbsp;경제적인&amp;nbsp;개발&amp;nbsp;과정을&amp;nbsp;설계할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;글이&amp;nbsp;안드로이드&amp;nbsp;앱&amp;nbsp;개발에&amp;nbsp;대한&amp;nbsp;기술&amp;nbsp;선택을&amp;nbsp;고민하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;되길&amp;nbsp;바랍니다.&lt;/p&gt;</description>
      <category>프로그래밍/Android</category>
      <category>Android</category>
      <category>flutter</category>
      <category>KMP</category>
      <category>가이드</category>
      <category>가이드라인</category>
      <category>단점</category>
      <category>멀티플랫폼</category>
      <category>장점</category>
      <category>추천</category>
      <category>플랫폼</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/249</guid>
      <comments>https://faith-developer.tistory.com/249#entry249comment</comments>
      <pubDate>Fri, 7 Mar 2025 21:21:04 +0900</pubDate>
    </item>
    <item>
      <title>클린아키텍처의 2개의 Mapper(Entity, View Model) 의 가이드</title>
      <link>https://faith-developer.tistory.com/248</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;클린아키텍처에서 Entity 와ViewModel을 명확한 구분을 주고 있습니다. 여기서 ViewModel 는 MVVM 의 ViewModel이 아니라 View의 Data 즉, UI Data를 의미합니다.&lt;br /&gt;클린아키텍처에서 이 두 데이터의 차이를 혼재되어 사용 할 수 있는데 이 두 데이터의 차이와 Android 에서는 클린아키텍처를 어떻게 사용하면 좋을지 공유하겠습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클린아키텍처의 Mapper 의 역할&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;클린아키텍처에서는 두 개의 Mapper 가 존재합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;1. DTO &amp;rarr; Entity Mapper&lt;br /&gt;데이터를&amp;nbsp;네트워크,&amp;nbsp;데이터베이스&amp;nbsp;등&amp;nbsp;외부&amp;nbsp;소스에서&amp;nbsp;받아와&amp;nbsp;비즈니스&amp;nbsp;계층(Entity)로&amp;nbsp;변환합니다.&lt;br /&gt;이&amp;nbsp;단계는&amp;nbsp;보통&amp;nbsp;Repository&amp;nbsp;계층에서&amp;nbsp;수행됩니다.&lt;br /&gt;&lt;br /&gt;2. Entity &amp;rarr; ViewModel (또는 UI 모델) Mapper&lt;br /&gt;비즈니스&amp;nbsp;로직&amp;nbsp;처리&amp;nbsp;후,&amp;nbsp;UI&amp;nbsp;계층에&amp;nbsp;맞는&amp;nbsp;데이터&amp;nbsp;구조(ViewModel&amp;nbsp;또는&amp;nbsp;화면&amp;nbsp;모델)로&amp;nbsp;변환합니다.&lt;br /&gt;이&amp;nbsp;단계는&amp;nbsp;보통&amp;nbsp;Use&amp;nbsp;Case&amp;nbsp;계층에서&amp;nbsp;수행됩니다.&lt;br /&gt;&lt;br /&gt;여기서&amp;nbsp;말하는&amp;nbsp;ViewModel은&amp;nbsp;MVVM의&amp;nbsp;ViewModel과&amp;nbsp;다른&amp;nbsp;개념입니다.&lt;br /&gt;&amp;nbsp;&lt;br /&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;693&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s3MQO/btsL1jG18qm/hAyfKvDsMkqi00s6TO49YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s3MQO/btsL1jG18qm/hAyfKvDsMkqi00s6TO49YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s3MQO/btsL1jG18qm/hAyfKvDsMkqi00s6TO49YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs3MQO%2FbtsL1jG18qm%2FhAyfKvDsMkqi00s6TO49YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;611&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;두 개의 Mapper가 필요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;클린&amp;nbsp;아키텍처의&amp;nbsp;핵심은&amp;nbsp;계층&amp;nbsp;간&amp;nbsp;독립성을&amp;nbsp;보장하는&amp;nbsp;것입니다.&amp;nbsp;각&amp;nbsp;계층의&amp;nbsp;책임을&amp;nbsp;분리하기&amp;nbsp;위해&amp;nbsp;데이터&amp;nbsp;변환이&amp;nbsp;계층&amp;nbsp;간에서&amp;nbsp;수행됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&amp;nbsp;DTO&amp;nbsp;&amp;rarr;&amp;nbsp;Entity&amp;nbsp;Mapper&lt;/b&gt;&lt;br /&gt;DTO(Data&amp;nbsp;Transfer&amp;nbsp;Object)는&amp;nbsp;외부&amp;nbsp;시스템(API,&amp;nbsp;DB&amp;nbsp;등)에서&amp;nbsp;데이터를&amp;nbsp;받아오는&amp;nbsp;데&amp;nbsp;사용됩니다.&lt;br /&gt;이&amp;nbsp;데이터를&amp;nbsp;도메인(Entity)에서&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;변환해야&amp;nbsp;합니다.&lt;br /&gt;이런&amp;nbsp;작업이&amp;nbsp;필요한&amp;nbsp;이유는&amp;nbsp;DTO는&amp;nbsp;외부&amp;nbsp;시스템의&amp;nbsp;데이터&amp;nbsp;형식은&amp;nbsp;내부&amp;nbsp;비즈니스&amp;nbsp;로직과&amp;nbsp;다를&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어서&amp;nbsp;API&amp;nbsp;에서&amp;nbsp;처리하는&amp;nbsp;비즈니스&amp;nbsp;로직은&amp;nbsp;DB&amp;nbsp;에&amp;nbsp;있는&amp;nbsp;데이터를&amp;nbsp;API&amp;nbsp;로&amp;nbsp;내리기&amp;nbsp;위한&amp;nbsp;작업만&amp;nbsp;한다면&amp;nbsp;Entity&amp;nbsp;에서&amp;nbsp;가져갈&amp;nbsp;비즈니스&amp;nbsp;로직은&amp;nbsp;달라질&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;Entity&amp;nbsp;는&amp;nbsp;외부&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;의존성을&amp;nbsp;줄이고,&amp;nbsp;비즈니스&amp;nbsp;로직의&amp;nbsp;독립성을&amp;nbsp;유지합니다.&amp;nbsp;여기서&amp;nbsp;비즈니스&amp;nbsp;로직에&amp;nbsp;UI&amp;nbsp;부분은&amp;nbsp;제외&amp;nbsp;됩니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;Entity&amp;nbsp;&amp;rarr;&amp;nbsp;ViewModel&amp;nbsp;Mapper&lt;/b&gt;&lt;br /&gt;Entity는&amp;nbsp;비즈니스&amp;nbsp;로직을&amp;nbsp;처리하기&amp;nbsp;위한&amp;nbsp;구조를&amp;nbsp;가지고&amp;nbsp;있습니다.&lt;br /&gt;UI(ViewModel)는&amp;nbsp;화면에&amp;nbsp;적합한&amp;nbsp;구조와&amp;nbsp;데이터를&amp;nbsp;요구합니다.&lt;br /&gt;Mapper를&amp;nbsp;한번&amp;nbsp;더&amp;nbsp;하여&amp;nbsp;ViewModel를&amp;nbsp;생성하는&amp;nbsp;이유는&amp;nbsp;Entity는&amp;nbsp;비즈니스&amp;nbsp;중심이므로,&amp;nbsp;UI와&amp;nbsp;직접&amp;nbsp;연결되면&amp;nbsp;변경이&amp;nbsp;어려워질&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;화면에&amp;nbsp;맞는&amp;nbsp;형식으로&amp;nbsp;데이터를&amp;nbsp;가공해야&amp;nbsp;하므로&amp;nbsp;변환이&amp;nbsp;필요합니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;br /&gt;어떻게 사용해야할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱에서의 클린아키텍처는 독립적으로 구성하여 1:1 매핑을 가져가는 것보다 UI 의 속도가 중요하게 됩니다. 속도를 생각한다면 다음 두가지를 고려해볼 필요가 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;1. Entity와 ViewModel의 결합&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;모든&amp;nbsp;프로젝트에서&amp;nbsp;&quot;완벽한&amp;nbsp;클린&amp;nbsp;아키텍처&quot;를&amp;nbsp;강요할&amp;nbsp;필요는&amp;nbsp;없습니다.&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;절충안을&amp;nbsp;고려할&amp;nbsp;수&amp;nbsp;있습니다:&lt;br /&gt;Entity와&amp;nbsp;ViewModel&amp;nbsp;통합비즈니스&amp;nbsp;로직이&amp;nbsp;단순하다면,&amp;nbsp;UI에&amp;nbsp;맞춘&amp;nbsp;데이터&amp;nbsp;구조를&amp;nbsp;Entity로&amp;nbsp;사용하는&amp;nbsp;것도&amp;nbsp;가능합니다.&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;이를&amp;nbsp;도메인&amp;nbsp;독립성이&amp;nbsp;필요&amp;nbsp;없는&amp;nbsp;간단한&amp;nbsp;애플리케이션에서만&amp;nbsp;적용해야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;클린아키텍처를&amp;nbsp;구성하며&amp;nbsp;도메인의&amp;nbsp;의존성을&amp;nbsp;가져갈&amp;nbsp;구조였다면&amp;nbsp;이&amp;nbsp;과정의&amp;nbsp;도입은&amp;nbsp;힘들&amp;nbsp;수&amp;nbsp;있으나&amp;nbsp;프로젝트&amp;nbsp;규모에&amp;nbsp;따라서&amp;nbsp;고려해&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Entity의 존재성 제거&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;API&amp;nbsp;가&amp;nbsp;UI&amp;nbsp;에&amp;nbsp;맞춰&amp;nbsp;설계되어&amp;nbsp;내려&amp;nbsp;온다면&amp;nbsp;Entity&amp;nbsp;로&amp;nbsp;변환은&amp;nbsp;필요&amp;nbsp;없어질&amp;nbsp;것입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;API&amp;nbsp;에서&amp;nbsp;받은&amp;nbsp;DTO&amp;nbsp;를&amp;nbsp;바로&amp;nbsp;사용하는&amp;nbsp;구조라면&amp;nbsp;entity에서&amp;nbsp;ViewModel의&amp;nbsp;mapper의&amp;nbsp;역할도&amp;nbsp;고려해&amp;nbsp;볼&amp;nbsp;필요가&amp;nbsp;있습니다.&amp;nbsp;프로젝트에&amp;nbsp;API&amp;nbsp;구조에&amp;nbsp;따라서&amp;nbsp;DTO를&amp;nbsp;바로&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;&amp;nbsp;Mapper를&amp;nbsp;활용해서&amp;nbsp;DTO에&amp;nbsp;대한&amp;nbsp;비즈니스를&amp;nbsp;녹인&amp;nbsp;Entity&amp;nbsp;로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;프로젝트&amp;nbsp;상황에&amp;nbsp;맞춰서&amp;nbsp;Entity의&amp;nbsp;존재는&amp;nbsp;생략될&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Mapper의&amp;nbsp;가이드&amp;nbsp;라인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞써 설명 드렸듯이 클린아키텍처에서의 Mapper 는 2번 이뤄지게 됩니다. 각 Mapper 에서 추가해야할 값들이 있습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. DTO &amp;rarr; Entity 변환 시 값 추가가 적절한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1.1. Entity에 필요한 필드가 DTO에 없을 때&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;API에서&amp;nbsp;제공하지&amp;nbsp;않는&amp;nbsp;데이터가&amp;nbsp;있지만,&amp;nbsp;&lt;br /&gt;Entity의&amp;nbsp;비즈니스&amp;nbsp;로직이나&amp;nbsp;데이터&amp;nbsp;구조상&amp;nbsp;반드시&amp;nbsp;필요한&amp;nbsp;경우&amp;nbsp;값을&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;예를들면 다음 세 가지의 필드를 추가 할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;기본값을 설정해야 하는 필드&lt;/u&gt; (예 : 기본 카운트 값, 기본 설정 값, UDID 같은 식별 값)&lt;br /&gt;&lt;u&gt;계산을 통해 도출해야 하는 값&lt;/u&gt; (예: 은행 잔액)&lt;br /&gt;&lt;u&gt;시스템&amp;nbsp;내부에서&amp;nbsp;관리해야&amp;nbsp;하는&amp;nbsp;데이터&lt;/u&gt;(예:&amp;nbsp;생성&amp;nbsp;시점,&amp;nbsp;유효성&amp;nbsp;상태)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;data class AccountEntity(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val id: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val email: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val isDeleted: Boolean = false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val isVerified: Boolean = false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val id: String = UUID.randomUUID().toString(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val createdAt: LocalDateTime = LocalDateTime.now(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val updatedAt: LocalDateTime = LocalDateTime.now()
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 비즈니스 로직을 지원하기 위해&lt;/b&gt;&lt;br /&gt;Entity는&amp;nbsp;비즈니스&amp;nbsp;로직을&amp;nbsp;포함하므로,&amp;nbsp;DTO에&amp;nbsp;없는&amp;nbsp;값이라도&amp;nbsp;비즈니스&amp;nbsp;로직을&amp;nbsp;수행하기&amp;nbsp;위해&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;예를&amp;nbsp;들면&amp;nbsp;사용자의&amp;nbsp;이메일&amp;nbsp;인증&amp;nbsp;여부를&amp;nbsp;저장하기&amp;nbsp;위해,&amp;nbsp;이메일&amp;nbsp;존재&amp;nbsp;여부로&amp;nbsp;isEmailVerified&amp;nbsp;값을&amp;nbsp;추가&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;data class AccountEntity(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val id: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val email: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val isEmailVerified: Boolean = false
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;이처럼&amp;nbsp;Entity의&amp;nbsp;추가&amp;nbsp;필드는&amp;nbsp;비즈니스&amp;nbsp;로직이나&amp;nbsp;데이터&amp;nbsp;구조상&amp;nbsp;필요한&amp;nbsp;데이터를&amp;nbsp;구성할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;UI&amp;nbsp;구성&amp;nbsp;시&amp;nbsp;필요한&amp;nbsp;데이터는&amp;nbsp;구성하지는&amp;nbsp;않습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Entity &amp;rarr; ViewModel&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2.1. UI 를 위한 ViewModel&lt;/b&gt;&lt;br /&gt;Entity의 비즈니스 로직이나 데이터 구조 상 필요 값이 존재하나 UI 구성 시 반드시 필요한 값 한 경우 추가할 수 있습니다.&lt;br /&gt;&lt;br /&gt;리스트로 구성된 화면에서 &lt;b&gt;데이터 타입별로 화면을 구성&lt;/b&gt;한다고 가정해 봅시다. 이때, UI 복잡도에 따른 리스트의 최적화를 위해 하나의 데이터 타입을 &lt;b&gt;여러 개의 데이터(n개)로 분리하는 작업을&lt;/b&gt; 수행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;예시로 온라인 쇼핑 앱에서 &lt;b&gt;상품 리스트 화면&lt;/b&gt;을 구성한다고 가정합니다.&lt;br /&gt;&lt;br /&gt;API로부터 &lt;b&gt;상품 데이터&lt;/b&gt;를 받아오지만, UI에서 각 상품을 &lt;b&gt;일반 상품&lt;/b&gt;과 &lt;b&gt;할인 상품&lt;/b&gt;으로 나누어 표시해야 합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;일반 상품&lt;/b&gt;은 이름과 가격만 표시하고,&lt;br /&gt;&lt;b&gt;할인 상품&lt;/b&gt;은 이름, 원래 가격, 할인된 가격, 할인율을 표시합니다.&lt;br /&gt;&lt;br /&gt;이를 위해 &lt;b&gt;하나의 상품 데이터를 일반 상품과 할인 상품으로 나누어 표시&lt;/b&gt;하는 작업을 `Mapper`로 처리할 수 습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;API Response (Entity)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;{
&amp;nbsp;&amp;nbsp;&quot;id&quot;: &quot;001&quot;,
&amp;nbsp;&amp;nbsp;&quot;name&quot;: &quot;Wireless Mouse&quot;,
&amp;nbsp;&amp;nbsp;&quot;price&quot;: 25000,
&amp;nbsp;&amp;nbsp;&quot;discountPrice&quot;: 20000,
&amp;nbsp;&amp;nbsp;&quot;category&quot;: &quot;Electronics&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ViewModel 구조&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- RegularProductViewModel : 일반 상품&lt;br /&gt;- DiscountedProductViewModel : 할인 상품&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;sealed class ProductViewModel {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data class RegularProductViewModel(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val id: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val name: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val price: Int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) : ProductViewModel()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data class DiscountedProductViewModel(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val id: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val name: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val originalPrice: Int,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val discountPrice: Int,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val discountRate: Int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) : ProductViewModel()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mapper 구현&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;fun ProductEntity.toViewModels(): List&amp;lt;ProductViewModel&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val viewModels = mutableListOf&amp;lt;ProductViewModel&amp;gt;()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 일반 상품으로 추가
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewModels.add(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProductViewModel.RegularProductViewModel(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id = this.id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = this.name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price = this.price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 할인 상품이 있는 경우 추가
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (this.discountPrice &amp;lt; this.price) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val discountRate = ((this.price - this.discountPrice) * 100) / this.price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewModels.add(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProductViewModel.DiscountedProductViewModel(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id = this.id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = this.name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;originalPrice = this.price,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;discountPrice = this.discountPrice,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;discountRate = discountRate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return viewModels
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.2. 화면 구성에 따른 UI 데이터&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;API&amp;nbsp;에서&amp;nbsp;내려온&amp;nbsp;데이터를&amp;nbsp;UI&amp;nbsp;최적화를&amp;nbsp;위한&amp;nbsp;재구성&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;앱 개발에서는 API에서 내려온 데이터를 그대로 UI에 사용할 수 없는 경우가 많습니다. 특히, &lt;b&gt;화면 최적화를 위해 데이터를 재구성&lt;/b&gt;해야 하는 경우가 발생합니다.&lt;br /&gt;&lt;br /&gt;예를 들어, API에서 다음과 같은 형태의 &lt;b&gt;게시글 데이터&lt;/b&gt;가 내려온다고 가정해 봅시다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;API Response (Entity)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;{
&amp;nbsp;&amp;nbsp;&quot;id&quot;: &quot;123&quot;,
&amp;nbsp;&amp;nbsp;&quot;title&quot;: &quot;클린 아키텍처란?&quot;,
&amp;nbsp;&amp;nbsp;&quot;content&quot;: &quot;클린 아키텍처는...&quot;,
&amp;nbsp;&amp;nbsp;&quot;author&quot;: {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;name&quot;: &quot;홍길동&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;profileImage&quot;: &quot;https://example.com/profile.jpg&quot;
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&quot;tags&quot;: [&quot;Android&quot;, &quot;Architecture&quot;, &quot;Kotlin&quot;],
&amp;nbsp;&amp;nbsp;&quot;createdAt&quot;: &quot;2025-01-30T12:00:00Z&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;UI에서는&amp;nbsp;이를&amp;nbsp;그대로&amp;nbsp;표시하지&amp;nbsp;않고,&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;데이터를&amp;nbsp;가공해야&amp;nbsp;합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어:&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;날짜&amp;nbsp;형식을&amp;nbsp;`yyyy.MM.dd`&amp;nbsp;형태로&amp;nbsp;변환&lt;br /&gt;-&amp;nbsp;태그를&amp;nbsp;`#Android&amp;nbsp;#Architecture&amp;nbsp;#Kotlin`&amp;nbsp;형태로&amp;nbsp;변환&lt;br /&gt;-&amp;nbsp;작성자의&amp;nbsp;이름과&amp;nbsp;프로필&amp;nbsp;이미지를&amp;nbsp;별도로&amp;nbsp;표시&lt;br /&gt;&lt;br /&gt;이를 위해 `Mapper`를 사용하여 데이터를 &lt;b&gt;Entity &amp;rarr; ViewModel&lt;/b&gt;로 변환합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ViewModel (UI에서 사용하는 데이터)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;data class PostViewModel(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val id: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val title: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val content: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val authorName: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val authorProfileImage: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val formattedTags: String,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val formattedDate: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mapper 구현&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;fun PostEntity.toViewModel(): PostViewModel {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return PostViewModel(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id = this.id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title = this.title,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content = this.content,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorName = this.author.name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorProfileImage = this.author.profileImage,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedTags = this.tags.joinToString(&quot; &quot;) { &quot;#$it&quot; },
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedDate = formatDate(this.createdAt)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
}

fun formatDate(isoDate: String): String {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val formatter = DateTimeFormatter.ofPattern(&quot;yyyy.MM.dd&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return LocalDateTime.parse(isoDate, DateTimeFormatter.ISO_DATE_TIME).format(formatter)
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;클린&amp;nbsp;아키텍처의&amp;nbsp;유지보수성과&amp;nbsp;효율성&amp;nbsp;사이에서&amp;nbsp;균형을&amp;nbsp;맞추는&amp;nbsp;것이&amp;nbsp;핵심입니다.&amp;nbsp;프로젝트&amp;nbsp;규모와&amp;nbsp;요구사항에&amp;nbsp;맞게&amp;nbsp;설계를&amp;nbsp;조정하면&amp;nbsp;불필요한&amp;nbsp;작업을&amp;nbsp;최소화할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;다음&amp;nbsp;세가지을&amp;nbsp;참고하여&amp;nbsp;프로젝트의&amp;nbsp;규모와&amp;nbsp;특성에&amp;nbsp;맞춰&amp;nbsp;클린아키텍처를&amp;nbsp;구성하는데&amp;nbsp;도움이&amp;nbsp;되면&amp;nbsp;좋겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&amp;nbsp;비즈니스&amp;nbsp;로직에&amp;nbsp;부합하는&amp;nbsp;값만&amp;nbsp;추가&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;추가하는&amp;nbsp;값이&amp;nbsp;도메인&amp;nbsp;로직을&amp;nbsp;명확히&amp;nbsp;지원하거나,&amp;nbsp;시스템&amp;nbsp;요구사항을&amp;nbsp;충족하는지&amp;nbsp;확인합니다.&amp;nbsp;프로젝트&amp;nbsp;특성에&amp;nbsp;맞춰&amp;nbsp;DTO&amp;nbsp;&amp;rarr;&amp;nbsp;Entity의&amp;nbsp;변화는&amp;nbsp;생략&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Mapper에서 변환 책임 분리&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;DTO&amp;nbsp;&amp;rarr;&amp;nbsp;Entity&amp;nbsp;변환&amp;nbsp;시,&amp;nbsp;값을&amp;nbsp;추가하거나&amp;nbsp;가공하는&amp;nbsp;책임을&amp;nbsp;Mapper에&amp;nbsp;분리하여&amp;nbsp;관리합니다.&lt;br /&gt;&lt;br /&gt;Entity&amp;nbsp;&amp;rarr;&amp;nbsp;&amp;nbsp;View의&amp;nbsp;변환&amp;nbsp;시&amp;nbsp;Use&amp;nbsp;Case를&amp;nbsp;활용&amp;nbsp;합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;값&amp;nbsp;추가가&amp;nbsp;단순한&amp;nbsp;변환&amp;nbsp;이상의&amp;nbsp;비즈니스&amp;nbsp;로직을&amp;nbsp;포함한다면,&amp;nbsp;Use&amp;nbsp;Case&amp;nbsp;계층에서&amp;nbsp;처리하도록&amp;nbsp;설계합니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;3. 추가된 값의 의미 명확히 문서화&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;코드에&amp;nbsp;주석이나&amp;nbsp;문서를&amp;nbsp;통해,&amp;nbsp;왜&amp;nbsp;특정&amp;nbsp;값이&amp;nbsp;추가&amp;nbsp;되었는지&amp;nbsp;설명합니다.&lt;/p&gt;</description>
      <category>프로그래밍/Android</category>
      <category>Android</category>
      <category>Mapper</category>
      <category>Usecase</category>
      <category>가이드</category>
      <category>가이드라이</category>
      <category>개발</category>
      <category>문서화</category>
      <category>안드로이드</category>
      <category>책임분리</category>
      <category>클린아키텍처</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/248</guid>
      <comments>https://faith-developer.tistory.com/248#entry248comment</comments>
      <pubDate>Fri, 31 Jan 2025 00:50:03 +0900</pubDate>
    </item>
    <item>
      <title>Sealed vs Enum 어떤걸 써야하나?</title>
      <link>https://faith-developer.tistory.com/246</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Kotlin 에는 Sealed class 라는 것이 있습니다. 이 Selaed 클래스를 Enum과 같이 사용하는 경우가 많은데요. 이 Sealed Class 를 Enum 대체로 작성하는 것이 옳은 것인지 이해 못하고 사용 하는 분들도 많은거 같습니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;이번 포스트에서는 Sealead Class 에 대한 개념과 Enum&amp;nbsp;&amp;nbsp;클래스의 개념을 정의하고 어떻게 사용하면 좋을지 이야기 해보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Sealed Class 넌 뭐니?&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Sealed 라는 영단어의 뜻을 알면 Sealed Class 에 대해서 이해하기 도움이 될 것입니다. Sealed 는 봉인된 이라는 의미를 갖고 있는데 이 단어의 뜻과 같이 Sealed Class 클래스는 다른 클래스에서 상속하거나 확장할 수 없습니다. 즉, Sealed Class 에서는 SubClass를 생성할 수 없습니다. 이는 일반적으로 클래스 작성자가 추가적인 상속을 방지하고 특정한 디자인 선택이나 제한을 강제하기 위해 선택합니다.&lt;br /&gt;&lt;br /&gt;예를 들어, Kotlin 에서는 다음과 같이 정의할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;sealed class SealedClass
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 클래스 멤버와 메서드
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Selaed Class 의 장단점이 무엇일까?&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Sealed 클래스의 장점&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 명확하고 엄격한 디자인 결정을 제공하여 의도하지 않은 상속을 방지합니다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 일부 상황에서 성능 이점을 제공할 수 있습니다. 컴파일러가 더 많은 최적화를 수행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sealed 클래스의 단점&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 상속을 통한 코드 재사용이 불가능합니다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 특정 디자인 패턴에 대한 제약을 가질 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;우리가 알고 있는 Enum (열거형)&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;`Enum(열거형)`은 프로그래밍에서 사용되는 데이터 형식으로, 특정 도메인과 관련된 상수 값들의 집합을 나타냅니다. Enum은 일련의 상수 값을 정의하고 각 값은 상징적인 이름과 연결됩니다. Enum은 특정한 관련된 값들의 고정된 집합이 있을 때 코드를 더 읽기 쉽고 유지 보수하기 좋게 만드는데 유용합니다.&lt;br /&gt;&lt;br /&gt;예를 들어, Java에서 이렇개 코드가 구성될 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;enum DaysOfWeek
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sunday,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Monday,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tuesday,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wednesday,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thursday,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Friday,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Saturday
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Enum의 장점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 상수 값에 의미 있는 이름을 제공하여 코드의 가독성을 향상시킵니다.&lt;br /&gt;- 기본 타입을 직접 사용하는 것보다 오류 가능성이 낮아집니다.&lt;br /&gt;- 코드의 구조와 유지 보수성을 높여줍니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Enum의 단점&lt;/b&gt;&lt;br /&gt;- Enum 값은 컴파일 시간에 고정되므로 동적인 값 집합에는 다른 데이터 구조보다 덜 유연합니다.&lt;br /&gt;- Enum 값은 런타임에서 확장하거나 수정할 수 없습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;요약하면, `sealed` 클래스는 상속을 제한하여 클래스가 더 이상 확장되지 않도록 하며, `enum`은 고정된 상수 값들의 집합에 대해 이름을 정의하는 데 사용됩니다. 두 개념은 객체 지향 프로그래밍에서 각기 다른 용도로 사용되며 서로 다른 역할을 수행합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;`sealed` 클래스와 `enum` 클래스의 장단점을 알아봤습니다. kotlin 으로 작성된 코드라고 enum을 대신하기 위해서 selaed 클래스 사용하는 것은 지양해야합니다. 상속과 확장을 막기 위해서 sealed 클래스를 사용해야하며, 열거형으로 사용하기 위해서는 enum 클래스를 사용할 것을 권장합니다. &lt;br /&gt;&lt;br /&gt;`enum class` 사용하는 것은 무겁다라고 말하는 개발자도 있습니다. enum class는 타입 안전성과 스코프 제약을 통한 명시적 설계를 제공하는 대신, 약간의 성능 및 메모리 오버헤드가 있을 수 있으며, 이를 &quot;무겁다&quot;고 표현하는 경우가 있습니다. 그러나 이러한 오버헤드는 일반적으로 매우 미미하며, 대다수의 경우 무시할 수 있을 정도로 열거형을 사용할 때는 `enum class` 를 사용해도 메모리에 크게 영향은 없을것으로 보입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;b&gt;한줄요약&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;`sealed class` : 확장하지 않을 봉인할 class 구성 시 사용 할 것&lt;br /&gt;`enum class` 열거형 표현 할 때 사용 할 것&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;참고 및 도움 준 사이트&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;* https://velog.io/@stn/Kotlin-Sealed-Classes-VS-Enum-Classes-VS-Sealed-Inferfaces&lt;br /&gt;* CHAT GTP&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;- 상수 값에 의미 있는 이름을 제공하여 코드의 가독성을 향상시킵니다.&lt;br /&gt;- 기본 타입을 직접 사용하는 것보다 오류 가능성이 낮아집니다.&lt;br /&gt;- 코드의 구조와 유지 보수성을 높여줍니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>프로그래밍/Android</category>
      <category>Android</category>
      <category>ENUM</category>
      <category>enum vs sealed</category>
      <category>sealed class</category>
      <category>sealed vs enum</category>
      <category>selaled</category>
      <category>비교</category>
      <category>열거형</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/246</guid>
      <comments>https://faith-developer.tistory.com/246#entry246comment</comments>
      <pubDate>Thu, 7 Nov 2024 20:11:02 +0900</pubDate>
    </item>
    <item>
      <title>[Android] 클린아키텍처에 대해서 살짝 맛보기</title>
      <link>https://faith-developer.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클린아키텍처에 대해 많은 관심을 갖고 다양한 회사에서 도입 및 시도하고 있습니다.&lt;br&gt;어떻게 구성해야 클린 아키텍처일까요?&lt;br&gt;&amp;nbsp;&lt;br&gt;이상적인 아키텍처에 대해서 로버트 C. 마틴에 의해서 소개 되었으며 복잡한 소프트웨어 시스템을 보다 관리 가능하고 유지보수 가능한 형태로 구축하기 위한 지침을 제공하였습니다.&lt;br&gt;로버트 C.마틴이 말한 클린 아키텍처의 기본적인 개념과 어떻게 Android 환경에서 도입하였는지에 대해서 Medium 에 글이 등재 했는데요. 등재한 글의 일부를 공유하겠습니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;자세한 내용은 &lt;a href=&quot;https://medium.com/cj-onstyle/android-%EB%B2%84%ED%8B%B0%EC%BB%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%98-%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%8F%84%EC%9E%85-a26d833e103c&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;왜 Android 신규 프로젝트는 클린 아키텍처를 도입하였는가?&lt;/span&gt;&lt;/a&gt; 라는 기술블로그 에서 확인 할 수 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;클린 아키텍처를 왜 쓰는걸까?&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K7cjS/btsKn6gdqic/lCdaCKa4AHKghJEm4UHzQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K7cjS/btsKn6gdqic/lCdaCKa4AHKghJEm4UHzQK/img.png&quot; data-alt=&quot;http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K7cjS/btsKn6gdqic/lCdaCKa4AHKghJEm4UHzQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK7cjS%2FbtsKn6gdqic%2FlCdaCKa4AHKghJEm4UHzQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;469&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;클린 아키텍처는 소프트웨어 시스템의 구조를 체계적으로 설계함으로써 여러 가지 장점을 제공하는데요.&lt;br&gt;가장 중요한 장점 중 하나는 시스템의 각 부분을 독립적으로 개발하고 테스트할 수 있는 환경을 조성할 수 있다는 점입니다. 또한 시스템의 변경이나 업그레이드가 필요할 때 전체 시스템을 다시 작성하지 않아도 되며, 특정 부분만 수정하는 것이 가능해집니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;현업에서 일한다면 개발 후 운영의 앱 중 특정 부분의 수정을 요청하는 경우를 경험했을 것입니다.&lt;br&gt; A 회사는 Network 통신 라이브러리인 Retrofit의 Convert Factory를 Moshi Factory로 사용하고 있었습니다.&lt;br&gt;어느날 Moshi Facory가 아닌 Gson Convert Factory 으로 전면 변경하라는 기술 지침이 내려온다면 개발자는 프로젝트 안에서 Network 통신 하는 곳을 모두 찾아서 Moshi Factory 를 Gson Convert Factory 라이브러리로 변경하는 귀찮음과 코드를 찾는 수고가 발생할 수 있습니다.&lt;br&gt;또한 모든 부분을 변경하였다고 생각하였으나, 일부 코드의 미수정으로 인한 사이드이팩이 발생할 수도 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이와 동일한 조건으로 Network 방식을 변경한다면 클린아키텍처로 구성된 코드에서는 Network 통신을 담당하는 Layer 만 확인 후 Network 통신 라이브러리를 변경작업하면 됩니다. 이렇게 한곳에서만 수정하면 모든 코드를 찾으면 하나씩 변경하는 수고는 적게되고 그만큼 사이드이팩에 대한 두려움도 줄어들 것입니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;클린아키텍처 Android 환경 구성 어떻게 해야할까?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;클린 아키텍처를 Android 의 구조에 맞춰서 개발하는 가이드라인은 Google Developer Document(&lt;a href=&quot;https://developer.android.com/topic/architecture&quot; target=&quot;_self&quot;&gt;&lt;span&gt;Guilde to app architecture&lt;/span&gt;&lt;/a&gt;) 에 명시되어 있어 참고해서 개발할 수 있습니다. Google Developer Document 을 참고하기에 어렵다면 참고할 만한 다수의 블로그가 존재하기에 그것을 참고해서 작성하셔도 됩니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;여기서 중요한 것은 각 계층인 Layer 를 분리해야합니다. 예를들어서 Presentation Layer, Domain Layer, Data Layer는 하나의 모듈에서 존재하는 것보다 각각 Module 구성을 하여 의존성을 낮추는게 중요합니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: #0070D1;&quot;&gt;왜 Android 신규 프로젝트는 클린 아키텍처를 도입하였는가?&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 에 명시되어 있는 Flow 를 참고하시면 Presentation, Domain, Data Layer는 분리되어 있고, Domain은 어느 모듈도 의존하고 있지 않도록 구성되어 있습니다.&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwlZTo/btsKnV0e1I0/5fEBn7e4iHtb19N2HPzdAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwlZTo/btsKnV0e1I0/5fEBn7e4iHtb19N2HPzdAK/img.png&quot; data-alt=&quot;https://medium.com/cj-onstyle/android-%EB%B2%84%ED%8B%B0%EC%BB%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%98-%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%8F%84%EC%9E%85-a26d833e103c&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwlZTo/btsKnV0e1I0/5fEBn7e4iHtb19N2HPzdAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwlZTo%2FbtsKnV0e1I0%2F5fEBn7e4iHtb19N2HPzdAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1056&quot; height=&quot;441&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://medium.com/cj-onstyle/android-%EB%B2%84%ED%8B%B0%EC%BB%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%98-%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%8F%84%EC%9E%85-a26d833e103c&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;클린아키텍처를 도입할 프로젝트의 개발 환경 및 비즈니스 로직의 구성에 따라서 Domain Layer 부분이 생략 될 수 도 있습니다.&amp;nbsp;&lt;br&gt;Google 에서도 Domain 은 optional 하게 가이드하고 있어서 상황에 맞게 구성할 것을 추천드립니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;Mapper 는 왜 존재할까?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424;&quot;&gt;Mapper는 API 에서 내려준 DTO(&lt;/span&gt;&lt;b&gt;Data Transfer Object&lt;/b&gt;&lt;span style=&quot;color: #242424;&quot;&gt;)를 UI에 적합한 Entity로 변경하는 기능을 담당하고 있습니다. 이 말은 클린아키텍처 구조에서 설명하자면, Data Layer에서 API 로 전달받은 DTO 를 Domain Layer 에서 UI 에서 사용하기 좋은 형태인 Entity로 변경한다고 보시면됩니다.&amp;nbsp; 다시말해&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;UI 에서 사용할 데이터는 API에서 내려준 Data와 동일할 필요가 없으며, UI에 최적하게 재배치를 할 수 있는 환경을 Mapper가 제공한다고 이해하시면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: #242424;&quot;&gt;Mapper 의 또 다른 존재 이유는 디버깅 환경 구성입니다.&lt;/span&gt;&lt;br&gt;API 가 개발 안된 상태에서 기능 개발은 어려움이 있어 대부분의 회사에서는 API 가 개발되기 전에 Mock 데이터를 제공하고 있습니다.&lt;br&gt;Mock 데이터 구성을 Mapper를 통해서 UI에 맞춰서 구성한다면, UI와 비즈니스로직 그리고 Mock 데이터 간의 코드 분리 및 의존성을 낮춰 추후 API 개발 완료 시 Mock 데이터에서 API 데이터로 연결만 변경하여 쉽게 Data 전환이 가능합니다.&lt;br&gt;&amp;nbsp;&lt;br&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;클린아키텍처에 대해서 간단히 알아보고 어떻게 Android 에서 클린아키텍처를 구성에 대해서 간략히 가이드하였습니다.&amp;nbsp;&lt;br&gt;아키텍처를 왜 사용하는지에 대해서 의문을 갖고 있는 분들이 있을 것입니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;필자가 생각하기에는 아키텍처는 협업의 소통 도구라고 생각됩니다. 코드로 소통하는 개발자는 보통 사람과의 대화보다 명확히 의사 전달을 하고 있습니다. 따라서 인수인계를 위해서 몇 시간 회의실에서 인수인계를 진행하는 것보다 아키텍처를 소개하고 아키텍처의 구조에 맞춰 개발할 것을 가이드한다면, 코드의 통일성 및 가독성이 올라갈 것입니다.&amp;nbsp; 이점을 참고해서 클린아키텍처를 도입하는 것을 고려해도 좋을거 같습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;클린아키텍처의 대한 자세한 내용은 Medium(&lt;span style=&quot;color: #0070D1;&quot;&gt;왜 Android 신규 프로젝트는 클린 아키텍처를 도입하였는가?&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; ) 에서 확인할 수 있으며, 본 기술블로그에 등재된 '같이보면 좋은글'의 클린아키텍처 관련 글을 읽는 것도 추천드립니다.&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Android</category>
      <category>Android</category>
      <category>Clean Architecture</category>
      <category>data</category>
      <category>domain</category>
      <category>Mapper</category>
      <category>presentation</category>
      <category>로버트 c.마틴</category>
      <category>아키텍처</category>
      <category>클린아키텍처</category>
      <category>환경구성</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/245</guid>
      <comments>https://faith-developer.tistory.com/245#entry245comment</comments>
      <pubDate>Tue, 29 Oct 2024 00:18:20 +0900</pubDate>
    </item>
    <item>
      <title>미션차이나센터 개인정보 취급방침</title>
      <link>https://faith-developer.tistory.com/244</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보취급방침&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 수집하는 개인정보 항목&lt;/b&gt;&lt;br /&gt;이 앱은 사용자의 개인정보를 수집하지 않습니다. 다만, 앱의 정상적인 기능을 제공하기 위해 일부 기본적인 데이터(예: 앱 사용 기록, 오류 보고)가 자동으로 수집될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 개인정보 수집 목적&lt;/b&gt;&lt;br /&gt;수집된 데이터는 앱의 성능 개선 및 오류 수정 목적으로만 사용됩니다. 이 정보는 어떠한 개인 식별 정보를 포함하지 않으며, 광고나 마케팅 목적으로 사용되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 개인정보 보유 및 이용 기간&lt;/b&gt;&lt;br /&gt;이 앱은 개인정보를 저장하지 않으며, 자동 수집된 데이터는 문제 해결 및 성능 개선을 위한 용도로만 사용된 후 즉시 삭제됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 개인정보 제3자 제공&lt;/b&gt;&lt;br /&gt;사용자의 개인정보를 제3자에게 제공하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 이용자의 권리&lt;/b&gt;&lt;br /&gt;이 앱은 개인정보를 수집하지 않기 때문에 별도의 권리 행사는 필요하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 개인정보 보호책임자&lt;/b&gt;&lt;br /&gt;개인정보와 관련된 문의 사항이 있을 경우 아래의 연락처로 문의해 주시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름&amp;nbsp;:&amp;nbsp;신규찬&lt;br /&gt;메일&amp;nbsp;:&amp;nbsp; dev.faithpeole@gmail.com&lt;/p&gt;</description>
      <category>Application/MCC</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/244</guid>
      <comments>https://faith-developer.tistory.com/244#entry244comment</comments>
      <pubDate>Tue, 22 Oct 2024 23:30:02 +0900</pubDate>
    </item>
    <item>
      <title>고시문헬퍼 개인정보 취급 방침</title>
      <link>https://faith-developer.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본 개발자가 작성한 앱은 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원할하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-96a6df1f-fcd8-4bac-814e-83c1b8119a1e&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​1. 개인정보의 처리 목적&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5c9c6fd4-fa22-41fb-a546-30e1b07adc7c&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;- 광고ID(AdID) 수집 목적&lt;br /&gt;&lt;/span&gt;Google은 사용자에게 더 많은 선택권을 제공하기 위해 광고 및 분석 작업에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 대표적으로 게재할 광고를 맞춤설정하고 앱 사용 방식을 파악하는데 유용합니다.&lt;br /&gt;예를 들어 광고를 게재한 뒤에 마케팅 측에서 문맥광고, 게재빈도 설정, 전환 추적, 보고 및 보안, 사기 감지 작업을 수행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;자세히 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://support.google.com/googleplay/answer/3405269&quot;&gt;https://support.google.com/googleplay/answer/3405269&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727001788260&quot; style=&quot;color: #333333; text-align: start;&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;광고 ID - Google Play 고객센터&quot; data-og-description=&quot;Google Play는 사용자 관리 기능의 향상을 위해 광고 및 분석에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고 ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 특히나 광고를 맞춤설정하고&quot; data-og-host=&quot;support.google.com&quot; data-og-source-url=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-og-url=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-og-image=&quot;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-source-url=&quot;https://support.google.com/googleplay/answer/3405269&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 ID - Google Play 고객센터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Play는 사용자 관리 기능의 향상을 위해 광고 및 분석에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고 ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 특히나 광고를 맞춤설정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;support.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;SE-7c7d8816-789f-4de7-9ff2-bb111e5d90c2&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span&gt;가. 애드몹 관련 정보&lt;br /&gt;- 애드몹 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://admob.google.com/home/&quot;&gt;https://admob.google.com/home/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2. 개인정보의 처리 및 보유 기간&lt;br /&gt;앱은 정보 주체로부터 개인정보를 수집 할 때 동의 받은 개인정보 보유 이용기간 또는 법령에 따른 개인정보 보유 이용기간 내에서 개인정보를 처리 보유하며 구체적인 개인정보 처리 및 보유 기간은 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;가. 개발자가 데이터를 수집하거나 저장하지 않습니다.&lt;br /&gt;&lt;br /&gt;광고 및 광고분석 서비스에서(이하 Google) 수집하는 광고 ID에 관한 자세한 사항은 해당 서비스의 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko)를&quot;&gt;https://policies.google.com/privacy?hl=ko)를&lt;/a&gt; 참고해 주시기 바랍니다.&lt;br /&gt;&lt;br /&gt;3. 개인정보의 제 3자 제공&lt;br /&gt;앱은 정보주체의 별도 동의, 법률의 특별한 규정 등 개인정보 보호법 제 17조에 해당하는 경우 외에는 개인정보를 제 3자에게 제공하지 않습니다.&lt;br /&gt;&lt;br /&gt;4. 개인정보처리 위탁&lt;br /&gt;위탁하는 업무의 내용 : 광고 및 광고 분석 서비스&lt;br /&gt;Google 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko&quot;&gt;https://policies.google.com/privacy?hl=ko&lt;/a&gt;)&lt;br /&gt;Google 광고 개인정보 보호 및 약관 (&lt;a href=&quot;https://policies.google.com/technologies/ads?hl=ko&quot;&gt;https://policies.google.com/technologies/ads?hl=ko&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;5. 처리하는 개인정보의 항목&lt;br /&gt;- 광고ID(AdID) 수집 (과정에서 사용자의 IP수집이 포함될 수 있습니다.)&lt;br /&gt;개발자 본인이 아닌 광고 및 광고 분석 서비스(이하 Google)에 의해 광고 식별자인 Android 광고 ID가 수집 될 수 있습니다.&lt;br /&gt;이는 기기의 설정(Google 설정앱 -&amp;gt; Google -&amp;gt; 광고 또는 설정 -&amp;gt; 계정 -&amp;gt; Google -&amp;gt; 광고)을 변경함으로 사용을 거부 할 수 있습니다.&lt;br /&gt;또한 광고 추적을 선택 해제한 사용자가 해당 식별자를 재설정하여 광고 추적을 선택 해제하기 전에 수집 및 전달된 리마케팅 데이터로부터 기기의 연결을 해제 할 수 있습니다.&lt;br /&gt;Google 서비스에서 수집하는 정보는 각 서비스가 사용하는 저장소에만 수집, 저장되며 본 서비스에서 별도로 저장하지 않습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;6. 개인정보의 파기에 관한 사항&lt;br /&gt;개발자가 데이터를 수집하거나 저장하지 않습니다.&lt;br /&gt;광고 및 광고분석 서비스에서(이하 Google) 수집하는 광고 ID에 관한 자세한 사항은 해당 서비스의 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko&quot;&gt;https://policies.google.com/privacy?hl=ko&lt;/a&gt;)을 참고해 주시길 바랍니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;7. 개인정보 관리 책임자 및 담당자의 연락처&lt;br /&gt;귀하께서는 앱의 서비스를 이용하시며 발생하는 모든 개인정보 보호 관련 민원을 개인정보 관리 책임자 혹은 담당부서로 신고하실 수 있습니다. 앱은 이용자들의 신고사항에 대해 신속하게 충분한 답변을 드릴 것입니다.&lt;br /&gt;이름 : 신규찬&lt;br /&gt;메일 :  dev.faithpeole@gmail.com&lt;/p&gt;</description>
      <category>Application/고시문헬퍼</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/243</guid>
      <comments>https://faith-developer.tistory.com/243#entry243comment</comments>
      <pubDate>Sun, 22 Sep 2024 19:43:15 +0900</pubDate>
    </item>
    <item>
      <title>스코어헬퍼 개인정보 취급 방침</title>
      <link>https://faith-developer.tistory.com/242</link>
      <description>&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본 개발자가 작성한 앱은 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원할하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-96a6df1f-fcd8-4bac-814e-83c1b8119a1e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​1. 개인정보의 처리 목적&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5c9c6fd4-fa22-41fb-a546-30e1b07adc7c&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;- 광고ID(AdID) 수집 목적&lt;br /&gt;&lt;/span&gt;Google은 사용자에게 더 많은 선택권을 제공하기 위해 광고 및 분석 작업에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 대표적으로 게재할 광고를 맞춤설정하고 앱 사용 방식을 파악하는데 유용합니다.&lt;br /&gt;예를 들어 광고를 게재한 뒤에 마케팅 측에서 문맥광고, 게재빈도 설정, 전환 추적, 보고 및 보안, 사기 감지 작업을 수행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;자세히 : &lt;a href=&quot;https://support.google.com/googleplay/answer/3405269&quot;&gt;https://support.google.com/googleplay/answer/3405269&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727001638669&quot; contenteditable=&quot;false&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-og-source-url=&quot;https://support.google.com/googleplay/answer/3405269&quot; data-og-host=&quot;support.google.com&quot; data-og-description=&quot;Google Play는 사용자 관리 기능의 향상을 위해 광고 및 분석에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고 ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 특히나 광고를 맞춤설정하고&quot; data-og-title=&quot;광고 ID - Google Play 고객센터&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://support.google.com/googleplay/answer/3405269&quot; data-source-url=&quot;https://support.google.com/googleplay/answer/3405269&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 ID - Google Play 고객센터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Play는 사용자 관리 기능의 향상을 위해 광고 및 분석에 사용할 수 있는 재설정 가능한 식별자인 앱용 광고 ID를 도입했습니다. 이 식별자는 여러 용도가 있지만 특히나 광고를 맞춤설정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;support.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;SE-7c7d8816-789f-4de7-9ff2-bb111e5d90c2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span&gt;가. 애드몹 관련 정보&lt;br /&gt;- 애드몹 : &lt;a href=&quot;https://admob.google.com/home/&quot;&gt;https://admob.google.com/home/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2. 개인정보의 처리 및 보유 기간&lt;br /&gt;앱은 정보 주체로부터 개인정보를 수집 할 때 동의 받은 개인정보 보유 이용기간 또는 법령에 따른 개인정보 보유 이용기간 내에서 개인정보를 처리 보유하며 구체적인 개인정보 처리 및 보유 기간은 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;가. 개발자가 데이터를 수집하거나 저장하지 않습니다.&lt;br /&gt;&lt;br /&gt;광고 및 광고분석 서비스에서(이하 Google) 수집하는 광고 ID에 관한 자세한 사항은 해당 서비스의 개인정보처리방침(https://policies.google.com/privacy?hl=ko)를 참고해 주시기 바랍니다.&lt;br /&gt;&lt;br /&gt;3. 개인정보의 제 3자 제공&lt;br /&gt;앱은 정보주체의 별도 동의, 법률의 특별한 규정 등 개인정보 보호법 제 17조에 해당하는 경우 외에는 개인정보를 제 3자에게 제공하지 않습니다.&lt;br /&gt;&lt;br /&gt;4. 개인정보처리 위탁&lt;br /&gt;위탁하는 업무의 내용 : 광고 및 광고 분석 서비스&lt;br /&gt;Google 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/technologies/ads?hl=ko&quot;&gt;https://policies.google.com/privacy?hl=ko&lt;/a&gt;)&lt;br /&gt;Google 광고 개인정보 보호 및 약관 (&lt;a href=&quot;https://policies.google.com/technologies/ads?hl=ko&quot;&gt;https://policies.google.com/technologies/ads?hl=ko&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;5. 처리하는 개인정보의 항목&lt;br /&gt;- 광고ID(AdID) 수집 (과정에서 사용자의 IP수집이 포함될 수 있습니다.)&lt;br /&gt;개발자 본인이 아닌 광고 및 광고 분석 서비스(이하 Google)에 의해 광고 식별자인 Android 광고 ID가 수집 될 수 있습니다.&lt;br /&gt;이는 기기의 설정(Google 설정앱 -&amp;gt; Google -&amp;gt; 광고 또는 설정 -&amp;gt; 계정 -&amp;gt; Google -&amp;gt; 광고)을 변경함으로 사용을 거부 할 수 있습니다.&lt;br /&gt;또한 광고 추적을 선택 해제한 사용자가 해당 식별자를 재설정하여 광고 추적을 선택 해제하기 전에 수집 및 전달된 리마케팅 데이터로부터 기기의 연결을 해제 할 수 있습니다.&lt;br /&gt;Google 서비스에서 수집하는 정보는 각 서비스가 사용하는 저장소에만 수집, 저장되며 본 서비스에서 별도로 저장하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 개인정보의 파기에 관한 사항&lt;br /&gt;개발자가 데이터를 수집하거나 저장하지 않습니다.&lt;br /&gt;광고 및 광고분석 서비스에서(이하 Google) 수집하는 광고 ID에 관한 자세한 사항은 해당 서비스의 개인정보처리방침(&lt;a href=&quot;https://policies.google.com/privacy?hl=ko&quot;&gt;https://policies.google.com/privacy?hl=ko&lt;/a&gt;)을 참고해 주시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 개인정보 관리 책임자 및 담당자의 연락처&lt;br /&gt;귀하께서는 앱의 서비스를 이용하시며 발생하는 모든 개인정보 보호 관련 민원을 개인정보 관리 책임자 혹은 담당부서로 신고하실 수 있습니다. 앱은 이용자들의 신고사항에 대해 신속하게 충분한 답변을 드릴 것입니다.&lt;br /&gt;이름 : 신규찬&lt;br /&gt;메일 :  dev.faithpeole@gmail.com&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Application/스코어헬퍼</category>
      <author>규샤인</author>
      <guid isPermaLink="true">https://faith-developer.tistory.com/242</guid>
      <comments>https://faith-developer.tistory.com/242#entry242comment</comments>
      <pubDate>Sun, 22 Sep 2024 19:42:51 +0900</pubDate>
    </item>
  </channel>
</rss>