Post

맛집 앱 만들기 프로젝트 Part13 React Query 사용 및 API추가하기

React Query란

리액트 쿼리는 서버 데이터를 가져오고 캐싱하고 동기화하면 업데이트해주는 라이브러리이다

React Query 설치

(프론트 프로젝트 폴더에서)

1
npm i @tanstack/react-query

React Query에서 사용할 데이터 타입들을 미리 지정해두자

[matzip/front/src/types/domain.ts]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
type MarkerColor = 'RED' | 'YELLOW' | 'GREEN' | 'BLUE' | 'PURPLE';

type Category = {
  [key in MarkerColor]: string;
};

interface ImageUri {
  id?: number;
  uri: string;
}

interface Marker {
  id: number;
  latitude: number;
  longitude: number;
  color: MarkerColor;
  score: number;
}

interface Post extends Marker {
  title: string;
  address: string;
  date: Date | string;
  description: string;
}

interface Profile {
  id: number;
  email: string;
  nickname: string | null;
  imageUri: string | null;
  kakaoImageUri: string | null;
  loginType: 'email' | 'kakao' | 'apple';
}
export type {MarkerColor, Category, ImageUri, Marker, Post, Profile};

API전용 폴더도 생성하여 API호출 관련 소스들은 해당 폴더에서 관리하도록하자

[matzip/front/src/api/auth.ts]

해당 파일은 API를 요청하는 함수를 담아둔 파일로 로그인,회원가입,데이터조회 등 API함수들을 담아두도록한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import axios from 'axios';
import axiosInstance from './axios';
import {Category, Profile} from '../types/domain';
import {getEncryptStorage} from '../utils';

type RequestUser = {
  email: string;
  password: string;
};
// 회원가입
const postSignup = async ({email, password}: RequestUser): Promise<void> => {
  try {
    console.log(`step2 PostSignup 호출됨 `);
    const {data, status} = await axiosInstance.post('/auth/signup', {
      email,
      password,
    });
    console.log(status);
    return data;
  } catch (e) {
    console.log(e);
  }
};
type ResponseToken = {
  accessToken: string;
  refreshToken: string;
};

// 로그인
const postLogin = async ({
  email,
  password,
}: RequestUser): Promise<ResponseToken> => {
  const {data} = await axiosInstance.post('/auth/signin', {
    email,
    password,
  });
  return data;
};

// 유저 정보 불러오기
type ResponseProfile = Profile & Category;
const getProfile = async (): Promise<ResponseProfile> => {
  const {data} = await axiosInstance.get('/auth/me');
  return data;
};

// 토큰 갱신 함수
const getAccessToken = async (): Promise<ResponseToken> => {
  const refreshToken = await getEncryptStorage('refreshToken');
  const {data} = await axiosInstance.get('/auth/refresh', {
    headers: {
      Authorization: `Bearer ${refreshToken}`,
    },
  });
  return data;
};

// 사용자 로그아웃함수
const logout = async () => {
  await axiosInstance.post('/auth/logout');
};
export {postSignup, postLogin, getProfile, getAccessToken, logout};
export type {RequestUser, ResponseToken, ResponseProfile};

[matzip/front/src/api/auth.ts]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import axios from 'axios';

import {Platform} from 'react-native';

// axios에서 제공하는 creact함수로 baseURL 지정이 가능하다 
const axiosInstance = axios.create({
  baseURL:
    Platform.OS === 'android'
      ? 'http://192.168.0.25:3030'
      : 'http://localhost:3030',

  withCredentials: true,
});

export default axiosInstance;

This post is licensed under CC BY 4.0 by the author.