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주차 과제 Step3 ~ 4 #89

Open
wants to merge 30 commits into
base: hyunaeri
Choose a base branch
from

Conversation

hyunaeri
Copy link

@hyunaeri hyunaeri commented Jul 12, 2024

마지막 남은 무한 스크롤 구현과 react-query 를 이용한 API 재 구현입니다.

📌 3주차 질문

🤔 1. CORS 에러는 무엇이고 언제 발생하는지 설명하라, 이를 해결할 수 있는 방법에 대해서도 설명하라.

CORS(Cross-Origin Resource Sharing) 에러는 웹 애플리케이션이 다른 출처(Origin)로부터 리소스를 요청할 때 발생할 수 있는 보안 정책이다. 다른 출처란, 프로토콜 이나 호스트, 포트가 서로 다른 경우를 말한다. 브라우저는 기본적으로 스크립트가 다른 출처의 리소스에 접근하는 것을 제한하는 보안 정책을 가지고 있다.

  • 언제 발생하는가?

    • 프로토콜이 다를 때, http://naver.com → https://naver.com
    • 호스트가 다를 때, https://api.naver.com → https://naver.com
    • 포트가 다를 때, https://naver.com:8080 → https://naver.com
  • 해결 방법

    • 프록시 (Proxy) 설정하기 : 클라이언트와 서버 사이의 중계 Point 설정
    • 서버에서 Access-Control-Allow-Origin 헤더 세팅

🤔 2. 비 동기 처리 방법인 callback, promise, async await 에 대해 각각 장단점과 함께 설명하라.

  • callback

    • 장점은 간단한 비동기 작업을 처리할 때 코드가 간결하고 직관적이다.
    • 단점은 콜백지옥에 빠질 수 있다. 또, 콜백에서 발생한 에러를 관리하기 어렵다.
  • promise

    • 장점은 콜백지옥을 방지하고 연속적인 비동기 작업을 더 명확하게 처리 가능하다.
      .catch() 와 .then() 메서드를 사용하여 에러 처리와 연속적인 비동기 작업을 처리할 수 있다.
    • 단점은 콜백 보다 사용법이 조금 더 복잡하다.
  • Async & Await

    • 장점은 코드가 동기적으로 작성되어 비동기 작업을 처리하는 것으로 보여 가독성이 매우 좋다.
      try-catch 블럭을 통해 간편하게 에러를 처리할 수 있다.

    • 단점은 Async 함수 내에서는 Promise 를 사용해야 하므로, 기존에 Promise 가 없는 코드와의 호환성 문제가 발생할 수 있다.


🤔 3. React query의 주요 특징에 대해 설명하고 queryKey는 어떤 역할을 하는지 설명하라.

React Query 는 리액트 어플리케이션에서 데이터를 관리하고 가져오는데 도움을 주는 라이브러리이다.

  • 주요 특징

    • 간단한 데이터 관리 : API 호출 및 데이터 캐싱을 간편하게 처리
    • 캐시 관리 : 브라우저 메모리에서 데이터를 캐싱하여 동일한 요청을 여러번 하더라도 불필요한 네트워크 요청을 줄임
    • 비동기 상태 관리 : 비동기 데이터 로딩 상태를 관리하고, 성공 또는 실패에 따라 UI 업데이트
    • 편리한 오류 처리 : API 호출 중 발생하는 오류를 쉽게 처리하고 오류메시지를 사용자에게 전달
  • queryKey의 역할

    • 캐시 식별자 : 데이터를 캐싱하는데 사용, 동일한 queryKey 를 가진 쿼리는 캐시된 데이터를 공유
    • 캐시의 유효성 검사 : queryKey 의 값이 변경되면 리액트 쿼리는 새로운 데이터를 요청하여 캐시 업데이트
    • 쿼리 파라미터 전달 : API 호출에 필요한 매개변수를 queryKey 에 포함, 동적으로 API 요청 수행

hyunaeri added 30 commits July 9, 2024 15:50
Copy link

@sjoleee sjoleee left a comment

Choose a reason for hiding this comment

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

고생하셨습니다~! 리뷰 남깁니다.

Comment on lines +34 to +39
'react-hooks/exhaustive-deps': 'off',
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',
"@typescript-eslint/no-explicit-any": "off",
'@typescript-eslint/consistent-type-imports': 'warn',
'@typescript-eslint/no-shadow': 'off',
Copy link

Choose a reason for hiding this comment

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

끄신 린트 룰들 전부 켜고 사용해주세요!
특히 exhaustive-deps는 절대 끄지 말아주세요!

"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-intersection-observer": "^9.13.0",
"react-query": "^3.39.3",
Copy link

Choose a reason for hiding this comment

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

react-query는 현재 이름이 tanstack query로 변경되었고, 버전이 5까지 나왔을거에요. 확인하셔서 최신 버전으로 개발하시는 것을 추천드립니다.

@@ -8,13 +8,13 @@ import { breakpoints } from '@/styles/variants';
import type { GoodsData } from '@/types';

type Props = {
goodsList: GoodsData[];
goodsList: GoodsData[] | undefined;
Copy link

Choose a reason for hiding this comment

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

굳이 undefined를 추가해야할까요? goodsList가 반드시 GoodsData[] 타입이도록 보장해줄 수 있지 않을까요?

@@ -8,13 +8,13 @@ import { breakpoints } from '@/styles/variants';
import type { GoodsData } from '@/types';

type Props = {
goodsList: GoodsData[];
goodsList: GoodsData[] | undefined;
};

export const GoodsRankingList = ({ goodsList }: Props) => {
Copy link

Choose a reason for hiding this comment

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

파일명과 컴포넌트명을 일치시켜주세요~! List -> GoodsRankingList

Comment on lines +15 to +18
const params = {
targetType: filterOption.targetType,
rankType: filterOption.rankType
}
Copy link

Choose a reason for hiding this comment

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

params를 만들지 않고 filterOption을 그대로 사용해도 되지 않을까요?

targetType: filterOption.targetType,
rankType: filterOption.rankType
}
const response = await axios.get(`${BASE_URL}api/v1/ranking/products`, { params })
Copy link

Choose a reason for hiding this comment

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

BASE_URL을 매번 지정해주기보다는 axios instance를 만들면 좋을 것 같아요~! 그리고 보통 BASE_URL에는 ~/api/까지 포함하는 경우가 많아요

fetchRankingList(filterOption)
)

const renderingFunc = () => {
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 +47 to +51
useEffect(() => {
if (inView && hasNextPage) {
fetchNextPage();
}
}, [inView, hasNextPage, fetchNextPage]);
Copy link

Choose a reason for hiding this comment

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

이미 다음 페이지를 불러오는 중에는 호출을 막아야하지 않을까요~?

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