<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Onejay Lab | Blog</title><description/><link>https://onejay-lab-c3e94.web.app/</link><language>ko</language><item><title>nodenv 환경에서 Node 버전 상관없이 Claude Code 실행하기</title><link>https://onejay-lab-c3e94.web.app/blog/ai/claude-code/2026-03-18-run-claude-code-with-nodenv/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/ai/claude-code/2026-03-18-run-claude-code-with-nodenv/</guid><description>nodenv + npm 으로 설치한 claude code 를 node 버전 상관없이 어느 프로젝트에서나 실행할 수 있는 방법을 설명한다.

</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;“nodenv + npm 으로 설치한 claude code 를 node 버전 상관없이 어느 프로젝트에서나 실행할 수 있는 방법을 설명한다.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;내용&quot;&gt;내용&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Claude Code 를 설치하는 방법은 여러가지가 있다. curl 로 shell script 를 실행하거나 맥이라면 homebrew 를 사용하거나 node.js 를 사용하는 유저라면 npm 을 이용하는 방법도 있다.&lt;/p&gt;
&lt;p&gt;(이 글을 쓰는 시점에 공식사이트를 들어가보면 더 이상 npm 을 이용한 설치는 지원하지 않는 듯하다. &lt;a href=&quot;https://code.claude.com/docs/en/setup#deprecated-npm-installation&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Deprecated npm installation&lt;/code&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;나는 node.js 가 익숙한 개발자라 npm 을 이용해 설치했었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@anthropic-ai/claude-code&quot;&gt;https://www.npmjs.com/package/@anthropic-ai/claude-code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;특히 각 프로젝트마다 node.js 의 버전이 달라서 nodenv 를 이용해 프로젝트별로 node 의 버전을 다르게 사용하고 있었다. 그래서 claude code 를 nodenv 의 global 로 설정한 node 버전에 설치를 했다.&lt;/p&gt;
&lt;p&gt;이 경우 &lt;code dir=&quot;auto&quot;&gt;.node-version&lt;/code&gt; 파일이 없는 디렉토리나 프로젝트에서는 global 버전의 node 에서 잘 실행할 수 있는데 global 버전이 아닌 프로젝트(각 &lt;code dir=&quot;auto&quot;&gt;.node-version&lt;/code&gt; 파일에 지정한 버전)에서는 아래와 같은 에러로 실행이 되지 않았다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;nodenv:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;22.21.1&apos; is not installed&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;global 버전이 24.12.0 인데 프로젝트의 버전이 22.21.1 라서 실행이 되지 않는 것이다.&lt;/p&gt;
&lt;p&gt;이런 경우 3가지 정도의 방법이 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IDE 의 플러그인을 사용&lt;/li&gt;
&lt;li&gt;.node-version 을 임시로 global 버전과 같은 버전으로 변경&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;NODENV_VERSION=글로벌버전 claude&lt;/code&gt; 으로 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h3 id=&quot;1-ide-의-플러그인을-사용&quot;&gt;1. IDE 의 플러그인을 사용&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio Code(vscode) 나 WebStorm 등의 IDE 는 Claude Code 플러그인을 지원한다. 이 플러그인들은 node 버전과 관계없이 Claude Code 를 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;2-node-version-을-global-버전과-같은-버전으로-변경&quot;&gt;2. .node-version 을 global 버전과 같은 버전으로 변경&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code 를 실행하고자 하는 프로젝트의 &lt;code dir=&quot;auto&quot;&gt;.node-version&lt;/code&gt; 의 버전을 nodenv 의 global 버전으로 변경해 준다.(임시로)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;nodenv 는 &lt;code dir=&quot;auto&quot;&gt;.node-version&lt;/code&gt; 파일이 있는 경우, 그 버전을 참조하여 node 를 실행한다. 따라서 임시로 node 버전을 변경해주면 Claude Code 를 실행할 수 있다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-nodenv_version글로벌버전-claude-으로-실행&quot;&gt;3. &lt;code dir=&quot;auto&quot;&gt;NODENV_VERSION=글로벌버전 claude&lt;/code&gt; 으로 실행&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;nodenv 의 환경변수인 &lt;code dir=&quot;auto&quot;&gt;NODENV_VERSION&lt;/code&gt;에 버전을 지정하여 claude 를 실행하면 바로 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NODENV_VERSION&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;24.12.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;NODENV_VERSION 환경변수는 특정 node 의 버전을 지정할 수 있는 변수이다. 이 환경변수에 global 버전을 지정하고 claude 를 실행하면 어디에서 실행해도 동일한 node 버전으로 사용가능하다.&lt;/p&gt;
&lt;p&gt;귀찮다면 alias 를 이용해 간략하게 설정도 가능하다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;결론&quot;&gt;결론&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;nodenv + npm&lt;/code&gt; 으로 설치한 claude code 는 여러 버전의 node 가 설치된 pc 에서는 사용하기 까다롭다(귀찮다).&lt;/p&gt;
&lt;p&gt;이러한 이유로 Claude Code 측에서도 더 이상 npm 을 이용한 설치는 지원하지 않기로 한 듯하다. Claude Code 를 설치한 PC 에서 언제든지 동일하게 실행할 수 있어야 하는데 node 버전에 따라 실행할 수 없는 케이스도 생기고, 특히나 요즘은 코딩 뿐만 아니라 일반적인 PC 사용에서도 claude code 를 활용하는 경우가 많은데 node 를 따로 설치해야 하는 것은 번거롭기만 하다.&lt;/p&gt;
&lt;p&gt;위의 3가지 방식으로 사용하다가 조만간 다른 방식으로 다시 설치해야할 듯하다.&lt;/p&gt;
&lt;p&gt;Claude Code 에서 제공하는 마이그레이션 방식은 다음과 같다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install the native binary&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://claude.ai/install.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Remove the old npm installation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uninstall&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@anthropic-ai/claude-code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@anthropic-ai/claude-code&quot;&gt;https://www.npmjs.com/package/@anthropic-ai/claude-code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/setup#deprecated-npm-installation&quot;&gt;https://code.claude.com/docs/en/setup#deprecated-npm-installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/setup#migrate-from-npm-to-native&quot;&gt;https://code.claude.com/docs/en/setup#migrate-from-npm-to-native&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>AI</category><category>claude code</category><category>nodenv</category><category>node</category><category>npm</category></item><item><title>Route53 - DNS 레코드 추가 및 확인</title><link>https://onejay-lab-c3e94.web.app/blog/aws/2026-02-18-how-to-add-dns-record/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/aws/2026-02-18-how-to-add-dns-record/</guid><description>AWS Route53 에서 DNS 레코드를 추가하고 확인하는 방법을 설명한다.

</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;“AWS Route53 에서 DNS 레코드를 추가하고 확인하는 방법을 설명한다.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2026/02/18&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2026/02/18&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;가끔 DNS 레코드를 추가하거나 갱신하는 작업을 맡을 때가 있다. 작업 자체는 간단하지만 할 때마다 각 DNS 레코드의 역할이 자주 헷갈리고는 한다. 어떤 레코드에 어떤 값을 지정해야 하는지가 상당히 헷갈려서 매번 다시 확인하고 작업을 시작햇었다.&lt;/p&gt;
&lt;p&gt;이번 기회에 각 레코드의 값을 정리해보고 작업 후에 확인하는 방법까지 정리해보려고 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;div&gt;&lt;h2 id=&quot;body&quot;&gt;Body&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;root-domain&quot;&gt;Root Domain&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Apex 도메인 또는 Naked Domain 이라고 한다.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;example.com&lt;/code&gt; 과 같이 앞에 www 나 api 등이 붙지 않은 도메인을 의미한다.&lt;/li&gt;
&lt;li&gt;CNAME 레코드의 값으로 지정할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;a-레코드&quot;&gt;A 레코드&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;(서버 인스턴스 등의)IP 값을 저장하는 레코드&lt;/li&gt;
&lt;li&gt;&lt;em&gt;도메인 네임(URL) -&gt; IP&lt;/em&gt; 로 바꿔주는 레코드이다.
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;www.example.com&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;api.example.com&lt;/code&gt; 등의 도메인에 해당하는 IP 값을 지정해두어 서버 인스턴스로 접속할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS Route53 의 경우에는 A 레코드에 IP 이외에 CloudFront URL (&lt;code dir=&quot;auto&quot;&gt;XXXXXX.cloudfont.com&lt;/code&gt;) 을 지정할 수 있다,
&lt;ul&gt;
&lt;li&gt;alias 항목을 ON(Yes) 로 했을 경우에만 사용 가능하다.&lt;/li&gt;
&lt;li&gt;구조 상 Cloudfront 를 통해 EC2 인스턴스에 액세스한다면 EC2 인스턴스의 IP 가 아닌 Cloudfront URL 을 연결하여&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;cname&quot;&gt;CNAME&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;서브도메인&lt;/li&gt;
&lt;li&gt;루트 도메인으로 연결하는 일종의 alias(별칭)라고 할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;example.com&lt;/code&gt; 이 루트 도메인이라면 &lt;code dir=&quot;auto&quot;&gt;www.example.com&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;api.example.com&lt;/code&gt; 등은 CNAME 으로 지정한 서브 도메인이다.&lt;/li&gt;
&lt;li&gt;CNAME 레코드에는 루트 도메인을 지정할 수 없다.
&lt;ul&gt;
&lt;li&gt;루트 도메인으로 연결하기 위한 alias 를 지정하는 것인데 루트 도메인을 지정해버리면 의미가 없다.&lt;/li&gt;
&lt;li&gt;별명으로 본명을 지어주는 격이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;ns&quot;&gt;NS&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;네임서버정보&lt;/li&gt;
&lt;li&gt;도메인을 관리하는 네임서버가 어느 서버인지를 지정하는 값이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;dns-record-확인-방법&quot;&gt;DNS Record 확인 방법&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;dig-명령어&quot;&gt;dig 명령어&lt;/h4&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;dig(Domain Information Groper): DNS 서버에 질의하여 도메인 정보를 조회할 수 있는 명령줄 도구
&lt;ul&gt;
&lt;li&gt;맥이라면 기본적으로 설치되어 있으나 리눅스나 윈도의 경우 별도로 설치해야할 수도 있다.&lt;/li&gt;
&lt;li&gt;도메인의 IP 주소, 메일 서버, 네임서버 등 다양한 DNS 정보를 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h5 id=&quot;사용방법&quot;&gt;사용방법&lt;/h5&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;dig @&amp;#x3C;네임서버&gt; &amp;#x3C;도메인네임&gt; &amp;#x3C;옵션&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;네임서버와 옵션은 필수 항목이 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h5 id=&quot;사용-예&quot;&gt;사용 예&lt;/h5&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;example.com 으로 실행해보면 &lt;code dir=&quot;auto&quot;&gt;;; QUESTION SECTION:&lt;/code&gt; 에 질의 내용이, &lt;code dir=&quot;auto&quot;&gt;;; ANSWER SECTION:&lt;/code&gt; 에 질의 답변이 나온다.
&lt;ul&gt;
&lt;li&gt;질의 내용은 A 레코드를 확인한 것이고 그에 대한 값이 나왔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;OPT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PSEUDOSECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;EDNS:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flags:&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;udp:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;65494&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;QUESTION&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;example.com.&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;ANSWER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;example.com.&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;172&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;104.18.26.120&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;example.com.&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;172&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;104.18.27.120&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;CNAME 을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;example.com&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CNAME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;OPT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PSEUDOSECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;EDNS:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flags:&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;udp:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;65494&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;QUESTION&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;example.com.&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;CNAME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;AUTHORITY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;example.com.&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;1220&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;SOA&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;elliott.ns.cloudflare.com.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dns.cloudflare.com.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2399341694&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2400&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;604800&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1800&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;구글-툴-박스&quot;&gt;구글 툴 박스&lt;/h4&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;toolbox.googleapps.com/apps/dig/&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusionoutro&quot;&gt;Conclusion(Outro)&lt;/h2&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/keum-dig-route-53-dns-check/&quot;&gt;Route 53에 등록된 DNS 서버 정보를 dig 명령어로 확인하는 방법에 대해 알아보자!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daleseo.com/dig/&quot;&gt;dig 명령어로 DNS 조회 및 진단하기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>Route53</category><category>dns record</category></item><item><title>Log Insights로 로그 손쉽게 검색하기</title><link>https://onejay-lab-c3e94.web.app/blog/aws/2024-08-14-how-to-use-log-insights-query/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/aws/2024-08-14-how-to-use-log-insights-query/</guid><description>AWS CloudWatch 의 로그를 Log Insights 를 이용해 간편하게 검색해 본다.

</description><pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;“AWS CloudWatch 의 Log Insights 를 이용해 CloudWatch 의 Log 를 검색한다.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2024-05-21&quot;,
  &quot;updatedAt&quot;: &quot;2024-08-14&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2024/05/21&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2024/08/14&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;!--title --&gt;
&lt;div&gt;&lt;h2 id=&quot;log-insights-로-cloudwatch-log-검색하기&quot;&gt;Log Insights 로 CloudWatch Log 검색하기&lt;/h2&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;어플리케이션의 장애가 발생하거나 에러가 발생했을 때 또는 사용자User로부터의 문의를 받았을 때, 가장 먼저해야 할 일은? 당연히 로그Log를 찾아보는 일이다.&lt;/p&gt;
&lt;p&gt;현재 운영 중인 서비스는 기본적으로 AWS 서비스(&lt;code dir=&quot;auto&quot;&gt;API Gateway + AWS Lambda + DynamoDB&lt;/code&gt;)를 이용한 Serverless 아키텍쳐 기반이다. 로그는 &lt;strong&gt;CloudWatch + S3&lt;/strong&gt;를 이용해 저장하고 있다.&lt;/p&gt;
&lt;p&gt;CloudWatch 는 실행한 AWS Lambda 의 인스턴스를 기준으로 로그를 기록하기 때문에 원하는 로그를 정확하게 검색하기가 어렵다. 때문에 &lt;code dir=&quot;auto&quot;&gt;Log Insights&lt;/code&gt; 라는 서비스를 이용하면, Query 를 이용해 간단하게 CloudWatch 로그를 검색할 수 있다.&lt;/p&gt;
&lt;p&gt;이번 포스트에서는 CloudWatch 의 로그를 쉽게 검색하기 위한 &lt;strong&gt;Log Insights 의 사용 방법&lt;/strong&gt; 을 정리한다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudwatch-의-로그-구조&quot;&gt;CloudWatch 의 로그 구조&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;CloudWatch 는 로그를 로그 그룹(Log Group)과 로그 스트림(&lt;code dir=&quot;auto&quot;&gt;Log Stream&lt;/code&gt;)이라는 단위로 작성하고 저장한다. &lt;strong&gt;로그 그룹은 로그 스트림의 모음이며 로그스트림에 실제 로그가 기록&lt;/strong&gt; 된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html&quot;&gt;로그 그룹 및 로그 스트림 작업&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Serverless Framework 를 예를 들어 아래의 yaml 을 보면, exmple-service 에 해당하는 로그 그룹이 생성되고, exampleLambdaIndex, exampleLambdaStatistics 라는 Lambda 들(혹은 API Gateway 나 다른 리소스)이 실행될 때마다 각각의 로그 스트림을 만들어 로그를 저장한다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example-service&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# Log Group Name: example-service-dev, example-service-prod, ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;aws&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ap-northeast-2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;functions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;exampleLambdaIndex&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;# Log Stream&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;exampleLambdaStatistics&lt;/span&gt;&lt;span&gt;:  &lt;/span&gt;&lt;span&gt;# Log Stream&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;log-insight-를-사용해야하는-이유&quot;&gt;Log Insight 를 사용해야하는 이유&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;문제는 이 로그 스트림을 이용해 원하는 로그를 확인하기 어렵다는 것이다.&lt;/p&gt;
&lt;p&gt;AWS Lambda 의 경우, 로그 스트림은 lambda 가 실행된 인스턴스를 기준으로 생성된다. 1개의 lambda 인스턴스당 1개의 로그 스트림이 생성된다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;lambda 가 실행되면서 1개의 로그 스트림을 만들고 로그를 작성한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1)의 처리가 끝나기 전에 또다시 리퀘스트가 있다면 다른 lambda 가 실행되고 별도의 로그 스트림을 만들어 로그를 작성한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1)의 처리가 끝난 뒤, lambda 인스턴스가 사라지기 전에 또 다른 리퀘스트가 있다면 1)의 lambda 인스턴스를 재실행하여 그 처리를 시작한다.(warm start)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3)의 경우, 1)의 lambda 인스터스를 그대로 사용하기에 새로운 로그 스트림을 만들지 않고 1)의 로그 스트림에 이어서 로그를 작성한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;완전히 1)의 lambda 인스턴스가 종료된다면, 더이상 1)의 로그 스트림에는 로그가 작성되지 않는다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;svg id=&quot;mermaid-0&quot; width=&quot;100%&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;-50 -10 1050 397&quot; role=&quot;graphics-document document&quot; aria-roledescription=&quot;sequence&quot;&gt;&lt;g&gt;&lt;rect x=&quot;800&quot; y=&quot;311&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t5&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;875&quot; y=&quot;343.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;875&quot; dy=&quot;0&quot;&gt;Time5&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;600&quot; y=&quot;311&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t4&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;675&quot; y=&quot;343.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;675&quot; dy=&quot;0&quot;&gt;Time4&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;400&quot; y=&quot;311&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t3&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;475&quot; y=&quot;343.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;475&quot; dy=&quot;0&quot;&gt;Time3&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;200&quot; y=&quot;311&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t2&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;275&quot; y=&quot;343.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;275&quot; dy=&quot;0&quot;&gt;Time2&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;0&quot; y=&quot;311&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t1&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;75&quot; y=&quot;343.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;75&quot; dy=&quot;0&quot;&gt;Time1&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;line id=&quot;actor4&quot; x1=&quot;875&quot; y1=&quot;65&quot; x2=&quot;875&quot; y2=&quot;311&quot; stroke-width=&quot;0.5px&quot; stroke=&quot;#999&quot; name=&quot;t5&quot;&gt;&lt;/line&gt;&lt;g id=&quot;root-4&quot;&gt;&lt;rect x=&quot;800&quot; y=&quot;0&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t5&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;875&quot; y=&quot;32.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;875&quot; dy=&quot;0&quot;&gt;Time5&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;line id=&quot;actor3&quot; x1=&quot;675&quot; y1=&quot;65&quot; x2=&quot;675&quot; y2=&quot;311&quot; stroke-width=&quot;0.5px&quot; stroke=&quot;#999&quot; name=&quot;t4&quot;&gt;&lt;/line&gt;&lt;g id=&quot;root-3&quot;&gt;&lt;rect x=&quot;600&quot; y=&quot;0&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t4&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;675&quot; y=&quot;32.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;675&quot; dy=&quot;0&quot;&gt;Time4&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;line id=&quot;actor2&quot; x1=&quot;475&quot; y1=&quot;65&quot; x2=&quot;475&quot; y2=&quot;311&quot; stroke-width=&quot;0.5px&quot; stroke=&quot;#999&quot; name=&quot;t3&quot;&gt;&lt;/line&gt;&lt;g id=&quot;root-2&quot;&gt;&lt;rect x=&quot;400&quot; y=&quot;0&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t3&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;475&quot; y=&quot;32.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;475&quot; dy=&quot;0&quot;&gt;Time3&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;line id=&quot;actor1&quot; x1=&quot;275&quot; y1=&quot;65&quot; x2=&quot;275&quot; y2=&quot;311&quot; stroke-width=&quot;0.5px&quot; stroke=&quot;#999&quot; name=&quot;t2&quot;&gt;&lt;/line&gt;&lt;g id=&quot;root-1&quot;&gt;&lt;rect x=&quot;200&quot; y=&quot;0&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t2&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;275&quot; y=&quot;32.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;275&quot; dy=&quot;0&quot;&gt;Time2&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;line id=&quot;actor0&quot; x1=&quot;75&quot; y1=&quot;65&quot; x2=&quot;75&quot; y2=&quot;311&quot; stroke-width=&quot;0.5px&quot; stroke=&quot;#999&quot; name=&quot;t1&quot;&gt;&lt;/line&gt;&lt;g id=&quot;root-0&quot;&gt;&lt;rect x=&quot;0&quot; y=&quot;0&quot; fill=&quot;#eaeaea&quot; stroke=&quot;#666&quot; width=&quot;150&quot; height=&quot;65&quot; name=&quot;t1&quot; rx=&quot;3&quot; ry=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;75&quot; y=&quot;32.5&quot; dominant-baseline=&quot;central&quot; alignment-baseline=&quot;central&quot;&gt;&lt;tspan x=&quot;75&quot; dy=&quot;0&quot;&gt;Time1&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;/g&gt;&lt;defs&gt;&lt;symbol id=&quot;computer&quot; width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;path transform=&quot;scale(.5)&quot; d=&quot;M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z&quot;&gt;&lt;/path&gt;&lt;/symbol&gt;&lt;/defs&gt;&lt;defs&gt;&lt;symbol id=&quot;database&quot; fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;path transform=&quot;scale(.5)&quot; d=&quot;M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z&quot;&gt;&lt;/path&gt;&lt;/symbol&gt;&lt;/defs&gt;&lt;defs&gt;&lt;symbol id=&quot;clock&quot; width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;path transform=&quot;scale(.5)&quot; d=&quot;M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z&quot;&gt;&lt;/path&gt;&lt;/symbol&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;arrowhead&quot; refX=&quot;7.9&quot; refY=&quot;5&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M -1 0 L 10 5 L 0 10 z&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;crosshead&quot; markerWidth=&quot;15&quot; markerHeight=&quot;8&quot; orient=&quot;auto&quot; refX=&quot;4&quot; refY=&quot;4.5&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;#000000&quot; stroke-width=&quot;1pt&quot; d=&quot;M 1,2 L 6,7 M 6,2 L 1,7&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;filled-head&quot; refX=&quot;15.5&quot; refY=&quot;7&quot; markerWidth=&quot;20&quot; markerHeight=&quot;28&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M 18,7 L9,13 L14,7 L9,1 Z&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;sequencenumber&quot; refX=&quot;15&quot; refY=&quot;15&quot; markerWidth=&quot;60&quot; markerHeight=&quot;40&quot; orient=&quot;auto&quot;&gt;&lt;circle cx=&quot;15&quot; cy=&quot;15&quot; r=&quot;6&quot;&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;solidTopArrowHead&quot; refX=&quot;7.9&quot; refY=&quot;7.25&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M 0 0 L 10 8 L 0 8 z&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;solidBottomArrowHead&quot; refX=&quot;7.9&quot; refY=&quot;0.75&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M 0 0 L 10 0 L 0 8 z&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;stickTopArrowHead&quot; refX=&quot;7.5&quot; refY=&quot;7&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M 0 0 L 7 7&quot; stroke=&quot;black&quot; stroke-width=&quot;1.5&quot; fill=&quot;none&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;defs&gt;&lt;marker id=&quot;stickBottomArrowHead&quot; refX=&quot;7.5&quot; refY=&quot;0&quot; markerUnits=&quot;userSpaceOnUse&quot; markerWidth=&quot;12&quot; markerHeight=&quot;12&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M 0 7 L 7 0&quot; stroke=&quot;black&quot; stroke-width=&quot;1.5&quot; fill=&quot;none&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;g&gt;&lt;rect x=&quot;50&quot; y=&quot;75&quot; fill=&quot;#EDF2AE&quot; stroke=&quot;#666&quot; width=&quot;850&quot; height=&quot;37&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;475&quot; y=&quot;80&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot; alignment-baseline=&quot;middle&quot; dy=&quot;1em&quot;&gt;&lt;tspan x=&quot;475&quot;&gt;Log Stream: Lambda Function1&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;250&quot; y=&quot;254&quot; fill=&quot;#EDF2AE&quot; stroke=&quot;#666&quot; width=&quot;450&quot; height=&quot;37&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;475&quot; y=&quot;259&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot; alignment-baseline=&quot;middle&quot; dy=&quot;1em&quot;&gt;&lt;tspan x=&quot;475&quot;&gt;Log Stream: Lambda Function2&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;text x=&quot;274&quot; y=&quot;127&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot; alignment-baseline=&quot;middle&quot; dy=&quot;1em&quot;&gt;Lambda Function1&lt;/text&gt;&lt;line x1=&quot;76&quot; y1=&quot;156&quot; x2=&quot;471&quot; y2=&quot;156&quot; stroke-width=&quot;2&quot; stroke=&quot;none&quot; marker-end=&quot;url(#arrowhead)&quot;&gt;&lt;/line&gt;&lt;text x=&quot;474&quot; y=&quot;171&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot; alignment-baseline=&quot;middle&quot; dy=&quot;1em&quot;&gt;Lambda Function2&lt;/text&gt;&lt;line x1=&quot;276&quot; y1=&quot;200&quot; x2=&quot;671&quot; y2=&quot;200&quot; stroke-width=&quot;2&quot; stroke=&quot;none&quot; marker-end=&quot;url(#arrowhead)&quot;&gt;&lt;/line&gt;&lt;text x=&quot;674&quot; y=&quot;215&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot; alignment-baseline=&quot;middle&quot; dy=&quot;1em&quot;&gt;Lambda Function1&lt;/text&gt;&lt;line x1=&quot;476&quot; y1=&quot;244&quot; x2=&quot;871&quot; y2=&quot;244&quot; stroke-width=&quot;2&quot; stroke=&quot;none&quot; marker-end=&quot;url(#arrowhead)&quot;&gt;&lt;/line&gt;&lt;/svg&gt;
&lt;p&gt;이러한 흐름이기에 같은 시간 동안 실행(&lt;em&gt;병렬처리&lt;/em&gt;)된 AWS Lambda 가 1000개라면 1000개의 로그 스트림이 있다고 볼 수 있다. 각각의 로그 스트림은 시간 순서대로 로그를 작성하지만 병렬처리로 동시에 작성된 로그 스트림이 많다면 이를 하나하나 찾아보는건 불가능에 가깝다.&lt;/p&gt;
&lt;p&gt;이렇게 AWS Lambda 의 병렬처리로 생성된 수많은 &lt;strong&gt;로그들을 쿼리Query로 간편하게 검색할 수 있는 서비스가 Log Insight&lt;/strong&gt; 이다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;log-insights-query&quot;&gt;Log Insights Query&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Log Insights 는 AWS CloudWatch 콘솔에서 사용할 수 있다. 찾고자 하는 로그의 로그 그룹과 시간을 지정한 뒤, 아래와 같은 쿼리를 이용하면 로그를 손쉽게 검색할 수 있다.&lt;/p&gt;
&lt;p&gt;좀더 자세한 내용은 &lt;a href=&quot;https://onejay-lab-c3e94.web.app/dev/aws/tips/how-to-use-log-insights-query&quot;&gt;AWS Cloudwatch - Log Insights 검색 쿼리&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter @message like /${SEARCH_KEYWORD}/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;| sort @timestamp desc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;주의점&quot;&gt;주의점&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Log Insights 는 AWS가 제공하는 서비스이다. 따라서 검색 용량에 따른 비용이 발생한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.awsfundamentals.com/understanding-aws-cloudwatch-pricing-a-comprehensive-guide&quot;&gt;Understanding AWS CloudWatch Pricing: A Comprehensive Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;또한 검색할 수 있는 데이터의 양도 최대 10,000개의 제한이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@aishwaryaicerastogi/breaking-the-barrier-resolving-the-10k-log-insights-limit-in-cloudwatch-and-consolidating-records-92b206006e8&quot;&gt;“Breaking the Barrier: Resolving the 10K Log Insights Limit in CloudWatch and Consolidating Records into a CSV”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>aws</category><category>cloudwatch</category><category>log insights</category><category>logging</category></item><item><title>Code Storage Limit 초과 해결 — Serverless Prune Plugin</title><link>https://onejay-lab-c3e94.web.app/blog/aws/serverless-framework/2024-06-26-how-to-set-prune-plugin/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/aws/serverless-framework/2024-06-26-how-to-set-prune-plugin/</guid><description>AWS Lambda 의 Code Storage Limit 해결방법

</description><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;jobː談-aws-lambda-storage-limit-error-해결-prune-plugin&quot;&gt;[Jobː談] AWS Lambda Storage Limit Error 해결: Prune Plugin&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2024-06-26&quot;,
  &quot;updatedAt&quot;: &quot;2024-08-14&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2024-06-26&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2024-08-14&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;“Serverless Framework 의 Prune Plugin 으로 AWS Lambda 의 Code Storage Limit 을 해결한다.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;AWS 를 이용한 Serverless 아키텍쳐로 서비스를 운영한다면 AWS Lambda 를 반드시 쓰게 된다. AWS Lambda 는 가장 간편하고 저렴하며 활용도가 높은 서비스 중 하나이기에 다양한 처리에 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;지금 운영 중인 서비스에서는 크게 아래와 같이 3가지 용도로 AWS Lambda 를 사용하고 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;15분 이내의 간단한 배치Batch 처리&lt;/li&gt;
&lt;li&gt;“API Gateway + AWS Lambda” 조합으로 Web Server 로 활용&lt;/li&gt;
&lt;li&gt;Step Function 이나 다른 AWS 리소스의 이벤트 전후처리(Cloudfront Edge Function, S3 이미지 업로드 시 썸네일 생성 등) 같은 트랜잭션의 한 부분으로 활용&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;이렇듯 활용도가 높은 AWS Lambda 이기에 넋 놓고 쓰다보면 금방 코드 스토리지가 부족해질 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS Lambda 의 코드 스토리지는 &lt;code dir=&quot;auto&quot;&gt;75GB&lt;/code&gt;이다.
&lt;ul&gt;
&lt;li&gt;Refs: &lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#compute-and-storage&quot;&gt;Lambda quotas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;실제로 최근에 Serverless Framework(&lt;em&gt;이하 sls&lt;/em&gt;) 로 deploy 하던 중 &lt;code dir=&quot;auto&quot;&gt;Code storage limit exceeded&lt;/code&gt; 에러가 났다. 이번 기회에 AWS Lambda 의 코드 스토리지를 효율적으로 관리할 수 있도록 sls 설정을 하고 그 방법에 대해 정리해 본다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;aws-lambda-code-storage&quot;&gt;AWS Lambda Code Storage?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;AWS Lambda 는 소스코드를 컨테이너Container를 통해 바로 실행하는 구조이기에 &lt;strong&gt;소스코드 (&lt;em&gt;직접 코딩한 소스코드 및 의존성 코드&lt;/em&gt;) 를 업로드해둘 스토리지&lt;/strong&gt; 가 필요하다. 이 저장 공간을 &lt;code dir=&quot;auto&quot;&gt;코드 스토리지code storage&lt;/code&gt; 라 한다.&lt;/p&gt;
&lt;p&gt;AWS Lambda 서비스에서 제공하는 코드 스토리지는 &lt;strong&gt;75GB&lt;/strong&gt; 이고 이 스토리지 용량을 모두 사용하면 소스코드를 업로드할 때 아래와 같은 에러가 발생한다. (※ &lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/operatorguide/code-storage.html&quot;&gt;Monitoring Lambda code storage&lt;/a&gt;)&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;limit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exceeded.&lt;/span&gt;&lt;span&gt; (Service: &lt;/span&gt;&lt;span&gt;Lambda,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Code:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;400,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;해결-방법&quot;&gt;해결 방법&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;sls 로 AWS Lambda 를 Deploy 하던 중 발생한 &lt;code dir=&quot;auto&quot;&gt;Code storage limit exceeded&lt;/code&gt; 에러를 어떻게 해결해야할까? 우리 팀에서 해결한 방법을 차례로 설명해 본다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;1-코드-스토리지-용량-확보&quot;&gt;1) 코드 스토리지 용량 확보&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;코드 스토리지의 용량이 부족하기 때문에 가장 먼저 한 일은 &lt;em&gt;스토리지 용량 확보&lt;/em&gt; 이다. 필요없는 람다 함수Lambda Function 를 찾아 삭제하거나 각 람다 함수의 버전Version을 확인해 오래된 버전이 많이 존재한다면 그 버전들을 삭제하는 작업을 진행했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;필요없는(사용하지 않는) 람다 함수 삭제&lt;/li&gt;
&lt;li&gt;람다 함수의 오래된 버전 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;조사 결과 필요없는 람다 함수는 없었기에 &lt;em&gt;“람다 함수의 오래된 버전 삭제”&lt;/em&gt; 만 진행했다. 이 작업은 팀의 시니어 엔지니어분께서 AWS CLI 를 이용해 수동으로 하나하나 삭제해가며 진행했다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;aws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lambda&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete-function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;--function-name&lt;/span&gt;&lt;span&gt; ${&lt;/span&gt;&lt;span&gt;LAMBDA_FUNCTION_NAME&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;--qualifier&lt;/span&gt;&lt;span&gt; ${&lt;/span&gt;&lt;span&gt;LAMBDA_FUNCTION_VERSION&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/reference/lambda/delete-function.html&quot;&gt;AWS CLI - delete-function&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그리고 이 작업은 한 번이라도 sls 로 deploy 가 가능해질만큼의 용량을 확보할 때까지 계속되었다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;-lambda-function-version&quot;&gt;※ Lambda Function Version&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;AWS Lambda 의 콘솔에서 아무 함수Function를 선택해보면 &lt;code dir=&quot;auto&quot;&gt;버전Version&lt;/code&gt; 이라는 탭이 있다. 이 &lt;strong&gt;“버전”이 이번 코드 스토리지를 가득 차게 한 원인&lt;/strong&gt; 이었다.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;sls 로 새로운 소스코드를 deploy 할 때, AWS Lambda는 버전이라는 형태로 파일을 생성해 코드 스토리지에 저장&lt;/em&gt; 한다. 특별한 설정이 없다면, sls 로 &lt;strong&gt;deploy 할 때마다 매번 새로운 버전의 파일을 생성하고 저장&lt;/strong&gt; 한다. (과거의 버전을 그대로 deploy 해서 Rollback 할 수 있는 기능)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5MB 크기의 소스코드를 30번 deploy 했다면 5MB * 30회, 총 150MB를 저장하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;지금껏 한 번도 이 버전 파일들을 따로 관리한 적이 없었다. 서비스 초반에 만든 어떤 람다함수는 버전 파일만 300개가 넘었다. 이러한 버전 파일들이 쌓이고 쌓여 75GB 의 코드 스토리지를 가득차게 했다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-serverless-framework-설정&quot;&gt;2) Serverless Framework 설정&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;sls 로 AWS Lambda 를 deploy 할 수 있을만큼의 최소한의 코드 스토리지의 용량을 확보했다면, sls 의 플러그인Plugin을 이용해 필요없는 버전 파일을 모두 삭제할 수 있도록 했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.serverless.com/plugins/serverless-prune-plugin&quot;&gt;Serverless Prune Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 플러그인은 sls 로 deploy 하고 난 뒤, &lt;strong&gt;설정한 갯수의 버전 파일만 남겨두고 모든 버전 파일들을 삭제&lt;/strong&gt; 한다. sls 로 deploy 할 때마다 오래된 버전 파일을 삭제하기 때문에 앞으로는 오래된 버전 파일들이 쌓여 코드 스토리지를 차지하지 않도록 할 수 있다. 지속적으로 관리할 수 있기에 가장 좋은 방법이라 생각한다.&lt;/p&gt;
&lt;p&gt;이 플러그인의 설정 방법은 &lt;a href=&quot;../../../docs/aws/serverless-framework/how-to-set-prune-plugin&quot;&gt;Prune Plugin: AWS Lambda Storage Limit Error&lt;/a&gt; 에서 확인 할 수 있다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-deploy&quot;&gt;3) Deploy&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;시험 삼아 1개의 Serverless Framework 설정 파일(YAML)에 Serverless Prune Plugin을 설정하고 sls 로 deploy 했다. 예상대로 오래된 버전의 파일들이 모두 삭제되었다. 나머지 Serverless Framework 설정 파일(YAML)에도 플러그인을 설정하고 모두 deploy 를 해서 오래된 버전 파일들을 삭제했다. 개발환경(Dev)의 람다함수들의 deploy 횟수가 많았었기에 개발환경만 deploy 해도 상당한 양의 코드 스토리지를 확보할 수 있었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;75GB -&gt; 22GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;75GB를 가득채웠던 코드 스토리지 사용 용량이 22GB로 여유로워졌다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;AWS Lambda 를 Deploy 할 때, 버전을 생성하지 않도록 하는 설정이나 방법에 대한 논의도 있었으나 최종적으로는 지금처럼 플러그인을 이용한 방법을 유지하는 것으로 결론이 났다.&lt;/p&gt;
&lt;p&gt;이유는 버전을 생성하지 않는 설정이나 방법이 Serverless Framework 를 이용한 방법이 아니라면 따로 문서를 만들어 내용을 관리해야 하기 때문이고 Serverless Framework 를 이용할 수 있는 방법이라도 현재의 플러그인을 이용한 방법과 중복되기 때문이다. 우리 팀은 인프라에 관한 내용은 YAML 파일 자체가 문서로서의 기능을 하기 때문에 최대한 YAML 파일을 통해서만 관리하고 싶어한다.&lt;/p&gt;
&lt;p&gt;다소 당황스러운 상황이었지만, 이번 기회를 통해 AWS Lambda 의 버전과 코드 스토리지에 대한 내용을 공부할 수 있어서 좋은 경험이었다.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/spring_i/items/40cfc99504d26b0834cc&quot;&gt;【ServerlessFramework】LambdaがCode storage limit exceededになってしまった時の対処法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/lambda-error-storage-limit&quot;&gt;Lambdaの関数とレイヤーのストレージがデフォルト上限（75GB）に達してしまった時に対応したこと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/51722526/aws-serverless-code-storage-limit-exceeded&quot;&gt;AWS Serverless | Code storage limit exceeded&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/reference/lambda/delete-function.html&quot;&gt;AWS CLI - Delete Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/tcsh/items/dc4592c2f73e64eb9f10&quot;&gt;[JAWS-UG CLI] Lambda:#8 バージョンの削除&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>aws</category><category>lambda</category><category>serverless framework</category><category>prune</category><category>deploy</category></item><item><title>Webpack으로 소스코드 용량 줄여 Upload Size Limit 해결하기</title><link>https://onejay-lab-c3e94.web.app/blog/aws/serverless-framework/2024-05-28-how-to-set-webpack/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/aws/serverless-framework/2024-05-28-how-to-set-webpack/</guid><description>Webpack 을 이용한 AWS Lambda 소스코드 용량 줄이기

</description><pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;jobː談-aws-lambda-unzipped-size-must-be-smaller-than-262144000-bytes-error-webpack&quot;&gt;[Jobː談] AWS Lambda Unzipped size must be smaller than 262144000 bytes Error: Webpack&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2024-05-28&quot;,
  &quot;updatedAt&quot;: &quot;2024-08-16&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2024-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2024-08-16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;“Webpack 을 적용하여 AWS Lambda 에 업로드할 소스코드의 용량을 줄이자”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Unzipped&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;size&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;must&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;be&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;smaller&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;than&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;262144000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;최근에 Serverless Framework(이하 &lt;code dir=&quot;auto&quot;&gt;sls&lt;/code&gt;)로 AWS Lambda 를 Deploy 하면서 나온 에러 메시지다. AWS Lambda 에 업로드할 소스코드의 용량이 (압축하지 않았을 경우에) 약 250MB 보다 적어야 한다는 것이다.&lt;/p&gt;
&lt;p&gt;현재 우리 팀의 서비스는 AWS Lambda 와 ECS Fargate 에 Nest.js 프로젝트를 올려 운영하고 있다. ECS Fargate 는 특별히 소스코드 용량 제한이 없지만 AWS Lambda 는 여러가지 용량 제한이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution&quot;&gt;Lambda quotas - Function configuration, deployment, and execution&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;AWS Lambda 에 직접 올릴수 없는 용량이 큰 파일을 S3에 업로드하게 되는데 &lt;strong&gt;50MB(압축했을 경우)&lt;/strong&gt; 또는 &lt;strong&gt;250MB(압축하지 않았을 경우)&lt;/strong&gt; 이하여야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이번 포스트에서는 Webpack 을 이용해 Nest.js 프로젝트의 소스코드 사이즈를 줄이는 방법에 대해 정리해본다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;소스코드의-용량이-늘어난-이유&quot;&gt;소스코드의 용량이 늘어난 이유&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;서비스가 성장하면서 추가한 기능만큼 소스코드도 늘어났지만, 가장 큰 원인은 업로드할 파일에 필요없는 내용이 많은 것이었다.&lt;/p&gt;
&lt;p&gt;우리 팀의 프로젝트 구조를 간략히 설명하자면 1개의 Nest.js 프로젝트 내에서 여러가지 마이크로 서비스들을 각각 deploy 하는 방식으로 MSA를 구현하고 있다. 각 마이크로 서비스마다 각각의 Nest.js Application 과 Module 을 통해 필요한 기능들만 import 해서 사용하고 있지만, 의존성Dependencies(&lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;)은 공통이다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;functions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;exampleLambdaIndex&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${PATH}.handler&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;patterns&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;!**&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;dist/**&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# js transfer result&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;node_modules/**&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# all of dependencies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;individually&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;가령 A, B, C 라는 의존성이 있을 때, “회원 서비스”에서는 A, C 만 사용하더라도 회원 서비스를 deploy 할 때에는 node_modules 디렉토리에 있는 모든 의존성(A, B, C)을 업로드하는 것이다. 이렇다보니 서비스 초창기에는 별 문제 없었지만, 서비스가 성장하고 소스코드와 의존성이 늘어나면서 이제 더이상은 업로드할 수 없는 상황까지 오게 되었다.&lt;/p&gt;
&lt;p&gt;Lambda Layer를 사용해 공통 의존성들을 따로 관리하고 있음에도 이러한 문제가 발생해 막막했다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;webpack-을-사용하는-이유&quot;&gt;Webpack 을 사용하는 이유&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;웹팩Webpack은 필요없는(사용하지 않는) 코드를 없앨 수 있다. 각 마이크로 서비스에 실제 사용되는 소스코드와 의존성만을 이용해 결과물을 만들어 낸다. 그렇기 때문에 필요없는 코드들을 없앨 수 있고 실제 기능에 필요한 코드만을 업로드할 수 있도록 한다.&lt;/p&gt;
&lt;p&gt;위에서 예를 든 “회원 서비스”에서 사용하지 않는 B 의존성을 제거할 수 있다. 필요없는 의존성을 제거할 수 있기에 소스코드의 용량을 획기적으로 줄일 수 있을 것이라 생각했다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;nestjs-webpack&quot;&gt;Nest.js Webpack&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;다양한 웹팩 툴들이 있었지만 Nest.js 의 웹팩 옵션을 사용해 빌드하는 방식을 선택했다. 웹팩을 적용할 때 가장 중요한 조건 중 하나가 Nest.js 와의 호환성이었는데, Nest.js 에서 웹팩을 지원하고 있다면 그 방법이 최선이라고 생각했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.nestjs.com/cli/monorepo#webpack-options&quot;&gt;Nest.js-Webpack Options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webpack.js.org/configuration/&quot;&gt;Webpack Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; 파일에 웹팩을 적용해 빌드하도록 설정하고, 웹팩 설정을 위해 &lt;code dir=&quot;auto&quot;&gt;webpack.config.js&lt;/code&gt; 파일을 만들었다. 좀 더 자세한 내용은 &lt;a href=&quot;../../../docs/aws/serverless-framework/how-to-set-webpack-multiple-entry&quot;&gt;Nest.js Webpack 적용 방법&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;package.json&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;build&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nest build --webpack --webpackPath ${PATH}/webpack.config.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;webpack.config.js&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exports&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;options&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;webpack&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;options&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;entry: &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;./src/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NESTJS_APP_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;externals: [],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;...options&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;clean: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;libraryTarget: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;commonjs2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;...options&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;webpack&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;optimize&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LimitChunkCountPlugin&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxChunks: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;mainjs&quot;&gt;main.js&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;웹팩을 적용해 Nest.js 를 빌드하면 &lt;code dir=&quot;auto&quot;&gt;dist&lt;/code&gt; 디렉토리에 &lt;strong&gt;main.js&lt;/strong&gt; 파일이 생성된다. 이 파일은 &lt;em&gt;웹팩이 적용된 빌드 결과 파일&lt;/em&gt; 이다. 파일을 확인해보면 의존성을 포함한 관련 소스코드가 1개의 파일로 만들어져 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main.js 라는 이름은 변경할 수 있으며 기본값이 main.js 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;serverless-framework-yaml&quot;&gt;Serverless Framework YAML&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Nest.js 프로젝트에 웹팩을 적용했다면 웹팩이 적용된 파일을 deploy 할 수있도록 해야한다. package.json 와 sls YAML 파일을 아래와 같이 수정한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;package.json&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;deploy:example&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nest build --webpack --webpackPath ${PATH}/webpack.config.js &amp;#x26;&amp;#x26; sls deploy -c ./${YAML_PATH}/serverless.yaml&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main.js 파일을 그대로 업로드 하는 방식이기에 더 이상 Lambda Layer 를 사용하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;functions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;exampleLambdaIndex&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;dist/main.handler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# main.js 의 handler 함수&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;patterns&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;!**&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;dist/main.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# webpack result&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;individually&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;웹팩 적용을 끝내고 deploy 해보면 문제 없이 소스코드가 업로드되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy:example&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;250MB -&gt; 15MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;웹팩을 적용함으로써 deploy 할 때 업로드할 소스코드의 양을 대폭 줄일 수 있었다. 기존의 방식은 프로젝트의 소스코드(&lt;code dir=&quot;auto&quot;&gt;dist&lt;/code&gt;)와 의존성(&lt;code dir=&quot;auto&quot;&gt;node_module&lt;/code&gt;)을 모두 업로드하는 방식이었기에 250MB가 넘어가는 용량이었지만 웹팩을 통해 약 15MB 정도의 main.js 만 업로드하는 방식으로 바꾸었다. 이를 통해 S3 의 저장용량도 줄일 수 있었다. (AWS Lambda 의 소스코드는 일정 용량 이상인 경우 S3 에 업로드 된다.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sls 는 deploy 할 때, &lt;code dir=&quot;auto&quot;&gt;patterns&lt;/code&gt; 에 지정한 파일들을 그대로 패키징해 업로드한다. 빌드여부는 중요하지 않다. 그래서 가끔 코드를 수정한 뒤, build 를 하지 않고 deploy 했던 경우가 있었다. 그러면 수정 내용이 전혀 반영되지 않는다. webpack 처리를 위해 반드시 build 를 해야하기에 build 가 되지 않은 코드가 deploy 하는 일이 없어졌다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build 시간 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;아쉬운 점은 이를 통해 build 시간이 꽤나 길어졌다는 것이다. webpack 을 적용하는 시간이 걸리면서 약 30초 이상, 경우에 따라서는 약 3분 이상 build 시간이 늘어났다. build 시간은 단축 할 수 있는 다른 툴들도 알아봐야할 필요가 생겼다.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>aws</category><category>lambda</category><category>serverless framework</category><category>webpack</category><category>nestjs</category><category>optimization</category></item><item><title>URL Path Variable 숫자 타입 유효성 검사 오류 해결</title><link>https://onejay-lab-c3e94.web.app/blog/programming/nodejs/nestjs/2022-09-22-error-nestjs-validating-numeric-url-param/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/programming/nodejs/nestjs/2022-09-22-error-nestjs-validating-numeric-url-param/</guid><description>Nest.js 에서 request 을 받을 때 발생한 validate 에러를 해결해 본다.

</description><pubDate>Thu, 22 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;nestjs-must-be-a-number-conforming-to-the-specified-constraints&quot;&gt;[Nest.js] must be a number conforming to the specified constraints&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2022-09-22&quot;,
  &quot;updatedAt&quot;: &quot;2022-09-22&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-09-22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-09-22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Nest.js 에서 request 을 받을 때 발생한 validate 에러를 해결해 본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Client 에서 URL에 데이터를 넣는 Request (QueryString 또는 Path Variable) 를 보낼 때, 문자열이 아닌 데이터(숫자 등)를 보내면 발생하는 에러를 해결해 본다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;source-code&quot;&gt;Source Code&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;controller&quot;&gt;Controller&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;아래의 코드와 같이 주문 상품의 수량을 변경하는 EndPoint 가 있다고 가정한다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@Patch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;order/prod/count/:id/:count&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@ApiResponse&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status: HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OK&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: OrderProdUpdateResponseDto,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;update ord prod&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@HttpCode&lt;/span&gt;&lt;span&gt;(HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;OK&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@UseGuards&lt;/span&gt;&lt;span&gt;(ParamGuard)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;async &lt;/span&gt;&lt;span&gt;updateOrdProd&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Param&lt;/span&gt;&lt;span&gt;() param: OrderProdUpdateDto,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;OrderProdUpdateResponseDto&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(TAG, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;patch-ord-prod-req&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, param);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const result: OrderProdUpdateResponseDto &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;orderService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;updateOrdProd&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;patch-ord-prod-res&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, result);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return result;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;dto&quot;&gt;DTO&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;위의 엔드포인트의 Path Variable (id, count) 에 해당하는 데이터를 정의한다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { ApiProperty } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@nestjs/swagger&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { IsNotEmpty, IsNumber, IsString } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;class-validator&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { Type } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;class-transformer&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OrderProdUpdateDto&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@ApiProperty&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@IsNotEmpty&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@IsString&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@ApiProperty&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;주문 상품 수량&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@IsNotEmpty&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@IsNumber&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;error&quot;&gt;Error&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;위의 DTO 코드를 보면 &lt;code dir=&quot;auto&quot;&gt;count&lt;/code&gt; 는 숫자형 변수이고 데코레이터로도 숫자형 데이터만을 받을 수 있도록 유효성 검사(&lt;code dir=&quot;auto&quot;&gt;@IsNumber&lt;/code&gt;)를 하고 있다.&lt;/p&gt;
&lt;p&gt;그럼에도 불구하고 API 테스트 툴(Postman, Insomnia 등) 나 Swagger를 사용해 Request 를 보내면 아래와 같이 숫자형 데이터가 아니라는 에러가 발생한다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count must be a number conforming to the specified constraints&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;원인-분석&quot;&gt;원인 분석&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;URL의 데이터를 통해 Request 를 받을 때, 숫자형 데이터가 문자열 타입 (URL이 문자열이므로) 그대로 DTO와 Mapping 되는 것&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;데이터를 RequestBody 와 같이 JSON 형태가 아니라 URL의 &lt;strong&gt;문자열로 보냈기 때문&lt;/strong&gt;에, URL 경로에서 &lt;code dir=&quot;auto&quot;&gt;:count&lt;/code&gt;에 해당하는 데이터는 아래와 같이 &lt;strong&gt;문자열&lt;/strong&gt; 로 DTO 의 &lt;code dir=&quot;auto&quot;&gt;count&lt;/code&gt; 필드와 맵핑된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;https://www.ooooo.com/api/v1/order/prod/count/ABCD321321-12/3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;count 는 숫자 3 이 아닌 문자열 ‘3’ 이다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ABCD321321-12&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그렇기 때문에 URL 경로의 데이터들을 DTO 객체와 맵핑하는 과정에서 &lt;em&gt;문자열 -&gt; 숫자&lt;/em&gt; 로 변경하는 처리가 필요하다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;해결&quot;&gt;해결&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;@Type(() =&gt; 변경하고자 하는 타입)&lt;/strong&gt; 데코레이터&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;@Type&lt;/code&gt; 데코레이터를 사용하면 URL 경로의 데이터들을 DTO 객체와 맵핑하는 과정에서 &lt;em&gt;문자열 -&gt; 숫자&lt;/em&gt; 로 변경하는 처리를 할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;@Type(() =&gt; Number)&lt;/code&gt; 를 이용해 URL 경로의 데이터와 DTO의 필드가 &lt;strong&gt;맵핑 되기 전&lt;/strong&gt; 에 숫자로 타입을 변경한다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@Type&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; Number)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@IsNumber&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count: number;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데코레이터는 위에서 아래로 적용된다. 따라서 &lt;code dir=&quot;auto&quot;&gt;@Type&lt;/code&gt; 데코레이터가 &lt;code dir=&quot;auto&quot;&gt;@IsNumber&lt;/code&gt; 데코레이터 보다 위에 있어야 한다. 반대의 경우, 숫자 타입으로 변경하지 않은 채 &lt;code dir=&quot;auto&quot;&gt;@IsNumber&lt;/code&gt; 가 적용되어 똑같은 에러가 발생한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;지금까지 주로 JSON을 사용하여 데이터를 서버로 넘겼기 때문에 이와 같은 에러를 본 적이 없었다. 이번 경우도 URL 경로가 아닌 JSON 형태로 Request 를 보내면 문제없이 처리할 수 있었다.&lt;/p&gt;
&lt;p&gt;하지만 &lt;em&gt;QueryString&lt;/em&gt; 이나 &lt;em&gt;Path Variable&lt;/em&gt; 과 같이 URL 에 직접 데이터를 보내는 경우에는 데이터를 모두 문자열 타입으로 처리하기 때문에 DTO 매핑 단계에서 타입 변경 처리가 반드시 필요하다는 사실을 알 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/avantar/validating-numeric-query-parameters-in-nestjs-gk9&quot;&gt;Validating numeric query parameters in NestJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sleepy-it.tistory.com/41&quot;&gt;[NestJS] must be a number conforming to the specified constraints - body dto 타입 에러 해결&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>nestjs</category><category>troubleshooting</category><category>validation</category><category>typescript</category><category>class-validator</category></item><item><title>ESLint Parsing Error 해결 — TypeScript 파일 린트 설정</title><link>https://onejay-lab-c3e94.web.app/blog/programming/react/react-native/2022-05-28-error-eslint-parsing-error/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/programming/react/react-native/2022-05-28-error-eslint-parsing-error/</guid><description>React Native 에서 ES Lint 의 Parsing error 를 해결해 본다.

</description><pubDate>Sat, 28 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;react-native-es-lint---parsing-error&quot;&gt;[React Native] ES Lint - Parsing error&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2022-05-28&quot;,
  &quot;updatedAt&quot;: &quot;2022-05-28&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;ReactNative 의 ESLint 에러를 해결해 본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;React Native 프로젝트에서 ES Lint 설정을 한 뒤, &lt;code dir=&quot;auto&quot;&gt;.eslintrc.js&lt;/code&gt; 파일을 조금 수정했다.&lt;/p&gt;
&lt;p&gt;Typescript 를 사용하고 있기에 parserOptions 에 project 항목을 추가하여 &lt;code dir=&quot;auto&quot;&gt;tsconfig.json&lt;/code&gt; 파일을 참조하도록 했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;.eslintrc.js&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;parserOptions&apos;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&apos;ecmaFeatures&apos;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&apos;jsx&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&apos;ecmaVersion&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&apos;project&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;./tsconfig.json&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그리고 기본값으로 설정되어 있는 &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; 파일의 lint를 실행했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lint&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eslint . --ext .js,.jsx,.ts,.tsx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;실행&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_PATH}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/.eslintrc.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;0:0&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Parsing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;parserOptions.project&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;been&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@typescript-eslint/parser.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;does&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.eslintrc.js.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;must&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;be&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;least&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;one&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;projects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;provided&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_PATH}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/babel.config.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;0:0&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Parsing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;parserOptions.project&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;been&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@typescript-eslint/parser.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;does&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;babel.config.js.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;must&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;be&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;least&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;one&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;projects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;provided&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_PATH}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/metro.config.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;0:0&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Parsing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;parserOptions.project&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;been&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@typescript-eslint/parser.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;does&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;metro.config.js.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;The&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;must&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;be&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;least&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;one&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;projects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;provided&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;원인-분석&quot;&gt;원인 분석&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Error 로그를 읽어보니 &lt;code dir=&quot;auto&quot;&gt;.eslintrc.js&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;babel.config.js&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;metro.config.js&lt;/code&gt; 3개의 설정 파일들이 &lt;code dir=&quot;auto&quot;&gt;.eslintrc.js&lt;/code&gt; 파일에 방금 추가한 project 속성의 설정과 맞지 않는다고 한다.&lt;/p&gt;
&lt;p&gt;Typescript 를 적용하면서 project 속성에 tsconfig.json 을 설정했는데 이게 문제였다.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;해결&quot;&gt;해결&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;.eslintrc.js&lt;/code&gt; 의 적용 대상에서 3개의 파일을 제외&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 에러에 대해 구글링해보니 의외로 해결 방법은 간단했다. &lt;code dir=&quot;auto&quot;&gt;.eslintrc.js&lt;/code&gt; 의 적용되는 대상에서 이 3개의 파일들을 제외하면 된다.&lt;/p&gt;
&lt;p&gt;es lint 처리는 기본적으로 전체 프로젝트의 코드들을 대상으로 처리하기에 3개의 설정 파일(js)도 포함 된다. 하지만 이 3개의 설정 파일들은 es lint 처리를 할 필요가 없다. (직접적으로 코딩하는 파일이 아니므로)&lt;/p&gt;
&lt;p&gt;더욱이 Typescript 로 코딩하기 때문에 ts, tsx 파일들만 lint 처리를 하면 된다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;특정-파일-형식_ts-_tsx-만-es-lint-체크-대상에-넣기&quot;&gt;특정 파일 형식(_.ts, _.tsx) 만 ES Lint 체크 대상에 넣기&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;_.js, _.jsx 파일을 대상에서 제외: &lt;code dir=&quot;auto&quot;&gt;eslint . --ext .ts,.tsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lint&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eslint . --ext .ts,.tsx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;특정-디렉토리만-es-lint-체크-대상에-넣기&quot;&gt;특정 디렉토리만 ES Lint 체크 대상에 넣기&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;src 디렉토리만 대상으로 하기: &lt;code dir=&quot;auto&quot;&gt;eslint . --ext .ts,.tsx src/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lint&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eslint . --ext .ts,.tsx src/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev-yakuza.posstree.com/ko/react-native/eslint-prettier-husky-lint-staged/&quot;&gt;React Native에서 ESLint, Prettier를 프로처럼 사용하기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>react native</category><category>troubleshooting</category><category>eslint</category><category>typescript</category></item><item><title>iOS 빌드 오류 해결 — Podfile.lock &amp; Xcode 시뮬레이터 설정</title><link>https://onejay-lab-c3e94.web.app/blog/programming/react/react-native/2022-05-28-error-react-native-ios-xcode-simulator/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/programming/react/react-native/2022-05-28-error-react-native-ios-xcode-simulator/</guid><description>React Native 에서 발생한 xcode, podfile 관련 에러를 알아보고 해결해 본다.

</description><pubDate>Sat, 28 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;reactnative-error-ios-build-failed&quot;&gt;[ReactNative] Error: iOS Build Failed&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2022-05-28&quot;,
  &quot;updatedAt&quot;: &quot;2022-05-28&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;ReactNative 의 iOS 빌드 에러(xcode, podfile)를 해결해 본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;React Native 를 이용해 iOS 빌드 중 아래의 2가지 에러로 빌드에 실패했다. 2가지 에러에 대한 원인을 찾아보고 해결해 보기로 했다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error Could not find &quot;Podfile.lock&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error Could not get the simulator list from Xcode.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;!--
  - Android 빌드에 이어 iOS 빌드를 진행하기 위해 새롭게 **Xcode** 를 설치했다. 그 동안은 [**Xcode Command Line Tools](https://mac.install.guide/commandlinetools/index.html)** 만 사용하고 있었는데, 이번에 모바일 앱 개발에 앞서 시뮬레이션을 사용하기 위해 설치했다. ****
 --&gt;
&lt;div&gt;&lt;h2 id=&quot;error&quot;&gt;Error&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;빌드 실패 에러는 아래와 같다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ios&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Could&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Podfile.lock&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;PROJECT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/ios/Podfile.lock.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Did&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;you&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pod install&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iOS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;directory?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Xcode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}.xcodeproj&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;xcrun:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;utility&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;simctl&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;developer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Could&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;simulator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Xcode.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Please&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Xcode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;running&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;directly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;there&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;resolve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remaining&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;issues.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CLI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--verbose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;details.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Command&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xcrun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;simctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--json&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;devices&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;xcrun:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;utility&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;simctl&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;developer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;원인-분석&quot;&gt;원인 분석&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;1-could-not-find-podfilelock&quot;&gt;1) Could not find “Podfile.lock”&lt;/h3&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;CocoaPod이 처음부터 잘못 설치된 것이 원인인듯 하다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pod 에 관한 에러는 이번이 처음이 아니었다. 처음 React Native 프로젝트 생성 당시에도 아래와 같은 에러가 발생하며 Pod 이 제대로 설치되지 않았다는 것을 알고 있었다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error Error: Failed to install CocoaPods dependencies for iOS project, which is required by this template.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;다만 그 때는 에러 로그에 나온 방법대로 &lt;code dir=&quot;auto&quot;&gt;cd ./${APP_NAME}/ios &amp;#x26;&amp;#x26; pod install&lt;/code&gt; 명령어를 통해 임시적으로 해결(묵인)하고 넘겼었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;React Native 프로젝트 생성 당시의 에러&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;react-native&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; ${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;react-native-template-typescript&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;✔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Downloading&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;✔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Copying&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;✔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Processing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;✖&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CocoaPods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt; (this &lt;/span&gt;&lt;span&gt;may&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;take&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;few&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minutes&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;✖&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CocoaPods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt; (this &lt;/span&gt;&lt;span&gt;may&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;take&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;few&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minutes&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CocoaPods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iOS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;which&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;template.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Please&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;again&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manually:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cd ./${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}/ios &amp;#x26;&amp;#x26; pod install&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;CocoaPods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;documentation:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://cocoapods.org/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/ios&lt;/span&gt;&lt;span&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;2-could-not-get-the-simulator-list-from-xcode&quot;&gt;2) Could not get the simulator list from Xcode.&lt;/h3&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Xcode Command Line Tools 의 설치 경로가 잘못되었다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mac.install.guide/commandlinetools/index.html&quot;&gt;Xcode Command Line Tools&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Mac에서 개발 환경을 구축하기 위해서는 필수인 Tool 이다. Git부터 Xcode Command Line Tools가 없으면 사용이 불가능하다.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Xcode IDE&lt;/em&gt; 에 포함되어 있기 때문에 Xcode IDE 를 사용한다면 별도의 설치가 필요없다.
&lt;ul&gt;
&lt;li&gt;다만, 앱 개발을 하는 경우가 아니라면 무겁고 용량도 많이 차지하는 Xcode IDE 보다는 가벼운 Xcode Command Line Tools 만 설치해도 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;기존에 이미 설치되어 있었던 Xcode Command Line Tools 를 지우지 않고 Xcode IDE 를 설치했기 때문에, Xcode IDE 의 Xcode Command Line Tools 설치 경로와 기존의 설치 경로가 다르게 되면서 시뮬레이터의 실행에 실패한듯 하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Xcode Command Line Tools 설치 경로 확인&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xcode-select&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-print-path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/Library/Developer/CommandLineTools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Xcode IDE 설치 경로&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/Applications/Xcode.app/Contents/Developer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;해결&quot;&gt;해결&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;1-could-not-find-podfilelock-1&quot;&gt;1) Could not find “Podfile.lock”&lt;/h3&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;CocoaPods 재설치&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;에러 로그에 나와있듯이 (&lt;code dir=&quot;auto&quot;&gt;Did you run &quot;pod install&quot; in iOS directory?&lt;/code&gt;) &lt;strong&gt;ios 디렉토리로 이동&lt;/strong&gt;하여 &lt;strong&gt;CocoaPods 를 다시 설치&lt;/strong&gt; 해본다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ios 디렉토리로 이동&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ios&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install cocoapods&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Codegen] &lt;/span&gt;&lt;span&gt;Generating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./build/generated/ios/React-Codegen.podspec.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Analyzing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;DoubleConversion&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Codegen] &lt;/span&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FBReactNativeSpec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;RCT-Folly&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;boost&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/boost.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;glog&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/glog.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;CocoaPods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;could&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compatible&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;FlipperKit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;In&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Podfile:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;FlipperKit&lt;/span&gt;&lt;span&gt; (= &lt;/span&gt;&lt;span&gt;0.125.0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;contain&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satisfying&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependency:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;FlipperKit&lt;/span&gt;&lt;span&gt; (= &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0.125.0&lt;/span&gt;&lt;span&gt;)`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;You&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;have&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;either:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;out-of-date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repos&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;which&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;you&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;can&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; repo update`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; install &lt;/span&gt;&lt;span&gt;--repo-update&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mistyped&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;added&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;that&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hosts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Podfile.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;다시 에러가 발생했다. 로그를 보아하니 &lt;strong&gt;레포지토리의 업데이트가 필요&lt;/strong&gt;한 듯하다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pod repo update or pod install --repo-update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;레포지토리를 업데이트하고 다시 설치한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Update Pod Repository&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Updating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;trunk&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install cocoapods&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Codegen] &lt;/span&gt;&lt;span&gt;Generating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./build/generated/ios/React-Codegen.podspec.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Analyzing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;DoubleConversion&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Codegen] &lt;/span&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FBReactNativeSpec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;RCT-Folly&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;boost&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/boost.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Fetching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;podspec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;glog&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;./node_modules/react-native/third-party-podspecs/glog.podspec`&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Downloading&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CocoaAsyncSocket&lt;/span&gt;&lt;span&gt; (7.6.5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DoubleConversion&lt;/span&gt;&lt;span&gt; (1.1.6)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;glog&lt;/span&gt;&lt;span&gt; (0.3.5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;libevent&lt;/span&gt;&lt;span&gt; (2.1.12)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Generating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Pods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_NAME}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/ios/Pods/Target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Files/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.release.xcconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_NAME}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/ios/Pods/Target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Files/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.debug.xcconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_NAME}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/ios/Pods/Target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Files/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;Tests/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;Tests.release.xcconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{PROJECT_NAME}&lt;/span&gt;&lt;span&gt;/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/ios/Pods/Target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Support&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Files/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;Tests/Pods-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;Tests.debug.xcconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;React-Core&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Integrating&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;Please&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;current&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Xcode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sessions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}.xcworkspace`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; this project from now on.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Pod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;installation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;complete!&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;There&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;are&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;55&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Podfile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;46&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;installed.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이번에는 성공했다. 일단 첫 번째 에러는 해결된 듯 하다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;2-could-not-get-the-simulator-list-from-xcode-1&quot;&gt;2) Could not get the simulator list from Xcode.&lt;/h3&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Xcode Command Line Tools 의 설치 경로 변경&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 에러는 좀더 간단하다. 터미널에서 몇 개의 명령어만 실행하면 금방 해결할 수 있었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;① Home 으로 이동&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;② Xcode Command Line Tools 설치 경로 확인&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xcode-select&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-print-path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/Library/Developer/CommandLineTools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;③ Xcode IDE 설치 경로 확인: finder 등으로 확인한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(내 로컬의 경우) /Applications/Xcode.app/Contents/Developer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;④ Xcode Command Line Tools 설치 경로를 Xcode IDE 의 설치 경로로 변경&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xcode-select&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--switch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/Applications/Xcode.app/Contents/Developer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Password:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;비밀번호&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입력&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⑤ Xcode Command Line Tools 설치 경로 확인&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xcode-select&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-print-path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/Applications/Xcode.app/Contents/Developer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;ios-build&quot;&gt;iOS Build&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;2가지 에러가 해결되었는지 확인을 위해 다시 한 번 ios 를 빌드해 본다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;프로젝트 디렉토리로 이동하여 실행&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ios&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; ${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;@0.0.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ios&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;react-native&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run-ios&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Xcode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workspace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}.xcworkspace&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Building&lt;/span&gt;&lt;span&gt; (using &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;xcodebuild -workspace ${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}.xcworkspace -configuration Debug -scheme ${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;} -destination ...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Successfully&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;built&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Successfully&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launched&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;simulator&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;빌드가 성공적으로 끝나고 Xcode 시뮬레이터가 실행되었다. 정상적으로 리액트 기본 앱이 실행되는 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://reactnative.dev/docs/environment-setup&quot;&gt;공식 사이트의 튜토리얼&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>react native</category><category>troubleshooting</category><category>ios</category><category>xcode</category><category>cocoapods</category></item><item><title>중첩된 .git 디렉토리로 인한 adding files failed 에러 해결</title><link>https://onejay-lab-c3e94.web.app/blog/tools/git/2022-05-28-error-adding-files-failed/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/tools/git/2022-05-28-error-adding-files-failed/</guid><description>Git 의 adding files failed 에러를 알아보고 해결해 본다.

</description><pubDate>Sat, 28 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;git-error-does-not-have-a-commit-checked-out&quot;&gt;[Git] Error: does not have a commit checked out&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2022-05-28&quot;,
  &quot;updatedAt&quot;: &quot;2022-05-28&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-28&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Git 의 adding files failed 에러를 알아보고 해결해 본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;여러 개의 프로젝트를 하나의 Git Repository 에서 관리하고 있었다. 새롭게 Nest.js 프로젝트를 명령어(nest cli)를 통해 생성했고 생성한 프로젝트를 Git 에 Commit 하려고 하니 add 가 되지 않았다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GitRepository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── A Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── B Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── C Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── D Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── E Project (new project)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;error&quot;&gt;Error&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git Error 의 메시지는 아래와 같았다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;${PROJECT_NAME}/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;does&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;have&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;checked&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;fatal:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;원인-분석&quot;&gt;원인 분석&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;에러 메시지를 바탕으로 구글링 해본 결과 아래의 경우가 원인인 듯 했다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt; `.git` 디렉토리가 중복으로 존재하는 경우&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;한 개의 Git Repository 에는 하나의 &lt;code dir=&quot;auto&quot;&gt;.git&lt;/code&gt; 디렉토리만 있어야한다. 그런데 이번에 새롭게 추가한 Nest.js 프로젝트는 명령어(nest cli)로 생성할 경우 자동으로 Nest.js 프로젝트 내부에 &lt;code dir=&quot;auto&quot;&gt;.git&lt;/code&gt; 디렉토리를 생성한다. 이것이 에러의 원인이었다.&lt;/p&gt;
&lt;p&gt;Git Repository 의 구조를 정리하면 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Project Structure&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GitRepository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── A Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── B Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── C Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── D Project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── E Project (new project)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│ ├── .git # 자동으로 생성된 디렉토리&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│ └── .gitignore&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── .git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── .gitignore&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;해결&quot;&gt;해결&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;해결 방법은 간단하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;자동으로 생성된 &lt;code dir=&quot;auto&quot;&gt;.git&lt;/code&gt; 디렉토리를 삭제&lt;/strong&gt; 한다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.gitignore&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>git</category><category>troubleshooting</category><category>nestjs</category></item><item><title>Android 빌드 실패 — JAVA_HOME 환경변수 설정</title><link>https://onejay-lab-c3e94.web.app/blog/programming/react/react-native/2022-05-27-error-android-device-exception/</link><guid isPermaLink="true">https://onejay-lab-c3e94.web.app/blog/programming/react/react-native/2022-05-27-error-android-device-exception/</guid><description>React Native 에서 발생한 Android 빌드 에러를 해결해 본다.

</description><pubDate>Fri, 27 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;!--title --&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;h1 id=&quot;reactnative-android-build-failed&quot;&gt;[ReactNative] Android Build Failed&lt;/h1&gt;&lt;/div&gt;
&lt;!--//title --&gt;
&lt;!--
```json
{
  &quot;author&quot;: &quot;Onejay&quot;,
  &quot;createdAt&quot;: &quot;2022-05-27&quot;,
  &quot;updatedAt&quot;: &quot;2022-05-27&quot;
}
```
--&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Onejay&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;createdAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-27&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;updatedAt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2022-05-27&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;ReactNative 의 안드로이드 빌드 에러(DeviceException)를 해결해 본다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- truncate --&gt;
&lt;div&gt;&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;React Native 를 이용해 Android 빌드 중 아래의 에러로 빌드에 실패했다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Execution failed for task &apos;:app:installDebug&apos;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&gt; com.android.builder.testing.api.DeviceException: No connected devices!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;error&quot;&gt;Error&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;빌드 실패 에러는 아래와 같다.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;react-native&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run-android&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Running&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jetifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;libraries&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AndroidX.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;You&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;can&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;disable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;--no-jetifier&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flag.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Jetifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;found&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;936&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forward-jetify.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;already&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;running.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Launching&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;emulator...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;emulator.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Reason:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Could&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;emulator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;within&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;seconds..&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Please&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;emulator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manually&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;device.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Otherwise&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;may&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fail&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launch.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Configure&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Unable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;detect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AGP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;builds.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;All&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;projects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;same&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AGP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;object:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;org.gradle.composite.internal.DefaultIncludedBuild&lt;/span&gt;&lt;span&gt;$IncludedBuildImpl_Decorated&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Task&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:app:installDebug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FAILED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;37&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;actionable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tasks:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executed,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;35&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up-to-date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;FAILURE:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exception.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;What&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;went&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrong:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Execution&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;:app:installDebug&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.builder.testing.api.DeviceException:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;No&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;devices!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Try:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--stacktrace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;option&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trace.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--debug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;option&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--scan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;full&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;insights.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;help&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://help.gradle.org&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;BUILD&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FAILED&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sure&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;you&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;have&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Android&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;emulator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;running&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connected.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Error:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Command&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./gradlew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app:installDebug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-PreactNativeDevServerPort=8081&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;FAILURE:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exception.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;What&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;went&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrong:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Execution&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;:app:installDebug&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.builder.testing.api.DeviceException:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;No&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;devices!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Try:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--stacktrace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;option&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trace.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--debug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;option&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--scan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;full&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;insights.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;help&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://help.gradle.org&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;BUILD&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FAILED&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;makeError&lt;/span&gt;&lt;span&gt; (/${&lt;/span&gt;&lt;span&gt;PROJECT_PATH}/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/node_modules/@react-native-community/cli-platform-android/node_modules/execa/index.js:174:9&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;PROJECT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/node_modules/@react-native-community/cli-platform-android/node_modules/execa/index.js:278:16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;processTicksAndRejections&lt;/span&gt;&lt;span&gt; (node:internal/process/task_queues:96:5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runOnAllDevices&lt;/span&gt;&lt;span&gt; (/${&lt;/span&gt;&lt;span&gt;PROJECT_PATH}/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/node_modules/@react-native-community/cli-platform-android/build/commands/runAndroid/runOnAllDevices.js:109:5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Command.handleAction&lt;/span&gt;&lt;span&gt; (/${&lt;/span&gt;&lt;span&gt;PROJECT_PATH}/$&lt;/span&gt;&lt;span&gt;{APP_NAME}&lt;/span&gt;&lt;span&gt;/node_modules/@react-native-community/cli/build/index.js:192:9&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CLI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--verbose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;details.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;원인-분석&quot;&gt;원인 분석&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;JAVA_HOME 환경변수가 설정되어 있지 않았기 때문에 jdk 를 찾을 수 없다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 에러 메시지를 구글링 해보니 JAVA_HOME 환경변수가 설정되어 있지 않았기 때문에 jdk 를 찾을 수 없을 때 나타나는 에러라고 한다.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;java_home&quot;&gt;JAVA_HOME&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- Java 프로그래밍이나 jvm 프로그램들을 실행하기 위해서는 **JAVA_HOME** 변수 를 시스템(OS)에 등록해야 한다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+ 등록하지 않을 경우, 매번 시스템(OS)의 jdk 경로를 지정해줘야 한다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- **JAVA_HOME** 변수는 일종의 전역 변수(_Global Variable_) 이다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+ 시스템(OS)의 전역 변수로서 **JAVA_HOME** 이라는 전역 변수를 시스템(OS)에 등록하면 시스템(OS) 어디서든 java 를 실행하고 사용할 수 있다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- Android Studio 나 IntelliJ, Tomcat 등의 java 를 이용하는 프로그램들이 Build, BootRun, Emulator 등을 실행 할 때, 별도로 jdk 의 경로를 지정해주지 않아도 시스템(OS)의 **JAVA_HOME** 이라는 변수를 불러와 사용한다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+ JDK 경로는 **JAVA_HOME** 에 저장되어 있다는 약속&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+ 이 약속된 변수 **JAVA_HOME** 이 없었기에 빌드에 실패했다. 따라서 이 변수를 지정해주어야 한다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;해결&quot;&gt;해결&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;java_home-환경변수-설정&quot;&gt;JAVA_HOME 환경변수 설정&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;① Home 으로 이동&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;② JAVA_HOME 환경변수가 없을 경우 가장 아래쪽에 추가&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;③ zshrc 적용&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;④ JAVA_HOME 확인&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$JAVA_HOME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;android-build&quot;&gt;Android Build&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;에러가 해결되었는지 확인을 위해 다시 한 번 android 를 빌드해 본다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;프로젝트 디렉토리로 이동하여 실행&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;react-native&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run-android&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Running&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jetifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;libraries&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AndroidX.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;You&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;can&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;disable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;--no-jetifier&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flag.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Jetifier&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;found&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;936&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forward-jetify.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workers...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;already&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;running.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Configure&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Unable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;detect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AGP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;builds.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;All&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;projects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;same&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AGP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;included&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;object:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;org.gradle.composite.internal.DefaultIncludedBuild&lt;/span&gt;&lt;span&gt;$IncludedBuildImpl_Decorated&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Task&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:app:installDebug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Installing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;APK&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;app-debug.apk&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Nexus_6_API_30(AVD) - 11&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app:debug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Installed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;device.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;BUILD&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SUCCESSFUL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;11s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;37&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;actionable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tasks:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;executed,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;35&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up-to-date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Connecting&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;development&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;server...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;8081&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Starting&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;emulator-5554&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Starting:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Intent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cmp=com.&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;APP_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/.MainActivity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;빌드가 성공적으로 끝나고 Android 시뮬레이터가 실행되었다. 정상적으로 리액트 기본 앱이 실행되는 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Refs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://reactnative.dev/docs/environment-setup&quot;&gt;공식 사이트의 튜토리얼&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>react native</category><category>troubleshooting</category><category>android</category><category>java</category></item></channel></rss>