<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>suk-bong-2.log</title>
        <link>https://velog.io/</link>
        <description>개발하는 석봉이</description>
        <lastBuildDate>Sun, 12 Nov 2023 14:56:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. suk-bong-2.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/suk-bong-2" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[파이어베이스로 카카오로그인 하기]]></title>
            <link>https://velog.io/@suk-bong-2/%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A1%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@suk-bong-2/%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A1%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 12 Nov 2023 14:56:09 GMT</pubDate>
            <description><![CDATA[<p>Firebase를 사용하면 백엔드를 구축하지 않고 빠르게 프로토타입을 만들 수 있습니다.(라고 하더군요) 하지만 대한민국에서 사용하려면 아무래도 카카오로그인이 필요한 것 같습니다. </p>
<p>문제는 파이어베이스에서 카카오 로그인을 지원해주지 않고 있습니다. 그래서 열심히 구글링을해서 찾아보니 커스텀토큰을 사용하는 방법이 나오지만 초보의 입장에서 너무 어려웠습니다. 특히 access token까지는 알겠는데 verify token 처리는 못하는 것 같더라구요. </p>
<p>열심히 구글링하다가 OpenID Connect(OIDC)? 라는 것을 찾았습니다. 카카오 개발자 포럼에도 OIDC를 지원한다고 나와있어서 OIDC를 사용해보기로 했습니다.</p>
<p><img src="https://velog.velcdn.com/images/suk-bong-2/post/7a033a71-2792-4a2b-beb4-2c0dbb97d86b/image.png" alt="">
여기서 restapi키가 필요하고요.</p>
<p><img src="https://velog.velcdn.com/images/suk-bong-2/post/ea77bc5b-0ec0-44f0-8878-f75db88bee73/image.png" alt="">
보안에 들어갑니다.
<img src="https://velog.velcdn.com/images/suk-bong-2/post/db06c795-7403-4e5b-85b2-263f06be5748/image.png" alt="">
Secret키를 발급받습니다. <img src="https://velog.velcdn.com/images/suk-bong-2/post/00fd9320-8b1f-4a0a-9f97-1bd990f3f57b/image.png" alt="">
OIDC도 활성화합니다.</p>
<p>이제 Firebase의 설정으로 갑니다.
<img src="https://velog.velcdn.com/images/suk-bong-2/post/45a18735-c8d5-434d-a0df-03df00c37392/image.png" alt="">
커스텀 제공업체의 OpenID Connect를 선택합니다.</p>
<p><img src="https://velog.velcdn.com/images/suk-bong-2/post/188a0c41-bcbd-4b16-94bc-6ef31828008f/image.png" alt=""></p>
<p>발급자 url은 <a href="https://kauth.kakao.com/%EC%9D%84">https://kauth.kakao.com/을</a> 입력해줍니다. 그리고 다음을 눌러주면...<img src="https://velog.velcdn.com/images/suk-bong-2/post/f450aeb7-86dc-4334-b897-384685a99cc3/image.png" alt=""></p>
<p>이렇게 콜백 url을 받을 수 있습니다. 이걸 다시 카카오 developers로 가서</p>
<p><img src="https://velog.velcdn.com/images/suk-bong-2/post/88c8a092-2137-49c5-9701-b7e56878f2a4/image.png" alt=""></p>
<p>redirect url에 입력해주면 설정은 끝이 납니다. 휴...</p>
<pre><code>&#39;use client&#39;

import { useRouter } from &quot;next/navigation&quot;
import { getAuth, OAuthProvider, signInWithRedirect } from &quot;firebase/auth&quot;
import { useEffect } from &quot;react&quot;
import { useAuth } from &quot;@/context/AuthContext&quot;

export default function Component() {
  const user = useAuth()
  const auth = getAuth()
  const router = useRouter()

  useEffect(() =&gt; {
    user.user &amp;&amp; router.push(&quot;/&quot;)
  }, [user])

  const onSubmit = async (e: any) =&gt; {
    e.preventDefault()

    const provider = new OAuthProvider(&quot;oidc.kakao&quot;)

    signInWithRedirect(auth, provider);
  }

  return (
    &lt;div className=&quot;mx-auto max-w-sm space-y-6 bg-background rounded-lg px-12 py-6&quot;&gt;
      &lt;div className=&quot;space-y-2 text-center&quot;&gt;
        &lt;h1 className=&quot;text-3xl font-bold&quot;&gt;로그인&lt;/h1&gt;
        &lt;p className=&quot;text-zinc-500 dark:text-zinc-400&quot;&gt;
          안녕하세요 반갑습니다^^
        &lt;/p&gt;
      &lt;/div&gt;
      &lt;button onClick={onSubmit} className=&quot;w-full px-4 py-2 bg-primary text-white rounded-lg hover:bg-primary/50&quot;&gt;
        카카오 로그인
      &lt;/button&gt;
    &lt;/div&gt;
  )
}</code></pre><p><img src="https://velog.velcdn.com/images/suk-bong-2/post/be18cb54-0515-40e7-b224-6c59a68453da/image.png" alt=""></p>
<p>간단한 로그인 화면을 만들었습니다. provider를 oidc.kakao로 설정하고 signInWithRedirect 메소드를 사용하면 로그인 창으로 이동합니다.</p>
<p><img src="https://velog.velcdn.com/images/suk-bong-2/post/4de5cfcc-9293-4668-9991-c62128191cea/image.png" alt=""></p>
<p>짠~ 
로그인을 하면 다시 전의 로그인 화면으로 리다이렉트 됩니다.</p>
<p>그리고 Firebase 콘솔로 가보면~
<img src="https://velog.velcdn.com/images/suk-bong-2/post/60a708be-bcd5-4460-9a72-c60cee079023/image.png" alt="">
로그인한 유저가 알아서 추가되어있는 것을 확인할 수 있습니다.</p>
<p>어찌어찌 삽질하면서 성공해서 나름 기념으로 글을 작성했습니다. </p>
<p>아무래도 취미로 개발을 하다 보니 실력이 잘 늘지가 않습니다. 그래도 여기 잘 하시는 분들 글 읽으면서 열심히 공부 중입니다. 모쪼록 이 글이 다른 분들께 도움이 되었으면 좋겠습니다. 감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 네이티브로 주간 루틴관리 앱 만들기 - 삽질 기록]]></title>
            <link>https://velog.io/@suk-bong-2/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C%EB%A1%9C-%EC%A3%BC%EA%B0%84-%EB%A3%A8%ED%8B%B4%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%82%BD%EC%A7%88-%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@suk-bong-2/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C%EB%A1%9C-%EC%A3%BC%EA%B0%84-%EB%A3%A8%ED%8B%B4%EA%B4%80%EB%A6%AC-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%82%BD%EC%A7%88-%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Mon, 09 Oct 2023 07:00:43 GMT</pubDate>
            <description><![CDATA[<p>한주간에 해야할 일은 많은데 자꾸 빼먹고 늘어지는 것 같아서 관리하는 앱을 만들기로 했습니다. 저는 취미로 개발을 하고 있어서 도저히 네이티브 앱은 건들기 싫었습니다.(이게 삽질의 시작이었나 싶습니다.)</p>
<p>이전에 아주 간단한 앱(구라탐지기 ㅋ)을 플러터로 만들어본 경험이 있어서 이번에는 다른 걸로 만들어보기로 했습니다. 그리고 다트 문법이 안쓸려다가 쓰려니까 쳐다보기 싫기도 했습니다. 처음에는 capacitor를 가지고 하이브리드 앱을 만들려고 했는데 로컬 DB쓰려니까 오히려 더 어려운 것 같아서 GG를 치고 같은 자바스크립트를 쓰는 리액트네이티브를 써서 앱을 만들기로 했습니다.</p>
<p>리액트네이티브는 처음이었는데요. 설치는 플러터 설치할 때와 비슷했습니다만 좀 더 불편했습니다. 별거 아니긴했지만 Path설정이 귀찮았습니다. 그런데 요즘은 expo도 expo prebuild가 되어서 직접 네이티브 단을 건들 수 있더군요. 그래서 이리저리 해보다가 expo로 만들기 시작했습니다.</p>
<p><img src="https://velog.velcdn.com/images/suk-bong-2/post/f2130be5-9276-4376-b34e-19418d9d4a27/image.png" alt="">
대충 디자인을 해서 만들었습니다.</p>
<p>그런데 만들다가 보니 몇년전에 플러터로 깔짝거려봤던 기억이 새록새록 납니다. 제가 취미 생활로 개발을 하는지라 딮하게 건드려보지는 못하지만 리액트네이티브 보다 플러터로 개발하는게 훨씬 안정적이었던것 같습니다. ios와 android랑 화면이 달라져요. 그리고 한쪽에서는 되는게 한쪽에서 안되어서 따로 개발해야 할 수 있습니다. </p>
<p>이번에 가장 고생한 부분은 Notifee 설치 후 build입니다. 이 녀석이 Expo SDK 49가 되면서 충돌이 난 듯 합니다. 스택오버플로우 깃허브 찾아봐도 잘 모르겠더라고요. ios에서는 알림이 잘 되는데 android에서는 계속 빌드를 실패합니다. 
<img src="https://velog.velcdn.com/images/suk-bong-2/post/de0144d4-090e-4639-be8b-98cc524a8a3e/image.png" alt=""></p>
<p>결국 제가 안드로이드 프로그래밍을 잘 몰라서 생긴 오류였습니다. 
android 폴더로 가서 build.gradle 파일에<img src="https://velog.velcdn.com/images/suk-bong-2/post/f25395f6-60d0-4eee-bede-04beb2338f8a/image.png" alt="">
요렇게 notifee 모듈의 주소를 적어주니까 빌드가 됩니다.</p>
<p>잘몰라서 고생했습니다. 그리고 eas build --local이 되더군요. aab파일이 나옵니다. ㅋㅋ</p>
<p>그런데 44mb... 단촐한 기능에 비해 너무 큰 덩치의 앱이 탄생했습니다. 플러터로 비슷한 todo앱을 만들어 봤을땐 7mb였는데, 아마도 expo로 개발해서 그런 것 같습니다.</p>
<h3 id="여차저차-느낀점주관적">여차저차 느낀점(주관적)</h3>
<ol>
<li><p>크로스 플랫폼이라고 쉬운게 아니다. 결국에 조금만 깊게 들어가면 네이티브 영역을 건드려야 한다. 아니면 누가 라이브러리 만들어 줄 때까지 존버해야함.</p>
</li>
<li><p>라이브러리 품질은 플러터 쪽이 좀 더 안정적인 듯한 느낌임.</p>
</li>
<li><p>expo로도 이제 서드파티 라이브러리 설치가 가능하다.</p>
</li>
<li><p>귀찮아서 타입스크립트 안 썼는데, 조금만 코드가 복잡해지니까 지옥도가 펼쳐진다. 귀찮아도 타입스크립트 쓰자. 자동완성도 잘 안된다.
플러터는 무조건 타입 지정해야 하니까 자동완성 하나는 잘된다. - 그런데 copilot이 코드를 잘 못짠다.</p>
</li>
<li><p>chatGPT 짱!</p>
</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>