이번 프로젝트에서 react-query도 axios도 처음 써보는지라 뭐가 뭔지 모르겠..
소셜 로그인 간단할 줄 알았는데..... ㅎ ㅏ........ 일단 지금의 문제가
- useQuery를 여러번 써야함
- 1이 끝나면 2가 실행되어야 함 (동기적 실행)
- 다른 탭(창)에 갔다오면 useQuery가 자동으로 refetch를 해서 자꾸 에러 화면이 뜸
- isLoading, isError가 쿼리마다 있는데 어차피 같은 화면 띄울건데.. 한꺼번에 처리 못 할까?
먼저 최초의 코드부터 👩🏻💻
/* Kakao Login */
const [searchParams] = useSearchParams();
const [isToken, setIsToken] = useState<boolean>(false);
const AUTHORIZE_CODE = searchParams.get('code');
const kakaoTokenLink = `https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id=${process.env.REACT_APP_REST_API_KEY}&redirect_uri=${process.env.REACT_APP_REDIRECT_URI}&code=${AUTHORIZE_CODE}`;
//1. 인가코드 보내서 토큰 받기(from Kakao)
const getKakaoToken = async () => {
return await axios.post(kakaoTokenLink, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});
};
//2. 토큰 보내서 사용자 정보 받기(from Backend)
const getUserInfo = async () => {
return await axios.post('/data/optionInfo.json', {
kakaoToken: localStorage.getItem('kakaoToken'),
});
};
const { data: kakaoToken,
isLoading,
isError,
} = useQuery('getKakaoToken', getKakaoToken, {
onSuccess: kakao => {
localStorage.setItem('kakaoToken', kakao.data.access_token);
setIsToken(!isToken);
getUserInfo(); ✅
},
});
if (isLoading) {
return <Loading>Loading. . .</Loading>;
}
if (isError) {
return <Loading>Error ⚠️</Loading>;
}
//1. 인가코드 보내서 토큰 받기(from Kakao)
const getKakaoToken = async () => {
return await axios.post(kakaoTokenLink, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});
};
const { data: kakaoToken } = useQuery('getKakaoToken', getKakaoToken, {
onSuccess: kakao => {
localStorage.setItem('kakaoToken', kakao.data.access_token);
setIsToken(!isToken);
},
});
//2. 토큰 보내서 사용자 정보 받기(from Backend)
const getUserInfo = async () => {
return await axios.post('/data/optionInfo.json', {
kakaoToken: localStorage.getItem('kakaoToken'),
});
};
const { data: kakaoUserInfo } = useQuery('getUserInfo', getUserInfo, {
enabled: !!kakaoToken, ✅ // kakaoToken이 있으면 실행
});
enabled
옵션을 이용했다enabled
옵션을 이용하면 useQuery를 동기적으로 사용 가능하다enabled
== true 일 때 해당 useQuery를 실행함enabled: !!kakaoToken
을 넣어줌//1. 인가코드 보내서 토큰 받기(from Kakao)
const getKakaoToken = async () => {
return await axios.post(kakaoTokenLink, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
maxRedirects: 0,
});
};
const {
data: kakaoToken,
isLoading: kakaoTokenIsLoding,✅
isError: kakaoTokenIsError,✅
} = useQuery('getKakaoToken', getKakaoToken, {
onSuccess: kakao => {
localStorage.setItem('kakaoToken', kakao.data.access_token);
},
refetchOnWindowFocus: false,✅
});
//2. 토큰 보내서 사용자 정보 받기(from Backend)
const getKakaoUserInfo = async () => {
// return await axios.post('/data/optionInfo.json', {
// kakaoToken: localStorage.getItem('kakaoToken'),
// });
return await axios.get('/data/optionInfo.json');
};
const {
data: kakaoUserInfo,
isLoading: kakaoUserInfoIsLoding,✅
isError: kakaoUserInfoIsError,✅
} = useQuery('getKakaoUserInfo', getKakaoUserInfo, {
enabled: !!kakaoToken,
refetchOnWindowFocus: false,✅
});
useEffect(() => {
getKakaoToken();
getKakaoUserInfo();
}, []);
//로딩 시 ✅
if (kakaoTokenIsLoding || kakaoUserInfoIsLoding) {
return <Loading />;
}
//에러 시 ✅
if (kakaoTokenIsError || kakaoUserInfoIsError) {
return <Error />;
}
getKakaoToken();
함수와 getKakaoUserInfo();
함수를 넣어주어 처음 렌더링 시에 두 함수가 실행되도록 한다refetchOnWindowFocus
옵션을 false
로 설정 → 에러 안난다 이제 ㅍ0ㅍ||
(OR) 를 이용하였다