Skip to content
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

강원대 FE _ 구희원 3주차 과제 #88

Open
wants to merge 29 commits into
base: hehelee
Choose a base branch
from

Conversation

HeHelee
Copy link

@HeHelee HeHelee commented Jul 12, 2024

step4 질문에 대한 답

  • 질문 1. CORS 에러는 무엇이고 언제 발생하는지 설명해주세요. 이를 해결할 수 있는 방법에 대해서도 설명해주세요.
    A. CORS 에러는 웹 브라우저가 보안 때문에 다른 사이트로부터 데이터를 가져오는 것을 막을 때
    발생합니다. 이 문제를 해결할 수 있는 방법은 총 3가지가 있습니다.

    • 우선 서버 쪽에서 허락을 해주면 됩니다.
    • 두번째는 프록시 서버를 이용하면 됩니다. A 사이트가 B 사이트에 직접 요청하는 대신, 중간 에 다른 서버를 하나 두는 방법입니다. A -> C 요청, C -> B 요청해서 정보를 가져온 다음, 다시 A 사이트에 전달하는 방법입니다.
    • JSONP 사용하기
    • JSONP는 CORS 문제를 우회할 수 있는 방법 중 하나입니다. 요즘은 많이 사용안해요.
  • 질문 2. 비동기 처리 방법인 callback, promise, async await에 대해 각각 장단점과 함께 설명해주세요.
    A. - 콜백 : 함수가 끝난 후에 실행된 함수를 미리 전달하는 방법입니다.

    • 장점 : 장점은 간단하고 쉽게 사용할 수 있습니다.
    • 단점 : 콜백 지옥이라고 불리는 가독성이 덜어지는 코드가 발생할 수 있습니다. 여러 콜백을 중첩하면 코드가 복잡해지고 유지보수가 어려워집니다.
    • 프로미스 : 프로미스는 비동기 작업이 성공했는지 실패했는지를 표현하는 객체입니다. 콜백 대신에 .then().catch()를 사용하여 작업이 끝난 후의 처리를 할 수 있습니다.
    • 장점 : 콜백 지옥을 피할 수 있습니다.
    • 가독성이 좋습니다.
      - 비동기 작업의 성공과 실패를 명확하게 처리할 수 있습니다.
      - 단점 : 초기 학습이 어렵습니다.
      - 복잡한 비동기 로직을 다루기에는 부족합니다.
      - async/await : async 함수는 항상 프로미스를 반환하며, await 키워드는 프로미스가 처리될 때까지 기다립니다.
      - 장점 : 코드를 동기식처럼 작성할 수 있어 가독성이 뛰어납니다.
      - 콜백 지옥이나, 프로미스보다 더 간결한 코드 작성이 가능합니다.
      - 에러 처리가 명확합니다.
      - 단점 : ES2017 이상을 지원하는 환경에서만 사용할 수 있습니다.
      - 프로미스에 대한 기본적인 지식이 필요합니다.
  • 질문 3. react query의 주요 특징에 대해 설명하고, queryKey는 어떤 역할을 하는지 설명해주세요.

  • react query의 주요 특징

  • 데이터 패칭 및 캐싱 : 데이터를 가져와서 캐시에 저장, 다음에 같은 데이터를 필요로 할 때 서버가 아닌 캐시에서 가져옵니다.

  • 자동 재패칭 : 데이터가 변경되면 자동으로 다시 가져옵니다.

  • 배경 데이터 동기화 : 백그라운드에서 주기적으로 데이터를 동기화합니다.

  • 데이터 무효화 : 특정 이벤트 후 데이터가 유효하지 않음을 표시하고 새 데이터를 가져옵니다.

  • Pagination 및 Infinite Queries : 페이지네이션과 무한 스크롤을 쉽게 구현할 수 있습니다.

  • querykey의 역할

  • 고유 식별자 : 각 쿼리를 고유하게 식별하는 데 사용됩니다.

  • 캐싱 및 무효화 관리 : queryKey를 사용해 데이터를 캐싱하고, 특정 queryKey의 데이터를 무효화하거나 갱신할 수 있습니다.

  • 의존성 관리 : queryKey를 사용해 쿼리 간의 의존성을 관리하고, 동일한 queryKey를 가진 쿼리들이 자동으로 동기화 됩니다.

@HeHelee HeHelee changed the title Step1 강원대 FE _ 구희원 3주차 과제 Jul 12, 2024
@yujo11 yujo11 self-requested a review July 13, 2024 08:30
@yujo11 yujo11 self-assigned this Jul 13, 2024
Copy link

@yujo11 yujo11 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 희원님~

소소하게 남긴 코멘트들 있으니 확인해보시면 좋을거 같아요 ㅎㅎ

고생 많으셨습니다~~ 👍 👍 👍

@@ -72,5 +76,9 @@
},
"overrides": {
"react-refresh": "0.11.0"
}
},
"description": "📝 요구사항\r - [ ] 본인만의 기준으로 일관된 코드를 작성해주세요.\r - [ ] 첨부된 oas.yaml 파일을 토대로 Request, Response Type을 정의해요.\r - [ ] React Query를 사용하지 말고 axios 를 사용해서 구현해요.\r - [ ] 첨부된 oas.yaml 파일과 목 API URL을 사용하여 API를 구현해요.\r - 메인 페이지 - Theme 카테고리 섹션\r - [ ] /api/v1/themes API를 사용하여 Section을 구현해요.\r - [ ] API는 Axios또는 React Query 등을 모두 활용해서 구현해도 좋아요.\r - 메인 페이지 - 실시간 급상승 선물랭킹 섹션\r - [ ] /api/v1/ranking/products API를 사용하여 Section을 구현해요. (Axios 사용 가능)\r - [ ] 필터 조건을 선택 하면 해당 조건에 맞게 API를 요청하여 보여지게 해요.\r - Theme 페이지 - header\r - [ ] url의 pathParams와 /api/v1/themes API를 사용하여 Section을 구현해요.\r - [ ] themeKey가 잘못 된 경우 메인 페이지로 연결해요.\r - Theme 페이지 - 상품 목록 섹션\r - [ ] /api/v1/themes/{themeKey}/products API를 사용하여 상품 목록을 구현해요.\r - [ ] API 요청 시 한번에 20개의 상품 목록이 내려오도록 해요.",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 무슨 목적으로 넣으신걸까요?

setGoodsList(data.products);
} catch (err) {
console.log('Error fetching ranking products:', err);
if (axios.isAxiosError(err) && err.response) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isAxiosError를 활용해주셨군요 ㅎㅎ 👍

Comment on lines +63 to +71
{loading ? (
<Loading />
) : error ? (
<ErrorMessage message="No ranking products found" />
) : goodsList.length === 0 ? (
<NoDataMessage message="No ranking products found." />
) : (
<GoodsRankingList goodsList={goodsList} />
)}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

중첩 된 삼항연산자는 코드 보기를 어렵게 만드는데 개선해보시면 좋을거 같아요 ㅎㅎ

Comment on lines +36 to +49
if (axios.isAxiosError(err) && err.response) {
switch (err.response.status) {
case 404:
setError('Ranking products not found.');
break;
case 500:
setError('Server error. Please try again later.');
break;
default:
setError('An error occurred while fetching data.');
}
} else {
setError('An unexpected error occurred.');
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

early return을 활용해서 코드를 보기 좋게 개선해보시면 좋겠네요!


const fetchProducts = useCallback(
async (reset: boolean = false) => {
console.log('Starting fetchProducts');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개발 중에 사용한 console.log는 같이 커밋 되지 않게 신경 써주시면 좋을거 같아요 ㅎㅎ

const [hasMore, setHasMore] = useState(true);
const [pageToken, setPageToken] = useState<string | undefined>(undefined);

const fetchProducts = useCallback(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

useCallback을 사용하신 이유가 있을까요?

Comment on lines +67 to +77
if (loading && products.length === 0) {
return <Loading />;
}

if (error) {
return <ErrorMessage message={error} />;
}

if (products.length === 0) {
return <NoDataMessage message="No products found for this theme." />;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suspense, ErrorBoundary를 사용해 컴포넌트에서는 성공하는 로직에만 집중할 수 있게 만들어보셔도 좋을거 같아요 ㅎㅎ (반드시 사용하라는 뜻은 아닙니다)

);
};

export const useGetProductDetail = (params: GetProductDetailRequest) => {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

useQuery에서 사용가능한 옵션들도 받을 수 있는 형태로 만들어보시면 좋을거 같아요 ㅎㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants