<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>NicoDora의 블로그</title>
    <link>https://nicodora.tistory.com/</link>
    <description>잊어버리니 블로그에 잘 담아두자.</description>
    <language>ko</language>
    <pubDate>Sat, 22 Aug 2026 06:52:04 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NicoDora</managingEditor>
    <image>
      <title>NicoDora의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/5912963/attach/cdf78934131941c7bf2ee1d27ae7c519</url>
      <link>https://nicodora.tistory.com</link>
    </image>
    <item>
      <title>[Biome] Prettier보다 35배 더 빠르다는 Biome을 써보자</title>
      <link>https://nicodora.tistory.com/entry/Biome-Prettier%EB%B3%B4%EB%8B%A4-35%EB%B0%B0-%EB%8D%94-%EB%B9%A0%EB%A5%B4%EB%8B%A4%EB%8A%94-Biome%EC%9D%84-%EC%8D%A8%EB%B3%B4%EC%9E%90</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #006A71 2px solid; margin: 10px 0px; border-left: #006A71 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[Biome] Prettier보다 35배 더 빠르다는 Biome을 써보자&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prettier와 ESLint를 사용중인 프로젝트에서 Biome을 설치하고 마이그레이션하여 성능 차이가 얼마나 나는지 확인해 볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #48A6A7;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Biome이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Biome는 웹 개발을 위한 통합 툴체인으로, 코드 포매팅과 린팅을 빠르고 효율적으로 처리하는 도구이다.&lt;/span&gt; &lt;span&gt;JavaScript, TypeScript, JSX, TSX, JSON, CSS, GraphQL 등 다양한 언어를 지원하며, 기존의 여러 도구들을 하나로 통합하여 개발자 경험을 향상시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;지금까지는 포매터는 Prettier, 린터는 ESLint 조합이 거의 국룰로 쓰였는데 하는 일이 비슷한데 패키지를 따로 관리해줘야 한다는 점은 개발자에게 귀찮음과 유지보수를 하기 어렵게 만들었고, &lt;/span&gt;&lt;span&gt;이러한 단점을 해결하기 위해서 Biome이 만들어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Biome은 Prettier와 97% 호환되며, Rust 언어로 개발되어 &lt;b&gt;Prettier 대비 최대 35배 빠른 속도&lt;/b&gt;로 포매팅 할 수 있다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 2.00.06.png&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkLM2r/btsNhk5vVTn/ByJqbrviXP3l554Ekxvem1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkLM2r/btsNhk5vVTn/ByJqbrviXP3l554Ekxvem1/img.png&quot; data-alt=&quot;Biome과 Prettier 속도 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkLM2r/btsNhk5vVTn/ByJqbrviXP3l554Ekxvem1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkLM2r%2FbtsNhk5vVTn%2FByJqbrviXP3l554Ekxvem1%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;2236&quot; height=&quot;1338&quot; data-filename=&quot;스크린샷 2025-04-11 오후 2.00.06.png&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;1338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Biome과 Prettier 속도 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint 및 TypeScript ESLint에서 270개 이상의 린팅 규칙을 포함하고 있기 때문에 거의 대부분의 린팅 규칙이 호한된다고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 안정된 프로젝트가 아니고 커뮤니티가 작은 단점이 있긴 하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도가 매우 빠르고 지금 개발중인 프로젝트에 린터, 포매터 규칙이 복잡하지 않아서 Biome으로 마이그레이션 할만 하다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Biome 설치하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 디렉토리에 Biome을 설치하는 방법은 매우 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://biomejs.dev/guides/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://biomejs.dev/guides/getting-started/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744348388389&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Getting Started&quot; data-og-description=&quot;Learn how to set up a new project with Biome.&quot; data-og-host=&quot;biomejs.dev&quot; data-og-source-url=&quot;https://biomejs.dev/guides/getting-started/&quot; data-og-url=&quot;https://biomejs.dev/guides/getting-started/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cKzz3r/hyYFDcM8nJ/0lNeusRpQpSvgmekli7yH1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/fKHif/hyYCaiYN0R/xOHSomqYyE3hIsCkdJgKNk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://biomejs.dev/guides/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://biomejs.dev/guides/getting-started/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cKzz3r/hyYFDcM8nJ/0lNeusRpQpSvgmekli7yH1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/fKHif/hyYCaiYN0R/xOHSomqYyE3hIsCkdJgKNk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to set up a new project with Biome.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;biomejs.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome에서 제공하는 공식 문서를 참고해서 설치해 보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 공식 문서에서 각 패키지 매니저에 따라 명령어를 제공하고 있으므로 다른 패키지 매니저를 사용한다면 반드시 공식 문서를 참고해서 설치하기 바란다. 필자는 npm을 쓰고 있어서 npm을 기준으로 설명할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 Biome을 설치할 디렉터리로 이동하고 아래 명령어를 입력해서 설치를 진행하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744351986806&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save-dev --save-exact @biomejs/biome&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 devDependencies에 &lt;b&gt;@biomejs/biome&lt;/b&gt; 패키지가 추가된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.24.30.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KjOXX/btsNh6Thh5T/GZvyVeALSdYDyZQmEaWHkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KjOXX/btsNh6Thh5T/GZvyVeALSdYDyZQmEaWHkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KjOXX/btsNh6Thh5T/GZvyVeALSdYDyZQmEaWHkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKjOXX%2FbtsNh6Thh5T%2FGZvyVeALSdYDyZQmEaWHkk%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;1850&quot; height=&quot;1174&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.24.30.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 init 명령어를 통해 Biome 설정 파일을 만들어주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744352540335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx @biomejs/biome init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 biome.json 이름의 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.26.54.png&quot; data-origin-width=&quot;2758&quot; data-origin-height=&quot;1670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjro2a/btsNikX3OGy/UntWkQuIqiTPxOZ2x2RmOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjro2a/btsNikX3OGy/UntWkQuIqiTPxOZ2x2RmOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjro2a/btsNikX3OGy/UntWkQuIqiTPxOZ2x2RmOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjro2a%2FbtsNikX3OGy%2FUntWkQuIqiTPxOZ2x2RmOk%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;2758&quot; height=&quot;1670&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.26.54.png&quot; data-origin-width=&quot;2758&quot; data-origin-height=&quot;1670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 프로젝트에 적용시킨다면 이제 해당 파일 내부에 formatter 필드와 linter 필드에 규칙을 추가해서 사용하면 되지만, 필자는 이미 Prettier와 ESLint를 사용중인 프로젝트에서 Biome으로 변경하는 것 이므로 마이그레이션 작업이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Prettier, ESLint에서 Biome으로 마이그레이션하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prettier, ESLint에서 Biome으로 마이그레이션 하는 것도 설치하는 것 처럼 명령어 딸깍으로 간편하게 마이그레이션이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션 하는 방법도 공식문서에 잘 작성되어 있으므로 참고해서 진행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://biomejs.dev/guides/migrate-eslint-prettier/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://biomejs.dev/guides/migrate-eslint-prettier/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744353608446&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Migrate from ESLint and Prettier&quot; data-og-description=&quot;Learn how you can ease your migration from ESLint and Prettier&quot; data-og-host=&quot;biomejs.dev&quot; data-og-source-url=&quot;https://biomejs.dev/guides/migrate-eslint-prettier/&quot; data-og-url=&quot;https://biomejs.dev/guides/migrate-eslint-prettier/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjDXWO/hyYChoVWRu/UuHCzrRgV0Leyv15OLHhhk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b0PdUj/hyYFBMO1Or/Xk5ezse0gSAQGdmrTkIz21/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://biomejs.dev/guides/migrate-eslint-prettier/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://biomejs.dev/guides/migrate-eslint-prettier/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjDXWO/hyYChoVWRu/UuHCzrRgV0Leyv15OLHhhk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b0PdUj/hyYFBMO1Or/Xk5ezse0gSAQGdmrTkIz21/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Migrate from ESLint and Prettier&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how you can ease your migration from ESLint and Prettier&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;biomejs.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 입력해서 마이그레이션을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744353549167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx @biomejs/biome migrate eslint --write
npx @biomejs/biome migrate prettier --write&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션을 진행하고 나면 기존에 Prettier와 ESLint에 저장된 설정들이 불러와지는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.46.00.png&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;1430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btLJxL/btsNhnnZiEx/j1LJdmegGzZkxoajUxpfDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btLJxL/btsNhnnZiEx/j1LJdmegGzZkxoajUxpfDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btLJxL/btsNhnnZiEx/j1LJdmegGzZkxoajUxpfDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtLJxL%2FbtsNhnnZiEx%2Fj1LJdmegGzZkxoajUxpfDk%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;1638&quot; height=&quot;1430&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.46.00.png&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;1430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Biome vs Prettier, ESLint 성능 비교&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome 설치 및 마이그레이션이 완료되었으므로 과연 Prettier, ESLint와 성능차이가 얼마나 날지 테스트 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/src 폴더 내부에 코드가 총 19,357 라인인 프로젝트에서 테스트를 진행하려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.54.55.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cExhGT/btsNinN4quD/78BmuuJ50EbUp1KnTZDgM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cExhGT/btsNinN4quD/78BmuuJ50EbUp1KnTZDgM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cExhGT/btsNinN4quD/78BmuuJ50EbUp1KnTZDgM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcExhGT%2FbtsNinN4quD%2F78BmuuJ50EbUp1KnTZDgM1%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;1442&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2025-04-11 오후 3.54.55.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 ESLint와 Biome을 비교해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint :&lt;/p&gt;
&lt;pre id=&quot;code_1744354811191&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time npx eslint src&lt;/code&gt;&lt;/pre&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;스크린샷 2025-04-11 오후 4.01.41.png&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o2qkE/btsNiK21ASO/5e54Zmda4DKjSp9f44M9W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o2qkE/btsNiK21ASO/5e54Zmda4DKjSp9f44M9W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o2qkE/btsNiK21ASO/5e54Zmda4DKjSp9f44M9W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo2qkE%2FbtsNiK21ASO%2F5e54Zmda4DKjSp9f44M9W0%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;410&quot; data-filename=&quot;스크린샷 2025-04-11 오후 4.01.41.png&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome :&lt;/p&gt;
&lt;pre id=&quot;code_1744356012578&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time npx @biomejs/biome lint src&lt;/code&gt;&lt;/pre&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;스크린샷 2025-04-11 오후 4.23.10.png&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XOUXq/btsNijkHMTo/qXztWtAME1DkzCEjfgymTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XOUXq/btsNijkHMTo/qXztWtAME1DkzCEjfgymTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XOUXq/btsNijkHMTo/qXztWtAME1DkzCEjfgymTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXOUXq%2FbtsNijkHMTo%2FqXztWtAME1DkzCEjfgymTk%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;1758&quot; height=&quot;246&quot; data-filename=&quot;스크린샷 2025-04-11 오후 4.23.10.png&quot; data-origin-width=&quot;1758&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ESLint 5.293초, Biome 0.754초가 걸렸다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 Prettier와 Biome을 비교해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prettier :&lt;/p&gt;
&lt;pre id=&quot;code_1744356494577&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time npx prettier src&lt;/code&gt;&lt;/pre&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;스크린샷 2025-04-11 오후 4.28.37.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X8imZ/btsNh5Ux73b/kt3myMk9HJ4eobNNCKX8OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X8imZ/btsNh5Ux73b/kt3myMk9HJ4eobNNCKX8OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X8imZ/btsNh5Ux73b/kt3myMk9HJ4eobNNCKX8OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX8imZ%2FbtsNh5Ux73b%2Fkt3myMk9HJ4eobNNCKX8OK%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;1520&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2025-04-11 오후 4.28.37.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome :&lt;/p&gt;
&lt;pre id=&quot;code_1744356615378&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time npx @biomejs/biome format src&lt;/code&gt;&lt;/pre&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;스크린샷 2025-04-11 오후 4.35.23.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mB21o/btsNg9IUMLf/h8evIvr0nnVyJByIrMxNT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mB21o/btsNg9IUMLf/h8evIvr0nnVyJByIrMxNT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mB21o/btsNg9IUMLf/h8evIvr0nnVyJByIrMxNT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmB21o%2FbtsNg9IUMLf%2Fh8evIvr0nnVyJByIrMxNT1%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;1542&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2025-04-11 오후 4.35.23.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Prettier 1.718초, Biome 0.773초가 걸렸다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 환경에서 테스트 해보면 각각&amp;nbsp;&lt;b&gt;ESLint보다 약 7배, Prettier보다 약 2배 더 빨랐다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 Biome에서는 lint와 format 명령어를 check 명령어를 통해서 한번에 실행할 수 있는데, 해당 명령어를 사용하면 0.772초가 걸렸다.&lt;/p&gt;
&lt;pre id=&quot;code_1744372825153&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time npx @biomejs/biome check src&lt;/code&gt;&lt;/pre&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;스크린샷 2025-04-11 오후 9.00.44.png&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9rqmK/btsNiOkD7Fw/5O9fIMkK22u9c5OWwumD2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9rqmK/btsNiOkD7Fw/5O9fIMkK22u9c5OWwumD2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9rqmK/btsNiOkD7Fw/5O9fIMkK22u9c5OWwumD2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9rqmK%2FbtsNiOkD7Fw%2F5O9fIMkK22u9c5OWwumD2K%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;2094&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2025-04-11 오후 9.00.44.png&quot; data-origin-width=&quot;2094&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 명령어를 전부 실행하는 속도를 비교해보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint(5.293초) + Prettier(1.718초) = 7.011초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome = 0.772초&lt;/p&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;Biome이 약 9배 더 빠르다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;vscode extension 설치하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 코드 에디터에서 포매팅을 사용하기 위해서 Biome extension을 설치해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 4.54.36.png&quot; data-origin-width=&quot;2356&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgECgs/btsNijZtFdG/lKEpKPwRQCfKjftDUARMUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgECgs/btsNijZtFdG/lKEpKPwRQCfKjftDUARMUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgECgs/btsNijZtFdG/lKEpKPwRQCfKjftDUARMUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgECgs%2FbtsNijZtFdG%2FlKEpKPwRQCfKjftDUARMUk%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;2356&quot; height=&quot;840&quot; data-filename=&quot;스크린샷 2025-04-11 오후 4.54.36.png&quot; data-origin-width=&quot;2356&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;extension을 설치하면 아래처럼 에디터에서도 에러가 표시되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.09.24.png&quot; data-origin-width=&quot;2140&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tkWkJ/btsNiqKNBGN/zXOZn1SUdlHkFIP1mGFDt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tkWkJ/btsNiqKNBGN/zXOZn1SUdlHkFIP1mGFDt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tkWkJ/btsNiqKNBGN/zXOZn1SUdlHkFIP1mGFDt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtkWkJ%2FbtsNiqKNBGN%2FzXOZn1SUdlHkFIP1mGFDt1%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;2140&quot; height=&quot;832&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.09.24.png&quot; data-origin-width=&quot;2140&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;장단점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;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;1. 속도가 빠르다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 Prettier, ESLint 조합보다 속도가 빨라 시원시원하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에서도 그렇지만 github actions로 CI 작업할 때 그 차이를 실감할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균적으로 40~50초가 걸리던 CI가 Biome으로 바꾸고 4초밖에 걸리지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 ESLint :&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-12 오후 3.00.41.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhGWtr/btsNiWhY8Yt/w2vPovjeqPLomkkDc393J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhGWtr/btsNiWhY8Yt/w2vPovjeqPLomkkDc393J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhGWtr/btsNiWhY8Yt/w2vPovjeqPLomkkDc393J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhGWtr%2FbtsNiWhY8Yt%2Fw2vPovjeqPLomkkDc393J0%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;1672&quot; height=&quot;694&quot; data-filename=&quot;스크린샷 2025-04-12 오후 3.00.41.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome으로 바꾼 후 :&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-12 오후 3.00.56.png&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dME0zv/btsNklhf3vf/BJZDY972g8nTiy2u3yn400/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dME0zv/btsNklhf3vf/BJZDY972g8nTiy2u3yn400/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dME0zv/btsNklhf3vf/BJZDY972g8nTiy2u3yn400/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdME0zv%2FbtsNklhf3vf%2FBJZDY972g8nTiy2u3yn400%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;1680&quot; height=&quot;686&quot; data-filename=&quot;스크린샷 2025-04-12 오후 3.00.56.png&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 에러를 매우 친절하게 띄워준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 어디서 발생했는지, 원인이 뭔지, 어떻게 수정해야 하는지 수정 예시까지 보여주는 모습에 감동했다...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.14.51.png&quot; data-origin-width=&quot;2246&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E6xoY/btsNiZS9OFy/I86kA7hJT95SIZAoTAE9Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E6xoY/btsNiZS9OFy/I86kA7hJT95SIZAoTAE9Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E6xoY/btsNiZS9OFy/I86kA7hJT95SIZAoTAE9Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE6xoY%2FbtsNiZS9OFy%2FI86kA7hJT95SIZAoTAE9Y1%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;2246&quot; height=&quot;762&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.14.51.png&quot; data-origin-width=&quot;2246&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색상도 알록달록 넣어줘서 개인적으론 ESLint보다 Biome이 더 가독성이 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. ESLint에는 없는 규칙이 Biome에는 존재한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint에는 없거나 기본적으로 사용하지 않는 규칙이 Biome에서는 기본값으로 사용하도록 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(반대로 ESLint에 있는 규칙이 Biome에선 없을 수도 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;noForEach 규칙이 기본값으로 들어가 있어서 forEach() 함수를 썼더니 혼났다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 ESLint에서는 명시조차 하지 않았던 규칙이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.37.31.png&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beQq53/btsNjzsYWBL/r9ZYoCqfZasVD8skv4mwc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beQq53/btsNjzsYWBL/r9ZYoCqfZasVD8skv4mwc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beQq53/btsNjzsYWBL/r9ZYoCqfZasVD8skv4mwc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeQq53%2FbtsNjzsYWBL%2Fr9ZYoCqfZasVD8skv4mwc0%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;2022&quot; height=&quot;602&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.37.31.png&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 Biome에서 기본값으로 설정되어 있는 규칙들이 있어서 많은 파일들이 빨개지는 매직을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션 시에는 사용하지 않는 규칙들을 풀어줘야 하는 번거로움이 존재했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;2. 아직 지원하지 않는 언어가 존재한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹개발에 쓰이는 대부분의 언어는 지원하지만 몇몇 언어는 아직 작업중이거나 지원하지 않는 언어들이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 프로젝트에서 자주 사용되는 언어가 지원되지 않는다면 사용하기 어려울 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.46.57.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;1366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Vbr0/btsNitgCTJU/jXPxqBrjet2vkck6ddXvsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Vbr0/btsNitgCTJU/jXPxqBrjet2vkck6ddXvsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Vbr0/btsNitgCTJU/jXPxqBrjet2vkck6ddXvsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Vbr0%2FbtsNitgCTJU%2FjXPxqBrjet2vkck6ddXvsk%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;430&quot; height=&quot;525&quot; data-filename=&quot;스크린샷 2025-04-11 오후 5.46.57.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;1366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 커뮤니티가 작다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 비교적 최근에 시작된 프로젝트 이므로 커뮤니티가 상대적으로 작은건 사실이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESLint 같은 경우 JS 기반이기 때문에 패키지를 사용하다가 버그를 발견하면 개발자가 직접 컨트리뷰트 하기 쉽지만, Biome은 Rust 기반이라 웹개발자 분들이 생태계 참여에 비교적 어려워 해 커뮤니티가 커지기 힘들다는 글을 봤던거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커뮤니티가 작다보니 초보자 입장에서 구글링을 통해 정보를 얻기 어렵기 때문에 단점이라고 생각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 공식문서가 잘 정리되어 있어 버그에 마주하지 않는 한 사용하는데 크게 어려움은 없어보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 Prettier, ESLint 조합을 사용하던 프로젝트에서 Biome으로 마이그레이션 해보고 간단히 사용해보는 시간을 가져봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명히 Biome 만의 장점도 존재하지만, 장점만 보고 무턱대고 도입하기 보다는 단점에 대해서 생각해보고 신중히 결정하는 것이 좋아보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Biome이 지원하는 언어를 사용중이고 작은 프로젝트거나 새로 시작하는 프로젝트라면 한번 맛보는 것도 좋은 경험이 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 필자는 속도가 빠르고 에러가 친절하다는 장점이 크게 느껴져서 큰 문제점이 없는 한 계속 Biome을 쓸 거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/81</guid>
      <comments>https://nicodora.tistory.com/entry/Biome-Prettier%EB%B3%B4%EB%8B%A4-35%EB%B0%B0-%EB%8D%94-%EB%B9%A0%EB%A5%B4%EB%8B%A4%EB%8A%94-Biome%EC%9D%84-%EC%8D%A8%EB%B3%B4%EC%9E%90#entry81comment</comments>
      <pubDate>Fri, 11 Apr 2025 22:35:28 +0900</pubDate>
    </item>
    <item>
      <title>Xcode로 만든 앱 실제 내 아이폰에서 실행하기</title>
      <link>https://nicodora.tistory.com/entry/Xcode%EB%A1%9C-%EB%A7%8C%EB%93%A0-%EC%95%B1-%EC%8B%A4%EC%A0%9C-%EB%82%B4-%EC%95%84%EC%9D%B4%ED%8F%B0%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #006A71 2px solid; margin: 10px 0px; border-left: #006A71 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Xcode로&amp;nbsp;만든&amp;nbsp;앱&amp;nbsp;실제&amp;nbsp;내&amp;nbsp;아이폰에서&amp;nbsp;실행하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 우리가 만든 앱들을 모두 맥 컴퓨터 안에서 에뮬레이터로 실행해보고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 에뮬레이터로는 실행할 수 없는 기능들(GPS, 자이로 센서 등)이 있어서 추후에 앱을 만들고 테스트 할 때 어려움을 겪을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 오늘은 Xcode로 만든 앱들을 실제로 내가 가지고 있는 아이폰에서 실행하는 방법을 소개하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #48A6A7;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발자 계정 추가하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode로 만든 앱을 실제 아이폰에서 실행시키기 위해선 먼저 개발자 계정을 추가하는 과정을 거쳐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 애플의 개발자 계정은 돈을 내고 권한을 얻을 수 있는데 우리가 해 볼 것은 앱스토어에 앱을 출시하는게 아니라 내 아이폰에만 테스트 할 예정이므로 Apple ID로 설정해줘도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode를 실행시키고 실제 아이폰에서 테스트 하고 싶은 프로젝트를 하나 선택하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 저번주 실습에서 만든 Web 프로젝트를 실행하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.27.22.png&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwVs5L/btsHiqW7xzj/tS6fBkDq9i0n6XwaLA1T00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwVs5L/btsHiqW7xzj/tS6fBkDq9i0n6XwaLA1T00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwVs5L/btsHiqW7xzj/tS6fBkDq9i0n6XwaLA1T00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwVs5L%2FbtsHiqW7xzj%2FtS6fBkDq9i0n6XwaLA1T00%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;1572&quot; height=&quot;1012&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.27.22.png&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 창에 들어온 후 좌측 상단에 Xcode -&amp;gt; Settings... 를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.28.05.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4VsEe/btsHicxWnfX/PkG2Jf8ACbek3t61RjxdzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4VsEe/btsHicxWnfX/PkG2Jf8ACbek3t61RjxdzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4VsEe/btsHicxWnfX/PkG2Jf8ACbek3t61RjxdzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4VsEe%2FbtsHicxWnfX%2FPkG2Jf8ACbek3t61RjxdzK%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;720&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.28.05.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정창 상단에서 Accounts를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정을 추가한 적이 없으면 아래 사진처럼 아무런 계정도 보이지 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 하단에 + 버튼을 눌러 계정을 추가해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.29.05.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJZVsf/btsHism6xZ0/9bHuRsUAz3TlcRrKNNB4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJZVsf/btsHism6xZ0/9bHuRsUAz3TlcRrKNNB4Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJZVsf/btsHism6xZ0/9bHuRsUAz3TlcRrKNNB4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJZVsf%2FbtsHism6xZ0%2F9bHuRsUAz3TlcRrKNNB4Kk%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;1884&quot; height=&quot;1328&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.29.05.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apple ID를 선택하고 Continue를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.31.41.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yYpeQ/btsHjAxUP5u/wDMZ7h6go5Ekgky1Y4sAK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yYpeQ/btsHjAxUP5u/wDMZ7h6go5Ekgky1Y4sAK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yYpeQ/btsHjAxUP5u/wDMZ7h6go5Ekgky1Y4sAK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyYpeQ%2FbtsHjAxUP5u%2FwDMZ7h6go5Ekgky1Y4sAK0%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;1884&quot; height=&quot;1328&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.31.41.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 사용중인 Apple ID의 이메일 혹은 휴대폰 번호를 입력하고 Next를 클릭하면 패스워드를 입력하는 창이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.34.11.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3cVfF/btsHgVXSJx3/mE3VBEtEcBKy0Y3SsZKas1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3cVfF/btsHgVXSJx3/mE3VBEtEcBKy0Y3SsZKas1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3cVfF/btsHgVXSJx3/mE3VBEtEcBKy0Y3SsZKas1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3cVfF%2FbtsHgVXSJx3%2FmE3VBEtEcBKy0Y3SsZKas1%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;1884&quot; height=&quot;1328&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.34.11.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패스워드를 입력하고 Next 버튼을 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.37.14.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdT4y2/btsHiGSUrMf/aQxE7FpvVHt6HFRYP5XGy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdT4y2/btsHiGSUrMf/aQxE7FpvVHt6HFRYP5XGy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdT4y2/btsHiGSUrMf/aQxE7FpvVHt6HFRYP5XGy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdT4y2%2FbtsHiGSUrMf%2FaQxE7FpvVHt6HFRYP5XGy1%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;1884&quot; height=&quot;1328&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.37.14.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 화면처럼 Apple ID가 뜨면 성공적으로 Apple ID가 추가된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.39.44.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE4jMM/btsHf0S2EQk/s8knb9p5g9Oj8ZGoXHtcwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE4jMM/btsHf0S2EQk/s8knb9p5g9Oj8ZGoXHtcwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE4jMM/btsHf0S2EQk/s8knb9p5g9Oj8ZGoXHtcwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE4jMM%2FbtsHf0S2EQk%2Fs8knb9p5g9Oj8ZGoXHtcwK%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;1884&quot; height=&quot;1328&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.39.44.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 설정창을 닫고 아래 사진처럼 프로젝트 -&amp;gt; Signing &amp;amp; Capabilities 으로 들어오면 Team이 None으로 되어 있을텐데 Team을 Personal Team으로 변경해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.43.25.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCqn3f/btsHjUQzcqc/m10zVclV6SktO3Tkh4CKPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCqn3f/btsHjUQzcqc/m10zVclV6SktO3Tkh4CKPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCqn3f/btsHjUQzcqc/m10zVclV6SktO3Tkh4CKPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCqn3f%2FbtsHjUQzcqc%2Fm10zVclV6SktO3Tkh4CKPk%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.43.25.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;아이폰 연결하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 아이폰을 맥 컴퓨터와 연결해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 맥북과 아이폰 14 Pro를 사용중이라 c to lightning 케이블을 사용하여 컴퓨터와 아이폰을 연결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 하드웨어 환경에 맞춰서 맥 컴퓨터와 아이폰을 유선으로 연결시키면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결중에 아이폰이나 컴퓨터에 아래와 같은 알람이 뜰텐데 여기서 반드시 신뢰를 클릭해서 접근을 허용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2391.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t3ebR/btsHjWOoOuV/O2Z35xKQSw9fP0OnEJwNP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t3ebR/btsHjWOoOuV/O2Z35xKQSw9fP0OnEJwNP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t3ebR/btsHjWOoOuV/O2Z35xKQSw9fP0OnEJwNP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft3ebR%2FbtsHjWOoOuV%2FO2Z35xKQSw9fP0OnEJwNP0%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;430&quot; height=&quot;932&quot; data-filename=&quot;IMG_2391.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결한 후에 Xcode로 돌아와서 상단에 있는 디바이스 선택버튼을 클릭해보면 iOS Device에 본인의 아이폰이 추가된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 아이폰을 클릭하여 빌드 디바이스로 선택해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.54.21.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWUPJ/btsHiqCPiFj/zmgqKktbELMwoeHMzJWrK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWUPJ/btsHiqCPiFj/zmgqKktbELMwoeHMzJWrK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWUPJ/btsHiqCPiFj/zmgqKktbELMwoeHMzJWrK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWUPJ%2FbtsHiqCPiFj%2FzmgqKktbELMwoeHMzJWrK1%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-05-08 오후 7.54.21.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;앱 빌드하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 모든 설정이 완료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode 좌측 상단에 빌드버튼을 클릭하여 앱을 빌드해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(앱을 빌드할 때는 아이폰이 잠금해제된 상태여야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 8.05.37.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDJkl/btsHiCXrtEm/6fH3Ek1dKzC9P38XzSUxj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDJkl/btsHiCXrtEm/6fH3Ek1dKzC9P38XzSUxj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDJkl/btsHiCXrtEm/6fH3Ek1dKzC9P38XzSUxj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDJkl%2FbtsHiCXrtEm%2F6fH3Ek1dKzC9P38XzSUxj1%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-05-08 오후 8.05.37.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 빌드중에 아래 사진처럼 에러가 발생한다면 아이폰에서 개발자 모드를 켜지 않았기 때문에 발생하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 8.00.26.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ownG8/btsHisAFi1J/BW3D0pGfAJ5rRTTVCFaSG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ownG8/btsHisAFi1J/BW3D0pGfAJ5rRTTVCFaSG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ownG8/btsHisAFi1J/BW3D0pGfAJ5rRTTVCFaSG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FownG8%2FbtsHisAFi1J%2FBW3D0pGfAJ5rRTTVCFaSG1%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-05-08 오후 8.00.26.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오후 8.01.17.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKgEpb/btsHjTD9i0x/PiwSDXCY7Rvnfa4m1o44NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKgEpb/btsHjTD9i0x/PiwSDXCY7Rvnfa4m1o44NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKgEpb/btsHjTD9i0x/PiwSDXCY7Rvnfa4m1o44NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKgEpb%2FbtsHjTD9i0x%2FPiwSDXCY7Rvnfa4m1o44NK%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-05-08 오후 8.01.17.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰에서 설정 -&amp;gt; 개인정보 보호 및 보안 -&amp;gt; 개발자 모드 에서 개발자 모드를 켜 주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 모드를 키고 재부팅되면 개발자 모드를 켤지 확인하는 알람창이 뜨는데 '켜기'를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beP7aC/btsHgYNROD8/hluSWyyVHoT2kpkd5irYEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beP7aC/btsHgYNROD8/hluSWyyVHoT2kpkd5irYEK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot; data-filename=&quot;IMG_2398.PNG&quot; width=&quot;430&quot; height=&quot;932&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beP7aC/btsHgYNROD8/hluSWyyVHoT2kpkd5irYEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeP7aC%2FbtsHgYNROD8%2FhluSWyyVHoT2kpkd5irYEK%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;1179&quot; height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7op7k/btsHiIQNoRo/GW9k5kFh6wMhusLHq85x91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7op7k/btsHiIQNoRo/GW9k5kFh6wMhusLHq85x91/img.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_2392.PNG&quot; width=&quot;430&quot; height=&quot;932&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7op7k/btsHiIQNoRo/GW9k5kFh6wMhusLHq85x91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7op7k%2FbtsHiIQNoRo%2FGW9k5kFh6wMhusLHq85x91%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;1179&quot; height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 빌드해보면 이번엔 또 다른 에러가 뜨게 될텐데 아이폰에서 내 Apple ID로 된 개발자의 앱을 신뢰하지 않는다고 기본 설정되어 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2393.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/culJjZ/btsHgVQ6OYH/7QWzGffTegxGb9YyL5k8c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/culJjZ/btsHgVQ6OYH/7QWzGffTegxGb9YyL5k8c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/culJjZ/btsHgVQ6OYH/7QWzGffTegxGb9YyL5k8c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FculJjZ%2FbtsHgVQ6OYH%2F7QWzGffTegxGb9YyL5k8c0%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;1179&quot; height=&quot;571&quot; data-filename=&quot;IMG_2393.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰에서 설정 -&amp;gt; 일반 -&amp;gt; VPN 및 기기 관리 에 들어가면 개발자 앱에 내 Apple ID로 된 개발자가 추가되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 개발자를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2394.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bceJs6/btsHgWvI89u/yARMNHHKSDePWy29tygci0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bceJs6/btsHgWvI89u/yARMNHHKSDePWy29tygci0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bceJs6/btsHgWvI89u/yARMNHHKSDePWy29tygci0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbceJs6%2FbtsHgWvI89u%2FyARMNHHKSDePWy29tygci0%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;430&quot; height=&quot;932&quot; data-filename=&quot;IMG_2394.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'Apple Developpment: (계정 ID) 신뢰'&lt;/b&gt;&lt;/span&gt;를 클릭하여 해당 개발자를 신뢰하도록 설정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2395.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3k3Wt/btsHhUK7Ps3/YStza1YWTQtIAIYgssd4oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3k3Wt/btsHhUK7Ps3/YStza1YWTQtIAIYgssd4oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3k3Wt/btsHhUK7Ps3/YStza1YWTQtIAIYgssd4oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3k3Wt%2FbtsHhUK7Ps3%2FYStza1YWTQtIAIYgssd4oK%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;430&quot; height=&quot;932&quot; data-filename=&quot;IMG_2395.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2396.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKBDU/btsHicEHKZ7/gsAkYRfiw4FmKZGmWgzViK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKBDU/btsHicEHKZ7/gsAkYRfiw4FmKZGmWgzViK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKBDU/btsHicEHKZ7/gsAkYRfiw4FmKZGmWgzViK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKBDU%2FbtsHicEHKZ7%2FgsAkYRfiw4FmKZGmWgzViK%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;430&quot; height=&quot;280&quot; data-filename=&quot;IMG_2396.PNG&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다시 빌드를 해보면 정상적으로 앱이 실행될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>swift</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/54</guid>
      <comments>https://nicodora.tistory.com/entry/Xcode%EB%A1%9C-%EB%A7%8C%EB%93%A0-%EC%95%B1-%EC%8B%A4%EC%A0%9C-%EB%82%B4-%EC%95%84%EC%9D%B4%ED%8F%B0%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0#entry54comment</comments>
      <pubDate>Thu, 10 Apr 2025 21:08:38 +0900</pubDate>
    </item>
    <item>
      <title>[Github Copilot] 학생인증 받았는데 Copilot Pro 무료로 쓸 수 없을 때 해결법</title>
      <link>https://nicodora.tistory.com/entry/Github-Copilot-%ED%95%99%EC%83%9D%EC%9D%B8%EC%A6%9D-%EB%B0%9B%EC%95%98%EB%8A%94%EB%8D%B0-Copilot-Pro-%EB%AC%B4%EB%A3%8C%EB%A1%9C-%EC%93%B8-%EC%88%98-%EC%97%86%EC%9D%84-%EB%95%8C-%ED%95%B4%EA%B2%B0%EB%B2%95</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #006A71 2px solid; margin: 10px 0px; border-left: #006A71 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[Github Copilot] 학생인증 받았는데 Copilot Pro 무료로 쓸 수 없을 때 해결법&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #48A6A7;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Github 학생인증을 받았는데 Copilot Pro 액세스가 안됨&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 작년부터 깃허브 학생인증을 받아 Github Copilot Pro를 무료로 사용중이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 저번 달에 학생인증 유효기간이 지나서 코파일럿 프로를 사용할 수 없었다. (깃허브 학생인증은 1년마다 재인증 받아야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브에서 일반인에게도 코파일럿을 제한적으로 사용할 수 있도록 풀어줬지만 사용량에 제한이 있어서 결국 재인증을 받아야 하긴 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 처음에 인증받았던 것 처럼 다시 깃허브 학생인증을 완료했는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 7.59.50.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEu95P/btsNgCj59NC/FxwWaXkkWVUmctDmpF4eMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEu95P/btsNgCj59NC/FxwWaXkkWVUmctDmpF4eMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEu95P/btsNgCj59NC/FxwWaXkkWVUmctDmpF4eMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEu95P%2FbtsNgCj59NC%2FFxwWaXkkWVUmctDmpF4eMK%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;1462&quot; height=&quot;974&quot; data-filename=&quot;스크린샷 2025-04-10 오후 7.59.50.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래라면 3~5일 내에 코파일럿 프로를 사용할 수 있어야 하는데 시간이 지나도 프로 적용이 안됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;깃허브 홈페이지 -&amp;gt; 우측 상단 메뉴 바 -&amp;gt; Your Copilot&lt;/b&gt; 에 들어가보면 내 코파일럿 설정을 확인할 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.02.30.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7swX/btsNgA0WCK9/vFUjHpWONpEWZO7jSoL9dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7swX/btsNgA0WCK9/vFUjHpWONpEWZO7jSoL9dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7swX/btsNgA0WCK9/vFUjHpWONpEWZO7jSoL9dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7swX%2FbtsNgA0WCK9%2FvFUjHpWONpEWZO7jSoL9dK%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;1532&quot; height=&quot;822&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.02.30.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 위처럼 코파일럿 프로가 활성화되었다고 뜨는데 해결하기 전에는 계속 플랜을 업그레이드 하라는 문구만 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 구글링을 해보니 뭐 학생 혜택 받기를 눌르라는 말이 보여서 github education 쪽을 다 뒤져보다가 해결 방법을 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크를 클릭하고 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;github&amp;nbsp;&lt;/span&gt;education 홈 -&amp;gt; 좌측 상단 메뉴 바 -&amp;gt; Student Developer Pack&lt;/b&gt;&lt;/span&gt; 으로 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://education.github.com/learner/learn&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://education.github.com/learner/learn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744283195586&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub &amp;middot; Build and ship software on a single, collaborative platform&quot; data-og-description=&quot;Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://education.github.com/learner/learn&quot; data-og-url=&quot;https://github.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IiulH/hyYCh3pxRB/Hkl8Q967XYpPdWCe2LHW9k/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/35sAl/hyYFDqfcfD/q38sD7JfHrTnXhsYVNgXD1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://education.github.com/learner/learn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://education.github.com/learner/learn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IiulH/hyYCh3pxRB/Hkl8Q967XYpPdWCe2LHW9k/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/35sAl/hyYFDqfcfD/q38sD7JfHrTnXhsYVNgXD1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub &amp;middot; Build and ship software on a single, collaborative platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이런 페이지로 이동되게 되는데 아래로 스크롤을 좀 더 내려보면은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.13.03.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciJy04/btsNgqda2x8/CCVvF770S6yJbNjaVYQbqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciJy04/btsNgqda2x8/CCVvF770S6yJbNjaVYQbqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciJy04/btsNgqda2x8/CCVvF770S6yJbNjaVYQbqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciJy04%2FbtsNgqda2x8%2FCCVvF770S6yJbNjaVYQbqK%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.13.03.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 All offers 라는 탭이 보일텐데 여기서 &lt;b&gt;About Github Copilot&lt;/b&gt;을 찾아서 &lt;b&gt;Get direct access on the website GitHub Copilot&lt;/b&gt;을 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.13.59.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZa1c6/btsNgan74us/AaojdYMyrFNWljk6FE1utk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZa1c6/btsNgan74us/AaojdYMyrFNWljk6FE1utk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZa1c6/btsNgan74us/AaojdYMyrFNWljk6FE1utk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZa1c6%2FbtsNgan74us%2FAaojdYMyrFNWljk6FE1utk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.13.59.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아래처럼 깃허브 코파일럿을 무료로 사용할 수 있다고 뜨는데 여기서 &lt;b&gt;Get access to GitHub Copilot&lt;/b&gt;을 클릭하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 깃허브 코파일럿 설정에 들어가서 아래처럼 코파일럿 프로가 활성화되었다고 뜨면 성공이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.02.30.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7swX/btsNgA0WCK9/vFUjHpWONpEWZO7jSoL9dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7swX/btsNgA0WCK9/vFUjHpWONpEWZO7jSoL9dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7swX/btsNgA0WCK9/vFUjHpWONpEWZO7jSoL9dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7swX%2FbtsNgA0WCK9%2FvFUjHpWONpEWZO7jSoL9dK%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;1532&quot; height=&quot;822&quot; data-filename=&quot;스크린샷 2025-04-10 오후 8.02.30.png&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9ACBD0 2px solid; margin: 10px 0px; border-left: #9ACBD0 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;한줄 요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/github-copilot/free_signup&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/github-copilot/free_signup&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744284058294&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub &amp;middot; Build and ship software on a single, collaborative platform&quot; data-og-description=&quot;Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/github-copilot/free_signup&quot; data-og-url=&quot;https://github.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPzH33/hyYEH7E0Ap/G8g6D5HFBpGKZT1TiWDtok/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/1jL7E/hyYFC5XcdQ/qAxzHTHTWOK7bpDCzq87q0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://github.com/github-copilot/free_signup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/github-copilot/free_signup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPzH33/hyYEH7E0Ap/G8g6D5HFBpGKZT1TiWDtok/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/1jL7E/hyYFC5XcdQ/qAxzHTHTWOK7bpDCzq87q0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub &amp;middot; Build and ship software on a single, collaborative platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 들어가서 &lt;b&gt;Get access to GitHub Copilot&lt;/b&gt;을 클릭하면 된다.&lt;/p&gt;</description>
      <category>github</category>
      <category>Copilot</category>
      <category>copilot 학생인증</category>
      <category>코파일럿</category>
      <category>코파일럿 학생인증</category>
      <category>코파일럿 학생인증 에러</category>
      <category>코파일럿 학생인증 오류</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/80</guid>
      <comments>https://nicodora.tistory.com/entry/Github-Copilot-%ED%95%99%EC%83%9D%EC%9D%B8%EC%A6%9D-%EB%B0%9B%EC%95%98%EB%8A%94%EB%8D%B0-Copilot-Pro-%EB%AC%B4%EB%A3%8C%EB%A1%9C-%EC%93%B8-%EC%88%98-%EC%97%86%EC%9D%84-%EB%95%8C-%ED%95%B4%EA%B2%B0%EB%B2%95#entry80comment</comments>
      <pubDate>Thu, 10 Apr 2025 20:55:09 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기말 프로젝트 - 인덕 부동산</title>
      <link>https://nicodora.tistory.com/entry/Flutter-%EA%B8%B0%EB%A7%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9D%B8%EB%8D%95-%EB%B6%80%EB%8F%99%EC%82%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인덕 부동산 앱 시연 영상&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/mZ7mjVLEZV8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/mZ7mjVLEZV8&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=mZ7mjVLEZV8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cd5EY3/hyXOjUGvvg/MiglR7aoxuKiT8PP06h2Zk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b4SIeh/hyXOlrrh0E/Bkv1DKGnmcg5x2CMAvZFq1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;모바일프로그래밍(2) 기말 프로젝트 &quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/mZ7mjVLEZV8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;napkin-selection.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QZd9R/btsLp8K1up2/eBLrL7iYBmz9wqQrYRaYW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QZd9R/btsLp8K1up2/eBLrL7iYBmz9wqQrYRaYW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QZd9R/btsLp8K1up2/eBLrL7iYBmz9wqQrYRaYW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQZd9R%2FbtsLp8K1up2%2FeBLrL7iYBmz9wqQrYRaYW0%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;640&quot; height=&quot;525&quot; data-filename=&quot;napkin-selection.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;디렉터리 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;napkin-selection (1).png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRqUW/btsLoMoGk8a/SDHfQQgrge5FeUXH1adueK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRqUW/btsLoMoGk8a/SDHfQQgrge5FeUXH1adueK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRqUW/btsLoMoGk8a/SDHfQQgrge5FeUXH1adueK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRqUW%2FbtsLoMoGk8a%2FSDHfQQgrge5FeUXH1adueK%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;640&quot; height=&quot;676&quot; data-filename=&quot;napkin-selection (1).png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;napkin-selection (2).png&quot; data-origin-width=&quot;1756&quot; data-origin-height=&quot;1264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doIpK1/btsLocuzm9t/FGZfxArx5PkWYZxotKVq5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doIpK1/btsLocuzm9t/FGZfxArx5PkWYZxotKVq5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doIpK1/btsLocuzm9t/FGZfxArx5PkWYZxotKVq5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoIpK1%2FbtsLocuzm9t%2FFGZfxArx5PkWYZxotKVq5K%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;640&quot; height=&quot;461&quot; data-filename=&quot;napkin-selection (2).png&quot; data-origin-width=&quot;1756&quot; data-origin-height=&quot;1264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;main.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734600365898&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'dart:ui';

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/material.dart';
import '../firebase_options.dart';

import 'intro/intro_page.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  runApp(const MyApp());

  FlutterError.onError = (errorDetails) {
    FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
  };

  PlatformDispatcher.instance.onError = (error , stack) {
    FirebaseCrashlytics.instance.recordError(error, stack , fatal: true);
    return true;
  };
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '마이 부동산',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const IntroPage(),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;intro/&lt;span style=&quot;color: #006dd7;&quot;&gt;intro_page.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734599928035&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';
import '../map/map_page.dart';

class IntroPage extends StatefulWidget {
  const IntroPage({super.key});

  @override
  State&amp;lt;StatefulWidget&amp;gt; createState() {
    return _IntroPage();
  }
}

class _IntroPage extends State&amp;lt;IntroPage&amp;gt; {
  @override
  void initState() {
    super.initState();
    // 2초 후에 MapPage로 이동
    Future.delayed(const Duration(seconds: 2), () {
      Navigator.of(context).pushReplacement(MaterialPageRoute(
        builder: (context) =&amp;gt; const MapPage(),
      ));
    });
  }

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              '인덕 부동산',
              style: TextStyle(fontSize: 50),
            ),
            SizedBox(
              height: 20,
            ),
            Icon(
              Icons.apartment_rounded,
              size: 100,
            ),
          ],
        ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;map/&lt;span style=&quot;color: #006dd7;&quot;&gt;apt_page.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734599995380&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_ui_firestore/firebase_ui_firestore.dart';
import 'package:flutter/material.dart';

class AptPage extends StatefulWidget {
  final String aptHash;
  final Map&amp;lt;String, dynamic&amp;gt; aptInfo;

  const AptPage({super.key, required this.aptHash, required this.aptInfo});

  @override
  State&amp;lt;StatefulWidget&amp;gt; createState() {
    return _AptPage();
  }
}

class _AptPage extends State&amp;lt;AptPage&amp;gt; {
  late CollectionReference aptRef;

  @override
  void initState() {
    super.initState();
    aptRef = FirebaseFirestore.instance.collection('wydmu17me');
  }
  int startYear = 2006;
  Icon favoriteIcon = const Icon(Icons.favorite_border);

  @override
  Widget build(BuildContext context) {
    final usersQuery =
    aptRef.orderBy('deal_ymd').where('deal_ymd' , isGreaterThanOrEqualTo: '${startYear}0000') as Query&amp;lt;Map&amp;lt;String, dynamic&amp;gt;&amp;gt;;
    return Scaffold(
      appBar: AppBar(title: Text(widget.aptInfo['name']), actions: [IconButton(onPressed: (){
        FirebaseFirestore.instance.collection('rollcake').doc('favorite').set(widget.aptInfo);
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('나의 아파트로 등록되었습니다')));
      }, icon: favoriteIcon)]),
      body:  Column(
        children: [
          Column(children: [
            SizedBox(width: MediaQuery.of(context).size.width ,child:  Text('아파트 이름 : ${widget.aptInfo['name']}'),),
            SizedBox(width: MediaQuery.of(context).size.width ,child:   Text('아파트 주소 : ${widget.aptInfo['address']}'),),
            SizedBox(width: MediaQuery.of(context).size.width ,child:   Text('아파트 동 수 : ${widget.aptInfo['ALL_DONG_CO']}'),),
            SizedBox(width: MediaQuery.of(context).size.width ,child:   Text(&quot;아파트 세대 수 : ${widget.aptInfo['ALL_HSHLD_CO']}&quot;),),
            SizedBox(width: MediaQuery.of(context).size.width ,child:   Text('아파트 주차 대수 : ${widget.aptInfo['CNT_PA']}'),),
            SizedBox(width: MediaQuery.of(context).size.width ,child:   Text('60m2 이하 평형 세대수 : ${widget.aptInfo['KAPTMPAREA60']}'),),
            SizedBox(width: MediaQuery.of(context).size.width ,child:   Text('60m2 - 85m2 이하 평형 세대수 : ${widget.aptInfo['KAPTMPAREA85']}'),),
          ],)
          ,Container(color: Colors.black,height: 1, margin: const EdgeInsets.only(top: 5 ,bottom: 5),),
          Text('검색 시작 년도 : $startYear년'),
          Slider(value: startYear.toDouble(), onChanged: (value){
            setState(() {
              startYear = value.toInt();
            });
          } , min: 2006, max: 2023,),
          Expanded(
              child: FirestoreListView&amp;lt;Map&amp;lt;String, dynamic&amp;gt;&amp;gt;(
                query: usersQuery,
                pageSize: 20,
                itemBuilder: (context, snapshot) {
                  Map&amp;lt;String, dynamic&amp;gt; apt = snapshot.data();
                  return Card(
                    child: Row(
                      children: [
                        Column(
                          children: [
                            Text('계약 일시 : ${apt['deal_ymd'].toString()}'),
                            Text('계약 층 : ${apt['floor'].toString()}층'),
                            Text(
                                '계약 가격 : ${double.parse(apt['obj_amt']) / 10000}억'),
                            Text('전용 면적 : ${apt['bldg_area']}m2')
                          ],
                        ),
                        Expanded(child: Container())
                      ],
                    ),
                  );
                },
                emptyBuilder: (context) {
                  return const Text('매매 데이터가 없습니다');
                },
                errorBuilder: (context, err, stack) {
                  return const Text('데이터가 없습니다');
                },
              ))
        ],
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;map/&lt;span style=&quot;color: #006dd7;&quot;&gt;map_filter.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734600067365&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MapFilter{
  String? buildingString = '1';
  String? peopleString = '0';
  String? carString = '1';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;map/&lt;span style=&quot;color: #006dd7;&quot;&gt;map_filter_dialog.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734600139599&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

import 'map_filter.dart';

class MapFilterDialog extends StatefulWidget {
  final MapFilter mapFilter;
  const MapFilterDialog(this.mapFilter, {super.key});

  @override
  State&amp;lt;StatefulWidget&amp;gt; createState() {
    return _MapFilterDialog();
  }
}

class _MapFilterDialog extends State&amp;lt;MapFilterDialog&amp;gt; {

  late MapFilter mapFilter ;

  final List&amp;lt;DropdownMenuItem&amp;lt;String&amp;gt;&amp;gt; _buildingDownMenuItems = [
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '1',
      child: Text('1동'),
    ),
    const DropdownMenuItem&amp;lt;String&amp;gt;(value: '2', child: Text('2동')),
    const DropdownMenuItem&amp;lt;String&amp;gt;(value: '3', child: Text('3동이상'))
  ];
  final List&amp;lt;DropdownMenuItem&amp;lt;String&amp;gt;&amp;gt; _peopleDownMenuItems = [
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '0',
      child: Text('전부'),
    ),
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '100',
      child: Text('100세대 이상'),
    ),
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '300',
      child: Text('300세대 이상'),
    ),
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '500',
      child: Text('500세대 이상'),
    )
  ];
  final List&amp;lt;DropdownMenuItem&amp;lt;String&amp;gt;&amp;gt; _carDownMenuItems = [
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '1',
      child: Text('세대별 1대 미만'),
    ),
    const DropdownMenuItem&amp;lt;String&amp;gt;(
      value: '2',
      child: Text('세대별 1대 이상'),
    )
  ];

  @override
  void initState() {
    super.initState();
    mapFilter = widget.mapFilter;
    mapFilter.buildingString = _buildingDownMenuItems.first.value;
    mapFilter.peopleString = _peopleDownMenuItems.first.value;
    mapFilter.carString = _carDownMenuItems.first.value;
  }

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text('My 부동산'),
      content: SizedBox(
        height: 300,
        child: Column(
          children: [
            Padding(
              padding: const EdgeInsets.all(10),
              child: DropdownButton(
                items: _buildingDownMenuItems,
                onChanged: (value) {
                  setState(() {
                    mapFilter.buildingString = value!;
                  });
                },
                value: mapFilter.buildingString,
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(10),
              child: DropdownButton(
                items: _peopleDownMenuItems,
                onChanged: (value) {
                  setState(() {
                    mapFilter.peopleString = value!;
                  });
                },
                value: mapFilter.peopleString,
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(10),
              child: DropdownButton(
                items: _carDownMenuItems,
                onChanged: (value) {
                  setState(() {
                    mapFilter.carString = value!;
                  });
                },
                value: mapFilter.carString,
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center
              ,children: [
              ElevatedButton(onPressed: (){
                Navigator.of(context).pop(mapFilter);
              }, child: Text('확인')),
              ElevatedButton(onPressed: (){
                Navigator.of(context).pop();
              }, child: Text('취소')),
            ],)
          ],
        ),),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;map/&lt;span style=&quot;color: #006dd7;&quot;&gt;map_page.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734600179581&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dart_geohash/dart_geohash.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'map_filter.dart';
import 'map_filter_dialog.dart';
import '../myFavorite/my_favorite_page.dart';
import '../settings/setting_page.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../geoFire/geoflutterfire.dart';
import '../geoFire/models/point.dart';

import 'apt_page.dart';

class MapPage extends StatefulWidget {
  const MapPage({super.key});

  @override
  State&amp;lt;StatefulWidget&amp;gt; createState() {
    return _MapPage();
  }
}

class _MapPage extends State&amp;lt;MapPage&amp;gt; {
  Completer&amp;lt;GoogleMapController&amp;gt; _controller =
  Completer&amp;lt;GoogleMapController&amp;gt;();
  Map&amp;lt;MarkerId, Marker&amp;gt; markers = &amp;lt;MarkerId, Marker&amp;gt;{};
  MarkerId? selectedMarker;
  BitmapDescriptor markerIcon = BitmapDescriptor.defaultMarker;

  LatLng? markerPosition;
  var geoHasher = GeoHasher();
  final geo = Geoflutterfire();

  int currentItem = 0;

  MapType mapType = MapType.normal;

  late List&amp;lt;DocumentSnapshot&amp;gt; documentList =
  List&amp;lt;DocumentSnapshot&amp;gt;.empty(growable: true);

  MapFilter mapFilter = MapFilter();



  static const CameraPosition _googleMapCamera = CameraPosition(
    target: LatLng(37.571320, 127.029403),
    zoom: 15,
  );

  @override
  void initState() {
    super.initState();
    addCustomIcon();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('인덕 부동산'),
        actions: [IconButton(onPressed: () async{
          var result = await Navigator.of(context).push(MaterialPageRoute(builder: (context){
            return MapFilterDialog(mapFilter);
          }));
          if(result != null){
            mapFilter = result as MapFilter;
          }
        }, icon: const Icon(Icons.search))],
      ),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: [
            DrawerHeader(child: Text('박준혁 님 환영합니다')),
            ListTile(
              title: const Text('내가 선택한 아파트'),
              onTap: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (context) {
                  return const MyFavoritePage();
                }));
              },
            ),
            ListTile(
              title: const Text('설정'),
              onTap: () async {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (context) {
                  return SettingPage();
                })).then((value) async {
                  final SharedPreferences prefs = await SharedPreferences.getInstance();
                  final int? type = prefs.getInt('mapType');
                  setState(() {
                    switch(type){
                      case 0:
                        mapType = MapType.terrain;
                        break;
                      case 1:
                        mapType = MapType.satellite;
                        break;
                      case 2:
                        mapType = MapType.hybrid;
                        break;
                    }
                  });
                });
              },
            ),
          ],
        ),
      ),
      body: currentItem == 0 ? GoogleMap(
        mapType: mapType,
        initialCameraPosition: _googleMapCamera,
        onMapCreated: (GoogleMapController controller) {
          _controller.complete(controller);
        },
        markers: Set&amp;lt;Marker&amp;gt;.of(markers.values),
      ) : ListView.builder(itemBuilder: (context, value){
        Map&amp;lt;String, dynamic&amp;gt; item = documentList[value].data() as Map&amp;lt;String , dynamic&amp;gt;;
        return InkWell(child: Card(
          child: ListTile(
            leading: const Icon(Icons.apartment),
            title: Text(item['name']),
            subtitle: Text(item['address']),
            trailing: const Icon(Icons.arrow_circle_right_sharp),
          ),
        ),onTap: (){
          Navigator.of(context)
              .push(MaterialPageRoute(builder: (context) {
            return AptPage(
              aptHash: item['position']['geohash'],
              aptInfo: item,
            );
          }));
        },);
      } , itemCount: documentList.length,)
      ,
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: currentItem,
        onTap: (value) {
          if (value == 0){
            _controller =
                Completer&amp;lt;GoogleMapController&amp;gt;();
          }
          setState(() {
            currentItem = value;
          });
        },
        items: const [
          BottomNavigationBarItem(
            label: 'map',
            icon: Icon((Icons.map)),
          ),
          BottomNavigationBarItem(
            label: 'list',
            icon: Icon((Icons.list)),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: _searchApt,
        label: const Text('이 위치로 검색하기'),
      ),
    );
  }

  void addCustomIcon() async {
    try {
      markerIcon = await BitmapDescriptor.fromAssetImage(
          const ImageConfiguration(), &quot;res/images/apartment.png&quot;);
      setState(() {});
    } catch (e) {
      debugPrint(&quot;Error loading marker icon: $e&quot;);
    }
  }

  Future&amp;lt;void&amp;gt; _searchApt() async {
    final GoogleMapController controller = await _controller.future;
    final bounds = await controller.getVisibleRegion();
    LatLng centerBounds = LatLng(
      (bounds.southwest.latitude + bounds.northeast.latitude) / 2,
      (bounds.southwest.longitude + bounds.northeast.longitude) / 2,
    );

    final aptRef = FirebaseFirestore.instance.collection('cities');
    final geo = Geoflutterfire();
    GeoFirePoint center = geo.point(
        latitude: centerBounds.latitude, longitude: centerBounds.longitude);

    double radius = 1;
    String field = 'position';

    Stream&amp;lt;List&amp;lt;DocumentSnapshot&amp;gt;&amp;gt; stream = geo
        .collection(collectionRef: aptRef)
        .within(center: center, radius: radius, field: field);

    // 스트림 중복 구독 방지
    stream.listen((List&amp;lt;DocumentSnapshot&amp;gt; documents) {
      setState(() {
        documentList = documents;
      });
      drawMarker(documents);
    }).onError((error) {
      debugPrint(&quot;Stream error: $error&quot;);
    });
  }

  void drawMarker(List&amp;lt;DocumentSnapshot&amp;gt; documentList) {
    // 마커 클리어
    markers.clear();

    for (var element in documentList) {
      var info = element.data()! as Map&amp;lt;String, dynamic&amp;gt;;
      if (selectedCheck(info, mapFilter.peopleString, mapFilter.carString, mapFilter.buildingString)) {
        MarkerId markerId = MarkerId(info['position']['geohash']);
        Marker marker = Marker(
          markerId: markerId,
          infoWindow: InfoWindow(
              title: info['name'],
              snippet: '${info['address']}',
              onTap: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (context) {
                  return AptPage(
                    aptHash: info['position']['geohash'],
                    aptInfo: info,
                  );
                }));
              }),
          position: LatLng(
              (info['position']['geopoint'] as GeoPoint).latitude,
              (info['position']['geopoint'] as GeoPoint).longitude),
          icon: markerIcon,
        );
        markers[markerId] = marker;
      }
    }
    setState(() {});
  }


  bool selectedCheck(Map&amp;lt;String, dynamic&amp;gt; info, String? peopleString,
      String? carString, String? buildingString) {
    final dong = info['ALL_DONG_CO'];
    final people = info['ALL_HSHLD_CO'];
    final parking = people / info['CNT_PA'];
    if (dong &amp;gt;= int.parse(buildingString!)) {
      if (people &amp;gt;= int.parse(peopleString!)) {
        if (carString == '1') {
          if (parking &amp;lt; 1) {
            return true;
          } else {
            return false;
          }
        } else {
          if (parking &amp;gt;= 1) {
            return true;
          } else {
            return false;
          }
        }
      } else {
        return false;
      }
    } else {
      return false;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;myFavorite/&lt;span style=&quot;color: #006dd7;&quot;&gt;my_favorite_page.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734600244165&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

import '../map/apt_page.dart';

class MyFavoritePage extends StatefulWidget {
  const MyFavoritePage({super.key});

  @override
  State&amp;lt;StatefulWidget&amp;gt; createState() {
    return _MyFavoritePage();
  }
}

class _MyFavoritePage extends State&amp;lt;MyFavoritePage&amp;gt; {
  List&amp;lt;Map&amp;lt;String, dynamic&amp;gt;&amp;gt; favoriteList = List.empty(growable: true);

  @override
  void initState() {
    super.initState();
    FirebaseFirestore.instance
        .collection('rollcake')
        .doc('favorite')
        .get()
        .then((value) =&amp;gt; {
      setState(() {
        favoriteList.add(value.data()!);
      })
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('나의 추천 리스트'),
      ),
      body: ListView.builder(
        itemBuilder: (context, snapshot) {
          return Card(
            child: InkWell(child: SizedBox(
              height: 50,
              child: Column(
                children: [Text(favoriteList[snapshot]['name'])],
              ),
            ), onTap: (){
              Navigator.of(context)
                  .push(MaterialPageRoute(builder: (context) {
                return AptPage(
                  aptHash: favoriteList[snapshot]['position']['geohash'], aptInfo: favoriteList[snapshot],
                );
              }));
            },),
          );
        },
        itemCount: favoriteList.length,
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;settings/&lt;span style=&quot;color: #006dd7;&quot;&gt;setting_page.dart&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734600269165&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';
import '../intro/intro_page.dart';
import 'package:shared_preferences/shared_preferences.dart';

class SettingPage extends StatefulWidget {
  @override
  State&amp;lt;StatefulWidget&amp;gt; createState() {
    return _SettingPage();
  }
}

class _SettingPage extends State&amp;lt;SettingPage&amp;gt; {
  int mapType = 0;
  late SharedPreferences prefs;

  @override
  void initState() {
    super.initState();
    initShared();
  }

  void initShared() async {
    prefs = await SharedPreferences.getInstance();
    var type = prefs.getInt(&quot;mapType&quot;);
    if (type != null) {
      setState(() {
        mapType = type;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('설정'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
                onPressed: () {
                  Navigator.of(context).pushAndRemoveUntil(
                      MaterialPageRoute(builder: (context) {
                        return const IntroPage();
                      }), (route) =&amp;gt; false);
                },
                child: Text('로그 아웃 하기')),
            SizedBox(
              height: 30,
            ),
            Text('지도 타입'),
            SizedBox(
              height: 200,
              child: ListView(
                children: [
                  RadioListTile&amp;lt;int&amp;gt;(
                    title: const Text('terrain'),
                    value: 0,
                    groupValue: mapType,
                    onChanged: (value) async {
                      await prefs.setInt('mapType', value!);
                      setState(() {
                        mapType = value!;
                      });
                    },
                  ),
                  RadioListTile&amp;lt;int&amp;gt;(
                    title: const Text('satellite'),
                    value: 1,
                    groupValue: mapType,
                    onChanged: (value) async {
                      await prefs.setInt('mapType', value!);
                      setState(() {
                        mapType = value!;
                      });
                    },
                  ),
                  RadioListTile&amp;lt;int&amp;gt;(
                    title: const Text('hybrid'),
                    value: 2,
                    groupValue: mapType,
                    onChanged: (value) async {
                      await prefs.setInt('mapType', value!);
                      setState(() {
                        mapType = value!;
                      });
                    },
                  ),
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스코드 설명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 202316035 박준혁입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일프로그래밍&lt;span&gt;(2) &lt;/span&gt;기말&lt;span&gt; &lt;/span&gt;프로젝트인&lt;span&gt; &amp;lsquo;&lt;/span&gt;인덕&lt;span&gt; &lt;/span&gt;부동산'&lt;span&gt; &lt;/span&gt;앱에&lt;span&gt; &lt;/span&gt;대해서&lt;span&gt; &lt;/span&gt;설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 개발한 앱은 '인덕 부동산'으로 지도 API를 활용하여 부동산 정보를 보여주는 앱 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부동산 정보를 보여주기 위해선 부동산에 대한 데이터가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부동산 데이터를 가져오는 방법은 공공데이터 포털의 부동산 정보 API를 활용하는 방법과 데이터베이스를 직접 구축하고 정보를 저장해놓은 후 가져오는 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;API&lt;/span&gt;를&lt;span&gt; &lt;/span&gt;활용하면&lt;span&gt; &lt;/span&gt;실시간으로&lt;span&gt; &lt;/span&gt;정보를&lt;span&gt; &lt;/span&gt;받을&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있지만&lt;span&gt; &lt;/span&gt;상황에&lt;span&gt; &lt;/span&gt;따라&lt;span&gt; API&lt;/span&gt;가&lt;span&gt; &lt;/span&gt;작동하지&lt;span&gt; &lt;/span&gt;않을&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있고&lt;span&gt;&amp;nbsp;받은&amp;nbsp;&lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;한번&lt;span&gt; &lt;/span&gt;더&lt;span&gt; &lt;/span&gt;가공해야&lt;span&gt; &lt;/span&gt;하기&lt;span&gt; &lt;/span&gt;때문에&lt;span&gt; 본 앱에서는&amp;nbsp;&lt;/span&gt;데이터베이스를&lt;span&gt; &lt;/span&gt;직접&lt;span&gt; &lt;/span&gt;구축하고&lt;span&gt; &lt;/span&gt;가공된&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;저장해서&lt;span&gt; &lt;/span&gt;불러오는&lt;span&gt; &lt;/span&gt;방법으로&lt;span&gt; &lt;/span&gt;구현했습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터베이스는 Firebase의 Storage와 Firestore Database를 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.13.12.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eq71SD/btsLnWZVtzd/HrLgwIKfUxS6uhVpMnYYkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eq71SD/btsLnWZVtzd/HrLgwIKfUxS6uhVpMnYYkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eq71SD/btsLnWZVtzd/HrLgwIKfUxS6uhVpMnYYkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feq71SD%2FbtsLnWZVtzd%2FHrLgwIKfUxS6uhVpMnYYkk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.13.12.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 중에 geohash 라는 값이 있는데 이는 부동산 위치의 위도와 경도를 해시값으로 변환한 것으로 이 데이터를 사용하면 빠르게 원하는 지역의 부동산 정보를 가져올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.15.04.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;1384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GHku1/btsLogwWwYT/nx87Oxdnm8MHnkmLHZFpD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GHku1/btsLogwWwYT/nx87Oxdnm8MHnkmLHZFpD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GHku1/btsLogwWwYT/nx87Oxdnm8MHnkmLHZFpD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGHku1%2FbtsLogwWwYT%2Fnx87Oxdnm8MHnkmLHZFpD0%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;640&quot; height=&quot;634&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.15.04.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;1384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.dart 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱의 시작점이고 앱을 실행하면 인트로 페이지로 넘어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.16.46.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;1504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebCVLM/btsLpb2WY8q/N6H9Ym5Tk7kLOKPuWrBd8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebCVLM/btsLpb2WY8q/N6H9Ym5Tk7kLOKPuWrBd8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebCVLM/btsLpb2WY8q/N6H9Ym5Tk7kLOKPuWrBd8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebCVLM%2FbtsLpb2WY8q%2FN6H9Ym5Tk7kLOKPuWrBd8K%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;640&quot; height=&quot;841&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.16.46.png&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;1504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;intro_page.dart 파일에선 인트로 페이지를 구현했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Future.delayed를 통해 2초 후에 MapPage로 넘어가도록 구현했습니다. 인트로 페이지에선 간단하게 텍스트와 아파트 아이콘을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.25.57.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDAip7/btsLn95RNsL/d3LT8Nk5U2MGPKmXNPevwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDAip7/btsLn95RNsL/d3LT8Nk5U2MGPKmXNPevwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDAip7/btsLn95RNsL/d3LT8Nk5U2MGPKmXNPevwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDAip7%2FbtsLn95RNsL%2Fd3LT8Nk5U2MGPKmXNPevwk%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;640&quot; height=&quot;533&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.25.57.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음은 map_page.dart 파일입니다. 이 파일의 주요 기능은 구글 지도 API를 사용하여 지도를 표시하고 파이어베이스에서 데이터를 가져와서 보여주는 것 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GoogleMapController를 사용하여 구글 지도 API를 통해서 지도를 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MapType은 지도의 표시형태를 변경할 수 있는 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.30.22.png&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;1332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLkg1p/btsLoe0citC/cH02os0xFV1L1EUjQSA6LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLkg1p/btsLoe0citC/cH02os0xFV1L1EUjQSA6LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLkg1p/btsLoe0citC/cH02os0xFV1L1EUjQSA6LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLkg1p%2FbtsLoe0citC%2FcH02os0xFV1L1EUjQSA6LK%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;640&quot; height=&quot;614&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.30.22.png&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_searchApt 함수에서는 현재 지도 화면의 중심 좌표를 계산하고 반경 1Km 이내의 데이터를 Firestore에서 검색합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 검색된 데이터를 drawMarker를 사용하여 지도에 표시하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.36.30.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RuNwV/btsLoImrOMJ/xPrFXXIWODud9bKvZ3ifBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RuNwV/btsLoImrOMJ/xPrFXXIWODud9bKvZ3ifBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RuNwV/btsLoImrOMJ/xPrFXXIWODud9bKvZ3ifBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRuNwV%2FbtsLoImrOMJ%2FxPrFXXIWODud9bKvZ3ifBk%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;640&quot; height=&quot;570&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.36.30.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;selectedCheck 함수를 사용해서 조건에 따라 아파트 데이터를 필터링 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.38.37.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtJyx/btsLqAOcC0l/Vic32UkeBxK9amTPJKGMr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtJyx/btsLqAOcC0l/Vic32UkeBxK9amTPJKGMr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtJyx/btsLqAOcC0l/Vic32UkeBxK9amTPJKGMr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtJyx%2FbtsLqAOcC0l%2FVic32UkeBxK9amTPJKGMr1%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;640&quot; height=&quot;569&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.38.37.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bottomNavigationBar를 통해서 지도로 보기와 리스트로 보기 간 전환이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.41.17.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAQh4s/btsLn5WGA4G/t4hLbkWMTR9EVb66gyA6uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAQh4s/btsLn5WGA4G/t4hLbkWMTR9EVb66gyA6uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAQh4s/btsLn5WGA4G/t4hLbkWMTR9EVb66gyA6uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAQh4s%2FbtsLn5WGA4G%2Ft4hLbkWMTR9EVb66gyA6uK%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;640&quot; height=&quot;140&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.41.17.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map_filter.dart 파일에서는 데이터를 필터링 할 수 있도록 맵 필터를 클래스로 정의했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.43.19.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boV3rv/btsLonv5ZbF/xfCvpxu9b8sA9cODRgRq0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boV3rv/btsLonv5ZbF/xfCvpxu9b8sA9cODRgRq0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boV3rv/btsLonv5ZbF/xfCvpxu9b8sA9cODRgRq0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboV3rv%2FbtsLonv5ZbF%2FxfCvpxu9b8sA9cODRgRq0K%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;640&quot; height=&quot;734&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.43.19.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map_filter_dialog.dart 파일에서는 사용자가 필터를 설정할 수 있도록 dialog를 구현하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.45.34.png&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;1584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXNzL/btsLqcfKJ2B/aROpCYGaTkNqMuDjouXvb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXNzL/btsLqcfKJ2B/aROpCYGaTkNqMuDjouXvb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXNzL/btsLqcfKJ2B/aROpCYGaTkNqMuDjouXvb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXNzL%2FbtsLqcfKJ2B%2FaROpCYGaTkNqMuDjouXvb1%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;640&quot; height=&quot;488&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.45.34.png&quot; data-origin-width=&quot;2076&quot; data-origin-height=&quot;1584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apt_page.dart 파일에서는 사용자가 아파트를 클릭했을 때 해당 아파트에 대한 상세 정보(이름, 주소, 면적, 매매 정보 등)를 표시하기 위한 페이지를 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.47.50.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;1284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMOMkn/btsLpNUOrcF/RauvhkfgRHajMbvWOlIp90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMOMkn/btsLpNUOrcF/RauvhkfgRHajMbvWOlIp90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMOMkn/btsLpNUOrcF/RauvhkfgRHajMbvWOlIp90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMOMkn%2FbtsLpNUOrcF%2FRauvhkfgRHajMbvWOlIp90%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;640&quot; height=&quot;455&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.47.50.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;1284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.50.01.png&quot; data-origin-width=&quot;2212&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dO30w2/btsLodmXtW2/fTm0jSNeQithixakFMdNs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dO30w2/btsLodmXtW2/fTm0jSNeQithixakFMdNs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dO30w2/btsLodmXtW2/fTm0jSNeQithixakFMdNs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdO30w2%2FbtsLodmXtW2%2FfTm0jSNeQithixakFMdNs0%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;640&quot; height=&quot;337&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.50.01.png&quot; data-origin-width=&quot;2212&quot; data-origin-height=&quot;1166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;my_favorite_page.dart 파일에서는 사용자가 즐겨찾기에 저장한 아파트를 보여주는 리스트 페이지를 구현했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즐겨찾기 리스트는 Firestore에 저장하여 앱을 종료해도 다시 불러올 수 있도록 구현했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.50.31.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blZB6V/btsLogRhd8Z/IdntESS863WNMlqE827Ba1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blZB6V/btsLogRhd8Z/IdntESS863WNMlqE827Ba1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blZB6V/btsLogRhd8Z/IdntESS863WNMlqE827Ba1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblZB6V%2FbtsLogRhd8Z%2FIdntESS863WNMlqE827Ba1%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;640&quot; height=&quot;741&quot; data-filename=&quot;스크린샷 2024-12-19 오후 8.50.31.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setting_page.dart 파일에서는 설정 페이지를 구현했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 페이지에선 지도의 타입을 변경할 수 있는 기능을 추가했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/79</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-%EA%B8%B0%EB%A7%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9D%B8%EB%8D%95-%EB%B6%80%EB%8F%99%EC%82%B0#entry79comment</comments>
      <pubDate>Thu, 19 Dec 2024 18:31:02 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 14주차 (2) - 파이어베이스 인증하기</title>
      <link>https://nicodora.tistory.com/entry/Flutter-14%EC%A3%BC%EC%B0%A8-2-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #FFC1C8 2px solid; margin: 10px 0px; border-left: #FFC1C8 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;14주차&amp;nbsp;(2)&amp;nbsp;-&amp;nbsp;파이어베이스&amp;nbsp;인증하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차에서는 파이어베이스의 인증 기능을 이용해 이메일과 비밀번호로 회원가입하고 로그인하는 앱을 만들어 볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;파이어베이스 이메일 비밀번호 인증 설정하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이어베이스의 이메일 비밀번호 인증 기능을 사용하기 위해선 파이어베이스 콘솔에서 해당 기능을 활성화해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 파이어베이스 콘솔에 접속하여  저번시간에 만든 프로젝트를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 왼쪽 빌드 목록에서 Authentication을 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.34.43.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beRBnx/btsLhOHjSsb/TQETbY0vfglvd2tBd1U5f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beRBnx/btsLhOHjSsb/TQETbY0vfglvd2tBd1U5f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beRBnx/btsLhOHjSsb/TQETbY0vfglvd2tBd1U5f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeRBnx%2FbtsLhOHjSsb%2FTQETbY0vfglvd2tBd1U5f0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.34.43.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 방법 중에서 이메일/비밀번호를 클릭하고 사용 설정을 활성화하고 저장을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.37.41.png&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KqOnF/btsLiNN72M1/qmVZuJeoVS70krQzzUPkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KqOnF/btsLiNN72M1/qmVZuJeoVS70krQzzUPkkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KqOnF/btsLiNN72M1/qmVZuJeoVS70krQzzUPkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKqOnF%2FbtsLiNN72M1%2FqmVZuJeoVS70krQzzUPkkk%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;1910&quot; height=&quot;886&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.37.41.png&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 탭으로 넘어와서 이메일 주소 인증으로 들어가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.38.48.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZWrXC/btsLhpVi851/txW0Tor0roLLMm2C014bi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZWrXC/btsLhpVi851/txW0Tor0roLLMm2C014bi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZWrXC/btsLhpVi851/txW0Tor0roLLMm2C014bi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZWrXC%2FbtsLhpVi851%2FtxW0Tor0roLLMm2C014bi0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.38.48.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 템플릿 언어를 한국어로 바꾸자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.50.26.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Js9Xo/btsLikyZIJI/u6OZpcbOqEM9cyK5hCpiK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Js9Xo/btsLikyZIJI/u6OZpcbOqEM9cyK5hCpiK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Js9Xo/btsLikyZIJI/u6OZpcbOqEM9cyK5hCpiK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJs9Xo%2FbtsLikyZIJI%2Fu6OZpcbOqEM9cyK5hCpiK1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.50.26.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;패키지 등록하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pubspec.yaml 파일을 열고 파이어베이스 인증과 토스트를 출력하기 위한 패키지를 등록한 후 Pub get을 눌러 패키지를 등록하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지를 등록하기 전에 항상 pub.dev에 들어가서 패키지의 최신버전을 확인하고 등록하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.03.18.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IN91r/btsLihPTyyr/9IQG2oAXsqOu34z1mykWQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IN91r/btsLihPTyyr/9IQG2oAXsqOu34z1mykWQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IN91r/btsLihPTyyr/9IQG2oAXsqOu34z1mykWQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIN91r%2FbtsLihPTyyr%2F9IQG2oAXsqOu34z1mykWQk%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;430&quot; height=&quot;391&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.03.18.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734078191793&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Firebase와 Flutter의 주요 패키지를 가져옵니다.
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import '../firebase_options.dart';
import 'package:fluttertoast/fluttertoast.dart';

showToast(String msg) {      // 토스트 메시지를 화면에 표시하는 함수
  Fluttertoast.showToast(
      msg: msg, // 출력할 메시지
      toastLength: Toast.LENGTH_SHORT, // 짧은 시간 동안 표시
      gravity: ToastGravity.CENTER, // 화면 중앙에 표시
      timeInSecForIosWeb: 1, // iOS 및 웹에서 표시 시간
      backgroundColor: Colors.red, // 배경색: 빨간색
      textColor: Colors.white, // 글자색: 흰색
      fontSize: 16.0 // 글자 크기
  );
}

// 앱의 진입점(Main 함수)
void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // Flutter 엔진 초기화
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform, // 플랫폼별 Firebase 설정 적용
  );
  runApp(MyApp()); // 앱 실행
}

// 전체 앱을 정의하는 MyApp 클래스
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo', // 앱 제목
      theme: ThemeData(
        primarySwatch: Colors.blue, // 기본 색상 테마
      ),
      home: AuthWidget(), // 첫 화면으로 AuthWidget 지정
    );
  }
}

// 인증 화면을 담당하는 StatefulWidget
class AuthWidget extends StatefulWidget {
  @override
  AuthWidgetState createState() =&amp;gt; AuthWidgetState(); // 상태 생성
}

// 인증 로직 및 UI 상태를 관리하는 State 클래스
class AuthWidgetState extends State&amp;lt;AuthWidget&amp;gt; {
  final _formKey = GlobalKey&amp;lt;FormState&amp;gt;(); // 폼 유효성 검사용 키

  late String email; // 사용자 이메일
  late String password; // 사용자 비밀번호
  bool isInput = true; // 입력 화면 여부(true: 입력, false: 결과)
  bool isSignIn = true; // 로그인 여부(true: 로그인, false: 회원가입)

  // 로그인 처리 함수
  signIn() async {
    try {
      await FirebaseAuth.instance
          .signInWithEmailAndPassword(email: email, password: password)
          .then((value) {
        print(value); // 성공 결과 출력
        if (value.user!.emailVerified) { // 이메일 인증 여부 확인
          setState(() {
            isInput = false; // 결과 화면으로 전환
          });
        } else {
          showToast('emailVerified error'); // 이메일 인증 실패 메시지
        }
        return value; // 결과 반환
      });
    } on FirebaseAuthException catch (e) {
      // Firebase 인증 에러 처리
      if (e.code == 'user-not-found') {
        showToast('user-not-found'); // 사용자 없음 메시지
      } else if (e.code == 'wrong-password') {
        showToast('wrong-password'); // 비밀번호 오류 메시지
      } else {
        print(e.code); // 기타 오류 코드 출력
      }
    }
  }

  // 로그아웃 처리 함수
  signOut() async {
    await FirebaseAuth.instance.signOut(); // Firebase 로그아웃
    setState(() {
      isInput = true; // 입력 화면으로 전환
    });
  }

  // 회원가입 처리 함수
  signUp() async {
    try {
      await FirebaseAuth.instance
          .createUserWithEmailAndPassword(email: email, password: password)
          .then((value) {
        if (value.user!.email != null) { // 계정 생성 성공 여부 확인
          FirebaseAuth.instance.currentUser?.sendEmailVerification(); // 이메일 인증 요청
          setState(() {
            isInput = false; // 결과 화면으로 전환
          });
        }
        return value; // 결과 반환
      });
    } on FirebaseAuthException catch (e) {
      // Firebase 회원가입 에러 처리
      if (e.code == 'weak-password') {
        showToast('weak-password'); // 비밀번호 보안 약함 메시지
      } else if (e.code == 'email-already-in-use') {
        showToast('email-already-in-use'); // 이메일 중복 메시지
      } else {
        showToast('other error'); // 기타 오류 메시지
        print(e.code); // 오류 코드 출력
      }
    } catch (e) {
      print(e.toString()); // 기타 예외 출력
    }
  }

  // 입력 화면 UI 생성
  List&amp;lt;Widget&amp;gt; getInputWidget() {
    return [
      // 로그인 또는 회원가입 제목
      Text(
        isSignIn ? &quot;SignIn&quot; : &quot;SignUp&quot;, // 현재 상태에 따라 제목 변경
        style: const TextStyle(
          color: Colors.indigo, // 텍스트 색상
          fontWeight: FontWeight.bold, // 굵은 글씨
          fontSize: 20, // 글씨 크기
        ),
        textAlign: TextAlign.center, // 중앙 정렬
      ),
      // 이메일 및 비밀번호 입력 폼
      Form(
        key: _formKey, // 유효성 검사를 위한 키
        child: Column(
          children: [
            // 이메일 입력 필드
            TextFormField(
              decoration: InputDecoration(labelText: 'email'), // 라벨
              validator: (value) {
                if (value?.isEmpty ?? false) {
                  return 'Please enter email'; // 빈 입력 시 메시지
                }
                return null; // 유효성 통과
              },
              onSaved: (String? value) {
                email = value ?? &quot;&quot;; // 이메일 저장
              },
            ),
            // 비밀번호 입력 필드
            TextFormField(
              decoration: const InputDecoration(
                labelText: 'password', // 라벨
              ),
              obscureText: true, // 비밀번호 입력 시 숨김
              validator: (value) {
                if (value?.isEmpty ?? false) {
                  return 'Please enter password'; // 빈 입력 시 메시지
                }
                return null; // 유효성 통과
              },
              onSaved: (String? value) {
                password = value ?? &quot;&quot;; // 비밀번호 저장
              },
            ),
          ],
        ),
      ),

      // 로그인/회원가입 버튼
      ElevatedButton(
        onPressed: () {
          if (_formKey.currentState?.validate() ?? false) { // 유효성 검사 통과 시
            _formKey.currentState?.save(); // 폼 데이터 저장
            print('email: $email, password : $password'); // 디버깅용 출력
            if (isSignIn) {
              signIn(); // 로그인 호출
            } else {
              signUp(); // 회원가입 호출
            }
          }
        },
        child: Text(isSignIn ? &quot;SignIn&quot; : &quot;SignUp&quot;), // 버튼 텍스트
      ),

      // 상태 전환 링크 (로그인 &amp;lt;-&amp;gt; 회원가입)
      RichText(
        textAlign: TextAlign.right, // 오른쪽 정렬
        text: TextSpan(
          text: 'Go ', // 설명 텍스트
          // style: Theme.of(context).textTheme.bodyText1, // 기본 텍스트 스타일
          style: Theme.of(context).textTheme.bodyLarge, // 변경된 코드
          children: &amp;lt;TextSpan&amp;gt;[
            TextSpan(
                text: isSignIn ? &quot;SignUp&quot; : &quot;SignIn&quot;, // 현재 상태에 따라 텍스트 변경
                style: const TextStyle(
                  color: Colors.blue, // 색상
                  fontWeight: FontWeight.bold, // 굵은 글씨
                  decoration: TextDecoration.underline, // 밑줄
                ),
                recognizer: TapGestureRecognizer()
                  ..onTap = () {
                    setState(() {
                      isSignIn = !isSignIn; // 상태 전환
                    });
                  }),
          ],
        ),
      ),
    ];
  }

  // 결과 화면 UI 생성
  List&amp;lt;Widget&amp;gt; getResultWidget() {
    String resultEmail = FirebaseAuth.instance.currentUser!.email!; // 현재 사용자 이메일
    return [
      Text(
        isSignIn
            ? &quot;$resultEmail 로 로그인 하셨습니다.!&quot; // 로그인 결과 메시지
            : &quot;$resultEmail 로 회원가입 하셨습니다.! 이메일 인증을 거쳐야 로그인이 가능합니다.&quot;, // 회원가입 결과 메시지
        style: const TextStyle(
          color: Colors.black54, // 텍스트 색상
          fontWeight: FontWeight.bold, // 굵은 글씨
        ),
      ),
      // 로그아웃/다시 로그인 버튼
      ElevatedButton(
        onPressed: () {
          if (isSignIn) {
            signOut(); // 로그아웃 호출
          } else {
            setState(() {
              isInput = true; // 입력 화면으로 전환
              isSignIn = true; // 로그인 상태로 전환
            });
          }
        },
        child: Text(isSignIn ? &quot;SignOut&quot; : &quot;SignIn&quot;), // 버튼 텍스트
      ),
    ];
  }

  // 화면 빌드
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(&quot;인증테스트 인덕대 202316035 박준혁&quot;), // 앱 제목
      ),
      body: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch, // 너비 최대 확장
          children: isInput ? getInputWidget() : getResultWidget()), // 상태에 따라 화면 선택
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 실행시키면 SignIn 페이지가 먼저 뜨는데 일단 로그인을 하기 위해선 회원가입을 해야 하므로 SignUp 페이지로 이동하여 이메일과 비밀번호를 입력하고 SignUp 버튼을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 오른쪽 사진과 같이 이메일 인증을 거쳐야 한다고 메시지가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKC8su/btsLjmilB2a/Hb9pwd6hYnrd74lpaCK0W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKC8su/btsLjmilB2a/Hb9pwd6hYnrd74lpaCK0W0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;1534&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.19.40.png&quot; style=&quot;width: 49.4142%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKC8su/btsLjmilB2a/Hb9pwd6hYnrd74lpaCK0W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKC8su%2FbtsLjmilB2a%2FHb9pwd6hYnrd74lpaCK0W0%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;718&quot; height=&quot;1534&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv57Ma/btsLhoPL7Ke/JeJWnMU9oxqEQok2kYoR5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv57Ma/btsLhoPL7Ke/JeJWnMU9oxqEQok2kYoR5k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;1538&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.19.52.png&quot; style=&quot;width: 49.423%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv57Ma/btsLhoPL7Ke/JeJWnMU9oxqEQok2kYoR5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv57Ma%2FbtsLhoPL7Ke%2FJeJWnMU9oxqEQok2kYoR5k%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;720&quot; height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 이메일을 확인해보면 아래와 같은 메일이 하나 와 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일을 통해 받은 링크를 클릭하면 자동으로 인증이 완료된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.21.29.png&quot; data-origin-width=&quot;2412&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt98G5/btsLhvur9sr/0T1Y4WFq2Iy47VfL8SgWDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt98G5/btsLhvur9sr/0T1Y4WFq2Iy47VfL8SgWDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt98G5/btsLhvur9sr/0T1Y4WFq2Iy47VfL8SgWDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt98G5%2FbtsLhvur9sr%2F0T1Y4WFq2Iy47VfL8SgWDk%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;2412&quot; height=&quot;750&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.21.29.png&quot; data-origin-width=&quot;2412&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.21.46.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cazQz5/btsLiWdeYMj/ncxy8MH5xmXOYiGAGYZBi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cazQz5/btsLiWdeYMj/ncxy8MH5xmXOYiGAGYZBi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cazQz5/btsLiWdeYMj/ncxy8MH5xmXOYiGAGYZBi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcazQz5%2FbtsLiWdeYMj%2Fncxy8MH5xmXOYiGAGYZBi1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.21.46.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 앱으로 돌아와서 이번엔 SignIn 페이지로 이동해서 이메일과 비밀번호를 입력하고 SignIn 버튼을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아래와 같이 로그인이 성공적으로 완료된 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXeGfZ/btsLihiaBK5/bIwRUenLJviKBkJSiHjav0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXeGfZ/btsLihiaBK5/bIwRUenLJviKBkJSiHjav0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;1532&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.22.12.png&quot; style=&quot;width: 49.6792%; margin-right: 10px;&quot; data-widthpercent=&quot;50.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXeGfZ/btsLihiaBK5/bIwRUenLJviKBkJSiHjav0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXeGfZ%2FbtsLihiaBK5%2FbIwRUenLJviKBkJSiHjav0%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;730&quot; height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kYEMV/btsLhLYiDGl/YKiNRJVs2MqTRu4J9tNawK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kYEMV/btsLhLYiDGl/YKiNRJVs2MqTRu4J9tNawK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1544&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.22.20.png&quot; style=&quot;width: 49.158%;&quot; data-widthpercent=&quot;49.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kYEMV/btsLhLYiDGl/YKiNRJVs2MqTRu4J9tNawK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkYEMV%2FbtsLhLYiDGl%2FYKiNRJVs2MqTRu4J9tNawK%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;728&quot; height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이어베이스 콘솔에 들어가보면 아까 가입했던 이메일로 사용자가 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.29.20.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1D5fU/btsLjaI3R4K/OHnLMcmKcUYgCOFCq7OwAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1D5fU/btsLjaI3R4K/OHnLMcmKcUYgCOFCq7OwAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1D5fU/btsLjaI3R4K/OHnLMcmKcUYgCOFCq7OwAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1D5fU%2FbtsLjaI3R4K%2FOHnLMcmKcUYgCOFCq7OwAk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-13 오후 5.29.20.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/78</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-14%EC%A3%BC%EC%B0%A8-2-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0#entry78comment</comments>
      <pubDate>Fri, 13 Dec 2024 17:30:36 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 14주차 (1) - 이미지 피커(image_picker) 활용하기</title>
      <link>https://nicodora.tistory.com/entry/Flutter-14%EC%A3%BC%EC%B0%A8-1-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%94%BC%EC%BB%A4imagepicker-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #FFC1C8 2px solid; margin: 10px 0px; border-left: #FFC1C8 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;14주차&amp;nbsp;(1)&amp;nbsp;-&amp;nbsp;이미지&amp;nbsp;피커(image_picker)&amp;nbsp;활용하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차에서는 이미지 피커를 활용하여 갤러리나 카메라와 연동하는 앱을 만들어 볼 예정이다.&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;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;image_picker 패키지 등록하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 피커를 사용하기 위해선 다음처럼 이미지 피커 패키지를 pubspec.yaml 파일의 dependencies 항목에 등록해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pub.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pub.dev&lt;/a&gt; 사이트에 들어가서 image_picker를 검색한 후 dependencies 항목에 등록하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-11 오후 9.39.01.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C25gB/btsLe2SQL1q/Wo5CxJQOwFWcysBisAgkF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C25gB/btsLe2SQL1q/Wo5CxJQOwFWcysBisAgkF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C25gB/btsLe2SQL1q/Wo5CxJQOwFWcysBisAgkF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC25gB%2FbtsLe2SQL1q%2FWo5CxJQOwFWcysBisAgkF0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-12-11 오후 9.39.01.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-11 오후 9.45.03.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKQ5Wf/btsLeEkEcnL/a2hMg1C1sVTxTObk0Ba22k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKQ5Wf/btsLeEkEcnL/a2hMg1C1sVTxTObk0Ba22k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKQ5Wf/btsLeEkEcnL/a2hMg1C1sVTxTObk0Ba22k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKQ5Wf%2FbtsLeEkEcnL%2Fa2hMg1C1sVTxTObk0Ba22k%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-12-11 오후 9.45.03.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flutter 패키지는 버전 업데이트가 자주 일어나는데 이전 버전이면 다른 패키지와 충돌이 발생할 수도 있으므로 가능하면 pub.dev에서 검색해서 최신 버전의 패키지를 다운받는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lib 폴더 아래에 ch23_2 디렉터리를 만들고 안에 test.dart 파일을 만든 후 코드를 작성하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-11 오후 9.51.10.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9KUpi/btsLgnIfTK2/4Por9eToMBXVK0Br89mHuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9KUpi/btsLgnIfTK2/4Por9eToMBXVK0Br89mHuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9KUpi/btsLgnIfTK2/4Por9eToMBXVK0Br89mHuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9KUpi%2FbtsLgnIfTK2%2F4Por9eToMBXVK0Br89mHuK%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;330&quot; height=&quot;385&quot; data-filename=&quot;스크린샷 2024-12-11 오후 9.51.10.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734073284581&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';

void main() =&amp;gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: NativePluginWidget(),
    );
  }
}

class NativePluginWidget extends StatefulWidget {
  const NativePluginWidget({super.key});

  @override
  State&amp;lt;NativePluginWidget&amp;gt; createState() =&amp;gt; _NativePluginWidgetState();
}

class _NativePluginWidgetState extends State&amp;lt;NativePluginWidget&amp;gt; {
  XFile? _image;

  Future getGalleryImage() async {
    var image = await ImagePicker().pickImage(source: ImageSource.gallery);
    setState(() {
      _image = image;
    });
  }

  Future getCameraImage() async {
    var image = await ImagePicker().pickImage(source: ImageSource.camera);
    setState(() {
      _image = image;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Image Picker'),),
      body: Container(
        color: Colors.indigo,
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: (&amp;lt;Widget&amp;gt;[
              ElevatedButton(onPressed: getGalleryImage, child: Text('gallery')),
              Center(
                child: _image == null
                ? Text(
                  'No image selected',
                  style: TextStyle(color: Colors.white),
                ) : CircleAvatar(
                  backgroundImage: FileImage(File(_image!.path)),
                  radius: 100,
                ),
              ),
              ElevatedButton(onPressed: getCameraImage, child: Text('camera')),
            ]),
          ),
        ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 작성하고 앱을 실행시키면 아래와 같이 gallery 버튼과 camera 버튼이 나타나게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.02.21.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;1520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DM7zZ/btsLjmh4VDR/wJA7sYupjjkSwz0mslfW3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DM7zZ/btsLjmh4VDR/wJA7sYupjjkSwz0mslfW3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DM7zZ/btsLjmh4VDR/wJA7sYupjjkSwz0mslfW3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDM7zZ%2FbtsLjmh4VDR%2FwJA7sYupjjkSwz0mslfW3k%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;420&quot; height=&quot;892&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.02.21.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;1520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;camera 버튼을 누르면 아래와 같이 실제 카메라를 실행시켜 사진을 찍고 그 사진을 앱 가운데에 출력하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjE5s/btsLih3lQX9/AILNuW5BkJzZuLCT5VX120/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjE5s/btsLih3lQX9/AILNuW5BkJzZuLCT5VX120/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;1530&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.05.07.png&quot; style=&quot;width: 49.7076%; margin-right: 10px;&quot; data-widthpercent=&quot;50.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjE5s/btsLih3lQX9/AILNuW5BkJzZuLCT5VX120/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSjE5s%2FbtsLih3lQX9%2FAILNuW5BkJzZuLCT5VX120%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;722&quot; height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5VBVI/btsLiLCGie2/kIZGsQ2jmz81LmEb1VUkC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5VBVI/btsLiLCGie2/kIZGsQ2jmz81LmEb1VUkC1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;1548&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.05.19.png&quot; style=&quot;width: 49.1296%;&quot; data-widthpercent=&quot;49.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5VBVI/btsLiLCGie2/kIZGsQ2jmz81LmEb1VUkC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5VBVI%2FbtsLiLCGie2%2FkIZGsQ2jmz81LmEb1VUkC1%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;722&quot; height=&quot;1548&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gallery 버튼을 누르면 휴대폰 내의 사진을 가져올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 에뮬레이터에는 사진이 없어 임시로 사진을 에뮬레이터 안에 넣어줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측의 디바이스 매니저 창을 열고 사용하는 디바이스의 오른쪽에 점을 누르고 'Open in Device Explorer'를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.06.49.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RsVou/btsLhZ2Pv6u/PhQkKmxlyO1Et2IiEF1xtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RsVou/btsLhZ2Pv6u/PhQkKmxlyO1Et2IiEF1xtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RsVou/btsLhZ2Pv6u/PhQkKmxlyO1Et2IiEF1xtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRsVou%2FbtsLhZ2Pv6u%2FPhQkKmxlyO1Et2IiEF1xtk%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;420&quot; height=&quot;459&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.06.49.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아래와 같이 Device Explorer 창이 뜨게 되는데, 여기서 'storage -&amp;gt; emulated -&amp;gt; 0 -&amp;gt; Pictures' 폴더로 이동하여 원하는 사진을 넣고 에뮬레이터를 재실행 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQzKK7/btsLiu2mLIx/KSPAhSG8S4K0KCxdXCkAs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQzKK7/btsLiu2mLIx/KSPAhSG8S4K0KCxdXCkAs0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;854&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.09.10.png&quot; width=&quot;420&quot; height=&quot;490&quot; style=&quot;width: 49.177%; margin-right: 10px;&quot; data-widthpercent=&quot;49.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQzKK7/btsLiu2mLIx/KSPAhSG8S4K0KCxdXCkAs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQzKK7%2FbtsLiu2mLIx%2FKSPAhSG8S4K0KCxdXCkAs0%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;732&quot; height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsfZON/btsLg2TxdC1/7La9fKoTFs84qMApXWxLk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsfZON/btsLg2TxdC1/7La9fKoTFs84qMApXWxLk1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;848&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.11.03.png&quot; width=&quot;420&quot; height=&quot;485&quot; style=&quot;width: 49.6602%;&quot; data-widthpercent=&quot;50.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsfZON/btsLg2TxdC1/7La9fKoTFs84qMApXWxLk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsfZON%2FbtsLg2TxdC1%2F7La9fKoTFs84qMApXWxLk1%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;734&quot; height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 앱을 실행시켜 gallery 버튼을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 Recent 창으로 들어가게 되는데, 왼쪽 메뉴 버튼을 누르고 sdk_gphone64_arm64 으로 들어가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거기서 Pictures 로 들어가면 아까 Device Explorer에서 넣었던 사진을 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTn4gz/btsLivNM3IU/mz4zSTSVbhpKuoOXcL7Cw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTn4gz/btsLivNM3IU/mz4zSTSVbhpKuoOXcL7Cw0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1546&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.12.37.png&quot; style=&quot;width: 49.155%; margin-right: 10px;&quot; data-widthpercent=&quot;49.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTn4gz/btsLivNM3IU/mz4zSTSVbhpKuoOXcL7Cw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTn4gz%2FbtsLivNM3IU%2Fmz4zSTSVbhpKuoOXcL7Cw0%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;728&quot; height=&quot;1546&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lKnII/btsLikllBJK/xfQRmnY0LCitj2g6ruQU21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lKnII/btsLikllBJK/xfQRmnY0LCitj2g6ruQU21/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;1538&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.13.07.png&quot; style=&quot;width: 49.6822%;&quot; data-widthpercent=&quot;50.27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lKnII/btsLikllBJK/xfQRmnY0LCitj2g6ruQU21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlKnII%2FbtsLikllBJK%2FxfQRmnY0LCitj2g6ruQU21%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;732&quot; height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwIxwf/btsLif5t57h/8nzFTqGKdb0rJJc62KttJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwIxwf/btsLif5t57h/8nzFTqGKdb0rJJc62KttJ1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1542&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.13.31.png&quot; style=&quot;width: 49.2901%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;49.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwIxwf/btsLif5t57h/8nzFTqGKdb0rJJc62KttJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwIxwf%2FbtsLif5t57h%2F8nzFTqGKdb0rJJc62KttJ1%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;728&quot; height=&quot;1542&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHnDsz/btsLhj8Ctg5/hexhon7vQXyCAsfeAZ0bE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHnDsz/btsLhj8Ctg5/hexhon7vQXyCAsfeAZ0bE1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1534&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.13.56.png&quot; style=&quot;width: 49.5471%; margin-top: 10px;&quot; data-widthpercent=&quot;50.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHnDsz/btsLhj8Ctg5/hexhon7vQXyCAsfeAZ0bE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHnDsz%2FbtsLhj8Ctg5%2Fhexhon7vQXyCAsfeAZ0bE1%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;728&quot; height=&quot;1534&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갤러리 내의 사진도 잘 불러오는 걸 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.16.39.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9wTEg/btsLjkq4ajG/Tdgx2W3AKxtYKg2Y0pkRO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9wTEg/btsLjkq4ajG/Tdgx2W3AKxtYKg2Y0pkRO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9wTEg/btsLjkq4ajG/Tdgx2W3AKxtYKg2Y0pkRO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9wTEg%2FbtsLjkq4ajG%2FTdgx2W3AKxtYKg2Y0pkRO0%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;420&quot; height=&quot;891&quot; data-filename=&quot;스크린샷 2024-12-13 오후 4.16.39.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/77</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-14%EC%A3%BC%EC%B0%A8-1-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%94%BC%EC%BB%A4imagepicker-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0#entry77comment</comments>
      <pubDate>Fri, 13 Dec 2024 16:17:38 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 12주차 - 플러터 앱과 파이어베이스 연동하기 (MacOS)</title>
      <link>https://nicodora.tistory.com/entry/Flutter-12%EC%A3%BC%EC%B0%A8-%ED%94%8C%EB%9F%AC%ED%84%B0-%EC%95%B1%EA%B3%BC-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-MacOS</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #FFC1C8 2px solid; margin: 10px 0px; border-left: #FFC1C8 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 12주차 - 플러터 앱과 파이어베이스 연동하기 (MacOS)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차에서는 파이어베이스를 사용하여 실습을 진행하기 위해 플러터 앱과 파이어베이스를 연동하는 방법에 대해 알아볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;파이어베이스 프로젝트 만들기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flutter 앱에 Firebase를 추가하는 방법은 아래 공식문서에서 자세히 안내하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/flutter/setup?hl=ko&amp;amp;platform=android&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://firebase.google.com/docs/flutter/setup?hl=ko&amp;amp;platform=android&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;위 공식문서를 참고하여 차근차근 연동해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;a href=&quot;https://console.firebase.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Firebase Console&lt;/a&gt;에 들어가보면 아래와 같이 기본 페이지가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 이전에 프로젝트를 만들어 놓은 적이 있어 다른 프로젝트가 보이는데 만약 이번이 처음이라면 프로젝트 만들기만 보일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에 프로젝트를 생성하고 나면 여기에 생성될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 3.50.10.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HAV5P/btsKUjfLE2F/K5lll46zace9t4vVv1LdGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HAV5P/btsKUjfLE2F/K5lll46zace9t4vVv1LdGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HAV5P/btsKUjfLE2F/K5lll46zace9t4vVv1LdGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHAV5P%2FbtsKUjfLE2F%2FK5lll46zace9t4vVv1LdGK%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 3.50.10.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 프로젝트를 만들기 위해선 먼저 Firebase CLI를 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase CLI를 설치하는 방법은 &lt;a href=&quot;https://firebase.google.com/docs/cli?hl=ko#setup_update_cli&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;서 확인할 수 있는데, 필자는 npm을 사용하여 설치를 진행할 것이기 때문에 node.js를 설치해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js는 &lt;a href=&quot;https://nodejs.org/en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;node.js 공식 홈페이지&lt;/a&gt;에서 다운받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈페이지에서 현재 컴퓨터의 운영체제에 맞게 다운로드 파일을 추천해주므로 홈페이지에 들어가서 바로 Download Node.js 버튼을 눌러 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 필자는 MacOS 환경에서 실습하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.01.27.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ukaRy/btsKSQMLrep/N0LJ87UxToEOvmMmHdYgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ukaRy/btsKSQMLrep/N0LJ87UxToEOvmMmHdYgK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ukaRy/btsKSQMLrep/N0LJ87UxToEOvmMmHdYgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FukaRy%2FbtsKSQMLrep%2FN0LJ87UxToEOvmMmHdYgK0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.01.27.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되고 나서 터미널에서 아래 명령어를 쳐보자.&lt;/p&gt;
&lt;pre id=&quot;code_1732345746178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 잘 되었으면 아래와 같이 노드 버전이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.08.18.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HhJKH/btsKTzKx03M/rlKIaakb1RkzLRpqSc0GGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HhJKH/btsKTzKx03M/rlKIaakb1RkzLRpqSc0GGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HhJKH/btsKTzKx03M/rlKIaakb1RkzLRpqSc0GGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHhJKH%2FbtsKTzKx03M%2FrlKIaakb1RkzLRpqSc0GGk%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.08.18.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래 명령어를 통해서 Firebase CLI를 설치하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 1분 내외로 설치가 완료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732345899306&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g firebase-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.14.13.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQ12F/btsKTHn4XTO/rufEwXksViMDPZ8LLUYvBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQ12F/btsKTHn4XTO/rufEwXksViMDPZ8LLUYvBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQ12F/btsKTHn4XTO/rufEwXksViMDPZ8LLUYvBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQ12F%2FbtsKTHn4XTO%2FrufEwXksViMDPZ8LLUYvBk%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.14.13.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 아래 명령어를 입력하여 파이어베이스에 로그인해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1732346376656&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;firebase login&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.23.16.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by4h7G/btsKVaiqqm5/9OUVJrpzapno5eYBl3Npr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by4h7G/btsKVaiqqm5/9OUVJrpzapno5eYBl3Npr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by4h7G/btsKVaiqqm5/9OUVJrpzapno5eYBl3Npr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby4h7G%2FbtsKVaiqqm5%2F9OUVJrpzapno5eYBl3Npr0%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.23.16.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 이미 로그인했기 때문에 저렇게 뜨는데 만약 처음 로그인을 진행한다면 브라우저에 구글 로그인 창이 하나 뜰 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거기서 구글 로그인을 한 후 권한 허용을 눌러주면 로그인이 완료된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인이 정상적으로 완료되었는지 확인하고 싶다면 firebase login 명령어를 다시 입력해서 이미 로그인되었다고 뜨면 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 아래 명령어를 입력해서 프로젝트를 하나 만들자.&lt;/p&gt;
&lt;pre id=&quot;code_1732346981676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;firebase projects:create {프로젝트ID}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 프로젝트 ID 'flutter-pjh1' 으로 지어줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 명을 어떻게 설정하겠냐고 하면서 입력을 기다릴텐데 엔터를 누르면 위 명령어에서 입력한 ID가 그대로 들어간다. 그냥 엔터를 누르고 넘어가도 되고, 본인이 원하는 이름이 있다면 입력해줘도 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.31.58.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IJ6RS/btsKVuHJbo4/QsbWjh7VQPhomUkRm8ZoP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IJ6RS/btsKVuHJbo4/QsbWjh7VQPhomUkRm8ZoP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IJ6RS/btsKVuHJbo4/QsbWjh7VQPhomUkRm8ZoP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIJ6RS%2FbtsKVuHJbo4%2FQsbWjh7VQPhomUkRm8ZoP0%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.31.58.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 파이어베이스 프로젝트가 준비되었다고 뜨면 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://console.firebase.google.com/&quot;&gt;Firebase Console&lt;/a&gt;에 들어가서 아래로 스크롤해서 모든 프로젝트 쪽을 보면 방금 만든 프로젝트가 추가된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.35.23.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exsI5C/btsKVvfvly1/tPpYX1nZTeKfK03aeS5G8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exsI5C/btsKVvfvly1/tPpYX1nZTeKfK03aeS5G8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exsI5C/btsKVvfvly1/tPpYX1nZTeKfK03aeS5G8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexsI5C%2FbtsKVvfvly1%2FtPpYX1nZTeKfK03aeS5G8K%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.35.23.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;a href=&quot;https://pub.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pub.dev&lt;/a&gt; 로 이동하여 firebase_core를 검색하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.47.18.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/stmRA/btsKVctOHb9/q5plN3GkdfWetLCp8kuR3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/stmRA/btsKVctOHb9/q5plN3GkdfWetLCp8kuR3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/stmRA/btsKVctOHb9/q5plN3GkdfWetLCp8kuR3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FstmRA%2FbtsKVctOHb9%2Fq5plN3GkdfWetLCp8kuR3k%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.47.18.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.48.15.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgaxD7/btsKSR5ZFGl/z3SRbkLySYtEkBOdrtIR01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgaxD7/btsKSR5ZFGl/z3SRbkLySYtEkBOdrtIR01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgaxD7/btsKSR5ZFGl/z3SRbkLySYtEkBOdrtIR01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgaxD7%2FbtsKSR5ZFGl%2Fz3SRbkLySYtEkBOdrtIR01%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.48.15.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pubspec.yaml 파일에 dependencies 에 추가하고 Pub get 버튼을 눌러 패키지 설치를 완료하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.50.36.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuSuk/btsKVbItWjm/LaUpK1rSYdmj3Os4SNY0z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuSuk/btsKVbItWjm/LaUpK1rSYdmj3Os4SNY0z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuSuk/btsKVbItWjm/LaUpK1rSYdmj3Os4SNY0z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuuSuk%2FbtsKVbItWjm%2FLaUpK1rSYdmj3Os4SNY0z1%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.50.36.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://console.firebase.google.com/&quot;&gt;Firebase Console&lt;/a&gt;에 들어가서 아까 만든 프로젝트를 클릭해서 들어가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.35.23.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exsI5C/btsKVvfvly1/tPpYX1nZTeKfK03aeS5G8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exsI5C/btsKVvfvly1/tPpYX1nZTeKfK03aeS5G8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exsI5C/btsKVvfvly1/tPpYX1nZTeKfK03aeS5G8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexsI5C%2FbtsKVvfvly1%2FtPpYX1nZTeKfK03aeS5G8K%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.35.23.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 개요에서 플러터 아이콘을 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.53.34.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9SxIe/btsKUGBUEVn/0YCaHfN6NOJwmazUzSq4B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9SxIe/btsKUGBUEVn/0YCaHfN6NOJwmazUzSq4B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9SxIe/btsKUGBUEVn/0YCaHfN6NOJwmazUzSq4B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9SxIe%2FbtsKUGBUEVn%2F0YCaHfN6NOJwmazUzSq4B1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.53.34.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아래와 같이 플러터 앱에 파이어베이스를 추가하는 가이드 화면이 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 1번째 작업공간 준비는 이미 완료했으므로 다음 버튼을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.55.01.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpQCVF/btsKVsJWgET/l6T0bNsWbq6cIindJMhkfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpQCVF/btsKVsJWgET/l6T0bNsWbq6cIindJMhkfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpQCVF/btsKVsJWgET/l6T0bNsWbq6cIindJMhkfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpQCVF%2FbtsKVsJWgET%2Fl6T0bNsWbq6cIindJMhkfk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.55.01.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FlutterFire CLI 설치 및 실행에 대해서 설명하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.56.55.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dT7cgz/btsKTk7YMMz/2A1kBlnoUJioQppYsXqQEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dT7cgz/btsKTk7YMMz/2A1kBlnoUJioQppYsXqQEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dT7cgz/btsKTk7YMMz/2A1kBlnoUJioQppYsXqQEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdT7cgz%2FbtsKTk7YMMz%2F2A1kBlnoUJioQppYsXqQEK%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 4.56.55.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가이드 대로 터미널에서 아래 명령어를 실행하여 flitterfire cli를 활성화하자.&lt;/p&gt;
&lt;pre id=&quot;code_1732348793390&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dart pub global activate flutterfire_cli&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.00.13.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbsZaJ/btsKTx0i2kd/O5xWYhkfeqMCCtSPIPAl7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbsZaJ/btsKTx0i2kd/O5xWYhkfeqMCCtSPIPAl7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbsZaJ/btsKTx0i2kd/O5xWYhkfeqMCCtSPIPAl7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbsZaJ%2FbtsKTx0i2kd%2FO5xWYhkfeqMCCtSPIPAl7k%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.00.13.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 flitterfire cli를 활성화하면 PATH 설정을 하라는 안내문구가 나오는데 환경변수를 선언해줘야 다음 명령어를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 입력하여 환경변수 편집기에 들어가자.&lt;/p&gt;
&lt;pre id=&quot;code_1732351056606&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.37.59.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vwVNM/btsKTwG9scv/A8g2cuz7E8UIFKCEmONnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vwVNM/btsKTwG9scv/A8g2cuz7E8UIFKCEmONnlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vwVNM/btsKTwG9scv/A8g2cuz7E8UIFKCEmONnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvwVNM%2FbtsKTwG9scv%2FA8g2cuz7E8UIFKCEmONnlK%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.37.59.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 이런 창이 뜬다면 E 키를 눌러 수정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 곳에 아래 명령어를 입력하고 Esc 키를 누른 후 :wq 를 입력하여 저장 후 vi editer를 빠져나오자.&lt;/p&gt;
&lt;pre id=&quot;code_1732351256692&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export PATH=&quot;$PATH&quot;:&quot;$HOME/.pub-cache/bin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.39.15.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bybkbu/btsKUmp5gAA/dqRJTrZ2AsrY9hpKEZi0q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bybkbu/btsKUmp5gAA/dqRJTrZ2AsrY9hpKEZi0q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bybkbu/btsKUmp5gAA/dqRJTrZ2AsrY9hpKEZi0q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbybkbu%2FbtsKUmp5gAA%2FdqRJTrZ2AsrY9hpKEZi0q1%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.39.15.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 아래 명령어를 입력하여 수정한 파일을 적용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732351319359&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 &lt;b&gt;Flutter 프로젝트 디렉터리의 루트&lt;/b&gt; 에서 다음 명령어를 실행하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의할 점은 반드시 프로젝트 데렉터리의 &lt;b&gt;&quot;루트&quot;&lt;/b&gt; 경로에서 실행해줘야 한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.03.58.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SD7ng/btsKU5OTUhb/Y8qNW0UgBtGRJNPfsAVIRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SD7ng/btsKU5OTUhb/Y8qNW0UgBtGRJNPfsAVIRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SD7ng/btsKU5OTUhb/Y8qNW0UgBtGRJNPfsAVIRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSD7ng%2FbtsKU5OTUhb%2FY8qNW0UgBtGRJNPfsAVIRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2064&quot; height=&quot;1416&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.03.58.png&quot; data-origin-width=&quot;2064&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MacOS 에서는 Finder에서 프로젝트의 루트 경로까지 이동한 후 해당 폴더를 우클릭하여 '터미널에서 열기'를 클릭하여 해당 경로에서 바로 터미널을 열 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 아래 명령어를 실행하자.&lt;/p&gt;
&lt;pre id=&quot;code_1732349252676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutterfire configure --project=flutter-pjh1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어는 본인이 만든 프로젝트 명에 따라 달라지므로 가급적이면 가이드에서 제공한 명령어를 그대로 복사하여 사용하는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 실행하고 나면 아래와 같이 플랫폼을 선택하는 창이 나오는데 여기서 본인이 사용할 플랫폼을 선택하면 된다. 화살표 위, 아래 키로 이동할 수 있으며 스페이스 키를 누르면 선택/해제 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단은 안드로이드만 선택하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택이 완료되면 엔터키를 눌러 다음으로 넘어갈 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.26.01.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CTFH6/btsKTlMxtof/NsNxSbCPkOwq1yVgkRpQQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CTFH6/btsKTlMxtof/NsNxSbCPkOwq1yVgkRpQQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CTFH6/btsKTlMxtof/NsNxSbCPkOwq1yVgkRpQQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCTFH6%2FbtsKTlMxtof%2FNsNxSbCPkOwq1yVgkRpQQ1%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.26.01.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;FirebaseCommandException 에러 해결법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아래와 같이 어떤 안드로이드 애플리케이션 ID를 사용할 것이냐고 나타난다면 아마 뭔짓을 해도 다음으로 넘어가면 에러가 뜰 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br0sOf/btsKTYpr6EZ/EDV9U9EyI8JeZmtFW0XKMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br0sOf/btsKTYpr6EZ/EDV9U9EyI8JeZmtFW0XKMK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.13.11.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br0sOf/btsKTYpr6EZ/EDV9U9EyI8JeZmtFW0XKMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr0sOf%2FbtsKTYpr6EZ%2FEDV9U9EyI8JeZmtFW0XKMK%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;1684&quot; height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfyVGF/btsKTA3vQpL/W7E6TaWVjz6GqZTMMlDE1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfyVGF/btsKTA3vQpL/W7E6TaWVjz6GqZTMMlDE1K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.15.29.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfyVGF/btsKTA3vQpL/W7E6TaWVjz6GqZTMMlDE1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfyVGF%2FbtsKTA3vQpL%2FW7E6TaWVjz6GqZTMMlDE1K%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;1684&quot; height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;FirebaseCommandException: An error occured on the Firebase CLI when attempting to run a command.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;ERROR: Package name for Android app cannot be empty&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이런 에러가 떴다면 뻘짓하지말고 아래 명령어를 입력하자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732349924510&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dart pub global activate flutterfire_cli 1.0.1-dev.2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.20.03.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdQkzV/btsKUx6ksLf/fCqwARDGImrgwk2l9RJXkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdQkzV/btsKUx6ksLf/fCqwARDGImrgwk2l9RJXkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdQkzV/btsKUx6ksLf/fCqwARDGImrgwk2l9RJXkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdQkzV%2FbtsKUx6ksLf%2FfCqwARDGImrgwk2l9RJXkK%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.20.03.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.22.02.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgLRZ/btsKTWFyJMT/G9mmcEO9OcXKZDydDVTbS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgLRZ/btsKTWFyJMT/G9mmcEO9OcXKZDydDVTbS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgLRZ/btsKTWFyJMT/G9mmcEO9OcXKZDydDVTbS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgLRZ%2FbtsKTWFyJMT%2FG9mmcEO9OcXKZDydDVTbS0%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;1934&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.22.02.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처:&lt;a href=&quot;https://github.com/invertase/flutterfire_cli/issues/326&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;&amp;nbsp;https://github.com/invertase/flutterfire_cli/issues/326&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732350249614&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;[bug]:  flutterfire package name error &amp;middot; Issue #326 &amp;middot; invertase/flutterfire_cli&quot; data-og-description=&quot;Is there an existing issue for this? I have searched the existing issues. CLI Version 1.0.0 Firebase Tools version 13.13.0 Flutter Doctor Output [&amp;radic;] Flutter (Channel stable, 3.22.2, on Microsoft Wi...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/invertase/flutterfire_cli/issues/326&quot; data-og-url=&quot;https://github.com/invertase/flutterfire_cli/issues/326&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjEdnY/hyXDjGLXKo/NoFrAYNdKRAqBTxW3YqkO1/img.png?width=1200&amp;amp;height=600&amp;amp;face=976_125_1056_213,https://scrap.kakaocdn.net/dn/OBbVA/hyXzTiGyYM/znvFHEKDCIPBK6M3q63WgK/img.png?width=1200&amp;amp;height=600&amp;amp;face=976_125_1056_213&quot;&gt;&lt;a href=&quot;https://github.com/invertase/flutterfire_cli/issues/326&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/invertase/flutterfire_cli/issues/326&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjEdnY/hyXDjGLXKo/NoFrAYNdKRAqBTxW3YqkO1/img.png?width=1200&amp;amp;height=600&amp;amp;face=976_125_1056_213,https://scrap.kakaocdn.net/dn/OBbVA/hyXzTiGyYM/znvFHEKDCIPBK6M3q63WgK/img.png?width=1200&amp;amp;height=600&amp;amp;face=976_125_1056_213');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[bug]: flutterfire package name error &amp;middot; Issue #326 &amp;middot; invertase/flutterfire_cli&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Is there an existing issue for this? I have searched the existing issues. CLI Version 1.0.0 Firebase Tools version 13.13.0 Flutter Doctor Output [&amp;radic;] Flutter (Channel stable, 3.22.2, on Microsoft Wi...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대충 에러가 나는 이유가 build.gradle 프로젝트 셋업이 이전 버전이라 이러한 에러가 뜨는거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 아래 명령어를 실행하면 플랫폼을 선택하자마자 바로 설정이 완료되었다고 뜬다.&lt;/p&gt;
&lt;pre id=&quot;code_1732350414973&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutterfire configure --project=flutter-pjh1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.28.17.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lu46z/btsKVuOq0Bd/bk6CpJ51qgA8Jtvi7oSbHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lu46z/btsKVuOq0Bd/bk6CpJ51qgA8Jtvi7oSbHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lu46z/btsKVuOq0Bd/bk6CpJ51qgA8Jtvi7oSbHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flu46z%2FbtsKVuOq0Bd%2Fbk6CpJ51qgA8Jtvi7oSbHk%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;1684&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.28.17.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설정이 완료되고 나면 프로젝트의 lib 폴더에 firebase_options.dart 파일이 생겨난 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.29.16.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xzt87/btsKS96oRa9/hDl4KucRGroKzpDvCynTPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xzt87/btsKS96oRa9/hDl4KucRGroKzpDvCynTPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xzt87/btsKS96oRa9/hDl4KucRGroKzpDvCynTPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXzt87%2FbtsKS96oRa9%2FhDl4KucRGroKzpDvCynTPk%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.29.16.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 Firebase Console로 돌아와서 2단계 작업이 완료되었으므로 다음 버튼을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.46.14.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPNTo/btsKTobeC6S/MdRyzA5Zg23K6OpJDhjUWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPNTo/btsKTobeC6S/MdRyzA5Zg23K6OpJDhjUWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPNTo/btsKTobeC6S/MdRyzA5Zg23K6OpJDhjUWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPNTo%2FbtsKTobeC6S%2FMdRyzA5Zg23K6OpJDhjUWk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.46.14.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Flutter 프로젝트와 Firebase를 연동하기 위한 마지막 작업이 남았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계에서 설명하듯 연동을 완료하기 위해선 Firebase.initalizeApp을 호출하여 Firebase를 초기화해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.48.31.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLFQ8x/btsKTnp5tID/9M2gsGkDcpXf1RmGFesyDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLFQ8x/btsKTnp5tID/9M2gsGkDcpXf1RmGFesyDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLFQ8x/btsKTnp5tID/9M2gsGkDcpXf1RmGFesyDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLFQ8x%2FbtsKTnp5tID%2F9M2gsGkDcpXf1RmGFesyDk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.48.31.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 간단하게 lib 폴더 밑에 ch24_1 폴더를 생성하고 그 안에 test.dart 파일에 코드를 작성하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.50.27.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bweooz/btsKS6u8JVH/xvWUhaYM2vAZ7y9qaJ8wMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bweooz/btsKS6u8JVH/xvWUhaYM2vAZ7y9qaJ8wMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bweooz/btsKS6u8JVH/xvWUhaYM2vAZ7y9qaJ8wMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbweooz%2FbtsKS6u8JVH%2FxvWUhaYM2vAZ7y9qaJ8wMK%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;662&quot; height=&quot;442&quot; data-filename=&quot;스크린샷 2024-11-23 오후 5.50.27.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 코드를 작성하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732353017733&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Firebase와 Flutter 관련 패키지 임포트
import 'package:firebase_core/firebase_core.dart'; // Firebase 초기화 기능
import 'package:flutter/cupertino.dart'; // Cupertino 스타일 위젯을 위한 패키지
import '/firebase_options.dart'; // Firebase 설정 파일 (firebase_options.dart)

// 앱의 진입점 main() 함수
void main() async {
  // Flutter 프레임워크 초기화 작업을 보장하는 코드
  WidgetsFlutterBinding.ensureInitialized();

  // Firebase 초기화
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform, // 플랫폼에 맞는 Firebase 설정을 사용
  );

  // Firebase 초기화가 완료된 후 앱 실행
  runApp(MyApp());
}

// Flutter 앱의 구조를 정의하는 MyApp 클래스
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const CupertinoApp(
      title: 'Firebase Flutter App', // 앱의 제목
      home: CupertinoPageScaffold(
        navigationBar: CupertinoNavigationBar(
          middle: Text('Firebase 예제 202316035 박준혁'), // 내비게이션 바의 제목
        ),
        child: Center(
          child: Text('Firebase Initialized!'), // 화면 중앙에 텍스트 표시
        ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 앱이 정상적으로 실행된다면 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 6.34.06.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;1548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cepdOs/btsKS4xvj0c/TdvGy8BESzruTeLec3dkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cepdOs/btsKS4xvj0c/TdvGy8BESzruTeLec3dkt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cepdOs/btsKS4xvj0c/TdvGy8BESzruTeLec3dkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcepdOs%2FbtsKS4xvj0c%2FTdvGy8BESzruTeLec3dkt0%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;430&quot; height=&quot;927&quot; data-filename=&quot;스크린샷 2024-11-23 오후 6.34.06.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;1548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 작업을 마쳤으니 '콘솔로 이동' 버튼을 눌러 가이드를 종료하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 6.17.38.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vgVqU/btsKTn4rxpe/rko89WbOjSlpLHHHWjnpQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vgVqU/btsKTn4rxpe/rko89WbOjSlpLHHHWjnpQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vgVqU/btsKTn4rxpe/rko89WbOjSlpLHHHWjnpQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvgVqU%2FbtsKTn4rxpe%2Frko89WbOjSlpLHHHWjnpQ0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 6.17.38.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프로젝트 개요를 보면 내가 만들었던 Flutter 프로젝트와 연동된 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-23 오후 6.36.51.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cczWmE/btsKUyRFgh2/xOap00RVX9aiW5krJwAKtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cczWmE/btsKUyRFgh2/xOap00RVX9aiW5krJwAKtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cczWmE/btsKUyRFgh2/xOap00RVX9aiW5krJwAKtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcczWmE%2FbtsKUyRFgh2%2FxOap00RVX9aiW5krJwAKtk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-23 오후 6.36.51.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/76</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-12%EC%A3%BC%EC%B0%A8-%ED%94%8C%EB%9F%AC%ED%84%B0-%EC%95%B1%EA%B3%BC-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-MacOS#entry76comment</comments>
      <pubDate>Sat, 23 Nov 2024 18:38:56 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 11주차 - Youtube API를 이용한 동영상 플레이어 앱</title>
      <link>https://nicodora.tistory.com/entry/Flutter-11%EC%A3%BC%EC%B0%A8-Youtube-API%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8F%99%EC%98%81%EC%83%81-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EC%95%B1</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #FFC1C8 2px solid; margin: 10px 0px; border-left: #FFC1C8 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;11주차&amp;nbsp;-&amp;nbsp;Youtube&amp;nbsp;API를&amp;nbsp;이용한&amp;nbsp;동영상&amp;nbsp;플레이어&amp;nbsp;앱&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차에서는 간단하게 Youtube API를 이용한 동영상 플레이어 앱을 만들어 볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구글 API 키 얻기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브 API를 사용하기 위해선 구글의 API 키를 발급받아 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크로 들어가 본인의 구글 아이디로 로그인하면 다음과 같은 화면이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://console.cloud.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.44.17.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfcS2h/btsKOoVa9vF/VePK3rkysziSERfJ7nVq70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfcS2h/btsKOoVa9vF/VePK3rkysziSERfJ7nVq70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfcS2h/btsKOoVa9vF/VePK3rkysziSERfJ7nVq70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfcS2h%2FbtsKOoVa9vF%2FVePK3rkysziSERfJ7nVq70%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.44.17.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 처음 구글 콘솔에 접속하면 아무런 프로젝트가 선택되어 있지 않을텐데, 필자는 이미 이전에 구글 API를 사용한 적이 있어 프로젝트가 자동으로 선택되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측에 프로젝트 선택창을 클릭하여 프로젝트를 하나 추가해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.50.48.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dA4Z7O/btsKOrEnCjP/QJHIdqugsexe9VGuV2HF0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dA4Z7O/btsKOrEnCjP/QJHIdqugsexe9VGuV2HF0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dA4Z7O/btsKOrEnCjP/QJHIdqugsexe9VGuV2HF0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdA4Z7O%2FbtsKOrEnCjP%2FQJHIdqugsexe9VGuV2HF0K%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.50.48.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 이름은 YoutubeAPI로 지었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(테스트용이기 때문에 이름은 어떻게 써도 상관없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.52.08.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lN4lv/btsKNAWrMAL/V9KwE4JFziKoqlMqzS7Yp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lN4lv/btsKNAWrMAL/V9KwE4JFziKoqlMqzS7Yp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lN4lv/btsKNAWrMAL/V9KwE4JFziKoqlMqzS7Yp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlN4lv%2FbtsKNAWrMAL%2FV9KwE4JFziKoqlMqzS7Yp1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.52.08.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 잘 만들어 졌다면 'Youtube Data API v3'를 검색하여 선택하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.55.06.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgPnN/btsKOLJoPkk/fmrz4K7PmJnUMDPdtslY5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgPnN/btsKOLJoPkk/fmrz4K7PmJnUMDPdtslY5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgPnN/btsKOLJoPkk/fmrz4K7PmJnUMDPdtslY5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgPnN%2FbtsKOLJoPkk%2Ffmrz4K7PmJnUMDPdtslY5k%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.55.06.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Youtube API에 대한 정보가 뜨게 되는데 여기서 '사용'을 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.58.56.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQoBk/btsKM5vWLkO/XMnDYBfpHkUvfYOFYkyYqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQoBk/btsKM5vWLkO/XMnDYBfpHkUvfYOFYkyYqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQoBk/btsKM5vWLkO/XMnDYBfpHkUvfYOFYkyYqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQoBk%2FbtsKM5vWLkO%2FXMnDYBfpHkUvfYOFYkyYqK%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 8.58.56.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'사용'을 클릭한 후에 자동으로 API및 서비스 화면으로 리다이렉션 되는데, 왼쪽 메뉴에서 '사용자 인증 정보'를 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 9.00.48.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIYrhN/btsKOogByG9/RnfO5zydHOk5rGf4VnCAa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIYrhN/btsKOogByG9/RnfO5zydHOk5rGf4VnCAa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIYrhN/btsKOogByG9/RnfO5zydHOk5rGf4VnCAa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIYrhN%2FbtsKOogByG9%2FRnfO5zydHOk5rGf4VnCAa1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 9.00.48.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면 상단에 '사용자 인증 정보 만들기'를 클릭한 후 'API 키'를 눌러 API 키를 생성하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 9.04.31.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZWrJn/btsKM1NFMCH/3avz47R9rQ12gcWz3CQfwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZWrJn/btsKM1NFMCH/3avz47R9rQ12gcWz3CQfwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZWrJn/btsKM1NFMCH/3avz47R9rQ12gcWz3CQfwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZWrJn%2FbtsKM1NFMCH%2F3avz47R9rQ12gcWz3CQfwk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 9.04.31.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키 생성이 완료되면 아래와 같이 API 키가 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 해당 API키를 가지고 요청을 보내야 하므로 복사해서 잘 저장해놓자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-18 오후 9.08.11.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ysF4V/btsKOzI44Rq/609YcdJ8LHkFAsh1uhjZ8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ysF4V/btsKOzI44Rq/609YcdJ8LHkFAsh1uhjZ8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ysF4V/btsKOzI44Rq/609YcdJ8LHkFAsh1uhjZ8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FysF4V%2FbtsKOzI44Rq%2F609YcdJ8LHkFAsh1uhjZ8k%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-18 오후 9.08.11.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;youtube_player_flutter 패키지 가져오기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 유튜브 영상을 재생하기 위해서 youtube_player_flutter 패키지를 설치해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pub.dev로 이동하여 'youtube_player_flutter'를 검색하고 들어가자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.06.39.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1L4P/btsKOeT0Atj/fIqdboTUoOKnPK081YHUsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1L4P/btsKOeT0Atj/fIqdboTUoOKnPK081YHUsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1L4P/btsKOeT0Atj/fIqdboTUoOKnPK081YHUsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1L4P%2FbtsKOeT0Atj%2FfIqdboTUoOKnPK081YHUsk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.06.39.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.10.16.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxsu4I/btsKPdGQxia/SWHaveUgPS2Y4OsNd2oUd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxsu4I/btsKPdGQxia/SWHaveUgPS2Y4OsNd2oUd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxsu4I/btsKPdGQxia/SWHaveUgPS2Y4OsNd2oUd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxsu4I%2FbtsKPdGQxia%2FSWHaveUgPS2Y4OsNd2oUd1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.10.16.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 Installing 탭에 들어가서 dependencies에 넣을 패키지 정보를 복사하여 붙여넣자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.11.03.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WkGqm/btsKNBoz6Co/1DxiusudCnULXpigqS8kRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WkGqm/btsKNBoz6Co/1DxiusudCnULXpigqS8kRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WkGqm/btsKNBoz6Co/1DxiusudCnULXpigqS8kRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWkGqm%2FbtsKNBoz6Co%2F1DxiusudCnULXpigqS8kRk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.11.03.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막엔 Pub get 을 눌러 패키지 설치를 완료하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 9.16.10.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HcZ4i/btsKNZbJCie/qiEFTJhiyG7KuQSqXCJ3Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HcZ4i/btsKNZbJCie/qiEFTJhiyG7KuQSqXCJ3Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HcZ4i/btsKNZbJCie/qiEFTJhiyG7KuQSqXCJ3Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHcZ4i%2FbtsKNZbJCie%2FqiEFTJhiyG7KuQSqXCJ3Xk%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-11-19 오후 9.16.10.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 한 파일에 모든 소스코드를 작성하는 것이 아니라 기능별로 파일과 폴더를 구분하여 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.26.05.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S9GhD/btsKPPysDGR/2K31yQYIiy4wftzuKPEStK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S9GhD/btsKPPysDGR/2K31yQYIiy4wftzuKPEStK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S9GhD/btsKPPysDGR/2K31yQYIiy4wftzuKPEStK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS9GhD%2FbtsKPPysDGR%2F2K31yQYIiy4wftzuKPEStK%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;658&quot; height=&quot;398&quot; data-filename=&quot;스크린샷 2024-11-19 오후 8.26.05.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.dart&lt;/p&gt;
&lt;pre id=&quot;code_1732017387887&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter_202316035/youtube_project/screen/home_screen.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(
    const MaterialApp(
      home: HomeScreen(),
    )
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;coustom_youtube_player.dart&lt;/p&gt;
&lt;pre id=&quot;code_1732017453420&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart'; // Flutter의 기본 위젯 및 Material 디자인 라이브러리 임포트
import 'package:flutter_202316035/youtube_project/model/video_model.dart'; // VideoModel 클래스 임포트

// 유튜브 플레이어를 사용하기 위해 패키지 불러오기
import 'package:youtube_player_flutter/youtube_player_flutter.dart'; // 유튜브 플레이어 패키지 임포트

// 유튜브 동영상 플레이어가 될 위젯 클래스
class CustomYoutubePlayer extends StatefulWidget {
  // 상위 위젯에서 입력받을 동영상 정보
  final VideoModel videoModel; // 동영상 모델을 저장할 변수

  const CustomYoutubePlayer({
    required this.videoModel, // 필수 매개변수로 동영상 모델 받기
    super.key // 기본 키 매개변수 사용
  });

  @override
  State&amp;lt;CustomYoutubePlayer&amp;gt; createState() =&amp;gt; _CustomYoutubePlayerState(); // 상태 클래스 생성
}

class _CustomYoutubePlayerState extends State&amp;lt;CustomYoutubePlayer&amp;gt; {
  YoutubePlayerController? controller; // 유튜브 플레이어 컨트롤러 변수

  @override
  void initState() {
    super.initState(); // 부모 클래스의 initState 호출

    // 유튜브 플레이어 컨트롤러 초기화
    controller = YoutubePlayerController(
      initialVideoId: widget.videoModel.id, // 처음 실행할 동영상의 ID 설정
      flags: const YoutubePlayerFlags(
        autoPlay: false, // 자동 실행 사용하지 않기
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch, // 자식 위젯을 부모 위젯의 너비에 맞춤
      children: [
        // 유튜브 플레이어 위젯
        YoutubePlayer(
          controller: controller!, // 설정한 컨트롤러를 사용
          showVideoProgressIndicator: true, // 동영상 진행 표시기 표시
        ),
        const SizedBox(height: 16.0), // 위젯 간 간격 설정
        Padding(
          padding: const EdgeInsets.symmetric(horizontal: 8.0), // 좌우 패딩 설정
          child: Text(
            widget.videoModel.title, // 동영상 제목 표시
            style: const TextStyle(
              color: Colors.white, // 텍스트 색상 흰색
              fontSize: 16.0, // 텍스트 크기 설정
              fontWeight: FontWeight.w700, // 텍스트 굵기 설정
            ),
          ),
        )
      ],
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;video_model.dart&lt;/p&gt;
&lt;pre id=&quot;code_1732017476471&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// VideoModel 클래스: 동영상 정보를 저장하는 모델
class VideoModel {
  final String id; // 동영상 ID
  final String title; // 동영상 제목

  // 생성자: VideoModel 인스턴스를 생성할 때 사용
  VideoModel({
    required this.id, // ID는 필수 매개변수
    required this.title // 제목은 필수 매개변수
  });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;home_screen.dart&lt;/p&gt;
&lt;pre id=&quot;code_1732017500171&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter_202316035/youtube_project/component/custom_youtube_player.dart'; // CustomYoutubePlayer 위젯 임포트
import 'package:flutter_202316035/youtube_project/model/video_model.dart'; // VideoModel 클래스 임포트
import 'package:flutter/material.dart'; // Flutter의 Material 디자인 라이브러리 임포트

// HomeScreen 클래스: 앱의 홈 화면을 구성하는 StatelessWidget
class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key}); // 생성자: 키를 받아 초기화

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('202316035 박준혁'),
      ),
      // 기본 구조인 Scaffold 위젯 반환
      backgroundColor: Colors.black, // 배경색을 검정색으로 설정
      body: CustomYoutubePlayer(
        // CustomYoutubePlayer 위젯 사용
        videoModel: VideoModel(
          // VideoModel 인스턴스 생성
          id: '3Ck42C2ZCb8', // 동영상 ID 설정
          title: '다트언어 기본기 1시간만에 끝내기' // 동영상 제목 설정
        )
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 실행 결과 아래와 같이 동영상이 잘 플레이 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YCX1m/btsKQaoQJCb/itJxKOQUNEi7skhgBt9LhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YCX1m/btsKQaoQJCb/itJxKOQUNEi7skhgBt9LhK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;1544&quot; data-filename=&quot;스크린샷 2024-11-19 오후 9.19.21.png&quot; style=&quot;width: 49.0806%; margin-right: 10px;&quot; data-widthpercent=&quot;49.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YCX1m/btsKQaoQJCb/itJxKOQUNEi7skhgBt9LhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYCX1m%2FbtsKQaoQJCb%2FitJxKOQUNEi7skhgBt9LhK%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;726&quot; height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3navp/btsKPzbQuhL/bttLX1CMyAXPwEEbp7GcV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3navp/btsKPzbQuhL/bttLX1CMyAXPwEEbp7GcV0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;1544&quot; data-filename=&quot;스크린샷 2024-11-19 오후 9.20.42.png&quot; style=&quot;width: 49.7566%;&quot; data-widthpercent=&quot;50.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3navp/btsKPzbQuhL/bttLX1CMyAXPwEEbp7GcV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3navp%2FbtsKPzbQuhL%2FbttLX1CMyAXPwEEbp7GcV0%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;736&quot; height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/75</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-11%EC%A3%BC%EC%B0%A8-Youtube-API%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8F%99%EC%98%81%EC%83%81-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EC%95%B1#entry75comment</comments>
      <pubDate>Tue, 19 Nov 2024 21:23:10 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 10주차 - dio 패키지를 이용해 reqres.in 사이트에서 API 정보 가져오기</title>
      <link>https://nicodora.tistory.com/entry/Flutter-10%EC%A3%BC%EC%B0%A8-dio-%ED%8C%A8%ED%82%A4%EC%A7%80%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-reqresin-%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%97%90%EC%84%9C-API-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #FFC1C8 2px solid; margin: 10px 0px; border-left: #FFC1C8 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 10주차 - dio 패키지를 이용해 reqres.in 사이트에서 API 정보 가져오기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차에서는 &lt;a href=&quot;https://reqres.in/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;reqres.in&lt;/a&gt; 사이트에서 제공하는 API를 사용해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;유저 정보 리스트를 구현할 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;dio 패키지 가져오기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 HTTP 요청을 처리할 수 있도록 하는 dio 패키지를 사용해서 구현할 예정이므로 &lt;a href=&quot;https://pub.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pub.dev&lt;/a&gt; 에 들어가 dio 패키지를 설치하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.26.57.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMQlQ/btsKC1UtkkO/SnnruA8dCFC46iuwGpATpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMQlQ/btsKC1UtkkO/SnnruA8dCFC46iuwGpATpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMQlQ/btsKC1UtkkO/SnnruA8dCFC46iuwGpATpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMQlQ%2FbtsKC1UtkkO%2FSnnruA8dCFC46iuwGpATpk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.26.57.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 방법대로 dependencies 에 dio를 추가한 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.29.16.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mqj5I/btsKCd9gmBi/xrgNRORlwwqqM6biIGzNY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mqj5I/btsKCd9gmBi/xrgNRORlwwqqM6biIGzNY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mqj5I/btsKCd9gmBi/xrgNRORlwwqqM6biIGzNY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqj5I%2FbtsKCd9gmBi%2FxrgNRORlwwqqM6biIGzNY0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.29.16.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pub get를 눌러 패키지를 설치하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.31.04.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdCy2L/btsKDWrkyer/kDgrEXkaTfnlay3NmqY1Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdCy2L/btsKDWrkyer/kDgrEXkaTfnlay3NmqY1Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdCy2L/btsKDWrkyer/kDgrEXkaTfnlay3NmqY1Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdCy2L%2FbtsKDWrkyer%2FkDgrEXkaTfnlay3NmqY1Y1%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.31.04.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;reqres.in 유저 리스트 API 확인하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reqres.in/api-docs/#/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://reqres.in/api-docs/#/&lt;/a&gt; &lt;span style=&quot;color: #333333;&quot;&gt;사이트에 들어가보면 reqres.in에서 제공하는 API들의 문서를 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.38.43.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hkal0/btsKCNCb6J4/k2kLjcktGkUgX7LqjjKFw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hkal0/btsKCNCb6J4/k2kLjcktGkUgX7LqjjKFw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hkal0/btsKCNCb6J4/k2kLjcktGkUgX7LqjjKFw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHkal0%2FbtsKCNCb6J4%2Fk2kLjcktGkUgX7LqjjKFw0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.38.43.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 사용할 유저 리스트 API에 대한 문서를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.41.12.png&quot; data-origin-width=&quot;2276&quot; data-origin-height=&quot;1510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VqOo/btsKD5uTmaY/J6t3pWuwFGRv56QFFBWWf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VqOo/btsKD5uTmaY/J6t3pWuwFGRv56QFFBWWf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VqOo/btsKD5uTmaY/J6t3pWuwFGRv56QFFBWWf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VqOo%2FbtsKD5uTmaY%2FJ6t3pWuwFGRv56QFFBWWf1%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;2276&quot; height=&quot;1510&quot; data-filename=&quot;스크린샷 2024-11-10 오후 6.41.12.png&quot; data-origin-width=&quot;2276&quot; data-origin-height=&quot;1510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 정보를 통해서 /users 의 경로로 page나 per_page param값을 담아 GET 요청을 보내면 사진과 같이 JSON 형식으로 유저들의 정보가 담겨온다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 정보를 통해서 코드를 작성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731235046213&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart'; // Flutter의 Material 디자인 패키지 가져오기
import 'package:dio/dio.dart'; // dio 패키지를 가져와서 HTTP 요청을 처리할 수 있도록 함

void main() {
  runApp(MyApp()); // MyApp 위젯을 실행하여 앱 시작
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'User List', // 앱의 제목 설정
      theme: ThemeData(
        primarySwatch: Colors.blue, // 기본 색상 테마 설정
      ),
      home: UserListScreen(), // 홈 화면으로 UserListScreen 위젯을 설정
    );
  }
}

class UserListScreen extends StatefulWidget {
  const UserListScreen({super.key});

  @override
  State&amp;lt;UserListScreen&amp;gt; createState() =&amp;gt; _UserListScreenState(); // 상태를 관리하는 클래스 생성
}

class _UserListScreenState extends State&amp;lt;UserListScreen&amp;gt; {
  final Dio _dio = Dio(); // Dio 인스턴스를 생성하여 API 요청을 수행할 준비
  List&amp;lt;dynamic&amp;gt; _users = []; // 사용자 데이터를 저장할 리스트
  bool _isLoading = true; // 로딩 상태를 나타내는 변수
  bool _isLoadingMore = false; // 추가 데이터 로딩 상태 변수
  String _errorMessage = ''; // 오류 메시지를 저장할 변수
  int _currentPage = 1; // 현재 페이지 번호
  final ScrollController _scrollController = ScrollController(); // 스크롤 컨트롤러

  @override
  void initState() {
    super.initState();
    _fetchUsers(); // 초기 데이터를 불러오기
    _scrollController.addListener(_scrollListener); // 스크롤 이벤트 리스너 추가
  }

  @override
  void dispose() {
    _scrollController.dispose(); // 위젯이 사라질 때 컨트롤러 해제
    super.dispose();
  }

  // 스크롤 리스너 메서드
  void _scrollListener() {
    // 현재 스크롤 위치가 최하단일 경우 다음 페이지 데이터 불러오기
    if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
      _fetchMoreUsers();
    }
  }

  // 사용자 데이터를 가져오는 비동기 메서드
  Future&amp;lt;void&amp;gt; _fetchUsers() async {
    try {
      final response = await _dio.get('https://reqres.in/api/users?page=$_currentPage');

      if (response.statusCode == 200) {
        setState(() {
          _users = response.data['data'];
          _isLoading = false;
        });
      } else {
        setState(() {
          _errorMessage = '오류 발생: ${response.statusCode}';
          _isLoading = false;
        });
      }
    } on DioException catch (e) {
      setState(() {
        _errorMessage = '요청 중 오류 발생: $e';
        _isLoading = false;
      });
    }
  }

  // 다음 페이지의 사용자 데이터를 추가로 가져오는 메서드
  Future&amp;lt;void&amp;gt; _fetchMoreUsers() async {
    if (_isLoadingMore) return; // 이미 추가 데이터를 로딩 중이면 실행하지 않음

    setState(() {
      _isLoadingMore = true; // 추가 데이터 로딩 상태를 true로 설정
    });

    try {
      final response = await _dio.get('https://reqres.in/api/users?page=${_currentPage + 1}');

      if (response.statusCode == 200) {
        setState(() {
          _currentPage++; // 페이지 번호 증가
          _users.addAll(response.data['data']); // 새로운 데이터를 기존 리스트에 추가
          _isLoadingMore = false; // 추가 데이터 로딩 상태를 false로 설정
        });
      } else {
        setState(() {
          _errorMessage = '오류 발생: ${response.statusCode}';
          _isLoadingMore = false;
        });
      }
    } on DioException catch (e) {
      setState(() {
        _errorMessage = '요청 중 오류 발생: $e';
        _isLoadingMore = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('사용자 목록'),
      ),
      body: _isLoading
          ? Center(child: CircularProgressIndicator())
          : _errorMessage.isNotEmpty
          ? Center(child: Text(_errorMessage))
          : Column(
        children: [
          Expanded(
            child: ListView.separated(
              controller: _scrollController, // 스크롤 컨트롤러 설정
              itemCount: _users.length,
              separatorBuilder: (context, index) =&amp;gt; Divider(),
              itemBuilder: (context, index) {
                final user = _users[index];
                return ListTile(
                  contentPadding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 16.0),
                  title: Text(user['first_name'] + ' ' + user['last_name']),
                  leading: CircleAvatar(
                    backgroundImage: NetworkImage(user['avatar']),
                  ),
                );
              },
            ),
          ),
          if (_isLoadingMore)
            Padding(
              padding: EdgeInsets.symmetric(vertical: 10),
              child: CircularProgressIndicator(), // 추가 데이터를 로딩 중일 때 로딩 인디케이터 표시
            ),
        ],
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EC6Y5/btsKDYbCOGT/WZGG9nIZ6fihbYmEBLdwK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EC6Y5/btsKDYbCOGT/WZGG9nIZ6fihbYmEBLdwK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;1544&quot; data-filename=&quot;스크린샷 2024-11-10 오후 7.39.29.png&quot; style=&quot;width: 49.626%; margin-right: 10px;&quot; data-widthpercent=&quot;50.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EC6Y5/btsKDYbCOGT/WZGG9nIZ6fihbYmEBLdwK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEC6Y5%2FbtsKDYbCOGT%2FWZGG9nIZ6fihbYmEBLdwK1%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;732&quot; height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4CpL3/btsKC5CyMQD/P9GNxq6iM515qk4RogQyT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4CpL3/btsKC5CyMQD/P9GNxq6iM515qk4RogQyT1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;1540&quot; data-filename=&quot;스크린샷 2024-11-10 오후 7.39.54.png&quot; style=&quot;width: 49.2112%;&quot; data-widthpercent=&quot;49.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4CpL3/btsKC5CyMQD/P9GNxq6iM515qk4RogQyT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4CpL3%2FbtsKC5CyMQD%2FP9GNxq6iM515qk4RogQyT1%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;724&quot; height=&quot;1540&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reqres.in에서 유저 정보 리스트를 불러와서 유저의 이름과 성, 아바타를 표시해주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 스크롤하면 다음 페이지의 유저 리스트 API 요청을 보내 계속해서 유저 정보가 보이도록 수정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/74</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-10%EC%A3%BC%EC%B0%A8-dio-%ED%8C%A8%ED%82%A4%EC%A7%80%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-reqresin-%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%97%90%EC%84%9C-API-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0#entry74comment</comments>
      <pubDate>Sun, 10 Nov 2024 19:42:36 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 9주차 - 카카오 API를 이용해 도서 정보 가져오기</title>
      <link>https://nicodora.tistory.com/entry/Flutter-9%EC%A3%BC%EC%B0%A8-%EC%B9%B4%EC%B9%B4%EC%98%A4-API%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EB%8F%84%EC%84%9C-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #FFC1C8 2px solid; margin: 10px 0px; border-left: #FFC1C8 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;9주차&amp;nbsp;-&amp;nbsp;카카오&amp;nbsp;API를&amp;nbsp;이용해&amp;nbsp;도서&amp;nbsp;정보&amp;nbsp;가져오기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차에서는 카카오 API를 이용해 도서 정보를 가져오는 실습을 진행할 예정이다.&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입력 : 사용자가 원하는 검색어를 입력할 수 있는 TextField 제공.&lt;/li&gt;
&lt;li&gt;스크롤 감지 : 사용자가 리스트를 아래로 스크롤 할 때 데이터 로드.&lt;/li&gt;
&lt;li&gt;API 호출 : 카카오의 도서 정보 API로 데이터를 가져옴.&lt;/li&gt;
&lt;li&gt;결과 표시 : 가져온 데이터를 리스트 형태로 표시.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;padding: 0em 1em 0em 1em; margin: 0.5em 0em; border-left: 10px solid #99CEFA;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ol&gt;
&lt;script type=&quot;text/javascript&quot;&gt; $(function(){  $(&quot;#toc&quot;).toc({content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h3&quot;}); });&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;http 패키지 가져오기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 HTTP 통신을 통해 카카오 API에 요청할 예정이므로 HTTP 패키지가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pub.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pub.dev&lt;/a&gt; 로 이동하여 패키지 설치를 진행하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.33.37.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEo54z/btsKw5BAMAr/0lZeRGIzDkC52A26qY5l80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEo54z/btsKw5BAMAr/0lZeRGIzDkC52A26qY5l80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEo54z/btsKw5BAMAr/0lZeRGIzDkC52A26qY5l80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEo54z%2FbtsKw5BAMAr%2F0lZeRGIzDkC52A26qY5l80%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;2940&quot; height=&quot;1616&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.33.37.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.37.22.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/picdB/btsKvDfxqnF/4VEA3yxV16ZXRv2LR6nvy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/picdB/btsKvDfxqnF/4VEA3yxV16ZXRv2LR6nvy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/picdB/btsKvDfxqnF/4VEA3yxV16ZXRv2LR6nvy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpicdB%2FbtsKvDfxqnF%2F4VEA3yxV16ZXRv2LR6nvy1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.37.22.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.39.05.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vvYrL/btsKvcvIHif/7gf5GpWgVSG36uxMIf8da1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vvYrL/btsKvcvIHif/7gf5GpWgVSG36uxMIf8da1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vvYrL/btsKvcvIHif/7gf5GpWgVSG36uxMIf8da1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvvYrL%2FbtsKvcvIHif%2F7gf5GpWgVSG36uxMIf8da1%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;3164&quot; height=&quot;2062&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.39.05.png&quot; data-origin-width=&quot;3164&quot; data-origin-height=&quot;2062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시대로 dependencies에 http 패키지를 추가한 후, 우측 상단에 Pub get를 눌러 패키지를 설치하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;카카오에서 API 키 얻기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오 API를 사용하기 위해선 API키가 필요한데, 키를 얻기 위해선 카카오 개발자 사이트에 로그인하고 애플리케이션을 추가해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://developers.kakao.com&quot;&gt;https://developers.kakao.com&lt;/a&gt; &lt;span style=&quot;color: #333333;&quot;&gt;에 접속하면 아래와 같은 화면이 나올 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;먼저 우측 상단 로그인을 클릭해서 로그인하자. 로그인은 본인의 카카오 아이디로 진행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.44.10.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBiFna/btsKwo2XTdC/s9udLcBDwPKWkS0NUswuW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBiFna/btsKwo2XTdC/s9udLcBDwPKWkS0NUswuW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBiFna/btsKwo2XTdC/s9udLcBDwPKWkS0NUswuW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBiFna%2FbtsKwo2XTdC%2Fs9udLcBDwPKWkS0NUswuW0%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.44.10.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인이 완료되면 상단의 '내 애플리케이션'을 클릭하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.51.32.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfgb7v/btsKvnqjPOd/6XpNzJ5yGDBIlIUanIIkI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfgb7v/btsKvnqjPOd/6XpNzJ5yGDBIlIUanIIkI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfgb7v/btsKvnqjPOd/6XpNzJ5yGDBIlIUanIIkI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfgb7v%2FbtsKvnqjPOd%2F6XpNzJ5yGDBIlIUanIIkI1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.51.32.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'애플리케이션 추가하기'를 눌러 테스트용 애플리케이션을 추가해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.55.23.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bngsKs/btsKv8MPU8S/uUuN4c9KADdgYfgrhCKqF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bngsKs/btsKv8MPU8S/uUuN4c9KADdgYfgrhCKqF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bngsKs/btsKv8MPU8S/uUuN4c9KADdgYfgrhCKqF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbngsKs%2FbtsKv8MPU8S%2FuUuN4c9KADdgYfgrhCKqF1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.55.23.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 이름은 'httpBook'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사명은 본인의 학교 이름 혹은 일단 아무거나 적어도 괜찮다. (실제로 서비스에 사용하지는 않으므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카테고리는 API를 사용하려는 애플리케이션의 카테고리를 선택하면 되는데 일단 교육으로 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.57.22.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2NqTS/btsKv8MPVF8/K1c8WovNBFCkPHSlQLaFzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2NqTS/btsKv8MPVF8/K1c8WovNBFCkPHSlQLaFzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2NqTS/btsKv8MPVF8/K1c8WovNBFCkPHSlQLaFzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2NqTS%2FbtsKv8MPVF8%2FK1c8WovNBFCkPHSlQLaFzk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 8.57.22.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션이 추가되고 나면, 방금 만든 httpBook을 클릭하여 들어가보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 9.00.24.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7BVX8/btsKuT380py/9HYHuIIrT8EnLL7jeVu5t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7BVX8/btsKuT380py/9HYHuIIrT8EnLL7jeVu5t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7BVX8/btsKuT380py/9HYHuIIrT8EnLL7jeVu5t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7BVX8%2FbtsKuT380py%2F9HYHuIIrT8EnLL7jeVu5t1%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 9.00.24.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 메뉴에서 '앱 키'를 선택하고 '&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;REST API 키' 를 잘 복사하여 저장해놓자. 도서 정보 API를 사용하기 위해선 이 키가 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 키는 각 애플리케이션마다 고유한 값을 가지므로 절대 유출되지 않도록 보안에 신경써서 보관해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 앱 키가 유출되었으면 재발급해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-04 오후 9.01.37.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cz5UAY/btsKw52Edve/ilpEQur3K2XJgCiVKedxIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cz5UAY/btsKw52Edve/ilpEQur3K2XJgCiVKedxIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cz5UAY/btsKw52Edve/ilpEQur3K2XJgCiVKedxIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcz5UAY%2FbtsKw52Edve%2FilpEQur3K2XJgCiVKedxIk%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;2940&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2024-11-04 오후 9.01.37.png&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;카카오 도서 정보 API 사용법 확인하기&lt;/b&gt;&lt;/h3&gt;
&lt;p 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;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730722103834&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;Kakao Developers&quot; data-og-description=&quot;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&quot; data-og-host=&quot;developers.kakao.com&quot; data-og-source-url=&quot;https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book&quot; data-og-url=&quot;https://developers.kakao.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crsXZn/hyXsP0ETyZ/5mlR3RgqY8wGB0IRthzVOK/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/AxY2R/hyXs4Q24wN/j1rABq4g3OLwySqlfSDBF1/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/wB3ff/hyXsQL2Kpo/Dzx9qIJSkaVbKZ65LJKD00/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000&quot;&gt;&lt;a href=&quot;https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crsXZn/hyXsP0ETyZ/5mlR3RgqY8wGB0IRthzVOK/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/AxY2R/hyXs4Q24wN/j1rABq4g3OLwySqlfSDBF1/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000,https://scrap.kakaocdn.net/dn/wB3ff/hyXsQL2Kpo/Dzx9qIJSkaVbKZ65LJKD00/img.png?width=3840&amp;amp;height=1000&amp;amp;face=0_0_3840_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Kakao Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 문서에 들어가보면 책 검색 API의 기본 정보를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-05 오후 5.53.18.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MvINO/btsKyr5Xzpi/RLfVovNXZPJmo8omI8KbKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MvINO/btsKyr5Xzpi/RLfVovNXZPJmo8omI8KbKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MvINO/btsKyr5Xzpi/RLfVovNXZPJmo8omI8KbKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMvINO%2FbtsKyr5Xzpi%2FRLfVovNXZPJmo8omI8KbKk%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;1544&quot; height=&quot;1402&quot; data-filename=&quot;스크린샷 2024-11-05 오후 5.53.18.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 우리가 사용할 응답값은 title(도서 제목), contents(도서 소개), url(도서 상세 url), authors(도서 저자 리스트), price(도서 정가), sale_price(도서 판매가), thumbnail(도서 표지 미리보기 URL), status(도서 판매 상태 정보) 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 내려보면 해당 응답값들이 실제로 어떻게 오는지 예시를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-05 오후 6.08.47.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj7o3t/btsKwqndM4p/xZCQDsimORMgxhkDh2nZi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj7o3t/btsKwqndM4p/xZCQDsimORMgxhkDh2nZi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj7o3t/btsKwqndM4p/xZCQDsimORMgxhkDh2nZi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj7o3t%2FbtsKwqndM4p%2FxZCQDsimORMgxhkDh2nZi1%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;1542&quot; height=&quot;1404&quot; data-filename=&quot;스크린샷 2024-11-05 오후 6.08.47.png&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; border-right-width: 0px; border-bottom: #9FEEC3 2px solid; margin: 10px 0px; border-left: #9FEEC3 10px solid; letter-spacing: 1px; line-height: 2; border-top-width: 0px; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730803278639&quot; class=&quot;dart&quot; data-ke-language=&quot;dart&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart'; // Flutter의 Material 디자인 라이브러리
import 'package:flutter_202316035/http/test.dart';
import 'package:http/http.dart' as http; // HTTP 요청을 위한 라이브러리
import 'dart:convert'; // JSON 변환을 위한 라이브러리

// 앱의 진입점
void main() {
  runApp(MyApp()); // MyApp 위젯 실행
}

// MyApp 클래스는 애플리케이션의 루트 위젯을 정의
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // MaterialApp을 사용하여 앱의 구조를 설정
    return const MaterialApp(
      home: HttpApp(), // HttpApp을 홈 화면으로 설정
    );
  }
}

// HttpApp 클래스는 StatefulWidget으로 상태를 관리
class HttpApp extends StatefulWidget {
  const HttpApp({super.key});

  @override
  State&amp;lt;HttpApp&amp;gt; createState() =&amp;gt; _HttpAppState(); // 상태 객체 생성
}

// _HttpApp 클래스는 HttpApp의 상태를 정의
class _HttpAppState extends State&amp;lt;HttpApp&amp;gt; {
  List&amp;lt;dynamic&amp;gt;? data; // API에서 가져온 데이터를 저장할 리스트
  TextEditingController _editingController = TextEditingController(); // 검색어 입력을 위한 컨트롤러
  ScrollController _scrollController = ScrollController(); // 스크롤 이벤트를 처리하기 위한 컨트롤러
  int page = 1; // 현재 페이지 번호

  @override
  void initState() {
    super.initState();
    data = []; // 데이터 리스트 초기화
    // 스크롤 리스너 추가: 스크롤이 끝에 도달하면 다음 페이지 데이터 요청
    _scrollController.addListener(() {
      if (_scrollController.offset &amp;gt;= _scrollController.position.maxScrollExtent &amp;amp;&amp;amp; !_scrollController.position.outOfRange) {
        page++; // 페이지 번호 증가
        getJSONData(); // 다음 페이지 데이터 요청
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // AppBar에 검색 입력 필드를 추가
        title: TextField(
          controller: _editingController, // 입력 컨트롤러 설정
          style: const TextStyle(color: Colors.blue), // 텍스트 색상 설정
          decoration: const InputDecoration(hintText: &quot;검색어를 입력하세요.&quot;), // 힌트 텍스트
        ),
      ),
      body: Container(
        padding: const EdgeInsets.all(16.0), // 컨테이너에 패딩 추가
        child: Center(
          child: data!.isEmpty // 데이터가 없을 경우
            ? const Text(
            '데이터가 없습니다.', // 데이터가 없다는 메시지
            style:  TextStyle(fontSize: 20),
            textAlign: TextAlign.center,
          )
          : ListView.builder(
            itemCount: data!.length, // 데이터 개수
            itemBuilder: (context, index) {
              // ListView.builder를 사용하여 데이터 리스트 생성
              return Card(
                child: Row(
                  children: &amp;lt;Widget&amp;gt;[
                    // 책의 썸네일 이미지를 표시
                    Image.network(
                      data![index]['thumbnail'],
                      height: 100,
                      width: 100,
                      fit: BoxFit.contain,
                    ),
                    Expanded(
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start, // 좌측 정렬
                          children: &amp;lt;Widget&amp;gt;[
                            // 책 제목
                            Text(data![index]['title'].toString(),
                            textAlign: TextAlign.center),
                            // 저자, 가격, 판매 상태 표시
                            Text('저자: ${data![index]['authors'].toString()}'),
                            Text('가격: ${data![index]['sale_price'].toString()}'),
                            Text('판매중: ${data![index]['status'].toString()}'),
                          ],
                        ))
                  ],
                ),
              );
            },
            controller: _scrollController, // 스크롤 컨트롤러 설정
          )
        ),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: () {
            // FAB 클릭 시 페이지 초기화 및 데이터 새로고침
            page = 1; // 페이지 번호 초기화
            data!.clear(); // 데이터 리스트 초기화
            getJSONData(); // 새로운 데이터 요청
          },
        child: const Icon(Icons.file_download), // 다운로드 아이콘
      ),
    );
  }

  // JSON 데이터를 가져오는 비동기 함수
  Future&amp;lt;void&amp;gt; getJSONData() async {
    // Kakao API에서 데이터 요청
    var url = 'https://dapi.kakao.com/v3/search/book?target=title&amp;amp;page=$page&amp;amp;query=${Uri.encodeQueryComponent(_editingController.text)}';
    try {
      // HTTP GET 요청
      var response = await http.get(Uri.parse(url),
          headers: {'Authorization': &quot;KakaoAK 44144042718c0c1a63399dbc8e0e08cd&quot;});

      // 응답 상태 코드가 200일 경우
      if (response.statusCode == 200) {
        setState(() {
          var dataConvertedToJSON = json.decode(response.body); // JSON 변환
          List&amp;lt;dynamic&amp;gt; result = dataConvertedToJSON['documents']; // 책 데이터
          data!.addAll(result); // 기존 테이터에 추가
        });
      } else {
        throw Exception('Failed to load data'); // 오류 처리
      }
    } catch (e) {
      print('Error: $e'); // 오류 메시지 출력
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행한 결과는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색어를 입력하고 다운로드 아이콘을 클릭하면 검색어가 포함된 책들의 정보를 불러오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트를 아래로 스크롤하면 추가 정보를 가져오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1pjI/btsKygcreRp/rdxwct85uzw3LNZqyvsKo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1pjI/btsKygcreRp/rdxwct85uzw3LNZqyvsKo1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;1534&quot; data-filename=&quot;스크린샷 2024-11-05 오후 7.43.47.png&quot; data-widthpercent=&quot;33.39&quot; style=&quot;width: 32.613%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1pjI/btsKygcreRp/rdxwct85uzw3LNZqyvsKo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1pjI%2FbtsKygcreRp%2Frdxwct85uzw3LNZqyvsKo1%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;718&quot; height=&quot;1534&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RmDbr/btsKxvuosjt/lk0UKittKsoH5kUXk0mKek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RmDbr/btsKxvuosjt/lk0UKittKsoH5kUXk0mKek/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;1540&quot; data-filename=&quot;스크린샷 2024-11-05 오후 7.44.20.png&quot; style=&quot;width: 32.8479%; margin-right: 10px;&quot; data-widthpercent=&quot;33.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RmDbr/btsKxvuosjt/lk0UKittKsoH5kUXk0mKek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRmDbr%2FbtsKxvuosjt%2Flk0UKittKsoH5kUXk0mKek%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;726&quot; height=&quot;1540&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRocwm/btsKyEqvJcJ/ccw0XeAjtsmxWXuhmmdLbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRocwm/btsKyEqvJcJ/ccw0XeAjtsmxWXuhmmdLbk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;1566&quot; data-filename=&quot;스크린샷 2024-11-05 오후 7.46.19.png&quot; style=&quot;width: 32.2135%;&quot; data-widthpercent=&quot;32.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRocwm/btsKyEqvJcJ/ccw0XeAjtsmxWXuhmmdLbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRocwm%2FbtsKyEqvJcJ%2Fccw0XeAjtsmxWXuhmmdLbk%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;724&quot; height=&quot;1566&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>flutter</category>
      <author>NicoDora</author>
      <guid isPermaLink="true">https://nicodora.tistory.com/73</guid>
      <comments>https://nicodora.tistory.com/entry/Flutter-9%EC%A3%BC%EC%B0%A8-%EC%B9%B4%EC%B9%B4%EC%98%A4-API%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EB%8F%84%EC%84%9C-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0#entry73comment</comments>
      <pubDate>Tue, 5 Nov 2024 19:48:22 +0900</pubDate>
    </item>
  </channel>
</rss>