-
Notifications
You must be signed in to change notification settings - Fork 117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[윤아영] week19 & week20 #1080
The head ref may contain hidden characters: "part3-\uC724\uC544\uC601-week20"
[윤아영] week19 & week20 #1080
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
과제 제출하시느라 고생 많으셨습니다! 🙏
window.localStorage.setItem('accessToken', accessToken); | ||
window.localStorage.setItem('refreshToken', refreshToken); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
보통 localStorage.setItem 사용할 땐, 그럴일이 없겠지만, characters limit & 저장공간 5MB 제한이 있어서 초과하려고 할 때, QuotaExceededError 에러가 발생할 수 있어요. 그렇기 때문에 아래처럼 try / catch를 감싸서 사용해야합니다.
혹은 보안 설정으로 인하여 localStorage 접근이 안될 때도 저렇게 하게되면 에러가 발생하겠죠?
const saveToLocalStorage = (key, value) => {
try {
localStorage.setItem(key, value);
} catch (e) {
console.error(e)
}
}
const token = window.localStorage.getItem('accessToken'); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이렇게 localStorage에서 getItem을 실행할 땐, try / catch로 에러 처리가 반드시 필요합니다.
일부 브라우저 (safari) 시크릿 모드 사용 시, localStorage에 접근을 제한할 수 있기 때문이에요.
즉, localStorage에 접근하려고 시도하면 스크립트 오류가 발생하거나 localStorage 객체 자체가 정의되지 않아 오류가 발생할 수 있습니다.
이를 방지하기 위해 보통 공통 util 함수를 만들어서 사용합니다.
const safeGetItem = (key) => {
try {
return localStorage.getItem(key);
} catch (error) {
console.error(error);
return null;
}
}
const fetchUser = async () => { | ||
try { | ||
const user = await getUser(); | ||
setUser(user); | ||
} catch (error) { | ||
console.error((error as Error).message); | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이런 유저정보를 가져오는 기능은 다른 곳에서도 충분히 사용 할 수 있기 때문에, util 디렉토리에 별도로 hook을 분리해서 만든 후 재사용 하는 습관이 좋을 것 같아요~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const useFetchUser = () => {
const [user, setUser] = useState<User | undefined>(undefined);
const [error, setError] = useState<string | null>(null);
const [loading, setLoading] = useState<boolean>(true);
useEffect(() => {
const fetchUser = async () => {
try {
const userData = await getUser();
setUser(userData);
} catch (error) {
setError((error as Error).message);
}
};
fetchUser();
}, []);
return { user, error, loading };
};
export default useFetchUser;
그리고 실제 사용때는 아래처럼 사용하는거죠
...
const { user, error, loading } = useFetchUser();
export const postSignIn = async ({ email, password }: { email: string; password: string }) => { | ||
const response = await fetch(`${BASE_URL}/auth/sign-in`, { | ||
method: 'POST', | ||
headers: { | ||
'Content-Type': 'application/json', | ||
}, | ||
body: JSON.stringify({ email, password }), | ||
}); | ||
|
||
if (!response?.ok) { | ||
throw new Error('로그인을 실패했습니다.'); | ||
} | ||
|
||
const token = await response.json(); | ||
|
||
return token; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기 아래 코드들 보면 headers 같은 값들이 중복으로 설정되는 코드들이 보여요
보통 이럴땐 fetchApi 같은 공통 fetch 함수를 만들고, 이를 통해 중복 설정하는 로직을 개선합니다.
const fetchApi = async (url: string, options: RequestInit) => {
const response = await fetch(`${BASE_URL}${url}`, {
...options,
headers: {
'Content-Type': 'application/json',
...options.headers,
},
});
if (!response.ok) {
const errorBody = await response.json();
throw new Error(errorBody.message || '요청에 실패했습니다.');
}
return response;
};
그리고 실제 사용때는 아래처럼 사용할 수 있어요.
export const postSignIn = async ({ email, password }: { email: string; password: string }) => {
const response = await fetchApi('/auth/sign-in', {
method: 'POST',
body: JSON.stringify({ email, password }),
});
const token = await response.json();
return token;
};
f28a0d4
into
codeit-bootcamp-frontend:part3-윤아영
요구사항
기본
주요 변경사항
멘토에게