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

feature: 에러 핸들링 고도화 #453

Merged
merged 68 commits into from
Oct 4, 2023
Merged

feature: 에러 핸들링 고도화 #453

merged 68 commits into from
Oct 4, 2023

Conversation

n0eyes
Copy link
Collaborator

@n0eyes n0eyes commented Sep 29, 2023

ErrorBoundary 옵션 추가

ErrorBoundary의 옵션을 추가하였습니다.

onError

에러가 ErrorBoundary에서 catch되었을 때 실행됩니다

onError: (error: Error, errorInfo: ErrorInfo) => void

<ErrorBoundary
  onError={(error)=>{
    if(isAxiosError(error)) { ... }
  }}
>
 ...
</ErrorBoundary>

ignore

에러의 catch 여부를 결정합니다

ignore: <E extends Error>(props: E) => boolean

<ErrorBoundary
  ignore={(error)=>{
    return !isAxiosError(error)
  }}
>
 ...
</ErrorBoundary>

여러 종류의 Boundary 추가

APIBoundary

const APIBoundary = (props: PropsWithChildren<APIBoundaryProps>) => {
  const handleAPIError = (error: unknown) => {
    const convertedError = ZipgoError.convertToError(error);

    if (!(convertedError instanceof APIError)) throw convertedError;
  };

  return <ErrorBoundary onError={handleAPIError} {...props} />;
};

발생한 에러가 APIError가 아닌 경우 throw 합니다

QueryBoundary

const QueryBoundary = (props: PropsWithChildren<QueryBoundaryProps>) => {
  ...
  return (
    <QueryErrorResetBoundary>
      {({ reset }) => (
        <APIBoundary
          fallback={errorFallback}
          onReset={composeFunctions(reset, onReset)}
          {...restProps}
        >
          <Suspense fallback={loadingFallback}>{children}</Suspense>
        </APIBoundary>
      )}
    </QueryErrorResetBoundary>
  );
};

react-query에서 제공하는 QueryErrorResetBoundary를 사용하여 reset시 에러가 발생한 query를 초기화 합니다.

EenOfErrorBoundary

errorignore 속성 여부와 상관 없이 무조건 errorcatch하는 종단점입니다.

CustomError 추가

  • ZipgoError : name , message , cause , ignore 속성 및 convertToError static method를 가진 BaseError입니다. 모든 에러는 ZipgoError를 상속받습니다.
  • RuntimeError : 예측이 가능한 런타임 에러를 throw할 때 사용합니다. ignore: true가 적용되며 EenOfErrorBoundary에서 처리됩니다.
  • UnexpectedError : 예측할 수 없는 에러를 throw할 때 사용합니다. ignore: true가 적용되며 EenOfErrorBoundary에서 처리됩니다.
  • APIError : 통신이 정상적으로 성공한 api에서 발생한 에러를 throw 할 때 사용합니다.
const APIBoundary = () => 
  <ErrorBoundary
    onError={(error)=>{
      if (!isAxiosError(error) || !APIError.canManage(error)) {
        throw new UnexpectedError(error);
      }
    }}
  >
 ...
  </ErrorBoundary>
// RuntimeError
const Component = () => {
  const { setError } = useErrorBoundary()

  const onClick = () => setError(new RuntimeError({ code: 'WRONG_QUERY_STRING' }))
  return <button onClick={onClick}>click!</button>

}

ErrorCode 추가

서버에서 ErrorCode를 사용할 것을 대비하여 추가하였습니다.
현재는 다음과 같은 코드만 사용하고 있습니다.

서버에서 에러 코드를 제공하지 않거나 잘못된 에러 코드를 제공하는 경우 UNEXPECTED_ERROR 메세지가 기본적으로 적용됩니다. 상태 코드는 404로 적용됩니다.

const UNEXPECTED_ERROR = '서비스에 문제가 발생했어요';
const NOT_FOUND = '존재하지 않는 페이지예요';
const API_ERROR_CODE_MISSING = UNEXPECTED_ERROR;

ErrorPage 수정

전달받은 error의 정보에 따라 다른 상태코드와 에러 메세지를 렌더링하도록 변경하였습니다.

또한 , refresh props를 통해 다시 시도하기 버튼도 추가적으로 렌더링할 수 있습니다.

useMutationWithToast hook 추가

mutation이 발생하는 경우 에러 메세지를 토스트로 노출하는 로직이 적용된 hook입니다.

해당 hook을 사용하면 에러가 에러 바운더리로 throw되지 않고 토스트만 노출한 후 기능이 중지됩니다.

만약 핵심적인 기능인 경우 critical 옵션을 통해 ErrorBoundary로 강제 throw할 수 있습니다.

critical: false

화면 기록 2023-09-30 오전 3 04 34

critical: true

화면 기록 2023-09-30 오전 3 04 15

🙋🏻 More

- online
- offline
- unhandledrejection
- RuntimeError
- UnexpectedError
Copy link
Collaborator

@HyeryongChoi HyeryongChoi left a comment

Choose a reason for hiding this comment

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

노선생 아주 아주 아주 아주 아주 아주 고생많으셨습니다👍
고민하는 모습을 거의 한 달 넘게 본 것 같은데 이런 멋진 결과물이 나왔군요😄

🐌제가 질문 폭탄을 남겨놨으니 천천히(빨리) 확인 바랍니다🙏

@@ -17,6 +17,7 @@ const isProduction = process.env.NODE_ENV === 'production';

const env = getClientEnvironment(PUBLIC_PATH);

/** @type {import('webpack').Configuration} */
Copy link
Collaborator

Choose a reason for hiding this comment

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

이건 머에여? 궁금해요

Comment on lines 20 to 59
const errorFallback = ({ reset, error }: ErrorBoundaryValue) => (
<ErrorPage reset={reset} error={error} />
);

const queryClient = new QueryClient({
defaultOptions: {
queries: {
suspense: true,
retry: false,
useErrorBoundary: true,
staleTime: ONE_HOUR,
cacheTime: ONE_HOUR,
},
},
});

const App = () => (
<ThemeProvider theme={theme}>
<GlobalStyle />
<QueryClientProvider client={queryClient}>
<EndOfErrorBoundary fallback={errorFallback}>
<QueryBoundary errorFallback={errorFallback}>
<ToastProvider>
<AxiosInterceptors>
<GlobalEvent />
<Outlet />
</AxiosInterceptors>
</ToastProvider>
</QueryBoundary>
</EndOfErrorBoundary>
</QueryClientProvider>
</ThemeProvider>
);
export default App;

const GlobalEvent = () => {
const { toast } = useToast();

const { setError } = useErrorBoundary();

Copy link
Collaborator

Choose a reason for hiding this comment

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

뭔가 거대한게 생겼군요👍
이거 빨리 어푸룹해야 제가 작업을 시작할 수 있겠어요 ^__ㅜ

Comment on lines +30 to +31
staleTime: ONE_HOUR,
cacheTime: ONE_HOUR,
Copy link
Collaborator

Choose a reason for hiding this comment

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

이거 우리 집고 프론트엔드 5차 간부회의 에서 기본값은 infinity로 주기로 하지 않았나요? 신고하겠읍니다.
사유서 제출하십시오

ReactQuery cacheTime, staleTime

  • foodList → 1h
  • reviewList → 1m
  • global → Infinity

window.addEventListener('resize', onResize);
window.addEventListener('online', onOnline);
Copy link
Collaborator

Choose a reason for hiding this comment

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

아 디테일 멋집니당

this.ignore = false;
}

static convertToError(error: unknown) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

함수명 convertToSpecificError 어떤가요? 이게 아니더라도 뭔가 에러를 구체화시켜서 반환한다는 느낌이 들어간 함수명으로 바꾸면 좋을 것 같아요!


const error = ZipgoError.convertToError(rejectedValue);

toast.warning(error.message);
Copy link
Collaborator

Choose a reason for hiding this comment

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

개인적인 의견인데 커스텀에러코드가 있다면 에러토스트나 에러페이지 보여줄 때 에러코드(숫자)도 같이 보여주는 건 어떤가여?
사용자가 이거 안돼요 저거 안돼요~할 때 에러코드도 함께 말해주면 원인 찾는 게 더 쉬울 것 같아요!

아래는 스벅 에러페이지입니다!
스타벅스 에러페이지

return (
<BannerSection>
<ErrorTextWrapper>
<ErrorCodeText>{status}</ErrorCodeText>
Copy link
Collaborator

Choose a reason for hiding this comment

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

오 여기 에러코드 보여주는 게 있었네여!! 디자인도 한번 보여주시죵

@@ -25,13 +22,12 @@ const Login = lazy(() => import('@/pages/Login/Login'));
const FoodDetail = lazy(() => import('@/pages/FoodDetail/FoodDetail'));
const ReviewAddition = lazy(() => import('@/pages/ReviewAddition/ReviewAddition'));
const ReviewStarRating = lazy(() => import('@/pages/ReviewStarRating/ReviewStarRating'));
const ErrorPage = lazy(() => import('@/pages/Error/ErrorPage'));
// const ErrorPage = lazy(() => import('@/pages/Error/ErrorPage'));
Copy link
Collaborator

Choose a reason for hiding this comment

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

@@ -0,0 +1,7 @@
declare module 'axios' {
Copy link
Collaborator

Choose a reason for hiding this comment

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

이건 뭔가요! 설명 DM주세요🙏

@@ -1,3 +1,5 @@
export type RenderProps<P extends object = object> = (payload: P) => JSX.Element;
Copy link
Collaborator

Choose a reason for hiding this comment

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

질문 폭탄이라 지송..
요 타입은 오 ㅐ 만드신 건가요?

Copy link
Collaborator

@HyeryongChoi HyeryongChoi left a comment

Choose a reason for hiding this comment

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

답변 안 달아주시면 찾아가겠습니다~~ 일단 어푸룹!!

Copy link
Member

@ksone02 ksone02 left a comment

Choose a reason for hiding this comment

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

고생했어요~!!

@n0eyes n0eyes merged commit 526e2f9 into develop Oct 4, 2023
1 check passed
@wonyongChoi05 wonyongChoi05 deleted the feature/#446 branch October 6, 2023 13:38
HyeryongChoi added a commit that referenced this pull request Oct 19, 2023
* feat: 식품 필터링 결과 없을 때 텍스트 추가 (#431)

* feat: 식품 필터링 결과 없을 때 텍스트 추가

* refactor: 필터링 결과 없을 때 텍스트 문구 수정

* refactor: Toast 사용 방법 리팩터링 / 강아지 터치 이스터에그 수정 (#428)

* refactor: Toast 로직 Context with Provider로 변경

* refactor: 강아지 이스터에그 수정

* refactor: ToastContext 타입 분리 및 리팩터링

* refactor: Landing Toast 사용 방법 변경

* fix: 이스터에그 오탈자 수정(꺠 -> 깨) (#443)

* feat: 리뷰 요약 조회 json 프로퍼티 명 수정 (#449)

* fix: json 프로퍼티명 수정

* fix: 리뷰 요약 조회 API 문서 수정

* chore: 사용하지 않는 의존성 제거

* chore: 사용하지 않는 DTO 제거

* feat: 쿼리 카운터 적용 (#445)

* feat: 쿼리 카운터 객체 생성

* feat: 커넥션 다이나믹 프록시 구현을 위한 handler 추가

* feat: 쿼리카운터 AOP 적용

* feat: 쿼리카운터 로깅 인터셉터 추가

* test: 공통 MockMvcTest 추가

* feat: refresh token 적용 (#447)

* feat: refresh token 설정값 추가

* feat: refresh token 생성 기능 추가

* feat: refresh token을 쿠키에 담아 담는 기능

* refactor: String.valueOf() 대신 .toString()을 사용하도록 변경

* refactor: refreshTokenCookieProvider 객체 도출

* refactor: tokenRefresh 기능 구현

* refactor: ResponseCookie 적용

* test: authServiceTest 작성

* test: jwtProviderTest 작성

* test: refreshTokenRepositoryTest 작성

* chore: application-local1.yml 삭제

* feat: 로그아웃 기능 구현

* test: 토큰 인증 실패시 401 예외 추가

* refactor: DTO 네이밍 헷갈리지 않도록 수정

* test: 로그아웃 쿠키 테스트 추가

* test: 로그아웃 쿠키 테스트 수정

* feat: API 명세 변경 `/logout` -> `/log-out`

* refactor: Tokens -> TokenDto 네이밍 변경

* feat: token rotation 제거

* refactor: AuthServiceTest 내 모킹테스트 분리

* refactor: Controller 테스트 분리

* feat: refreshToken BaseTimeEntity 적용

* refactor: renewAccessToken -> renewAccessTokenBy 메서드명 변경 및 파라미터 이름 token -> refreshToken 변경

* refactor: 테스트용 시크릿 키 상수 분리

* refactor: 개행 변경

* refactor: logout 통일

* refactor: 토큰 만료기한 변수명 수정

* test: 불필요한 @SpringBootTest 제거

* refactor: 토큰 생성시 받는 파라미터 타입 변경

* feature: 에러 핸들링 고도화 (#453)

* feat: webpack config 자동 완성 annotation 추가

* feat: ErrorBoundary onError 옵션 추가

* feat: RenderProps 타입 추가

* feat: ErrorBoundary ignore option 추가

* feat: APIBoundary 추가

* feat: componseFunctions util 함수 추가

* feat: useErrorBoundary 추가

* feat: PrefetchImg 추가

* refactor: Global Provider들의 사용 위치를 index > App으로 변경

* feat: Global eventHandler 추가

- online
- offline
- unhandledrejection

* feat: QueryBoundary 추가 및 디렉토리 위치 변경

* refactor: QueryBoundary 불필요한 의존성 제거

* refactor: 전역 Provider들의 경계 재조정

* fix: QueryBoundary 임포트 경로 수정

* feat: msw 모듈 경로 수정

* refactor: FoodList 데이터 요청 위치 변경

* feat: exception routes 추가

* feat: exception router에 ErrorPage 적용

* refactor: ErrorBoundaryState 타입을 명시적으로 수정

* feat: ErrorBoundaryValue 타입에 error 타입 추가

* feat: ErrorBoundary fallback에 error 정보도 함께 제공

* feat: CustomError 추가

- RuntimeError
- UnexpectedError

* feat: APIBoundary UnexpectedError 적용

* refactor: error message 수정

* feat: EndOfErrorBoundary 추가

* refactor: UnexpectedError의 메세지 오버라이딩 제거

* feat: APIErrorCode 추가

* refactor: ManageableAxiosError 타입 분리

* feat: APIError 추가

* feat: APIBoundary 통신 성공시 APIError throw

* chore: refresh icon 추가

* chore: home icon height, viewbox 수정

* feat: NOT_FOUND error message 추가

* refactor: UnexpectedError가 모든 value를 받을 수 있도록 수정

* refactor: ErrorPage를 동적으로 수정

- error의 종류에 따라 status와 message 표시
- NotFound page 추가

* refactor: exception routes에 NotFound 페이지 적용

* refactor: UnexpectedError message 변경

* refactor: canManage 조건 수정

* refactor: Error static method 추가

- convertToError 추가
- canManage를 APIError의 static method로 변경

* refactor: CustomError > ZipgoError 네이밍 변경

* feat: useMutationWithToast 추가

* feat: EndOfErrorBoundary 적용

* feat: 전역 staleTime, cacheTime 설정

* feat: reviewList query staleTime 1분으로 설정

* feat: useMutationWithToast critical option 추가

* refactor: APIBoundary가 APIError인 경우 throw하지 않도록 수정

* refactor: ignore key 상수로 분리

* refactor: type only export로 변경 및 named export 그룹화

* refactor: 사용하지 않는 type export 제거

* refactor: 네트워크 에러 메세지를 상수로 분리

* refactor: Unhandled rejection을 에러바운더리에서 처리

* refactor: axios interceptor가 최초 렌더링시에 등록되도록 수정

* refactor: 주석 제거

* refactor: convertToError 로직에서 ZipgoError는 재변환 하지 않도록 변경

* feat: warning icon prefetch

* feat: ErrorCode 타입 기본값 적용

* refactor: AxiosInterceptors 제거

- request interceptor에서 Promise를 리턴하지 않는 문제 수정
- 토큰 만료시 로그인 페이지 리다이렉트 로직을 APIBoundary로 분리

* refactor: RenderProps return type 변경

* feat: resolveRenderProps 함수 추가

* refactor: ErrorBoundary가 무조건 에러를 변환하도록 변경

* feat: isDifferentArray 유틸 함수 추가

* feat: ErrorBoundary 기능 추가

- location 정보가 변경되면 에러가 초기화 되도록 변경
- resetKeys prop 추가

* refactor: APIBoundary에서 401 핸들링을 하도록 변경

* refactor: 함수 선언식을 화살표 함수로 변경

* refactor: APIBoundary 불필요한 에러 재변환 제거

* refactor: composeFunctions와 composeEventHandlers 함수를 통합

* refactor: APIBoundary가 onErrorProps도 실행하도록 변경

* refactor: 기존의 composeEventHandlers를 composeFunctions로 변경

* feat: 메인페이지 하단 '사료 선택 도움말 배너' 추가 (#458)

* feat/#457: 사료 선택 도움말 배너  컴포넌트 추가

* test/#457: 스토리 추가

* feat/#457: 랜딩페이지에 도움말 배너 추가

* refactor/#457: 애니메이션 테마로 분리

* Merge branch 'develop' of https://github.com/woowacourse-teams/2023-zipgo into feature/#457

* fix/#457: 사파리에서 svg 이미지 깨지는 문제 webp 이미지 사용으로 해결

* chore: 스토리북 배포 워크플로우 추가 (#464)

* fix: 스토리북 배포 워크플로우에서 캐시 무효화 로직 삭제 및 mockServiceWorker 경로 수정 (#466)

* chore/#465: 클라우드프론트 캐시 무효화 로직 워크플로우에서 삭제

* chore/#465: 스토리북 mockServiceWorker 경로 설정

* fix: 스토리북 배포 워크플로우 캐시 경로 수정 (#468)

* chore: 프론트엔드 프로젝트 배포 워크플로우에 캐시적용 (#470)

* chore/#469: 프론트엔드 프로젝트 배포 워크플로우에 캐시 적용

* chore/#469: 작업 실행 조건 수정

* feat: 식품 필터 선택 후 선택한 필터 보여주는 기능 추가 (#461)

* feat/#460: 반려견 등록 화살표 삭제

* feat/#460: 선택한 필터 보여줄 때 난독화돼서 나오지 않도록 url복호화

* refactor/#460: 파일 이동

* feat/#460: 선택한 필터 목록 보여주는 기능 추가

* refactor/#460: 컴포넌트명 수정

* refactor/#460: 컴포넌트명 수정

* fix/#460: 잘못된 지표 설명 수정

* refactor/#460: iPhone13 mini에서 도움말 줄바꿈 없이 보이도록 수정

* refactor: else if 문 개선

* refactor: 클릭이벤트핸들러 SelectedFilterItem으로 이동

* refactor: string배열 KEYWORD_EN으로 대체

* refactor: 타입명과 일치하도록 category > keyword로 변수명 수정

* feat: Object.entries 타입 추론을 위한 오버로딩 타입 추가

* refactor: 쿼리스트링에 따라 필터 상태 업데이트 하도록 수정

* refactor: 펫푸드 테스트코드 리팩터링 (#459)

* refactor: PetFoodQueryRepository 테스트간 독립성 보장

* refactor: PetFoodQueryService 테스트간 독립성 보장

* refactor: PetFoodController 테스트간 독립성 보장

* refactor: PetFoodQueryRepository 테스트 수정

* refactor: fixture 수정

* refactor: PetFoodQueryService 테스트 수정

* refactor: PetFoodController 테스트 수정

* refactor: QueryServiceTest 삭제

* refactor: 테스트 환경 통합 및 불필요한 컨테이너 제거

* refactor: abstract 추가

* feat: Datadog Trace 어노테이션 추가 (#475)

* feat: datadog 의존성 추가

* feat: Trace 어노테이션 추가

* feature: ErrorBoundary 사용 방식 변경 및 간소화 (#477)

* refactor: 불필요한 stringify 제거

* refactor: APIError status 타입 지정

* refactor: shouldIgnore 파라미터 타입을 제네릭으로 변경

* feat: BaseFunction type 추가

* feat: resolveFunctionOrPrimitive 유틸 함수 추가

* refactor: APIBoundary onError > ignore로 변경

* refactor: APIError의 method가 get이 아니라면 ignore true로 설정

* refactor: Error field 수정

- ignore > IGNORE_KEY

* refactor: ignore 인터페이스 수정

- boolean도 사용할 수 있도록 변경

* refactor: ErrorBoundary 인터페이스 수정

- mustCatch 추가
- ignore > shouldIgnore로 변경
- EndOfBoundary > CriticalBoundary로 변경
- 기존 shouldIgnore 유틸 함수 > isIgnored로 변경

* chore: nvmrc 추가 v18.16.1

* feat: Loading 컴포넌트 추가

* refactor: 기존 QueryBoundary 사용을 Loading, Suspense로 변경

* feat: 같은 플로우 안의 여러 페이지를 관리하기 위한 퍼널 추상화 및 적용 (#482)

* refactor/#473: navigate 관련 코드 훅 분리

* feat/#473: Funnel, useFunnel 구현

* feat/#473: NonEmptyArray 타입 추가

* feat/#473: ReviewFormFunnel 적용

* refactor/#473: Review페이지 경로 수정

* feat/#473: 템플릿 overflow-y auto로 변경

* feat/#473: 스크롤 디자인 안보이도록 수정

* feat/#473: useFunnel 반환값 객체로 수정

* feat/#473: PetProfile 등록 폼 Funnel 적용

* fix/#473: 믹스견인 경우에만 petSize 기본값 넣어주도록 수정

* feat/#473: 펫 등록 폼 작성 시 페이지 이동해도 상태가 유지되도록 설정

* feat/#473: 폼 작성 중 사용자의 실수를 예방하기 위한 goBackSafely 적용

* feat/#473: 리뷰 스텝 상수화

* fix/#473: 0살(1살미만)일 때 다음 버튼 활성화되도록 수정

* fix/#473: ReviewForm 테스트 깨지는 문제 해결

* refactor/#473: 코드 컨벤션 맞추기 및 불필요한 코드 삭제

* refactor/#473: 인라인 분기문 변수로 추출

* fix: 토큰이 없는 경우 예외 변경 (#480)

* fix: 예외 변경

* test: 테스트 수정

* feat: localhost https 추가 (#485)

* refactor: '사료 선택 도움말 배너'를 닫으면 리액트 내부 페이지 이동 시 안 보이도록 수정 (#486)

* refactor: UI/UX 개선 (#488)

* refactor: AlignSelect를 native select로 변경

- 실제 쿼리스트링과 select option을 동기화
- 아이콘 제거

* refactor: ALIGN_QUERY < REVIEW_ALIGN_QUERY 네이밍 변경

* feat: REVIEW_FILTER_QUERY_STRINGS 상수 추가

* refactor: 불필요한 콜백 제거

* refactor: 리뷰 메타데이터 타입을 상수를 활용하도록 변경

* feat: 리뷰 필터 상태와 쿼리스트링 동기화

* feat: 필터 아이콘 위치 우측으로 변경

* feat: 상수 적용 및 불필요한 useEffect 제거

* refactor: 견종 select 기본 화살표 제거

* feat: ReactQueryDevtools 추가

* refactor: StyledProps $props 형식을 카멜 케이스 네이밍에만 적용

* refactor: theme animation > keyframes로 변경 및 별도의 animation 속성 추가

* refactor: COMMENT_VISIBLE_LINE_LIMIT 오타 수정

* feat: ReviewItem Skeleton 추가

* refactor: 기존 ReviewList > ReviewListAndChart로 변경 및 ReviewList 컴포넌트 분리

* refactor: query key 템플릿 리터럴 제거

* refactor: 변경된 ReviewListAndChart 네이밍 적용

* refactor: query key에 queryString 추가

* refactor: refetch > query key에 queryString을 추가하는 방식으로 변경

* feat: SuspendedImg 추가

* refactor: StarRatingDisplay 별점 이미지 SuspenedImg로 변경

* feat: ReviewControls Skeleton 추가

* refactor: SuspensedImg src를 옵셔널로 변경

* refactor: ReviewItem img > SuspendedImg로 변경

* refactor: 누락됐던 FilterSelectionDisplay 재적용

* feat: SuspenedImg lazy loading 기능 추가

* feat: FoodList Skeleton 추가

* feat: foodList fixture imageUrl 추가

* feat: FoodItem Skeleton 추가 및 LazyImg > SuspendedImg로 변경

* feat: FoodList Skeleton 적용

* feat: FilterBottomSheet 최대 높이 지정

* feat: iPhone8 이하 사이즈 대응

* refactor: ReviewControls 레이아웃 수정

* chore: stylelint rule 추가

* refactor: 사료 필터 목록 레이아웃 최소 높이 설정

* refactor: GuideBanner 작은 디바이스에서 폰트 사이즈 작게 변경

* refactor: 영양기준 국기 이모지 > svg로 변경

* refactor: ReviewList 리뷰 결과 없음 컴포넌트 디자인을 식품 결과 없음과 통일

* fix: NutritionStandardBlock story State를 직접 명명

* refactor: NonEmptyArray type export로 변경

* refactor: styledprops $재적용

* refactor: �OAuth API 호출을 트랜잭션 범위에서 분리 (#471)

* refactor: AuthServiceFacade 적용

* test: AuthServiceFacade를 모킹으로 분리

* test: OAuth API 생성 메서드명 통일

* refactor: 서드파티 성공 응답 fixture 생성

* refactor: AuthControllerTest로 네이밍 변경

* feat: 모바일 디바이스(ios)에서 <input>, <textarea> 포커스 시 자동 zoom-in되는 현상 개선 (#492)

* refactor/#491: 불필요한 코드 삭제

* feat/#491: 글로벌스타일 수정

* fix/#491: 데스크톱 사파리에서 네모로 나오는 라벨 디자인 수정

* feat/#491: 모바일 화면에서 zoom-in되지 않도록 폰트 사이즈 설정

* feat/#491: select border-radius 기본 스타일 제거

* refactor/#491: 중복 css 코드 삭제

* feat: 데스크탑 뷰 전역 레이아웃 구현 (#494)

* feat: DesktopView 구현

* fix: storybook ci 오류 해결

* refactor: redirectUri를 프론트엔드로부터 받는 방식으로 변경 (#456)

* fix: allowCredentials 옵션 및 허용 헤더 추가 (#496)

* feat: 무중단 배포를 위한 환경분리 추가 (#495)

* feat: 쿠키 내 SameSite=None 옵션 추가 (#497)

* fix: allowCredentials 옵션 및 set-Cookie 헤더 추가

* fix: sameSite none 옵션 추가

* fix: sameSite none 옵션 추가

* fix: 쿠키 내 domain 설정 추가 (#498)

* fix: UI 깨짐 해결 (#501)

* feature: 카카오 로그인 redirect uri 동적으로 설정 (#500)

* feat: refreshZipgoAuth api 추가

* feat: response interceptor refresh 로직 추가

* refactor: useNavigate > useEasyNavigate로 수정

* chore: .gitignore *.pem 추가

* feat: https cert key paths 추가

* feat: localhost https 적용

* feat: 환경 변수 추가

- isLocal 추가
- HOMEPAGE 추가
- isDevelop, isProduction, HTTPS 분리
- KAKAO_REDIRECT_URI 삭제 및 webpack에서 동적으로 설정하도록 변경

* feat: 로그인 api 수정

- loginZipgoAuth redirect-uri 쿼리 스트링 추가
- refreshZipgoAuth withCredentials 옵션 추가

* feat: isAuthError static method 추가

* refactor: 불필요한 axios instance 설정 제거

* refactor: 유저 권한 인증 로직 분리 > useCheckAuth

* feat: Priavte route 컴포넌트 추가

* feat: Private route 적용

* refactor: test 코드 제거

* refactor: 카카오 로그인 에러를 Runtime 커스텀 에러로 변경

* refactor: error text가 개행이 가능하도록 변경

* fix: storybook process is not defined 오류 수정

* feat: RefreshToken 전환 (#503)

* feat: RefreshToken 적용

* chore: EOF 추가

* refactor: refreshToken 플로우 변경 (#504)

* docs: README 업데이트 (#505)

* docs: README 업데이트

* docs: README 업데이트

* refactor: 리프레시 쿠키 > JWT 변경 및 버그 + 개선 사항 반영 (#506)

* feat: LoginZipgoaAuth refresh token 추가

* refactor: 기존 refresh token 로직을 쿠키 > JWT로 변경

* fix: FilterDialog Desktop에서 position이 안맞는 현상 수정

* refactor: Template min-height 수정

* refactor: FoodDetailWrapper padding bottom 조절

* refactor: Toast 높이 수정

* refactor: petFoodId type 수정

* refactor: 리뷰 CRUD에 따라 SummaryChart 별점이 동기화 되도록 수정

* fix: UI 깨짐, 스켈레톤 UI 수정 (#513)

* fix: 0살이면 1살 미만으로 뜨도록 수정, 리뷰 더보기 클릭이 안되는 문제 해결 (#512)

* fix/#511: 리뷰 목록 하단 margin 추가

- 리뷰 더보기 클릭이 안되는 문제 해결

* feat/#511: 0살이면 1살 미만으로 뜨도록 수정

* feat/#511: 상품상세 하단 margin 추가

* hotfix: 리뷰, 펫 프로필 업데이트에 따라 상태 동기화 (#514)

* refactor: 불필요한 컴포넌트 분리 병합

* fix: 1분 잘못된 시간 수정

* fix: 리뷰 업데이트에 따라 상품 별점 동기화

* fix: 펫 프로필 업데이트에 따라 펫 프로필 정보 동기화

---------

Co-authored-by: Sangwon Kang <eksovus@gmail.com>
Co-authored-by: wyc <rltgjqmduftlagl@gmail.com>
Co-authored-by: Mooooooo <pjhg410@gmail.com>
Co-authored-by: iamjooon2 <iamjooon2@gmail.com>
Co-authored-by: Seyeon Jeong <79056677+n0eyes@users.noreply.github.com>
Co-authored-by: Kayoung Yoon <dev.kayoung@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[FE] 에러 핸들링 고도화
3 participants