Skip to content

Commit d63d096

Browse files
authored
Frontend/yuhoyeong/redirect uri api (#71)
## 📝작업 내용 redirectURI api 통해서 전송 및 로직 정리, 로그인 관련 로직 정리 + 계정 삭제 후 바로 가입 시 초기화 안되는 문제 해결 ( Zustand 로직 정리 )
1 parent b25b098 commit d63d096

22 files changed

+66
-617
lines changed

frontend/src/App.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@ const Router = () => {
4242
</ProtectedRoute>
4343
}
4444
/>
45-
{/* 가이드는 일시적으로 비인증 사용자도 접근 허용 */}
46-
<Route path={"/guide"} element={<Guide />} />
45+
<Route
46+
path={"/guide"}
47+
element={
48+
<ProtectedRoute>
49+
<Guide />
50+
</ProtectedRoute>
51+
}
52+
/>
4753
<Route
4854
path={"/community"}
4955
element={

frontend/src/api/debugEnv.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

frontend/src/api/userSetting/apiClient.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ export const refreshAccessToken = async (): Promise<{
3030
}
3131

3232
try {
33-
console.log('토큰 갱신 API 호출');
34-
3533
const response = await axios.post<RefreshTokenResponse>(
3634
`${import.meta.env.VITE_API_URL}/refresh`,
3735
{},
@@ -52,8 +50,6 @@ export const refreshAccessToken = async (): Promise<{
5250
// 새로운 토큰 저장
5351
setTokens(access_token, newRefreshToken || refreshToken);
5452

55-
console.log('토큰 갱신 성공');
56-
5753
return {
5854
success: true,
5955
access_token,

frontend/src/api/userSetting/initialize.ts

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useMutation } from "@tanstack/react-query";
22
import { useProfileSetupStore } from "../../stores/useProfileSetupStore";
33
import { useAuthStore } from "../../stores/useAuthStore";
4-
import { useNavigate } from "react-router-dom";
54
import type { UserData } from "../../types/user";
65
import apiClient from "./apiClient";
76

@@ -35,28 +34,18 @@ export const initialize = async (): Promise<InitializeUserResponse> => {
3534
custom_interests: tempCustomInterests && tempCustomInterests.length > 0 ? tempCustomInterests : undefined,
3635
};
3736

38-
console.log('🚀 사용자 초기화 요청:', requestBody);
39-
4037
try {
4138
const response = await apiClient.put('/users/initialize', requestBody);
4239
const result: InitializeUserResponse = response.data;
4340

44-
console.log('✅ 사용자 초기화 성공:', result);
45-
46-
// 초기화 성공 시 사용자 정보 업데이트
41+
// 임시 데이터 클리어 (사용자 정보는 useInitialize에서 처리)
4742
if (result.success && result.data) {
48-
const { setUser } = useAuthStore.getState();
49-
setUser(result.data);
50-
51-
// 임시 데이터 클리어
5243
const { clearProfileSetup } = useProfileSetupStore.getState();
5344
clearProfileSetup();
5445
}
5546

5647
return result;
5748
} catch (error: unknown) {
58-
console.error(' 사용자 초기화 실패:', error);
59-
6049
if (error && typeof error === 'object' && 'response' in error) {
6150
const axiosError = error as { response: { data: { message?: string } } };
6251
throw new Error(axiosError.response?.data?.message || '사용자 초기화에 실패했습니다.');
@@ -68,26 +57,21 @@ export const initialize = async (): Promise<InitializeUserResponse> => {
6857

6958
// TanStack Query를 사용한 초기화 훅
7059
export const useInitialize = () => {
71-
const navigate = useNavigate();
60+
const { setUser } = useAuthStore();
7261

7362
return useMutation({
7463
mutationFn: initialize,
7564
onSuccess: (result) => {
76-
console.log('🎉 초기화 완료, 홈으로 이동');
77-
78-
// 사용자 정보가 확실히 업데이트되었는지 확인
7965
if (result.success && result.data) {
80-
console.log('✅ 사용자 정보 업데이트 확인:', result.data.initialized);
66+
// 사용자 정보 업데이트 (Zustand persist가 자동으로 localStorage에 저장)
67+
setUser(result.data);
68+
69+
// 전체 페이지 리로드로 스토어 재초기화 보장
70+
window.location.href = '/home';
8171
}
82-
83-
// 잠시 후 홈으로 이동 (상태 업데이트가 완료될 시간 확보)
84-
setTimeout(() => {
85-
navigate('/home');
86-
}, 100);
8772
},
8873
onError: (error: Error) => {
89-
console.error('💥 초기화 실패:', error.message);
90-
// 에러는 UI에서 처리하도록 전파
74+
console.error('초기화 실패:', error.message);
9175
},
9276
});
9377
};

frontend/src/api/userSetting/useDeleteUser.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,29 @@ export const useDeleteUser = () => {
1111

1212
const mutation = useMutation({
1313
mutationFn: deleteUser,
14-
onSuccess: (data) => {
15-
console.log('✅ 사용자 삭제 성공:', data);
16-
14+
onSuccess: () => {
1715
// 로컬 상태 정리
1816
clearTokens();
1917
clearAuthState();
2018

19+
// 로컬 스토리지 완전 정리 (Zustand persist 데이터 포함)
20+
localStorage.removeItem('token-store');
21+
localStorage.removeItem('auth-store');
22+
localStorage.clear();
23+
2124
// 삭제 완료 후 로그인 페이지로 이동
22-
setTimeout(() => {
23-
navigate('/signIn');
24-
}, 100);
25+
navigate('/signIn', { replace: true });
2526
},
2627
onError: (error: Error) => {
27-
console.error('❌ 사용자 삭제 실패:', error.message);
28+
console.error('계정 삭제 실패:', error.message);
2829

2930
// 401 에러 등 인증 오류인 경우 로그아웃 처리
3031
if (error.message.includes('401') || error.message.includes('인증')) {
3132
clearTokens();
3233
clearAuthState();
33-
navigate('/signIn');
34+
localStorage.removeItem('token-store');
35+
localStorage.removeItem('auth-store');
36+
navigate('/signIn', { replace: true });
3437
}
3538
},
3639
});

frontend/src/api/userSetting/useKakaoLogin.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ export const useKakaoLogin = () => {
99

1010
const mutation = useMutation({
1111
mutationFn: async (code: string) => {
12-
console.log('🔑 카카오 로그인 API 호출');
13-
1412
const redirect_uri = `${window.location.origin}/oauth/kakao/redirect`;
15-
console.log('🔁 전달할 redirect_uri:', redirect_uri);
1613

1714
const response = await axios.post(
1815
`${import.meta.env.VITE_API_URL}/oauth/login/kakao`,
@@ -26,32 +23,26 @@ export const useKakaoLogin = () => {
2623
return response.data;
2724
},
2825
onSuccess: (data) => {
29-
console.log('✅ 로그인 성공', data);
30-
3126
const { access_token, refresh_token } = data.data;
3227

3328
if (access_token && refresh_token) {
3429
setTokens(access_token, refresh_token);
3530
setAuthenticated(true);
36-
37-
console.log('🔄 토큰 저장 완료');
38-
console.log('📋 사용자 정보는 HomeProtectedRoute에서 자동으로 조회됩니다');
31+
} else {
32+
console.error('토큰이 응답에 없습니다:', data);
3933
}
4034
setLoading(false);
4135
},
4236
onError: (error: unknown) => {
43-
// Axios 에러 타입 체크
4437
let errorMessage = "로그인에 실패했습니다.";
4538

4639
if (error && typeof error === 'object' && 'response' in error) {
47-
const axiosError = error as { response: { data: { message?: string } } };
40+
const axiosError = error as { response: { data: { message?: string }; status?: number } };
4841
if (axiosError.response?.data?.message) {
4942
errorMessage = axiosError.response.data.message;
5043
}
5144
}
5245

53-
console.error('❌ 로그인 실패:', errorMessage);
54-
5546
setAuthError(errorMessage);
5647
setLoading(false);
5748
},
@@ -60,29 +51,20 @@ export const useKakaoLogin = () => {
6051
const initiateKakaoLogin = () => {
6152
setAuthError(null);
6253

63-
// 환경 변수와 현재 도메인 정보 로깅
6454
const currentOrigin = window.location.origin;
6555
const envRedirectUri = import.meta.env.VITE_KAKAO_REDIRECT_URI;
6656
const isLocalhost = currentOrigin.includes('localhost');
6757

68-
// 환경별 리다이렉트 URI 결정
6958
let redirectUri: string;
7059
if (isLocalhost) {
7160
redirectUri = envRedirectUri || 'http://localhost:3000/oauth/kakao/redirect';
7261
} else {
7362
redirectUri = envRedirectUri || `${currentOrigin}/oauth/kakao/redirect`;
7463
}
7564

76-
console.log('🌍 현재 도메인:', currentOrigin);
77-
console.log('⚙️ 환경변수 REDIRECT_URI:', envRedirectUri);
78-
console.log('✅ 최종 사용할 REDIRECT_URI:', redirectUri);
79-
80-
// prompt=login 추가로 강제 재로그인, nonce 추가로 캐시 방지
8165
const nonce = Date.now();
8266
const kakaoAuthUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${import.meta.env.VITE_KAKAO_CLIENT_ID}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code&prompt=login&nonce=${nonce}`;
8367

84-
console.log('🔗 카카오 로그인 URL:', kakaoAuthUrl);
85-
8668
window.location.href = kakaoAuthUrl;
8769
};
8870

frontend/src/api/userSetting/useLogout.ts

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,13 @@ export const useLogout = () => {
1010
const navigate = useNavigate();
1111

1212
const mutation = useMutation({
13-
mutationFn: async (reason?: string) => {
14-
if (reason) {
15-
console.log(`로그아웃 사유: ${reason}`);
16-
}
17-
13+
mutationFn: async () => {
1814
const accessToken = getAccessToken();
1915

2016
// 서버에 로그아웃 요청 (토큰 무효화)
2117
if (accessToken) {
2218
try {
23-
const response = await axios.post(
19+
await axios.post(
2420
`${import.meta.env.VITE_API_URL}/users/logout`,
2521
{},
2622
{
@@ -31,17 +27,8 @@ export const useLogout = () => {
3127
timeout: 5000,
3228
}
3329
);
34-
35-
if (response.data.success) {
36-
console.log('✅ 서버 로그아웃 성공:', response.data.message);
37-
38-
// 카카오 세션은 해제하지 않음 (재로그인 시 기존 사용자로 인식하기 위해)
39-
console.log('ℹ️ 카카오 세션은 유지됩니다. 재로그인 시 기존 계정으로 연결됩니다.');
40-
} else {
41-
console.warn('⚠️ 서버 로그아웃 응답 실패:', response.data);
42-
}
4330
} catch (error) {
44-
console.error('서버 로그아웃 요청 실패:', error);
31+
console.error('서버 로그아웃 요청 실패:', error);
4532
}
4633
}
4734
},
@@ -50,36 +37,41 @@ export const useLogout = () => {
5037
clearTokens();
5138
clearAuthState();
5239

40+
// 로컬 스토리지 완전 정리
41+
localStorage.removeItem('token-store');
42+
localStorage.removeItem('auth-store');
43+
5344
// 로그인 페이지로 이동
54-
setTimeout(() => {
55-
navigate('/signIn');
56-
}, 100);
45+
navigate('/signIn', { replace: true });
5746
},
5847
onError: () => {
5948
// 서버 요청이 실패해도 로컬 상태는 정리
6049
clearTokens();
6150
clearAuthState();
6251

52+
// 로컬 스토리지 완전 정리
53+
localStorage.removeItem('token-store');
54+
localStorage.removeItem('auth-store');
55+
6356
// 로그인 페이지로 이동
64-
setTimeout(() => {
65-
navigate('/signIn');
66-
}, 100);
57+
navigate('/signIn', { replace: true });
6758
},
6859
});
6960

70-
const logout = (reason?: string) => {
71-
mutation.mutate(reason);
61+
const logout = () => {
62+
mutation.mutate();
7263
};
7364

7465
// 즉시 로그아웃 (API 호출 없이)
75-
const forceLogout = (reason?: string) => {
76-
if (reason) {
77-
console.log(`강제 로그아웃 사유: ${reason}`);
78-
}
79-
66+
const forceLogout = () => {
8067
clearTokens();
8168
clearAuthState();
82-
navigate('/signIn');
69+
70+
// 로컬 스토리지 완전 정리
71+
localStorage.removeItem('token-store');
72+
localStorage.removeItem('auth-store');
73+
74+
navigate('/signIn', { replace: true });
8375
};
8476

8577
return {

0 commit comments

Comments
 (0)