<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>밀래의 코딩북</title>
    <link>https://firework-ham.tistory.com/</link>
    <description>안녕하세요.
개발자 밀래의 공부 정리 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 30 Jul 2026 07:26:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>밀래</managingEditor>
    <item>
      <title>k8s metrics-server 설치 및 running 되지 않을때..</title>
      <link>https://firework-ham.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k8s metrics-server를 설치하고 적용 했는데 running 되지 않은 상태에서 막힌다면 다음을 해보시면 좋을 것 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;k8s metrics-server 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Metric-server를 설치하기 위해서는 아래 레파지토리에서 릴리즈 항목을 확인한 후 설치하면됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/kubernetes-sigs/metrics-server&quot;&gt;https://github.com/kubernetes-sigs/metrics-server&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720532585051&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in aut&quot; data-og-description=&quot;Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. - kubernetes-sigs/metrics-server&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kubernetes-sigs/metrics-server&quot; data-og-url=&quot;https://github.com/kubernetes-sigs/metrics-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eOMUN/hyWzsLlx2D/dahpdnkP5acukMITkihnv0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/kubernetes-sigs/metrics-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kubernetes-sigs/metrics-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eOMUN/hyWzsLlx2D/dahpdnkP5acukMITkihnv0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in aut&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. - kubernetes-sigs/metrics-server&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어는 릴리즈 항목에 들어가면 확인할 수 있는데 설치하고자 하는 환경에서 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720532629223&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Readiness probe failed: HTTP probe failed with statuscode: 500&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl top 명령어는 metrics-server의 기본 명령어 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 아래와 같이 API를 사용할 수 없다고 나오면 어디를 체크해야할지 알기 힘든데요.&lt;/p&gt;
&lt;pre id=&quot;code_1720532167135&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; kubectl top pod
error: Metrics API not available&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다음 명령어를 처보면 Metrics Server가 설치는 되었지만 실행이 안된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720532253522&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; kubectl get po -n kube-system
NAME                               READY   STATUS    RESTARTS       AGE
coredns-7db6d8ff4d-dr9vz           1/1     Running   0              5d8h
coredns-7db6d8ff4d-t2824           1/1     Running   0              5d8h
etcd-minikube                      1/1     Running   0              5d8h
kube-apiserver-minikube            1/1     Running   0              5d8h
kube-controller-manager-minikube   1/1     Running   0              5d8h
kube-proxy-sr2m6                   1/1     Running   0              5d8h
kube-scheduler-minikube            1/1     Running   0              5d8h
metrics-server-7ffbc6d68-g8clp     0/1     Running   0              3m21s
storage-provisioner                1/1     Running   1 (5d8h ago)   5d8h&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 metrics-server가 실행안되는지 확인하려면 아래 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720532320134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; kubectl describe po -n kube-system metrics-server-7ffbc6d68-g8clp
...
...
...
Events:
  Type     Reason     Age                     From               Message
  ----     ------     ----                    ----               -------
  Normal   Scheduled  9m6s                    default-scheduler  Successfully assigned kube-system/metrics-server-7ffbc6d68-g8clp to minikube
  Normal   Pulling    9m5s                    kubelet            Pulling image &quot;registry.k8s.io/metrics-server/metrics-server:v0.7.1&quot;
  Normal   Pulled     9m                      kubelet            Successfully pulled image &quot;registry.k8s.io/metrics-server/metrics-server:v0.7.1&quot; in 5.648s (5.648s including waiting). Image size: 66896932 bytes.
  Normal   Created    8m59s                   kubelet            Created container metrics-server
  Normal   Started    8m59s                   kubelet            Started container metrics-server
  Warning  Unhealthy  3m56s (x32 over 8m36s)  kubelet            Readiness probe failed: HTTP probe failed with statuscode: 500&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 500 코드로 에러가 발생한다면 다음 커맨드를 추가 해주세요.&lt;/p&gt;
&lt;pre id=&quot;code_1720532369348&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; kubectl edit deploy -n kube-system metrics-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 항목에 맞춰서 추가해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi 에디터 다루 듯이 &amp;nbsp;i를 누르고 &quot;- --kubelet-insecure-tls&quot; 를 추가 한뒤 wq를 눌러 저장합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1720532434043&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls # 추가 항목&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발팁</category>
      <category>k8s metrics-server</category>
      <category>k8s metrics-server running</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/123</guid>
      <comments>https://firework-ham.tistory.com/123#entry123comment</comments>
      <pubDate>Tue, 9 Jul 2024 22:46:50 +0900</pubDate>
    </item>
    <item>
      <title>[vscode] 파일 자동 저장 설정 하기</title>
      <link>https://firework-ham.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;vscode를 처음 시작하게 되면 파일을 수동으로 저장을 시켜줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode를 자동 저장하기 위해서는 설정을 해줘야 하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 설정해주시면 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파일 자동 저장&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 간편 설정 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2S8S/btsCF7UD1BV/DPMABdaA0RkQExQHihN960/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2S8S/btsCF7UD1BV/DPMABdaA0RkQExQHihN960/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2S8S/btsCF7UD1BV/DPMABdaA0RkQExQHihN960/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2S8S%2FbtsCF7UD1BV%2FDPMABdaA0RkQExQHihN960%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;377&quot; height=&quot;523&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 기본 설정 되어 있는 자동 설정으로 자동 저장만 실행할 경우 아래와 같이 기능을 체크해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- File - Auto Save 체크&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 상세 설정 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6TJ9f/btsCCz49xfb/XkZqSfVEZ285O5QTWjtpi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6TJ9f/btsCCz49xfb/XkZqSfVEZ285O5QTWjtpi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6TJ9f/btsCCz49xfb/XkZqSfVEZ285O5QTWjtpi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6TJ9f%2FbtsCCz49xfb%2FXkZqSfVEZ285O5QTWjtpi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1255&quot; height=&quot;662&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 상세 설정을 하고 싶다면 설정 항목으로 들어가 설정 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- File - Preferences - Settings&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- text Editor - Files - Auto Save&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Auto Save 에서는 총 4가지 설정이 가능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;off : 자동저장 하지 않기&lt;/li&gt;
&lt;li&gt;after delay : Auto Save Delay에서 설정한 시간이 지난 경우 자동저장&lt;/li&gt;
&lt;li&gt;onFocusChange : 에디터 밖으로 포커스를 이동하면 자동 저장&lt;/li&gt;
&lt;li&gt;onWindowChange : vscode 에디터 밖으로 포커스를 이동하면 자동 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Auto save Delay는 after delay 일 때 필요한 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 기본 설정은 1000ms 마다 저장되며 변경 사항이 없을 경우 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발팁</category>
      <category>vscode</category>
      <category>버츄얼스튜디오코드</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/122</guid>
      <comments>https://firework-ham.tistory.com/122#entry122comment</comments>
      <pubDate>Mon, 25 Dec 2023 14:59:32 +0900</pubDate>
    </item>
    <item>
      <title>Chatgot - LLM (GPT) 여러 모델을 한 화면에서 사용하는 사이트</title>
      <link>https://firework-ham.tistory.com/121</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccMgQJ/btszqebtUxC/QxZ57PubpySW9KO7cjuBNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccMgQJ/btszqebtUxC/QxZ57PubpySW9KO7cjuBNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccMgQJ/btszqebtUxC/QxZ57PubpySW9KO7cjuBNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccMgQJ%2FbtszqebtUxC%2FQxZ57PubpySW9KO7cjuBNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;720&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 관련 서비스가 많이 나오는데 각각의 사이트에서는 자신들의 모델만을 사용할 수 있게 만들고 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사이트는 여러 회사의 모델들을 한번에 사용할 수 있게 만드는 사이트 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재미있기도 하고 이런 아이디어가 이제 필요한 것 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 모델은 서비스 하는 업체의 사이트에서만 사용하는 것도 피로도가 높거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더욱이 지금 물어보던걸 다른 사이트에 또 물어보려면 여러 스텝을 거쳐서 이동한 뒤에 물어봐야하니깐요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 히스토리가 있다면 그 히스토리도 다 천천히 물어봐야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 생각하면 바로바로 모델을 바꿔서 이야기 할 수 있는게 좋은 것 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://start-chat.chatgot.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://start-chat.chatgot.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698551300146&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Chatgot&quot; data-og-description=&quot;&quot; data-og-host=&quot;start-chat.chatgot.io&quot; data-og-source-url=&quot;https://start-chat.chatgot.io/&quot; data-og-url=&quot;https://start-chat.chatgot.io/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://start-chat.chatgot.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://start-chat.chatgot.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Chatgot&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;start-chat.chatgot.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXajJq/btszlmuQws8/3jxB5touQKy39fSJSAfxMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXajJq/btszlmuQws8/3jxB5touQKy39fSJSAfxMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXajJq/btszlmuQws8/3jxB5touQKy39fSJSAfxMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXajJq%2FbtszlmuQws8%2F3jxB5touQKy39fSJSAfxMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1497&quot; height=&quot;523&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수다쟁이라는 사이트 인데요. Chat got입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면은 다른 LLM 서비스와 동일하고 상단에 사용할 수 있는 모델들이 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 베타 서비스라서 그런지 따로 인증을 하지는 않고 구글 로그인만 하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2Q0n/btszl0rlAbq/6TZntfo5r7vjbIskqeN2QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2Q0n/btszl0rlAbq/6TZntfo5r7vjbIskqeN2QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2Q0n/btszl0rlAbq/6TZntfo5r7vjbIskqeN2QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2Q0n%2Fbtszl0rlAbq%2F6TZntfo5r7vjbIskqeN2QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;511&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@를 붙이면 같은 대화방에서 바로 모델로 전환 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 GPT 3.5, GPT 4, 클로드, 라마, Midiourney를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 스샷은 자동 번역때문에 ㅎㅎ 중주기행으로 뜨네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q5jLN/btszkznIMED/jDWikykNEmlGfVhv9xN9dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q5jLN/btszkznIMED/jDWikykNEmlGfVhv9xN9dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q5jLN/btszkznIMED/jDWikykNEmlGfVhv9xN9dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5jLN%2FbtszkznIMED%2FjDWikykNEmlGfVhv9xN9dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1069&quot; height=&quot;708&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 화면처럼 간단하게 GPT3.5랑 이야기하다가 자연스럽게 GPT-4로 이동 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 히스토리도 자연스럽게 이동해서 대화할 것 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참신하면서 다양한 모델들이 많아지는 지금에는 필요한 서비스가 아닌가 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 커먼한 모든 것을 두루 아는 모델도 있지만 점점 전문 모델들도 많아지고 있기 때문에 LLM도 서로 대화하면서 특화된 내용을 전달해주는 서비스들이 계속 나오지 않을까 싶고 이 사이트는 그런 아이디어를 실현하기 위한 하나의 시작점 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜찮은 서비스라서 한번 소개해보았습니다.&lt;/p&gt;</description>
      <category>ChatGpt 활용법</category>
      <category>CHATGOT</category>
      <category>GPT3.5</category>
      <category>GPTGOT</category>
      <category>GPT서비스</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/121</guid>
      <comments>https://firework-ham.tistory.com/121#entry121comment</comments>
      <pubDate>Sun, 29 Oct 2023 12:57:58 +0900</pubDate>
    </item>
    <item>
      <title>React Next.js 프로젝트 생성하기.</title>
      <link>https://firework-ham.tistory.com/120</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1299&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZNqp/btsn1JIP4HH/cKAOEgDSQAnnTnaONpHTR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZNqp/btsn1JIP4HH/cKAOEgDSQAnnTnaONpHTR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZNqp/btsn1JIP4HH/cKAOEgDSQAnnTnaONpHTR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZNqp%2Fbtsn1JIP4HH%2FcKAOEgDSQAnnTnaONpHTR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1299&quot; height=&quot;433&quot; data-origin-width=&quot;1299&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 프로젝트 생성하는 방법은 사용 용도에 따라 크게 4가지로 소개되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 front 독립적으로 운영되는 create-app cli를 활용한 방법을 활용합니다. 그리고 서버 사이드 랜더링 및 풀스택개발을 위한 Next.js를 기반으로 프로젝트를 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 포스팅에서는 Next.js를 활용하여 기본적인 프로젝트를 생성하는 방버에 대해 작성해보려고 합니다.&lt;/p&gt;
&lt;h1&gt;0. Next.js 란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js는 리액트를 기반으로 한 오픈소스 자바스크립트 웹 프레임워크로, 리액트에는 없는 서버 사이드 렌더링 (SSR), 정적 사이트 생성 (SSG), 증분 정적 재생성 (ISR)과 같은 다양하고 풍부한 기능을 제공합니다. 이를 통해 개발자는 클라이언트와 서버에서 아주 복잡한 작업을 별다른 노력 없이 쉽게 구현할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 이유와 장점&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서버 사이드 렌더링 (SSR)의 이점:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로딩 시간 단축: 클라이언트 사이드 렌더링 (CSR)은 모든 JS 파일을 로드해야 하기 때문에 사용자는 웹 페이지를 보기까지 많은 시간을 대기해야 합니다. 반면, 서버 사이드 렌더링은 서버에서 자바스크립트를 로딩하므로 클라이언트 측에서 자바스크립트를 로딩하는 시간이 줄어듭니다.&lt;/li&gt;
&lt;li&gt;SEO 개선: CSR은 자바스크립트가 로드되지 않은 경우 검색 엔진이 페이지 내용을 인식하지 못하므로 SEO에 불리합니다. 반면 서버 사이드 렌더링은 검색 엔진이 자바스크립트, HTML, CSS를 읽을 수 있으므로 SEO가 개선됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정적 사이트 생성 (SSG):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능 개선: 정적 사이트 생성은 사전에 페이지를 미리 렌더링하여 사용자에게 즉시 표시될 수 있도록 합니다. 이로 인해 웹 애플리케이션의 초기 로딩 속도와 성능이 향상됩니다.&lt;/li&gt;
&lt;li&gt;서버 부하 감소: 정적 페이지는 서버 측에서 렌더링되기 때문에 서버 부하가 CSR에 비해 적습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 분할 (Code Splitting):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능 최적화: 코드 분할을 통해 각 페이지에서 필요한 자바스크립트 파일만 로드하여 로딩 속도를 향상할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 폴리필 (Polyfill) 적용:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저 호환성: Next.js는 폴리필을 자동으로 적용하여 다양한 브라우저에서 호환성 문제를 최소화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지 최적화:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능 개선: Next.js는 이미지 최적화를 지원하여 불필요한 데이터를 제거하고 빠르게 로드되도록 도와줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 애플리케이션의 국제화 지원:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다국어 지원: Next.js는 국제화를 쉽게 구현할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타입스크립트에 대한 기본 지원:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 안정성: Next.js는 기본적으로 타입스크립트를 지원하여 개발자가 더 안정적인 코드를 작성할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 분석:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱 성능 파악: Next.js는 앱의 성능을 분석할 수 있는 도구를 제공하여 개발자가 최적화를 진행할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js의 강력한 기능과 편리한 사용성으로 인해 현재 넷플릭스, 트위치, 틱톡, 훌루, 나이키, 우버, 엘라스틱과 같은 유명 기업에서 널리 사용되고 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서버 사이드 렌더링 (SSR)의 단점:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 부하 증가: 서버 사이드 렌더링은 서버에서 페이지를 렌더링하는데, 많은 요청이 발생할 경우 서버 부하가 증가할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;페이지 이동 시 깜빡거림:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UX 측면에서 불리: 페이지 이동 시 새로운 HTML 파일을 불러올 때 화면이 깜빡거리는 현상이 발생하여 사용자 경험에 약간의 불편을 줄 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공개 빌드된 파일들의 폴더:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.next 폴더: Next.js를 사용하는 프로젝트의 공개 빌드된 파일들이 .next 폴더에 위치하여 프로젝트임을 알기 어렵게 만들 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 장점과 단점을 고려하여 Next.js를 사용할지 여부를 결정하면 웹 개발 프로젝트에 적합한 선택을 할 수 있을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프로젝트 새성하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js 생성 방식은 다음과 같이 소개되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Next.js는 풀 스택 React 프레임워크입니다. 이는 다양하며 대부분 정적인 블로그부터 복잡한 동적 애플리케이션까지 모든 규모의 React 앱을 만들 수 있도록 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 일반적인 방법이라고 생각하면 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React를 설치하기 위해서 node를 환경에 따라 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래 명령어를 실행하면 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;npx create-next-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래와 같이 순차적으로 선택해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/berlZ4/btsn12U1rpi/qO67OhQkknxiBjICsWW6gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/berlZ4/btsn12U1rpi/qO67OhQkknxiBjICsWW6gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/berlZ4/btsn12U1rpi/qO67OhQkknxiBjICsWW6gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FberlZ4%2Fbtsn12U1rpi%2FqO67OhQkknxiBjICsWW6gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;856&quot; height=&quot;270&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TailWind CSS 선택 부분이 있는데 생소할 수 도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TailWind CSS 기존에 CSS를 직접 작성하여 HTML 소스에 적용하던 것을 미리 정의해 놓고 사용할 수 있게 만든 Utility-First 컨셉을 가진 CSS 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;https://tailwindcss.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689677374748&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.&quot; data-og-description=&quot;Tailwind CSS is a utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.&quot; data-og-host=&quot;tailwindcss.com&quot; data-og-source-url=&quot;https://tailwindcss.com/&quot; data-og-url=&quot;https://tailwindcss.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cmus1U/hyTmBSoqji/fzcuRlWlKxQzY8fPFgjdn1/img.jpg?width=2560&amp;amp;height=1280&amp;amp;face=0_0_2560_1280,https://scrap.kakaocdn.net/dn/beaAJP/hyTk6GvvPp/ZRKFruzKrOovFqgtjaixwK/img.jpg?width=2560&amp;amp;height=1280&amp;amp;face=0_0_2560_1280,https://scrap.kakaocdn.net/dn/9HjOn/hyTmsnB86j/fTuPwah3iaUsfwohpP65I1/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800&quot;&gt;&lt;a href=&quot;https://tailwindcss.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tailwindcss.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cmus1U/hyTmBSoqji/fzcuRlWlKxQzY8fPFgjdn1/img.jpg?width=2560&amp;amp;height=1280&amp;amp;face=0_0_2560_1280,https://scrap.kakaocdn.net/dn/beaAJP/hyTk6GvvPp/ZRKFruzKrOovFqgtjaixwK/img.jpg?width=2560&amp;amp;height=1280&amp;amp;face=0_0_2560_1280,https://scrap.kakaocdn.net/dn/9HjOn/hyTmsnB86j/fTuPwah3iaUsfwohpP65I1/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tailwind CSS is a utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tailwindcss.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class에 미리 정의된 UI 배치에 대한 클래스를 입력하여 빠르게 UI 개발을 완료할 수 있도록 도와주는 프레임워크로 Class 이름 선언을 고민할 필요 없이 UI에 대한 class만 선언하기 때문에 편리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론, Tailwind CSS가 지원하는 내용에 대해 러닝커브는 존재할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각자의 판다에 맞춰 적용을 하시면 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. React App Server 시작&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 아래 명령어를 실행하여 React App Server를 시작해 줍니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트는 기본적으로 3000으로 앱이 구동됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구동이 완료되면 Next.js의 기본 화면을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Next.js의 라우터 이해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프론트 서버 구동은 완료했으므로 페이지를 생성하는 방법을 이해해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 시 App Router를 선택 했을 경우 Next.js의 기본 구조는 app 폴더에서 시작합니다. 만약, 설치시 No를 선택했다면 pages 폴더 기반으로 동작합니다. 이 포스팅은 app폴더를 기반으로 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIRnCH/btsn0C4kdGM/e6bmAndRWZ9hl2BAKfbOEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIRnCH/btsn0C4kdGM/e6bmAndRWZ9hl2BAKfbOEk/img.png&quot; data-alt=&quot;출처 : next.js&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIRnCH/btsn0C4kdGM/e6bmAndRWZ9hl2BAKfbOEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIRnCH%2Fbtsn0C4kdGM%2Fe6bmAndRWZ9hl2BAKfbOEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;986&quot; height=&quot;448&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : next.js&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app 폴더를 기반으로 폴더 구조를 바탕으로 router가 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app 폴더 밑에 dashboard 폴더를 생성했다면 localhost/dashboard 라우터가 생성됩니다. 그리고 폴더 밑에 page.jsx 파일 또는 page.js 파일을 생성한다면 해당 페이지가 기본 페이지가 되게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 설명을 했으니 한번 실전으로 변경해 봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app 폴더 밑에 about 폴더를 생성합니다. 그리고 해당 폴더 밑에 page.tsx파일을 만들고 아래 코드를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1689677966111&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export default function about() {
  return &quot;Here. About Page&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 주소창에 http://localhost:3000/about를 입력하면 아래 페이지가 뜨는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dm0yZ/btsn6OXa0Ln/KZiIwEMuYdNQnixHaVR3l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dm0yZ/btsn6OXa0Ln/KZiIwEMuYdNQnixHaVR3l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dm0yZ/btsn6OXa0Ln/KZiIwEMuYdNQnixHaVR3l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDm0yZ%2Fbtsn6OXa0Ln%2FKZiIwEMuYdNQnixHaVR3l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;899&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 기본적인 Next.js를 활용한 React 프로젝트를 생성해 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 Route 기능도 살펴보았으니 이제 하나의 페이지를 구성해 보면 될 것 같습니다. :)&lt;/p&gt;</description>
      <category>FrontEnd/React</category>
      <category>Next.js</category>
      <category>Next.js 프로젝트 생성</category>
      <category>react</category>
      <category>React 프로젝트 생성</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/120</guid>
      <comments>https://firework-ham.tistory.com/120#entry120comment</comments>
      <pubDate>Tue, 18 Jul 2023 20:06:17 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] User ID 정규식 - 첫 글자 영어, 영어/숫자/특수문자 허용.</title>
      <link>https://firework-ham.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript에서 UserId를 체크하는 정규식 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 글자는 영어를 허용하며 영어/숫자/특수문자 ( . _ ) 두가지만 허용하며 최대 30글자까지 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정규식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 요구사항을 충족하는 JavaScript 정규식 패턴 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1676787981601&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/^[a-zA-Z][a-zA-Z0-9._]{0,29}$/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 정규식 패턴은 다음과 같이 구성됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;^ : 문자열의 시작을 나타내는 메타 문자&lt;/li&gt;
&lt;li&gt;[a-zA-Z] : 첫 글자는 영어 대소문자만 허용&lt;/li&gt;
&lt;li&gt;[a-zA-Z0-9._]{0,29} : 이후 글자는 영어 대소문자, 숫자, 특수문자 .(점)와 _(밑줄)만 허용하며, 글자 수는 0부터 29까지 허용&lt;/li&gt;
&lt;li&gt;$ : 문자열의 끝을 나타내는 메타 문자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&lt;span&gt; &lt;/span&gt;들어&lt;span&gt;, &lt;/span&gt;다음과&lt;span&gt; &lt;/span&gt;같이&lt;span&gt; &lt;/span&gt;사용할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676788012176&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const regex = /^[a-zA-Z][a-zA-Z0-9._]{0,29}$/;
const userid = 'Abc123._';
if (regex.test(userid)) {
  console.log('userid is valid');
} else {
  console.log('userid is invalid');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 포스팅은 ChatGpt를 활용하여 작성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;실제 코딩에 활용하는 필요한 요구사항들을 ChatGpt를 활용하는 방법을 체크하는 중입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ChatGpt 활용법</category>
      <category>JavaScript ID 정규식</category>
      <category>JavaScript 정규식</category>
      <category>자바스크립트</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/119</guid>
      <comments>https://firework-ham.tistory.com/119#entry119comment</comments>
      <pubDate>Sun, 19 Feb 2023 15:29:23 +0900</pubDate>
    </item>
    <item>
      <title>02. 리엑트 네이티브의 동작 방식 - 브릿지, 가상돔</title>
      <link>https://firework-ham.tistory.com/117</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;브릿지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;635&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnqY7W/btraQrgUqS9/tECgcWqAnud8MCB1teIpKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnqY7W/btraQrgUqS9/tECgcWqAnud8MCB1teIpKK/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://brocoders.com/blog/react-native-interview-questions/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnqY7W/btraQrgUqS9/tECgcWqAnud8MCB1teIpKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnqY7W%2FbtraQrgUqS9%2FtECgcWqAnud8MCB1teIpKK%2Fimg.png&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;635&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://brocoders.com/blog/react-native-interview-questions/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 리엑트 네이티브는 JavaScript로 개발하는데 어떻게 Native 코드로 동작할까? 이 궁금증을 해소하기 위해서는 브릿지의 개념을 알아야 합니다. 그리고 그 브릿지와 동작하는 Thread 개념을 이해해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 브릿지는 JavaScript 코드를 이용해 네이티브 계층과 통신하는 역할을 합니다. 브릿지는 JavaScript 스레드 정보를 받아 네이티브에 전달합니다. JavasScript 스레드는 JavaScript 코드가 실행되는 장소이며 보통 리엑트 코드로 구성되어 있습니다. 네이티브를 담당하는 Main 스레드가 있고 레이아웃을 계산하는 데 사용하는 백그라운드 스레드인 Shadow 스레드가 있습니다. 또한, 네이티브 모듈이 있는데 각 모듈에 자체 스레드가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Main Thread &amp;amp; Shadow Thread&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- UI Thread라고 불리기도 하며 네이티브 안드로이드와 IOS UI 랜더링에 사용됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 예를 들면 안드로이드에서는 measure/layout/draw 작업을 할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Native Modules Thread&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 네이티브 API를 사용할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 각 모듈마다 스레드를 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JS Thread&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 애플리케이션의 JavaScript 코드, API 호출, 터치 이벤트 등이 실행되는 스레드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 네이티브 뷰에 대한 업데이트는 일괄 처리되고 JS 스레드의 각 이벤트 루프 끝에서 네이티브 측으로 전송됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 성능 유지를 위해 랜더링 시간에 맞춰 업데이트 신호를 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - ios 경우 60 frame을 위해 16.67ms 마다 신호를 보내기 때문에 16.67ms 보다 길어지는 동작의 경우 느려 보임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가상돔&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;622&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1xp6G/btraZLYXPTS/FJkEfDkuozKKDqLd699ifK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1xp6G/btraZLYXPTS/FJkEfDkuozKKDqLd699ifK/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp; https://www.oreilly.com/library/view/learning-react-native/9781491929049/ch02.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1xp6G/btraZLYXPTS/FJkEfDkuozKKDqLd699ifK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1xp6G%2FbtraZLYXPTS%2FFJkEfDkuozKKDqLd699ifK%2Fimg.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;622&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp; https://www.oreilly.com/library/view/learning-react-native/9781491929049/ch02.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;리엑트 네이티브의 동작 방식을 이해하려면 데이터가 변할 경우 자동으로 화면을 다시 그리는 리엑트의 가상 DOM 개념을 이해해야 합니다. DOM은 우리가 바라보는 화면이라고 이해하면 됩니다. 화면에 표시되는 DOM이 있는데 React에서는 이 DOM을 바로 업데이트하지 않고 화면에 보이지 않는 가상 DOM을 만들어 실제 DOM과 비교하는 역할로 관리하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그림에서 보는 것 같이 가상돔이 생성되고 만약, 데이터가 변경되었을 때 우선 가상 돔에 업데이트하게 되고 이를 실제 DOM과 비교하여 차이점을 계산한 뒤에 차이점에 대한 부분을 전달하여 실제 돔에 반영합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이때, 가상 돔이 변경될 때마다 변경 사항을 전달하지 않고 일정 시간 동안 계산 한 뒤 한 번에 보내게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리엑트 네이티브 동작 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 앱이 실행되면 Main 스레드가 실행되고 JS bundles를 로딩합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. JS 번들 로딩이 완료되면 Main 스레드는 JS 스레드로 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;JS 스레드가 무거운 작업을 진행하더라도 Main 스레드는 문제가 발생하지 않기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. React가 랜더링을 시작할 때 Reconciler가 &quot;dffing&quot;을 시작하고 새로운 가상 돔(Virtual Dom)을 생성한 뒤 변경사항을 다른 스레드 (Shadow Thread)로 전달합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Shadow Thread가 layout을 계산 한 뒤 layout의 parameter / object를 Main Thread로 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Main Thread는 shadow thread가 보낸 레이아웃을 화면에 렌더링 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[참고 자료]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://brocoders.com/blog/react-native-interview-questions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brocoders.com/blog/react-native-interview-questions/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.codementor.io/@saketkumar95/how-react-native-works-mhjo4k6f3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.codementor.io/@saketkumar95/how-react-native-works-mhjo4k6f3&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coupa.ng/b4uSiC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;처음 배우는 리액트 네이티브&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&quot;이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>리엑트 네이티브 가상돔</category>
      <category>리엑트 네이티브 브릿지</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/117</guid>
      <comments>https://firework-ham.tistory.com/117#entry117comment</comments>
      <pubDate>Sat, 31 Jul 2021 17:40:09 +0900</pubDate>
    </item>
    <item>
      <title>01. 리액트 네이티브란?</title>
      <link>https://firework-ham.tistory.com/116</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리액트 네이티브 란?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;424&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czaefQ/btraSXTKSw0/jQ776sgMg4NOJmoGyTCe40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czaefQ/btraSXTKSw0/jQ776sgMg4NOJmoGyTCe40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czaefQ/btraSXTKSw0/jQ776sgMg4NOJmoGyTCe40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczaefQ%2FbtraSXTKSw0%2FjQ776sgMg4NOJmoGyTCe40%2Fimg.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;424&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;리액트 네이티브는 2015년 페이스북이 공개한 오픈소스 프로젝트로 리엑트에 기반을 두고 제작되었습니다. 리액트와 달리 IOS, Android에서 동작하는 네이티브 모바일 애플리케이션을 만드는 자바스크립트 프레임워크로 시작하였고 최근에는 Windows, Mac, Web까지 확장하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 2018년에는 React Native의 Github의 모든 레파지토리에서 두 번째로 많은 contributors를 기록했습니다. 현재는 Microsoft, Expo, Callstack, Infinite Red 그리고 Software Mansion 등 다양한 기업과 개인의 기부로 지원받고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native : &lt;a href=&quot;https://reactnative.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://reactnative.dev/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native Windows + macOS : &lt;a href=&quot;https://microsoft.github.io/react-native-windows/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://microsoft.github.io/react-native-windows/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native for Web : &lt;a href=&quot;https://necolas.github.io/react-native-web/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://necolas.github.io/react-native-web/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외 : &lt;a href=&quot;https://reactnative.dev/docs/out-of-tree-platforms&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://reactnative.dev/docs/out-of-tree-platforms&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;392&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnhfOC/btraQqvnKcX/AhCK8ygpmPKhFKf6pPpZq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnhfOC/btraQqvnKcX/AhCK8ygpmPKhFKf6pPpZq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnhfOC/btraQqvnKcX/AhCK8ygpmPKhFKf6pPpZq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnhfOC%2FbtraQqvnKcX%2FAhCK8ygpmPKhFKf6pPpZq1%2Fimg.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;392&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 페이스북, 인스타그램, 핀터레스트, 월마트, 에어비앤비, 우버이츠, 테슬라 등 다양한 기업에서 리액트 네이티브를 선택하여 앱을 개발하고 있고 페이스북은 자사의 모든 앱을 React Native로 전환하고 있습니다. 또한 수천 개의 앱이 리액트 네이티브로 제작되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native Showcase : &lt;a href=&quot;https://reactnative.dev/showcase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://reactnative.dev/showcase&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리액트 네이티브의 장단점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 하나의 언어 JavaScript로 많은 플랫폼을 지원.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 리액트 네이티브의 가장 큰 장점이라고 말 할 수 있는 하나의 언어(JavaScript)로 멀티 플랫폼을 지원한다는 것입니다. 앞서 정리한 것처럼 Android, IOS를 시작으로 Web, Windows, Mac까지 지원하고 있습니다. 그리고 리액트 네이티브는 JavsScript와 TypeScript를 지원하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;579&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J1T3j/btraQqvnXss/dVlTmOeyzwITiZqVRP8Ab0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J1T3j/btraQqvnXss/dVlTmOeyzwITiZqVRP8Ab0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J1T3j/btraQqvnXss/dVlTmOeyzwITiZqVRP8Ab0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ1T3j%2FbtraQqvnXss%2FdVlTmOeyzwITiZqVRP8Ab0%2Fimg.png&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;579&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; JavaScript는 Github 기준으로 가장 많이 PR이 발생하는 언어로 전세계에서 가장 관심이 많은 언어라고 할 수 있습니다. 또한, 몇 년 전부터 Front End 개발 언어에서 서버인 Node.js 까지 확장되었고 Native App까지 확장되어 하나의 언어로 모든 분야를 개발할 수 있는 언어로 관심을 받고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;최근에는 자바스크립트의 확장된 언어인 TypeScript도 주목 받으면서 그 관심은 더욱 커지고 있고 GitHub 기준으로 두 개의 언어를 합치면 26%가 넘어 1/4 이상의 PR이 발생할 수 있다고 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;결국 ReactNative의 장점은 여러 분야로 확장하고 있는 JavaScript 언어를 기반으로 다양한 플랫폼을 개발 할개발할 수 있으며 이 언어를 개발할 수 있는 개발자도 점점 많아지고 있다는 점을 꼽을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Fast Refresh&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;366&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfkoAt/btraWSKVPNT/UjRpt90xEnIOvPfYIYeK7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfkoAt/btraWSKVPNT/UjRpt90xEnIOvPfYIYeK7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfkoAt/btraWSKVPNT/UjRpt90xEnIOvPfYIYeK7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfkoAt%2FbtraWSKVPNT%2FUjRpt90xEnIOvPfYIYeK7k%2Fimg.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;366&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;리액트 네이티브는 JavaScript의 장점을 살린 저장하는 즉시 변경사항을 확인할 수 있는&lt;b&gt; Fast Refresh&lt;/b&gt; 기능을 제공 합니다.&amp;nbsp;&amp;nbsp;일반적으로 앱을 만들 때 &quot;수정 &amp;gt; 새로 고침&quot; 또는 &quot;수정 &amp;gt; 컴파일 &amp;gt; 새로고침&quot;을 통해 반영된 기능을 확인합니다. 리액트 네이티브의 경우에는 이러한 작업들이 생략되어 반영돼 코드를 수정된 즉시 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이러한 장점은 개발 하는 시간을 줄여주고 생산성을 증대하여 빠른 개발이 가능하게 해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 플랫폼 간에 동일한 사용자 경험 및 개발 기간 단축&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;763&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/86BAH/btraP9z7wvR/Aw9rjeBpkAlK1wze2nGpS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/86BAH/btraP9z7wvR/Aw9rjeBpkAlK1wze2nGpS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/86BAH/btraP9z7wvR/Aw9rjeBpkAlK1wze2nGpS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F86BAH%2FbtraP9z7wvR%2FAw9rjeBpkAlK1wze2nGpS1%2Fimg.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;763&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;리액트 네이티브로 앱을 개발하게 되면 IOS, Android 간 동일한 사용자 경험을 줄 수 있습니다. 기본 제공되는 UI 구성 요소를 각각의 유사한 네이티브 요소로 변환하기 때문에 사용자는 동일한 사용자 경험을 각각의 플랫폼에서 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;846&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJIfLo/btraNJvt0Lz/kJq2vdSTzb1QMEFf3aOW11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJIfLo/btraNJvt0Lz/kJq2vdSTzb1QMEFf3aOW11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJIfLo/btraNJvt0Lz/kJq2vdSTzb1QMEFf3aOW11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJIfLo%2FbtraNJvt0Lz%2FkJq2vdSTzb1QMEFf3aOW11%2Fimg.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;846&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React의 UI 패러다임 및 JavaScript로 네이티브 앱을 개발하기 때문에 기존 앱 개발팀이 훨씬 빠르게 두 플랫폼을 작업 가능하게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 네이티브의 새로운 기능을 빠르게 적용 불가.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q8SKh/btraXVHt6bL/pJqiIEEoTJUSmCdg3Kgpc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q8SKh/btraXVHt6bL/pJqiIEEoTJUSmCdg3Kgpc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q8SKh/btraXVHt6bL/pJqiIEEoTJUSmCdg3Kgpc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq8SKh%2FbtraXVHt6bL%2FpJqiIEEoTJUSmCdg3Kgpc1%2Fimg.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Android, IOS의 Version이 변경되면서 생성되는 신규 API를 빠르게 지원하지 못합니다. 예를 들면 IOS 14 버전이 출시되면 새로운 API가 발표됩니다. 이 기능을 사용하기 위해서는 리엑트 네이티브 버전 업이 되길 기다리거나 커뮤니티에서 관련 API를 지원하는 라이브러리가 올라와야 사용이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;물론, Bridge를 통해 Native Api를 연계하는 라이브러리를 개발할 수 있는 방법은 있지만 Native에 기능을 알아야 가능하기에 학습이 필요한 부분입니다. JavaScript부터 접한 개발자라면 지원하기를 기다리는 것이 빠를 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;결론적으로, 신규 네이티브 API를 지원하려면 시간이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Android, IOS에 대한 이해도 필요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;415&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvYGJ/btraWUa0y9z/Etww3Ey1td9NYOkUkSjdRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvYGJ/btraWUa0y9z/Etww3Ey1td9NYOkUkSjdRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvYGJ/btraWUa0y9z/Etww3Ey1td9NYOkUkSjdRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvYGJ%2FbtraWUa0y9z%2FEtww3Ey1td9NYOkUkSjdRk%2Fimg.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;415&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;리액트 네이티브가 멀티 플랫폼을 지원하는 것이 장점이자 단점이 될 수 있습니다. UI는 ReactNative로 개발할 수 있겠지만 기능들을 개발하다 보면 플랫폼마다 차이점이 있고 문제 파악 시 어느 정도 Native에 대한 이해도가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Android 앱을 릴리즈 빌드할 때는 Android 빌드에 대한 개념이 필요하면 IOS 앱을 빌드 할때는 IOS 빌드에 대한 개념이 필요합니다. 간단한 앱을 개발할 때는 큰 문제가 되지 않지만 각각의 Native 기능들을 살린 기능들이 들어가게 되면 빌드 실패가 발생하는데 이때마다 Debug시에는 해당 Native에 대한 학습이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reactnative.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://reactnative.dev/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>리엑트 네이티브</category>
      <category>리엑트 네이티브란</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/116</guid>
      <comments>https://firework-ham.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 31 Jul 2021 11:30:16 +0900</pubDate>
    </item>
    <item>
      <title>[react-native] iOS 빌드 실패 - library not found for -lreact-native-slider</title>
      <link>https://firework-ham.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-native에서 ios 빌드를 하다보면 library not found 이슈가 발생하곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확히 어떤 이유인지 알 수 없어 라이브러리만 계속 재 설치 해보기도 하고 pod을 모두 삭제 했다가 설치 해보기도 하지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 꼬인 설정은 이런 방법으로 해결 안되더라구요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;80&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.31.41.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vmFuF/btq8RUFgkBU/MDGfZwosPVjHW2RL10gK10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vmFuF/btq8RUFgkBU/MDGfZwosPVjHW2RL10gK10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vmFuF/btq8RUFgkBU/MDGfZwosPVjHW2RL10gK10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvmFuF%2Fbtq8RUFgkBU%2FMDGfZwosPVjHW2RL10gK10%2Fimg.png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;80&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.31.41.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 제가 library not found 관련하여 해결한 방법을 정리 해봅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;library not found 해결 방법.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 react-native-slider 라이브러리를 설치하고 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn &amp;amp;&amp;amp; pod install 를 한 뒤 build를 진행했는데 계속해서 위 문제가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러가지로 검색 해보다가 pod install 할때 발생한 wanring 메세지가 눈에 들어왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;81&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.31.18.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S5iKM/btq8RTTRCq2/i5kBAlowoXYElyOv9nB0K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S5iKM/btq8RTTRCq2/i5kBAlowoXYElyOv9nB0K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S5iKM/btq8RTTRCq2/i5kBAlowoXYElyOv9nB0K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS5iKM%2Fbtq8RTTRCq2%2Fi5kBAlowoXYElyOv9nB0K0%2Fimg.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;81&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.31.18.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 메세지를 읽어보니 LIBRARY_SEARCH_PATHS 관련하여 정상적으로 라이브러리 설치 경로가 주입되지 않은 것 같다는 판단.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 xcode로 ios 폴더 프로젝트를 열고 라이브러리 경로를 찾아봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 [Project] &amp;gt; Pods &amp;gt; Prods-[ProejctName].debug.xsconfig 파일을 열어 LIBRARY_SEARCH_PATHS에 있는 라이브러리의 경로를 확인합니다. 그리고&amp;nbsp;위에 메세지로 표시된 또는 설치한 라이브러리의 경로를 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;178&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.38.20.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnoK0U/btq8QyCDDBj/eT1GLbXx2BBQ9oUEtXsdK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnoK0U/btq8QyCDDBj/eT1GLbXx2BBQ9oUEtXsdK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnoK0U/btq8QyCDDBj/eT1GLbXx2BBQ9oUEtXsdK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnoK0U%2Fbtq8QyCDDBj%2FeT1GLbXx2BBQ9oUEtXsdK0%2Fimg.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;178&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.38.20.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 같은 경우는 react-native-slider 라이브러리를 찾지 못해 발생한다고 위에 빌드 실패시 확인했기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경로만 확인하여 우선 복사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 프로젝트의 xcodeproj 파일을 열고 Build Settings 메뉴을 오픈 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Build Settings &amp;gt; Library Search Paths를 찾습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;744&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.41.52.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUzQdc/btq8RUFgrya/GnpVpPEY37zdCUf1PqK5A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUzQdc/btq8RUFgrya/GnpVpPEY37zdCUf1PqK5A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUzQdc/btq8RUFgrya/GnpVpPEY37zdCUf1PqK5A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUzQdc%2Fbtq8RUFgrya%2FGnpVpPEY37zdCUf1PqK5A1%2Fimg.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;744&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.41.52.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Debug에서 build/Debug 하얀색 글씨로 된 부분을 더블 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 복사한 라이브러리 경로를 추가해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1112&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.43.18.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDxLI/btq8W7XagZW/hY0VuR2olK6hFKbgGEoukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDxLI/btq8W7XagZW/hY0VuR2olK6hFKbgGEoukk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDxLI/btq8W7XagZW/hY0VuR2olK6hFKbgGEoukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDxLI%2Fbtq8W7XagZW%2FhY0VuR2olK6hFKbgGEoukk%2Fimg.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1112&quot; data-filename=&quot;스크린샷 2021-07-06 오전 1.43.18.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 빌드..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 같은 경우는 이와 같은 방법으로 해결하여 빌드 성공 했습니&lt;/p&gt;</description>
      <category>React Native</category>
      <category>React-native</category>
      <category>리엑트네이티브 library not found for</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/115</guid>
      <comments>https://firework-ham.tistory.com/115#entry115comment</comments>
      <pubDate>Tue, 6 Jul 2021 01:44:38 +0900</pubDate>
    </item>
    <item>
      <title>Google Functions &amp;amp; Firestore 저장하기 1편 - Functions 프로젝트 생성 및 Deploy 하는 법.</title>
      <link>https://firework-ham.tistory.com/114</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Google Functions &amp;amp; Firestore 저장하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1편 - Functions 프로젝트 생성 및 Deploy 하는 법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Google functions를 사용하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;토이 프로젝트에서 크롤링 Firebase에 데이터를 쌓아야 하는 이유가 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 AWS의 Lamdba를 고려하여 연결하려고 했지만 Firebase console에서 Google Function를 한 번에 확인할 수 있고&amp;nbsp;같은 데이터 센터라는 이점이 있기 때문에 Google Function를 사용하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 포스팅에서는 Google Function를 활용하여 크롤링 데이터를 Firebase까지 데이터를 쌓는 방법을 정리하려고 합니다. 여러편을 통해 정리할 예정이고 1편에서는 Google Functions을 Deploy 하는 방법을 정리해볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Functions 프로젝트 만들기.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase Project가 생성되었다는 가정하에 포스팅을 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#1 firebase tools 설치하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;firebase tools를 설치하면 firebase에 필요한 기본 프로젝트를 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Goolge Functions 외에도 GCP에서 사용가능한 프로젝트 생성이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 통해 npm 전역으로 설치해주세요.&lt;/p&gt;
&lt;pre id=&quot;code_1624351505821&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g firebase-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#2 firebase 인증하기.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;firebase 프로젝트를 생성하기 위해서는 firebase 인증을 해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login 명령어를 통해 인증을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 실행하시면 브라우저를 통해 인증하는 화면으로 이동합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624351482315&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;firebase login&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#3 프로젝트 생성하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 인증을 완료하면 프로젝트를 생성할수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성할 폴더를 만든 뒤에 터미널로 접속하여 아래 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624351655630&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;firebase init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;334&quot; width=&quot;547&quot; height=&quot;201&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0wkHS/btq7RKp5n0e/rVtW8wEZK8WGPKLECB87kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0wkHS/btq7RKp5n0e/rVtW8wEZK8WGPKLECB87kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0wkHS/btq7RKp5n0e/rVtW8wEZK8WGPKLECB87kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0wkHS%2Fbtq7RKp5n0e%2FrVtW8wEZK8WGPKLECB87kK%2Fimg.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;334&quot; width=&quot;547&quot; height=&quot;201&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;304&quot; width=&quot;547&quot; height=&quot;180&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kB4rp/btq7TLvgqOc/0YEEahsAlZQuSKDrpjXE11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kB4rp/btq7TLvgqOc/0YEEahsAlZQuSKDrpjXE11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kB4rp/btq7TLvgqOc/0YEEahsAlZQuSKDrpjXE11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkB4rp%2Fbtq7TLvgqOc%2F0YEEahsAlZQuSKDrpjXE11%2Fimg.png&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;304&quot; width=&quot;547&quot; height=&quot;180&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Space bar로 Functions를 선택하고 진행합니다.&amp;nbsp;프로젝트는 기존에 있다면 기존 프로젝트를 설정하셔야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;(주의 : 요금제는 Blaze로 설정되어야 해당 Functions를 사용이 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Functions Deploy 하기.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 생성된 프로젝트를 테스트 하기 위해서 Firebase Functions에 Deploy 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 만들때 생성되었던 index.js를 아래와 같이 수정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624360287281&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const functions = require(&quot;firebase-functions&quot;);

exports.helloWorld = functions.https.onRequest((request, response) =&amp;gt; {
  functions.logger.info(&quot;Hello logs!&quot;, {structuredData: true});
  response.send(&quot;Hello from Firebase!&quot;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 수정 완료 하였다면 아래 명령어를 통해 서버에 반영합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624360312823&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;firebase deploy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 입력하면 서버로 Deploy가 시작되고 완료되면 아래와 같이 표시됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;353&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rUiqk/btq7Vy9L0DD/BJkdMlnapytnwNNgSYlZr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rUiqk/btq7Vy9L0DD/BJkdMlnapytnwNNgSYlZr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rUiqk/btq7Vy9L0DD/BJkdMlnapytnwNNgSYlZr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrUiqk%2Fbtq7Vy9L0DD%2FBJkdMlnapytnwNNgSYlZr0%2Fimg.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;353&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Google Function API 호출하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;289&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EIMQr/btq7UYOks2j/CPQigQcmh4dNUNntNLBU7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EIMQr/btq7UYOks2j/CPQigQcmh4dNUNntNLBU7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EIMQr/btq7UYOks2j/CPQigQcmh4dNUNntNLBU7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEIMQr%2Fbtq7UYOks2j%2FCPQigQcmh4dNUNntNLBU7K%2Fimg.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;289&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase Console에서 Functions 메뉴를 들어가면 Deploy 된 함수를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리거에 표시되는 API를 브라우저에 입력하면 정상 호출되는지 확인 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Function의 경우 기본 us-central1으로 설정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, Region을 이동하고 싶다면 아래와 같이 함수에 설정하여 다시 반영해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624364467250&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const functions = require(&quot;firebase-functions&quot;);

exports.helloWorld = functions.region(&quot;asia-northeast3&quot;).https.onRequest((request, response) =&amp;gt; {
  functions.logger.info(&quot;Hello logs!&quot;, {structuredData: true});
  response.send(&quot;Hello from Firebase!&quot;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;asia-northeast3&quot;는 서울 리전입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리전에 대한 리스트는 아래 링크로 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/functions/locations?hl=ko&quot;&gt;https://firebase.google.com/docs/functions/locations?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1624364549396&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Cloud Functions 위치 &amp;nbsp;|&amp;nbsp; Firebase&quot; data-og-description=&quot;Cloud Functions는 리전을 기반으로 합니다. 즉 Cloud 함수를 실행하는 인프라가 특정 리전에 있으며 해당 리전 내의 모든 영역에서 중복으로 사용할 수 있도록 Google이 관리합니다. 함수를 실행할 지&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/functions/locations?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/docs/functions/locations?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/functions/locations?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/functions/locations?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Cloud Functions 위치 &amp;nbsp;|&amp;nbsp; Firebase&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Cloud Functions는 리전을 기반으로 합니다. 즉 Cloud 함수를 실행하는 인프라가 특정 리전에 있으며 해당 리전 내의 모든 영역에서 중복으로 사용할 수 있도록 Google이 관리합니다. 함수를 실행할 지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에는 Google Function을 활용하여 Firestore에 데이터를 저장하는 방법을 정리하겠습니다.&lt;/p&gt;</description>
      <category>BackEnd/Node</category>
      <category>Firebase Functions 연동</category>
      <category>Google Function Firestore 연동하기</category>
      <category>Google Functions</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/114</guid>
      <comments>https://firework-ham.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 23 Jun 2021 12:00:01 +0900</pubDate>
    </item>
    <item>
      <title>AWS Lambda로 크롤링 데이터 Firebase에 데이터 쌓는 법 ( 로컬 테스트 ) - 2편</title>
      <link>https://firework-ham.tistory.com/113</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS&amp;nbsp;Lambda로&amp;nbsp;크롤링&amp;nbsp;데이터&amp;nbsp;Firebase에&amp;nbsp;데이터&amp;nbsp;쌓는&amp;nbsp;법&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1편 - Lambda&amp;nbsp;설정&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2편 - 로컬 테스트&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 설정은 끝났고 firebase에 데이터 쌓는 방법을 시도해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lambda에 올리기 전에 로컬에서 테스트하는 방법을 작성해보도록 할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 로컬에서 Lambda에 올릴 함수 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json에 아래와 같이 scripts를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624347758755&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;firebase-lambda&quot;,
    &quot;version&quot;: &quot;1.0.0&quot;,
    &quot;main&quot;: &quot;index.js&quot;,
    &quot;scripts&quot;: {
        &quot;locally&quot; : &quot;node -e \&quot;console.log(require('./index').handler({}));\&quot;&quot;
    },
    &quot;dependencies&quot;: {
        &quot;firebase-admin&quot;: &quot;9.6.0&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js의 handler 함수를 실행하고 결과를 출력해주는 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json에 위와 같이 입력한 뒤 로컬에서 아래와 같은 명령어를 실행하면 테스트가 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624347831386&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run locally&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Firebase에 Collection 생성 및 데이터 추가 테스트&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;469&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bacdtv/btq7UyPMYmJ/uWYACfvWpWVDpHgTrqC1A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bacdtv/btq7UyPMYmJ/uWYACfvWpWVDpHgTrqC1A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bacdtv/btq7UyPMYmJ/uWYACfvWpWVDpHgTrqC1A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbacdtv%2Fbtq7UyPMYmJ%2FuWYACfvWpWVDpHgTrqC1A0%2Fimg.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;469&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase Cloud firestore에 &quot;exchanges&quot; 컬랙션을 생성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 exchanges에 data를 추가하는 코드를 작성해보도록 할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624348008435&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const admin = require('firebase-admin')
const serviceAccount = require('./serviceAccountKey.json')

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

const db = admin.firestore()
const COLLECTION_NAME = &quot;exchanges&quot;

exports.handler = (event, context, callback) =&amp;gt; {
  
    const test_data = {
        currency : 'USD',
        price : 1000
    }

    db.collection(COLLECTION_NAME).add(test_data).then((ref) =&amp;gt; {
        console.log(ref);
    }).catch((err) =&amp;gt; {
        console.log(err);  
    })
    
    return test_data
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js에 위와 같이 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬랜션 이름은 생성하신 이름으로 대체하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 로컬에서 아래 명령어로 해당 함수를 호출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624348085922&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run locally&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;581&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8AB3/btq7P9jA2Oe/29Q9Mzov8DIT7LKpWm8tv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8AB3/btq7P9jA2Oe/29Q9Mzov8DIT7LKpWm8tv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8AB3/btq7P9jA2Oe/29Q9Mzov8DIT7LKpWm8tv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8AB3%2Fbtq7P9jA2Oe%2F29Q9Mzov8DIT7LKpWm8tv1%2Fimg.png&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;581&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 실행하고 firestore에 해당 데이터가 입력되었는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 들어왔다면 firebase에 데이터를 저장할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 index.js를 실제 활용할 함수로 만들면 되겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3편에서는 환율 정보를 가져와서 데이터를 쌓는 방법을 작성해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서 이어갈게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BackEnd/Node</category>
      <category>Lambda 로컬 테스트</category>
      <category>node 람다 로컬 테스트</category>
      <category>람다 로컬 테스트</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/113</guid>
      <comments>https://firework-ham.tistory.com/113#entry113comment</comments>
      <pubDate>Tue, 22 Jun 2021 16:52:38 +0900</pubDate>
    </item>
    <item>
      <title>AWS Lambda로 크롤링 데이터 Firebase에 데이터 쌓는 법 (Lambda 설정)- 1편</title>
      <link>https://firework-ham.tistory.com/112</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS&amp;nbsp;Lambda로&amp;nbsp;크롤링&amp;nbsp;데이터&amp;nbsp;Firebase에&amp;nbsp;데이터&amp;nbsp;쌓는&amp;nbsp;법&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1편 - Lambda&amp;nbsp;설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/113&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2편 - 로컬 테스트&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Pty8/btq7QPxHbec/OtRz1R3Lj5sL3U97XDN1V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Pty8/btq7QPxHbec/OtRz1R3Lj5sL3U97XDN1V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Pty8/btq7QPxHbec/OtRz1R3Lj5sL3U97XDN1V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Pty8%2Fbtq7QPxHbec%2FOtRz1R3Lj5sL3U97XDN1V0%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토이 프로젝트에서 클로링으로 Firebase에 데이터를 쌓아야 하는 작업이 필요 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot Batch를 사용하여 서버를 띄워서 크롤링을 할가 고민도 했었는데 그렇게 되면 항상 서버를 구동해야 하는 문제가 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용도 아끼고 필요할 때만 사용하면 어떨까 고민 했는데 AWS Lambda를 사용하면 되지 않을까 생각이 들었고 그 방법을 정리해 보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 장에서는 Lamdba를 이용하여 API를 호출하고 호출한 API에서 데이터를 정재하여 Firebase에 쌓는 방법을 정리해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;01. AWS의 Lambda는 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS의 Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행 할 수 있는 컴퓨팅 서비스 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구동 시간에 따라 요금을 지불하기 때문에 필요할 때만 사용하는 클롤링 작업에서는 가장 좋은 서비스라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;02. Firebase CloudStore 란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase의 Cloud Firestore는 Document 방식의 DB를 제공하는 클라우드 서비스 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloud Firestore는 클라이언트에서 서버 필요없이 바로 DB을 연결 할 수 있도록 SDK를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;03. Firebase와 Lambda 연결하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 두가지 서비스를 연동하여 데이터를 클로링 해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 페이지에서는 환율 정보를 1시간마다 저장하는 서비스를 개발할 예정이니 다른 서비스가 필요하다면 API와 데이터 파싱 부분만 수정하여 사용하시면 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Firebase Auth Key 발급하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트에서는 Firebase의 프로젝트를 생성하고 Cloud Firestore를 생성 했다고 가정하에 연동 방법을 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분이 준비가 되어 있지 않다면 살펴보시고 생성뒤에 따라오시면 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;651&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAGaF/btq7PMhz6Mb/PdIR8HHJKKKttj3SMeXMJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAGaF/btq7PMhz6Mb/PdIR8HHJKKKttj3SMeXMJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAGaF/btq7PMhz6Mb/PdIR8HHJKKKttj3SMeXMJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAGaF%2Fbtq7PMhz6Mb%2FPdIR8HHJKKKttj3SMeXMJ1%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;651&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 프로젝트에 들어가시면 &lt;b&gt;서비스 계정 메뉴&lt;/b&gt;를 확인 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 메뉴에 들어가서 &lt;b&gt;Firebase Admin SDK&lt;/b&gt; 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;961&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDhBYh/btq7U0Lx6b5/S4TUPEWmzB6kMn5swEIsek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDhBYh/btq7U0Lx6b5/S4TUPEWmzB6kMn5swEIsek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDhBYh/btq7U0Lx6b5/S4TUPEWmzB6kMn5swEIsek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDhBYh%2Fbtq7U0Lx6b5%2FS4TUPEWmzB6kMn5swEIsek%2Fimg.png&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;961&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 &lt;b&gt;새 비공개 키 생성&amp;nbsp;&lt;/b&gt;버튼을 크릭하여 json 파일을 다운로드 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일이 있어야 Firebase에 연동이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 이름이 길고 알아보기 힘들기에 예제에 있는 것처럼 serviceAccountKey.json으로 변경하면 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) AWS Lambda 설정 파일 생성하기.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에 Lambda에 업로드할 폴더 파일을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624342280452&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir firebase-lambda
cd firebase-lambda&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 package.json index.js 파일을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624342876446&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;name&quot;: &quot;firebase-lambda&quot;,
    &quot;version&quot;: &quot;1.0.0&quot;,
    &quot;main&quot;: &quot;index.js&quot;,
    &quot;dependencies&quot;: {
      &quot;firebase-admin&quot;: &quot;9.6.0&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Firebase 연동 함수 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 생성한 index.js에 Firebase 연동하는 함수를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(저는 firestore를 사용하는 방식을 정리합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624343769058&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const admin = require('firebase-admin')
const serviceAccount = require('serviceAccountKey.json')

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

exports.handler = (event, context, callback) =&amp;gt; {
    firebaseFirestore = admin.firestore();   
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) node_module 설치.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node를 실행하기 위한 node_module을 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json이 생성되어 있기 때문에 해당 폴더에서 아래 명령어를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, npm이 설치되어 있지 않다면 먼저 설치 해주셔야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624343835422&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더내에 node_modules 폴더가 정상적으로 생성되었는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 뒤 해당 폴더 root에서 zip 파일을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 이름은 firebase-lamdba.zip 으로 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;83&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXEajN/btq7RLhT4MD/hU7QUptY8BMX0VWpwoxKKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXEajN/btq7RLhT4MD/hU7QUptY8BMX0VWpwoxKKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXEajN/btq7RLhT4MD/hU7QUptY8BMX0VWpwoxKKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXEajN%2Fbtq7RLhT4MD%2FhU7QUptY8BMX0VWpwoxKKk%2Fimg.png&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;83&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) AWS Lamdba&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;738&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhYrB/btq7Raa7dJM/6yUtagRDWtEvkR843sq6N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhYrB/btq7Raa7dJM/6yUtagRDWtEvkR843sq6N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhYrB/btq7Raa7dJM/6yUtagRDWtEvkR843sq6N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhYrB%2Fbtq7Raa7dJM%2F6yUtagRDWtEvkR843sq6N0%2Fimg.png&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;738&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서 Lambda를 검색하여 메뉴로 들어갑니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;398&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FRc0J/btq7SLPt0ux/7KSW8iww6ySD1Tqp4zUP6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FRc0J/btq7SLPt0ux/7KSW8iww6ySD1Tqp4zUP6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FRc0J/btq7SLPt0ux/7KSW8iww6ySD1Tqp4zUP6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFRc0J%2Fbtq7SLPt0ux%2F7KSW8iww6ySD1Tqp4zUP6K%2Fimg.png&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;398&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lambda 메뉴에서 &lt;b&gt;함수 생성&lt;/b&gt;을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1279&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyhqP/btq7Uy3bdO9/VI9UU8zcw6BSGH7Svm5sik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyhqP/btq7Uy3bdO9/VI9UU8zcw6BSGH7Svm5sik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyhqP/btq7Uy3bdO9/VI9UU8zcw6BSGH7Svm5sik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkyhqP%2Fbtq7Uy3bdO9%2FVI9UU8zcw6BSGH7Svm5sik%2Fimg.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1279&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 이름을 작성하시고 런타임 부분에서는 원하는 버전을 선택하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 node.js 12.x를 선택했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 뒤 함수 생성을 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1631&quot; data-origin-height=&quot;526&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Mbye/btq7PMWkZWY/K7zAYpAUUfABsutl0vdmp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Mbye/btq7PMWkZWY/K7zAYpAUUfABsutl0vdmp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Mbye/btq7PMWkZWY/K7zAYpAUUfABsutl0vdmp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Mbye%2Fbtq7PMWkZWY%2FK7zAYpAUUfABsutl0vdmp1%2Fimg.png&quot; data-origin-width=&quot;1631&quot; data-origin-height=&quot;526&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드 버튼을 클릭하여 .zip file을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 생성한 zip 파일을 업로드 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;685&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kq1Bp/btq7Qv7Ga0M/fXoejJPn9xieFAt36WJz81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kq1Bp/btq7Qv7Ga0M/fXoejJPn9xieFAt36WJz81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kq1Bp/btq7Qv7Ga0M/fXoejJPn9xieFAt36WJz81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKq1Bp%2Fbtq7Qv7Ga0M%2FfXoejJPn9xieFAt36WJz81%2Fimg.png&quot; data-origin-width=&quot;1637&quot; data-origin-height=&quot;685&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 탭 메뉴를 선택하고 &lt;b&gt;테스트&lt;/b&gt; 버튼을 클릭해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 정상적으로 호출 되는지 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;167&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHcgQ1/btq7RaoGc8r/k1JIXT0hODrJTpr8Al5v5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHcgQ1/btq7RaoGc8r/k1JIXT0hODrJTpr8Al5v5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHcgQ1/btq7RaoGc8r/k1JIXT0hODrJTpr8Al5v5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHcgQ1%2Fbtq7RaoGc8r%2Fk1JIXT0hODrJTpr8Al5v5k%2Fimg.png&quot; data-origin-width=&quot;1618&quot; data-origin-height=&quot;167&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 해당 함수가 정상적으로 호출 되면 성공 결과를 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기본적인 설정 및 함수를 생성을 끝냈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 함수에서 firebase에 데이터를 넣는 방법에 대해서 다음 포스팅에서 이어가도록 할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://levelup.gitconnected.com/how-to-access-firebase-from-aws-lambda-f7f494dd435a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://levelup.gitconnected.com/how-to-access-firebase-from-aws-lambda-f7f494dd435a&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1624339225328&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;How to Access Firebase From AWS Lambda&quot; data-og-description=&quot;A Comprehensive Step by Step Guide&quot; data-og-host=&quot;levelup.gitconnected.com&quot; data-og-source-url=&quot;https://levelup.gitconnected.com/how-to-access-firebase-from-aws-lambda-f7f494dd435a&quot; data-og-url=&quot;https://levelup.gitconnected.com/how-to-access-firebase-from-aws-lambda-f7f494dd435a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RLClg/hyKD7fCWf6/XJCUOUzIkg3aEZwssum2bK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/dC4g1Y/hyKD7mn7IZ/dj698zkTIYqKmO4iOfGhrk/img.png?width=60&amp;amp;height=29&amp;amp;face=0_0_60_29,https://scrap.kakaocdn.net/dn/cX35xg/hyKEbI5wmC/tMsiPevjhM0gy0lcwpZQN1/img.png?width=60&amp;amp;height=23&amp;amp;face=0_0_60_23&quot;&gt;&lt;a href=&quot;https://levelup.gitconnected.com/how-to-access-firebase-from-aws-lambda-f7f494dd435a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://levelup.gitconnected.com/how-to-access-firebase-from-aws-lambda-f7f494dd435a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RLClg/hyKD7fCWf6/XJCUOUzIkg3aEZwssum2bK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/dC4g1Y/hyKD7mn7IZ/dj698zkTIYqKmO4iOfGhrk/img.png?width=60&amp;amp;height=29&amp;amp;face=0_0_60_29,https://scrap.kakaocdn.net/dn/cX35xg/hyKEbI5wmC/tMsiPevjhM0gy0lcwpZQN1/img.png?width=60&amp;amp;height=23&amp;amp;face=0_0_60_23');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How to Access Firebase From AWS Lambda&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Comprehensive Step by Step Guide&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;levelup.gitconnected.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BackEnd/Node</category>
      <category>AWS Lambda</category>
      <category>Firebase AWS 사용법</category>
      <category>Lambda Firebase</category>
      <category>람다 Firebase 연동 방법</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/112</guid>
      <comments>https://firework-ham.tistory.com/112#entry112comment</comments>
      <pubDate>Tue, 22 Jun 2021 15:58:29 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Firebase 연동 방법.</title>
      <link>https://firework-ham.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅은 Spring Boot에 Firebase 연동하는 방법을 정리하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase SDK를 활용한 기본 연동 그리고 컬렉션에 있는 정보를 가져오는 방법을 간단히 정리 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;00. 디펜던시 등록&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/com.google.firebase/firebase-admin&quot;&gt;https://mvnrepository.com/artifact/com.google.firebase/firebase-admin&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gradle&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648978497232&quot; class=&quot;groovy&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation group: 'com.google.firebase', name: 'firebase-admin', version: '8.1.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;maven&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648978497232&quot; class=&quot;xml&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.firebase&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;firebase-admin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;8.1.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;01. Firebase 연동 준비하기.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에 프로젝트 생성 및 Cloud Firestore은 사전에 생성하셔야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHRlK/btq7HDqdzEY/u2kWcMMykTEMA9o32ZRckK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHRlK/btq7HDqdzEY/u2kWcMMykTEMA9o32ZRckK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHRlK/btq7HDqdzEY/u2kWcMMykTEMA9o32ZRckK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHRlK%2Fbtq7HDqdzEY%2Fu2kWcMMykTEMA9o32ZRckK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1490&quot; height=&quot;758&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase 프로젝트 설정에서 &quot;새 비공개 키 생성&quot;으로 서비스 연결한 json을 다운로드 받아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 설정 &amp;gt; 서비스 계정 메뉴로 들어 갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deecle/btq7L0StQ4o/v0THKdiLdK0FVp2GRxpEy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deecle/btq7L0StQ4o/v0THKdiLdK0FVp2GRxpEy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deecle/btq7L0StQ4o/v0THKdiLdK0FVp2GRxpEy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdeecle%2Fbtq7L0StQ4o%2Fv0THKdiLdK0FVp2GRxpEy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;308&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 Admin SDK 구성에서 &quot;새 비공개 키 생성&quot;을 클릭 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firestore 연결 정보가 담긴 json을 다운로드 받게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일 이름을 알아 볼 수 있는 이름으로 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bisDkP/btq7JSf3NtT/DEDMvRNv1sAue0kOKqt3i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bisDkP/btq7JSf3NtT/DEDMvRNv1sAue0kOKqt3i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bisDkP/btq7JSf3NtT/DEDMvRNv1sAue0kOKqt3i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbisDkP%2Fbtq7JSf3NtT%2FDEDMvRNv1sAue0kOKqt3i1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;96&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 serviceAccountKey.json으로 변경 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 파일을 spring boot 프로젝트에서 resources 폴더로 복사 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Spring Boot 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQko29/btq7DTtLGcv/Vu7kH9YTYKLfUBwlgFV2I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQko29/btq7DTtLGcv/Vu7kH9YTYKLfUBwlgFV2I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQko29/btq7DTtLGcv/Vu7kH9YTYKLfUBwlgFV2I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQko29%2Fbtq7DTtLGcv%2FVu7kH9YTYKLfUBwlgFV2I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;183&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot에 기본 설정 파일을 생성 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 config 패키지에 FirebaseConfig.class 를 생성 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FirebaseConfig 파일은 아래와 같이 작성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1624187139324&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class FirebaseConfig {

    @PostConstruct
    public void init(){
        try{
            FileInputStream serviceAccount = 
            	new FileInputStream(&quot;src/main/resources/serviceAccountKey.json&quot;);
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .build();
            FirebaseApp.initializeApp(options);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 간단한 API 연동 해보기.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에는 Users 컬랙션을 생성 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Spring Boot에는 User Entity를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Getter, Setter는 lombok을 이용하여 어노테이션을 설정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase 컬랙션&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfJEHu/btq7EFaJ7c3/KfJlnajUW0bbt0Jc92MCrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfJEHu/btq7EFaJ7c3/KfJlnajUW0bbt0Jc92MCrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfJEHu/btq7EFaJ7c3/KfJlnajUW0bbt0Jc92MCrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfJEHu%2Fbtq7EFaJ7c3%2FKfJlnajUW0bbt0Jc92MCrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;400&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User.class&lt;/p&gt;
&lt;pre id=&quot;code_1624187839500&quot; class=&quot;java&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@NoArgsConstructor
@Getter
@Setter
@ToString
public class User {

    private String id;
    private String name;
    private String email;

    // firebase timestamp type
    private Date create_dt;
    private Date update_dt;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 간단한 User에 있는 정보를 가져오는 API를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserController.class&lt;/p&gt;
&lt;pre id=&quot;code_1624188021213&quot; class=&quot;java&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequiredArgsConstructor
@RequestMapping(&quot;/exam/svc/v1&quot;)
public class UserController {

    private final UserService userService;

    @GetMapping(&quot;/users&quot;)
    public ResponseEntity&amp;lt;Object&amp;gt;  getUsers() throws ExecutionException, InterruptedException {
        List&amp;lt;User&amp;gt; list = userService.getUsers();
        return ResponseEntity.ok().body(list);

    }


}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserService.class &amp;amp; UserServiceImpl.class&lt;/p&gt;
&lt;pre id=&quot;code_1624190421724&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface UserService {

    List&amp;lt;User&amp;gt; getUsers() throws ExecutionException, InterruptedException;

}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1624188070602&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private final UserDao userDao;

    @Override
    public List&amp;lt;User&amp;gt; getUsers() throws ExecutionException, InterruptedException {
        return userDao.getUsers();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserDao.class&lt;/p&gt;
&lt;pre id=&quot;code_1624188223334&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
@Slf4j
public class UserDao {

    public static final String COLLECTION_NAME = &quot;users&quot;;

    public List&amp;lt;User&amp;gt; getUsers() throws ExecutionException, InterruptedException {
        List&amp;lt;User&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
        Firestore db = FirestoreClient.getFirestore();
        ApiFuture&amp;lt;QuerySnapshot&amp;gt; future = db.collection(COLLECTION_NAME).get();
        List&amp;lt;QueryDocumentSnapshot&amp;gt; documents = future.get().getDocuments();
        for (QueryDocumentSnapshot document : documents) {
            list.add(document.toObject(User.class));
        }
        return list;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬랙션에 신규 데이터를 입력하고 API를 호출하여 데이터가 정상적으로 조회 되는지 확인 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/exam/svc/v1/users&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624190173779&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  [{
    &quot;id&quot;: &quot;19dfsafadfkasfjlkZFDAdz&quot;,
    &quot;name&quot;: &quot;홍길동&quot;,
    &quot;email&quot;: &quot;test@gmail.com&quot;,
    &quot;create_dt&quot;: &quot;2021-06-16T10:30:23.662+00:00&quot;,
    &quot;update_dt&quot;: &quot;2021-06-16T10:30:23.662+00:00&quot;
  }]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 연동은 위와 같이 확인하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 CRUD를 구현해보도록 할게요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에서 계속..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/admin/setup?authuser=0#java&quot;&gt;서버에 Firebase Admin SDK 추가 &amp;nbsp;|&amp;nbsp; Firebase Documentation (google.com)&lt;/a&gt;&lt;/p&gt;</description>
      <category>BackEnd/SpringBoot</category>
      <category>Firebase</category>
      <category>Firebase Admin SDK</category>
      <category>Spring Boot</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/111</guid>
      <comments>https://firework-ham.tistory.com/111#entry111comment</comments>
      <pubDate>Sun, 20 Jun 2021 20:59:15 +0900</pubDate>
    </item>
    <item>
      <title>[DB] ORM, SQL Mapper 이란?</title>
      <link>https://firework-ham.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ORM과 SQL Mapper의 개념을 정리하기전 영속성(Persistence)에 대해 먼저 정리해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;영속성(Persistence)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속성이란 프로그램이 종료되어도 데이터가 사라지지 않는 특성을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속성을 갖지 못한 데이터는 메모리에만 존재하기 때문에 프로그램이 종료되면 사라지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영속성은 파일 시스템, 관계형 데이터베이스 또는 객체 데이터 베이스를 활용하여 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 영속성을 가지기 위해 Spring에서 사용하는 방법은 3가지가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. JDBC (Java)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Spring JDBC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Persistence Framework&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Persistence Framework&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Persistence Framework는 JDBC를 사용하기 위한 복잡하고 번거로운 작업 없이 간다한 작업으로 데이터베이스와 연동할 수 있게 제공하는 프레임워크이다. 이 프레임워크를 사용하면 시스템을 빠르고 안정적으로 개발이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Persistence Framework에는 ORM과 SQL Mapper가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM : JPA, Hibernate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Mapper : Mybatis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ORM (Object-Relation Mapping)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체와 관계형 데이터베이스의 데이터를 자동으로 매핑시켜주는 프레임워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정된 객체 간의 관계를 바탕으로 자동으로 SQL를 생성하여 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL를 직접 작성할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 객체 지향적인 코드로 직관적인 비지니스 로직을 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. DBMS 종속성이 줄어들고 종류에 관계 없이 빠르게 적용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3. 쿼리에 집중할 필요 없이 빠르게 개발이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4. 재사용 유지 보수 편리성이 증가 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 초기 적용에 러닝 커브가 어느 정도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. 프로젝트의 복잡성이 커질경우 난이도가 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3. 잘못 적용할 경우 속도 저하가 발생 할 수 있다. &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4. 복잡한 SQL의 사용하지 못할 수 도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SQL Mapper&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체와 관계형 데이터베이스의 데이터를 개발자가 작성한 SQL로 매핑시켜주는 프레임워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 SQL을 직접 작성해야 하며 SQL문을 실행하고 얻은 데이터를 객체로 매핑시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. SQL을 작성 할 줄 안다면 수월하게 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. 세부적인 SQL 변경시 편리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. DBMS에 따라 SQL 문법이 다르기에 DBMS에 종속적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. 개발시 SQL를 작성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3. DBMS 변경시 SQL문의 재사용이 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4. 2개 이상의 DBMS 지원시 유지 보수가 어렵다.&lt;/p&gt;</description>
      <category>BackEnd</category>
      <category>ORM 이란</category>
      <category>sql mapper</category>
      <category>영속성 이란</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/110</guid>
      <comments>https://firework-ham.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 12 Apr 2021 22:38:29 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] Firebase Cloud Firestore 연결하기 #2 - Firestore 저장하기.</title>
      <link>https://firework-ham.tistory.com/109</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번 편을 보시기 전에 ReactNative 프로젝트에 Firebase 설정이 되어 있지않다면 아래 포스팅을 확인하고 오세요.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://firework-ham.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020/11/19 - [React Native] - [React Native] Firebase Cloud Firestore 연결하기 #1 - 프로젝트 설정&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1605944566147&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[React Native] Firebase Cloude Firestore 연결하기 #1 - 프로젝트 설정&quot; data-og-description=&quot;React Native에서 사용할 DB를 찾아보다 Firebase를 붙여 사용해 봐야 겠다는 생각이 들었습니다. 오프라인 일때는 로컬 DB를 사용하고 온라인이 되면 서버 DB와 동기화 되며 다양한 기능들을 사용할 수&quot; data-og-host=&quot;firework-ham.tistory.com&quot; data-og-source-url=&quot;https://firework-ham.tistory.com/108&quot; data-og-url=&quot;https://firework-ham.tistory.com/108&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buXREW/hyIjymcJWU/g2tWFVbzD1UCAg3ojJNql0/img.png?width=800&amp;amp;height=367&amp;amp;face=0_0_800_367,https://scrap.kakaocdn.net/dn/cCVk4k/hyIjyNfYtE/FqxlgCY5Jv70eef1r7lINK/img.png?width=800&amp;amp;height=367&amp;amp;face=0_0_800_367,https://scrap.kakaocdn.net/dn/yyVSw/hyIjGEwbq6/ItH1UekMR8XI4S3aiX6jl0/img.png?width=1441&amp;amp;height=755&amp;amp;face=0_0_1441_755&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firework-ham.tistory.com/108&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buXREW/hyIjymcJWU/g2tWFVbzD1UCAg3ojJNql0/img.png?width=800&amp;amp;height=367&amp;amp;face=0_0_800_367,https://scrap.kakaocdn.net/dn/cCVk4k/hyIjyNfYtE/FqxlgCY5Jv70eef1r7lINK/img.png?width=800&amp;amp;height=367&amp;amp;face=0_0_800_367,https://scrap.kakaocdn.net/dn/yyVSw/hyIjGEwbq6/ItH1UekMR8XI4S3aiX6jl0/img.png?width=1441&amp;amp;height=755&amp;amp;face=0_0_1441_755');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[React Native] Firebase Cloude Firestore 연결하기 #1 - 프로젝트 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;React Native에서 사용할 DB를 찾아보다 Firebase를 붙여 사용해 봐야 겠다는 생각이 들었습니다. 오프라인 일때는 로컬 DB를 사용하고 온라인이 되면 서버 DB와 동기화 되며 다양한 기능들을 사용할 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;firework-ham.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;프로젝트 설정이 끝났으니 Cloud Firestore을 설정해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;01. Firestore 설치&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로젝트에 아래 명령어로 Firestore를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605944623779&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Install &amp;amp; setup the app module
yarn add @react-native-firebase/app

# Install the firestore module
yarn add @react-native-firebase/firestore

# If you're developing your app using iOS, run this command
cd ios/ &amp;amp;&amp;amp; pod install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치가 완료되면 빌드를 진행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605945032974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;react-native run-android&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약, 아래와 같은 빌드 Error가 발생한다면 아래를 진행합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;step.1&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;/android/app/build.gradle 파일에 아래 설정을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605945091487&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;android {
    defaultConfig {
        // ...
        multiDexEnabled true // &amp;lt;-- ADD THIS in the defaultConfig section
    }
    // ...
}

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'  // &amp;lt;-- ADD THIS DEPENDENCY
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;step.2&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;android/app/src/main/java/.../MainApplication.java 파일에 아래와 같이 변경합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605945121030&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ... all your other imports here
import androidx.multidex.MultiDexApplication; // &amp;lt;-- ADD THIS IMPORT


// Your class definition needs `extends MultiDexApplication` like below
public class MainApplication extends MultiDexApplication implements ReactApplication {&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 다음 다시 빌드를 시작합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605945135853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;react-native run-android&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;정상으로 프로젝트가 실행되었다면 완료.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;02. 간단한 Todo 만들어보기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간단한 Todo를 만들어보면서 DB가 어떻게 동작되는지 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;root 폴더에 Todos.js를 아래와 같이 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605968068977&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, {useState} from 'react';
import { ScrollView, Text } from 'react-native';

import firestore from '@react-native-firebase/firestore';
import { Appbar, TextInput, Button } from 'react-native-paper';


function Todos(){
    const [ todo, setTodo ] = useState('');
    const ref = firestore().collection('todos');

    return (
      &amp;lt;&amp;gt;
        &amp;lt;Appbar&amp;gt;
          &amp;lt;Appbar.Content title={'TODOs List'} /&amp;gt;
        &amp;lt;/Appbar&amp;gt;
        &amp;lt;ScrollView style={{flex: 1}}&amp;gt;
          &amp;lt;Text&amp;gt;List of TODOs!&amp;lt;/Text&amp;gt;
        &amp;lt;/ScrollView&amp;gt;
        &amp;lt;TextInput label={'New Todo'} value={todo} onChangeText={setTodo} /&amp;gt;
        &amp;lt;Button onPress={() =&amp;gt; {}}&amp;gt;Add TODO&amp;lt;/Button&amp;gt;
      &amp;lt;/&amp;gt;
    );
}

export default Todos;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 index.js를 아래와 같이 수정합니다.&lt;/p&gt;
&lt;p&gt;만약, index.android.js 와 index.ios.js로 나눠져 있다면 원하는 플랫폼에 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605968105356&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { AppRegistry } from 'react-native';
import Todos from './Todos';

AppRegistry.registerComponent('MyAppName', () =&amp;gt; Todos);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;324&quot; height=&quot;NaN&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vlZXT/btqNVB0CJU1/YskanWqbdbOUpX35zjFiIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vlZXT/btqNVB0CJU1/YskanWqbdbOUpX35zjFiIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vlZXT/btqNVB0CJU1/YskanWqbdbOUpX35zjFiIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvlZXT%2FbtqNVB0CJU1%2FYskanWqbdbOUpX35zjFiIK%2Fimg.png&quot; width=&quot;324&quot; height=&quot;NaN&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그러면 기본적인 화면이 빌드되면서 Todos List가 보입니다.&lt;/p&gt;
&lt;p&gt;현재까지는 DB에 Collection만 생성하고 아무런 동작을 하지 않습니다.&lt;/p&gt;
&lt;p&gt;이제 DB와 연동하는 동작을 넣어보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Todos.js에 아래와 같이 함수를 추가하고 버튼에 클릭시 함수가 호출하도록 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605968661448&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Todos() {
  const [ todo, setTodo ] = useState('');
  const ref = firestore().collection('todos');
  // ...
  async function addTodo() {
    await ref.add({
      title: todo,
      complete: false,
    });
    setTodo('');
  }
  // ...
   return (
    &amp;lt;&amp;gt;
      {/* ... */}
      &amp;lt;Button onPress={() =&amp;gt; addTodo()}&amp;gt;Add TODO&amp;lt;/Button&amp;gt;
    &amp;lt;/&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 동작은 FireStore에 저장하는 동작입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이렇게 되면 Firestore에 데이터가 전송되게 됩니다.&lt;/p&gt;
&lt;p&gt;Firebase Console에서 Cloud Firestore 선택하시면 ADD TODO를 눌렀을대 전송된 Todo List를 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;만약, 보이지 않는 다면 Database 생성 버튼을 눌러 우선 Database를 생성해주세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Database가 생성되고 동작을 다시 진행하면 콘솔화면에서 아래와 같은 화면을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADiZ2/btqNXFAKZG2/5iiikVGOjpI9O6LAZNK3r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADiZ2/btqNXFAKZG2/5iiikVGOjpI9O6LAZNK3r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADiZ2/btqNXFAKZG2/5iiikVGOjpI9O6LAZNK3r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADiZ2%2FbtqNXFAKZG2%2F5iiikVGOjpI9O6LAZNK3r0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같은 화면이 나오면 정상 동작입니다.&lt;/p&gt;
&lt;p&gt;이제 다음편에서는 저장된 Todo List를 가져와 보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>Cloud Firestore 저장하기</category>
      <category>Firebase Console</category>
      <category>ReactNative Cloud Firestore 사용 방법</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/109</guid>
      <comments>https://firework-ham.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 21 Nov 2020 23:53:05 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] Firebase Cloud Firestore 연결하기 #1 - 프로젝트 설정</title>
      <link>https://firework-ham.tistory.com/108</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;React Native에서 사용할 DB를 찾아보다 Firebase를 붙여 사용해 봐야 겠다는 생각이 들었습니다.&lt;/p&gt;
&lt;p&gt;오프라인 일때는 로컬 DB를 사용하고 온라인이 되면 서버 DB와 동기화 되며 다양한 기능들을 사용할 수 있을 것이라 기대 했기 때문이죠.&amp;nbsp;천천히 React Native에 Firebase를 붙여보는 과정을 정리해보려고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;00. Firebase 프로젝트 생성하기.&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;구글 콘솔에 접속해서 프로젝트를 먼저 생성해 주어야 합니다.&lt;/p&gt;
&lt;p&gt;Firebase의 기능을 사용하려면 프로젝트가 먼저 있어야 하거든요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.firebase.google.com/&quot;&gt;https://console.firebase.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Firebase 콘솔에 접속하여 프로젝트를 추가 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SrXHg/btqNMf4wA03/khrsxfKx4Cz5D7jZzr5tOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SrXHg/btqNMf4wA03/khrsxfKx4Cz5D7jZzr5tOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SrXHg/btqNMf4wA03/khrsxfKx4Cz5D7jZzr5tOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSrXHg%2FbtqNMf4wA03%2FkhrsxfKx4Cz5D7jZzr5tOk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;안내에 따라 프로젝트를 생성하면 되니 따로 정리하지는 않겠습니다.&lt;/p&gt;
&lt;p&gt;프로젝트를 생성하고 해당 프로젝트로 이동하빈다.&lt;/p&gt;
&lt;p&gt;아래와 같은 화면으로 이동한다면 프로젝트 생성 완료.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmctdL/btqNOKCJ4JE/O3SWGE8LBxXVXnn7Lv9MwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmctdL/btqNOKCJ4JE/O3SWGE8LBxXVXnn7Lv9MwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmctdL/btqNOKCJ4JE/O3SWGE8LBxXVXnn7Lv9MwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmctdL%2FbtqNOKCJ4JE%2FO3SWGE8LBxXVXnn7Lv9MwK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Firebase에서 Cloud Firestore를 제공하는데 데이터베이스라고 이해하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두가지 종류로 제공하는데 아래 사이트에 자세히 설명되어 있으니 한번 확인해보시면 좋습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://firebase.google.com/docs/database/rtdb-vs-firestore?authuser=2&quot;&gt;https://firebase.google.com/docs/database/rtdb-vs-firestore?authuser=2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpRiAu/btqNOIx4NqA/XQRkRCtCcYIAxnEvusbKX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpRiAu/btqNOIx4NqA/XQRkRCtCcYIAxnEvusbKX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpRiAu/btqNOIx4NqA/XQRkRCtCcYIAxnEvusbKX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpRiAu%2FbtqNOIx4NqA%2FXQRkRCtCcYIAxnEvusbKX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;가격 정책도 꼭 한번 살펴보세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://firebase.google.com/pricing?authuser=2&quot;&gt;https://firebase.google.com/pricing?authuser=2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1605796085828&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Firebase Pricing&quot; data-og-description=&quot;무료로 Firebase를 시작하고 전 세계 수백만 명의 사용자로 확장하며 사용한 만큼만 비용을 지불합니다.&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/pricing?authuser=2&quot; data-og-url=&quot;https://firebase.google.com/pricing?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MCgWd/hyIibSmYMO/A9dgLxP2CjFRnBy8fmIVrk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/brpLQ1/hyIiicSgvZ/UW6rnImKkb4V8VcJZxTpY1/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/4w7QT/hyIjDsWKIt/llefxzLZDabjO7Xao67t4k/img.png?width=695&amp;amp;height=368&amp;amp;face=0_0_695_368&quot;&gt;&lt;a href=&quot;https://firebase.google.com/pricing?authuser=2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/pricing?authuser=2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MCgWd/hyIibSmYMO/A9dgLxP2CjFRnBy8fmIVrk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/brpLQ1/hyIiicSgvZ/UW6rnImKkb4V8VcJZxTpY1/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/4w7QT/hyIjDsWKIt/llefxzLZDabjO7Xao67t4k/img.png?width=695&amp;amp;height=368&amp;amp;face=0_0_695_368');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Firebase Pricing&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;무료로 Firebase를 시작하고 전 세계 수백만 명의 사용자로 확장하며 사용한 만큼만 비용을 지불합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;01. Firebase 설치&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 Cloude Firestore를 붙여보기 위해 가장 먼저할 것은 Firebase를 프로젝트에 설치하는 것이죠.&lt;/p&gt;
&lt;p&gt;npm과 yarn 중 원하는 방법으로 설치 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1605794312675&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Using npm
npm install --save @react-native-firebase/app

# Using Yarn
yarn add @react-native-firebase/app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;02. Firebase Project 연결하기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 ReactNative Project에 Firebase Project를 연결해주어야 합니다.&lt;/p&gt;
&lt;p&gt;우선 Android에 연결시키는 방법으로 진행하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Firebase Console 초기 화면에 &quot;앱에 Firebase를 추가하여 시작하기&quot;아래 Android를 선택하여 추가 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lemrc/btqNVA8iQPh/f6kRuY29S4GayMjDwwKrvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lemrc/btqNVA8iQPh/f6kRuY29S4GayMjDwwKrvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lemrc/btqNVA8iQPh/f6kRuY29S4GayMjDwwKrvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flemrc%2FbtqNVA8iQPh%2Ff6kRuY29S4GayMjDwwKrvK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Firebase 홈페이지에 있는 순서대로 진행하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주의 할점은 Android Pakage name&quot;은 local project와 동일해야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;/android/app/src/main/AndroidManifest.xml 파일에 manifest tag의 package 이름을 확인하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그리고 google-services.json을 다운로드 받은 뒤 android/app 폴더에 복사해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb5Iky/btqNWhN2fIU/wOOll5xbeSS5Km9Ivaa1S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb5Iky/btqNWhN2fIU/wOOll5xbeSS5Km9Ivaa1S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb5Iky/btqNWhN2fIU/wOOll5xbeSS5Km9Ivaa1S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb5Iky%2FbtqNWhN2fIU%2FwOOll5xbeSS5Km9Ivaa1S1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이제 google-services 플러그인을 프로젝트에 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;/android/build.gradle 파일에 아래를 추가해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605943074826&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;buildscript {
  dependencies {
    // ... other dependencies
    classpath 'com.google.gms:google-services:4.3.3'
    // Add me --- /\
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;/android/app/build.gradle 에도 아래를 추가해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1605943129107&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // &amp;lt;- Add this line&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 설정 완료 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설정이 완료되었다면 프로젝트를 재실행합니다.&lt;/p&gt;
&lt;p&gt;재실행하면 ReactNative 0.60+ 버전에서는 autolinking을 지원하여 빌드만 다시 진행하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1605944219021&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Android apps
npx react-native run-android

# iOS apps
cd ios/
pod install --repo-update
cd ..
npx react-native run-ios&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;빌드하여 프로젝트다 다시 정상 실행된다면 설정 완료.&lt;/p&gt;
&lt;p&gt;다음편에서 Cloud Firestore를 연결을 이어가 보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고 사이트&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rnfirebase.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rnfirebase.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://firebase.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;firebase.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>reactnative</category>
      <category>ReactNative Cloud FireStore</category>
      <category>ReactNative Firebase Cloud FireStore</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/108</guid>
      <comments>https://firework-ham.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 19 Nov 2020 23:26:00 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot JPA] JPA를 사용하기 위해 꼭 필요한 Dialect(방언)에 대해 알아보자.</title>
      <link>https://firework-ham.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/bbspqM/btqFwiGHGFz/YAL191Q4BVpoqmPKXUU1zK/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbspqM/btqFwiGHGFz/YAL191Q4BVpoqmPKXUU1zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbspqM/btqFwiGHGFz/YAL191Q4BVpoqmPKXUU1zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbspqM/btqFwiGHGFz/YAL191Q4BVpoqmPKXUU1zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbspqM%2FbtqFwiGHGFz%2FYAL191Q4BVpoqmPKXUU1zK%2Fimg.png&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/bbspqM/btqFwiGHGFz/YAL191Q4BVpoqmPKXUU1zK/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot; style=&quot;text-align: justify;&quot;&gt;Dialect(방언)이란?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;Dialect 방언에 대해 알아보기전 기본 SQL을 이해 해야 합니다.&lt;br&gt;&lt;br&gt;SQL은 표준 ANCI SQL이 있고 DBMS Vendor(공급업체)인 MS-SQL, Oracle, My-SQL, Postgre SQL에서 제공하는 SQL이 존재합니다. MS-SQL은 T-SQL, Oracle은 PL/SQL이 대표적입니다. &lt;br&gt;ANSI SQL은 모든 DBMS에서 공통적으로 사용이 가능한 표준 SQL이지만 DBMS에서 만든 SQL은 자신들만의 독자적인 기능을 추가 하기 위해 만든 것으로 사용하는 DBMS에서만 사용이 가능합니다.&lt;br&gt;&lt;br&gt;이해를 돕기 위해 예를 들면 MYSQL에서는 ID 값을 증가 시키기 위해 Auto Increment를 사용할 수 있지만 Oracle에서는 이 기능을 제공하지 않고 Sequence를 사용하여 기능을 제공합니다. 동일한 기능을 제공하지만 서로 다르게 제공하는 것이죠. 이는 같은 DBMS라도 버전에 따라 달라질 수 있습니다.&lt;/p&gt;&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br&gt;Dialect (방언)&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;JPA는 기본적으로 어플리케이션에서 직접 JDBC 레벨의 SQL을 작성하지 않고 JPA가 직접 SQL을 작성하고 실행합니다. 그런데 DBMS 종류마다 사용하는 SQL이 다르다는 것을 우리는 앞에서 알아봤습니다. JPA가 해당 DBMS에 맞춰 SQL을 생성해야하는데 어떤 종류인지 알지 못한다면 문제가 발생 할 수 있습니다. &lt;br&gt;그래서 JPA에 어떤 DBMS를 사용하는 알려주는 방법이 방언을 설정하는 방법입니다. JPA에 Dialect를 설정할 수 있는 추상화 방언 클래스를 제공하고 설정된 방언으로 각 DBMS에 맞는 구현체를 제공합니다.&lt;br&gt;&lt;br&gt;그래서 만약, MariaDB로 개발을 진행하면 Dialect에 MariaDB로 설정해 놓다가 어플리케이션을 설치할때 DBMS가 Oracle 이라면 Dialect을 Oralce로 설정하면 문제 없이 어플리케이션을 구동 할 수 있습니다.&lt;br&gt;&lt;br&gt;MariaDB 10.3 버전 사용시&lt;/p&gt;&lt;pre data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;database-platform: org.hibernate.dialect.MariaDB103Dialect&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;Oracle 11g 버전 사용시&lt;/p&gt;&lt;pre data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;database-platform: org.hibernate.dialect.Oracle10gDialect&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot; style=&quot;text-align: justify;&quot;&gt;하이버네이트 Dialect 설정과 종류&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;Spring Boot에서 Dialect를 설정은 아래와 같이 할 수 있습니다.&lt;/p&gt;&lt;pre data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;spring:
  jpa:
    hibernate:
    database-platform: org.hibernate.dialect.MariaDB103Dialect&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot의 Dialect를 설정하기 위해서 hibernate 버전을 먼저 확인하는 것이 필요합니다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot의 버전마다 사용하는 hibernate 버전이 다르기 때문에 아래와 같이 확인하세요.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;Spring-Boot 2.1 버전에서는 hibernate 5.3.X 버전을 사용합니다.&lt;br&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/appendix-dependency-versions.html&quot; target=&quot;_blank&quot;&gt;https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/appendix-dependency-versions.html&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Appendix&amp;nbsp;F.&amp;nbsp;Dependency versions&quot; data-og-description=&quot;Appendix&amp;nbsp;F.&amp;nbsp;Dependency versions The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. When you declare a dependency on &quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/appendix-dependency-versions.html&quot; data-og-url=&quot;https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/appendix-dependency-versions.html&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/appendix-dependency-versions.html&quot; target=&quot;_blank&quot; data-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/appendix-dependency-versions.html&quot;&gt;&lt;div class=&quot;og-image&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Appendix&amp;nbsp;F.&amp;nbsp;Dependency versions&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Appendix&amp;nbsp;F.&amp;nbsp;Dependency versions The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. When you declare a dependency on &lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;docs.spring.io&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;Spring-Boot 2.2 버전부터는 hibernate 5.4.6.Final을 사용합니다.&lt;br&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/appendix-dependency-versions.html&quot; target=&quot;_blank&quot;&gt;https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/appendix-dependency-versions.html&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Dependency versions&quot; data-og-description=&quot;The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. When you declare a dependency on one of these artifacts without dec&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/appendix-dependency-versions.html&quot; data-og-url=&quot;https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/appendix-dependency-versions.html&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/appendix-dependency-versions.html&quot; target=&quot;_blank&quot; data-source-url=&quot;https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/appendix-dependency-versions.html&quot;&gt;&lt;div class=&quot;og-image&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Dependency versions&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. When you declare a dependency on one of these artifacts without dec&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;docs.spring.io&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;Spring-Boot 2.1을 사용한다면 방언은 아래를 참고하시면 됩니다.&lt;br&gt;&lt;a href=&quot;https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html&quot; target=&quot;_blank&quot;&gt;https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;org.hibernate.dialect (Hibernate JavaDocs)&quot; data-og-description=&quot;Enum Summary&amp;nbsp; Enum Description Database List all supported relational database systems. ResultColumnReferenceStrategy Defines how we need to reference columns in the group-by, having, and order-by clauses. Package org.hibernate.dialect Description This pa&quot; data-og-host=&quot;docs.jboss.org&quot; data-og-source-url=&quot;https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html&quot; data-og-url=&quot;https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html&quot;&gt;&lt;a href=&quot;https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html&quot; target=&quot;_blank&quot; data-source-url=&quot;https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html&quot;&gt;&lt;div class=&quot;og-image&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;org.hibernate.dialect (Hibernate JavaDocs)&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Enum Summary&amp;nbsp; Enum Description Database List all supported relational database systems. ResultColumnReferenceStrategy Defines how we need to reference columns in the group-by, having, and order-by clauses. Package org.hibernate.dialect Description This pa&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;docs.jboss.org&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;Spring-Boot 2.2을 사용하신다면 아래를 참고하시면 됩니다.&lt;br&gt;&lt;a href=&quot;https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/dialect/package-summary.html&quot; target=&quot;_blank&quot;&gt;https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/dialect/package-summary.html&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;org.hibernate.dialect (Hibernate JavaDocs)&quot; data-og-description=&quot;Enum Summary&amp;nbsp; Enum Description Database List all supported relational database systems. ResultColumnReferenceStrategy Defines how we need to reference columns in the group-by, having, and order-by clauses. Package org.hibernate.dialect Description This pa&quot; data-og-host=&quot;docs.jboss.org&quot; data-og-source-url=&quot;https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/dialect/package-summary.html&quot; data-og-url=&quot;https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/dialect/package-summary.html&quot;&gt;&lt;a href=&quot;https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/dialect/package-summary.html&quot; target=&quot;_blank&quot; data-source-url=&quot;https://docs.jboss.org/hibernate/orm/5.4/javadocs/org/hibernate/dialect/package-summary.html&quot;&gt;&lt;div class=&quot;og-image&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;org.hibernate.dialect (Hibernate JavaDocs)&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Enum Summary&amp;nbsp; Enum Description Database List all supported relational database systems. ResultColumnReferenceStrategy Defines how we need to reference columns in the group-by, having, and order-by clauses. Package org.hibernate.dialect Description This pa&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;docs.jboss.org&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;TIP : Oracle 11g의 경우에는 Oracle 10g를 사용하면 됩니다.&lt;/p&gt;</description>
      <category>BackEnd/SpringBoot</category>
      <category>JPA 방언 설정</category>
      <category>JPA 방언 종류</category>
      <category>스프링 부터 JPA 방언</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/106</guid>
      <comments>https://firework-ham.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 9 Jul 2020 12:01:19 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Window Docker mariadb 설치하기.</title>
      <link>https://firework-ham.tistory.com/105</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d17GBq/btqE9Jy3r38/3ioQedsKu86m55BWVs21PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d17GBq/btqE9Jy3r38/3ioQedsKu86m55BWVs21PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d17GBq/btqE9Jy3r38/3ioQedsKu86m55BWVs21PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd17GBq%2FbtqE9Jy3r38%2F3ioQedsKu86m55BWVs21PK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개발할때 필요한 DB를 도커로 설치하는 방법을 정리 하겠습니다.&lt;/p&gt;
&lt;p&gt;회사나 개인 컴퓨터에서 사용하면 상당히 유용합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선 준비 사항 윈도우 도커를 설치해야 합니다.&lt;/p&gt;
&lt;p&gt;이 부분은 미리 준비 하셨다고 생각하고 진행 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Pull MariaDB Image&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mariaDB를 아래 명령어를 실행하여 Pull 받습니다.&lt;/p&gt;
&lt;p&gt;버전을 명시하지 않았기 때문에 latest로 다운 받습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593162894330&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull mariadb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5JQ9g/btqFaDyjWKf/bGXH7fKqgMHnvA8VAgnfa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5JQ9g/btqFaDyjWKf/bGXH7fKqgMHnvA8VAgnfa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5JQ9g/btqFaDyjWKf/bGXH7fKqgMHnvA8VAgnfa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5JQ9g%2FbtqFaDyjWKf%2FbGXH7fKqgMHnvA8VAgnfa0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;pull이 완료 되었으면 아래 명령어로 있는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593162938597&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker image ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/smJWc/btqFbjZYVDO/H9rGN7sQKF1HLnd9kZqVi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/smJWc/btqFbjZYVDO/H9rGN7sQKF1HLnd9kZqVi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/smJWc/btqFbjZYVDO/H9rGN7sQKF1HLnd9kZqVi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsmJWc%2FbtqFbjZYVDO%2FH9rGN7sQKF1HLnd9kZqVi1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. MariaDB 실행하기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다운 받은 도커 이미지 기반으로 아래 명령어를 실행하여 도커 컨테이너를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163077017&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name mariadb -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mariadb mariadb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;--name&lt;/span&gt; : 컨테이너 이름&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;-d&lt;/span&gt; : 데몬 실행&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;-p&lt;/span&gt; : 로컬 port와 컨테이너 포트 연결&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;-e&lt;/span&gt; : 환경 변수 설정&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행이 완료되었으면 아래 명령어로 실행중인 도커를 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163184271&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;혹시 mariadb 컨테이너에 커멘드 창에 접속 하고 싶으시다면 아래 명령어로 들어갈 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163260872&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it mariadb /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. MariaDB 접속하기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mariadb에 접속하고 싶으시다면 아래 명령어를 통해 접속 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163308579&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설정한 비밀번호를 입력하여 접속 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 한글이 깨질 수 있기 때문에 인코딩을 변경하겠습니다.&lt;/p&gt;
&lt;p&gt;우선 vim 또는 nano를 설치하여 변경 할 수 있는 환경을 만들겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 명령어는 nano와 vim을 모두 설치하는 하지만 원하시는 편집기만 설치하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163456360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get update &amp;amp;&amp;amp; apt-get install nano vim&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 conf 설정을 추가해줍니다.&lt;/p&gt;
&lt;p&gt;/etc/mysql/my.cnf 에 아래 내용을 추가해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163859510&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 exit 명령어로 도커를 빠져나와 재실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593163906805&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker restart mariadb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 컨테이너에 접속하고 mysql에 접속하여 아래 명령어로 문자열 인코딩이 변경되었는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593164008745&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it mariadb /bin/bash

mysql -u root -p

status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byisY6/btqFaMPoNyQ/3u03M9UFBgfEkyL1giPIMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byisY6/btqFaMPoNyQ/3u03M9UFBgfEkyL1giPIMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byisY6/btqFaMPoNyQ/3u03M9UFBgfEkyL1giPIMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyisY6%2FbtqFaMPoNyQ%2F3u03M9UFBgfEkyL1giPIMK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 클라이언트 접속해보기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저는 무료 툴인 DBeaver로 접속을 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dbeaver.io/download/&quot;&gt;https://dbeaver.io/download/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1593164078580&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download | DBeaver Community&quot; data-og-description=&quot;Download Tested and verified for MS Windows 7/8/10, Linux and Mac OS X. DBeaver requires Java 1.8 or higher. Windows and MacOS installers include OpenJDK 11 bundle. If you are on Mac OS X and you do NOT use PKG installer then you will need to setup Java. N&quot; data-og-host=&quot;dbeaver.io&quot; data-og-source-url=&quot;https://dbeaver.io/download/&quot; data-og-url=&quot;https://dbeaver.io/download/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dbeaver.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbeaver.io/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Download | DBeaver Community&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Download Tested and verified for MS Windows 7/8/10, Linux and Mac OS X. DBeaver requires Java 1.8 or higher. Windows and MacOS installers include OpenJDK 11 bundle. If you are on Mac OS X and you do NOT use PKG installer then you will need to setup Java. N&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;dbeaver.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;DBeaver를 설치한 뒤 실행하여 연결아이콘을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J2yDp/btqE9KxZQj8/NjEP2c56ZkarPPkWVkwMHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J2yDp/btqE9KxZQj8/NjEP2c56ZkarPPkWVkwMHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J2yDp/btqE9KxZQj8/NjEP2c56ZkarPPkWVkwMHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ2yDp%2FbtqE9KxZQj8%2FNjEP2c56ZkarPPkWVkwMHK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;SQL -&amp;gt; MaraiDB를 선택합니다.&lt;/p&gt;
&lt;p&gt;기본 세팅이 우리가 생성하 mariadb와 동일하기 때문에 root 계정에 비밀번호만 입력한뒤 아래 Test Connection을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpKcF4/btqE9uCbDjX/ryR6Ck73SpQwCbTDoy3Zt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpKcF4/btqE9uCbDjX/ryR6Ck73SpQwCbTDoy3Zt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpKcF4/btqE9uCbDjX/ryR6Ck73SpQwCbTDoy3Zt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpKcF4%2FbtqE9uCbDjX%2FryR6Ck73SpQwCbTDoy3Zt0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;아래와 같이 Connected가 뜨면 성공.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDULFw/btqE9uWsFpk/Noyux21Jmw3tGfolqGKOOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDULFw/btqE9uWsFpk/Noyux21Jmw3tGfolqGKOOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDULFw/btqE9uWsFpk/Noyux21Jmw3tGfolqGKOOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDULFw%2FbtqE9uWsFpk%2FNoyux21Jmw3tGfolqGKOOK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;완료 버튼을 누른 뒤 생성된 Connection을 더블클릭하여 접속합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VgwhE/btqE9vug29c/DZFbF8MFqt80qQrSitHTX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VgwhE/btqE9vug29c/DZFbF8MFqt80qQrSitHTX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VgwhE/btqE9vug29c/DZFbF8MFqt80qQrSitHTX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVgwhE%2FbtqE9vug29c%2FDZFbF8MFqt80qQrSitHTX1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;완료!&lt;/p&gt;</description>
      <category>Docker</category>
      <category>docker mriadb</category>
      <category>docker 마리아</category>
      <category>docker 마리아 db</category>
      <category>도커 mariadb</category>
      <category>도커 마리아</category>
      <category>윈도우 도커 마리아</category>
      <category>윈도우 도커 마리아DB</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/105</guid>
      <comments>https://firework-ham.tistory.com/105#entry105comment</comments>
      <pubDate>Fri, 26 Jun 2020 18:39:18 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] MacOS 개발 환경 설정 하기.</title>
      <link>https://firework-ham.tistory.com/104</link>
      <description>&lt;p&gt;맥에서 React Native를 개발하기 위한 개발 환경 설정하는 방법을 정리해 보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 홈브루 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;홈브루는 맥에서 패키지를 설치하고 관리하는 맥용 패키지 관리자 입니다. 다양한 패키지를 간단하게 명령어로 설치 가능합니다.&lt;/p&gt;
&lt;p&gt;홈브루를 만약에 설치 하셨다면 아래 명령어로 설치 되었는지 다시 한번 확인 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;버전 확인&lt;/p&gt;
&lt;pre id=&quot;code_1592182430360&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew --version&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1592182447791&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Homebrew 2.2.11
Homebrew/homebrew-core (git revision b237e6; last commit 2020-04-05)
Homebrew/homebrew-cask (git revision a5780; last commit 2020-04-05)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 버전 표시가 되지 않거 알수 없는 명령어로 표시 된다면 아래 사이트에서 홈브루를 설치 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;홈브루 설치 사이트 : &lt;a href=&quot;https://brew.sh/&quot;&gt;https://brew.sh/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1592182509428&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Homebrew&quot; data-og-description=&quot;The Missing Package Manager for macOS (or Linux).&quot; data-og-host=&quot;brew.sh&quot; data-og-source-url=&quot;https://brew.sh/&quot; data-og-url=&quot;https://brew.sh/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PMdq3/hyGqkvHW45/ZOeOsurOYukDq73Ba7DfT1/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560,https://scrap.kakaocdn.net/dn/DBDpo/hyGqdi2r0u/YEZzB5zR8kLEdTKyfKbKwK/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560,https://scrap.kakaocdn.net/dn/ck443t/hyGoNsLD6T/BpkCW1hx2v5aBPQkKZyny1/img.png?width=298&amp;amp;height=298&amp;amp;face=0_0_298_298&quot;&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brew.sh/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PMdq3/hyGqkvHW45/ZOeOsurOYukDq73Ba7DfT1/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560,https://scrap.kakaocdn.net/dn/DBDpo/hyGqdi2r0u/YEZzB5zR8kLEdTKyfKbKwK/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560,https://scrap.kakaocdn.net/dn/ck443t/hyGoNsLD6T/BpkCW1hx2v5aBPQkKZyny1/img.png?width=298&amp;amp;height=298&amp;amp;face=0_0_298_298');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Homebrew&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;The Missing Package Manager for macOS (or Linux).&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;brew.sh&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;간단하게 brew 홈페이지에 있는 Install 명령어를 실행하면 설치 가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치 명령어&lt;/p&gt;
&lt;pre id=&quot;code_1592182582673&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치 완료 후 위에서 했던 버전 확인을 진행합니다.&lt;/p&gt;
&lt;p&gt;자 이제 React Native를 개발하기 위한 패키지들을 설치 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. node 설치 하기.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;node는 brew로 설치 가능하지만 저는 nvm을 활용하는 것을 추천 드립니다.&lt;/p&gt;
&lt;p&gt;nvm을 통해 설치하는 방법은 아래 포스팅을 확인하세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://firework-ham.tistory.com/20&quot;&gt;https://firework-ham.tistory.com/20&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592232912153&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[node] nvm 설치하기, node, npm 설치하기.&quot; data-og-description=&quot;nvm 활용하여 node, npm 설치하는 방법을 알아 보겠습니다. 1 설치 sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash 2 설정 설치 후 nvm 명령어가 실행이 되지 않는..&quot; data-og-host=&quot;firework-ham.tistory.com&quot; data-og-source-url=&quot;https://firework-ham.tistory.com/20&quot; data-og-url=&quot;https://firework-ham.tistory.com/20&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4j6Iv/hyGqloSJ52/pDKkDDwRlMOhkdb1jlNwNk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bNT4XL/hyGrxVwn5H/AQNpgcRi10k5bpvavjvRgK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firework-ham.tistory.com/20&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4j6Iv/hyGqloSJ52/pDKkDDwRlMOhkdb1jlNwNk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bNT4XL/hyGrxVwn5H/AQNpgcRi10k5bpvavjvRgK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[node] nvm 설치하기, node, npm 설치하기.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;nvm 활용하여 node, npm 설치하는 방법을 알아 보겠습니다. 1 설치 sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash 2 설정 설치 후 nvm 명령어가 실행이 되지 않는..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;firework-ham.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;brew로 설치하고 싶으시다면 다음을 따라하여 설치하세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;터미널을 열고 아래 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592232948063&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install node&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;node, npm 버전을 확인하여 설치 되었는지 확인합니다,&lt;/p&gt;
&lt;pre id=&quot;code_1592232966826&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node --version

npm --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 왓치맨 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 왓치맨은 특정 디렉토리나 파일을 감시해 변경이 발생하면 특정 동작을 실행하도록 합니다. react-native의 소스코드 변경이 발생하면 재로딩 하기 위해서 왓치맨을 사용합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 아래 명령어를 통해 왓치맨을 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592233076201&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install watchman&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;왓치맨도 버전을 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592234617687&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;watchman --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 리엑트 네이티브 CLI 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 리엑트 네이티브로 개발할 때 공식 홈페이지에서는 expo cli와 react-natvie cli 두 가지 방법을 제시합니다. 저는 react-native cli를 추천하는데 그 이유는 expo의 단점이 명확하기 때문입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; expo cli를 사용하면 필요 하지 않는 라이브러리를 설치해야 하기 때문에 프로젝트 사이즈가 커지고 expo cli에서 제공하지 않는 부분은 사용하기 어렵거나 사용하려고 해도 여러 과정을 거쳐야 하기 때문에 어렵습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서 리엑트 네이티브 CLI를 많은 분들이 추천하고 저도 추천합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 명령어를 통해 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592235114570&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g react-native-cli&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. Xcode 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Xcode는 iOS 앱을 만들기 위해 필수적으로 설치 해야 합니다.&lt;/p&gt;
&lt;p&gt;App Store에서 Xcode를 검색하여 설치 합니다. 용량이 크기 때문에 설치하는데 시간이 어느 정도 걸리니 참고하세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Xcode가 설치 되었다면 Command Line Tool을 설치해야 합니다.&lt;/p&gt;
&lt;p&gt;Xcode를 설치 하고 아래 경로를 따라 가서 Command Line Tool이 설정 되었는지 확인 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Xcode &amp;gt; Preferences &amp;gt; Locations &amp;gt; Command Line Tools&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. 코코아포드 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코코아포드는 iOS 개발에 사용되는 의존성 관리자 입니다. 개발에 필요한 라이브러리를 설치하거나 관리할 때 사용되므로 아래 명령어를 실행하여 설치 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1592235665363&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo gem install cocoapods&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;설치가 완료 되면 아래 명령어로 설치를 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592235681011&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pod --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7. Java 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 자바가 설치 되어 있지 않다면 아래 명령어를 활용하여 자바를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592235725521&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew tap AdoptOpenJDK/openjdk&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1592235746013&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew cask install adoptopenjdk8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자바 버전을 확인하여 설치를 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592235786434&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약, Unkown command : cask 가 뜬다면 아래 명령어를 활용하여 설치하자.&lt;/p&gt;
&lt;pre id=&quot;code_1616926414851&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install --cask adoptopenjdk8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8. 안드로이드 스튜디오&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약, iOS와 안드로이드를 모두 테스트 해보고 싶다면 안드로이드 스튜디오를 설치 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.android.com/studio&quot;&gt;https://developer.android.com/studio&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592236021256&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download Android Studio and SDK tools &amp;nbsp;|&amp;nbsp; Android 스튜디오&quot; data-og-description=&quot;&amp;lt;!-- hide description --&amp;gt;&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/studio&quot; data-og-url=&quot;https://developer.android.com/studio?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RzP9z/hyGrxnGVwG/b2IjENBdDniUtFKCH4kgQ0/img.jpg?width=1352&amp;amp;height=818&amp;amp;face=0_0_1352_818,https://scrap.kakaocdn.net/dn/BYnSk/hyGrzMzX0I/7PCpxlfCzrmTI9KD9w6xtk/img.png?width=725&amp;amp;height=578&amp;amp;face=0_0_725_578,https://scrap.kakaocdn.net/dn/zvIoB/hyGrqIR70z/KmPUks0L33KJqEn74FcWX0/img.png?width=725&amp;amp;height=556&amp;amp;face=0_0_725_556&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/studio&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RzP9z/hyGrxnGVwG/b2IjENBdDniUtFKCH4kgQ0/img.jpg?width=1352&amp;amp;height=818&amp;amp;face=0_0_1352_818,https://scrap.kakaocdn.net/dn/BYnSk/hyGrzMzX0I/7PCpxlfCzrmTI9KD9w6xtk/img.png?width=725&amp;amp;height=578&amp;amp;face=0_0_725_578,https://scrap.kakaocdn.net/dn/zvIoB/hyGrqIR70z/KmPUks0L33KJqEn74FcWX0/img.png?width=725&amp;amp;height=556&amp;amp;face=0_0_725_556');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Download Android Studio and SDK tools &amp;nbsp;|&amp;nbsp; Android 스튜디오&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&lt;!-- hide description --&gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;다운로드 후 실행하여 아래 화면이 뜨면 Application 방향으로 안드로이드 스튜디오 아이콘을 옮겨 설치합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-06-16 오전 12.49.36.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;908&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boJ7jq/btqERtQBnHi/2TyZ9l81zQFFKkAk6JoDn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boJ7jq/btqERtQBnHi/2TyZ9l81zQFFKkAk6JoDn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boJ7jq/btqERtQBnHi/2TyZ9l81zQFFKkAk6JoDn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboJ7jq%2FbtqERtQBnHi%2F2TyZ9l81zQFFKkAk6JoDn1%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-06-16 오전 12.49.36.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;908&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그리고 런처 패드에 등록된 안드로이드 스튜디오를 실행합니다.&lt;/p&gt;
&lt;p&gt;실행 한뒤 Next를 눌러 넘어간뒤 아래 화면이 나오면 &quot;Custom&quot;으로 변경하고 넘어갑니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-06-16 오전 12.53.11.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1198&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvp8iw/btqESW5azxO/meQjnmma3eUikLXAkp4hJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvp8iw/btqESW5azxO/meQjnmma3eUikLXAkp4hJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvp8iw/btqESW5azxO/meQjnmma3eUikLXAkp4hJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcvp8iw%2FbtqESW5azxO%2FmeQjnmma3eUikLXAkp4hJ0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-06-16 오전 12.53.11.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1198&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-06-16 오전 12.54.13.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;1192&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KlilN/btqEQtRoudN/GB7d2GhsWcoEBvONIMLy00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KlilN/btqEQtRoudN/GB7d2GhsWcoEBvONIMLy00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KlilN/btqEQtRoudN/GB7d2GhsWcoEBvONIMLy00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKlilN%2FbtqEQtRoudN%2FGB7d2GhsWcoEBvONIMLy00%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-06-16 오전 12.54.13.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;1192&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Android Virtual Device 옵션도 선택하여 설치 합니다.&lt;/p&gt;
&lt;p&gt;나머지는 Next 후 완료 하여 설치를 진행합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1Jvln/btqEQZbn36B/m1KeKiSIGYgoGZcRk6Rah0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1Jvln/btqEQZbn36B/m1KeKiSIGYgoGZcRk6Rah0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1Jvln/btqEQZbn36B/m1KeKiSIGYgoGZcRk6Rah0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Jvln%2FbtqEQZbn36B%2Fm1KeKiSIGYgoGZcRk6Rah0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;안드로이드 스튜디오 실행 한뒤 Configure &amp;gt; SDK Manager를 실행 한뒤 Android 9.0 (pie)를 추가로 설치합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치가 완료되면 안드로이드 path을 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1592270144928&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export ANDROID_HOME=&amp;lt;설치된 sdk 경로&amp;gt;
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;터미널에서 아래 명령어가 먹히면 성공&lt;/p&gt;
&lt;pre id=&quot;code_1592270160423&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React Native</category>
      <category>react-native mac</category>
      <category>리엑트 네이티브 개발 환경</category>
      <category>리엑트 네이티브 맥 개발설정</category>
      <category>리엑트네이티브 MAC</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/104</guid>
      <comments>https://firework-ham.tistory.com/104#entry104comment</comments>
      <pubDate>Mon, 15 Jun 2020 09:57:55 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] 윈도우 개발 환경 설정 하기.</title>
      <link>https://firework-ham.tistory.com/103</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beBII7/btqEvivS749/gWVIMXIry8RKXrtz2HzqDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beBII7/btqEvivS749/gWVIMXIry8RKXrtz2HzqDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beBII7/btqEvivS749/gWVIMXIry8RKXrtz2HzqDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeBII7%2FbtqEvivS749%2FgWVIMXIry8RKXrtz2HzqDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;288&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서 React Native를 개발하기 위해서는 노드, Python, 안드로이드 스튜디오, Java JDK 등을 설치해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Javascript를 활용하지만 궁극적으로 마지막에는 iOS, 안드로이드 앱을 배포해야 하기 때문에 그에 맞는 빌드 구성이 필요합니다. 그래서 IOS의 경우에는 MacOS가 아니면 빌드가 되지 않습니다. 왜냐하면 MaxOS에서 지원하는 Xcode 빌드 툴이 있어야지만 IOS용 앱을 빌드 할 수 있습니다. 그렇다고 IOS용 앱 테스트를 못하는 것은 아닙니다. 리액트 네이티브는 JavaScript로 개발해 웹툴로 개발의 전반적인 테스트가 가능하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 윈도우에서 안드로이드 앱을 빌드 구성 및 개발 구성을 설치해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.node 설치 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 네이티브는 자바스크립트 기반으로 동작하기 때문에 자바스크립트 런타임인 노드가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 nvm을 활용해서 node를 설치하는 것을 선호합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 pc에 다양한 node 버전을 사용하기 위해서입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 이전에 정리한 nvm을 윈도우에 설치하는 방법은 아래 포스팅을 통해 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/69?category=868006&quot;&gt;https://firework-ham.tistory.com/69?category=868006&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590835365914&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[node] windows nvm 으로 node 설치하기&quot; data-og-description=&quot;MacOS나 리눅스에서 nvm으로 설치하는 방법은 이전에 살펴 보았습니다. 일반적인 컴퓨터라고 하면 Windows를 많이 사용하죠. 그래서 이번 포스팅은 windows에서 nvm을 설치하는 방법에 대해서 알아보겠&quot; data-og-host=&quot;firework-ham.tistory.com&quot; data-og-source-url=&quot;https://firework-ham.tistory.com/69?category=868006&quot; data-og-url=&quot;https://firework-ham.tistory.com/69&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dyfMBN/hyGdJRyD4V/HDNL8QWtpsNM48iheHIUOK/img.png?width=506&amp;amp;height=394&amp;amp;face=0_0_506_394,https://scrap.kakaocdn.net/dn/blKTAa/hyGeQ2BwD6/IIRhG704wFhKSL3pkoOYb1/img.png?width=506&amp;amp;height=394&amp;amp;face=0_0_506_394,https://scrap.kakaocdn.net/dn/bykWuP/hyGeL734zF/0V3vETVjsJHgn0ZHAhtkh1/img.png?width=506&amp;amp;height=394&amp;amp;face=0_0_506_394&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/69?category=868006&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firework-ham.tistory.com/69?category=868006&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dyfMBN/hyGdJRyD4V/HDNL8QWtpsNM48iheHIUOK/img.png?width=506&amp;amp;height=394&amp;amp;face=0_0_506_394,https://scrap.kakaocdn.net/dn/blKTAa/hyGeQ2BwD6/IIRhG704wFhKSL3pkoOYb1/img.png?width=506&amp;amp;height=394&amp;amp;face=0_0_506_394,https://scrap.kakaocdn.net/dn/bykWuP/hyGeL734zF/0V3vETVjsJHgn0ZHAhtkh1/img.png?width=506&amp;amp;height=394&amp;amp;face=0_0_506_394');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[node] windows nvm 으로 node 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MacOS나 리눅스에서 nvm으로 설치하는 방법은 이전에 살펴 보았습니다. 일반적인 컴퓨터라고 하면 Windows를 많이 사용하죠. 그래서 이번 포스팅은 windows에서 nvm을 설치하는 방법에 대해서 알아보겠&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firework-ham.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치를 완료하였다면 아래 방법으로 한 번도 버전 체크를 해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590835384557&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node -v

npm -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. open jdk 설치 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 앱을 빌드하기 위해 필요한 Java OpenJDK를 설치해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.azul.com/downloads/zulu-community/?version=java-8-lts&amp;amp;os=windows&amp;amp;architecture=x86-64-bit&amp;amp;package=jdk&quot;&gt;https://www.azul.com/downloads/zulu-community/?version=java-8-lts&amp;amp;os=windows&amp;amp;architecture=x86-64-bit&amp;amp;package=jdk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590835837727&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8&quot; data-og-description=&quot;Download Java 11 Zulu OpenJDK Linux Windows macOS Solaris Update Java Alpine Java SE free download Java 8 Java 7 Java 6 JDK&quot; data-og-host=&quot;www.azul.com&quot; data-og-source-url=&quot;https://www.azul.com/downloads/zulu-community/?version=java-8-lts&amp;amp;os=windows&amp;amp;architecture=x86-64-bit&amp;amp;package=jdk&quot; data-og-url=&quot;https://www.azul.com/downloads/zulu-community/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjHVwQ/hyGdRvjNu8/zrdhDBEx2svUFLTh21Y4T0/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/IfkUC/hyGeRtGb3C/Z3aVnJ9ZFHdBecgj8m8KMK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://www.azul.com/downloads/zulu-community/?version=java-8-lts&amp;amp;os=windows&amp;amp;architecture=x86-64-bit&amp;amp;package=jdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.azul.com/downloads/zulu-community/?version=java-8-lts&amp;amp;os=windows&amp;amp;architecture=x86-64-bit&amp;amp;package=jdk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjHVwQ/hyGdRvjNu8/zrdhDBEx2svUFLTh21Y4T0/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/IfkUC/hyGeRtGb3C/Z3aVnJ9ZFHdBecgj8m8KMK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download Java 11 Zulu OpenJDK Linux Windows macOS Solaris Update Java Alpine Java SE free download Java 8 Java 7 Java 6 JDK&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.azul.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사이트에서 Java 8, Windows, 64-bit, JDK를 선택하시고 msi 다운로드를 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 실행하여 설치를 진행하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP6mxj/btqEwhiwbAF/OuRAIiTWrPdoyIfKFJR25k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP6mxj/btqEwhiwbAF/OuRAIiTWrPdoyIfKFJR25k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP6mxj/btqEwhiwbAF/OuRAIiTWrPdoyIfKFJR25k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP6mxj%2FbtqEwhiwbAF%2FOuRAIiTWrPdoyIfKFJR25k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;399&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커맨드 창을 다시 닫았다 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 실행하여 정상적으로 java 버전이 표시되는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590836076764&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. python 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 네이티브 빌드 시스템은 python에 의존합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 python을 먼저 설치해 주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;https://www.python.org/downloads/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590836304287&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download Python&quot; data-og-description=&quot;The official home of the Python Programming Language&quot; data-og-host=&quot;www.python.org&quot; data-og-source-url=&quot;https://www.python.org/downloads/&quot; data-og-url=&quot;https://www.python.org/downloads/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c4EGs7/hyGeIiV6W1/Iw99QlH4r7gzUJABh6kEm1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.python.org/downloads/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c4EGs7/hyGeIiV6W1/Iw99QlH4r7gzUJABh6kEm1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download Python&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The official home of the Python Programming Language&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.python.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 공식 홈페이지에서 최신 python을 다운로드하여 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mta9k/btqEwRRbnxk/E76s9VLYQ2jkdK09KzasMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mta9k/btqEwRRbnxk/E76s9VLYQ2jkdK09KzasMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mta9k/btqEwRRbnxk/E76s9VLYQ2jkdK09KzasMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmta9k%2FbtqEwRRbnxk%2FE76s9VLYQ2jkdK09KzasMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;823&quot; height=&quot;134&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python-3.8.3.exe를 실행하여 설치하고 cmd 창을 다시 열어 아래 커맨드로 정상 표시되는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590836408963&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 리액트 네이티브 CLI 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 네이티브 CLI를 설치하기 위해 노드 패키지의 npm을 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590836475157&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g react-native-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-g 옵션은 전역으로 설치한다는 의미입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되었다면 다음 명령어로 설치 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590836513816&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;react-native --version&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1590836527657&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;react-native-cli: 2.0.1
react-native: n/a - not inside a React Native project directory&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 안드로이드 스튜디오 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 안드로이드 앱 빌드를 위한 안드로이드 스튜디오를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/index.html&quot;&gt;https://developer.android.com/studio/index.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590836613224&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download Android Studio and SDK tools &amp;nbsp;|&amp;nbsp; Android 스튜디오&quot; data-og-description=&quot;&amp;lt;!-- hide description --&amp;gt;&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/studio/index.html&quot; data-og-url=&quot;https://developer.android.com/studio?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d8xENg/hyGeHEBqhI/mCMCIeh8sPLXfcKKk2100K/img.jpg?width=1352&amp;amp;height=818&amp;amp;face=0_0_1352_818,https://scrap.kakaocdn.net/dn/bNdqCs/hyGdNTXmJ2/cB7xRiloJkFnsZ4BpQil6K/img.png?width=725&amp;amp;height=578&amp;amp;face=0_0_725_578,https://scrap.kakaocdn.net/dn/fdNrN/hyGePCDbqN/HHhchgKO6HxTY9W5KPeJSk/img.png?width=725&amp;amp;height=556&amp;amp;face=0_0_725_556&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/studio/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d8xENg/hyGeHEBqhI/mCMCIeh8sPLXfcKKk2100K/img.jpg?width=1352&amp;amp;height=818&amp;amp;face=0_0_1352_818,https://scrap.kakaocdn.net/dn/bNdqCs/hyGdNTXmJ2/cB7xRiloJkFnsZ4BpQil6K/img.png?width=725&amp;amp;height=578&amp;amp;face=0_0_725_578,https://scrap.kakaocdn.net/dn/fdNrN/hyGePCDbqN/HHhchgKO6HxTY9W5KPeJSk/img.png?width=725&amp;amp;height=556&amp;amp;face=0_0_725_556');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download Android Studio and SDK tools &amp;nbsp;|&amp;nbsp; Android 스튜디오&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;!-- hide description --&gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DqwY2/btqEu6oT4bZ/mPLrKZdsrslHqH3uTJ7Bp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DqwY2/btqEu6oT4bZ/mPLrKZdsrslHqH3uTJ7Bp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DqwY2/btqEu6oT4bZ/mPLrKZdsrslHqH3uTJ7Bp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDqwY2%2FbtqEu6oT4bZ%2FmPLrKZdsrslHqH3uTJ7Bp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;304&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 스튜디오 설치 파일을 다운로드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드가 완료되면 바로 실행하여 설치를 진행합니다. 설치 파일을 실행하면 조금 늦게 화면이 뜰 수 있으니 기다려주세요. Next를 눌러주다 아래 화면이 나오면 설치하고자 하는 원하는 위치를 정하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/busW9c/btqEvwtU73m/7IkIDhY7JOkLqCbUXod4I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/busW9c/btqEvwtU73m/7IkIDhY7JOkLqCbUXod4I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/busW9c/btqEvwtU73m/7IkIDhY7JOkLqCbUXod4I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbusW9c%2FbtqEvwtU73m%2F7IkIDhY7JOkLqCbUXod4I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;402&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되고 Finish를 눌러주면 안드로이드 스튜디오가 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Do not import settings 이 클릭되어 있는 상태에서 OK를 눌러줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNsJSo/btqEvZo5Cwm/MRIcCxbdXCaAlZNKLtr5nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNsJSo/btqEvZo5Cwm/MRIcCxbdXCaAlZNKLtr5nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNsJSo/btqEvZo5Cwm/MRIcCxbdXCaAlZNKLtr5nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNsJSo%2FbtqEvZo5Cwm%2FMRIcCxbdXCaAlZNKLtr5nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;600&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next를 눌러 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XVPOL/btqEwIGW5CZ/vTgYrRQ9GtIIKSk9yTyzf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XVPOL/btqEwIGW5CZ/vTgYrRQ9GtIIKSk9yTyzf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XVPOL/btqEwIGW5CZ/vTgYrRQ9GtIIKSk9yTyzf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXVPOL%2FbtqEwIGW5CZ%2FvTgYrRQ9GtIIKSk9yTyzf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;600&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Custom을 누른 뒤 Next를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOyi7h/btqEvhw4HI7/iEO9SRR9hsVKKT34Ldpf01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOyi7h/btqEvhw4HI7/iEO9SRR9hsVKKT34Ldpf01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOyi7h/btqEvhw4HI7/iEO9SRR9hsVKKT34Ldpf01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOyi7h%2FbtqEvhw4HI7%2FiEO9SRR9hsVKKT34Ldpf01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;603&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 아까 설치한 JDK 경로를 설정해 준 뒤 Next를 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테마는 원하는 테마를 선택해준 뒤 SDK Components Setup에서 모두 체크해주시고 SDK 경로는 원하시는 경로로 선택해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cafinA/btqEvYDJE8A/hS0KDPvgQbCFUmMzGASFS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cafinA/btqEvYDJE8A/hS0KDPvgQbCFUmMzGASFS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cafinA/btqEvYDJE8A/hS0KDPvgQbCFUmMzGASFS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcafinA%2FbtqEvYDJE8A%2FhS0KDPvgQbCFUmMzGASFS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;602&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 설정하고 Next 그리고 나머지는 모두 Next로 넘어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 Android Studio 창이 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 Configure를 클릭하고 SDK Manager를 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 원하는 Android 버전을 선택하여 적용하시면 되고 기본적으로 설치되어 있는 10.0을 사용할 예정이니 그대로 넘어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 환경 변수를 등록해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 탐색기에서 &quot;시스템 환경 변수 편집&quot;라고 검색하여 시스템 속성을 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNIpyh/btqEv8F7G5a/UIaa8COvGcYSHvckJ1P7E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNIpyh/btqEv8F7G5a/UIaa8COvGcYSHvckJ1P7E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNIpyh/btqEv8F7G5a/UIaa8COvGcYSHvckJ1P7E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNIpyh%2FbtqEv8F7G5a%2FUIaa8COvGcYSHvckJ1P7E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;542&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경 변수를 클릭하고 새로 만들기를 하여 아래 항목을 등록해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 이름 : ANDROID_HOME&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 값 : &amp;lt;sdk 지정한 폴더 경로&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQlBq/btqEvx0E3mQ/mFmThWaffN5Ft6ttFpjPl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQlBq/btqEvx0E3mQ/mFmThWaffN5Ft6ttFpjPl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQlBq/btqEvx0E3mQ/mFmThWaffN5Ft6ttFpjPl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQlBq%2FbtqEvx0E3mQ%2FmFmThWaffN5Ft6ttFpjPl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;514&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Path 경로에 sdk 지정한 경로 밑에 platfrom-tools를 등록해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;sdk 지정한 폴더 경로&amp;gt;/platfrom-tools&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 터미널(cmd)를 실행하여 아래 명령어가 실행되는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1590838799404&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adb --version
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1590838808311&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Android Debug Bridge version 1.0.41
Version 30.0.1-6435776
Installed as E:\programs\AndroidSdk\platform-tools\adb.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 리액트 네이티브를 개발하기 위한 준비는 끝났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 네이티브는 JavaScript 개발 IDE로 개발이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 개인적으로 비주얼 코드(Visual Code)를 추천드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS에서 배포하는 IDE로 무료이고 다양한 플러그인도 많아 현재 많이 사용되고 있는 툴입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;https://code.visualstudio.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590838918519&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Visual Studio Code - Code Editing. Redefined&quot; data-og-description=&quot;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/&quot; data-og-url=&quot;https://code.visualstudio.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/diVV2M/hyGdLu06cu/qCeUnowPImIS7XTuAWLjs1/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/diVV2M/hyGdLu06cu/qCeUnowPImIS7XTuAWLjs1/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code - Code Editing. Redefined&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 리액트 네이티브 윈도우 개발 세팅이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2022-12-10 추가 수정 사항]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 환경 변수에 아래와 같이 등록을 해주어야 초기 android 실행시 정상 구동 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 : ANDROID_SDK_ROOT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 : &amp;lt;SDK 설치 폴더&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Path에 아래와 같이 등록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%ANDROID_SDK_ROOT%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>React Natvie Window</category>
      <category>리액트 네이티브 개발 설정</category>
      <category>리액트 네이티브 개발 환경 설정</category>
      <category>리액트 네이티브 윈도우</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/103</guid>
      <comments>https://firework-ham.tistory.com/103#entry103comment</comments>
      <pubDate>Sat, 30 May 2020 20:43:58 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] 리액트 네이티브란? 장단점</title>
      <link>https://firework-ham.tistory.com/102</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/qz9hn/btqEsYxzxh1/E0kWwRSGEuEQLfWeS5XTpK/img.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qz9hn/btqEsYxzxh1/E0kWwRSGEuEQLfWeS5XTpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qz9hn/btqEsYxzxh1/E0kWwRSGEuEQLfWeS5XTpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qz9hn/btqEsYxzxh1/E0kWwRSGEuEQLfWeS5XTpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqz9hn%2FbtqEsYxzxh1%2FE0kWwRSGEuEQLfWeS5XTpK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/qz9hn/btqEsYxzxh1/E0kWwRSGEuEQLfWeS5XTpK/img.png&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; Front-End, Application 개발을 하는 분들이라면 한 번쯤 리액트 네이티브(React Native)라는 단어를 한 번쯤은 들어보셨죠? 페이스북에서 만든 오픈소스 모바일 애플리케이션 프레임워크로 Javascript를 알고 있는 개발자라면 안드로이드, IOS 앱을 만들 수 있는 크로스 플랫폼 (하이브리드 플랫폼)입니다.&lt;br&gt; &lt;br&gt;이 페이지는 리액트 네이티브에 대해 알아보고 장단점을 적어보려고 합니다.&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 리액트 네이티브란?&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/sgqn4/btqEuYJFN0I/Z6ksDxbogXkEWXRc8Xqdsk/img.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sgqn4/btqEuYJFN0I/Z6ksDxbogXkEWXRc8Xqdsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sgqn4/btqEuYJFN0I/Z6ksDxbogXkEWXRc8Xqdsk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sgqn4/btqEuYJFN0I/Z6ksDxbogXkEWXRc8Xqdsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsgqn4%2FbtqEuYJFN0I%2FZ6ksDxbogXkEWXRc8Xqdsk%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/sgqn4/btqEuYJFN0I/Z6ksDxbogXkEWXRc8Xqdsk/img.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 리액트 네이티브는 페이스북에서 만든 오픈소스 모바일 애플리케이션 프레임워크입니다. JavaScript로 개발이 가능하며 하나의 프로그래밍 언어로 IOS와 안드로이드 모바일 앱을 동시에 개발할 수 있는 크로스 플랫폼입니다. &lt;br&gt; &lt;br&gt; 애플리케이션을 개발한다고 한다면 Android는 Kotlin과 Java가 대표적이고 IOS는 Objective-C와 Swift로 개발하는 것이 일반적입니다. 이 일반적인 언어들로 개발하는 것은 각각의 OS에 최적화되어 있습니다. &lt;br&gt; &lt;br&gt; 하지만 각각의 언어로 개발하기 위해선 개발자들은 두 가지 언어와 OS를 모두 이해해야 합니다. 개발자도 필요하고 유지보수하는 비용도 많아지죠. 그래서 이를 해결하기 위해 등장한 것이 하이브리드 웹앱입니다.&lt;br&gt; &lt;br&gt; 웹을 구동하면 앱 화면은 웹(Web) 화면으로 표시하고 필요한 기능 웹 기술로 구현합니다. 초창기 하이브리브 웹 기술은 브라우저를 사용했기 때문에 브라우저에서 제공하는 성능 이상으로는 발휘할 수 없었습니다. 이를 보안하려는 시도가 나타났고 2015년 5월 페이스북은 웹 브라우저를 사용하지 않고 네이티브 브릿지(Native Bridge)를 사용하는 리액트 네이티브를 발표합니다.&lt;br&gt; &lt;br&gt; 리액트 네이티브는 네이티브 브릿지를 통해 네이티브 스레드(Native Thread)와 통신하면서 웹앱과 다르게 성능을 최적화시킵니다. 이런 웹을 사용하지 않고 네이티브와 통신하는 방법을 사용하는 것을 하이브리드 앱(Hybrid App)이라 블리며 자마린, 네이티브 스크립트, 플루터 등이 있습니다.&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 리액트 네이티브의 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 러닝 커브가 낮다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 리액트 네이티브의 가장 큰 장점이라고 할 수 있는 것은 앱을 만들기 위해 다른 언어를 학습하지 않아도 된다는 것입니다. 물론 JavaScript를 사용하지 않는 개발자라면 이야기는 다르지만 Front-End 개발자, Back-End Node 개발자 라면 바로 앱 개발을 할 수 있습니다.&lt;br&gt; &lt;br&gt; JavaScript 기반으로 하기에 다른 하이브리드 앱인 자만리-C#, 플루터-Dart 보다 러닝 커브와 진입 장벽이 낮습니다.&lt;br&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 소스 코드 재사용과 생산성.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 페이스북의 리액트에서 파생되었기 때문에 그 방식을 그대로 사용했습니다. React는 Component 기반으로 기능들을 분리해 재사용할 수 있는 구조로 되어 있습니다. 또한 기존에 리액트로 개발된 사이트가 있다면 그 사이트의 Component 코드를 그대로 사용할 수 있기 때문에 재사용 가능하면 생산성은 더욱 올라갑니다.&lt;br&gt; &lt;br&gt;또한 하이브리드 앱의 특징으로 두 개의 OS인 Android와 IOS 모두 한 번에 개발할 수 있기 때문에 개발을 효율적으로 할 수 있습니다.&lt;br&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 비용 그리고 오픈소스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 하나의 언어 그리고 하나의 코드로 두 개의 OS 앱을 개발할 수 있기 때문에 일반적인 네이티브 앱을 개발하는 것보다 두배 비용이 저렴하게 듭니다. 또한 기존에 JavaScript를 사용하는 개발자들이 많기 때문에 개발자들을 고용하는데도 좋고 쉽게 배울 수 있습니다.&lt;br&gt; &lt;br&gt; 또한 앱의 유지보수에도 하나의 코드만 수정하면 되기에 유지 보수 비용도 줄어듭니다.&lt;br&gt; &lt;br&gt; 리액트 네이티브는 오픈 소스로 커뮤니티가 활성화되어 있고 많은 블로그에서 정보를 찾아볼 수 있습니다. 오픈 소스의 장점으로 문제 해결하는 데 참고 자료가 많이 있어 생산성을 증대시키고 비용을 절약할 수 있습니다.&lt;br&gt; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 리액트 네이티브의 단점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 러닝 커브&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 러닝 커브는 장점이자 단점입니다. 기존에 OS 네이티브 앱을 개발하던 개발자는 새로운 JavaScript를 학습해야 합니다. 그리고 리액트를 접하지 않았던 개발자들은 새로운 개념인 jsx의 리액트 고유 방식을 이해하고 리액트가 사용하는 props, state 등의 개발 방식을 이해해야 합니다.&lt;br&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 네이티브 보다 성능이 떨어진다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 리액트 네이티브는 네이티브 브릿지를 사용하여 네이티브 스레드를 연결시켜 동작하는 하이브리드 앱이기 때문에 네티이브 개발 방식보다는 당연하게 성능이 떨어집니다. &lt;br&gt; 일반적인 애플리케이션을 만든다고 한다면 문제는 없지만 애니메이션 60 프레임 이상을 사용하거나 자바스크립트 스레드에서 5ms보다 시간이 걸리는 처리를 하게 된다면 성능 저하를 경험할 수 있습니다.&lt;br&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 오픈 소스 그리고 네이티브 기능 개발&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; 오픈 소스이기 때문에 업데이트가 자주 발생합니다. 또한 업데이트 시 수정되는 기능들 때문에 버그가 발생할 수 도 있습니다. 버전을 업그레이드는 출시되자마자 진행하지 않아도 되지만 이는 항상 생각하고 업그레이드를 진행해야 합니다.&lt;br&gt; &lt;br&gt; 또한 네이티브 기능을 개발하기 위해서는 리액트 네이티브에서 기능을 제공해야 합니다. 물론 기본적인 기능들을 제공되고 있지만 신규 기능을 개발하기 위해서는 리액트 네이티브가 지원해주어야 가능합니다. &lt;br&gt; &lt;br&gt; 네이티브의 기능을 연결하는 가이드는 제공하고 있지만 개발은 쉽지 않고 네이티브 지식을 요구하기 때문에 네이트브 언어를 공부하는 것과 같을 수 있습니다.&lt;br&gt; &lt;br&gt;&lt;b&gt;참고 도서&lt;/b&gt;&lt;br&gt; &lt;br&gt;스무디 한잔 마시며 끝내는 React Native&lt;/p&gt;</description>
      <category>React Native</category>
      <category>리액트 네이티브 단점</category>
      <category>리액트 네이티브 란?</category>
      <category>리액트 네이티브 장점</category>
      <category>리엑트 네이트브</category>
      <category>리엑트 네이티브 장단점</category>
      <author>밀래</author>
      <guid isPermaLink="true">https://firework-ham.tistory.com/102</guid>
      <comments>https://firework-ham.tistory.com/102#entry102comment</comments>
      <pubDate>Thu, 28 May 2020 23:38:04 +0900</pubDate>
    </item>
  </channel>
</rss>