{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/react-native-google-login-2/",
    "result": {"data":{"cur":{"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>","excerpt":"저번편에서는 Firebase의 설정을 끝마쳤고, 이번편에서는 실제로 구글 로그인 기능을 구현할 차례다. 프로젝트 설정 먼저 필요한 패키지들을 설치한다. app 모듈은 Firebase의 기능들을 사용하기 전에 반드시 깔아야 하는 모듈이고, auth 모듈은 계정 기능을 사용할 수 있게 해준다. 그리고 google-signin은 문자 그대로 React에서 구글 로그인 기능을 쉽게 만들어주는 패키지다. 패키지들을 설치한 이후에는 프로젝트 자체에서의 설정을 해준다.\nandroid 폴더 안에 있는 build.gradle 파일에 들어가 google-services 플러그인을 추가해준다. 다음으로는 android/app 경로 안에 있는 build.gradle 파일에서 플러그인을 적용한다. 경로가 비슷하니 헷갈리지 말자. auth 모듈도 같은 파일 안에 추가해준다. 로그인 기능 구현 이젠 정말로 기능 구현을 할 차례다. App.js App.js에 있는 코드를 모두 지우고 필요한 패키지들을 불러오자…","frontmatter":{"date":"June 02, 2022","title":"[React Native] Firebase를 이용한 Android 구글 로그인 2","categories":"개발 featured","author":"김형진","emoji":"📱"},"fields":{"slug":"/react-native-google-login-2/"}},"next":{"id":"b50d9862-e9cc-5bb3-bff4-9bd88ea4c271","html":"<h2 id=\"wﾟдﾟw-또-시작\" style=\"position:relative;\"><a href=\"#w%EF%BE%9F%D0%B4%EF%BE%9Fw-%EB%98%90-%EC%8B%9C%EC%9E%91\" aria-label=\"wﾟдﾟw 또 시작 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>w(ﾟДﾟ)w 또 시작</h2>\n<p>티스토리에서 블로그를 운영하다가 벨로그로 옮겨 운영을 하고, 이제는 github.io 페이지를 따로 만들어서 운영을 하게 됐다.\n왜 이렇게 많이 옮겨다녔나라는 생각이 들지만 솔직히 나도 잘 모르겠다.\n여기서 운영하다보면 저곳이 좋아보이고, 그래서 저곳으로 옮기면 이제는 또 다른 쪽이 좋아보이는 심리가 계속 지속 되었던 것 같다.\n이제는 뭔가 온전한 나의 블로그가 생겼다는 느낌을 가지고 정착을 해야 할것 같다.</p>\n<h2 id=\"뭐-할건데\" style=\"position:relative;\"><a href=\"#%EB%AD%90-%ED%95%A0%EA%B1%B4%EB%8D%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>당장은 이전에 운영하던 블로그에서의 글들을 옮겨오고, 이후에는 계속 하던 기술/공부 관련 포스트를 할 것 같다.\n여름방학부터는 이전에 시도해보지 않았던 아예 새로운 분야를 공부하게 되기도 하고, 지금도 조금씩은 하고 있었지만 이제는 정말로 알고리즘 공부도 열심히 해야한다.\n정보처리기사, 토익 등 취업 관련 해서 하는 공부들에 관해서도 올릴 예정이다.</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#w%EF%BE%9F%D0%B4%EF%BE%9Fw-%EB%98%90-%EC%8B%9C%EC%9E%91\">w(ﾟДﾟ)w 또 시작</a></li>\n<li><a href=\"#%EB%AD%90-%ED%95%A0%EA%B1%B4%EB%8D%B0\">뭐 할건데?</a></li>\n</ul>\n</div>","frontmatter":{"date":"June 01, 2022","title":"새 블로그 시작","categories":"기타 featured","author":"김형진","emoji":"🏋️‍♀️"},"fields":{"slug":"/start/"}},"prev":{"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>","frontmatter":{"date":"June 02, 2022","title":"[React Native] Firebase를 이용한 Android 구글 로그인 1","categories":"개발 featured","author":"김형진","emoji":"📱"},"fields":{"slug":"/react-native-google-login-1/"}},"site":{"siteMetadata":{"siteUrl":"https://hhjj0506.github.io","comments":{"utterances":{"repo":"hhjj0506/hhjj0506.github.io"}}}}},"pageContext":{"slug":"/react-native-google-login-2/","nextSlug":"/start/","prevSlug":"/react-native-google-login-1/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}