<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발조각</title>
    <link>https://development-piece.tistory.com/</link>
    <description>개발조각의 개발일기 및 프로그래머스문제 풀이 위주로 쓰고 있습니다.</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 12:55:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발조각</managingEditor>
    <image>
      <title>개발조각</title>
      <url>https://tistory1.daumcdn.net/tistory/5228355/attach/1bd5854ef0664434897f586a5023c7e3</url>
      <link>https://development-piece.tistory.com</link>
    </image>
    <item>
      <title>Next.js 14 최신버전 이해하기 및 Next.js 사용하기(1)</title>
      <link>https://development-piece.tistory.com/465</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 라이브러리와 프레임워크의 차이&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;라이브러리&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 코드에 직접 사용하여 원하는 방식으로 동작하게끔 아키텍처를 자유롭게 설계할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;React&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: UI를 구축하기 위한 대표적인 라이브러리, 개발자가 원하는 방식으로 자유롭게 코드를 작성할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프레임워크&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 특정 규칙과 자동화된 기능을 제공해 코드의 흐름을 프레임워크가 주도한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Next.js&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 프레임워크로, 다양한 결정을 대신해 주고 자동화된 기능을 제공한다. 예를 들어, 데이터 페칭을 자동으로 처리해 주기 때문에 개발자는 이 규칙을 따르면서 코드를 작성해야 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;요약 : 라이브러리는 사용자가 코드를 주도하고, 프레임워크는 사용자의 코드를 주도합니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. Next.js 라우팅 시스템&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js는 두 가지 라우터를 제공한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Page Router&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Next.js 12까지의 방식이며, `/page`디렉토리 구조를 따른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`pages/index.js`파일은 루트 경로인 `/`에 매핑된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;App Router&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Next.js 13부터 생긴 새로운 방식이며, `/app`디렉토리 구조를 따른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`app/home/page/tsx`파일은 `/home` 경로에 매핑된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js 14에서는 기존의 Page Router를 사용하더라도 에러가 발생하지 않으며, 한 번에 모든 것을 마이그레이션 할 필요 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 개발자는 상황에 따라 App Router로 전환하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 라우팅과 데이터 페칭의 변화&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js 14에서는 라우팅과 데이터 페칭 방식이 크게 변경되었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;라우팅 방식&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Page Router에서 App Router로 변경되었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 페칭 방식&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 기존의 `getStaticProps`, `getServerSideProps`, `getStaticPaths` 함수는 더 이상 사용되지 않으며, 이 기능들은 클라이언트 및 서버 컴포넌트 내부에서 보다 명시적으로 처리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 파일 시스템 기반 라우팅&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js는 파일 시스템을 통해 URL을 정의한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, `/about-us`페이지는 `app/about-us/page.tsx`파일로 구성됩니다. 라우팅 경로를 지정하기 위해 파일 시스템에서 페이지를 표현하며, 반드시 `page.tsx`파일로 생성해야 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1724744512429&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;app/
  └── about-us/
      └── page.tsx  # /about-us 경로에 매핑&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. Next.js의 특별한 파일들&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js에서 중요한 역할을 하는 파일들은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;`page.tsx`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 특정 경로에 대한 페이지를 정의한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어, `app/contact/page/tsx`는 `contact`경로에 해당된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;`layout.tsx`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 페이지의 공통 레이아웃을 정의한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어, 모든 페이지에서 공통으로 사용되는 헤더와 푸터를 정의할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;`non-found.tsx`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 잘못된 경로로 접근 시 표시될 페이지를 정의한다. 사용자가 존재하지 않는 URL에 접근할 때 표시
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어, /aaaa 이와 같이 잘못된 경로를 지정할 경우 나온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  layout에 대한 설명은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;9번&lt;/b&gt;에서 자세히 설명예정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;6. 렌더링 방식&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;rendering&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: react component를 가져와 브라우저가 이해할 수 있는 html로 변환하는 작업이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CSR (Client Side Rendering)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 리액트의 기본 렌더링 방식으로, 브라우저에서 자바스크립트를 로드한 후 UI가 빌드된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단점으로 SEO 최적화에 불리하고, 첫 페이지 로딩 시 빈 화면이 나타날 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSR (Server Side Rendering)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Next.js는 서버에서 미리 렌더링된 HTML을 제공한다. 이는 SEO에 유리하며, 사용자에게 빠르게 콘텐츠를 표시할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;7. &quot;use client&quot;와 hydrate&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;use client&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &quot;use client&quot; 명령어를 component 최상단에 적으면 copmponent가 hydrate 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 명령어가 있는 컴포넌트는 서버에서 먼저 렌더링 된 후 클라이언트에서 hydrate 된다.&lt;/li&gt;
&lt;li&gt;클라이언트 컴포넌트는 상호작용이 가능하며, 서버 컴포넌트는 기본적으로 서버에서만 렌더링 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;hydration&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: 클라이언트 컴포넌트는 서버에서 렌더링 된 HTML을 받아 상호작용 가능하게 만든다. 예를 들어, 서버에서 렌더링 된 버튼이 클라이언트에서 클릭 이벤트를 처리할 수 있도록 변환된다.&lt;br /&gt;(onClick, setState, useState 등을 사용해서 interactive 한 React component로 바꾼다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js의 이전버전에는 모든 component가 hydrate가 됐었지만, 이제는 component를 hydrate 할 건지 선택할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;component를 hydrate할 건지 선택한다는 점이 장점인 이유&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자들의 다운로드하여야 하는 JavaScript 코드 양이 줄어든다. 페이지마다 모든 JavaScript 코드를 다운로드하지 않고, interactive 한 client component만 다루는 아주 작은 JavaScript파일을 다운로드 받게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&quot;use client&quot;는 client에서만 render한다는 의미가 아니다. (client에서도 render 된다는 의미)&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 component는 backend에서 먼저 render될것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;use client&quot;명령어가 있든 없든 상관없이 client component, server component 모두 backend에서 먼저 server side render로 pre rende 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모든 것을 server side render로 진행한다.&lt;/li&gt;
&lt;li&gt;모든 것을 pre render 되어서 HTML로 변환된다.&lt;/li&gt;
&lt;li&gt;HTML이 사용자에게 넘어간다.&lt;/li&gt;
&lt;li&gt;client components만 hydrate 되고 interactive 하게 된다.&lt;/li&gt;
&lt;li&gt;다른 component들은 interactive가 안된다.(interactive 해질 필요가 없기 때문)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;요약 : 모든 컴포넌트는 서버에서 먼저 렌더링 되고, &quot;use client&quot;가 선언된 컴포넌트만 클라이언트에서 hydrate 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;8. 클라이언트와 서버 컴포넌트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트 컴포넌트&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 상호작용이 필요한 부분에서 사용되며, 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;use client&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;지시어를 선언해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어, 버튼 클릭 이벤트가 필요한 경우, 이 컴포넌트는 클라이언트 컴포넌트로 정의해야 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버 컴포넌트&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 기본적으로 모든 컴포넌트는 서버에서 렌더링 된다.&amp;nbsp;&lt;b&gt;&quot;use client&quot;&lt;/b&gt;가 없는 컴포넌트는 서버 컴포넌트로 간주되며, 클라이언트 측에서 추가적인 자바스크립트 로딩이 필요하지 않다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어, 정적인 콘텐츠를 렌더링 할 때 서버 컴포넌트를 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;9. Next.js에서의 렌더링 (6, 7, 8 정리 및 요약)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Next.js는 backend에서 application을 pre render 한다. (Next.js는 SSR을 진행한다.)&lt;/li&gt;
&lt;li&gt;모든 component를 가져다가 non interactive 한 HTML로 바꾸고 사용자에게 제공한다.&lt;/li&gt;
&lt;li&gt;&quot;use client&quot;명령어를 가진 component가 hydrate 된다. (hydrate는 interactive 된다는 것을 의미함)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;요약 : Next.js는 서버에서 모든 페이지와 컴포넌트를 먼저 렌더링 하고, 사용자에게 완전한 HTML을 제공한다. 이후 React는 클라이언트 측에서 추가적으로 상호작용을 활성화한다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;&quot;use client&quot; 명령어를 사용하는 이유&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 것에 hydrate 할 필요 없다. 만약 어떤 것들은 interactive하고 어떤 것들은 interactive하지 않으면, 예를 들어, UI의 일종의 컴포넌트만을 가지고 있다고 하면 hydrate할 필요없다. 즉 interactive 하게 만들어질 필요 없다는 의미이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;11. 레이아웃 시스템&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js는 레이아웃 시스템을 통해 페이지 간의 공통 요소를 효율적으로 관리할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1724744512431&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;app/
├── about-us/
│   ├── layout.tsx    # about-us 경로 전용 레이아웃, 해당 폴더안에서도 layout 파일 생성 가능
│   └── page.tsx
├── layout.tsx        # 공통 레이아웃
├── not-found.tsx
└── page.tsx&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;next.js는 상위폴더로 이동하여 레이아웃이 있는지 확인하고 레이아웃이 있는 경우에는 해당 layout파일을 사용하여 하위 항목을 렌더링 한다. 레이아웃은 서로 상쇄되지 않고, 서로 대체하지 않는다.(서로 중첩되는 거다.)&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;12. 메타데이터 관리&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js에서 페이지의 메타데이터를 설정하는 객체이다. 메타데이터는 페이지의 헤더에 표시되며, `title`과 `description`등의 정보를 포함한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724744512431&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;export const metadata = {
	title: &quot;Next.js&quot;,
	description: &quot;Generated by Next.js&quot;,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 코드에서 `title`과 `description`은 페이지의 헤더 부분에 반영된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;주요 특징 및 장점&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;중첩 가능&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 메타데이터는 레이아웃이 중첩되는 방식과 유사하게 중첩될 수 있지만, 실제로는 중첩되니 않고 병합된다. 즉, 페이지와 레이아웃에서 각각 정의된 메타데이터가 병합되어 최종적으로 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제한 사항&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: `metadata`는 `page`나 `layout`에서만 설정할 수 있으며, 일반 컴포넌트에서는 사용할 수 없다. 또한, 메타데이터는 서버 컴포넌트에서만 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;템플릿 사용&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 메타데이터는 템플릿을 통해 동적으로 설정할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1724744512431&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// app/layout.tsx
import { Metadata } from &quot;next&quot;;

export const metadata: Metadata = {
	title: { // {}안은 문자열일 수도 있고, 템플릿을 포함하는 객체일 수도 있다.
		template: &quot;%s | Next Movies&quot;, // %s는 동적으로 변경되는 타이틀 자리
		default: &quot;Next Movies&quot;,       // 기본값
	},
	description: &quot;The best movies on the best framework&quot;,
};

// (home)/page.tsx
export const metadata = {
	title: &quot;Home&quot;,
};

// about-us/page.tsx
export const metadata = {
	title: &quot;About us&quot;,
};&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;각 페이지에서 title이 어떻게 나오는지&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;/&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Home | Next Movies&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/about-us&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: About us | Next Movies&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/dkdkdk&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Next Movies&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/about-us로 이동하면 프레임워크가 &quot;About us&quot; 타이틀을 가지고 온다. 이는 next.js가 layout.tsx를 확인하고 `%s`에 About us를 넣은 거다. 그래서 title이 About us | Next Movies가 나온다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724744512432&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// app / not-found
export const metadata = {
	title: &quot;Not found&quot;,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 코드를 추가하면 `/dkdkdk`의 title이 Not found로 나온다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;13. Router Groups&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js에서 경로들을 논리적으로 그룹화하여 관리할 수 있게 해 준다. 이를 통해 복잡한 레이아웃 구조를 더 유연하게 구성할 수 있다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Route Groups의 주요 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;루트 레이아웃을 사용하지 않고 여러 레이아웃을 선택적으로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;특정 레이아웃을 중첩하지 않으려는 경우, 선택적으로 레이아웃을 적용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1724744512432&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;app/
├── (home)/          # Route Group으로 지정된 폴더
│   └── page.tsx     
├── about-us/
│   ├── layout.tsx   
│   └── page.tsx     
├── layout.tsx       
├── not-found.tsx&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;`home`폴더를 `(home)`으로 묶으면, 이 폴더는 Route Group으로 처리된다. 이렇게 하면 폴더 이름이 URL 경로에 반영되지 않으며, URL에 영향을 주지 않으면서 논리적인 그룹화를 할 수 있다. 예를 들어 `/page.tsx`는 `/home/page.tsx`가 아닌 `/`로 접근하게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;14. 동적 라우팅&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js는 대관호(`[]`)를 사용하여 동적 라우팅을 지원한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724744512432&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;(movies)
	|- movies
		|- [id] 
			|- page.tsx&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 구조에서는 `movies/[id]`경로로 접속할 때 `[id]`부분이 동적으로 할당된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, `movies/1111`로 접근하면 `[id]`에 `1111`이 들어간다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 확인하기 위해 props를 출력해 보기&lt;/p&gt;
&lt;pre id=&quot;code_1724744512432&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;export default function MovieDetail(props) {
	console.log(props); // { params: { id: '11111' }, searchParams: {} }
	return &amp;lt;h1&amp;gt;Movie&amp;lt;/h1&amp;gt;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 컴포넌트에서 `props`객체는 다음과 같은 두 가지 주요 요소를 포함합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;`params`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 동적 경로 변수, URL의 `[id]`부분에 해당하는 값이 들어간다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;`serchParams`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: URL에 포함된 쿼리 문자열이 이 객체에 저장된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 값들은 터미널에서는 출력되지만, 브라우저의 콘솔에서는 출력되지 않는다. 이는 해당 코드가 백엔드에서 실행되기 때문이다. (ssr이라는 의미!)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;쿼리 문자열을 포함한 URL 예시&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;`/movies/11111?regin=kr`&lt;/b&gt;&amp;nbsp;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;`{ params: { id: '11111' }, searchParams: { regin: 'kr' } }`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 출력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;`/movies/11111?regin=kr&amp;amp;page=2`&lt;/b&gt;&amp;nbsp;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;`{ params: { id: '11111' }, searchParams: { regin: 'kr', page: '2' } }`&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;`params` 객체에서 `id`값을 추출하여 사용하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1724744512433&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;export default function MovieDetail({
	params: { id },
}: {
	params: { id: string };
}) {
	console.log(id);
	return &amp;lt;h1&amp;gt;Movie {id}&amp;lt;/h1&amp;gt;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;`/movies/11111`로 접근하면 화면에 &quot;Movie 11111&quot;이 출력된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고 자료 : 노머드코드, 챗GPT(읽어보면서 맞는 내용만 적어두었습니다.)&lt;/p&gt;</description>
      <category>Next.js</category>
      <category>NEXT</category>
      <category>Next.js</category>
      <category>next.js 14</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/465</guid>
      <comments>https://development-piece.tistory.com/465#entry465comment</comments>
      <pubDate>Tue, 27 Aug 2024 16:45:08 +0900</pubDate>
    </item>
    <item>
      <title>Privacy Policy</title>
      <link>https://development-piece.tistory.com/464</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Privacy Policy&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This privacy policy applies to the 개인택시 운행기록 (LPG 전용) app (hereby referred to as &quot;Application&quot;) for mobile devices that was created by [Developer/Company name] (hereby referred to as &quot;Service Provider&quot;) as [open source/free/freemium/ad-supported/commercial] service. This service is intended for use &quot;AS IS&quot;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Information Collection and Use&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Application collects information when you download and use it. This information may include information such as&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Your device's Internet Protocol address (e.g. IP address)&lt;/li&gt;
&lt;li&gt;The pages of the Application that you visit, the time and date of your visit, the time spent on those pages&lt;/li&gt;
&lt;li&gt;The time spent on the Application&lt;/li&gt;
&lt;li&gt;The operating system you use on your mobile device&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Application does not gather precise information about the location of your mobile device.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Service Provider may use the information you provided to contact you from time to time to provide you with important information, required notices and marketing promotions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;For a better experience, while using the Application, the Service Provider may require you to provide us with certain personally identifiable information[add whatever else you collect here, e.g. users name, address, location, pictures] The information that the Service Provider request will be retained by them and used as described in this privacy policy.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Third Party Access&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Only aggregated, anonymized data is periodically transmitted to external services to aid the Service Provider in improving the Application and their service. The Service Provider may share your information with third parties in the ways that are described in this privacy statement.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot;&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please note that the Application utilizes third-party services that have their own Privacy Policy about handling data. Below are the links to the Privacy Policy of the third-party service providers used by the Application:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #485fc7;&quot; href=&quot;https://www.google.com/policies/privacy/&quot;&gt;Google Play Services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Service Provider may disclose User Provided and Automatically Collected Information:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;as required by law, such as to comply with a subpoena, or similar legal process;&lt;/li&gt;
&lt;li&gt;when they believe in good faith that disclosure is necessary to protect their rights, protect your safety or the safety of others, investigate fraud, or respond to a government request;&lt;/li&gt;
&lt;li&gt;with their trusted services providers who work on their behalf, do not have an independent use of the information we disclose to them, and have agreed to adhere to the rules set forth in this privacy statement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Opt-Out Rights&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;You can stop all collection of information by the Application easily by uninstalling it. You may use the standard uninstall processes as may be available as part of your mobile device or via the mobile application marketplace or network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Data Retention Policy&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Service Provider will retain User Provided data for as long as you use the Application and for a reasonable time thereafter. If you'd like them to delete User Provided Data that you have provided via the Application, please contact them at mjdev0715@gmail.com and they will respond in a reasonable time.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Children&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Service Provider does not use the Application to knowingly solicit data from or market to children under the age of 13.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot;&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The Application does not address anyone under the age of 13. The Service Provider does not knowingly collect personally identifiable information from children under 13 years of age. In the case the Service Provider discover that a child under 13 has provided personal information, the Service Provider will immediately delete this from their servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact the Service Provider (mjdev0715@gmail.com) so that they will be able to take the necessary actions.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Security&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The Service Provider is concerned about safeguarding the confidentiality of your information. The Service Provider provides physical, electronic, and procedural safeguards to protect information the Service Provider processes and maintains.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Changes&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This Privacy Policy may be updated from time to time for any reason. The Service Provider will notify you of any changes to the Privacy Policy by updating this page with the new Privacy Policy. You are advised to consult this Privacy Policy regularly for any changes, as continued use is deemed approval of all changes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This privacy policy is effective as of 2024-05-19&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Your Consent&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;By using the Application, you are consenting to the processing of your information as set forth in this Privacy Policy now and as amended by us.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Contact Us&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;If you have any questions regarding privacy while using the Application, or have questions about the practices, please contact the Service Provider via email at mjdev0715@gmail.com.&lt;/p&gt;</description>
      <category>React-Native</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/464</guid>
      <comments>https://development-piece.tistory.com/464#entry464comment</comments>
      <pubDate>Sun, 19 May 2024 22:23:45 +0900</pubDate>
    </item>
    <item>
      <title>2024 구글개발자 본인 인증 방법</title>
      <link>https://development-piece.tistory.com/463</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 포스팅을 보셨으면 아시겠지만 구글 개발자 본인인증(신원확인) 부분에서 막혀서 이 부분의 해결방안에 대해 설명해보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(블로그 이리저리 찾아봤는데 정확하게 나온 정보가 없더라고요.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고 블로그&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leehyen.tistory.com/343&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://leehyen.tistory.com/343&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714631359811&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;[Andorid] 2024 구글개발자 본인인증(신원확인)방법에 대한 고민&quot; data-og-description=&quot;작년말부터 google play console에서는 기존 개발자들에게 2024년부터 playstore 이용자들에게 신뢰를 증대시키기 위한 '개발자 본인 인증' 검증을 시작한다고 개발자 본인 인증 확인 기간을 정하는 설문&quot; data-og-host=&quot;leehyen.tistory.com&quot; data-og-source-url=&quot;https://leehyen.tistory.com/343&quot; data-og-url=&quot;https://leehyen.tistory.com/343&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AIc6x/hyVVGSQ7cB/3sPNHkpNIqQUtnpRyKhTR1/img.png?width=800&amp;amp;height=278&amp;amp;face=0_0_800_278,https://scrap.kakaocdn.net/dn/Aa0Le/hyVVJB5tB6/QP7EiKYXid8IChq3c9gMhk/img.png?width=800&amp;amp;height=278&amp;amp;face=0_0_800_278,https://scrap.kakaocdn.net/dn/cW7CE9/hyVVFflX87/Qyx6N71njzCYAywXmpjauk/img.png?width=881&amp;amp;height=874&amp;amp;face=0_0_881_874&quot;&gt;&lt;a href=&quot;https://leehyen.tistory.com/343&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leehyen.tistory.com/343&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AIc6x/hyVVGSQ7cB/3sPNHkpNIqQUtnpRyKhTR1/img.png?width=800&amp;amp;height=278&amp;amp;face=0_0_800_278,https://scrap.kakaocdn.net/dn/Aa0Le/hyVVJB5tB6/QP7EiKYXid8IChq3c9gMhk/img.png?width=800&amp;amp;height=278&amp;amp;face=0_0_800_278,https://scrap.kakaocdn.net/dn/cW7CE9/hyVVFflX87/Qyx6N71njzCYAywXmpjauk/img.png?width=881&amp;amp;height=874&amp;amp;face=0_0_881_874');&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;[Andorid] 2024 구글개발자 본인인증(신원확인)방법에 대한 고민&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;작년말부터 google play console에서는 기존 개발자들에게 2024년부터 playstore 이용자들에게 신뢰를 증대시키기 위한 '개발자 본인 인증' 검증을 시작한다고 개발자 본인 인증 확인 기간을 정하는 설문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leehyen.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방안&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니, 올해 2024년부터 신규 구글 개발자의 경우 앱을 올리기 전부터 본인 인증을 해야 된다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글플레이 콘솔에 본인을 인증할 수 있는 문서를 제출해야 되고, 이는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;90일 이내에 제출&lt;/b&gt;&lt;/span&gt;해야되며 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;두 번 이상 잘못 제출하면 안 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번 이상 잘못 제출하면 개발자 계정을 막습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(잘 생각하고 제출하셔야 됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구글에서 원하는 제출 문서&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공과금, 청구서&lt;/li&gt;
&lt;li&gt;전기 또는 수도 요금 청구서&lt;/li&gt;
&lt;li&gt;신용카드 명세서&lt;/li&gt;
&lt;li&gt;은행 명세서&lt;/li&gt;
&lt;li&gt;임대 계약서&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡처를 안 찍어서 기억이 잘 안 나는데 대강 이랬던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 블로그에서는 아래내용도 구글에서 원하는 제출 문서라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;법적 이름, 결제 프로필에 사용된 이름, 주소, 생년월일, 정부 발급 신분증 이미지, 주소 증명, 결제 수단이 작성되어 있는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 말하자면 구글플레이 콘솔에서 원하는 건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;등록된 개발자의 이름, 주소, 결제내역, 계좌번호&lt;/b&gt;&lt;/span&gt; 이렇게 인 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 자취를 안 하는 입장에서 전기 또는 수도 요금 청구서를 못하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신용카드 명세서, 은행 명세서는 있긴 한데 이 문서에서 이름, 주소, 계좌번호가 같이 포함되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 저는 은행 명세서에 추가로 내기로 했고, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;은행 명세서 + 주민등록증 + 통장사본&lt;/b&gt;&lt;/span&gt; 이렇게 제출했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;제출방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;은행 명세서는 제가 신한카드를 사용해서 신한카드 홈페이지에 들어가서 로그인을 하고 은행 명세서를 pdf로 다운로드하였습니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;금융 관련 사이트는 보안프로그램을 설치하라고 하니 맥보다는 윈도우를 추천합니다.&lt;/li&gt;
&lt;li&gt;pdf로 다운로드하는 방법은 인쇄버튼을 클릭하시고 프린트 목록에서 &quot;Adobe PDF&quot;를 선택하고 &quot;확인&quot;을 클릭해서 다운로드하시면 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;주민등록증, 통장사본(저는 신한으로 했습니다.)을 사진을 찍고, pdf로 만듭니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;노션, 옵시디언을 사용하시면 손쉽게 pdf로 만들 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;구글플레이콘솔에 본인인증문서를 제출할 때 여러 개 문서를 제출할 수 없습니다.(&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;딱 하나의 문서만 제출할 수 있어요.&lt;/b&gt;&lt;/span&gt;) &lt;br /&gt;그래서 은행 명세서 + 2번에서 만든 주민등록증, 통장사본 pdf 합칩니다.&lt;/li&gt;
&lt;li&gt;제출하려 하니 용량초과라서 안된다고 하네요ㅠㅠ 핸드폰사진이 용량이 높다 보니 1.5MB가 넘더라고요...ㅠㅠ &lt;br /&gt;용량 줄여서 다시 제출했습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 pdf 합치기 사용한 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ilovepdf.com/ko/merge_pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ilovepdf.com/ko/merge_pdf&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714922991706&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;온라인으로 PDF 파일을 병합하세요. PDF 병합 무료 서비스&quot; data-og-description=&quot;여러 PDF 파일을 선택하고 몇 초 이내에 병합하세요. PDF 파일을 온라인으로 무료로 병합하세요.&quot; data-og-host=&quot;www.ilovepdf.com&quot; data-og-source-url=&quot;https://www.ilovepdf.com/ko/merge_pdf&quot; data-og-url=&quot;https://www.ilovepdf.com/ko/merge_pdf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s3Bj8/hyVZfG6kyy/XOs8cEwoMYkeYzO1lmCuO1/img.png?width=1200&amp;amp;height=717&amp;amp;face=0_0_1200_717&quot;&gt;&lt;a href=&quot;https://www.ilovepdf.com/ko/merge_pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ilovepdf.com/ko/merge_pdf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s3Bj8/hyVZfG6kyy/XOs8cEwoMYkeYzO1lmCuO1/img.png?width=1200&amp;amp;height=717&amp;amp;face=0_0_1200_717');&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;온라인으로 PDF 파일을 병합하세요. PDF 병합 무료 서비스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;여러 PDF 파일을 선택하고 몇 초 이내에 병합하세요. PDF 파일을 온라인으로 무료로 병합하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ilovepdf.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;4번 pdf 용량 줄이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ilovepdf.com/ko/compress_pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ilovepdf.com/ko/compress_pdf&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714923017529&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;온라인으로 PDF 파일을 압축하세요. 같은 품질의 PDF지만 더 작은 크기의 파일&quot; data-og-description=&quot;동일한 품질이지만 더 작은 파일 크기를 가진 PDF 파일을 위해 압축하세요. 온라인에서 쉽고 무료로 PDF 파일을 압축하고 최적화하세요.&quot; data-og-host=&quot;www.ilovepdf.com&quot; data-og-source-url=&quot;https://www.ilovepdf.com/ko/compress_pdf&quot; data-og-url=&quot;https://www.ilovepdf.com/ko/compress_pdf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/H3XC7/hyVZqPnL0h/SVdSwoOY81gO7jcszgDbAK/img.png?width=1200&amp;amp;height=717&amp;amp;face=0_0_1200_717&quot;&gt;&lt;a href=&quot;https://www.ilovepdf.com/ko/compress_pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ilovepdf.com/ko/compress_pdf&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/H3XC7/hyVZqPnL0h/SVdSwoOY81gO7jcszgDbAK/img.png?width=1200&amp;amp;height=717&amp;amp;face=0_0_1200_717');&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;온라인으로 PDF 파일을 압축하세요. 같은 품질의 PDF지만 더 작은 크기의 파일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;동일한 품질이지만 더 작은 파일 크기를 가진 PDF 파일을 위해 압축하세요. 온라인에서 쉽고 무료로 PDF 파일을 압축하고 최적화하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ilovepdf.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EDuay/btsHdu5KYEC/LAK1hqHzVifbPh2iKqk9K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EDuay/btsHdu5KYEC/LAK1hqHzVifbPh2iKqk9K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EDuay/btsHdu5KYEC/LAK1hqHzVifbPh2iKqk9K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEDuay%2FbtsHdu5KYEC%2FLAK1hqHzVifbPh2iKqk9K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1708&quot; height=&quot;680&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;680&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;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>2024 구글개발자 본인 인증</category>
      <category>2024 구글개발자 본인 인증 성공</category>
      <category>구글개발자 본인 인증</category>
      <category>앱출시</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/463</guid>
      <comments>https://development-piece.tistory.com/463#entry463comment</comments>
      <pubDate>Mon, 6 May 2024 00:33:36 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] 패키지 이름 바꾸기</title>
      <link>https://development-piece.tistory.com/462</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 열심히 만들고 aab로 추출하고 이제 마지막으로 앱을 배포할 단계로 왔다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 항상 의도치 않은 부분에서 문제가 발생하는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di1o3I/btsG7Ak7vi4/4ZoLLnxk85m8JUSMHCYM21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di1o3I/btsG7Ak7vi4/4ZoLLnxk85m8JUSMHCYM21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di1o3I/btsG7Ak7vi4/4ZoLLnxk85m8JUSMHCYM21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi1o3I%2FbtsG7Ak7vi4%2F4ZoLLnxk85m8JUSMHCYM21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;154&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역 : &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; text-align: start;&quot;&gt;Google Play에 &quot;com.taxi&quot;가 이미 있으므로 다른 패키지 이름을 사용해야 합니다.&lt;/span&gt;&lt;/b&gt;&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;&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://skyksit.com/programming/react/react-native-change-package-name/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://skyksit.com/programming/react/react-native-change-package-name/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714627378331&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;React Native 로 패키지 이름 바꾸기&quot; data-og-description=&quot;리액트네이티브의 패키지 이름리액트네이티브는 init 할 때 프로젝트명, 패키지명, 앱이름이 강제로 설정된다&quot; data-og-host=&quot;skyksit.com&quot; data-og-source-url=&quot;https://skyksit.com/programming/react/react-native-change-package-name/&quot; data-og-url=&quot;https://skyksit.com/programming/react/react-native-change-package-name/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://skyksit.com/programming/react/react-native-change-package-name/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://skyksit.com/programming/react/react-native-change-package-name/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;React Native 로 패키지 이름 바꾸기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리액트네이티브의 패키지 이름리액트네이티브는 init 할 때 프로젝트명, 패키지명, 앱이름이 강제로 설정된다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;skyksit.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;h2 data-ke-size=&quot;size26&quot;&gt;해결하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트네이티브에서는 프로젝트 생성 시 init을 할 때, 프로젝트명, 패키지명, 앱이름이 강제로 설정이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1714628013245&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init taxi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 init을 해주면 아래와 같이 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트명 : taxi&lt;/li&gt;
&lt;li&gt;패키지명 : com.taxi&lt;/li&gt;
&lt;li&gt;앱이름 : taxi&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;참고 블로그에서는 &quot;앱을 다 만들고 바꾸려면 정말 골치 아파지니 반드시 초기에 바꾸자&quot;라고 나와 있습니다.&lt;/blockquote&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;ios 패키지명을 수정해주고 싶다고 참고블로그를 참고하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;앱 이름 바꾸기(필수는 아니지만 이김에 변경하면 좋을 것 같아서 변경해요.)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드, ios 둘 다 이 파일 안에 데이터만 바꾸면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/app/src/main/res/vallues/strings.xml&lt;/p&gt;
&lt;pre id=&quot;code_1714629756903&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;resources&amp;gt;
    &amp;lt;string name=&quot;app_name&quot;&amp;gt;개인택시 운행기록&amp;lt;/string&amp;gt;
&amp;lt;/resources&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안드로이드 패키지 명 바꾸기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &lt;b&gt;com.taxi &amp;rarr; com.mjyou.taxiservicerecord&lt;/b&gt; 이렇게 바꿔주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. android/app/src/main/AndroidManifest.xml 변경하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/app/src/main/AndroidManifest.xml&lt;/p&gt;
&lt;pre id=&quot;code_1714628951156&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; package=&quot;com.mjyou.taxiservicerecord&quot;&amp;gt;&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-05-02 오후 2.49.37.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJhh0w/btsG7CXBzKc/bve0q89DKMOgzVKF2qiVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJhh0w/btsG7CXBzKc/bve0q89DKMOgzVKF2qiVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJhh0w/btsG7CXBzKc/bve0q89DKMOgzVKF2qiVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJhh0w%2FbtsG7CXBzKc%2Fbve0q89DKMOgzVKF2qiVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;182&quot; data-filename=&quot;스크린샷 2024-05-02 오후 2.49.37.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. android/app/build.gradle 변경하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/app/build.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1714629092081&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace &quot;com.mjyou.taxiservicerecord&quot;

applicationId &quot;com.mjyou.taxiservicerecord&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-05-02 오후 2.51.46.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqXTI/btsG7Bj7HMu/BgMkO48FPr96HghdRrPnr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqXTI/btsG7Bj7HMu/BgMkO48FPr96HghdRrPnr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqXTI/btsG7Bj7HMu/BgMkO48FPr96HghdRrPnr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqXTI%2FbtsG7Bj7HMu%2FBgMkO48FPr96HghdRrPnr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;466&quot; data-filename=&quot;스크린샷 2024-05-02 오후 2.51.46.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. android/app/main/java/com/ 폴더명 변경하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 com.mjyou.taxiservicerecord임으로 아래와 같이 폴더명을 수정해 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-02 오후 2.53.06.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGEFhp/btsG8EmPg1v/3cCWk9okrEe0QuEW969X30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGEFhp/btsG8EmPg1v/3cCWk9okrEe0QuEW969X30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGEFhp/btsG8EmPg1v/3cCWk9okrEe0QuEW969X30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGEFhp%2FbtsG8EmPg1v%2F3cCWk9okrEe0QuEW969X30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;134&quot; data-filename=&quot;스크린샷 2024-05-02 오후 2.53.06.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. android/app/src/main/java/com/java 패키지명 변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;android/app/src/main/java/com/java&lt;span&gt; ~ MainActivity.kt, MainApplication.kt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-02 오후 2.53.06.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGEFhp/btsG8EmPg1v/3cCWk9okrEe0QuEW969X30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGEFhp/btsG8EmPg1v/3cCWk9okrEe0QuEW969X30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGEFhp/btsG8EmPg1v/3cCWk9okrEe0QuEW969X30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGEFhp%2FbtsG8EmPg1v%2F3cCWk9okrEe0QuEW969X30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;134&quot; data-filename=&quot;스크린샷 2024-05-02 오후 2.53.06.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;134&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_1714629875398&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mjyou.taxiservicerecord&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;5. 마지막으로 안드로이드 빌드해 주기&lt;/h4&gt;
&lt;pre id=&quot;code_1714630054970&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run android&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정을 통해 패키지를 변경해 준 뒤 아래 과정을 다시 해주었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[React-native CLI] react-native에 Google Firebase Analytics Firebase-Crashlytics 적용&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[React-native CLI] 안드로이드 앱 배포를 위한 AAB 추출하기&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AAB 제출까지는 잘 마무리되었는데&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제는 구글개발자 본인인증(신원확인)에서 막혔다...&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앱 올리는 게 산 넘어 산이다ㅠㅠ&lt;/p&gt;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>react-native패키지이름 변경</category>
      <category>reactNative</category>
      <category>리액트네이티브 안드로이드 패키지 이름 변경</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/462</guid>
      <comments>https://development-piece.tistory.com/462#entry462comment</comments>
      <pubDate>Thu, 2 May 2024 15:28:17 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] 안드로이드 앱 배포를 위한 AAB 추출하기</title>
      <link>https://development-piece.tistory.com/461</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Android 앱을 배포하기 위해서는 파일 형식으로 만들어주어야 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주용 파일 형식으로는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;APK(Apk package file)와 AAB(Android App Bundle)가 있습니다.&lt;span&gt;&amp;nbsp;&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;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;APK(Apk package file)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Android 앱의 컴파일된 이진형식이며, 모든 리소스와 코드가 포함되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AAB(Android App Bundle)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;APK와 달리 더 작은 형식의 파일로, 리소스와 코드를 모두 포함하지 않습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필요한 리소스만 포함되기 때문에 APK보다 작습니다.(사용자가 다운로드하는 데 필요한 최소한의 리소스만 포함)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;그리고 AAB 파일을 Google Play 스토어에서 다운로드할 때 필요한 리소스만 포함되기 때문에 최적화된 형식이며, 이는 앱 크기를 줄이고 다운로드 시간을 단축합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;이전에는 APK 파일만 Google Play 스토어에 업로드할 수 있었지만,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;현재는 Google Play 스토어에서는 APK보다는 AAB 파일 사용을 권장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;AAB 파일을 업로드할 때 추가적인 최적화 및 배포 기능을 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래서 저는 AAB로 추출했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;AAB파일로 추출하는 방법에 대해 설명하겠습니다.&lt;/span&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;참고 블로그&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ssilook.tistory.com/entry/React-Native-RN-APK-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0-3%ED%8E%B8AAB-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ssilook.tistory.com/entry/React-Native-RN-APK-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0-3%ED%8E%B8AAB-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712468759400&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;[React Native] RN - APK 추출하기 3편(AAB 파일 생성)&quot; data-og-description=&quot;안녕하세요. 이번 시간에는 React Native APK 추출할 때 용량도 줄이고, 구글 콘솔에 업로드를 시킬 수 있는 aab 파일을 생성하는 방법에 대해서 알아보도록 하겠습니다. 키 생성 my-upload-key과 my-key-alia&quot; data-og-host=&quot;ssilook.tistory.com&quot; data-og-source-url=&quot;https://ssilook.tistory.com/entry/React-Native-RN-APK-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0-3%ED%8E%B8AAB-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&quot; data-og-url=&quot;https://ssilook.tistory.com/entry/React-Native-RN-APK-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0-3%ED%8E%B8AAB-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMZidf/hyVJ0jnuZ7/8CKji0W5umkjM2Uad7U851/img.png?width=800&amp;amp;height=492&amp;amp;face=0_0_800_492,https://scrap.kakaocdn.net/dn/cQUBEn/hyVMRLQtPp/lNukXWtOcynWVR6tnsomKk/img.png?width=800&amp;amp;height=492&amp;amp;face=0_0_800_492,https://scrap.kakaocdn.net/dn/bUq9pV/hyVMXrLxj3/00Acrv6tAAK9gT4kYlRov0/img.png?width=1368&amp;amp;height=1033&amp;amp;face=0_0_1368_1033&quot;&gt;&lt;a href=&quot;https://ssilook.tistory.com/entry/React-Native-RN-APK-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0-3%ED%8E%B8AAB-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ssilook.tistory.com/entry/React-Native-RN-APK-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0-3%ED%8E%B8AAB-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMZidf/hyVJ0jnuZ7/8CKji0W5umkjM2Uad7U851/img.png?width=800&amp;amp;height=492&amp;amp;face=0_0_800_492,https://scrap.kakaocdn.net/dn/cQUBEn/hyVMRLQtPp/lNukXWtOcynWVR6tnsomKk/img.png?width=800&amp;amp;height=492&amp;amp;face=0_0_800_492,https://scrap.kakaocdn.net/dn/bUq9pV/hyVMXrLxj3/00Acrv6tAAK9gT4kYlRov0/img.png?width=1368&amp;amp;height=1033&amp;amp;face=0_0_1368_1033');&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;[React Native] RN - APK 추출하기 3편(AAB 파일 생성)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 이번 시간에는 React Native APK 추출할 때 용량도 줄이고, 구글 콘솔에 업로드를 시킬 수 있는 aab 파일을 생성하는 방법에 대해서 알아보도록 하겠습니다. 키 생성 my-upload-key과 my-key-alia&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ssilook.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@dev_jiwon/React-Native-Release-APKAAB-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dev_jiwon/React-Native-Release-APKAAB-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712468771590&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;[React Native] Release APK(AAB) 추출하기&quot; data-og-description=&quot;오늘은 Release 모드로 APK 파일을 추출하는 방법에 대해 포스팅해보려 합니다!  &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dev_jiwon/React-Native-Release-APKAAB-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@dev_jiwon/React-Native-Release-APKAAB-추출하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AjFiF/hyVMXL4rvv/WSdADgTbOt0oEzEXkLP2S1/img.png?width=1280&amp;amp;height=504&amp;amp;face=0_0_1280_504,https://scrap.kakaocdn.net/dn/dBTZIf/hyVJZLyvhP/JJAii5Yot1SORoymkYoxkk/img.png?width=1280&amp;amp;height=504&amp;amp;face=0_0_1280_504,https://scrap.kakaocdn.net/dn/wP6Ik/hyVMS43GY0/cSZQejz76hs5yf8kyd3Ut0/img.png?width=1280&amp;amp;height=680&amp;amp;face=0_0_1280_680&quot;&gt;&lt;a href=&quot;https://velog.io/@dev_jiwon/React-Native-Release-APKAAB-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dev_jiwon/React-Native-Release-APKAAB-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AjFiF/hyVMXL4rvv/WSdADgTbOt0oEzEXkLP2S1/img.png?width=1280&amp;amp;height=504&amp;amp;face=0_0_1280_504,https://scrap.kakaocdn.net/dn/dBTZIf/hyVJZLyvhP/JJAii5Yot1SORoymkYoxkk/img.png?width=1280&amp;amp;height=504&amp;amp;face=0_0_1280_504,https://scrap.kakaocdn.net/dn/wP6Ik/hyVMS43GY0/cSZQejz76hs5yf8kyd3Ut0/img.png?width=1280&amp;amp;height=680&amp;amp;face=0_0_1280_680');&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;[React Native] Release APK(AAB) 추출하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 Release 모드로 APK 파일을 추출하는 방법에 대해 포스팅해보려 합니다!  &lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;h4 data-ke-size=&quot;size20&quot;&gt;1. 키 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1712468745318&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -genkeypair -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;my-upload-key, my-ley-alias을 원하는 이름으로 작성하셔도 되고 이 코드를 그래도 사용하셔도 됩니다.&lt;/p&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-upload-key, my-ley-alias을 원하는 이름으로 작성하고 싶을 경우&lt;/p&gt;
&lt;pre id=&quot;code_1712468862294&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -genkey -v -keystore [key-name].keystore -alias [key alias] -keyalg RSA -keysize 2048 -validity 10000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;키 저장소 암호 입력: &lt;br /&gt;새 비밀번호 재입력: 당신의 성과 이름은 무엇입니까? [불명]: &lt;br /&gt;개발자 이름 조직 단위의 이름은 무엇입니까? [알 수 없음]: &lt;br /&gt;회사 개발팀 귀하의 조직 이름은 무엇입니까? [알 수 없음]: &lt;br /&gt;회사 이름 귀하의 도시 또는 지역의 이름은 무엇입니까? [불명]: &lt;br /&gt;대한민국 귀하의 주 또는 도 이름은 무엇입니까? [불명]: &lt;br /&gt;이 장치의 두 자리 국가 코드는 무엇입니까? [unknown]:&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enter해주시고 국가 코드에 &lt;b&gt;KR&lt;/b&gt;을 입력하신뒤 마지막에 yes 입력해주시면 됩니다.&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;2. 파일 위치 변경하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키 생성이 끝나시면 my-upload-ley.keystore이라는 파일 하나가 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 파일을 꼭 android/app으로 옮겨주세요!!!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Gradle 변수 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/gradle.propterties&lt;/p&gt;
&lt;pre id=&quot;code_1712469206194&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD= 키 생성에서 만든 비밀번호 입력
MYAPP_UPLOAD_KEY_PASSWORD= 키 생성에서 만든 비밀번호 입력&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;android/app/build.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1714553873192&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;release {
    if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
        storeFile file(MYAPP_UPLOAD_STORE_FILE)
        storePassword MYAPP_UPLOAD_STORE_PASSWORD
        keyAlias MYAPP_UPLOAD_KEY_ALIAS
        keyPassword MYAPP_UPLOAD_KEY_PASSWORD
    }
}

// debug {
//     storeFile file('debug.keystore')
//     storePassword 'android'
//     keyAlias 'androiddebugkey'
//     keyPassword 'android'
// } // 주석처리하기

...

// signingConfig signingConfigs.debug // 주석처리하기
signingConfig signingConfigs.release&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkVV6x/btsGrckUkl5/wphPiGrcGpZcBpvTggocN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkVV6x/btsGrckUkl5/wphPiGrcGpZcBpvTggocN0/img.png&quot; data-alt=&quot;참고블로그에서 가져온 이미지 입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkVV6x/btsGrckUkl5/wphPiGrcGpZcBpvTggocN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkVV6x%2FbtsGrckUkl5%2FwphPiGrcGpZcBpvTggocN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;966&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;참고블로그에서 가져온 이미지 입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. abb 파일 생성하기&lt;/h4&gt;
&lt;pre id=&quot;code_1712469363128&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd android
./gradlew bundleRelease&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5mUGR/btsG2YNZnEZ/fNWIYmkMvzykTWn5cKgfEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5mUGR/btsG2YNZnEZ/fNWIYmkMvzykTWn5cKgfEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5mUGR/btsG2YNZnEZ/fNWIYmkMvzykTWn5cKgfEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5mUGR%2FbtsG2YNZnEZ%2FfNWIYmkMvzykTWn5cKgfEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;520&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;520&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;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>aab</category>
      <category>aab 추출</category>
      <category>react native aab 추출</category>
      <category>안드로이드 abb 추출하기</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/461</guid>
      <comments>https://development-piece.tistory.com/461#entry461comment</comments>
      <pubDate>Tue, 30 Apr 2024 14:10:56 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] react-native에 Google Firebase Analytics Firebase-Crashlytics 적용</title>
      <link>https://development-piece.tistory.com/460</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Firebase Analytics와 Firebase Crashlytics를 적용하면 앱의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Firebase Analytics&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 행동을 추적하고 분석할 수 있습니다.&lt;br /&gt;: 이를 통해 사용자가 앱에서 어떻게 상호 작용하는지 이해하고 사용자 경험을 개선할 수 있습니다.&lt;/li&gt;
&lt;li&gt;사용자가 언제 앱을 이탈하는지 식별할 수 있습니다.&lt;br /&gt;: 이를 통해 이탈 지점을 개선하고 사용자 이탈률을 줄일 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;사용자의 관심사와 행동 패턴을 이해할 수 있습니다. &lt;br /&gt;: 이를 통해 개발자는 앱의 타겟 사용자를 더 잘 이해하고 사용자 중심의 기능을 개발할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Firebase Crashlytics&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱에서 발생하는 충돌을 모니터링하고 식별합니다.&lt;br /&gt;: 앱이 충돌하거나 중단되면 Crashlytics는 해당 문제를 신속하게 보고하여 신속한 해결을 돕습니다.&lt;/li&gt;
&lt;li&gt;앱의 오류를 디버그하고 해결할 수 있습니다.&lt;br /&gt;: Crashlytics는 오류 발생 시 발생한 코드와 함께 오류 보고서를 제공하여 개발자가 문제를 신속하게 식별하고 해결할 수 있도록 돕습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Firebase Analytics와 Firebase Crashlytics는 안정성 및 성능 향상을 위해 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;안드로이드 및 iOS 앱에 널리 사용되는 인기 있는 도구 중 하나입니다.&lt;/span&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;참고블로그&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://adjh54.tistory.com/254&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://adjh54.tistory.com/254&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711852631783&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;[RN] React Native Firebase Analytics + Crashlytics 이해 및 설정 방법 : Andriod&quot; data-og-description=&quot;해당 글에서는 React Native에서 Andriod 개발환경에서 Firebase Analytics와 Crashlytics를 이해하고 설정하는 방법에 대해 확인합니다. 1) React Native Firebase  React Native Firebase - React Native 애플리케이션에서 Fi&quot; data-og-host=&quot;adjh54.tistory.com&quot; data-og-source-url=&quot;https://adjh54.tistory.com/254&quot; data-og-url=&quot;https://adjh54.tistory.com/254&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSaFQ6/hyVGNcVh6U/Kcf5G6GGLJsziml2ICg0H1/img.png?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/cQt9hl/hyVGGriwuA/mk53dk9XuYfqKzkmIEhZGK/img.png?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/1l42l/hyVGD9bAxk/xjChrpVjRBQkBdqtktMIK0/img.png?width=1890&amp;amp;height=827&amp;amp;face=0_0_1890_827&quot;&gt;&lt;a href=&quot;https://adjh54.tistory.com/254&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://adjh54.tistory.com/254&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSaFQ6/hyVGNcVh6U/Kcf5G6GGLJsziml2ICg0H1/img.png?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/cQt9hl/hyVGGriwuA/mk53dk9XuYfqKzkmIEhZGK/img.png?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/1l42l/hyVGD9bAxk/xjChrpVjRBQkBdqtktMIK0/img.png?width=1890&amp;amp;height=827&amp;amp;face=0_0_1890_827');&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;[RN] React Native Firebase Analytics + Crashlytics 이해 및 설정 방법 : Andriod&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 글에서는 React Native에서 Andriod 개발환경에서 Firebase Analytics와 Crashlytics를 이해하고 설정하는 방법에 대해 확인합니다. 1) React Native Firebase  React Native Firebase - React Native 애플리케이션에서 Fi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;adjh54.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 id=&quot;1.%20firebase%EC%97%90%20%EC%A0%91%EC%86%8D%EC%9D%84%20%ED%95%A9%EB%8B%88%EB%8B%A4.-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Google Firebase Analytics 웹 페이지 설정&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;firebase 접속&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://firebase.google.com/?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711852759800&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;Firebase | Google&amp;rsquo;s Mobile and Web App Development Platform&quot; data-og-description=&quot;개발자가 사용자가 좋아할 만한 앱과 게임을 빌드하도록 지원하는 Google의 모바일 및 웹 앱 개발 플랫폼인 Firebase에 대해 알아보세요.&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/W3bPN/hyVGLMVDxw/Uko8pYiE9psA6dSNKJUEL0/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/BaAEN/hyVGLTEVCH/B2yQpTCmw8Spa8L2kMacbk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/bg9Erb/hyVGPBNfYM/iEvnSQuIArehisXKiUFo41/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240&quot;&gt;&lt;a href=&quot;https://firebase.google.com/?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/W3bPN/hyVGLMVDxw/Uko8pYiE9psA6dSNKJUEL0/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/BaAEN/hyVGLTEVCH/B2yQpTCmw8Spa8L2kMacbk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/bg9Erb/hyVGPBNfYM/iEvnSQuIArehisXKiUFo41/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240');&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;Firebase | Google&amp;rsquo;s Mobile and Web App Development Platform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발자가 사용자가 좋아할 만한 앱과 게임을 빌드하도록 지원하는 Google의 모바일 및 웹 앱 개발 플랫폼인 Firebase에 대해 알아보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;시작하기&quot; 클릭&lt;/li&gt;
&lt;li&gt;&quot;프로젝트 이름&quot; 작성&lt;/li&gt;
&lt;li&gt;&quot;계속&quot; 클릭&lt;/li&gt;
&lt;li&gt;프로젝트 생성되면 android 아이콘 클릭&lt;/li&gt;
&lt;li&gt;각각의 값 채워 넣기 (Android 패키지 이름, 앱 닉네임(선택사항), 디버그 서명 인증서 SHA-1(선택사항))&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 디버그 서명 인증서 SHA-1(선택사항) 구성방법&lt;/h4&gt;
&lt;pre id=&quot;code_1711853072611&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keytool -J-Duser.language=en -list -v -alias androiddebugkey -keystore ./android/app/debug.keystore&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 명령어를 수행하여 SHA-1 keystore를 발급받는다.&lt;/li&gt;
&lt;li&gt;비밀번호는 입력하지 않고 Enter를 누른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 119.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3mxy/btsGqmaUdhA/gr863Ue1pO4Gg321KoePrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3mxy/btsGqmaUdhA/gr863Ue1pO4Gg321KoePrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3mxy/btsGqmaUdhA/gr863Ue1pO4Gg321KoePrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3mxy%2FbtsGqmaUdhA%2Fgr863Ue1pO4Gg321KoePrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;233&quot; data-filename=&quot;Group 119.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHA-1은 터미널에 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값을 넣어도 파이어베이스에서는 오류로 나와서 해줄 필요 없을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 구성파일 다운로드&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bonhmj/btsGp1kxz1s/OG6iMZEW0NWNhKfvLbkKR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bonhmj/btsGp1kxz1s/OG6iMZEW0NWNhKfvLbkKR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bonhmj/btsGp1kxz1s/OG6iMZEW0NWNhKfvLbkKR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbonhmj%2FbtsGp1kxz1s%2FOG6iMZEW0NWNhKfvLbkKR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1596&quot; height=&quot;1538&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Download google-services.json을 클릭하시고 이미지와 똑같은 위치에 넣어주시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 120.png&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LbJF7/btsGp0eZKYr/7KQ6yNb5KNmoCUAe3GRTt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LbJF7/btsGp0eZKYr/7KQ6yNb5KNmoCUAe3GRTt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LbJF7/btsGp0eZKYr/7KQ6yNb5KNmoCUAe3GRTt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLbJF7%2FbtsGp0eZKYr%2F7KQ6yNb5KNmoCUAe3GRTt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;291&quot; height=&quot;197&quot; data-filename=&quot;Group 120.png&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;React Native Google Analytics 소스코드 내 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 라이브러리 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1712467117307&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# @react-native-firebase/app 모듈 설치
$ npm install @react-native-firebase/app

# @react-native-firebase/analytics 모듈 설치
$ npm install @react-native-firebase/analytics&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고블로그에서는 ios 설정 때문에 cd ios/ &amp;amp;&amp;amp; pud install을 했지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 안드로이드 전용 앱임으로 cd ios/ &amp;amp;&amp;amp; pud install을 안 했습니다.&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;2. bulid.gradle 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;androild/bulid.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1712467560486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;classpath 'com.google.gms:google-services:4.3.15'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;classpath가 보이는 곳에 코드 추가하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/app/bulid.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1712467627609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: &quot;com.google.gms.google-services&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apply plugin이 보이는 곳에 코드 추가하기&lt;/p&gt;
&lt;pre id=&quot;code_1712467698095&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'com.google.firebase:firebase-analytics'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;implementation 보이는 곳에 코드 추가하기&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;3. 파이어베이스 사이트에서 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽에 Analytics Dashborad 클릭해서 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BGqZd/btsGrST1S14/Cs4QY7889fp4yyCd2AJzs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BGqZd/btsGrST1S14/Cs4QY7889fp4yyCd2AJzs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BGqZd/btsGrST1S14/Cs4QY7889fp4yyCd2AJzs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBGqZd%2FbtsGrST1S14%2FCs4QY7889fp4yyCd2AJzs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1726&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Google Firebase Crashlytics 설치&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 라이브러리 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1712467953364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# @react-native-firebase/app 모듈 설치
$ npm install @react-native-firebase/app

# @react-native-firebase/crashlytics 모듈 설치
$ npm install @react-native-firebase/crashlytics&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. firebase.json 작성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-07 오후 2.33.29.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;1062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byIPw3/btsGqmaUBx5/Jo4JvZFmPvwkZmqrSwf1zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byIPw3/btsGqmaUBx5/Jo4JvZFmPvwkZmqrSwf1zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byIPw3/btsGqmaUBx5/Jo4JvZFmPvwkZmqrSwf1zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyIPw3%2FbtsGqmaUBx5%2FJo4JvZFmPvwkZmqrSwf1zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;1062&quot; data-filename=&quot;스크린샷 2024-04-07 오후 2.33.29.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;1062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712468034758&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;react-native&quot;: {
    &quot;crashlytics_debug_enabled&quot;: true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;firebase.json을 해당 위치에 만들어주시오 코드를 넣어주세요.&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;3. build.gradle 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/build.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1712468159026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;classpath가 보이는 곳에 코드 추가하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android/app/bulid.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1712468142420&quot; class=&quot;typescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;apply plugin: 'com.google.firebase.crashlytics'&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;apply plugin이 보이는 곳에 코드 추가하기&lt;/p&gt;
&lt;pre id=&quot;code_1712468142421&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;implementation 'com.google.firebase:firebase-crashlytics'&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;implementation 보이는 곳에 코드 추가하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 강제로 crash 로그 발생시키고 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1712468383941&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import crashlytics from '@react-native-firebase/crashlytics';

// 강제로 crash 로그를 발생시켜 확인.
useEffect(() =&amp;gt; {
	crashlytics().crash();
}, []);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;App.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1712468256439&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, {useEffect} from 'react';
import crashlytics from '@react-native-firebase/crashlytics';

const App = () =&amp;gt; {
  // 강제로 crash 로그를 발생시켜 확인.
  useEffect(() =&amp;gt; {
    crashlytics().crash();
  }, []);

  return (
  	...
  );
};

export default App;&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;작성한 뒤 npm run android 하시면, 화면이 실행되지 않고 꺼지고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이어베이스에서 Crashlytics에 들어가셔서 확인하시면 crash 된 걸 확인하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z5mi1/btsGqVRfJIp/bVDqJwLU6PGAaayYfnIIKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z5mi1/btsGqVRfJIp/bVDqJwLU6PGAaayYfnIIKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z5mi1/btsGqVRfJIp/bVDqJwLU6PGAaayYfnIIKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz5mi1%2FbtsGqVRfJIp%2FbVDqJwLU6PGAaayYfnIIKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;1723&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1723&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 제가 여러 번 해서 이렇게 나온 겁니다.&lt;/p&gt;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>Firebase</category>
      <category>firebase analytics 설치</category>
      <category>firebase crashlytics 설치</category>
      <category>google firebase analytics</category>
      <category>google firebase crashlytics</category>
      <category>reactnative에 firebase analytics 설치</category>
      <category>reactnative에 firebase crashlytics 설치</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/460</guid>
      <comments>https://development-piece.tistory.com/460#entry460comment</comments>
      <pubDate>Tue, 30 Apr 2024 13:40:32 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] android 핸드폰에 wifi로 연결하기</title>
      <link>https://development-piece.tistory.com/459</link>
      <description>&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;apk나 aab로 만든 뒤 핸드폰에서 확인하는 방법도 있겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 수정할 때마다 apk, aab로 만들어서 확인을 해야 되는 현상이 발생하니 다른 방법을 통해 실제 기기에서 확인하는 방법에 대해 알아보도록 합시다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목에서도 말했지만 안드로이드 스튜디오에서 Pair new device over Wi-Fi를 통해 제 핸드폰에서 프로젝트를 확인해보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;갤럭시폰에서 개발자모드 키기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 갤럭시폰을 준비하시고 아래 블로그를 참고하여 개발자모드 켜야 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/leemonpai/222976231731&quot;&gt;https://m.blog.naver.com/leemonpai/222976231731&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711553589451&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;갤럭시 개발자옵션 켜기 개발자모드 usb 디버깅 활성화시키기&quot; data-og-description=&quot;&amp;quot; 7번만 누르면 끝! &amp;quot; 안녕하세요. IT 인플루언서 쏠리단미입니다:) 많은 분들이 스마트폰을 ...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/leemonpai/222976231731&quot; data-og-url=&quot;https://blog.naver.com/leemonpai/222976231731&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dajDgi/hyVGD8dfVx/ybvrNrWAPdBLKdJd71MJPK/img.jpg?width=743&amp;amp;height=558&amp;amp;face=0_0_743_558&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/leemonpai/222976231731&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/leemonpai/222976231731&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dajDgi/hyVGD8dfVx/ybvrNrWAPdBLKdJd71MJPK/img.jpg?width=743&amp;amp;height=558&amp;amp;face=0_0_743_558');&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;갤럭시 개발자옵션 켜기 개발자모드 usb 디버깅 활성화시키기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&quot; 7번만 누르면 끝! &quot; 안녕하세요. IT 인플루언서 쏠리단미입니다:) 많은 분들이 스마트폰을 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.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;h2 data-ke-size=&quot;size26&quot;&gt;안드로이드 스튜디오에서 Wi-Fi 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고 블로그&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@bang9dev/wireless-debugging&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@bang9dev/wireless-debugging&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711552932465&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;[RN-CheatSheet] Wireless debugging&quot; data-og-description=&quot;선 없는 쾌적한 개발환경, 모바일 개발환경에서  Wireless(wifi) debugging 설정하고 선으로부터 자유로워지자...&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@bang9dev/wireless-debugging&quot; data-og-url=&quot;https://velog.io/@bang9dev/wireless-debugging&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s3v8e/hyVGQsX8OI/ccZn7mF78hYCfTdzhcLOK1/img.png?width=2248&amp;amp;height=814&amp;amp;face=0_0_2248_814,https://scrap.kakaocdn.net/dn/kpR5B/hyVDASRKx9/LcgckOcikonFSUpGFzgukk/img.png?width=2248&amp;amp;height=814&amp;amp;face=0_0_2248_814,https://scrap.kakaocdn.net/dn/o9zlx/hyVDFzQzrn/E2X5Kvac4ESSmmM0XttFq1/img.png?width=1232&amp;amp;height=1352&amp;amp;face=0_0_1232_1352&quot;&gt;&lt;a href=&quot;https://velog.io/@bang9dev/wireless-debugging&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@bang9dev/wireless-debugging&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s3v8e/hyVGQsX8OI/ccZn7mF78hYCfTdzhcLOK1/img.png?width=2248&amp;amp;height=814&amp;amp;face=0_0_2248_814,https://scrap.kakaocdn.net/dn/kpR5B/hyVDASRKx9/LcgckOcikonFSUpGFzgukk/img.png?width=2248&amp;amp;height=814&amp;amp;face=0_0_2248_814,https://scrap.kakaocdn.net/dn/o9zlx/hyVDFzQzrn/E2X5Kvac4ESSmmM0XttFq1/img.png?width=1232&amp;amp;height=1352&amp;amp;face=0_0_1232_1352');&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;[RN-CheatSheet] Wireless debugging&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;선 없는 쾌적한 개발환경, 모바일 개발환경에서  Wireless(wifi) debugging 설정하고 선으로부터 자유로워지자...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;h4 data-ke-size=&quot;size20&quot;&gt;1. 안드로이드 스튜디오에서 새로운 프로젝트 아무거나 하나 만들기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn3Pyb/btsF9IEtJcH/7A4wOTFgk66XLedyxe1rl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn3Pyb/btsF9IEtJcH/7A4wOTFgk66XLedyxe1rl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn3Pyb/btsF9IEtJcH/7A4wOTFgk66XLedyxe1rl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn3Pyb%2FbtsF9IEtJcH%2F7A4wOTFgk66XLedyxe1rl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1634&quot; height=&quot;1330&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;New Project를 클릭해서 설치하시면 됩니다.&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;2. 애뮬레이터 클릭하고 와이파이 연결 클릭해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Pair new devices over Wi-Fi 나오게 하고 qr연결하기&lt;/span&gt;&lt;/h4&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;blob&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/12ONc/btsF70zfD5h/qgw4RVK0bXMWFnFzeYbkak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/12ONc/btsF70zfD5h/qgw4RVK0bXMWFnFzeYbkak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/12ONc/btsF70zfD5h/qgw4RVK0bXMWFnFzeYbkak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F12ONc%2FbtsF70zfD5h%2Fqgw4RVK0bXMWFnFzeYbkak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;322&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭하면 초록불이 들어오고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 클릭하면 Pair new devices over Wi-Fi가 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baoYrI/btsF8oNsO7O/krUA4OAoZPpOaur5wJHkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baoYrI/btsF8oNsO7O/krUA4OAoZPpOaur5wJHkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baoYrI/btsF8oNsO7O/krUA4OAoZPpOaur5wJHkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaoYrI%2FbtsF8oNsO7O%2FkrUA4OAoZPpOaur5wJHkKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;1402&quot; data-origin-width=&quot;1296&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;이제 갤럭시 폰으로 연결하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZrCKi/btsF7Z8hfh4/RO7HeKQnsJMWWohSg48ht1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZrCKi/btsF7Z8hfh4/RO7HeKQnsJMWWohSg48ht1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZrCKi/btsF7Z8hfh4/RO7HeKQnsJMWWohSg48ht1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZrCKi%2FbtsF7Z8hfh4%2FRO7HeKQnsJMWWohSg48ht1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1633&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1633&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;qr코드로 기기 페어링 하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FLajY/btsF9FHEtC1/WdzKwTqDS5bHMVn24k8aG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLajY/btsF9FHEtC1/WdzKwTqDS5bHMVn24k8aG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLajY/btsF9FHEtC1/WdzKwTqDS5bHMVn24k8aG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLajY%2FbtsF9FHEtC1%2FWdzKwTqDS5bHMVn24k8aG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;968&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;968&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;b&gt;개발자 모드&lt;/b&gt; 안에 &lt;b&gt;무선 디버깅&lt;/b&gt;을 눌러야 됩니다!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 close하시고 와이파이 버튼을 클릭하고 다시 qr연결하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결에 성공하시면 이와 같은 화면이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zWw9P/btsF7HNuX3z/YNOuXYK7WyMapkWCDcDDtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zWw9P/btsF7HNuX3z/YNOuXYK7WyMapkWCDcDDtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zWw9P/btsF7HNuX3z/YNOuXYK7WyMapkWCDcDDtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzWw9P%2FbtsF7HNuX3z%2FYNOuXYK7WyMapkWCDcDDtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;1418&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;명령어으로 갤럭시 폰에 프로젝트 연결하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고블로그&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@carrotdy/React-native-android-%EC%8B%A4%EC%A0%9C-%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@carrotdy/React-native-android-%EC%8B%A4%EC%A0%9C-%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711552914544&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;[React-Native] android 실제 기기 연결&quot; data-og-description=&quot;React-native android 실제 기기 연결이 되지않고 emulator로 연결이 된다.1) 가장 먼저 android 기기의 설정탭 -&amp;gt; 개발자 옵션으로 들어가 USB 디버깅을 활성화시킨다.2) 기기가 잘 연결되면 CMD 창에 아래와 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@carrotdy/React-native-android-%EC%8B%A4%EC%A0%9C-%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0&quot; data-og-url=&quot;https://velog.io/@carrotdy/React-native-android-실제-기기-연결&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mqrcV/hyVDCb5nK3/N1m7hgrTAEdkhrernE7c40/img.png?width=394&amp;amp;height=325&amp;amp;face=0_0_394_325,https://scrap.kakaocdn.net/dn/qwGmx/hyVDzsRXsW/08bfOc95lLIYUdJQ51tRi0/img.png?width=394&amp;amp;height=325&amp;amp;face=0_0_394_325,https://scrap.kakaocdn.net/dn/bTjBje/hyVGG4WbAG/y8j2JR9vKqgxhCHX753uvk/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://velog.io/@carrotdy/React-native-android-%EC%8B%A4%EC%A0%9C-%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@carrotdy/React-native-android-%EC%8B%A4%EC%A0%9C-%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mqrcV/hyVDCb5nK3/N1m7hgrTAEdkhrernE7c40/img.png?width=394&amp;amp;height=325&amp;amp;face=0_0_394_325,https://scrap.kakaocdn.net/dn/qwGmx/hyVDzsRXsW/08bfOc95lLIYUdJQ51tRi0/img.png?width=394&amp;amp;height=325&amp;amp;face=0_0_394_325,https://scrap.kakaocdn.net/dn/bTjBje/hyVGG4WbAG/y8j2JR9vKqgxhCHX753uvk/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&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;[React-Native] android 실제 기기 연결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React-native android 실제 기기 연결이 되지않고 emulator로 연결이 된다.1) 가장 먼저 android 기기의 설정탭 -&amp;gt; 개발자 옵션으로 들어가 USB 디버깅을 활성화시킨다.2) 기기가 잘 연결되면 CMD 창에 아래와&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;vscode 터미널에 명령어를 입력하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711555198628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb devices&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duYV3g/btsF9zHHze3/mkNvMcK8XNFK0bi8HYcqHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duYV3g/btsF9zHHze3/mkNvMcK8XNFK0bi8HYcqHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duYV3g/btsF9zHHze3/mkNvMcK8XNFK0bi8HYcqHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduYV3g%2FbtsF9zHHze3%2FmkNvMcK8XNFK0bi8HYcqHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1390&quot; height=&quot;524&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;524&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_1711555278100&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb reverse tcp:8081 tcp:8081&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;npm run android 하기 전에 기존에 사용하고 있는 애뮬레이터를 꺼주어야 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;1936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCa6T5/btsF923JcU7/vTYZcbWPbEHaKj9I3lOerk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCa6T5/btsF923JcU7/vTYZcbWPbEHaKj9I3lOerk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCa6T5/btsF923JcU7/vTYZcbWPbEHaKj9I3lOerk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCa6T5%2FbtsF923JcU7%2FvTYZcbWPbEHaKj9I3lOerk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1082&quot; height=&quot;1936&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;1936&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;pre id=&quot;code_1711555370330&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run android&lt;/code&gt;&lt;/pre&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;blob&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x4xDD/btsF7yceD5N/qnhiIdRNox7mJol4uUAwc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x4xDD/btsF7yceD5N/qnhiIdRNox7mJol4uUAwc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x4xDD/btsF7yceD5N/qnhiIdRNox7mJol4uUAwc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx4xDD%2FbtsF7yceD5N%2FqnhiIdRNox7mJol4uUAwc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;300&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XFheR/btsF79XgEoz/6w6ZXcMxfEJw6f3E44ZhMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XFheR/btsF79XgEoz/6w6ZXcMxfEJw6f3E44ZhMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XFheR/btsF79XgEoz/6w6ZXcMxfEJw6f3E44ZhMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXFheR%2FbtsF79XgEoz%2F6w6ZXcMxfEJw6f3E44ZhMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2400&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허허 이렇게 폰트가 뒤죽박죽 되어있는 현실을 알 수 있습니다.^^;;;&lt;/p&gt;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>react native 안드로이드 wifi</category>
      <category>react native 안드로이드 핸드폰에서 확인하기</category>
      <category>react-native 프로젝트 실제폰에서 확인하기</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/459</guid>
      <comments>https://development-piece.tistory.com/459#entry459comment</comments>
      <pubDate>Thu, 28 Mar 2024 01:09:01 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] RN 안드로이드 아이콘 바꾸기</title>
      <link>https://development-piece.tistory.com/458</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아이콘을 적용해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 블로그를 참고해서 적용해 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 블로그&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@dody_/React-Native-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B0%94%EA%BE%B8%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dody_/React-Native-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B0%94%EA%BE%B8%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711520423782&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;[RN] 앱 아이콘 바꾸기&quot; data-og-description=&quot;안녕하세용 도디예용 오늘은 react native 프로젝트의 앱 아이콘을 바꿔봅시당 아이콘 사이즈 받아오기 일단 로고를 몇개 추출해놨습니당 둘중에 뭘 해볼까 이 로고는 1024x1024 사이즈인데, Android에 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dody_/React-Native-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B0%94%EA%BE%B8%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@dody_/React-Native-앱-아이콘-바꾸기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdNzmL/hyVGEeSMZI/z0A6CqfVIPQ7RGaSMSMcPk/img.png?width=1918&amp;amp;height=911&amp;amp;face=0_0_1918_911,https://scrap.kakaocdn.net/dn/c4lGu3/hyVGHvV47H/N5tweS20Lo5XkY1z5P4ZMk/img.png?width=1918&amp;amp;height=911&amp;amp;face=0_0_1918_911,https://scrap.kakaocdn.net/dn/dH8hGT/hyVGLZoRRT/htz53mPkj0XqU7L0S89Lz1/img.png?width=1918&amp;amp;height=911&amp;amp;face=0_0_1918_911&quot;&gt;&lt;a href=&quot;https://velog.io/@dody_/React-Native-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B0%94%EA%BE%B8%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dody_/React-Native-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B0%94%EA%BE%B8%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdNzmL/hyVGEeSMZI/z0A6CqfVIPQ7RGaSMSMcPk/img.png?width=1918&amp;amp;height=911&amp;amp;face=0_0_1918_911,https://scrap.kakaocdn.net/dn/c4lGu3/hyVGHvV47H/N5tweS20Lo5XkY1z5P4ZMk/img.png?width=1918&amp;amp;height=911&amp;amp;face=0_0_1918_911,https://scrap.kakaocdn.net/dn/dH8hGT/hyVGLZoRRT/htz53mPkj0XqU7L0S89Lz1/img.png?width=1918&amp;amp;height=911&amp;amp;face=0_0_1918_911');&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;[RN] 앱 아이콘 바꾸기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세용 도디예용 오늘은 react native 프로젝트의 앱 아이콘을 바꿔봅시당 아이콘 사이즈 받아오기 일단 로고를 몇개 추출해놨습니당 둘중에 뭘 해볼까 이 로고는 1024x1024 사이즈인데, Android에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 024x1024 사이즈의 로고 아이콘 만들기&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저는 피그마로 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2. Android Asset Studio에서 로고 만들기&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&amp;amp;foreground.space.trim=1&amp;amp;foreground.space.pad=0.1&amp;amp;foreColor=rgba(96%2C%20125%2C%20139%2C%200)&amp;amp;backColor=rgb(255%2C%20255%2C%20255)&amp;amp;crop=0&amp;amp;backgroundShape=square&amp;amp;effects=none&amp;amp;name=ic_launcher_round&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&amp;amp;foreground.space.trim=1&amp;amp;foreground.space.pad=0.1&amp;amp;foreColor=rgba(96%2C%20125%2C%20139%2C%200)&amp;amp;backColor=rgb(255%2C%20255%2C%20255)&amp;amp;crop=0&amp;amp;backgroundShape=square&amp;amp;effects=none&amp;amp;name=ic_launcher_round&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711529720531&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;Android Asset Studio - Launcher icon generator&quot; data-og-description=&quot;&quot; data-og-host=&quot;romannurik.github.io&quot; data-og-source-url=&quot;https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&amp;amp;foreground.space.trim=1&amp;amp;foreground.space.pad=0.1&amp;amp;foreColor=rgba(96%2C%20125%2C%20139%2C%200)&amp;amp;backColor=rgb(255%2C%20255%2C%20255)&amp;amp;crop=0&amp;amp;backgroundShape=square&amp;amp;effects=none&amp;amp;name=ic_launcher_round&quot; data-og-url=&quot;https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&amp;amp;foreground.space.trim=1&amp;amp;foreground.space.pad=0.1&amp;amp;foreColor=rgba(96%2C%20125%2C%20139%2C%200)&amp;amp;backColor=rgb(255%2C%20255%2C%20255)&amp;amp;crop=0&amp;amp;backgroundShape=square&amp;amp;effects=none&amp;amp;name=ic_launcher_round&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&amp;amp;foreground.space.trim=1&amp;amp;foreground.space.pad=0.1&amp;amp;foreColor=rgba(96%2C%20125%2C%20139%2C%200)&amp;amp;backColor=rgb(255%2C%20255%2C%20255)&amp;amp;crop=0&amp;amp;backgroundShape=square&amp;amp;effects=none&amp;amp;name=ic_launcher_round&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&amp;amp;foreground.space.trim=1&amp;amp;foreground.space.pad=0.1&amp;amp;foreColor=rgba(96%2C%20125%2C%20139%2C%200)&amp;amp;backColor=rgb(255%2C%20255%2C%20255)&amp;amp;crop=0&amp;amp;backgroundShape=square&amp;amp;effects=none&amp;amp;name=ic_launcher_round&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Android Asset Studio - Launcher icon generator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;romannurik.github.io&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;span style=&quot;color: #000000;&quot;&gt;만든 아이콘을 Android Asset Studio에 드래그해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;android/app/src/main/res에 들어가 보면 아래와 같은 되어있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDQ4o/btsF9a2cbEm/L5VA38zUTvkK6Eg8ZtwYx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDQ4o/btsF9a2cbEm/L5VA38zUTvkK6Eg8ZtwYx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDQ4o/btsF9a2cbEm/L5VA38zUTvkK6Eg8ZtwYx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDQ4o%2FbtsF9a2cbEm%2FL5VA38zUTvkK6Eg8ZtwYx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;662&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ic_launcher_round.png&lt;/li&gt;
&lt;li&gt;ic_launcher.png&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 참고하여 Android AssetStudio에서 로고를 만들어주어야 됩니다.&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;ic_launcher.png 만들기&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Padding은 알아서 조절하기&lt;/li&gt;
&lt;li&gt;Shape를 Square로 변경하기&lt;/li&gt;
&lt;li&gt;Name을 ic_lic_launcher로 변경해 주기&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;h4 data-ke-size=&quot;size20&quot;&gt;ic_launcher_round.png 만들기&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Padding은 알아서 조절하기&lt;/li&gt;
&lt;li&gt;Shape를 Circle로 변경하기&lt;/li&gt;
&lt;li&gt;Name을 ic_lic_launcher_round로 변경해 주기&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;h2 data-ke-size=&quot;size26&quot;&gt;3. 로고 적용하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DZsra/btsF9DJQUEI/eGDWvH7Q7xLITU9dAKLraK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DZsra/btsF9DJQUEI/eGDWvH7Q7xLITU9dAKLraK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DZsra/btsF9DJQUEI/eGDWvH7Q7xLITU9dAKLraK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZsra%2FbtsF9DJQUEI%2FeGDWvH7Q7xLITU9dAKLraK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;88&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;위에서 만든 로고들을 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;android/app/src/main/res에 들어가서 똑같은 적용 해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deMSvD/btsF8osOKw9/DXi0qCrykVFf0Zg9DchkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deMSvD/btsF8osOKw9/DXi0qCrykVFf0Zg9DchkKK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;744&quot; data-origin-width=&quot;550&quot; style=&quot;width: 50.3121%; margin-right: 10px;&quot; data-widthpercent=&quot;50.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deMSvD/btsF8osOKw9/DXi0qCrykVFf0Zg9DchkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeMSvD%2FbtsF8osOKw9%2FDXi0qCrykVFf0Zg9DchkKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDQ4o/btsF9a2cbEm/L5VA38zUTvkK6Eg8ZtwYx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDQ4o/btsF9a2cbEm/L5VA38zUTvkK6Eg8ZtwYx0/img.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;662&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.5251%;&quot; data-widthpercent=&quot;49.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDQ4o/btsF9a2cbEm/L5VA38zUTvkK6Eg8ZtwYx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDQ4o%2FbtsF9a2cbEm%2FL5VA38zUTvkK6Eg8ZtwYx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>RN 로고 적용</category>
      <category>RN 안드로이드 로고 적용</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/458</guid>
      <comments>https://development-piece.tistory.com/458#entry458comment</comments>
      <pubDate>Wed, 27 Mar 2024 18:02:42 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] RN 현재 화면이 어디인지에 따라 상태바 색상 변경하기</title>
      <link>https://development-piece.tistory.com/457</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 상태바를 설정해보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 상태바는 아니고 홈화면일 때는 상태바가 주황색, 홈화면이 아닌 다른 화면일 때에는 상태바가 흰색으로 변하게 해주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEUnDe/btsF9dqO4fi/CN2kMoH2TCa8KT6sGhqkQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEUnDe/btsF9dqO4fi/CN2kMoH2TCa8KT6sGhqkQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEUnDe/btsF9dqO4fi/CN2kMoH2TCa8KT6sGhqkQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEUnDe%2FbtsF9dqO4fi%2FCN2kMoH2TCa8KT6sGhqkQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;568&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;568&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;처음에는 상태바를 App.tsx에 설정하고 싶었지만 App.tsx에 상태바를 설정해 두면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Navigation에 따른 상태바 배경색을 변경할 수 없기 때문에 StackNavigator.tsx에 해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StackNavigator.tsx는 스택내비게이션을 모아둔 곳입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;StatusBar 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1711519175684&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const StackNavigator = () =&amp;gt; {
  const Stack = createNativeStackNavigator();

  return (
    &amp;lt;&amp;gt;
      &amp;lt;StatusBar
        backgroundColor={'#fff'}
        barStyle={'dark-content'}
      /&amp;gt;
      &amp;lt;Stack.Navigator&amp;gt;
        &amp;lt;Stack.Screen
          name=&quot;Main&quot;
          component={BottomTabsNavigator}
          options={{headerShown: false}}
        /&amp;gt;
        &amp;lt;Stack.Screen
          name=&quot;Record&quot;
          component={Record}
          options={{headerShown: false}}
        /&amp;gt;
      &amp;lt;/Stack.Navigator&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default StackNavigator;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fragment로 감싸고 StatusBar를 넣어주면 잘 작동이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상태바 커스텀 참고 블로그&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ttoottie/RN-Status-Bar%EC%97%90-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-9xp185ny&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@ttoottie/RN-Status-Bar%EC%97%90-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-9xp185ny&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711515356839&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;[RN] Status Bar에 스타일을 적용해보자&quot; data-og-description=&quot;여러 앱을 사용하다보면 화면 상단의 Status Bar 에 다양한 스타일이 적용되어 있는 경우를 볼 수 있습니다.Status Bar 에 적절한 스타일을 적용하면 현재 화면에서 보여지는 컨텐츠와의 통일감과 자&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ttoottie/RN-Status-Bar%EC%97%90-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-9xp185ny&quot; data-og-url=&quot;https://velog.io/@ttoottie/RN-Status-Bar에-스타일을-적용해보자-9xp185ny&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnwILs/hyVGK0tgWg/66RolDDuN0tLZybvWpMpak/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/bF4GGI/hyVGPtWEmq/2q3eHPI5NlogxKSYWkNX10/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ciUFPE/hyVGK0tgSQ/qm9R77aHvnIijqxhIGo4Lk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://velog.io/@ttoottie/RN-Status-Bar%EC%97%90-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-9xp185ny&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ttoottie/RN-Status-Bar%EC%97%90-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90-9xp185ny&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnwILs/hyVGK0tgWg/66RolDDuN0tLZybvWpMpak/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/bF4GGI/hyVGPtWEmq/2q3eHPI5NlogxKSYWkNX10/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ciUFPE/hyVGK0tgSQ/qm9R77aHvnIijqxhIGo4Lk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&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;[RN] Status Bar에 스타일을 적용해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;여러 앱을 사용하다보면 화면 상단의 Status Bar 에 다양한 스타일이 적용되어 있는 경우를 볼 수 있습니다.Status Bar 에 적절한 스타일을 적용하면 현재 화면에서 보여지는 컨텐츠와의 통일감과 자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;h2 data-ke-size=&quot;size26&quot;&gt;현재 페이지 이름 출력하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 페이지 이름을 출력하기 위해서는 아래코드를 넣어주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711519505887&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const navigation = useNavigation();

// 현재 화면의 이름을 가져옵니다.
const currentRouteName = navigation.getCurrentRoute().name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이렇게 넣어주면 이와 같은 오류가 발생하게 됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;TypeError: Cannot read property 'name' of undefined This error is located at: in StackNavigator (created by App) in EnsureSingleNavigator in BaseNavigationContainer in ThemeProvider in NavigationContainerInner (created by App) in RecoilRoot_INTERNAL (created by RecoilRoot) in RecoilRoot (created by App) in App in RCTView (created by View) in View (created by AppContainer) in RCTView (created by View) in View (created by AppContainer) in AppContainer in taxi(RootComponent), js engine: hermes&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 해결하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;이 오류는 내비게이션 상태 객체가 아직 정의되지 않았기 떄문에 발생하는 오류입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;위에 코드만 써주게 되면 navigation.getCurrentRoute()&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드가 호출될 때 네비게이션 상태가 아직 초기화되지 않았기 때문에 오류가 발생하게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;이를 해결하기 위해 네비게이션 이벤트를 구독하여 상태를 업데이트해야 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711519754815&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  const navigation = useNavigation();
  const [currentRouteName, setCurrentRouteName] = useState('');

  // 현재 페이지 이름 출력
  useEffect(() =&amp;gt; {
    const currentRoute = navigation.addListener('state', () =&amp;gt; {
      const {name} = navigation.getCurrentRoute();
      setCurrentRouteName(name);
    });

    return currentRoute;
  }, [navigation]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 useEffect를 사용해 줘서 naviation을 의존성배열에 넣어주어 구독해 주면서 상태를 업데이트해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최종 코드&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1711519832058&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react, react-native
import React, {useEffect, useState} from 'react';
import {StatusBar} from 'react-native';
import {useNavigation} from '@react-navigation/native';
import {createNativeStackNavigator} from '@react-navigation/native-stack';

// components
import BottomTabsNavigator from './BottomTabsNavigator';
import Record from '../screens/Record';

// style
import Theme from '../styles/Theme';

const StackNavigator = () =&amp;gt; {
  const Stack = createNativeStackNavigator();
  const navigation = useNavigation();
  const [currentRouteName, setCurrentRouteName] = useState('');

  // 현재 페이지 이름 출력
  useEffect(() =&amp;gt; {
    const currentRoute = navigation.addListener('state', () =&amp;gt; {
      const {name} = navigation.getCurrentRoute();
      setCurrentRouteName(name);
    });

    return currentRoute;
  }, [navigation]);

  return (
    &amp;lt;&amp;gt;
      &amp;lt;StatusBar
        backgroundColor={
          currentRouteName === 'Home' ? Theme.colors.mainLight : '#fff'
        }
        barStyle={'dark-content'}
      /&amp;gt;
      &amp;lt;Stack.Navigator&amp;gt;
        &amp;lt;Stack.Screen
          name=&quot;Main&quot;
          component={BottomTabsNavigator}
          options={{headerShown: false}}
        /&amp;gt;
        &amp;lt;Stack.Screen
          name=&quot;Record&quot;
          component={Record}
          options={{headerShown: false}}
        /&amp;gt;
      &amp;lt;/Stack.Navigator&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default StackNavigator;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>react native 상태바</category>
      <category>react native 화면에 따른 상태바 배경색 변경</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/457</guid>
      <comments>https://development-piece.tistory.com/457#entry457comment</comments>
      <pubDate>Wed, 27 Mar 2024 15:11:05 +0900</pubDate>
    </item>
    <item>
      <title>[React-native CLI] RN 차트스크린 구현하기 (월간, 연간)</title>
      <link>https://development-piece.tistory.com/456</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는&amp;nbsp;차트페이지를 만들어보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현할 화면&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2112&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sTPHD/btsF6f3CEBR/r98gCXZp7EpkX056UK7ah0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sTPHD/btsF6f3CEBR/r98gCXZp7EpkX056UK7ah0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sTPHD/btsF6f3CEBR/r98gCXZp7EpkX056UK7ah0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsTPHD%2FbtsF6f3CEBR%2Fr98gCXZp7EpkX056UK7ah0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2112&quot; height=&quot;1206&quot; data-origin-width=&quot;2112&quot; data-origin-height=&quot;1206&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;h2 data-ke-size=&quot;size26&quot;&gt;구현 기능&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목을 크게 나누면 &lt;b&gt;탭, 차트, 리스트&lt;/b&gt;로 구분되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;탭 : 월간, 연간&lt;/h4&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;년도를 표시하는 달력타이틀이 있음&lt;/li&gt;
&lt;li&gt;차트에는 해당 연도에 대한 1월 ~ 12월까지의 영업금액 데이터가 나옴&lt;/li&gt;
&lt;li&gt;리스트에는 해당 연도에 대한 1월 ~12월까지에 대한 영업금액 데이터가 역순으로 나옴(최신 데이터가 제일 위에 있음)&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;년도를 표시하는 달력타이틀이 없음&lt;/li&gt;
&lt;li&gt;차트에는 연도별 영업금액 데이터가 나옴&lt;/li&gt;
&lt;li&gt;리스트에는 연도별 영업금액 데이터가 역순으로 나옴(최신 데이터가 제일 위에 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;월간, 연간&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월간, 연간 둘 다 데이터가 없을 경우 차트, 리스트 컴포넌트에 &quot;데이터가 없습니다&quot;. 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;폴더 구조&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bil2Qp/btsF3nV71Hf/8462N71VDSd2rBSqSkUb9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bil2Qp/btsF3nV71Hf/8462N71VDSd2rBSqSkUb9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bil2Qp/btsF3nV71Hf/8462N71VDSd2rBSqSkUb9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbil2Qp%2FbtsF3nV71Hf%2F8462N71VDSd2rBSqSkUb9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;1222&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;1222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 폴더&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;components/chaart/~&lt;/li&gt;
&lt;li&gt;utils/recordFilterData.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현 코드&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;screens/Chart.tsx&lt;/h4&gt;
&lt;pre id=&quot;code_1711443841901&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react, react-native
import React, {useState} from 'react';

// library
import dayjs from 'dayjs';
import {useRecoilValue} from 'recoil';

// recoil, utils
import {recordState} from '../recoil/atoms';
import {chartMonthData, chartYearData} from '../utils/recordCustomData';

// component
import Tabs from '../components/chart/Tabs';
import CalendarTitle from '../components/chart/CalendarTitle';
import BarChartView from '../components/chart/BarChartView';
import DataList from '../components/chart/DataList';

// style
import {Chart as Style} from '../styles/chart.styles';

const Chart = () =&amp;gt; {
  const recordData = useRecoilValue(recordState);
  const currentYear = dayjs().format('YYYY');

  const [selectedTab, setSelectedTab] = useState('month');
  const [selectYear, setSelectYear] = useState(currentYear);

  /*
  *월간*
  선택한 년도의 월간 영업금액 나오기
  [{value: 영업금액, label: '3월'}]
   */
  const monthRecordData = chartMonthData(recordData, selectYear);

  /*
   *연간*
  작성을 시작한 년도부터 연간 영업금액
  [{value: 10, label: 2024년}]
   */
  const yearRecordData = chartYearData(recordData);

  return (
    &amp;lt;&amp;gt;
      &amp;lt;Style.wrap&amp;gt;
        {/* 탭: 월간, 연간 */}
        &amp;lt;Tabs selectedTab={selectedTab} setSelectedTab={setSelectedTab} /&amp;gt;

        {/* 월별 달력 */}
        {selectedTab === 'month' ? (
          &amp;lt;CalendarTitle
            currentYear={currentYear}
            selectYear={selectYear}
            setSelectYear={setSelectYear}
          /&amp;gt;
        ) : (
          ''
        )}

        {/* 차트 */}
        &amp;lt;BarChartView
          recordData={
            selectedTab === 'month' ? monthRecordData : yearRecordData
          }
        /&amp;gt;
      &amp;lt;/Style.wrap&amp;gt;

      &amp;lt;Style.line /&amp;gt;

      {/* 데이터 리스트 */}
      &amp;lt;DataList
        selectedTab={selectedTab}
        selectYear={selectYear}
        recordData={selectedTab === 'month' ? monthRecordData : yearRecordData}
      /&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default Chart;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탭이 month가 아닐 경우 CalenderTitle은 필요 없기 때문에 탭이 month일 경우에만 CalendarTitle 컴포넌트가 나오게 해 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&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;components/chart/Tabs.tsx&lt;/h4&gt;
&lt;pre id=&quot;code_1711443916590&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react, react-native
import React, {Dispatch, SetStateAction} from 'react';

// style
import {Tabs as Style} from '../../styles/chart.styles';

interface PropsType {
  selectedTab: string;
  setSelectedTab: Dispatch&amp;lt;SetStateAction&amp;lt;string&amp;gt;&amp;gt;;
}

const Tabs = ({selectedTab, setSelectedTab}: PropsType) =&amp;gt; {
  const handleTabPress = (tab: string) =&amp;gt; {
    setSelectedTab(tab);
  };

  return (
    &amp;lt;Style.container&amp;gt;
      &amp;lt;Style.tabButton
        select={selectedTab === 'month'}
        onPress={() =&amp;gt; handleTabPress('month')}&amp;gt;
        &amp;lt;Style.tabText select={selectedTab === 'month'}&amp;gt;월간&amp;lt;/Style.tabText&amp;gt;
      &amp;lt;/Style.tabButton&amp;gt;
      &amp;lt;Style.tabButton
        select={selectedTab === 'year'}
        onPress={() =&amp;gt; handleTabPress('year')}&amp;gt;
        &amp;lt;Style.tabText select={selectedTab === 'year'}&amp;gt;연간&amp;lt;/Style.tabText&amp;gt;
      &amp;lt;/Style.tabButton&amp;gt;
    &amp;lt;/Style.container&amp;gt;
  );
};

export default Tabs;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;utils/recordFilterData.ts&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일은 record데이터를 커스텀할 때 사용하는 폴더입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 chart 스크린에서 사용하는 record 커스텀 데이터 함수만 옮겨두었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711443959944&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// library
import dayjs from 'dayjs';
import {RecordType} from '../types/types';

// 선택한 년도의 데이터 가져오기
export const selectYearData = (recordData: RecordType[], year: string) =&amp;gt; {
  return recordData.filter(data =&amp;gt; dayjs(data.date).format('YYYY') === year);
};

// Chart
type ChartDataObjectTypes = {[key: number]: number};

// Chart_월별 데이터 =&amp;gt; [{value: 10, label: '1월'}, {}]
export const chartMonthData = (recordData: RecordType[], year: string) =&amp;gt; {
  // 월별 영업금액 저장 =&amp;gt; {&quot;2&quot;: 8, &quot;3&quot;: 324248}
  const monthlyOperatingAmount: ChartDataObjectTypes = {};

  selectYearData(recordData, year).forEach(data =&amp;gt; {
    const month = dayjs(data.date).month() + 1;

    if (!monthlyOperatingAmount[month]) {
      monthlyOperatingAmount[month] = data.operatingAmount;
    } else {
      monthlyOperatingAmount[month] += data.operatingAmount;
    }
  });

  // monthlyOperatingAmount객체를 BarChart data에 담을 배열로 변환 =&amp;gt; {value: 10, label: '1월'}
  return Object.keys(monthlyOperatingAmount).map(month =&amp;gt; ({
    value: monthlyOperatingAmount[parseInt(month, 10)],
    label: `${parseInt(month, 10)}월`,
  }));
};

// Chart_년별 데이터 =&amp;gt; [{value: 10, label: '1월'}, {}]
export const chartYearData = (recordData: RecordType[]) =&amp;gt; {
  // 년별 영업금액 저장 =&amp;gt; {&quot;2024&quot;: 324256}
  const yearOperatingAmount: ChartDataObjectTypes = {};

  recordData.forEach(data =&amp;gt; {
    const yearData = dayjs(data.date).year(); // dayjs로 연도 추출
    if (!yearOperatingAmount[yearData]) {
      yearOperatingAmount[yearData] = data.operatingAmount;
    } else {
      yearOperatingAmount[yearData] += data.operatingAmount;
    }
  });

  // yearOperatingAmount객체를 BarChart data에 담을 배열로 변환 =&amp;gt; [{&quot;label&quot;: &quot;2024년&quot;, &quot;value&quot;: 324256}]
  return Object.keys(yearOperatingAmount).map(yearData =&amp;gt; ({
    label: `${yearData}년`,
    value: yearOperatingAmount[parseInt(yearData, 10)],
  }));
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서 react-native-gifted-charts라는 차트라이브러리를 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차트라이브러리에서는 data를 아래와 같은 형식으로 받기 때문에 이 형식에 맞게 커스텀해주었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711444102057&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const barData = [
    {value: 15, label: '1'}, 
    {value: 30, label: '2'}, 
    {value: 26, label: '3'},
    {value: 40, label: '4'}
];&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;1차로 forEach를 사용하여 각 월, 년에 맞는 영업금액의 총합을 객체로 만들고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차로 map을 사용하여 차트라이브러리에 맞는 형식의 배열로 만들어주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&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;components/chart/CalendarTitle.tsx&lt;/h4&gt;
&lt;pre id=&quot;code_1711444933730&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, {Dispatch, SetStateAction} from 'react';
import {View} from 'react-native';
import {SvgXml} from 'react-native-svg';

// library
import dayjs from 'dayjs';

// assets
import {svg} from '../../assets/svg';

// style
import Theme from '../../styles/Theme';
import {CalendarTitle as Style} from '../../styles/common.styles';

interface PropsType {
  currentYear: string; // 현재 달
  selectYear: string;
  setSelectYear: Dispatch&amp;lt;SetStateAction&amp;lt;string&amp;gt;&amp;gt;;
}

const CalendarTitle = ({currentYear, selectYear, setSelectYear}: PropsType) =&amp;gt; {
  // 이전 달력으로 이동
  const onPrevPress = () =&amp;gt; {
    const nextYear = dayjs(selectYear).subtract(1, 'year').format('YYYY');
    setSelectYear(nextYear);
  };
  // 다음 달력으로 이동
  const onNextPress = () =&amp;gt; {
    const nextYear = dayjs(selectYear).add(1, 'year').format('YYYY');
    setSelectYear(nextYear);
  };
  // 현재 달로 이동
  const onCurrentPress = () =&amp;gt; {
    setSelectYear(currentYear);
  };
  return (
    &amp;lt;Style.container&amp;gt;
      &amp;lt;Style.centerWrap&amp;gt;
        {/* 이전달 이동 */}
        &amp;lt;Style.iconButton onPress={onPrevPress}&amp;gt;
          &amp;lt;View&amp;gt;
            &amp;lt;SvgXml xml={svg.prev} /&amp;gt;
          &amp;lt;/View&amp;gt;
        &amp;lt;/Style.iconButton&amp;gt;

        &amp;lt;Style.text&amp;gt;{dayjs(selectYear).format('YYYY년')}&amp;lt;/Style.text&amp;gt;

        {/* 다음달 이동 */}
        &amp;lt;Style.iconButton
          onPress={onNextPress}
          disabled={currentYear === selectYear}&amp;gt;
          &amp;lt;View&amp;gt;
            &amp;lt;SvgXml
              xml={svg.next}
              fill={
                currentYear === selectYear
                  ? Theme.colors.grey
                  : Theme.colors.black
              }
            /&amp;gt;
          &amp;lt;/View&amp;gt;
        &amp;lt;/Style.iconButton&amp;gt;
      &amp;lt;/Style.centerWrap&amp;gt;

      {/* 현재달 이동 */}
      &amp;lt;Style.iconButton position={true} onPress={onCurrentPress}&amp;gt;
        &amp;lt;View&amp;gt;
          &amp;lt;SvgXml xml={svg.turn} /&amp;gt;
        &amp;lt;/View&amp;gt;
      &amp;lt;/Style.iconButton&amp;gt;
    &amp;lt;/Style.container&amp;gt;
  );
};

export default CalendarTitle;&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;components/chart/BarChartView.tsx&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-native-gifted-charts사용방법은 아래 링크 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://development-piece.tistory.com/455&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://development-piece.tistory.com/455&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711444147125&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;[React-native CLI] RN에서 그래프 라이브러리 추천 (react-native-gifted-charts 사용방법)&quot; data-og-description=&quot;이번 프로젝트에서 꼭 필요한 요소 중 하나인 차트 리액트에서 유명한 차트 라이브러리가 많이 때문에 고민을 했었는데 리액트 네이티브에서는 너무 없어서 설치해 보고 내가 원하는 디자인으&quot; data-og-host=&quot;development-piece.tistory.com&quot; data-og-source-url=&quot;https://development-piece.tistory.com/455&quot; data-og-url=&quot;https://development-piece.tistory.com/455&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qbG7E/hyVGMDQl9B/QZiX9SECMLF5kI6Fa9oKwK/img.png?width=746&amp;amp;height=490&amp;amp;face=0_0_746_490,https://scrap.kakaocdn.net/dn/cW7Ik0/hyVGI2wiNw/rZ5tnozBJcmDPI3xjDKZW1/img.png?width=746&amp;amp;height=490&amp;amp;face=0_0_746_490,https://scrap.kakaocdn.net/dn/YwN8p/hyVGIuGsSb/CNTOLDo4Od9tb0m3bKNqAk/img.jpg?width=1419&amp;amp;height=1419&amp;amp;face=0_0_1419_1419&quot;&gt;&lt;a href=&quot;https://development-piece.tistory.com/455&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://development-piece.tistory.com/455&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qbG7E/hyVGMDQl9B/QZiX9SECMLF5kI6Fa9oKwK/img.png?width=746&amp;amp;height=490&amp;amp;face=0_0_746_490,https://scrap.kakaocdn.net/dn/cW7Ik0/hyVGI2wiNw/rZ5tnozBJcmDPI3xjDKZW1/img.png?width=746&amp;amp;height=490&amp;amp;face=0_0_746_490,https://scrap.kakaocdn.net/dn/YwN8p/hyVGIuGsSb/CNTOLDo4Od9tb0m3bKNqAk/img.jpg?width=1419&amp;amp;height=1419&amp;amp;face=0_0_1419_1419');&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;[React-native CLI] RN에서 그래프 라이브러리 추천 (react-native-gifted-charts 사용방법)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서 꼭 필요한 요소 중 하나인 차트 리액트에서 유명한 차트 라이브러리가 많이 때문에 고민을 했었는데 리액트 네이티브에서는 너무 없어서 설치해 보고 내가 원하는 디자인으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;development-piece.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1711444637284&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react, react-native
import React from 'react';
import {Dimensions} from 'react-native';
import {BarChart} from 'react-native-gifted-charts';

// style
import Theme from '../../styles/Theme';
import {BarChartView as Style} from '../../styles/chart.styles';

interface PropsType {
  recordData: {value: number; label: string}[];
}
const BarChartView = ({recordData}: PropsType) =&amp;gt; {
  const screenWidth = Dimensions.get('window').width; // 핸드폰 너비

  const labelTextStyle = {
    fontSize: 12,
    fontWeight: 500,
    color: `${Theme.colors.darkGrey}`,
  };

  const yAxisTextStyle = {
    fontSize: 12,
    color: `${Theme.colors.darkGrey}`,
  };

  return (
    &amp;lt;Style.wrap center={!recordData.length &amp;amp;&amp;amp; true}&amp;gt;
      {/* recordData에 데이터가 없으면 &quot;데이터가 없습니다.&quot; 출력하기 */}
      {recordData.length ? (
        &amp;lt;Style.container&amp;gt;
          {/* Bar Chart */}
          &amp;lt;BarChart
            // 기본
            data={recordData}
            width={recordData.length &amp;gt; 10 ? undefined : screenWidth} // 데이터가 적을 때, 많을때 대비해서
            height={160}
            disablePress // 누루기 동작 비활성화
            // bar
            initialSpacing={20} // 초기 간격
            spacing={40} // bar 간격
            barBorderRadius={2}
            barWidth={12} // bar width
            frontColor={Theme.colors.main} // bar 색상
            // x축
            xAxisLabelTextStyle={labelTextStyle}
            xAxisIndicesColor={Theme.colors.grey} // x축 단계별 표시 색상
            xAxisColor={Theme.colors.grey} // x축 색상
            // y축
            yAxisTextStyle={yAxisTextStyle}
            yAxisThickness={0} // 메인 y축
            noOfSections={3} // 가로 회색줄 갯수
            // yAxisLabelTexts={['0', '100', '300', '500']}
          /&amp;gt;
        &amp;lt;/Style.container&amp;gt;
      ) : (
        &amp;lt;Style.emptyText&amp;gt;데이터가 없습니다.&amp;lt;/Style.emptyText&amp;gt;
      )}
    &amp;lt;/Style.wrap&amp;gt;
  );
};

export default BarChartView;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BarChart에서 recordData에 데이터 길이에 따라 width값을 설정해 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정해 준 이유는 recordData가 적어도 화면에 꽉 찬 형태의 차트화면을 만들고 싶기 때문에 설정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qewJu/btsF8bzphrC/G76ek7qZnTUiZ9xl62HCVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qewJu/btsF8bzphrC/G76ek7qZnTUiZ9xl62HCVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qewJu/btsF8bzphrC/G76ek7qZnTUiZ9xl62HCVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqewJu%2FbtsF8bzphrC%2FG76ek7qZnTUiZ9xl62HCVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;484&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되는 걸 방지하고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evc7iF/btsF400trFJ/E2yE6iLAm1n2wSgoScl9Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evc7iF/btsF400trFJ/E2yE6iLAm1n2wSgoScl9Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evc7iF/btsF400trFJ/E2yE6iLAm1n2wSgoScl9Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fevc7iF%2FbtsF400trFJ%2FE2yE6iLAm1n2wSgoScl9Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;492&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;492&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;h4 data-ke-size=&quot;size20&quot;&gt;components/chart/DataList.tsx&lt;/h4&gt;
&lt;pre id=&quot;code_1711445007454&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react, react-native
import React from 'react';

// utils
import {numberCommas} from '../../utils/calculate';

// style
import {DataList as Style} from '../../styles/chart.styles';

interface PropsType {
  selectedTab: string;
  selectYear: string;
  recordData: {value: number; label: string}[];
}

const DataList = ({selectedTab, selectYear, recordData}: PropsType) =&amp;gt; {
  // [{&quot;label&quot;: &quot;2월&quot;, &quot;value&quot;: 8}, {&quot;label&quot;: &quot;3월&quot;, &quot;value&quot;: 324248}]
  // console.log('DataList페이지: ', recordData);

  return (
    &amp;lt;&amp;gt;
      {/* recordData에 데이터가 없으면 &quot;데이터가 없습니다.&quot; 출력하기 */}
      {recordData.length ? (
        &amp;lt;Style.container&amp;gt;
          {recordData.reverse().map(data =&amp;gt; (
            &amp;lt;Style.list key={data.label}&amp;gt;
              &amp;lt;Style.title&amp;gt;
                {selectedTab === 'month' ? `${selectYear}년` : ''}
                {data.label}
              &amp;lt;/Style.title&amp;gt;
              &amp;lt;Style.text&amp;gt;영업 금액 : {numberCommas(data.value)}원&amp;lt;/Style.text&amp;gt;
            &amp;lt;/Style.list&amp;gt;
          ))}
        &amp;lt;/Style.container&amp;gt;
      ) : (
        &amp;lt;Style.emptyView&amp;gt;
          &amp;lt;Style.emptyText&amp;gt;데이터가 없습니다.&amp;lt;/Style.emptyText&amp;gt;
        &amp;lt;/Style.emptyView&amp;gt;
      )}
    &amp;lt;/&amp;gt;
  );
};

export default DataList;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 최근데이터가 위에 있고 과거데이터가 아래에 있길 원해서 reverse()를 사용해 주었습니다.&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;styles/chart.styles.ts&lt;/h4&gt;
&lt;pre id=&quot;code_1711445067667&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// react, react-native
import {ScrollView, Text, TouchableOpacity, View} from 'react-native';

// library
import styled from 'styled-components';

// style
import Theme from './Theme';

// Chart
export const Chart = {
  wrap: styled(View)`
    padding: 0 16px;
  `,
  line: styled(View)`
    margin-top: 20px;
    width: 100%;
    height: 1px;
    background: ${Theme.colors.grey};
  `,
};

// Tabs
interface TabsType {
  select: boolean;
}

export const Tabs = {
  container: styled(View)`
    ${Theme.common.flexRowCenter}
    gap: 8px;
    margin-top: 20px;
    margin-bottom: 8px;
  `,
  tabButton: styled(TouchableOpacity)&amp;lt;TabsType&amp;gt;`
    ${Theme.common.flexCenter}
    flex: 1;
    height: 40px;
    border-radius: 10px;
    background-color: ${props =&amp;gt;
      props.select ? Theme.colors.main : Theme.colors.lightGrey};
  `,
  tabText: styled(Text)&amp;lt;TabsType&amp;gt;`
    font-family: ${Theme.fonts.medium};
    color: ${props =&amp;gt; (props.select ? '#fff' : Theme.colors.darkGrey)};
  `,
};

// BarChartView
interface CenterType {
  center?: boolean;
}
export const BarChartView = {
  wrap: styled(View)&amp;lt;CenterType&amp;gt;`
    height: 230px;
    background: ${Theme.colors.lightGrey};
    border-radius: 10px;

    /* props에 center가 있으면 flexCenter 주기 */
    ${props =&amp;gt; props.center &amp;amp;&amp;amp; Theme.common.flexCenter}
  `,
  emptyText: styled(Text)`
    ${Theme.fontCommon.base}
    color: ${Theme.colors.darkGrey};
  `,
  container: styled(View)`
    padding: 20px 0;
    margin: 0 16px 0 4px;
    overflow: hidden;
  `,
};

// DataList
export const DataList = {
  emptyView: styled(View)`
    ${Theme.common.flexCenter}
    flex: 1;
  `,
  emptyText: styled(Text)`
    ${Theme.fontCommon.base}
    color: ${Theme.colors.darkGrey};
  `,
  container: styled(ScrollView)`
    padding: 0 16px;
  `,
  list: styled(View)`
    padding: 16px 0;
    border-bottom-width: 1px;
    border-color: ${Theme.colors.grey};
  `,
  title: styled(Text)`
    ${Theme.fontCommon.base}
    font-family: ${Theme.fonts.medium};
    color: ${Theme.colors.mainDeep};
  `,
  text: styled(Text)`
    margin-top: 8px;
    ${Theme.fontCommon.base}
    color: ${Theme.colors.black};
  `,
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React-Native/[프로젝트] 택시 운행관리 기록장</category>
      <category>RN 차트</category>
      <category>RN프로젝트</category>
      <author>개발조각</author>
      <guid isPermaLink="true">https://development-piece.tistory.com/456</guid>
      <comments>https://development-piece.tistory.com/456#entry456comment</comments>
      <pubDate>Tue, 26 Mar 2024 18:25:32 +0900</pubDate>
    </item>
  </channel>
</rss>