diff --git a/next.config.mjs b/next.config.mjs
index 8a661c9..714926b 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -1,9 +1,15 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
- domains: [
- 'deving-bucket.s3.ap-northeast-2.amazonaws.com',
- 'helpx.adobe.com',
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 'deving-bucket.s3.ap-northeast-2.amazonaws.com',
+ },
+ {
+ protocol: 'https',
+ hostname: 'helpx.adobe.com',
+ },
],
},
async redirects() {
diff --git a/package.json b/package.json
index bd5c20b..f2254c9 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,8 @@
"version": "0.1.0",
"private": true,
"scripts": {
- "dev": "node server.js",
+ "dev": "next dev",
+ "dev:https": "node server.js",
"build": "next build",
"start": "next start",
"lint": "next lint",
diff --git a/server.js b/server.js
index b108c54..2a5c450 100644
--- a/server.js
+++ b/server.js
@@ -1,15 +1,15 @@
-import { readFileSync } from 'fs';
-import { createServer } from 'https';
-import next from 'next';
-import { parse } from 'url';
+const { createServer } = require('https');
+const { parse } = require('url');
+const next = require('next');
+const fs = require('fs');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
const httpsOptions = {
- key: readFileSync('./localhost-key.pem'),
- cert: readFileSync('./localhost.pem'),
+ key: fs.readFileSync('./localhost-key.pem'),
+ cert: fs.readFileSync('./localhost.pem'),
};
app.prepare().then(() => {
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 23acfcd..d51f8ed 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,7 +1,7 @@
import Header from '@/components/common/Header';
import { ToastProvider } from '@/components/common/ToastContext';
import ReactQueryProviders from '@/hooks/useReactQuery';
-import { authAPI } from '@/lib/axios/authApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import type { Metadata } from 'next';
import localFont from 'next/font/local';
@@ -24,7 +24,7 @@ const pretendard = localFont({
async function getUserInfo() {
try {
- const { data } = await authAPI.get('/api/v1/mypage/banner');
+ const { data } = await axiosInstance.get('/api/v1/mypage/banner');
return data.data;
} catch (error) {
return null;
@@ -36,13 +36,14 @@ export default async function RootLayout({
children: React.ReactNode;
}>) {
const userInfo = await getUserInfo();
+ console.log('[layout] userInfo', userInfo);
return (
-
+
{children}
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
index af4df5d..78c3b10 100644
--- a/src/app/login/page.tsx
+++ b/src/app/login/page.tsx
@@ -1,5 +1,4 @@
-import { Button } from '@/components/ui/Button';
-import { baseURL } from '@/lib/axios/defaultConfig';
+import { baseURL } from '@/lib/axios/axiosInstance';
import DummyUser from './_features/DummyUser';
import LoginForm from './_features/LoginForm';
diff --git a/src/app/page.tsx b/src/app/page.tsx
index f8faca8..105ebdb 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -36,7 +36,7 @@ export default function Home() {
members: 8,
maxMembers: 10,
location: '온라인',
- imageUrl: '/api/placeholder/300/160',
+ // imageUrl: '/api/placeholder/300/160',
},
{
title: '주말 모각코 모임',
@@ -44,7 +44,7 @@ export default function Home() {
members: 12,
maxMembers: 20,
location: '서울 강남',
- imageUrl: '/api/placeholder/300/160',
+ // imageUrl: '/api/placeholder/300/160',
},
{
title: 'AI 챗봇 프로젝트',
@@ -52,7 +52,7 @@ export default function Home() {
members: 4,
maxMembers: 6,
location: '온라인/오프라인',
- imageUrl: '/api/placeholder/300/160',
+ // imageUrl: '/api/placeholder/300/160',
},
];
@@ -129,7 +129,7 @@ export default function Home() {
>
{
);
};
-const Header = ({ userInfo }: { userInfo: IUserInfo }) => {
+const Header = () => {
const [isOpen, setIsOpen] = useState(false);
+ const { data: userInfo, isLoading } = useBannerQueries();
+ const userId = undefined;
const isLogIn = !!userInfo;
+
+ console.log('[Header] userInfo: ', userInfo, 'isLogIn: ', isLogIn);
+ // 유저 정보 꺼내기
+ // const queryClient = useQueryClient();
+
+ // const userInfo = queryClient.getQueryData(QUERY_KEYS.banner())
+
return (
{/* desktop */}
diff --git a/src/hooks/mutations/useMeetingFormMutation.ts b/src/hooks/mutations/useMeetingFormMutation.ts
index e2c20e8..997786f 100644
--- a/src/hooks/mutations/useMeetingFormMutation.ts
+++ b/src/hooks/mutations/useMeetingFormMutation.ts
@@ -1,4 +1,4 @@
-import { authAPI } from '@/lib/axios/authApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import { useMutation } from '@tanstack/react-query';
import { meetingURL } from 'service/api/endpoints';
import { CreateMeetingPayload } from 'types/meetingForm';
@@ -16,7 +16,7 @@ const useMeetingFormMutation = ({
}) => {
const createMeeting = useMutation({
mutationFn: async (formData: CreateMeetingPayload) => {
- const response = await authAPI.post
(
+ const response = await axiosInstance.post(
meetingURL.create,
formData,
);
diff --git a/src/hooks/mutations/useUserMutation.ts b/src/hooks/mutations/useUserMutation.ts
index 8b8459a..52bb981 100644
--- a/src/hooks/mutations/useUserMutation.ts
+++ b/src/hooks/mutations/useUserMutation.ts
@@ -1,6 +1,10 @@
import { useToast } from '@/components/common/ToastContext';
-import { setAccessToken } from '@/lib/serverActions';
-import { useMutation } from '@tanstack/react-query';
+import { setAccessToken, setRefreshToken } from '@/lib/serverActions';
+import {
+ QueryClient,
+ useMutation,
+ useQueryClient,
+} from '@tanstack/react-query';
import {
getEmailCheck,
getNameCheck,
@@ -9,21 +13,26 @@ import {
} from 'service/api/user';
import { ISignupFormData } from 'types/auth';
+import { QUERY_KEYS } from '../queries/useMyPageQueries';
+
const useLoginMutation = ({
onSuccessCallback,
}: {
onSuccessCallback: () => void;
}) => {
const { showToast } = useToast();
+ const queryClient = useQueryClient();
+
return useMutation({
mutationFn: ({ email, password }: { email: string; password: string }) =>
postLogin({ email, password }),
onSuccess: async (res) => {
- // 쿠키 저장
- const accessToken = res.headers.token;
- if (accessToken) {
- await setAccessToken(accessToken);
- }
+ // 유저 정보 불러오기
+ console.log('유저 정보 invalidate');
+ // queryClient.invalidateQueries({ queryKey: QUERY_KEYS.banner() });
+
+ // refreshToken 저장
+ await setRefreshToken(res.refreshToken);
showToast('로그인 성공', 'success');
// 메인페이지로 리다이렉트
diff --git a/src/hooks/queries/useMyPageQueries.ts b/src/hooks/queries/useMyPageQueries.ts
index 4b5bafd..15291a5 100644
--- a/src/hooks/queries/useMyPageQueries.ts
+++ b/src/hooks/queries/useMyPageQueries.ts
@@ -43,7 +43,7 @@ export const useProfileQuery = (options = {}) => {
export const useBannerQueries = (options = {}) => {
return useQuery({
queryKey: QUERY_KEYS.banner(),
- queryFn: () => getBanner(),
+ queryFn: getBanner,
staleTime: 5 * 60 * 1000, // 5분 동안 fresh 상태 유지
...options,
});
diff --git a/src/lib/axios/authApi.ts b/src/lib/axios/authApi.ts
deleted file mode 100644
index 4ae9fa4..0000000
--- a/src/lib/axios/authApi.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import axios from 'axios';
-
-import { getAccessToken, removeAccessToken } from '../serverActions';
-import { defaultConfig } from './defaultConfig';
-
-export const authAPI = axios.create(defaultConfig);
-
-authAPI.interceptors.request.use(
- async (config) => {
- const accessToken = await getAccessToken();
- if (accessToken) {
- config.headers.token = `${accessToken}`;
- }
- return config;
- },
- async (error) => {
- /**
- * TODO
- * 에러 발생했다는 팝업, 모달 추가
- */
- return Promise.reject(error);
- },
-);
-
-authAPI.interceptors.response.use(
- (response) => response,
- async (error) => {
- /**
- * TODO:(refresh 토큰 발급 이후)
- * - 토근 재발급 로직
- */
-
- /**
- * - 401 에러로 실패하면, 로그인 페이지로 리다이렉트하는 로직
- * - 리다이렉트 전에 사용자에게 경고 메시지
- */
- if (error.response?.status === 401) {
- await removeAccessToken();
- window.location.href = '/login';
- }
- return Promise.reject(error);
- },
-);
diff --git a/src/lib/axios/axiosInstance.ts b/src/lib/axios/axiosInstance.ts
new file mode 100644
index 0000000..a519cc8
--- /dev/null
+++ b/src/lib/axios/axiosInstance.ts
@@ -0,0 +1,108 @@
+import axios from 'axios';
+
+import {
+ getRefreshToken,
+ removeAccessToken,
+ removeRefreshToken,
+} from '../serverActions';
+
+export const baseURL = process.env.NEXT_PUBLIC_API_URL;
+
+const axiosInstance = axios.create({
+ baseURL,
+ withCredentials: true,
+ timeout: 10000,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+});
+
+// 토큰 갱신 중인지 여부를 확인하는 플래그
+let isRefreshing = false;
+let refreshSubscribers: (() => void)[] = [];
+
+// 모든 대기 중인 요청을 재시도하는 함수
+const onAccessTokenFetched = () => {
+ refreshSubscribers.forEach((callback) => callback());
+ refreshSubscribers = []; // 모든 요청이 처리되었기에 배열 초기화
+};
+axiosInstance.interceptors.request.use(
+ async (config) => {
+ console.log(`[API Request] ${config.method?.toUpperCase()} ${config.url}`);
+ return config;
+ },
+ async (error) => {
+ return Promise.reject(error);
+ },
+);
+
+axiosInstance.interceptors.response.use(
+ (response) => response,
+ async (error) => {
+ /**
+ * TODO:(refresh 토큰 발급 이후)
+ * - 토근 재발급 로직
+ */
+
+ /**
+ * - 401 에러로 실패하면, 로그인 페이지로 리다이렉트하는 로직
+ * - 리다이렉트 전에 사용자에게 경고 메시지
+ */
+ if (error.response?.status === 401) {
+ // await removeAccessToken();
+ console.log('401 Unauthorized - 토큰 재발급 시도');
+
+ const refreshToken = await getRefreshToken();
+ console.log('refreshToken: ', refreshToken);
+
+ if (!refreshToken) {
+ console.log('Refresh Token 없음 -> 강제 로그아웃');
+ await removeAccessToken();
+ await removeRefreshToken();
+ window.location.href = '/login';
+ return Promise.reject(error);
+ }
+
+ if (!isRefreshing) {
+ isRefreshing = true;
+
+ try {
+ // Refresh Token으로 Access Token 재발급 시도
+ await axios.post(
+ 'https://deving.shop/api/v1/auths/refresh',
+ {
+ refreshToken,
+ },
+ { withCredentials: true },
+ );
+
+ isRefreshing = false;
+
+ // 대기중인 요청들을 새로운 access token으로 실행
+ onAccessTokenFetched();
+ // ✅ 기존 요청 다시 실행 (Access Token 갱신 후)
+ return axiosInstance(error.config);
+ } catch (refreshError) {
+ console.error('Refresh Token 만료 -> 강제 로그아웃');
+
+ // Refresh Token이 만료되었다면 강제 로그아웃 및 로그인 페이지 이동
+ await removeAccessToken();
+ await removeRefreshToken();
+ window.location.href = '/login';
+ return Promise.reject(refreshError);
+ }
+ } else {
+ // refresh token 요청이 진행 중이라면 대기 (Promise를 반환)
+
+ return new Promise((resolve) => {
+ refreshSubscribers.push(() => {
+ resolve(axiosInstance(error.config)); // 기존의 요청을 새로운 토큰으로 재시도
+ });
+ });
+ }
+ }
+ return Promise.reject(error);
+ },
+);
+
+export default axiosInstance;
diff --git a/src/lib/axios/basicApi.ts b/src/lib/axios/basicApi.ts
deleted file mode 100644
index e1d9a24..0000000
--- a/src/lib/axios/basicApi.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import axios from 'axios';
-
-import { defaultConfig } from './defaultConfig';
-
-export const basicAPI = axios.create(defaultConfig);
diff --git a/src/lib/axios/defaultConfig.ts b/src/lib/axios/defaultConfig.ts
deleted file mode 100644
index aa2e131..0000000
--- a/src/lib/axios/defaultConfig.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { AxiosRequestConfig } from 'axios';
-
-export const baseURL = process.env.NEXT_PUBLIC_API_URL;
-
-export const defaultConfig: AxiosRequestConfig = {
- baseURL,
- withCredentials: true,
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json',
- },
-};
diff --git a/src/lib/serverActions.ts b/src/lib/serverActions.ts
index d5b1062..122b01f 100644
--- a/src/lib/serverActions.ts
+++ b/src/lib/serverActions.ts
@@ -7,9 +7,19 @@ export async function getAccessToken() {
return cookieStore.get('token')?.value || null;
}
+export async function getRefreshToken() {
+ const cookieStore = cookies();
+ return cookieStore.get('refreshToken')?.value || null;
+}
+
export async function removeAccessToken() {
const cookieStore = cookies();
- cookieStore.delete('token');
+ cookieStore.delete('access_token');
+}
+
+export async function removeRefreshToken() {
+ const cookieStore = cookies();
+ cookieStore.delete('refreshToken');
}
export async function setAccessToken(token: string) {
@@ -17,7 +27,19 @@ export async function setAccessToken(token: string) {
const isProd = process.env.NODE_ENV === 'production';
cookieStore.set('token', token, {
httpOnly: true,
- // sameSite: 'strict', // 개발환경에서는 불필요
+ sameSite: 'none',
+ secure: true,
+ path: '/',
+ domain: isProd ? process.env.COOKIE_DOMAIN : undefined,
+ maxAge: parseInt(process.env.NEXT_TOKEN_MAX_AGE as string) || 60 * 60,
+ });
+}
+
+export async function setRefreshToken(token: string) {
+ const cookieStore = cookies();
+ const isProd = process.env.NODE_ENV === 'production';
+ cookieStore.set('refreshToken', token, {
+ httpOnly: true,
sameSite: 'none',
secure: true,
path: '/',
diff --git a/src/service/api/comment.ts b/src/service/api/comment.ts
index ba4968e..5375bd7 100644
--- a/src/service/api/comment.ts
+++ b/src/service/api/comment.ts
@@ -1,5 +1,4 @@
-import { authAPI } from '@/lib/axios/authApi';
-import { basicAPI } from '@/lib/axios/basicApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
export interface ICommentsCount {
fives: number;
@@ -48,7 +47,7 @@ export interface Comments {
}
const getCommentsCount = async (meetingId: number): Promise => {
- const res = await basicAPI.get(`/api/v1/comments/count/${meetingId}`);
+ const res = await axiosInstance.get(`/api/v1/comments/count/${meetingId}`);
return res.data.data;
};
@@ -56,7 +55,7 @@ const getCommentsMeeting = async (
meetingId: number,
lastCommentId: number,
): Promise => {
- const res = await basicAPI.get(
+ const res = await axiosInstance.get(
`/api/v1/comments/${meetingId}?lastCommentId=${lastCommentId}&size=3`,
);
return res.data.data;
@@ -66,7 +65,7 @@ const postComment = async (
meetingId: number,
req: { score: number; content: string },
) => {
- const res = await authAPI.post(`/api/v1/comments/${meetingId}`, req);
+ const res = await axiosInstance.post(`/api/v1/comments/${meetingId}`, req);
return res.data.data;
};
diff --git a/src/service/api/meeting.ts b/src/service/api/meeting.ts
index 34cff72..eb38ff8 100644
--- a/src/service/api/meeting.ts
+++ b/src/service/api/meeting.ts
@@ -1,5 +1,4 @@
-import { authAPI } from '@/lib/axios/authApi';
-import { basicAPI } from '@/lib/axios/basicApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import { getAccessToken } from '@/lib/serverActions';
import type {
CategoryTitle,
@@ -14,7 +13,7 @@ const getTopMeetings = async (
): Promise => {
const token = await getAccessToken();
- const res = await (token ? authAPI : basicAPI).get(`/api/v1/meetings/top`, {
+ const res = await axiosInstance.get(`/api/v1/meetings/top`, {
params: { categoryTitle },
});
@@ -29,7 +28,7 @@ const getMeetings = async (
const newSearchQueryObj = { ...searchQueryObj, lastMeetingId: pageParams };
const token = await getAccessToken();
- const res = await (token ? authAPI : basicAPI).post(
+ const res = await axiosInstance.post(
`/api/v1/meetings/search?categoryTitle=${category}`,
newSearchQueryObj,
);
@@ -38,13 +37,13 @@ const getMeetings = async (
};
const likeMeeting = async (meetingId: number) => {
- const res = await authAPI.post(`/api/v1/meetings/${meetingId}/likes`);
+ const res = await axiosInstance.post(`/api/v1/meetings/${meetingId}/likes`);
return res.data.data;
};
const cancelLikeMeeting = async (meetingId: number) => {
- const res = await authAPI.delete(`/api/v1/meetings/${meetingId}/likes`);
+ const res = await axiosInstance.delete(`/api/v1/meetings/${meetingId}/likes`);
return res.data.data;
};
@@ -74,12 +73,12 @@ export interface MeetingManager {
}
const getMeetingDetail = async (id: number): Promise => {
- const res = await authAPI.get(`/api/v1/meetings/detail/${id}`);
+ const res = await axiosInstance.get(`/api/v1/meetings/detail/${id}`);
return res.data.data;
};
const getMeetingDetailManager = async (id: number): Promise => {
- const res = await basicAPI.get(`/api/v1/meetings/detail/manager/${id}`);
+ const res = await axiosInstance.get(`/api/v1/meetings/detail/manager/${id}`);
return res.data.data;
};
@@ -91,13 +90,17 @@ const postMeetingRegister = async ({
meetingId: number;
message: string;
}) => {
- const res = await authAPI.post(`/api/v1/members/${meetingId}`, { message });
+ const res = await axiosInstance.post(`/api/v1/members/${meetingId}`, {
+ message,
+ });
return res.data.data;
};
// Approve 상태에서 모임 탈퇴
const deleteMeetingQuit = async (meetingId: number) => {
- const res = await authAPI.delete(`/api/v1/mymeetings/quit/${meetingId}`);
+ const res = await axiosInstance.delete(
+ `/api/v1/mymeetings/quit/${meetingId}`,
+ );
return res.data.data;
};
diff --git a/src/service/api/meetingForm.ts b/src/service/api/meetingForm.ts
index 37b110b..5a62c9c 100644
--- a/src/service/api/meetingForm.ts
+++ b/src/service/api/meetingForm.ts
@@ -1,10 +1,10 @@
-import { authAPI } from '@/lib/axios/authApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import { CreateMeetingPayload } from 'types/meetingForm';
import { meetingURL } from './endpoints';
export const createMeeting = async (data: CreateMeetingPayload) => {
- const response = await authAPI.post(meetingURL.create, data);
+ const response = await axiosInstance.post(meetingURL.create, data);
return response.data;
};
diff --git a/src/service/api/mymeeting.ts b/src/service/api/mymeeting.ts
index 3b9e6b9..f8995b6 100644
--- a/src/service/api/mymeeting.ts
+++ b/src/service/api/mymeeting.ts
@@ -1,4 +1,4 @@
-import { authAPI } from '@/lib/axios/authApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import { Paginated } from 'types/meeting';
import type { IMemberProfile, IMyMeetingManage } from 'types/myMeeting';
@@ -8,7 +8,7 @@ import { myMeetingURL } from './endpoints';
const getMyMeetingManage = async (
lastMeetingId: number,
): Promise> => {
- const res = await authAPI.get(
+ const res = await axiosInstance.get(
`${myMeetingURL.manage}?lastMeetingId=${lastMeetingId}&size=${6}`,
);
@@ -19,7 +19,7 @@ const getMyMeetingManage = async (
const getMyMeetingParticipated = async (
lastMeetingId: number,
): Promise> => {
- const res = await authAPI.get(
+ const res = await axiosInstance.get(
`${myMeetingURL.all}?lastMeetingId=${lastMeetingId}&size=${6}`,
);
@@ -34,7 +34,7 @@ const getMyMeetingMemberProfile = async ({
userId?: number;
meetingId: number;
}): Promise => {
- const res = await authAPI.get(
+ const res = await axiosInstance.get(
`${myMeetingURL.memberProfile}?userId=${userId}&meetingId=${meetingId}`,
);
@@ -51,7 +51,7 @@ const putMemberStatus = async ({
meetingId: number;
setMemberStatus: 'APPROVED' | 'REJECTED';
}) => {
- const res = await authAPI.put(`${myMeetingURL.memberStatus}`, {
+ const res = await axiosInstance.put(`${myMeetingURL.memberStatus}`, {
userId,
meetingId,
setMemberStatus,
@@ -70,7 +70,7 @@ const putExpel = async ({
meetingId: number;
setMemberStatus: 'EXPEL';
}) => {
- const res = await authAPI.put(`${myMeetingURL.expel}`, {
+ const res = await axiosInstance.put(`${myMeetingURL.expel}`, {
userId,
meetingId,
setMemberStatus,
@@ -81,7 +81,7 @@ const putExpel = async ({
// 공개 / 비공개 설정
const putIsPublic = async (meetingId: number) => {
- const res = await authAPI.put(`${myMeetingURL.isPublic(meetingId)}`);
+ const res = await axiosInstance.put(`${myMeetingURL.isPublic(meetingId)}`);
return res.data.data;
};
diff --git a/src/service/api/mypageProfile.ts b/src/service/api/mypageProfile.ts
index 5e46d03..62d6cbb 100644
--- a/src/service/api/mypageProfile.ts
+++ b/src/service/api/mypageProfile.ts
@@ -1,4 +1,4 @@
-import { authAPI } from '@/lib/axios/authApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import { fileToBase64 } from '@/util/imageBase64';
import { IBanner } from 'types/myMeeting';
@@ -17,7 +17,7 @@ import {
// 프로필 조회 API 함수 (통합된 엔드포인트)
export const getProfile = async (): Promise => {
try {
- const response = await authAPI.get('/api/v1/mypage/profile');
+ const response = await axiosInstance.get('/api/v1/mypage/profile');
return response.data;
} catch (error) {
throw error;
@@ -29,7 +29,10 @@ export const updateProfile = async (
profileData: IProfileUpdateRequest,
): Promise => {
try {
- const response = await authAPI.put('/api/v1/mypage/profile', profileData);
+ const response = await axiosInstance.put(
+ '/api/v1/mypage/profile',
+ profileData,
+ );
return response.data;
} catch (error) {
throw error;
@@ -41,7 +44,10 @@ export const updateContactInfo = async (
contactData: IContactInfoUpdateRequest,
): Promise => {
try {
- const response = await authAPI.put('/api/v1/mypage/contact', contactData);
+ const response = await axiosInstance.put(
+ '/api/v1/mypage/contact',
+ contactData,
+ );
return response.data;
} catch (error) {
throw error;
@@ -62,7 +68,7 @@ export const updateProfileImage = async (
profilePicName: file.name,
};
- const response = await authAPI.put(
+ const response = await axiosInstance.put(
'/api/v1/mypage/profilepic',
requestData,
);
@@ -77,7 +83,10 @@ export const updatePassword = async (
passwordData: IPasswordUpdateRequest,
): Promise => {
try {
- const response = await authAPI.put('/api/v1/mypage/password', passwordData);
+ const response = await axiosInstance.put(
+ '/api/v1/mypage/password',
+ passwordData,
+ );
return response.data;
} catch (error) {
throw error;
@@ -89,7 +98,7 @@ export const updateSkills = async (
skillArray: string[],
): Promise => {
try {
- const response = await authAPI.post('/api/v1/mypage/skills', {
+ const response = await axiosInstance.post('/api/v1/mypage/skills', {
skillArray,
});
return response.data;
@@ -99,7 +108,11 @@ export const updateSkills = async (
};
// 배너 정보 불러오기
-export const getBanner = async (): Promise => {
- const res = await authAPI.get('/api/v1/mypage/banner');
- return res.data.data;
+export const getBanner = async (): Promise => {
+ try {
+ const res = await axiosInstance.get('/api/v1/mypage/banner');
+ return res.data.data;
+ } catch (error) {
+ return null;
+ }
};
diff --git a/src/service/api/user.ts b/src/service/api/user.ts
index 80dc0f4..1b243d5 100644
--- a/src/service/api/user.ts
+++ b/src/service/api/user.ts
@@ -1,4 +1,4 @@
-import { basicAPI } from '@/lib/axios/basicApi';
+import axiosInstance from '@/lib/axios/axiosInstance';
import { ISignupFormData } from 'types/auth';
const postLogin = async ({
@@ -8,23 +8,28 @@ const postLogin = async ({
email: string;
password: string;
}) => {
- const res = await basicAPI.post('/api/v1/auths/login', { email, password });
+ const res = await axiosInstance.post('/api/v1/auths/login', {
+ email,
+ password,
+ });
- return res;
+ return res.data.data;
};
const getNameCheck = async (name: string) => {
- const res = await basicAPI.get(`/api/v1/auths/signup/name?name=${name}`);
+ const res = await axiosInstance.get(`/api/v1/auths/signup/name?name=${name}`);
return res;
};
const getEmailCheck = async (email: string) => {
- const res = await basicAPI.get(`/api/v1/auths/signup/email?email=${email}`);
+ const res = await axiosInstance.get(
+ `/api/v1/auths/signup/email?email=${email}`,
+ );
return res;
};
const postSignup = async (data: ISignupFormData) => {
- const res = await basicAPI.post('/api/v1/auths/signup', data);
+ const res = await axiosInstance.post('/api/v1/auths/signup', data);
return res;
};