{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/react-native-google-login-1/",
    "result": {"data":{"cur":{"id":"c876f69f-dc03-5325-b070-9385c3e699a6","html":"<p><img src=\"https://images.velog.io/images/hhjj0506/post/56073794-314a-451a-a667-5d0595643061/google.png\" alt=\"유일하게 디자인을 못했던 로그인 페이지다\"></p>\n<p>구글 로그인은 프로젝트를 시작할 때 내가 가장 처음으로 구현한 기능이다. 프로젝트 시작 전에는 개발에 재미를 붙이지 못했던 내가 이 로그인 기능 구현을 처음으로 성공하고 재미를 붙이게 해준 아주 고마운 기능이 됐다. 구글 로그인말고도 React에서의 계정 기능은 어렵지 않게 구현할 수 있기 때문에 처음 시작하는 사람들이 시도해보면서 재미를 붙이면 좋을 것 같다.</p>\n<h2 id=\"주의\" style=\"position:relative;\"><a href=\"#%EC%A3%BC%EC%9D%98\" aria-label=\"주의 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>주의!!</h2>\n<p>이 포스트는 react-native-cli를 이용하여 생성한 프로젝트가 있다는 가정하에 진행됩니다. 만약 expo-cli를 사용하고 있다면 새롭게 프로젝트를 만들어 주시길 바랍니다. (react-native-cli 설정 방법은 <a href=\"https://reactnative.dev/docs/environment-setup\">여기</a>에서 찾아볼 수 있다.)</p>\n<h2 id=\"firebase-설정\" style=\"position:relative;\"><a href=\"#firebase-%EC%84%A4%EC%A0%95\" aria-label=\"firebase 설정 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Firebase 설정</h2>\n<p>먼저 <a href=\"https://firebase.google.com/\">Firebase</a>의 계정을 만드는 것부터 시작한다. 계정을 만들었다면 Firebase 홈페이지 우측 상단에 있는 ‘콘솔로 이동’ 버튼을 누르거나 <a href=\"https://console.firebase.google.com/\">console.firebase.com</a> 으로 직접 이동한다.</p>\n<p>콘솔에 들어가게 되면 이런 화면이 보일것이다.<img src=\"https://images.velog.io/images/hhjj0506/post/b4478f6c-8c67-4864-a3f8-1a5e8532eb5f/image.png\" alt=\"\"></p>\n<p>작성자는 이미 만들어놓은 프로젝트들이 많아서 꽉 차있지만 처음 계정을 만든 후에는 아무것도 없을것이다. 여기서는 Add project를 눌러서 새 프로젝트를 만들어준다.</p>\n<p><img src=\"https://images.velog.io/images/hhjj0506/post/5dc6e266-68a8-4246-b62e-21c5ba218087/image.png\" alt=\"\"></p>\n<p>이름을 설정한 후에는 계속 continue를 누르면 된다. 중간에 구글에서 제공하는 앱 측정 솔루션을 사용할것인지에 대해 물어보는데 써도 안써도 상관은 없다.</p>\n<p>프로젝트가 생성된 후에는 이런 창이 나오게 된다.\n<img src=\"https://images.velog.io/images/hhjj0506/post/41188d88-578d-49a8-b16f-55e38a9c7ba1/image.png\" alt=\"\">\n우리는 안드로이드 앱을 만들것이기 때문에 빨간색 원이 그려진 안드로이드 버튼을 누른다.</p>\n<p><img src=\"https://images.velog.io/images/hhjj0506/post/383b7e9b-31e2-443d-9343-e4c931939b84/image.png\" alt=\"\">\n버튼을 누르면 이렇게 안드로이드 앱 생성 페이지가 나오게 된다.\n우리가 입력해야 할 것들은 Android package name과 SHA-1인데, 일단 package name을 어떻게 입력해야 하는지부터 알아보자.</p>\n<p>package name은 내가 만든 프로젝트에서 찾아 볼 수 있다. 프로젝트에서 android/app/src/main 경로로 들어가면 AndroidManifest.xml이라는 파일을 발견할 수 있는데, 이 파일 상단에 보이는</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token assign-left variable\">package</span><span class=\"token operator\">=</span><span class=\"token string\">\"com.프로젝트 이름\"</span></code></pre></div>\n<p>이 이름을 그대로 복사 붙여넣기 하면된다. 내 경우에는 test_project라는 이름으로 프로젝트를 생성했기 때문에 package name은 com.test_project가 된다.</p>\n<p>다음으로 SHA-1은 페이지에는 optional이라고 써있기는 하지만 구글 로그인 기능을 이용하기 위해서는 필수이다. SHA-1을 얻는 방법은 간단하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token builtin class-name\">cd</span> android <span class=\"token operator\">&amp;&amp;</span> gradlew signingReport</code></pre></div>\n<p>이 명령어를 콘솔에 입력하면 많은 양의 비슷해 보이는 문단들이 나올텐데, 그 중에서 경로가 프로젝트/android/app/debug.keystore인 문단에서의 SHA-1을 입력하면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Variant: debugUnitTest\nConfig: debug\nStore: C:<span class=\"token punctuation\">\\</span>react<span class=\"token punctuation\">\\</span>test_project<span class=\"token punctuation\">\\</span>android<span class=\"token punctuation\">\\</span>app<span class=\"token punctuation\">\\</span>debug.keystore\nAlias: androiddebugkey\nMD5: -------------------------------\nSHA1: // 여기에 나오는 것을 복붙\nSHA-256: ----------------------------\nValid until: <span class=\"token number\">2052</span> <span class=\"token number\">5</span> <span class=\"token number\">1</span></code></pre></div>\n<p>이렇게 package name과 SHA-1을 입력하고 Register app 버튼을 누르면 무언가를 다운로드 하라는 버튼이 보인다.\n<img src=\"https://images.velog.io/images/hhjj0506/post/526d5b8b-cbd8-4e25-84dd-538852e079b4/image.png\" alt=\"\">\n버튼을 누르고 다운받은 google-services.json 파일을 보이는것과 같이 android/app 경로에 넣어준다. 이 파일은 이후에 구글 로그인에 필요한 web client id를 가져올 때 쓰인다.</p>\n<p>google-services.json 파일을 다운받아 맞는 경로에 넣기까지 했으면 Firebase에서의 설정은 거의 끝이 났다.\n마지막으로는 Firebase에서 제공하는 Authentication 기능을 활성화 해야한다.\n<img src=\"https://images.velog.io/images/hhjj0506/post/11e24afa-5496-4808-b101-58e00737d359/image.png\" alt=\"\">\n페이지 왼쪽에 있는 Authentication 섹션으로 넘어가 Get Started 버튼을 누른다.\n<img src=\"https://images.velog.io/images/hhjj0506/post/03994bd9-d994-4797-af5e-7821d8e03dd3/image.png\" alt=\"\">\n페이지가 넘어가면 이런 화면이 나올텐데, 살펴보면 여러 방법의 로그인 기능들이 있는것을 볼 수 있다.\n물론 우리는 구글 로그인을 사용할 것이기 때문에 구글만 활성화시키면 된다.\n<img src=\"https://images.velog.io/images/hhjj0506/post/448cfd86-0f19-40a7-adb1-bb3edfca377d/image.png\" alt=\"\">\n구글을 눌러 활성화를 시키면 끝이다. Project support email은 현재 자신이 로그인 되어있는 이메일을 넣으면 된다.</p>\n<p>다음편에서는 실제 앱에서 구글 로그인 기능을 구현해보겠다.</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#%EC%A3%BC%EC%9D%98\">주의!!</a></li>\n<li><a href=\"#firebase-%EC%84%A4%EC%A0%95\">Firebase 설정</a></li>\n</ul>\n</div>","excerpt":"유일하게 디자인을 못했던 로그인 페이지다 구글 로그인은 프로젝트를 시작할 때 내가 가장 처음으로 구현한 기능이다. 프로젝트 시작 전에는 개발에 재미를 붙이지 못했던 내가 이 로그인 기능 구현을 처음으로 성공하고 재미를 붙이게 해준 아주 고마운 기능이 됐다. 구글 로그인말고도 React에서의 계정 기능은 어렵지 않게 구현할 수 있기 때문에 처음 시작하는 사람들이 시도해보면서 재미를 붙이면 좋을 것 같다. 주의!! 이 포스트는 react-native-cli를 이용하여 생성한 프로젝트가 있다는 가정하에 진행됩니다. 만약 expo-cli를 사용하고 있다면 새롭게 프로젝트를 만들어 주시길 바랍니다. (react-native-cli 설정 방법은 여기에서 찾아볼 수 있다.) Firebase 설정 먼저 Firebase의 계정을 만드는 것부터 시작한다. 계정을 만들었다면 Firebase 홈페이지 우측 상단에 있는 ‘콘솔로 이동’ 버튼을 누르거나 console.firebase.com 으로 직접 이동…","frontmatter":{"date":"June 02, 2022","title":"[React Native] Firebase를 이용한 Android 구글 로그인 1","categories":"개발 featured","author":"김형진","emoji":"📱"},"fields":{"slug":"/react-native-google-login-1/"}},"next":{"id":"094a6858-baf4-518c-b591-1e65e9c3c2d4","html":"<p>저번편에서는 Firebase의 설정을 끝마쳤고, 이번편에서는 실제로 구글 로그인 기능을 구현할 차례다.</p>\n<h2 id=\"프로젝트-설정\" style=\"position:relative;\"><a href=\"#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95\" aria-label=\"프로젝트 설정 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>프로젝트 설정</h2>\n<p>먼저 필요한 패키지들을 설치한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> @react-native-firebase/app @react-native-firebase/auth @react-native-google-signin/google-signin</code></pre></div>\n<p>app 모듈은 Firebase의 기능들을 사용하기 전에 반드시 깔아야 하는 모듈이고, auth 모듈은 계정 기능을 사용할 수 있게 해준다. 그리고 google-signin은 문자 그대로 React에서 구글 로그인 기능을 쉽게 만들어주는 패키지다.</p>\n<p>패키지들을 설치한 이후에는 프로젝트 자체에서의 설정을 해준다.\nandroid 폴더 안에 있는 build.gradle 파일에 들어가 google-services 플러그인을 추가해준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">buildscript <span class=\"token punctuation\">{</span>\n  dependencies <span class=\"token punctuation\">{</span>\n    // <span class=\"token punctuation\">..</span>. other dependencies\n    classpath <span class=\"token string\">'com.google.gms:google-services:4.3.10'</span>\n    // Add me --- /<span class=\"token punctuation\">\\</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>다음으로는 android/app 경로 안에 있는 build.gradle 파일에서 플러그인을 적용한다. 경로가 비슷하니 헷갈리지 말자.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">apply plugin: <span class=\"token string\">'com.android.application'</span>\napply plugin: <span class=\"token string\">'com.google.gms.google-services'</span> // <span class=\"token operator\">&lt;</span>- Add this line</code></pre></div>\n<p>auth 모듈도 같은 파일 안에 추가해준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">dependencies <span class=\"token punctuation\">{</span>\n    // <span class=\"token punctuation\">..</span>. other dependencies\n    implementation <span class=\"token string\">'com.google.firebase:firebase-auth'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"로그인-기능-구현\" style=\"position:relative;\"><a href=\"#%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84\" aria-label=\"로그인 기능 구현 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>로그인 기능 구현</h2>\n<p>이젠 정말로 기능 구현을 할 차례다.</p>\n<h3 id=\"appjs\" style=\"position:relative;\"><a href=\"#appjs\" aria-label=\"appjs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>App.js</h3>\n<p>App.js에 있는 코드를 모두 지우고 필요한 패키지들을 불러오자.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">import</span> React, <span class=\"token punctuation\">{</span> useEffect, useState <span class=\"token punctuation\">}</span> from <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">import</span> auth from <span class=\"token string\">'@react-native-firebase/auth'</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">import</span> <span class=\"token punctuation\">{</span> GoogleSignin <span class=\"token punctuation\">}</span> from <span class=\"token string\">'@react-native-google-signin/google-signin'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>다음으로는 구글 로그인 기능을 이용하기 위한 webClientId를 google-services.json에서 가져와야 한다.\n이 파일 안에서 client/oauth_client/client_id를 가져오면 되는데, client_type이 3인 것을 가져와야 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">useEffect<span class=\"token punctuation\">((</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    GoogleSignin.configure<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      webClientId:\n        <span class=\"token string\">'CLIENT_ID'</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>, <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>이로써 Google SDK를 사용할 수 있게 됐다.</p>\n<p>이제는 로그인 버튼을 눌렀을 때 사용자를 로그인 시키는 기능을 만들어보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">async <span class=\"token keyword\">function</span> <span class=\"token function-name function\">onGoogleButtonPress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    const <span class=\"token punctuation\">{</span> idToken <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> await GoogleSignin.signIn<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    const googleCredential <span class=\"token operator\">=</span> auth.GoogleAuthProvider.credential<span class=\"token punctuation\">(</span>idToken<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token builtin class-name\">return</span> auth<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>.signInWithCredential<span class=\"token punctuation\">(</span>googleCredential<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>한줄한줄 살펴보자면\n첫번째 줄은 구글에 로그인하면서 유저의 idToken을 가져온다.\n두번째 줄은 가져온 유저의 idToken을 이용하여 Google credential을 생성한다.\n마지막 줄은 생성된 credential을 이용해 사용자를 앱으로 로그인 시킨다.</p>\n<p>다음은 사용자의 접속 유무에 따라서 다른 화면을 보여주는 작업을 해보자.\n사용자가 접속 중일때는 앱의 홈 화면을 보여주고 접속 중이 아닐때는 로그인 화면을 보여주려면 현재 사용자의 상태를 판별하는 state가 필요하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">const <span class=\"token punctuation\">[</span>loggedIn, setLoggedIn<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> useState<span class=\"token punctuation\">(</span>false<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n// <span class=\"token punctuation\">..</span>. other codes\n\nauth.onAuthStateChanged<span class=\"token punctuation\">((</span>user<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \tsetLoggedIn<span class=\"token punctuation\">(</span>true<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    \tsetLoggedIn<span class=\"token punctuation\">(</span>false<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Firebase에서 제공하는 onAuthStateChanged function을 통해 유저의 접속 유무를 판별 할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>loggedIn<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin class-name\">return</span> <span class=\"token operator\">&lt;</span>Home /<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token builtin class-name\">return</span> <span class=\"token operator\">&lt;</span>LoginScreen <span class=\"token assign-left variable\">onGoogleButtonPress</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>onGoogleButtonPress<span class=\"token punctuation\">}</span> /<span class=\"token operator\">></span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>로그인 상태에서는 Home 화면을, 아닐때는 LoginScreen 화면을 보인다.\nonGoogleButtonPress function의 정보를 LoginScreen으로 보낸다.</p>\n<p>이제는 유저에게 보여질 두 화면을 만들 차례다.</p>\n<h3 id=\"loginscreenjs\" style=\"position:relative;\"><a href=\"#loginscreenjs\" aria-label=\"loginscreenjs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>LoginScreen.js</h3>\n<p>screens 폴더를 생성한 뒤 폴더 안에 LoginScreen.js 파일을 생성한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">import</span> React from <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">import</span> <span class=\"token punctuation\">{</span> Text, View <span class=\"token punctuation\">}</span> from <span class=\"token string\">'react-native'</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">import</span> <span class=\"token punctuation\">{</span> GoogleSigninButton <span class=\"token punctuation\">}</span> from <span class=\"token string\">'@react-native-google-signin/google-signin'</span></code></pre></div>\n<p>필요한 모듈들을 가져온다.\n다음으로는 구글 로그인 버튼을 이용한 간단한 페이지를 만든다. 스타일</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token builtin class-name\">export</span> default <span class=\"token keyword\">function</span> LoginiScreen<span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin class-name\">return</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token operator\">&lt;</span>View<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Login Page<span class=\"token operator\">&lt;</span>/Text<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>GoogleSigninButton <span class=\"token assign-left variable\">onPress</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>props.onGoogleButtonPress<span class=\"token punctuation\">}</span> /<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>/View<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"homejs\" style=\"position:relative;\"><a href=\"#homejs\" aria-label=\"homejs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Home.js</h3>\n<p>screens 폴더 안에 Home.js 파일을 만들고 필요한 모듈들을 불러온다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">import</span> React from <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">import</span> <span class=\"token punctuation\">{</span> Text, View, Image, Button <span class=\"token punctuation\">}</span> from <span class=\"token string\">'react-native'</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">import</span> auth from <span class=\"token string\">'@react-native-firebase/auth'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>다음은 로그인이 성공했는지를 확인 하기 위해 로그인한 유저의 정보를 불러와 유저의 프로필 사진, 이름, 이메일을 보인다.\nsignOut()을 사용한 로그아웃 버튼도 만들어 준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token builtin class-name\">export</span> default <span class=\"token keyword\">function</span> <span class=\"token function-name function\">Home</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  const user <span class=\"token operator\">=</span> auth<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>.currentUser<span class=\"token punctuation\">;</span>\n  <span class=\"token builtin class-name\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>View<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>user?.displayName<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span>/Text<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>user?.email<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span>/Text<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Image <span class=\"token assign-left variable\">source</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> uri: user?.photoURL <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> /<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>View<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Button <span class=\"token assign-left variable\">title</span><span class=\"token operator\">=</span><span class=\"token string\">\"Logout\"</span> <span class=\"token assign-left variable\">onPress</span><span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> auth<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>.signOut<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> /<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>/View<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/View<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>auth.currentUser function을 사용하면 현재 유저의 정보를 불러 올 수 있다.\nEx) user?.photoURL -> 현재 유저의 구글 계정 프로필 사진</p>\n<h2 id=\"결과\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC\" aria-label=\"결과 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과</h2>\n<p>LoginScreen\n<img src=\"https://images.velog.io/images/hhjj0506/post/ff9fc80d-fff9-4763-a678-bde9d504b177/image.png\" alt=\"\">\nHome\n<img src=\"https://images.velog.io/images/hhjj0506/post/d4549fe6-a69a-4f90-b71f-d63ae47b236f/image.png\" alt=\"\">\n가시성이 너무 떨어지고, 이미지를 보여주기 위해 간단히 디자인을 따로 했다.</p>\n<h2 id=\"마치며\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\" aria-label=\"마치며 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마치며</h2>\n<p>그동안 포스트를 안하다가 갑자기 삘을 받아서 준비도 안된 상태에서 포스트를 하다 보니까 시간도 굉장히 오래걸리고 글도 난잡하게 써졌던 것 같습니다. 글 읽는데 불편한 점이 계셨다면 정말 죄송합니다…</p>\n<p>아마 앞으로는 간단한 리뷰 기능과 찜 기능, 그리고 이 둘과 계정을 이용하여 내가 쓴 리뷰와 찜한 식당 불러오기에 대해서 다뤄볼 것 같습니다.\n채팅 기능도 언젠가는 포스트를 하겠지만 아직은 제가 글로 풀어낼 실력이 안되는 것 같아서 다음으로 미루고요.</p>\n<p>아무튼 긴 글 읽어주셔서 감사합니다!</p>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95\">프로젝트 설정</a></p>\n</li>\n<li>\n<p><a href=\"#%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84\">로그인 기능 구현</a></p>\n<ul>\n<li><a href=\"#appjs\">App.js</a></li>\n<li><a href=\"#loginscreenjs\">LoginScreen.js</a></li>\n<li><a href=\"#homejs\">Home.js</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#%EA%B2%B0%EA%B3%BC\">결과</a></p>\n</li>\n<li>\n<p><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\">마치며</a></p>\n</li>\n</ul>\n</div>","frontmatter":{"date":"June 02, 2022","title":"[React Native] Firebase를 이용한 Android 구글 로그인 2","categories":"개발 featured","author":"김형진","emoji":"📱"},"fields":{"slug":"/react-native-google-login-2/"}},"prev":{"id":"1b12bfbd-c20d-59f0-af06-8150b73f13a8","html":"<h2 id=\"계획은-잘-세우는-나\" style=\"position:relative;\"><a href=\"#%EA%B3%84%ED%9A%8D%EC%9D%80-%EC%9E%98-%EC%84%B8%EC%9A%B0%EB%8A%94-%EB%82%98\" aria-label=\"계획은 잘 세우는 나 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>계획은 잘 세우는 나</h2>\n<p>이전에도 블로그를 운영하면서 여러번 방학계획을 올렸었지만, 제대로 지켜진 적은 거의 없었다.\n팀 프로젝트 같이 다른 사람들과 같이 진행하는 것은 당연히 열심히 했었지만, 그러다보니 오히려 혼자서 해야하는 계획들을 잘 지키지 못했던 것 같다.\n그러니까 이번에 좀 제대로 해보자.</p>\n<h3 id=\"1-공프기-공부\" style=\"position:relative;\"><a href=\"#1-%EA%B3%B5%ED%94%84%EA%B8%B0-%EA%B3%B5%EB%B6%80\" aria-label=\"1 공프기 공부 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 공프기 공부</h3>\n<p>다음 학기부터 수강하는 공학프로젝트기획의 주제와 팀원들이 정해졌다.\n일단은 학교에 남아서 같이 ROS 등을 배우고, 주제에 관련된 기술과 특허를 찾는 등의 공부를 할것같다.\n아무래도 다른 사람들과 같이 진행하고, 1년 동안 지속적으로 진행할 프로젝트이다보니 가장 열심히 할것 같다.</p>\n<h3 id=\"2-알고리즘--코딩테스트\" style=\"position:relative;\"><a href=\"#2-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98--%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8\" aria-label=\"2 알고리즘  코딩테스트 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 알고리즘 / 코딩테스트</h3>\n<p>2학년 방학부터 계속해서 조금씩 공부를 하긴 했지만 실력이 만족할만큼 늘진 않았다.\n공부를 해본 결과 학기 중에는 공부가 힘들다고 생각이 들었고, 혼자서 진행하기에는 내가 너무 나약하기 때문에 이번에는 학교에서 진행하는 알고리즘 공부 캠프를 신청했다.\n이걸 바탕으로 AtCoder나 CodeForce에서 진행하는 대회도 꾸준히 참가할 예정이다.</p>\n<h3 id=\"3-개인프로젝트\" style=\"position:relative;\"><a href=\"#3-%EA%B0%9C%EC%9D%B8%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8\" aria-label=\"3 개인프로젝트 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 개인프로젝트</h3>\n<p>웹/앱을 만든건 꽤 있지만 정작 맘에 드는 건 하나도 없다.\n이전부터 사람들이 실제로 사용할 수 있는 서비스를 만들고 싶었는데 이번 방학에 해보려고 한다.\n일단 주제는 헬스, 크로스핏 등의 운동을 하는 사람들을 타겟으로 잡았는데 언제 바뀔지 모른다.</p>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#%EA%B3%84%ED%9A%8D%EC%9D%80-%EC%9E%98-%EC%84%B8%EC%9A%B0%EB%8A%94-%EB%82%98\">계획은 잘 세우는 나</a></p>\n<ul>\n<li><a href=\"#1-%EA%B3%B5%ED%94%84%EA%B8%B0-%EA%B3%B5%EB%B6%80\">1. 공프기 공부</a></li>\n<li><a href=\"#2-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98--%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8\">2. 알고리즘 / 코딩테스트</a></li>\n<li><a href=\"#3-%EA%B0%9C%EC%9D%B8%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8\">3. 개인프로젝트</a></li>\n</ul>\n</li>\n</ul>\n</div>","frontmatter":{"date":"June 09, 2022","title":"22 여름방학 계획","categories":"기타","author":"김형진","emoji":"🚘"},"fields":{"slug":"/2022-summer-todo/"}},"site":{"siteMetadata":{"siteUrl":"https://hhjj0506.github.io","comments":{"utterances":{"repo":"hhjj0506/hhjj0506.github.io"}}}}},"pageContext":{"slug":"/react-native-google-login-1/","nextSlug":"/react-native-google-login-2/","prevSlug":"/2022-summer-todo/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}