본문 바로가기
TIL

[TIL] next-auth, fetch vs axios, react-query vs axios

by Devry 2024. 2. 28.

 

아슬아슬하게 일어나서 8시 58분 쯤 스터디 카페 도착

정보처리기사 실기 시즌이 다가와서 오랜만에 계획에 넣었는데 분량 조절을 실패해서 토익 공부를 빼버렸기에

어길 시 벌칙을 하는 ToDo랑 선택사항의 ToDo를 구별할 필요성이 생겼다

 

 

TIL

프로젝트

 

1. next-auth ( 구글, 카카오, 네이버 Provider )

프로젝트에서 로그인을 우선으로 구현하려고 했는데 Next.js에서는 next-auth로 auth 공급자를 관리하는 기능이 있어서 적용하였다

우선 Google Cloud에서 프로젝트를 생성하고 client id와 client secret을 생성해야 하는데 이부분은 생략하겠다(네이버 카카오도 마찬가지로 시크릿 키를 생성해야 한다)

 

공식 문서

 

src/app/api/auth/[...nextauth]/route.ts 경로에 다음 코드를 작성한다

import NextAuth from 'next-auth'
import GoogleProvider from 'next-auth/providers/google'
import KakaoProvider from 'next-auth/providers/kakao'
import NaverProvider from 'next-auth/providers/naver'

const handler = NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID || '',
      clientSecret: process.env.GOOGLE_CLIENT_SECRET || '',
    }),
    KakaoProvider({
      clientId: process.env.KAKAO_CLIENT_ID || '',
      clientSecret: process.env.KAKAO_CLIENT_SECRET || '',
    }),
    NaverProvider({
      clientId: process.env.NAVER_CLIENT_ID || '',
      clientSecret: process.env.NAVER_CLIENT_SECRET || '',
    }),
  ],
})

export {handler as GET, handler as POST}

 

[...nextauth]는 가변 동적 라우팅을 하는 부분으로 auth/ 이하 경로를 배열 형식으로 담아준다

|| "" 를 입력해준 이유는 Typescript를 사용하면 undefined가 될 수 있기 때문에 그럴 경우 빈 문자열을 주어 string으로 제한해야 한다

 

components/provider/AuthProvider.tsx 에 다음과 같이 작성한다

'use client'
import React, {ReactNode} from 'react'
import {SessionProvider} from 'next-auth/react'

interface AuthProviderProps {
  children: ReactNode
}

const AuthProvider = ({children}: AuthProviderProps) => {
  return <SessionProvider>{children}</SessionProvider>
}

export default AuthProvider

 

이제 AuthProvider 컴포넌트를 최상위 레이아웃인 app/layout.tsx에서 사용한다

import type {Metadata} from 'next'
import {Inter} from 'next/font/google'
import './globals.css'
import AuthProvider from '@/components/provider/AuthProvider'

const inter = Inter({subsets: ['latin']})

export const metadata: Metadata = {
  title: '',
  description:
    '',
}

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <AuthProvider>{children}</AuthProvider>
      </body>
    </html>
  )
}

 

이제 페이지를 만들어서 로그인 session을 사용할 수 있다

'use client'
import {signIn, signOut, useSession} from 'next-auth/react'
import React from 'react'

const Login = () => {
  const session = useSession()
  console.log(session)
  return (
    <div>
      {session.data ? (
        <li>
          <button onClick={() => signOut()}>Sign out</button>
        </li>
      ) : (
        <>
          <li>
            <button onClick={() => signIn('google')}>Sign in with Google</button>
          </li>
          <li>
            <button onClick={() => signIn('kakao')}>Sign in with Kakao</button>
          </li>
          <li>
            <button onClick={() => signIn('naver')}>Sign in with Naver</button>
          </li>
        </>
      )}
    </div>
  )
}

export default Login

 

 

 

 

2. axios vs react-query

이 부분은 아직 자세히 학습하진 않았고 왜 react-query를 도입하고 axios는 왜 사용하지 않는 지에 대해 알아본 내용이다

여태까지 진행했던 모든 https 통신을 사용한 프로젝트는 axios로 구현했는데 baseUrl, 인터셉터,  timeout등의 기능을 사용할 수 있는 장점 때문이었다.

이번 프로젝트는 동영상을 다루기도 하고 Next.js로 데이터 페칭을 다루다 보니 react-query를 도입할지를 결정해야 했는데 

react-query에서는 자체적으로 캐싱, 상태관리, 리프레시를 다루기 때문에 axios를 사용할 필요 없고 fetch를 권장한다고 한다

 

 

 

 

 

NextAuth.js 구글 로그인 구현 (Next버전 13.4.2)

[NextJS] Google OAuth 연동(feat.next-auth)

댓글