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/dx supabase #102

Merged
merged 40 commits into from
Nov 26, 2024
Merged

Feature/dx supabase #102

merged 40 commits into from
Nov 26, 2024

Conversation

guesung
Copy link
Owner

@guesung guesung commented Nov 26, 2024

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • Supabase 클라이언트 접근 방식을 useSupabaseClient 훅으로 변경하여 클라이언트 인스턴스의 재사용성을 향상시켰습니다.
    • 여러 URL 상수를 CONFIG 객체로 통합하여 URL 관리 방식을 개선했습니다.
    • 새로운 훅인 useSupabaseClientQuery를 도입하여 데이터 쿼리 및 클라이언트 접근을 간소화했습니다.
  • 버그 수정

    • 메모 데이터 접근 방식을 개선하여 데이터의 일관성을 높였습니다.
  • 문서화

    • 코드 내 여러 상수 및 함수의 사용 방식을 업데이트하여 가독성을 향상시켰습니다.

Copy link

coderabbitai bot commented Nov 26, 2024

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

이번 변경 사항은 CONFIG 객체를 사용하여 URL 및 기타 상수의 관리를 통합하는 데 중점을 두고 있습니다. 여러 파일에서 URL 관련 상수의 사용 방식이 수정되었으며, useSupabaseClient 훅을 도입하여 Supabase 클라이언트를 보다 효율적으로 관리하도록 변경되었습니다. 또한, 여러 컴포넌트와 훅에서 비슷한 패턴으로 새로운 구조가 반영되었으며, TypeScript 구성 파일과 의존성 관리에도 변화가 있었습니다.

Changes

파일 경로 변경 요약
chrome-extension/lib/background/index.ts URL 관련 상수를 CONFIG 객체로 통합하고, chrome.runtime.onInstalled 리스너에서 URL 업데이트.
chrome-extension/utils/openai.ts OPENAI_API_KEYCONFIG.openApiKey로 변경하여 API 키 접근 방식 수정.
package.json @supabase/ssrlucide-react 의존성 추가 및 수정.
packages/shared/package.json ./hooks/web 모듈에 대한 새로운 export 추가.
packages/shared/src/constants/Config.ts 개별 상수를 CONFIG 객체로 통합하여 구성 상수 정의 방식 수정.
packages/shared/src/constants/Cookie.ts 쿠키 키를 COOKIE_KEY 객체로 통합.
packages/shared/src/constants/Supabase.ts Supabase 관련 상수를 SUPABASE 객체로 통합.
packages/shared/src/constants/Url.ts URL 상수를 URL 객체로 통합.
packages/shared/src/hooks/extension/index.ts useSupabaseClientQuery 함수 추가.
packages/shared/src/hooks/extension/useSupabaseClientQuery.ts 새로운 훅 useSupabaseClientQuery 추가.
packages/shared/src/hooks/index.ts useSupabaseClient 훅에 대한 export 추가.
packages/shared/src/hooks/supabase/index.ts useSupabaseClient 함수 export 제거.
packages/shared/src/hooks/supabase/useCategoryPostMutation.ts useMutation에서 async 키워드 제거.
packages/shared/src/hooks/supabase/useCategoryQuery.ts getCategorygetCategories로 변경.
packages/shared/src/hooks/supabase/useMemoPatchMutation.ts 타입 및 인터페이스 리팩토링.
packages/shared/src/hooks/supabase/useMemoPostMutation.ts 타입 안전성을 위한 수정.
packages/shared/src/utils/Environment.ts 환경 변수를 CONFIG.nodeEnv로 업데이트.
packages/shared/src/utils/Notion.ts API 엔드포인트를 CONFIG.makeWebhookNotionApi로 변경.
packages/shared/src/utils/Sentry.ts Sentry 초기화에서 DSN을 CONFIG.sentryDsn으로 변경.
packages/web/package.json @supabase/ssr 의존성 제거.
packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx URL_CHROME_STORE 제거.
packages/web/src/app/[lng]/login/components/LoginSection/index.tsx 로그인 버튼의 formAction prop 수정.
packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx queryClient 변수 선언 위치 변경.
packages/web/src/app/[lng]/memos/components/MemoDialog/index.tsx getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarMenuItemAddCategory.tsx getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx memos prop 타입 업데이트.
packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx memo prop 타입 업데이트 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/components/MemoView/index.tsx getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/app/[lng]/memos/layout.tsx COOKIE_KEY_SIDE_BAR_STATECOOKIE_KEY.sideBarState로 변경.
packages/web/src/app/[lng]/memos/page.tsx getMemogetMemos로 변경.
packages/web/src/app/auth/callback-email/route.ts 쿠키 키를 COOKIE_KEY 객체로 변경.
packages/web/src/app/auth/callback/route.ts 쿠키 키를 COOKIE_KEY 객체로 변경.
packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts URL 접근 방식을 URL 객체로 변경.
packages/web/src/app/components/Introduction.tsx URL_CHROME_STOREURL로 변경.
packages/web/src/components/Footer.tsx URL_CHROME_STOREURL로 변경.
packages/web/src/components/ui/sidebar.tsx 사이드바 상태 쿠키 키를 COOKIE_KEY로 변경.
packages/web/src/constants/Config.ts 개별 상수를 CONFIG 객체로 통합.
packages/web/src/hooks/index.ts useSupabaseClient 훅에 대한 export 추가.
packages/web/src/hooks/useMemoDeleteMutation.ts getSupabaseClient 제거 및 useSupabaseClient 사용.
packages/web/src/hooks/useSupabaseClient.ts 새로운 훅 useSupabaseClient 추가.
packages/web/src/middleware.ts isStringArraycheckStringArray로 변경.
packages/web/src/utils/index.ts isStringArray export 제거.
packages/web/src/utils/middleware.ts Supabase 클라이언트 인스턴스 생성 방식 수정.
packages/web/src/utils/supabase.client.ts Supabase 클라이언트 생성 방식 수정 및 상수 접근 방식 변경.
packages/web/src/utils/supabase.server.ts Supabase 클라이언트 인스턴스 관리 방식 수정.
pages/content-ui/src/index.tsx 여러 유틸리티 함수 제거 및 메모 기능 삭제.
pages/options/src/components/OptionForm.tsx getMemogetMemos로 변경.
pages/side-panel/src/components/LoginSection.tsx WEB_URLCONFIG로 변경.
pages/side-panel/src/components/MemoForm.tsx useSupabaseClientuseSupabaseClientQuery로 변경.
pages/side-panel/src/components/MemoHeader.tsx useSupabaseClientuseSupabaseClientQuery로 변경.
pages/side-panel/src/hoc/withAuthentication.tsx useSupabaseClientuseSupabaseClientQuery로 변경.
pages/side-panel/src/utils/Url.ts WEB_URLCONFIG.webUrl로 변경.

Possibly related PRs

  • Feature: 최적화 #97: PR #97에서 언급된 URL 관리 통합 및 접근 방식 재구성에 대한 변경 사항이 이 PR과 관련이 있을 수 있습니다.

🐰 변화의 바람이 불어와
URL이 한 곳에 모여,
Supabase도 손쉽게,
이제는 모두가 편리해!
우리의 코드가 더욱 깔끔해져,
새로운 시작을 함께해요! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@guesung
Copy link
Owner Author

guesung commented Nov 26, 2024

@coderabbitai review

Copy link

coderabbitai bot commented Nov 26, 2024

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@guesung
Copy link
Owner Author

guesung commented Nov 26, 2024

@coderabbitai full review

Copy link

coderabbitai bot commented Nov 26, 2024

✅ Actions performed

Full review triggered.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (59)
packages/shared/src/constants/Cookie.ts (1)

1-5: 타입 안전성을 위해 타입 정의를 추가하는 것이 좋겠습니다.

타입스크립트의 장점을 최대한 활용하기 위해 다음과 같은 개선을 제안합니다:

+type CookieKeyType = {
+  readonly accessToken: string;
+  readonly refreshToken: string;
+  readonly sideBarState: string;
+};
+
-export const COOKIE_KEY = {
+export const COOKIE_KEY: CookieKeyType = {
   accessToken: 'access_token',
   refreshToken: 'refresh_token',
   sideBarState: 'sidebar_state',
 };

이렇게 하면:

  • 타입 안전성이 향상됩니다
  • readonly를 통해 실수로 값이 변경되는 것을 방지할 수 있습니다
  • IDE의 자동완성 기능이 더 정확해집니다
packages/shared/src/utils/String.ts (1)

1-4: 더 간결한 구현을 제안드립니다.

현재 구현은 명시적인 return false를 사용하고 있는데, 다음과 같이 더 간결하게 작성할 수 있습니다:

-export const checkStringArray = (value: unknown): value is string[] => {
-  if (Array.isArray(value) && value.every(item => typeof item === 'string')) return true;
-  return false;
-};
+export const checkStringArray = (value: unknown): value is string[] => 
+  Array.isArray(value) && value.every(item => typeof item === 'string');
packages/shared/src/constants/Supabase.ts (2)

1-1: 상수 네이밍 컨벤션 제안

상수 객체의 이름이 일반적입니다. 더 구체적인 이름을 사용하는 것이 좋습니다.

-export const SUPABASE = {
+export const SUPABASE_CONFIG = {

5-5: 스키마 상수에 대한 문서화 필요

schemaMemo 상수의 용도와 의미를 설명하는 주석을 추가하면 좋을 것 같습니다.

+  /** Supabase 데이터베이스의 메모 테이블 스키마 이름 */
   schemaMemo: 'memo' as const,
packages/shared/src/constants/Url.ts (1)

1-6: URL 상수들의 구조화된 관리 방식으로의 개선이 확인됩니다.

개별 상수들을 하나의 객체로 통합한 것은 좋은 접근이지만, 타입 안전성을 위해 다음과 같은 개선을 제안드립니다.

+type URLType = {
+  guideKo: string;
+  guideEn: string;
+  googleForm: string;
+  chromeStore: string;
+};
+
-export const URL = {
+export const URL: URLType = {
   guideKo: 'https://guesung.notion.site/8a740938aa6547b88d09dbab7cb2222b',
   guideEn: 'https://guesung.notion.site/10d89de02fde803c99c9e3027c2d10d5',
   googleForm: 'https://forms.gle/qHkL7PeknaCy5QfY6',
   chromeStore: 'https://chromewebstore.google.com/detail/web-memo/eaiojpmgklfngpjddhoalgcpkepgkclh',
 };
pages/side-panel/src/utils/Url.ts (1)

3-10: URL 생성 함수들의 구현이 깔끔합니다.

두 함수 모두:

  • 단일 책임 원칙을 잘 준수하고 있습니다
  • 옵셔널 파라미터 처리가 적절합니다
  • URL 구성이 일관성 있게 구현되어 있습니다

다만, 타입 안전성을 높이기 위해 다음과 같은 개선을 제안드립니다:

-export const getMemoUrl = (id?: number) => {
+export const getMemoUrl = (id?: number): string => {
   if (id) return `${CONFIG.webUrl}/memos?id=${id}`;
   return `${CONFIG.webUrl}/memos`;
 };

-export const getMemoWishListUrl = (id?: number) => {
+export const getMemoWishListUrl = (id?: number): string => {
   if (id) return `${CONFIG.webUrl}/memos?wish=true&id=${id}`;
   return `${CONFIG.webUrl}/memos?wish=true`;
 };
packages/shared/src/hooks/extension/useSupabaseClientQuery.ts (1)

5-11: 에러 바운더리 구현을 고려해보세요.

Suspense를 사용하는 컴포넌트이므로, 상위에 에러 바운더리 구현을 추가하면 좋을 것 같습니다.

예시 구현:

// ErrorBoundary.tsx
import { Component, ReactNode } from 'react';

interface Props {
  children: ReactNode;
  fallback: ReactNode;
}

interface State {
  hasError: boolean;
}

export class ErrorBoundary extends Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  render() {
    if (this.state.hasError) {
      return this.props.fallback;
    }

    return this.props.children;
  }
}
packages/web/src/constants/Config.ts (1)

3-7: 타입 안전성 개선이 필요합니다

설정 값들을 하나의 객체로 중앙화한 것은 좋은 패턴입니다. 하지만 타입 안전성을 높이기 위해 다음과 같은 개선을 제안합니다:

+interface Config {
+  webUrl: string;
+  supabaseUrl: string;
+  supabaseAnonKey: string;
+}

-export const CONFIG = {
+export const CONFIG: Config = {
   webUrl: getSafeConfig('NEXT_PUBLIC_WEB_URL', process.env.NEXT_PUBLIC_WEB_URL),
   supabaseUrl: getSafeConfig('NEXT_PUBLIC_SUPABASE_URL', process.env.NEXT_PUBLIC_SUPABASE_URL),
   supabaseAnonKey: getSafeConfig('NEXT_PUBLIC_SUPABASE_ANON_KEY', process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY),
 };
packages/web/src/hooks/useSupabaseClient.ts (1)

5-5: 전역 변수 사용에 대한 주의 필요

전역 client 변수를 사용하는 것은 다음과 같은 잠재적인 문제를 야기할 수 있습니다:

  • 테스트 환경에서 상태 격리가 어려울 수 있습니다
  • 여러 Supabase 프로젝트를 동시에 사용해야 하는 경우 제한이 될 수 있습니다

클래스 기반의 싱글톤 패턴이나 React Context를 사용하는 것을 고려해보세요.

packages/shared/src/utils/extension/Storage.ts (1)

13-18: 에러 처리 개선을 고려해보세요.

쿠키 제거 작업 시 발생할 수 있는 예외 상황에 대한 처리가 없습니다. Chrome API 호출 실패 시의 에러 처리를 추가하는 것이 좋을 것 같습니다.

다음과 같은 방식으로 개선할 수 있습니다:

 export const removeSession = async () => {
+  try {
     await chrome.cookies.remove({
       name: SUPABASE.authToken,
       url: CONFIG.webUrl,
     });
+  } catch (error) {
+    console.error('세션 제거 중 오류 발생:', error);
+    throw error;
+  }
 };
pages/content-ui/src/index.tsx (2)

Line range hint 6-14: 개발 환경 전용 기능에 대한 문서화 제안

renderOpenSidePanelButton 함수가 개발 환경에서만 동작하는 이유와 목적에 대한 설명이 있으면 좋을 것 같습니다.

다음과 같이 문서화를 추가하는 것을 제안드립니다:

+/**
+ * 개발 환경에서만 사이드 패널 버튼을 렌더링합니다.
+ * 프로덕션 환경에서는 이 기능이 비활성화됩니다.
+ */
 const renderOpenSidePanelButton = async () => {

Line range hint 16-18: 초기화 함수 에러 처리 개선 필요

responsePageContent()renderOpenSidePanelButton() 호출에 대한 에러 처리가 없습니다. 실패 시 사용자 경험에 영향을 줄 수 있습니다.

다음과 같은 에러 처리 추가를 제안드립니다:

-responsePageContent();
-renderOpenSidePanelButton();
+try {
+  await responsePageContent();
+  await renderOpenSidePanelButton();
+} catch (error) {
+  console.error('초기화 중 오류 발생:', error);
+}
packages/shared/src/hooks/supabase/useCategoryQuery.ts (1)

12-12: 쿼리 함수 구현이 개선되었습니다

화살표 함수를 사용한 간결한 구현으로 변경되었습니다. 기존의 bind 사용 대신 더 현대적이고 읽기 쉬운 방식으로 개선되었습니다.

더 나아가 아래와 같이 에러 처리를 추가하는 것을 고려해보세요:

-    queryFn: () => getCategories(supabaseClient),
+    queryFn: async () => {
+      try {
+        return await getCategories(supabaseClient);
+      } catch (error) {
+        console.error('카테고리 조회 중 오류 발생:', error);
+        throw error;
+      }
+    },
packages/shared/src/hooks/supabase/useSupabaseUser.ts (1)

16-19: 반환 값의 타입 안정성을 개선하면 좋을 것 같습니다.

현재 구조는 명확하고 사용하기 편리하지만, 타입 안정성을 더욱 강화하기 위해 다음과 같은 개선을 제안드립니다.

+ type UseSupabaseUserReturn = {
+   user: UserResponse['data'];
+ } & ReturnType<typeof useSuspenseQuery<UserResponse, Error>>;

  export default function useSupabaseUser({ supabaseClient }: UseSupabaseUserProps) {
    const query = useSuspenseQuery<UserResponse, Error>({
      queryFn: () => supabaseClient.auth.getUser(),
      queryKey: QUERY_KEY.user(),
    });

-   return {
+   return {
      ...query,
      user: query.data,
-   };
+   } satisfies UseSupabaseUserReturn;
  }
packages/shared/tsconfig.json (1)

14-16: 타입 선언 관련 설정 개선됨

declarationMapstripInternal 추가는 타입 선언 파일의 품질을 향상시킬 것으로 보입니다. 다만, module을 'es2015'로 변경한 것은 다음 사항들을 고려해야 합니다:

  • 이전 버전의 Node.js와의 호환성
  • 외부 라이브러리와의 상호 운용성
packages/shared/src/hooks/supabase/useCategoryPostMutation.ts (2)

10-10: 낙관적 업데이트 구현 제안

낙관적 업데이트를 구현하면 사용자 경험을 크게 향상시킬 수 있습니다. onMutate 핸들러를 추가하여 서버 응답 전에 클라이언트 상태를 즉시 업데이트하는 것을 권장드립니다.

낙관적 업데이트 구현에 도움이 필요하시다면 예제 코드를 제공해드릴 수 있습니다. GitHub 이슈를 생성해드릴까요?


Line range hint 14-19: 코드가 깔끔해졌네요!

async 키워드를 제거한 것은 좋은 변경입니다. insertCategory가 이미 Promise를 반환하므로 불필요한 Promise 래핑을 피할 수 있습니다.

에러 처리를 강화하기 위해 다음과 같은 onError 핸들러 추가를 고려해보세요:

 return useMutation<CategorySupabaseResponse, Error, CategoryTable['Insert']>({
   mutationFn: postCategoryProps => insertCategory(supabaseClient, postCategoryProps),
   onSuccess: () => {
     queryClient.invalidateQueries({ queryKey: QUERY_KEY.category() });
   },
+  onError: (error) => {
+    console.error('카테고리 추가 중 오류 발생:', error);
+    // 사용자에게 에러 메시지 표시 로직 추가
+  },
 });
packages/shared/src/hooks/supabase/useMemosQuery.ts (2)

9-11: 인터페이스에 JSDoc 문서를 추가하면 좋을 것 같습니다.

사용자가 이 인터페이스를 더 쉽게 이해할 수 있도록 각 프로퍼티의 목적과 사용법을 설명하는 문서를 추가하는 것이 좋겠습니다.

예시:

+/**
+ * useMemosQuery 훅의 프로퍼티 인터페이스
+ * @property supabaseClient - Supabase 클라이언트 인스턴스
+ * @extends {Omit<UseQueryOptions<QueryData, QueryError>, 'queryKey' | 'queryFn'>}
+ */
interface UseMemosQueryProps extends Omit<UseQueryOptions<QueryData, QueryError>, 'queryKey' | 'queryFn'> {
  supabaseClient: MemoSupabaseClient;
}

Line range hint 13-23: 에러 처리 개선을 고려해보세요.

현재 구현은 잘 되어 있지만, 다음과 같은 에러 처리 개선을 제안드립니다:

  1. 네트워크 오류나 Supabase 관련 오류에 대한 구체적인 처리
  2. 사용자에게 친숙한 에러 메시지 제공

예시:

 export default function useMemosQuery({ supabaseClient, ...useQueryProps }: UseMemosQueryProps) {
   const query = useQuery<QueryData, QueryError>({
     ...useQueryProps,
     queryFn: () => getMemos(supabaseClient),
     queryKey: QUERY_KEY.memos(),
     enabled: !!supabaseClient,
+    retry: (failureCount, error) => {
+      // 특정 에러의 경우 재시도하지 않음
+      if (error.message.includes('권한이 없습니다')) return false;
+      return failureCount < 3;
+    },
+    onError: (error) => {
+      console.error('메모 조회 중 오류 발생:', error);
+    }
   });

   return {
     ...query,
     memos: query.data?.data,
   };
 }
packages/shared/src/hooks/supabase/useMemoQuery.ts (1)

26-29: 반환 타입에 대한 명시적 타입 정의가 필요합니다.

반환 구조는 적절하나, 타입 안전성을 위해 명시적인 타입 정의를 추가하는 것이 좋습니다.

다음과 같은 개선을 제안드립니다:

+ type UseMemoQueryResult = {
+   memo: Memo | null;
+ } & UseQueryResult<Memo | null>;
+
- return {
+ return {
    ...query,
    memo: query.data,
- };
+ } as UseMemoQueryResult;
packages/shared/src/constants/Config.ts (1)

6-17: 타입 안전성 개선을 위한 제안

현재 타입 단언(type assertion)을 사용하고 있는데, 이를 제네릭 함수와 상수로 개선하면 더 안전한 타입 체크가 가능합니다.

다음과 같은 개선을 제안드립니다:

type NodeEnv = 'development' | 'production';
const NODE_ENV_VALUES = ['development', 'production'] as const;

function getSafeConfigWithType<T extends string>(
  name: string,
  value: string | undefined,
  allowedValues: readonly T[]
): T {
  const safeValue = getSafeConfig(name, value);
  if (!allowedValues.includes(safeValue as T)) {
    throw new Error(`${name}의 값이 유효하지 않습니다: ${safeValue}`);
  }
  return safeValue as T;
}

export const CONFIG = {
  // ... other configs ...
  nodeEnv: getSafeConfigWithType('NODE_ENV', process.env.NODE_ENV, NODE_ENV_VALUES),
  makeWebhookNotionApi: getSafeConfigWithType(
    'MAKE_WEBHOOK_NOTION_API',
    process.env.MAKE_WEBHOOK_NOTION_API,
    NODE_ENV_VALUES
  ),
  // ... other configs ...
};
packages/web/src/app/auth/callback-email/route.ts (2)

Line range hint 23-29: 심각한 오류: 리프레시 토큰이 잘못된 키로 저장되고 있습니다.

COOKIE_KEY.sideBarState를 사용하여 리프레시 토큰을 저장하고 있습니다. 이는 명백한 오류입니다.

다음과 같이 수정해주세요:

- cookieStore.set(COOKIE_KEY.sideBarState, sessionData.session.refresh_token, {
+ cookieStore.set(COOKIE_KEY.refreshToken, sessionData.session.refresh_token, {
    maxAge: 3600 * 24 * 365, // 1년
    httpOnly: true,
-   secure: process.env.NODE_ENV === 'production',
+   secure: true,
    sameSite: 'lax',
    path: '/',
  });

Line range hint 11-13: 에러 처리를 개선해주세요.

현재 세션이 없을 때 단순히 'no session' 에러를 던지고 있습니다. 사용자 친화적인 에러 처리가 필요합니다.

다음과 같은 개선을 제안드립니다:

- if (!sessionData.session) throw new Error('no session');
+ if (!sessionData.session) {
+   console.error('인증 세션을 찾을 수 없습니다.');
+   return NextResponse.redirect(requestUrl.origin + PATHS.login + '?error=no_session');
+ }
packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx (1)

Line range hint 20-26: 새로고침 중 로딩 상태 처리 추가를 제안드립니다.

사용자 경험 향상을 위해 새로고침 작업 중에 로딩 상태를 표시하는 것이 좋을 것 같습니다.

다음과 같은 구현을 제안드립니다:

export default function RefreshButton({ lng }: RefreshButtonProps) {
  const { t } = useTranslation(lng);
  const { toast } = useToast();
  const queryClient = useQueryClient();
+ const [isRefreshing, setIsRefreshing] = useState(false);

  const handleRefreshClick = async () => {
+   setIsRefreshing(true);
    try {
      driverObj.moveNext();
      LocalStorage.setTrue(LOCAL_STORAGE_KEY_MAP.guide);
      await queryClient.invalidateQueries({ queryKey: QUERY_KEY.memos() });
      toast({ title: t('toastMessage.refresh') });
+   } finally {
+     setIsRefreshing(false);
+   }
  };

  return (
    <Button 
      size="icon" 
      variant="outline" 
      id="refresh" 
      onClick={handleRefreshClick}
+     disabled={isRefreshing}
    >
-     <RefreshCwIcon size={16} />
+     <RefreshCwIcon size={16} className={isRefreshing ? 'animate-spin' : ''} />
    </Button>
  );
}
packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarMenuItemAddCategory.tsx (3)

5-5: Supabase 클라이언트 관리 방식이 개선되었습니다.

useSupabaseClient 훅을 사용하여 Supabase 클라이언트를 관리하는 방식으로 변경한 것이 좋은 개선사항입니다. 이는 다음과 같은 이점이 있습니다:

  • React의 훅 기반 아키텍처와 더 잘 어울립니다
  • 컴포넌트 테스트가 더 용이해집니다
  • 클라이언트 인스턴스 관리가 중앙화됩니다

Also applies to: 12-12, 20-20


Line range hint 20-24: 카테고리 생성 로직이 깔끔하게 구현되었습니다.

useCategoryPostMutation에 supabaseClient를 주입하는 방식과 폼 제출 처리가 잘 구현되어 있습니다. 다만, 다음과 같은 개선사항을 고려해보시면 좋을 것 같습니다:

  • 카테고리 생성 후 입력 필드를 초기화하고 편집 모드를 종료하는 로직 추가
  • 카테고리 생성 중 로딩 상태 표시
  const onSubmit = handleSubmit(({ category }) => {
-   mutateCategoryPost({ name: category });
+   mutateCategoryPost({ name: category }, {
+     onSuccess: () => {
+       setIsEditMode(false);
+       reset();
+     }
+   });
  });

Line range hint 31-39: 접근성 개선이 필요합니다.

PlusIcon을 사용하는 부분에 접근성 속성을 추가하면 좋을 것 같습니다.

  return (
    <p className="flex cursor-pointer justify-center">
-     <PlusIcon size={16} onClick={handlePlusIconClick} />
+     <PlusIcon 
+       size={16} 
+       onClick={handlePlusIconClick}
+       role="button"
+       aria-label="카테고리 추가"
+     />
    </p>
  );
packages/web/src/app/components/Introduction.tsx (2)

7-8: className 구성을 개선하면 좋을 것 같습니다.

className의 일관성 있는 구성을 위해 다음과 같은 순서로 정렬하는 것을 제안드립니다:

  1. 레이아웃 관련 (flex, grid 등)
  2. 스페이싱 관련 (gap, padding 등)
  3. 스타일링 관련 (colors, gradients 등)
-    <section className="flex flex-col gap-4 from-cyan-500 to-blue-500 px-12 pt-40 lg:flex-row">
+    <section className="flex flex-col lg:flex-row gap-4 px-12 pt-40 from-cyan-500 to-blue-500">

15-19: 목록의 접근성을 개선하면 좋을 것 같습니다.

현재 구현은 기능적으로는 문제가 없으나, 스크린 리더 사용자를 위한 접근성 개선을 제안드립니다.

-        <ul className="text-md list-decimal">
+        <ul className="text-md list-decimal" role="list" aria-label="웹 메모의 주요 기능">
packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts (1)

24-24: URL 참조 방식이 일관성 있게 변경되었습니다.

URL 객체를 통한 접근 방식으로 변경된 것이 좋습니다. 다만, URL 객체의 구조와 사용 가능한 속성들에 대한 문서화를 추가하면 더 좋을 것 같습니다.

Also applies to: 37-37

pages/side-panel/src/components/MemoHeader.tsx (1)

Line range hint 7-42: 컴포넌트 아키텍처 개선 제안

현재 구현은 잘 되어 있으나, 다음 사항들을 고려해보시면 좋겠습니다:

  1. 에러 바운더리 구현을 통한 오류 처리 강화
  2. 로딩 상태 표시 추가
  3. useCallback을 사용한 handleMemoClick 최적화
packages/web/src/middleware.ts (2)

1-7: import 구문 정리가 필요합니다.

import 구문들이 일관성 없이 정렬되어 있습니다. 다음과 같이 그룹화하여 정리하는 것을 제안드립니다:

import { NextRequest, NextResponse } from 'next/server';
-import { updateSession } from './utils';
import acceptLanguage from 'accept-language';
+import { checkStringArray } from '@extension/shared/utils';
+
import { fallbackLng, languages, cookieName } from './app/i18n/settings';
-import { checkStringArray } from '@extension/shared/utils';
+import { updateSession } from './utils';

Line range hint 9-34: 미들웨어 함수의 에러 처리가 미흡합니다.

미들웨어 함수에서 다음과 같은 잠재적인 에러 상황에 대한 처리가 필요합니다:

  • request.headers.get('referer')가 유효하지 않은 URL일 경우
  • updateSession 함수 실행 중 발생할 수 있는 예외 상황

다음과 같은 방식으로 에러 처리를 추가하는 것을 제안드립니다:

  if (request.headers.has('referer')) {
-   const refererUrl = new URL(request.headers.get('referer') ?? '');
+   try {
+     const refererUrl = new URL(request.headers.get('referer') ?? '');
+     const lngInReferer = languages.find(l => refererUrl.pathname.startsWith(`/${l}`));
+     const response = NextResponse.next();
+     if (lngInReferer) response.cookies.set(cookieName, lngInReferer);
+     return response;
+   } catch (error) {
+     console.error('Invalid referer URL:', error);
+     return NextResponse.next();
+   }
-   const lngInReferer = languages.find(l => refererUrl.pathname.startsWith(`/${l}`));
-   const response = NextResponse.next();
-   if (lngInReferer) response.cookies.set(cookieName, lngInReferer);
-   return response;
  }

- return await updateSession(request);
+ try {
+   return await updateSession(request);
+ } catch (error) {
+   console.error('Failed to update session:', error);
+   return NextResponse.next();
+ }
packages/web/src/app/[lng]/memos/layout.tsx (1)

Line range hint 18-23: 인증 로직에 에러 처리 추가를 고려해주세요.

현재 구현은 기본적인 인증 체크를 수행하고 있지만, supabaseClient 생성이나 checkUserLogin 과정에서 발생할 수 있는 예외 상황에 대한 처리가 없습니다.

다음과 같은 에러 처리 추가를 제안드립니다:

export default async function Layout({ children, params: { lng } }: LayoutProps) {
-  const supabaseClient = getSupabaseClient();
-  const isUserLogin = await checkUserLogin(supabaseClient);
-  if (!isUserLogin) redirect(PATHS.login);
+  try {
+    const supabaseClient = getSupabaseClient();
+    const isUserLogin = await checkUserLogin(supabaseClient);
+    if (!isUserLogin) redirect(PATHS.login);
+  } catch (error) {
+    console.error('인증 확인 중 오류 발생:', error);
+    redirect(PATHS.login);
+  }
packages/shared/src/hooks/supabase/useMemoPostMutation.ts (1)

Line range hint 15-36: 에러 처리 로직을 개선할 수 있습니다.

현재 구현에서는 NoMemosError를 던지기 전에 여러 단계의 널 체크를 수행하고 있습니다. 이를 더 간결하게 리팩토링할 수 있습니다.

다음과 같은 리팩토링을 제안합니다:

    onSuccess: async (result, variables, context) => {
      const { data: newData } = result;
      await queryClient.cancelQueries({ queryKey: QUERY_KEY.memos() });
      const previousMemos = queryClient.getQueryData<MemoSupabaseResponse>(QUERY_KEY.memos());
-      if (!previousMemos || !newData) throw new NoMemosError();
-      const { data: previousMemosData } = previousMemos;
-      if (!previousMemosData) throw new NoMemosError();
+      if (!previousMemos?.data || !newData) throw new NoMemosError();
-      const newMemosData = newData.concat(previousMemosData);
+      const newMemosData = newData.concat(previousMemos.data);
      await queryClient.setQueryData(QUERY_KEY.memos(), { ...previousMemos, data: newMemosData });
packages/web/src/app/[lng]/login/components/LoginSection/index.tsx (1)

29-31: 테스트 계정 로그인 코드는 제거를 고려해주세요.

프로덕션 코드에 테스트 계정 관련 코드가 주석 처리된 채로 남아있는 것은 바람직하지 않습니다. 테스트 목적이라면 테스트 파일로 분리하는 것이 좋습니다.

다음과 같이 주석 처리된 코드를 제거하는 것을 추천드립니다:

-        {/* <button formAction={() => signInWithEmail(SUPABASE.testEmail, SUPABASE.testPassword)} className="btn">
-          테스트 계정으로 로그인
-        </button> */}
packages/shared/src/utils/extension/Supabase.ts (2)

30-35: 인증 오류 메시지를 더 구체적으로 개선해야 합니다.

현재 모든 오류가 동일한 "로그인을 먼저 해주세요" 메시지로 처리되고 있습니다. 사용자가 문제를 더 쉽게 파악할 수 있도록 구체적인 오류 메시지가 필요합니다.

다음과 같이 개선할 수 있습니다:

-    if (!accessTokenFromWeb || !refreshTokenCookieFromWeb) throw new Error('로그인을 먼저 해주세요.');
+    if (!accessTokenFromWeb) throw new Error('액세스 토큰이 없습니다. 다시 로그인해 주세요.');
+    if (!refreshTokenCookieFromWeb) throw new Error('리프레시 토큰이 없습니다. 다시 로그인해 주세요.');

Line range hint 7-45: Supabase 클라이언트 인스턴스 관리 전략 검토가 필요합니다.

현재 구현은 getSupabaseClient가 호출될 때마다 새로운 클라이언트 인스턴스를 생성합니다. 성능 최적화를 위해 싱글톤 패턴의 도입을 고려해 보시기 바랍니다.

예시 구현:

let supabaseClientInstance: SupabaseClient<Database> | null = null;

export const getSupabaseClient = async () => {
  if (supabaseClientInstance) {
    return supabaseClientInstance;
  }
  
  // 현재 구현된 로직
  // ...
  
  supabaseClientInstance = newClient;
  return supabaseClientInstance;
};
packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx (1)

Line range hint 20-53: 컴포넌트 구조가 잘 설계되었습니다만, 에러 처리를 개선하면 좋겠습니다.

메모이제이션과 타입 안전성이 잘 구현되어 있습니다. 다만, categories가 undefined일 때의 처리를 추가하면 좋겠습니다.

다음과 같은 개선을 제안드립니다:

- {categories?.map(category => (
+ {categories?.length ? (
+   categories.map(category => (
    <SidebarMenuItem key={category.name}>
      <SidebarMenuButton asChild>
        <button id={category.name} onClick={handleCategoryClick}>
          <span>{category.name}</span>
        </button>
      </SidebarMenuButton>
    </SidebarMenuItem>
+   ))
+ ) : (
+   <SidebarMenuItem>
+     <span>{t('sideBar.noCategories')}</span>
+   </SidebarMenuItem>
+ )}
packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx (1)

Line range hint 26-57: 컴포넌트 로직 검토 완료

무한 스크롤 구현과 메모 렌더링 로직이 적절히 구현되어 있습니다. 다만, 성능 최적화를 위한 제안사항이 있습니다:

  1. items 상태 업데이트 시 불필요한 배열 복사를 피하기 위해 useCallback을 고려해보세요.
  2. 메모 아이템의 애니메이션 설정을 컴포넌트 외부로 분리하면 가독성이 향상될 것 같습니다.
+const ANIMATION_VARIANTS = {
+  initial: { opacity: 0, y: 20, scale: 0.8 },
+  animate: { opacity: 1, y: 0, scale: 1 },
+};

 export default function MemoGrid({ lng, memos, gridKey }: MemoGridProps) {
   const [items, setItems] = useState(() => getMemoItems(0, MEMO_UNIT));
+  
+  const handleAppend = useCallback((e: any) => {
+    if (items.length >= memos.length) return;
+    
+    const nextGroupKey = (+e.groupKey! || 0) + 1;
+    const maxAddItem = items.length + MEMO_UNIT > memos.length 
+      ? memos.length - items.length 
+      : MEMO_UNIT;
+
+    if (maxAddItem === 0) return;
+    
+    setItems(prev => [...prev, ...getMemoItems(nextGroupKey, maxAddItem)]);
+  }, [items.length, memos.length]);
packages/shared/src/utils/Supabase.ts (2)

5-24: 메모 관련 함수들의 일관성이 향상되었습니다.

SUPABASE.schemaMemo를 사용하여 스키마 참조를 일관되게 관리하고 있습니다. 타입 정의도 명확하게 되어있습니다.

스키마 참조 방식의 통일성 개선이 필요합니다.

메모 관련 함수들은 SUPABASE.schemaMemo를 사용하는 반면, 카테고리 관련 함수들은 하드코딩된 문자열을 사용하고 있습니다.

다음과 같이 카테고리 스키마도 상수로 관리하는 것을 추천드립니다:

- supabaseClient.from('category')
+ supabaseClient.from(SUPABASE.schemaCategory)

Line range hint 26-30: 사용자 인증 함수의 반환 타입을 명시적으로 지정해주세요.

현재 함수들이 잘 구현되어 있지만, 타입 안정성을 높이기 위해 반환 타입을 명시하면 좋을 것 같습니다.

다음과 같이 반환 타입을 추가하는 것을 추천드립니다:

- export const getUser = async (supabaseClient: MemoSupabaseClient) =>
+ export const getUser = async (supabaseClient: MemoSupabaseClient): Promise<{ data: { user: User | null }, error: Error | null }> =>

- export const checkUserLogin = async (supabaseClient: MemoSupabaseClient) => {
+ export const checkUserLogin = async (supabaseClient: MemoSupabaseClient): Promise<boolean> => {
packages/shared/src/hooks/supabase/useMemoPatchMutation.ts (2)

13-15: 인터페이스에 JSDoc 문서를 추가하면 좋을 것 같습니다.

인터페이스의 목적과 각 속성에 대한 설명을 추가하면 코드의 이해도를 높일 수 있습니다.

다음과 같이 문서를 추가해보세요:

+/**
+ * useMemoPatchMutation 훅의 속성을 정의하는 인터페이스
+ * @extends UseMutationOptions<MutationData, MutationError, MutationVariables>
+ */
 interface UseMemoPatchMutationProps extends UseMutationOptions<MutationData, MutationError, MutationVariables> {
+  /** Supabase 클라이언트 인스턴스 */
   supabaseClient: MemoSupabaseClient;
 }

Line range hint 17-39: 성능 최적화를 위한 제안사항이 있습니다.

현재 구현은 견고하지만, 다음과 같은 최적화를 고려해보세요:

  1. onMutate 함수에서 previousMemosData.splice()는 배열을 직접 수정합니다. 불변성을 유지하기 위해 새로운 배열을 생성하는 것이 좋습니다.
  2. 메모 검색 시 findfindIndex를 각각 호출하는 대신, 한 번의 순회로 처리할 수 있습니다.

다음과 같이 수정해보세요:

-      const currentMemoIndex = previousMemosData.findIndex(memo => memo.id === id);
-      const currentMemoBase = previousMemosData.find(memo => memo.id === id);
-
-      if (currentMemoIndex === -1 || !currentMemoBase) throw new NoMemoError();
-
-      previousMemosData.splice(currentMemoIndex, 1, { ...currentMemoBase, ...memoRequest });
+      let currentMemoIndex = -1;
+      let currentMemoBase = null;
+      
+      for (let i = 0; i < previousMemosData.length; i++) {
+        if (previousMemosData[i].id === id) {
+          currentMemoIndex = i;
+          currentMemoBase = previousMemosData[i];
+          break;
+        }
+      }
+      
+      if (currentMemoIndex === -1 || !currentMemoBase) throw new NoMemoError();
+      
+      const updatedMemosData = [
+        ...previousMemosData.slice(0, currentMemoIndex),
+        { ...currentMemoBase, ...memoRequest },
+        ...previousMemosData.slice(currentMemoIndex + 1)
+      ];
packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx (2)

Line range hint 38-42: UI/UX 및 접근성 개선이 필요합니다.

현재 구현에서 개선이 필요한 부분들이 있습니다:

  1. 삭제 버튼이 단순히 'x'로만 표시되어 있어 의미 전달이 불충분합니다
  2. 기본 confirm 대화상자는 사용자 경험 측면에서 개선의 여지가 있습니다
  3. 테이블의 접근성 속성이 부족합니다

다음과 같은 개선을 제안드립니다:

- <button type="button" onClick={() => handleDeleteClick(memo.id)} className="w-full text-center">
-   x
- </button>
+ <button
+   type="button"
+   onClick={() => handleDeleteClick(memo.id)}
+   className="btn btn-error btn-sm w-full"
+   aria-label={`메모 삭제: ${memo.title}`}
+ >
+   삭제
+ </button>

추가로 모달 컴포넌트를 사용한 더 나은 삭제 확인 프로세스 구현을 제안드립니다. 필요하시다면 구체적인 구현 예시를 제공해드리겠습니다.


Line range hint 18-19: 로딩 및 에러 상태 처리가 필요합니다.

현재 빈 메모 상태만 처리되어 있습니다. 데이터 로딩 중이거나 에러가 발생했을 때의 사용자 경험을 개선할 수 있습니다.

다음과 같은 개선을 제안드립니다:

+ const { memos, isLoading, error } = useMemosQuery({
+   supabaseClient,
+ });
+
+ if (isLoading) return <div className="mt-8 text-center">메모를 불러오는 중입니다...</div>;
+ if (error) return <div className="mt-8 text-center text-error">메모를 불러오는데 실패했습니다. 다시 시도해주세요.</div>;
  if (!memos || memos.length === 0)
    return <p className="mt-8 text-center">아직 저장된 메모가 없어요. 사이드 패널을 열어 메모를 저장해보세요 !</p>;
packages/web/src/utils/supabase.server.ts (4)

1-10: 공유 상수 사용 및 싱글톤 패턴 도입이 잘 되었습니다!

상수 관리와 타입 안전성이 개선되었으며, 싱글톤 패턴을 통해 클라이언트 인스턴스 관리가 효율적으로 이루어질 것으로 보입니다.

supabaseClient 변수에 대한 간단한 JSDoc 주석을 추가하면 좋을 것 같습니다:

+/** Supabase 클라이언트의 싱글톤 인스턴스 */
let supabaseClient: MemoSupabaseClient;

Line range hint 13-26: 클라이언트 생성 시 에러 처리 추가 필요

클라이언트 생성 과정에서 발생할 수 있는 에러에 대한 처리가 누락되어 있습니다.

다음과 같이 에러 처리를 추가하는 것을 제안드립니다:

export const getSupabaseClient = () => {
  if (supabaseClient) return supabaseClient;

  const cookieStore = cookies();
+ 
+ try {
    supabaseClient = createServerClient<Database>(
      CONFIG.supabaseUrl,
      CONFIG.supabaseAnonKey,
      {
        cookies: {
          getAll() {
            return cookieStore.getAll();
          },
          setAll(cookiesToSet) {
            cookiesToSet.forEach(({ name, value, options }) =>
              cookieStore.set(name, value, options)
            );
          },
        },
        db: { schema: SUPABASE.schemaMemo },
      }
    );
    return supabaseClient;
+ } catch (error) {
+   console.error('Supabase 클라이언트 생성 실패:', error);
+   throw new Error('Supabase 연결에 실패했습니다.');
+ }
};

Line range hint 31-43: Provider 타입 안전성 개선 필요

현재 Provider 타입이 너무 광범위하게 정의되어 있습니다. 지원하는 프로바이더만 명시적으로 제한하면 좋을 것 같습니다.

다음과 같이 타입을 제한하는 것을 제안드립니다:

+ type SupportedProvider = 'google' | 'github';
- export const signInWithOAuth = async (provider: Provider) => {
+ export const signInWithOAuth = async (provider: SupportedProvider) => {

Line range hint 45-56: 이메일 유효성 검사 추가 필요

이메일과 비밀번호에 대한 기본적인 유효성 검사가 누락되어 있습니다.

다음과 같이 유효성 검사를 추가하는 것을 제안드립니다:

export const signInWithEmail = async (email: string, password: string) => {
  'use server';
+ if (!email || !email.includes('@')) {
+   throw new Error('유효하지 않은 이메일 형식입니다.');
+ }
+ 
+ if (!password || password.length < 6) {
+   throw new Error('비밀번호는 최소 6자 이상이어야 합니다.');
+ }
+
  const supabaseClient = getSupabaseClient();
  // ... 나머지 코드
};
chrome-extension/lib/background/index.ts (2)

60-60: 제거 URL 참조가 개선되었습니다.

확장 프로그램 제거 시 사용되는 URL을 URL.googleForm으로 참조하는 것은 적절합니다.

하지만 한 가지 제안사항이 있습니다:

구글 폼 URL이 변경될 경우를 대비하여 다음과 같은 에러 처리를 추가하는 것이 좋을 것 같습니다:

-chrome.runtime.setUninstallURL(URL.googleForm);
+chrome.runtime.setUninstallURL(URL.googleForm, () => {
+  if (chrome.runtime.lastError) {
+    console.error('제거 URL 설정 실패:', chrome.runtime.lastError);
+  }
+});

Line range hint 71-77: OpenAI 모델명에 오타가 있습니다.

gpt-4o-mini는 존재하지 않는 모델명으로 보입니다.

다음과 같이 수정이 필요합니다:

-      model: 'gpt-4o-mini',
+      model: 'gpt-4',  // 또는 사용하고자 하는 실제 모델명
pages/options/src/components/OptionForm.tsx (1)

Line range hint 1-100: 아키텍처 개선 제안

현재 OptionForm 컴포넌트가 UI 렌더링과 데이터 fetching을 모두 처리하고 있습니다. 관심사 분리를 위해 다음과 같은 리팩토링을 고려해보시는 것은 어떨까요?

  1. 데이터 fetching 로직을 별도의 커스텀 훅으로 분리
  2. 다운로드 관련 로직을 별도의 유틸리티로 분리
  3. form 관련 상태 관리를 위해 React Hook Form 같은 라이브러리 도입 고려
package.json (2)

49-49: lucide-react 패키지 관리 개선 필요

동일한 버전의 lucide-react 패키지가 제거되고 다시 추가된 것으로 보입니다. 패키지 중복 관리를 방지하기 위해 의존성 관리를 검토해주시기 바랍니다.


의존성 관리 전략 개선이 필요합니다

현재 상황에 대한 분석 결과:

  • pnpm-lock.yaml 파일은 존재하지만 자동화된 의존성 업데이트 도구(Renovate/Dependabot)가 구성되어 있지 않습니다
  • 대부분의 의존성이 유동적 버전(^)으로 지정되어 있어 예기치 않은 업데이트로 인한 위험이 있습니다

개선 권장사항:

  • 핵심 의존성(@supabase/, @tanstack/, next, react)의 버전을 고정하여 안정성 확보
  • GitHub Actions에서 Dependabot 설정 추가 (.github/dependabot.yml)
  • 보안 업데이트는 자동으로, 기능 업데이트는 수동으로 관리하는 투트랙 전략 도입 권장
🔗 Analysis chain

Line range hint 42-58: 의존성 버전 관리 전략 검토 필요

프로젝트의 안정성을 위해 다음 사항들을 고려해주시기 바랍니다:

  1. 의존성 버전 고정 전략 수립
  2. 보안 업데이트를 위한 자동화된 의존성 업데이트 프로세스 구축
  3. package.json과 pnpm-lock.yaml 파일의 동기화 상태 확인

Let me gather more information about the dependency management strategy by checking the lock file content and any automated update configurations.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify dependency management and security

# Check for known vulnerabilities
echo "Checking for known vulnerabilities in dependencies:"
npm audit --json || true

# Check if lock file exists and is in sync
echo -e "\nChecking lock file status:"
if [ -f "pnpm-lock.yaml" ]; then
    echo "Lock file exists"
else
    echo "Warning: No pnpm-lock.yaml found"
fi

Length of output: 867


Script:

#!/bin/bash
# Check lock file content and renovate/dependabot configuration
echo "Lock file content (first few lines):"
head -n 20 pnpm-lock.yaml

echo -e "\nChecking for dependency update automation:"
echo "Renovate config:"
find . -maxdepth 2 -name "renovate.json" -o -name ".renovaterc"
echo -e "\nDependabot config:"
find . -maxdepth 3 -name "dependabot.yml" -o -name "dependabot.yaml"

echo -e "\nChecking current dependency resolution:"
pnpm why @supabase/supabase-js || true

Length of output: 996

packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx (1)

26-31: Supabase 클라이언트 에러 처리를 추가하면 좋을 것 같습니다.

useSupabaseClient 훅의 사용이 잘 되어있지만, 클라이언트 초기화 실패나 네트워크 오류 등의 예외 상황에 대한 처리가 필요해 보입니다.

다음과 같은 에러 처리 로직을 추가하는 것을 고려해보세요:

  const supabaseClient = useSupabaseClient();
+ const { toast } = useToast();
+ 
+ if (!supabaseClient) {
+   toast({
+     title: t('error.supabaseClient'),
+     variant: 'destructive',
+   });
+   return null;
+ }

  const { mutate: mutateMemoPatch } = useMemoPatchMutation({
    supabaseClient,
  });
pages/side-panel/src/components/MemoForm.tsx (1)

73-75: 폼 값 설정 로직에 대한 개선 제안

폼 값 설정 로직이 개선되었지만, 다음 사항들을 고려해보시기 바랍니다:

  1. useEffect 의존성 배열에 memoData 전체 객체를 포함하는 것이 더 안전할 수 있습니다.
  2. 메모 데이터 로딩 상태 처리가 필요할 수 있습니다.

다음과 같이 수정하는 것을 고려해보세요:

  useEffect(() => {
    if (!tab?.url) return;

    setValue('memo', memoData?.memo ?? '');
    setValue('isWish', memoData?.isWish ?? false);
-  }, [memoData?.isWish, memoData?.memo, setValue, tab?.url]);
+  }, [memoData, setValue, tab?.url]);
packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx (1)

Line range hint 41-67: 컴포넌트 구조 개선 제안

현재 컴포넌트가 메모 삭제와 카테고리 업데이트라는 두 가지 주요 책임을 가지고 있습니다. 다음과 같은 개선을 고려해보세요:

  1. 메모 삭제와 카테고리 업데이트 로직을 별도의 커스텀 훅으로 분리
  2. 에러 처리 로직 강화
+// useMemoDelete.ts
+export function useMemoDelete(memoId: number) {
+  const { t } = useTranslation();
+  const { toast } = useToast();
+  
+  return useMemoDeleteMutation({
+    onSuccess: (data) => {
+      if (!data) {
+        toast({ title: t('error.deleteFailed') });
+        return;
+      }
+      // ... 현재 성공 처리 로직
+    },
+    onError: (error) => {
+      toast({ title: t('error.deleteFailed'), description: error.message });
+    }
+  });
+}
packages/web/src/components/ui/sidebar.tsx (1)

16-16: 쿠키 키 관리 방식이 개선되었습니다.

상수 관리가 COOKIE_KEY 객체로 통합되어 일관성이 향상되었습니다.

다음과 같이 상수 이름을 더 명확하게 변경하는 것을 고려해보세요:

-const SIDEBAR_COOKIE_NAME = COOKIE_KEY.sideBarState;
+const SIDEBAR_STATE_COOKIE_KEY = COOKIE_KEY.sideBarState;

Also applies to: 18-18

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 527ddc3 and ef44fac.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (65)
  • chrome-extension/lib/background/index.ts (3 hunks)
  • chrome-extension/utils/openai.ts (1 hunks)
  • package.json (2 hunks)
  • packages/shared/package.json (1 hunks)
  • packages/shared/src/constants/Config.ts (1 hunks)
  • packages/shared/src/constants/Cookie.ts (1 hunks)
  • packages/shared/src/constants/Supabase.ts (1 hunks)
  • packages/shared/src/constants/Url.ts (1 hunks)
  • packages/shared/src/hooks/extension/index.ts (1 hunks)
  • packages/shared/src/hooks/extension/useSupabaseClientQuery.ts (1 hunks)
  • packages/shared/src/hooks/index.ts (0 hunks)
  • packages/shared/src/hooks/supabase/index.ts (0 hunks)
  • packages/shared/src/hooks/supabase/useCategoryPostMutation.ts (1 hunks)
  • packages/shared/src/hooks/supabase/useCategoryQuery.ts (2 hunks)
  • packages/shared/src/hooks/supabase/useMemoPatchMutation.ts (1 hunks)
  • packages/shared/src/hooks/supabase/useMemoPostMutation.ts (1 hunks)
  • packages/shared/src/hooks/supabase/useMemoQuery.ts (2 hunks)
  • packages/shared/src/hooks/supabase/useMemosQuery.ts (1 hunks)
  • packages/shared/src/hooks/supabase/useSupabaseClient.ts (0 hunks)
  • packages/shared/src/hooks/supabase/useSupabaseUser.ts (1 hunks)
  • packages/shared/src/utils/Environment.ts (1 hunks)
  • packages/shared/src/utils/Notion.ts (2 hunks)
  • packages/shared/src/utils/Sentry.ts (2 hunks)
  • packages/shared/src/utils/String.ts (1 hunks)
  • packages/shared/src/utils/Supabase.ts (2 hunks)
  • packages/shared/src/utils/extension/Storage.ts (2 hunks)
  • packages/shared/src/utils/extension/Supabase.ts (2 hunks)
  • packages/shared/src/utils/index.ts (1 hunks)
  • packages/shared/tsconfig.json (1 hunks)
  • packages/web/package.json (0 hunks)
  • packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx (1 hunks)
  • packages/web/src/app/[lng]/login/components/LoginSection/index.tsx (1 hunks)
  • packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx (1 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoDialog/index.tsx (2 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx (2 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarMenuItemAddCategory.tsx (1 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx (2 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx (1 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx (2 hunks)
  • packages/web/src/app/[lng]/memos/components/MemoView/index.tsx (1 hunks)
  • packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx (1 hunks)
  • packages/web/src/app/[lng]/memos/layout.tsx (2 hunks)
  • packages/web/src/app/[lng]/memos/page.tsx (2 hunks)
  • packages/web/src/app/auth/callback-email/route.ts (2 hunks)
  • packages/web/src/app/auth/callback/route.ts (2 hunks)
  • packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts (3 hunks)
  • packages/web/src/app/components/Introduction.tsx (1 hunks)
  • packages/web/src/components/Footer.tsx (2 hunks)
  • packages/web/src/components/ui/sidebar.tsx (1 hunks)
  • packages/web/src/constants/Config.ts (1 hunks)
  • packages/web/src/hooks/index.ts (1 hunks)
  • packages/web/src/hooks/useMemoDeleteMutation.ts (1 hunks)
  • packages/web/src/hooks/useSupabaseClient.ts (1 hunks)
  • packages/web/src/middleware.ts (1 hunks)
  • packages/web/src/utils/index.ts (0 hunks)
  • packages/web/src/utils/middleware.ts (2 hunks)
  • packages/web/src/utils/supabase.client.ts (2 hunks)
  • packages/web/src/utils/supabase.server.ts (5 hunks)
  • pages/content-ui/src/index.tsx (1 hunks)
  • pages/options/src/components/OptionForm.tsx (2 hunks)
  • pages/side-panel/src/components/LoginSection.tsx (2 hunks)
  • pages/side-panel/src/components/MemoForm.tsx (5 hunks)
  • pages/side-panel/src/components/MemoHeader.tsx (1 hunks)
  • pages/side-panel/src/hoc/withAuthentication.tsx (1 hunks)
  • pages/side-panel/src/utils/Url.ts (1 hunks)
💤 Files with no reviewable changes (5)
  • packages/shared/src/hooks/index.ts
  • packages/shared/src/hooks/supabase/index.ts
  • packages/shared/src/hooks/supabase/useSupabaseClient.ts
  • packages/web/package.json
  • packages/web/src/utils/index.ts
🔇 Additional comments (93)
packages/shared/src/utils/Environment.ts (1)

1-1: @src 경로 별칭 설정 확인 필요

@src 경로 별칭이 올바르게 설정되어 있는지 확인이 필요합니다. 프로젝트의 빌드 설정에서 이 경로가 제대로 해석되는지 검증해야 합니다.

✅ Verification successful

Let me verify the CONFIG import by checking its actual implementation.


@src 경로 별칭과 CONFIG 구조 검증 완료

tsconfig.json 설정과 실제 구현을 확인한 결과:

  • @src 경로 별칭이 packages/shared/tsconfig.json에 올바르게 설정되어 있습니다.
  • CONFIG 객체가 packages/shared/src/constants/Config.ts에 정의되어 있으며, nodeEnv 속성을 포함하고 있습니다.
  • index.ts에서 Config.ts를 올바르게 재내보내기하고 있습니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# tsconfig.json에서 경로 별칭 설정 확인
cat $(fd tsconfig.json) | jq '.compilerOptions.paths'

# 실제 constants 파일 위치 확인
fd -t f "Config.ts|index.ts" packages/shared/src/constants

Length of output: 899


Script:

#!/bin/bash
# Check the content of Config.ts and index.ts
cat packages/shared/src/constants/Config.ts packages/shared/src/constants/index.ts

# Verify if CONFIG is exported and contains nodeEnv
ast-grep --pattern 'export const CONFIG = $_'

Length of output: 2938

packages/shared/src/constants/Cookie.ts (1)

1-5: 상수 값들을 하나의 객체로 통합한 것이 좋습니다!

상수들을 하나의 객체로 통합함으로써 코드의 구조가 개선되었고, 관련 값들을 더 효과적으로 관리할 수 있게 되었습니다.

chrome-extension/utils/openai.ts (3)

1-1: 설정 관리 방식의 개선이 확인되었습니다.

중앙 집중식 설정 관리를 위해 CONFIG 객체를 사용하는 것은 좋은 접근 방식입니다. 이는 설정값의 일관성과 유지보수성을 향상시킵니다.


Line range hint 1-7: 전반적인 구현이 깔끔합니다.

OpenAI 클라이언트 초기화 로직이 간단하고 명확하게 구현되어 있습니다. 중앙화된 설정 관리를 통해 코드의 일관성이 향상되었습니다.


5-5: API 키 보안 관련 검증이 필요합니다.

OpenAI API 키와 같은 민감한 정보의 처리 방식을 확인해주세요.

다음 스크립트를 실행하여 API 키가 안전하게 관리되고 있는지 확인하겠습니다:

packages/shared/src/utils/String.ts (1)

1-4: 함수 구현이 적절합니다.

타입 안전성이 잘 보장되어 있으며, 배열과 문자열 검증 로직이 명확합니다.

packages/shared/src/constants/Supabase.ts (1)

1-6: 상수 사용 현황 확인이 필요합니다

이 상수들이 코드베이스 전체에서 올바르게 사용되고 있는지 확인이 필요합니다.

✅ Verification successful

SUPABASE 상수들이 적절하게 사용되고 있음을 확인했습니다

코드베이스 분석 결과:

  • SUPABASE.schemaMemo는 데이터베이스 스키마 정의에 일관되게 사용되고 있습니다
  • SUPABASE.authToken은 확장 프로그램의 스토리지 관련 기능에서 적절히 사용되고 있습니다
  • testEmailtestPassword는 로그인 컴포넌트에서 주석 처리되어 있어 테스트 용도로만 제한되어 있습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 상수 사용 패턴 확인

# SUPABASE 객체 사용 확인
echo "SUPABASE 객체 사용 확인:"
rg "SUPABASE\." -t ts -t tsx

# 이전 개별 상수 사용 여부 확인
echo "\n레거시 상수 사용 확인:"
rg "SUPABASE_(AUTH_TOKEN|TEST_EMAIL|TEST_PASSWORD|SCHEMA_MEMO)" -t ts -t tsx

Length of output: 253


Script:

#!/bin/bash
# SUPABASE 객체 사용 확인 (파일 확장자 수정)
echo "SUPABASE 객체 사용 현황:"
rg "SUPABASE\." --type-add 'ts:*.{ts,tsx}' -t ts

# 개별 상수 사용 확인 (파일 확장자 수정)
echo -e "\n레거시 상수 사용 현황:"
rg "SUPABASE_(AUTH_TOKEN|TEST_EMAIL|TEST_PASSWORD|SCHEMA_MEMO)" --type-add 'ts:*.{ts,tsx}' -t ts

# SUPABASE 객체가 포함된 파일 목록
echo -e "\nSUPABASE 관련 파일 목록:"
fd -e ts -e tsx | xargs grep -l "SUPABASE"

Length of output: 1944

packages/shared/src/hooks/extension/index.ts (1)

3-3: 새로운 Supabase 클라이언트 쿼리 훅 내보내기가 올바르게 구현되었습니다!

기존 내보내기 패턴을 일관되게 따르고 있으며, Supabase 클라이언트 관리를 개선하기 위한 리팩토링의 일부로 적절하게 구현되었습니다.

packages/web/src/hooks/index.ts (1)

4-4: 내보내기 패턴이 일관성 있게 적용되었습니다.

기존 훅들과 동일한 패턴으로 useSupabaseClient 훅을 내보내고 있어 일관성이 잘 유지되었습니다.

코드베이스에서 새로운 훅의 사용을 확인하기 위해 다음 스크립트를 실행합니다:

✅ Verification successful

Let me analyze the usage patterns more deeply to verify the refactoring completeness.


useSupabaseClient 훅의 도입이 적절하게 이루어졌습니다

코드베이스 분석 결과, 다음과 같은 사항들이 확인되었습니다:

  • useSupabaseClient 훅이 여러 컴포넌트에서 일관되게 사용되고 있습니다
  • 직접적인 Supabase 클라이언트 생성은 extension 유틸리티에만 제한되어 있습니다
  • getSupabaseClient는 서버 사이드 컴포넌트와 인증 관련 로직에서만 사용되고 있어 적절한 분리가 이루어졌습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: useSupabaseClient 훅의 사용 현황을 확인합니다.

# useSupabaseClient 훅의 사용 패턴 검색
rg "useSupabaseClient" -l

# 이전 getSupabaseClient 사용이 남아있는지 확인
rg "getSupabaseClient" -l

Length of output: 1482


Script:

#!/bin/bash
# Check the implementation and usage patterns
ast-grep --pattern 'useSupabaseClient($$$)' 

# Check for any direct supabase client instantiation patterns
rg "createClient|new Supabase" -l

Length of output: 1040

packages/shared/src/utils/index.ts (1)

11-11: 새로운 String 모듈 내보내기가 추가되었습니다.

변경사항이 기존 패턴을 잘 따르고 있습니다. 알파벳 순서도 적절하게 유지되었습니다.

String 모듈의 구현을 확인하기 위해 다음 스크립트를 실행합니다:

✅ Verification successful

String 모듈이 확인되었으며 적절하게 구현되어 있습니다.

String.ts 모듈이 packages/shared/src/utils 디렉토리에 존재하며, checkStringArray 유틸리티 함수를 올바르게 구현하고 있습니다. 타입 체크와 배열 검증이 정확하게 구현되어 있어 안전한 타입 가드로 사용될 수 있습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: String 모듈의 존재 여부와 구현 확인

# String.ts 파일 찾기
fd -t f "String.ts" packages/shared/src/utils

# String 모듈의 구현 내용 확인
if [ -f "packages/shared/src/utils/String.ts" ]; then
  cat packages/shared/src/utils/String.ts
fi

Length of output: 354

packages/shared/src/constants/Url.ts (1)

1-6: URL 접근성 검증이 필요합니다.

정의된 URL들이 실제로 접근 가능한지 확인이 필요합니다.

✅ Verification successful

모든 URL이 정상적으로 접근 가능합니다.

모든 URL에 대한 HTTP 응답이 성공적으로 확인되었습니다:

  • Notion 가이드 페이지들 (한국어/영어): 200 OK
  • Google 폼: 302 Found (정상적인 리다이렉션)
  • Chrome 웹 스토어: 301 Moved Permanently (정상적인 리다이렉션)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: URL 접근성 검증

echo "URL 접근성 확인 중..."
for url in \
  "https://guesung.notion.site/8a740938aa6547b88d09dbab7cb2222b" \
  "https://guesung.notion.site/10d89de02fde803c99c9e3027c2d10d5" \
  "https://forms.gle/qHkL7PeknaCy5QfY6" \
  "https://chromewebstore.google.com/detail/web-memo/eaiojpmgklfngpjddhoalgcpkepgkclh"
do
  response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
  echo "$url - HTTP 상태 코드: $response"
done

Length of output: 2219

pages/side-panel/src/utils/Url.ts (1)

1-1: 설정 관리 개선을 위한 좋은 변경사항입니다.

개별 상수를 사용하는 대신 중앙 집중식 CONFIG 객체를 사용하도록 변경한 것은 다음과 같은 이점이 있습니다:

  • 설정 값의 일관성 유지
  • 설정 관리의 용이성
  • 코드 유지보수성 향상
packages/shared/src/hooks/extension/useSupabaseClientQuery.ts (2)

5-11: 훅 구현이 깔끔하고 명확합니다!

React Query의 useSuspenseQuery를 사용한 구현이 잘 되어있습니다.


9-9: retry 설정값 검증이 필요합니다.

retry가 1로 설정되어 있는데, Supabase 클라이언트 연결 실패 시 한 번의 재시도만으로 충분한지 검토가 필요합니다.

✅ Verification successful

Let me gather more information about the Supabase client configuration and error handling patterns.


Let me gather more information about error handling and retry patterns in the codebase.


retry 설정값 1은 적절합니다.

Supabase 클라이언트 연결은 다음과 같은 이유로 현재 retry 설정이 적절합니다:

  1. 클라이언트 초기화는 단순한 설정 작업이며, 네트워크 연결이 필요하지 않습니다.
  2. 실제 API 요청은 개별 쿼리에서 처리되며, 이 hook은 단지 클라이언트 인스턴스를 생성하는 역할만 합니다.
  3. 에러가 발생하는 경우는 대부분 설정 오류(잘못된 credentials 등)로, 재시도로 해결되지 않는 문제입니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Supabase 클라이언트 관련 설정 및 에러 처리 패턴 확인

# 다른 Supabase 관련 쿼리의 retry 설정 확인
rg "retry.*[0-9]+" --type ts

# Supabase 클라이언트 사용 패턴 확인
ast-grep --pattern 'useSuspenseQuery({
  $$$
  retry: $_,
  $$$
})'

Length of output: 619


Script:

#!/bin/bash
# Supabase 클라이언트 초기화 및 에러 처리 로직 확인
rg "getSupabaseClient" -A 10 --type ts

# 다른 Supabase 관련 쿼리 설정 확인
ast-grep --pattern 'createClient({
  $$$
})'

# 에러 핸들링 패턴 확인
rg "supabase.*error" --type ts

Length of output: 18183


Script:

#!/bin/bash
# 에러 핸들링 패턴 확인
rg "error.*supabase" -A 5 --type ts
rg "catch.*supabase" -A 5 --type ts

# React Query 관련 retry 설정 확인
rg "retry:.*[0-9]+" -B 5 -A 5 --type ts

# Supabase 연결 실패 관련 로그나 에러 처리 확인
rg "supabase.*connect" --type ts

Length of output: 1638

packages/web/src/constants/Config.ts (1)

5-6: Supabase 자격 증명 노출에 대한 보안 고려사항

클라이언트 측 코드에서 Supabase URL과 익명 키를 노출하는 것은 일반적인 패턴이지만, 다음 사항들을 확인해주세요:

  1. 익명 키가 적절한 권한으로 제한되어 있는지
  2. 프로덕션 환경에서 적절한 CORS 설정이 되어있는지
packages/web/src/components/Footer.tsx (2)

1-1: URL 상수 관리 개선이 잘 이루어졌습니다.

URL 상수들을 하나의 객체로 통합하여 관리하는 방식으로 변경한 것이 좋습니다. 이는 상수 관리를 더욱 체계적으로 만들어줍니다.


10-10: URL 상수 변경이 전체 코드베이스에 일관되게 적용되었는지 확인이 필요합니다.

URL.chromeStore로의 변경이 올바르게 이루어졌지만, 다른 파일들에서도 동일한 방식으로 변경되었는지 확인이 필요합니다.

다음 스크립트를 실행하여 URL 상수 사용의 일관성을 확인하세요:

✅ Verification successful

URL 상수가 일관되게 적용되어 있음을 확인했습니다

코드베이스 검사 결과, URL 상수들이 모두 올바르게 마이그레이션되어 있습니다:

  • packages/shared/src/constants/Url.ts에 모든 URL 상수가 정의되어 있으며
  • 전체 코드베이스에서 URL.chromeStore, URL.guideKo 등의 형태로 일관되게 사용되고 있습니다
  • 이전 형식인 URL_ 접두사를 사용하는 코드가 없습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# URL_CHROME_STORE 상수의 기존 사용처 확인
rg "URL_CHROME_STORE"

# 새로운 URL.chromeStore 사용처 확인
rg "URL\.chromeStore"

# 다른 URL 상수들의 마이그레이션 확인
rg "URL_" --type ts --type tsx

Length of output: 415


Script:

#!/bin/bash
# Check for any remaining URL_ constants in all TypeScript and JavaScript files
rg "URL_" -t ts -t js

# Check all URL constant usages from URL object
rg "URL\." -t ts -t js

# Find the URL constant definitions
ast-grep --pattern 'const URL = {$$$}'

Length of output: 1433

packages/shared/src/utils/Notion.ts (2)

1-1: 설정 관리 개선을 위한 import 변경이 적절합니다.

중앙 집중식 설정 관리를 위해 CONFIG 객체를 사용하는 방식으로 변경한 것이 좋습니다. 이는 설정값 관리를 더욱 체계적으로 만들어줄 것입니다.


12-14: API URL을 CONFIG 객체를 통해 참조하도록 변경이 잘 되었습니다.

직접적인 상수 사용 대신 CONFIG 객체를 통해 API URL을 참조하도록 변경한 것이 일관성 있고 적절합니다. 다만, 이 변경으로 인해 다른 파일에서도 동일한 방식으로 업데이트가 필요한지 확인이 필요합니다.

다른 파일에서의 사용 여부를 확인하기 위한 스크립트:

✅ Verification successful

Let me verify if there are any other direct usages of the Notion API URL in the codebase.


CONFIG 객체를 통한 API URL 참조 변경이 완전히 적용되었습니다.

코드베이스 검사 결과, makeWebhookNotionApiCONFIG 객체를 통해서만 사용되고 있으며, 다른 파일에서 직접적인 API URL 참조는 발견되지 않았습니다. turbo.json의 환경 변수 선언은 의도된 설정이므로 문제가 되지 않습니다.

다만, Config.ts에서 makeWebhookNotionApi 설정 시 잘못된 설정 키 'SENTRY_DSN'을 사용하고 있는 것이 발견되었으니 이는 별도로 수정이 필요합니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining direct usage of MAKE_WEBHOOK_NOTION_API

# Search for any remaining direct references to the old constant
rg "MAKE_WEBHOOK_NOTION_API"

# Search for current usage pattern to ensure consistency
rg "CONFIG\.makeWebhookNotionApi"

Length of output: 386


Script:

#!/bin/bash
# Search for any files containing 'notion' or 'webhook' to ensure we haven't missed any API URL references
rg -i "notion|webhook" --type ts

# Check the content of Config.ts to understand the configuration setup
cat packages/shared/src/constants/Config.ts

Length of output: 1633

packages/web/src/hooks/useSupabaseClient.ts (3)

12-14: 커스텀 훅 구현이 잘 되었습니다

useMemo를 사용하여 클라이언트 인스턴스를 캐싱하는 방식이 적절합니다. 빈 의존성 배열을 사용하여 단일 인스턴스를 보장하는 것도 좋은 구현입니다.


1-3: 타입 안전성이 잘 구현되었습니다

필요한 타입과 유틸리티를 적절히 임포트하고 있습니다. 모듈 별칭(@extension, @src)을 사용한 것도 좋은 방식입니다.


16-16: 훅 사용 패턴 검증 필요

이 훅이 애플리케이션 전반에서 일관되게 사용되고 있는지 확인이 필요합니다.

✅ Verification successful

클라이언트와 서버 컴포넌트에서 적절한 Supabase 클라이언트 사용 패턴 확인됨

검증 결과:

  • 서버 컴포넌트(page.tsx, layout.tsx, route.ts)와 서버 유틸리티에서는 getSupabaseClient() 직접 호출
  • 클라이언트 컴포넌트(hooks, components 디렉토리)에서는 useSupabaseClient() 훅 사용
  • 일관된 패턴으로 구현되어 있어 문제없음
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 기존 getSupabaseClient 직접 호출과 새로운 useSupabaseClient 훅 사용 현황 확인

echo "getSupabaseClient 직접 호출 검색:"
rg "getSupabaseClient\(\)" --type ts

echo "\nuseSupabaseClient 훅 사용 검색:"
rg "useSupabaseClient\(\)" --type ts

Length of output: 2157

packages/shared/src/utils/extension/Storage.ts (3)

1-1: 상수 관리 개선이 잘 이루어졌습니다.

설정 값들을 SUPABASECONFIG 객체로 중앙 집중화하여 관리하는 방식으로 개선된 것이 좋습니다. 이는 상수 관리를 더욱 체계적으로 만들어줍니다.


16-17: 일관된 설정 참조 패턴이 유지되었습니다.

removeSession 함수에서도 동일한 패턴으로 SUPABASE.authTokenCONFIG.webUrl을 사용하여 일관성을 유지하고 있습니다.


6-7: 설정 값 참조 방식이 일관되게 변경되었습니다.

SUPABASE.authTokenCONFIG.webUrl을 사용하는 방식으로 통일되어 일관성이 향상되었습니다. 다만, 이러한 변경이 다른 부분에도 올바르게 적용되었는지 확인이 필요합니다.

다른 파일에서도 동일한 방식으로 사용되는지 확인하기 위한 스크립트입니다:

✅ Verification successful

Let me generate additional scripts to verify the complete usage pattern and check for any inconsistencies:


설정 값 참조가 일관되게 적용되어 있음을 확인했습니다.

코드베이스 전체를 검토한 결과:

  • CONFIG.webUrl은 모든 위치에서 일관되게 사용되고 있습니다
  • SUPABASE.authToken도 일관된 방식으로 사용되고 있으며, 다른 형태의 토큰 참조는 발견되지 않았습니다
  • 기존 WEB_URL 상수는 Config 파일 내부에서만 환경 변수로 참조되고 있어 적절합니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of SUPABASE.authToken and CONFIG.webUrl

# Check for any remaining direct usage of old constants
rg "SUPABASE_AUTH_TOKEN|WEB_URL" --type ts

# Check for new constant usage pattern
rg "SUPABASE\.authToken|CONFIG\.webUrl" --type ts

Length of output: 1587


Script:

#!/bin/bash
# Check for any SUPABASE constant usage patterns
rg "SUPABASE\." --type ts -A 2

# Check Config.ts files to understand the constant definitions
cat packages/web/src/constants/Config.ts packages/shared/src/constants/Config.ts

# Check if there are any other auth token related patterns
rg "authToken|auth_token" --type ts -i

Length of output: 4479

pages/content-ui/src/index.tsx (1)

1-2: import 구문 단순화 검증 필요

이전에 사용되던 formatUrl, getMemo, insertMemo, getSupabaseClient 등의 함수들이 제거되었습니다. 이러한 변경이 다른 부분에 영향을 미치지 않는지 확인이 필요합니다.

pages/side-panel/src/hoc/withAuthentication.tsx (2)

1-2: 의존성 주입 방식의 개선이 확인됨

Supabase 클라이언트 관리 방식이 React Query를 활용한 방식으로 개선되었습니다. 이는 상태 관리의 일관성과 성능 향상에 도움이 될 것으로 보입니다.


7-8: 에러 처리 검증이 필요합니다

useSupabaseClientQuery와 useSupabaseUser 훅의 에러 상태 처리가 명시적으로 되어있지 않습니다.

다음 사항들을 확인해주세요:

에러 처리를 위한 개선된 구현을 제안드립니다:

-    const { data: supabaseClient } = useSupabaseClientQuery();
-    const { user } = useSupabaseUser({ supabaseClient });
+    const { data: supabaseClient, error: clientError } = useSupabaseClientQuery();
+    const { user, error: userError } = useSupabaseUser({ supabaseClient });
+
+    if (clientError || userError) {
+      console.error('Authentication error:', clientError || userError);
+      return <LoginSection />;
+    }
✅ Verification successful

에러 처리가 적절히 구현되어 있습니다

useSuspenseQuery를 사용하는 컴포넌트들이 모두 ErrorBoundary로 감싸져 있어 에러 처리가 적절히 이루어지고 있습니다. 특히:

  • withAuthentication HOC가 사용되는 컴포넌트들은 ErrorBoundary로 래핑되어 있습니다.
  • LoginSectionFallbackComponent로 지정되어 있어, 인증 관련 에러 발생 시 로그인 화면으로 자연스럽게 전환됩니다.
  • Suspense와 함께 사용되어 로딩 상태도 적절히 처리되고 있습니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 에러 처리 구현 확인

# useSupabaseClientQuery의 에러 처리 구현 확인
ast-grep --pattern 'useSupabaseClientQuery = () => {
  $$$
  error $$$
  $$$
}'

# useSupabaseUser의 에러 처리 구현 확인
ast-grep --pattern 'useSupabaseUser = ($$$) => {
  $$$
  error $$$
  $$$
}'

Length of output: 159


Script:

#!/bin/bash
# Let's try to find the hook implementations with more flexible patterns
echo "Searching for useSupabaseClientQuery implementation:"
rg "useSupabaseClientQuery" -A 10

echo -e "\nSearching for useSupabaseUser implementation:"
rg "useSupabaseUser" -A 10

echo -e "\nSearching for error handling patterns in the component:"
rg "withAuthentication" -A 20

Length of output: 11076


Script:

#!/bin/bash
# Let's check if these hooks are using React Query's useSuspenseQuery
echo "Checking useSuspenseQuery implementation and error boundaries:"
rg "useSuspenseQuery" -A 5

echo -e "\nChecking for error boundary components:"
rg "ErrorBoundary" -A 10

Length of output: 11253

packages/shared/src/hooks/supabase/useCategoryQuery.ts (1)

3-3: 함수명 변경이 일관성 있게 적용되었는지 확인 필요

getCategory에서 getCategories로의 변경이 적절해 보입니다. 다만, 이러한 복수형으로의 변경이 다른 관련 컴포넌트나 훅에서도 일관되게 적용되었는지 확인이 필요합니다.

✅ Verification successful

Based on the search results, I can now generate the final response since I have sufficient information. The search shows that:

  1. There are no remaining instances of getCategory in the codebase
  2. All relevant files consistently use getCategories
  3. The function is properly defined in Supabase.ts and used consistently in other files

Final response:

함수명 변경이 일관되게 적용되었음을 확인했습니다

코드베이스 전체를 검토한 결과, getCategory에서 getCategories로의 변경이 모든 관련 파일에서 일관되게 적용되었습니다. 특히:

  • packages/shared/src/utils/Supabase.ts에서 함수가 올바르게 정의됨
  • packages/web/src/app/[lng]/memos/layout.tsxpackages/shared/src/hooks/supabase/useCategoryQuery.ts에서 일관되게 사용됨
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 다른 파일들에서 getCategory 사용 여부 확인

# getCategory 함수의 사용 여부 확인
rg "getCategory" -l

# getCategories 함수의 정의와 사용 확인
rg "getCategories" -A 3

Length of output: 2026

packages/shared/src/hooks/supabase/useSupabaseUser.ts (1)

11-12: 코드가 더 간결해졌네요!

queryFn을 인라인 화살표 함수로 변경하여 코드가 더 간단하고 이해하기 쉬워졌습니다. TypeScript 제네릭을 사용하여 타입 안정성도 잘 유지되어 있습니다.

pages/side-panel/src/components/LoginSection.tsx (2)

1-1: 설정 중앙화 리팩토링이 잘 적용되었습니다.

개별 상수 대신 CONFIG 객체를 사용하도록 변경한 것이 좋은 접근 방식입니다. 이는 설정 관리를 더욱 체계적으로 만들어줍니다.


13-13: CONFIG 객체의 구조와 사용법을 확인해주세요.

CONFIG.webUrl이 올바르게 설정되어 있는지 확인이 필요합니다.

다음 스크립트를 실행하여 CONFIG 객체의 구조와 사용을 검증하겠습니다:

✅ Verification successful

Let's verify the getSafeConfig function to ensure it properly handles the configuration values.


CONFIG 객체가 올바르게 구현되어 있음을 확인했습니다

CONFIG 객체와 관련하여 다음 사항들이 확인되었습니다:

  • getSafeConfig 함수가 적절한 에러 처리와 함께 구현되어 있습니다
  • CONFIG 객체는 환경 변수를 통해 webUrl을 안전하게 설정합니다
  • LoginSection.tsx에서의 CONFIG.webUrl 사용은 다른 파일들의 사용 패턴과 일치합니다

따라서 현재 구현에 문제가 없으며, 추가적인 검증이 필요하지 않습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# CONFIG 객체의 정의와 사용법 확인

# CONFIG 객체의 정의 검색
echo "CONFIG 객체 정의 확인:"
rg -p "export const CONFIG" -A 10

# webUrl 속성의 사용 검색
echo "\nwebUrl 사용 패턴 확인:"
rg "CONFIG\.webUrl"

Length of output: 2381


Script:

#!/bin/bash
# getSafeConfig 함수의 구현 확인
echo "getSafeConfig 함수 구현 확인:"
rg -p "function getSafeConfig" -A 5

# 환경 변수 설정 파일 확인
echo "\n환경 변수 설정 파일 검색:"
fd -e env

Length of output: 151


Script:

#!/bin/bash
# getSafeConfig 함수 검색 (다른 패턴으로 시도)
echo "getSafeConfig 정의 검색:"
rg -p "getSafeConfig.*=" -A 5

# CONFIG 가져오기 패턴 확인
echo "\nCONFIG import 패턴 확인:"
rg "import.*CONFIG.*from"

Length of output: 1555

packages/web/src/app/[lng]/memos/page.tsx (3)

Line range hint 1-8: 서버 컴포넌트 설정과 임포트 구성이 적절합니다.

서버 컴포넌트 지시자가 올바르게 배치되어 있으며, 임포트 구문이 잘 정리되어 있습니다. getMemo에서 getMemos로의 변경이 전체적인 리팩토링 방향과 일치합니다.


Line range hint 10-19: 컴포넌트 구현이 Next.js 서버 컴포넌트 패턴을 잘 따르고 있습니다.

서버 사이드 데이터 페칭과 하이드레이션 처리가 적절하게 구현되어 있습니다.


14-14: getMemos 함수의 구현 확인이 필요합니다.

getMemo에서 getMemos로의 변경이 데이터 구조나 반환 타입에 영향을 미칠 수 있습니다. 관련 타입 정의와 구현을 확인해주세요.

✅ Verification successful

getMemos 함수 구현이 확인되었습니다

getMemos 함수는 packages/shared/src/utils/Supabase.ts에 올바르게 구현되어 있으며, 관련 타입들도 적절히 정의되어 있습니다. 데이터 구조와 반환 타입이 일관성 있게 유지되고 있어 문제가 없습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# getMemos 함수의 구현과 타입 정의 확인
ast-grep --pattern 'export const getMemos = async (supabase: SupabaseClient) => {
  $$$
}'

# 관련된 타입 정의 확인
rg -t typescript "type.*Memo.*=" -A 3

Length of output: 167


Script:

#!/bin/bash
# getMemos 함수의 구현 검색
rg "export const getMemos" -A 5

# Memo 관련 타입 정의 검색
rg "type.*Memo" -A 3

# getMemo 함수의 이전 구현 검색 (변경 전 코드)
rg "export const getMemo[^s]" -A 5

# 파일 내의 전체 컨텍스트 확인
cat "packages/web/src/app/[lng]/memos/page.tsx"

Length of output: 5896

packages/shared/tsconfig.json (4)

22-24: 빌드 출력 설정이 적절히 구성됨

declarationDiroutDir를 'dist'로 설정한 것은 적절해 보입니다. forceConsistentCasingInFileNames 추가는 크로스 플랫폼 호환성을 향상시킬 것입니다.


26-26: 소스 파일 포함 패턴이 단순화됨

include 패턴을 "src"로 단순화한 것은 명확해 보입니다. 다만, 다음 사항을 확인해주세요:

  • src 디렉토리 외부의 TypeScript 파일들이 있는지
  • 테스트 파일들의 위치가 적절한지
✅ Verification successful

Let me verify the test files location and the structure of TypeScript files outside the src directory.


src 디렉토리 패턴으로의 단순화가 적절합니다

검증 결과, packages/shared의 모든 TypeScript 파일들이 src 디렉토리 내에 올바르게 위치해 있으며, 테스트 파일들은 별도의 tests 디렉토리에서 관리되고 있어 현재 설정에 영향을 받지 않습니다. 따라서 tsconfig.json의 "include": ["src"] 설정은 적절합니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: src 디렉토리 외부의 TypeScript 파일 검색

# src 디렉토리 외부의 .ts/.tsx 파일 검색
fd -e ts -e tsx -E src -E node_modules -E dist

Length of output: 1338


Script:

#!/bin/bash
# Check if there are any TypeScript files in the packages/shared directory
fd -e ts -e tsx . packages/shared

# Check the structure of test files
fd -e test.ts -e spec.ts -e test.tsx -e spec.tsx

Length of output: 3384


20-21: 모듈 해결 전략 변경 확인 필요

moduleResolution을 'bundler'로 변경한 것은 빌드 도구와의 호환성을 확인해야 합니다. 특히 다음 사항들을 검토해주세요:

  • 현재 사용 중인 번들러가 이 설정을 지원하는지
  • 외부 의존성들이 이 해결 방식과 호환되는지
✅ Verification successful

moduleResolution: "bundler" 설정은 안전합니다

이 프로젝트는 Vite를 주요 번들러로 사용하고 있으며, 일부 패키지에서는 Rollup도 사용하고 있습니다. 두 도구 모두 TypeScript의 "bundler" moduleResolution을 완벽하게 지원합니다:

  • 대부분의 패키지가 Vite를 사용하여 빌드 (vite build)
  • Vite는 내부적으로 Rollup을 사용하며, 둘 다 Node.js의 모듈 해결 방식을 따름
  • 프로젝트의 빌드 스크립트들이 이미 이러한 번들러들과 통합되어 있음
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: package.json에서 사용 중인 번들러 확인

# package.json 파일들에서 번들러 관련 의존성 검색
fd package.json --exec jq '.dependencies + .devDependencies | with_entries(select(.key | test("webpack|rollup|vite|esbuild|parcel")))'

Length of output: 810


Script:

#!/bin/bash
# Check the content of @extension/vite-config since it's commonly used
fd "vite-config" -t f --exec cat {}

# Also check if there are any build scripts in package.json files
fd package.json --exec jq '.scripts | with_entries(select(.value | test("build")))'

Length of output: 2091


9-9: 경로 매핑 변경사항 검토 필요

@* 와일드카드 매핑은 너무 광범위할 수 있으며, 모듈 해결 시 모호성을 초래할 수 있습니다. 더 구체적인 매핑 패턴을 고려해보시기 바랍니다.

다음 스크립트로 현재 사용 중인 import 경로들을 확인해보세요:

✅ Verification successful

경로 매핑 설정이 적절합니다

@* 경로 매핑은 현재 프로젝트 구조에 적합합니다. 다른 tsconfig 파일들의 경로 매핑 패턴을 검토한 결과, 이는 shared 패키지의 특성을 고려한 의도적인 설정으로 판단됩니다. 각 패키지가 자체적인 경로 매핑(@src/*, @root/* 등)을 가지고 있어 충돌 가능성이 없습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 프로젝트에서 사용 중인 import 경로 패턴 확인

# @ 심볼을 사용하는 모든 import 문 검색
rg "from ['\"]\@" --type ts --type tsx

Length of output: 129


Script:

#!/bin/bash
# Search for imports starting with @ in TypeScript files
rg "from ['\"]@" --type ts --type tsx

# Also search for direct imports with @ prefix
rg "import .* from ['\"]@" --type ts --type tsx

# Search for require statements with @ prefix
rg "require\(['\"]@" --type ts --type tsx

# Find all TypeScript files that might use path aliases
fd "\.(ts|tsx)$" -x grep -l "@"

Length of output: 8333


Script:

#!/bin/bash
# Search for import statements in TypeScript files with proper file type specification
rg "from ['\"]@" -t typescript

# Look for path mappings in all tsconfig files
fd "tsconfig.*\.json$" -x cat {} \; | grep -A 5 "paths"

# Find all package.json files to understand project structure
fd "package\.json$" -x cat {} \; | grep -E "\"name\"|\"main\"|\"types\""

Length of output: 2433

packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx (2)

Line range hint 8-22: 구현이 깔끔하고 안전합니다!

  • TypeScript 타입 안전성이 잘 구현되어 있습니다
  • 국제화(i18n) 처리가 적절히 되어 있습니다
  • 조건부 렌더링이 명확합니다
  • 에러 처리가 깔끔합니다

3-3: URL_CHROME_STORE 상수 제거 검증 필요

URL_CHROME_STORE 상수가 제거되었습니다. 이 상수가 다른 방식으로 접근되고 있는지 확인이 필요합니다.

✅ Verification successful

URL_CHROME_STORE 상수 제거는 적절한 리팩토링입니다

URL_CHROME_STORE 상수는 현재 URL.chromeStore로 리팩토링되어 있으며, ExtensionVersion 컴포넌트에서는 이 URL이 사용되지 않습니다. 따라서 해당 import 제거는 적절한 변경입니다.

  • packages/shared/src/constants/Url.ts에 Chrome 웹스토어 URL이 정의되어 있음
  • Footer, Introduction, ExtensionDialog 등의 컴포넌트에서 URL.chromeStore로 접근하여 사용 중
  • ExtensionVersion 컴포넌트는 버전 정보만 표시하는 용도로, 스토어 URL을 사용하지 않음
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify if URL_CHROME_STORE is used elsewhere or replaced with a different constant

# Check for any remaining direct usage of URL_CHROME_STORE
rg "URL_CHROME_STORE"

# Check for potential replacement patterns in constants
rg -A 5 "chrome.*store" "packages/*/src/**/constants.{ts,tsx}"

Length of output: 163


Script:

#!/bin/bash
# Let's try a broader search for constants files and chrome store URLs
# First, find all potential constant files
fd "constants\.(ts|tsx)$"

# Then search for chrome store related patterns in all files
rg -i "chrome.*store|web\s*store"

# Also check the specific component for any chrome store URL usage
cat "packages/web/src/app/[lng]/login/components/LoginSection/ExtensionVersion.tsx"

Length of output: 1834

packages/shared/src/utils/Sentry.ts (1)

4-4: 설정 관리 개선을 위한 import 변경이 적절해 보입니다.

기존의 개별 상수 대신 중앙화된 CONFIG 객체를 사용하는 것은 설정 관리 측면에서 좋은 접근 방식입니다.

packages/web/src/utils/supabase.client.ts (3)

1-1: 설정 관리 개선을 위한 import 구조 변경이 잘 되었습니다.

개별 상수들을 CONFIG 객체로 통합한 것은 좋은 접근 방식입니다. 이는 설정 관리를 더욱 용이하게 만들고 유지보수성을 향상시킵니다.

Also applies to: 3-3


21-21: 스키마 구조 변경에 대한 검증이 필요합니다.

SUPABASE.schemaMemo로의 변경이 다른 부분에 영향을 미치지 않는지 확인이 필요합니다.

✅ Verification successful

스키마 구조 변경이 일관되게 적용되어 있습니다

SUPABASE.schemaMemopackages/shared/src/constants/Supabase.ts에 'memo'로 정의되어 있으며, 이 값이 다음 위치들에서 일관되게 사용되고 있습니다:

  • packages/web/src/utils/supabase.client.ts
  • packages/web/src/utils/supabase.server.ts
  • packages/shared/src/utils/Supabase.ts
  • packages/shared/src/utils/extension/Supabase.ts
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# SUPABASE 객체의 스키마 구조 확인
ast-grep --pattern 'export const SUPABASE = {
  $$$
  schemaMemo: $_
  $$$
}'

Length of output: 79


Script:

#!/bin/bash
# Search for SUPABASE constant definitions
rg "export const SUPABASE" -A 10

# Search for schemaMemo usage
rg "schemaMemo" -A 2

Length of output: 2545


7-7: CONFIG 객체의 타입 검증이 필요합니다.

CONFIG.supabaseUrlCONFIG.supabaseAnonKey가 올바른 타입으로 정의되어 있는지 확인이 필요합니다.

✅ Verification successful

CONFIG 객체의 타입이 적절하게 정의되어 있습니다.

CONFIG 객체는 getSafeConfig 함수를 통해 환경 변수의 존재 여부를 검증하고 있으며, supabaseUrlsupabaseAnonKey는 문자열 타입으로 안전하게 처리되고 있습니다. 또한 Database 타입도 올바르게 정의되어 있어 타입 안전성이 보장됩니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# CONFIG 객체의 타입 정의 확인
ast-grep --pattern 'interface Config {
  $$$
  supabaseUrl: string
  supabaseAnonKey: string
  $$$
}'

Length of output: 103


Script:

#!/bin/bash
# CONFIG 타입 정의 검색 - 다른 패턴으로 시도
rg -A 5 "type Config|interface Config|const CONFIG:" 

# CONFIG 객체 사용 위치 확인
rg "CONFIG\." -A 2

Length of output: 4031


Script:

#!/bin/bash
# CONFIG 타입/상수 정의 검색 - 환경 설정 파일 확인
fd -e ts "config|env" --exec cat {}

# Database 타입 정의 확인
rg "type Database|interface Database" -A 5

Length of output: 3059

packages/shared/src/hooks/supabase/useMemosQuery.ts (1)

1-7: 타입 정의가 명확하고 깔끔합니다! 👍

QueryDataQueryError 타입을 명시적으로 정의함으로써 타입 안정성이 향상되었습니다.

packages/shared/src/hooks/supabase/useMemoQuery.ts (1)

3-3: 변경된 import 구문이 적절합니다.

getMemo에서 getMemos로의 변경이 전체적인 리팩토링 방향과 일치합니다.

packages/web/src/hooks/useMemoDeleteMutation.ts (2)

Line range hint 20-28: 구현이 올바르게 되었습니다

React Query의 mutation 구현이 다음과 같은 모범 사례를 잘 따르고 있습니다:

  • 적절한 타입 정의
  • 캐시 무효화 처리
  • 성공 콜백 처리

16-18: deleteMemo 유틸리티 함수 사용 확인이 필요합니다

deleteMemo 유틸리티 함수의 구현이 올바른지 확인이 필요합니다.

✅ Verification successful

deleteMemo 유틸리티 함수가 올바르게 구현되어 있습니다

packages/shared/src/utils/Supabase.ts에서 deleteMemo 함수의 구현을 확인했습니다. 이 함수는:

  • 올바른 타입(MemoSupabaseClient)과 매개변수를 사용합니다
  • Supabase의 표준 DELETE 쿼리를 사용하여 메모를 삭제합니다
  • 삭제된 레코드를 반환하도록 select()를 포함하고 있습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of deleteMemo utility function
ast-grep --pattern 'export function deleteMemo($client, $id) {
  $$$
}'

Length of output: 73


Script:

#!/bin/bash
# Search for deleteMemo function definition with rg
rg "deleteMemo" -A 5

# Also try to find any exports of deleteMemo
rg "export.*deleteMemo"

# Search for files containing deleteMemo in their name
fd "deleteMemo"

Length of output: 5062

packages/web/src/app/auth/callback/route.ts (2)

4-4: 상수 관리 개선이 잘 이루어졌습니다!

쿠키 관련 상수들을 COOKIE_KEY 객체로 통합한 것은 코드의 일관성과 유지보수성을 향상시키는 좋은 변경입니다.


18-23: 토큰 만료 시간을 재검토해 주세요.

현재 구현상 몇 가지 보안 관련 고려사항이 있습니다:

  1. 액세스 토큰과 리프레시 토큰의 만료 기간이 동일하게 1년으로 설정되어 있습니다.
  2. 일반적으로 액세스 토큰은 리프레시 토큰보다 짧은 만료 기간을 가져야 합니다.

다음과 같이 개선하는 것을 고려해보세요:

-    cookieStore.set(COOKIE_KEY.accessToken, sessionData.session.access_token, {
-      maxAge: 3600 * 24 * 365, // 1년
-    });
+    cookieStore.set(COOKIE_KEY.accessToken, sessionData.session.access_token, {
+      maxAge: 3600 * 24, // 1일
+    });

     cookieStore.set(COOKIE_KEY.refreshToken, sessionData.session.refresh_token, {
       maxAge: 3600 * 24 * 365, // 1년
     });
packages/web/src/app/[lng]/memos/components/MemoView/index.tsx (2)

5-6: 훅 사용으로의 마이그레이션이 잘 이루어졌습니다!

getSupabaseClient 유틸리티 함수에서 useSupabaseClient 훅으로의 전환이 깔끔하게 이루어졌습니다.


13-13: 훅 사용의 일관성 검증이 필요합니다.

useSupabaseClient 훅으로의 전환이 잘 이루어졌습니다. 다만, 컴포넌트 전반에 걸쳐 일관된 사용이 이루어지고 있는지 확인이 필요합니다.

다음 스크립트를 실행하여 useSupabaseClient 훅의 일관된 사용을 확인하겠습니다:

✅ Verification successful

Let me analyze the results and provide the final response in Korean.

useSupabaseClient 훅 사용이 적절하게 구현되었습니다.

검증 결과, getSupabaseClientuseSupabaseClient의 사용이 명확하게 구분되어 있습니다:

  • 서버 컴포넌트와 유틸리티에서는 getSupabaseClient를 사용
  • 클라이언트 컴포넌트에서는 useSupabaseClient 훅을 일관되게 사용
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of useSupabaseClient hook across components
# and ensure no instances of getSupabaseClient remain

echo "Checking for any remaining instances of getSupabaseClient..."
rg "getSupabaseClient"

echo "Verifying useSupabaseClient hook usage in components..."
ast-grep --pattern 'const $_ = useSupabaseClient()'

Length of output: 3711

packages/web/src/app/auth/callback-email/route.ts (1)

4-4: 상수 관리 개선이 잘 이루어졌습니다.

공유 상수를 통합된 COOKIE_KEY 객체로 관리하도록 변경한 것이 좋은 개선사항입니다.

packages/web/src/app/[lng]/memos/components/Header/RefreshButton.tsx (1)

18-18: queryClient 선언 위치 변경이 적절합니다.

코드의 가독성과 관련 훅들의 그룹화 측면에서 좋은 변경입니다.

packages/web/src/app/components/Introduction.tsx (1)

1-1: URL 상수 관리 개선이 잘 적용되었습니다!

URL 관리를 중앙화하여 상수를 관리하는 방식으로 변경한 것이 좋은 개선사항입니다. 이는 향후 URL 변경 시 유지보수성을 높여줄 것입니다.

Also applies to: 21-21

packages/web/src/app/components/ExtensionDialog/getExtensionDialogInfo.ts (1)

1-1: 상수 관리 개선이 잘 이루어졌습니다!

개별 URL 상수들을 하나의 URL 객체로 통합한 것이 코드 구조를 개선하는데 도움이 될 것 같습니다.

pages/side-panel/src/components/MemoHeader.tsx (3)

1-2: 훅 임포트 구조가 개선되었습니다!

확장 프로그램 관련 훅들을 별도의 경로로 분리한 것은 좋은 구조 개선입니다. 코드의 관심사 분리가 잘 이루어졌습니다.


17-18: 메모 URL 생성 로직 검증이 필요합니다.

memoData가 undefined일 경우의 처리가 필요할 수 있습니다. getMemoUrl 함수가 undefined 입력값을 적절히 처리하는지 확인해주세요.

URL 생성 로직을 확인하겠습니다:

✅ Verification successful

getMemoUrl 함수는 undefined 입력값을 안전하게 처리합니다.

getMemoUrl 함수의 구현을 확인한 결과, 다음과 같은 이유로 안전합니다:

  • id 파라미터가 옵셔널(id?: number)로 정의되어 있습니다
  • undefined 입력값이 들어올 경우 기본 메모 목록 URL(${CONFIG.webUrl}/memos)을 반환합니다
  • memoData?.id의 옵셔널 체이닝은 적절히 사용되었습니다
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: getMemoUrl 함수 구현 확인

ast-grep --pattern 'export function getMemoUrl($_) {
  $$$
}'

Length of output: 63


Script:

#!/bin/bash
# Let's try searching for getMemoUrl function with different patterns
rg "getMemoUrl" -A 5

# Also search for any file that might contain this function
fd "getMemoUrl" 

Length of output: 1357


9-13: 훅 사용 패턴 검증이 필요합니다.

새로운 useSupabaseClientQueryuseMemoQuery 훅의 에러 처리가 구현되어 있는지 확인이 필요합니다.

다음 스크립트로 훅의 구현을 확인해보겠습니다:

✅ Verification successful

훅 구현이 적절하게 되어 있습니다.

검증 결과:

  • useSupabaseClientQueryuseSuspenseQuery를 사용하여 에러 처리와 재시도 로직이 내장되어 있습니다.
  • useMemoQueryuseQuery를 사용하며, 적절한 enabled 조건과 데이터 선택 로직이 구현되어 있습니다.

두 훅 모두 React Query를 기반으로 하여 에러 처리, 로딩 상태, 캐싱 등이 자동으로 관리되고 있습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: 훅 구현 확인

# useSupabaseClientQuery 구현 확인
ast-grep --pattern 'export function useSupabaseClientQuery() {
  $$$
}'

# useMemoQuery 에러 처리 확인
ast-grep --pattern 'export function useMemoQuery($_) {
  $$$
  catch($_) {
    $$$
  }
  $$$
}'

Length of output: 171


Script:

#!/bin/bash
# Let's try a different approach to find the hook implementations

# Search for files containing the hook names
echo "=== Files containing useSupabaseClientQuery ==="
rg "useSupabaseClientQuery" -l

echo -e "\n=== Files containing useMemoQuery ==="
rg "useMemoQuery" -l

echo -e "\n=== Implementation of useSupabaseClientQuery ==="
rg "useSupabaseClientQuery" -A 10

echo -e "\n=== Implementation of useMemoQuery ==="
rg "useMemoQuery" -A 10

Length of output: 13496

packages/web/src/utils/middleware.ts (2)

2-2: 설정 관리 개선을 위한 import 수정이 적절합니다.

상수값들을 CONFIG 객체로 통합하여 관리하는 방식으로 변경한 것이 좋습니다. 이는 설정 값의 중앙 집중화를 통해 유지보수성을 향상시킵니다.


12-12: CONFIG 객체의 Supabase 설정값 검증이 필요합니다.

supabaseClient 초기화에 CONFIG 객체를 사용하는 방식으로 변경된 것은 적절하나, 이 값들이 올바르게 설정되어 있는지 확인이 필요합니다.

✅ Verification successful

CONFIG 객체의 Supabase 설정이 적절히 구현되어 있습니다

getSafeConfig 함수를 통해 환경 변수가 없을 경우 오류를 발생시키도록 안전하게 구현되어 있으며, web과 shared 패키지 모두에서 Supabase 관련 설정이 올바르게 정의되어 있습니다. 특히:

  • web 패키지는 NEXT_PUBLIC_ 접두사가 붙은 환경 변수를 사용
  • shared 패키지는 기본 환경 변수를 사용
  • 모든 설정값이 누락된 경우 명확한 오류 메시지 제공
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# CONFIG 객체 내 Supabase 관련 설정값들이 올바르게 정의되어 있는지 확인

# constants 파일에서 CONFIG 정의 확인
rg -A 5 "export const CONFIG = {" 

# Supabase URL과 ANON_KEY 설정 확인
rg "supabaseUrl|supabaseAnonKey" 

Length of output: 1223


Script:

#!/bin/bash
# Check getSafeConfig implementation and usage
ast-grep --pattern 'function getSafeConfig($_,$_) { $$$ }'

# Check CONFIG object definition in both constants files
rg -A 10 "export const CONFIG = \{" --escape

# Check environment variable setup in relevant config files
fd ".env" --exec cat {} \; || true

Length of output: 949


Script:

#!/bin/bash
# Check getSafeConfig implementation
rg -A 5 "getSafeConfig.*=" 

# Check CONFIG object definition with proper escaping
rg -A 10 "export const CONFIG = \{" -e

# Check for environment variable validation
rg "NEXT_PUBLIC_SUPABASE|SUPABASE.*process\.env" -A 2

Length of output: 1759

packages/web/src/middleware.ts (2)

Line range hint 36-38: 설정이 적절해 보입니다.

matcher 설정이 정적 파일과 이미지를 적절히 제외하고 있습니다.


5-5: 함수 변경이 올바르게 이루어졌는지 확인이 필요합니다.

isStringArray에서 checkStringArray로의 변경이 이루어졌습니다. 두 함수의 동작이 완전히 동일한지 확인이 필요합니다.

Also applies to: 7-7

✅ Verification successful

Let me gather more information about these functions, particularly focusing on the shared utils where the function is defined.


Let me try a different approach to locate the function definition.


Let me search for the previous implementation to compare.


checkStringArray 함수의 구현이 확인되었습니다

checkStringArray 함수는 packages/shared/src/utils/String.ts에 올바르게 구현되어 있으며, 타입 가드로서 입력값이 문자열 배열인지 확인하는 적절한 로직을 포함하고 있습니다. 이전 isStringArray 함수가 더 이상 코드베이스에서 발견되지 않는 것으로 보아 이는 단순한 함수 이름 변경으로 판단됩니다.

현재 구현:

  • 배열 여부 확인
  • 모든 요소가 문자열인지 검증
  • 타입 가드 기능 (value is string[])
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of both string array check functions

# Check the implementation of both functions
rg -A 5 "function (isStringArray|checkStringArray)"

# Check all usages to ensure consistent behavior
rg "(isStringArray|checkStringArray)\("

Length of output: 196


Script:

#!/bin/bash
# Search for the function definition in shared utils
ast-grep --pattern 'function checkStringArray($_) {
  $$$
}'

# Find the file containing the function
fd checkStringArray

# Check git history for any recent changes related to these functions
git log -p --grep="isStringArray\|checkStringArray" --max-count=1

Length of output: 84


Script:

#!/bin/bash
# Search for the file and function in shared utils directory
fd -t f . packages/shared
rg -l "checkStringArray"

# Look for exports containing this function
ast-grep --pattern 'export { $$ checkStringArray $$ }'
ast-grep --pattern 'export function checkStringArray'

# Check the implementation in TypeScript files
rg -t ts "checkStringArray" -B 2 -A 5

Length of output: 4737


Script:

#!/bin/bash
# Search for any previous implementation or references to isStringArray
rg "isStringArray" -B 2 -A 5

# Check git history for the specific file
git log -p packages/shared/src/utils/String.ts

Length of output: 28

packages/web/src/app/[lng]/memos/layout.tsx (2)

1-14: 서버 컴포넌트 설정이 적절히 구현되었습니다.

'use server' 지시문 추가와 상수 관리 개선이 잘 이루어졌습니다. COOKIE_KEY와 QUERY_KEY를 통한 상수 중앙화는 유지보수성을 향상시킬 것으로 보입니다.


Line range hint 24-35: 사이드바 상태 관리와 하이드레이션 전략이 개선되었습니다.

쿠키 키 상수화와 카테고리 조회 함수 이름 변경이 일관성 있게 적용되었습니다. 다만, 하이드레이션 경계에서의 쿼리 동작을 검증해볼 필요가 있습니다.

다음 스크립트로 카테고리 관련 쿼리 사용을 확인해보겠습니다:

✅ Verification successful

Let me check the hydration boundary implementation and query key usage pattern to verify the hydration strategy.


하이드레이션 전략이 적절하게 구현되어 있음을 확인했습니다.

  • HydrationBoundaryWrapper가 QueryClient를 생성하고 prefetch를 수행한 후 적절히 상태를 dehydrate하고 있습니다.
  • QUERY_KEY.category()가 일관되게 사용되고 있으며, useCategoryQuery와 mutation에서도 동일한 키를 참조하고 있습니다.
  • 카테고리 데이터의 prefetch와 하이드레이션이 레이아웃 레벨에서 적절하게 처리되고 있습니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# getCategories 함수의 다른 사용 사례 확인
rg "getCategories\(" --type ts

# QUERY_KEY.category 사용 패턴 확인
rg "QUERY_KEY\.category" --type ts

Length of output: 718


Script:

#!/bin/bash
# Check HydrationBoundaryWrapper implementation
ast-grep --pattern 'export function HydrationBoundaryWrapper' -l ts,tsx

# Check the implementation of QUERY_KEY.category
ast-grep --pattern 'export const QUERY_KEY = {
  $$$
  category$_: $_,
  $$$
}'

# Check useCategoryQuery implementation
ast-grep --pattern 'export function useCategoryQuery' -l ts,tsx

Length of output: 447


Script:

#!/bin/bash
# Check HydrationBoundaryWrapper implementation
rg "export.*HydrationBoundaryWrapper" -A 5

# Check QUERY_KEY implementation
rg "export const QUERY_KEY" -A 10

# Check useCategoryQuery implementation
rg "export.*useCategoryQuery" -A 5

# Check hydration related imports
rg "import.*HydrationBoundary" --type tsx

Length of output: 2478

packages/shared/src/hooks/supabase/useMemoPostMutation.ts (1)

6-7: 타입 정의가 명확하고 재사용 가능하게 구현되었습니다.

타입 별칭을 사용하여 코드의 가독성과 유지보수성이 향상되었습니다.

packages/web/src/app/[lng]/login/components/LoginSection/index.tsx (1)

20-28: 화살표 함수를 사용한 콜백 처리가 개선되었습니다.

콜백 함수를 화살표 함수로 변경한 것은 좋은 개선입니다. 이는 코드의 가독성을 높이고 현대적인 React 패턴을 따르고 있습니다.

packages/shared/src/utils/extension/Supabase.ts (2)

1-1: 상수 관리 개선이 잘 이루어졌습니다!

상수들을 CONFIG 객체로 통합하여 관리하는 방식으로 변경한 것이 좋은 개선입니다. 이는 설정 값의 중앙 집중화된 관리를 가능하게 합니다.


9-10: 🛠️ Refactor suggestion

Supabase 클라이언트 설정에 대한 유효성 검사가 필요합니다.

CONFIG.supabaseUrlCONFIG.supabaseAnonKey 값이 유효하지 않을 경우에 대한 처리가 필요합니다.

다음과 같은 방식으로 개선할 수 있습니다:

 export const getSupabaseClient = async () => {
   try {
+    if (!CONFIG.supabaseUrl || !CONFIG.supabaseAnonKey) {
+      throw new Error('Supabase 설정이 올바르지 않습니다.');
+    }
     const supabaseClientInstance = createClient<Database>(CONFIG.supabaseUrl, CONFIG.supabaseAnonKey, {
packages/web/src/app/[lng]/memos/components/MemoSidebar/SidebarGroupCategory.tsx (2)

Line range hint 3-18: 임포트 구성이 깔끔하게 정리되었습니다!

기능별로 임포트가 잘 구성되어 있으며, Supabase 클라이언트 관리 방식의 개선이 잘 반영되었습니다.


22-25: Supabase 클라이언트 훅 사용에 대한 검증이 필요합니다.

useSupabaseClient 훅으로의 마이그레이션이 적절해 보이나, 컴포넌트 전반에 걸쳐 일관된 사용을 확인해야 합니다.

다음 스크립트로 훅 사용의 일관성을 검증하겠습니다:

✅ Verification successful

Let me analyze the results. I can see that:

  1. getSupabaseClient is used in server-side components (routes, layouts) and extension-related code
  2. useSupabaseClient hook is consistently used across client-side components in the web package
  3. The implementation in question (SidebarGroupCategory.tsx) follows the correct pattern for client components

I can now generate the final response:

Supabase 클라이언트 구현이 적절하게 되어 있습니다

클라이언트 컴포넌트에서는 useSupabaseClient 훅을, 서버 컴포넌트에서는 getSupabaseClient 함수를 일관되게 사용하고 있습니다. 이는 Next.js의 서버/클라이언트 컴포넌트 아키텍처와 잘 부합합니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of useSupabaseClient hook across components

# Check for any remaining getSupabaseClient usage
echo "Checking for remaining getSupabaseClient usage:"
rg "getSupabaseClient"

# Check for useSupabaseClient hook usage pattern
echo "Verifying useSupabaseClient hook usage pattern:"
ast-grep --pattern 'const $_ = useSupabaseClient()'

Length of output: 3669

packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx (1)

4-4: 타입 시스템 변경사항 검토 완료

GetMemoType에서 GetMemoResponse로의 타입 변경이 올바르게 적용되었습니다. 컴포넌트의 기능에는 영향이 없으며, 코드베이스 전반의 일관성 향상에 기여합니다.

타입 변경의 일관성을 확인하기 위해 다음 스크립트를 실행합니다:

Also applies to: 23-23

✅ Verification successful

타입 시스템 변경이 일관되게 적용되었음을 확인했습니다

GetMemoResponse 타입이 다음 위치에서 올바르게 사용되고 있습니다:

  • packages/shared/src/utils/Supabase.ts에서 타입이 정의됨
  • packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsxMemoItem.tsx에서 일관되게 사용됨

이전 타입인 GetMemoType은 코드베이스에서 완전히 제거되었음을 확인했습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# GetMemoResponse 타입의 사용 패턴 확인
rg "GetMemoResponse" --type typescript

# 이전 GetMemoType이 남아있는지 확인
rg "GetMemoType" --type typescript

Length of output: 143


Script:

#!/bin/bash
# GetMemoResponse 타입의 사용 패턴 확인
rg "GetMemoResponse"

# 이전 GetMemoType이 남아있는지 확인
rg "GetMemoType"

# 관련 파일 찾기
fd -e ts -e tsx

Length of output: 12897

packages/shared/package.json (2)

38-41: 새로운 웹 훅 내보내기가 올바르게 추가되었습니다.

새로운 웹 훅 내보내기가 기존 패턴을 잘 따르고 있으며, 타입 정의와 기본 구현을 모두 제공합니다.


38-41: 웹 훅 관련 파일들의 존재 여부를 확인하세요.

dist 폴더에 해당 파일들이 실제로 생성되는지 확인이 필요합니다.

packages/shared/src/utils/Supabase.ts (2)

1-3: 깔끔한 import 구조입니다!

필요한 타입과 상수들이 잘 정의되어 있으며, 불필요한 import가 제거되어 코드가 더욱 깔끔해졌습니다.


Line range hint 32-37: 카테고리 테이블 존재 여부 확인이 필요합니다.

'category' 테이블명이 하드코딩되어 있는데, 이 테이블이 실제로 존재하는지 확인이 필요합니다.

다음 스크립트로 테이블 존재 여부를 확인할 수 있습니다:

✅ Verification successful

카테고리 테이블이 타입 시스템에서 올바르게 정의되어 있습니다.

코드베이스 분석 결과, 'category' 테이블이 다음과 같이 적절하게 정의되어 있음을 확인했습니다:

  • packages/shared/src/types/supabaseCustom.ts에서 CategoryTable 타입이 Database['memo']['Tables']['category']로 정의되어 있습니다.
  • 이 테이블 타입은 여러 컴포넌트와 훅에서 일관되게 사용되고 있습니다.
  • Supabase 클라이언트 호출에서 사용되는 'category' 테이블명이 타입 시스템의 정의와 일치합니다.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify if 'category' table is referenced consistently across the codebase

# Search for table name references
rg -g '*.{ts,tsx}' "from\(['\"]category['\"]\)" 

# Search for potential schema constants
rg -g '*.{ts,tsx}' "schemaCategory|SCHEMA_CATEGORY|CategorySchema"

Length of output: 355


Script:

#!/bin/bash
# Search for category table schema definitions and types
rg -g '*.{ts,tsx}' -A 5 "type.*Category.*Table"

# Search for database schema files
fd "schema|types" --extension sql --extension ts --extension tsx

# Search for any category-related type definitions
rg -g '*.{ts,tsx}' "interface.*Category|type.*Category"

Length of output: 1988


Script:

#!/bin/bash
# Search for Database type definition to verify schema structure
rg -g '*.{ts,tsx}' -A 10 "type.*Database.*=.*{" 

# Search for generated types file
fd "generated" --extension ts

Length of output: 183

packages/shared/src/hooks/supabase/useMemoPatchMutation.ts (1)

6-11: 타입 정의가 명확하고 잘 구조화되어 있습니다!

타입 별칭을 사용하여 코드의 가독성과 유지보수성이 향상되었습니다:

  • MutationVariables는 입력 매개변수를 명확하게 정의
  • MutationDataAwaited 타입을 활용하여 비동기 응답을 적절하게 처리
  • MutationError는 기본 Error 타입을 활용하여 간단하게 정의
packages/web/src/app/[lng]/memos/components/legacy/MemoTable.tsx (1)

4-4: Supabase 클라이언트 초기화 방식이 개선되었습니다.

getSupabaseClient 함수에서 useSupabaseClient 훅으로의 전환은 React의 관행에 더 잘 부합하며, 클라이언트 상태 관리를 더 효과적으로 만듭니다.

다른 컴포넌트들에서도 동일한 패턴이 적용되었는지 확인하겠습니다:

Also applies to: 8-8

✅ Verification successful

useSupabaseClient 훅으로의 마이그레이션이 일관되게 적용되었습니다.

클라이언트 컴포넌트에서는 useSupabaseClient 훅을 사용하고, 서버 컴포넌트에서는 getSupabaseClient를 적절히 사용하고 있습니다:

  • 클라이언트 컴포넌트들(MemoTable, MemoView, MemoDialog 등)에서 useSupabaseClient 훅 사용
  • 서버 컴포넌트들(layout.tsx, page.tsx, route.ts 등)에서 getSupabaseClient 함수 사용
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of useSupabaseClient hook across components

# Check for any remaining usage of getSupabaseClient
rg "getSupabaseClient" --type ts --type tsx

# Check for adoption of useSupabaseClient
rg "useSupabaseClient" --type ts --type tsx

Length of output: 143


Script:

#!/bin/bash
# Search for getSupabaseClient usage
rg "getSupabaseClient"

# Search for useSupabaseClient adoption
rg "useSupabaseClient"

# Find all TypeScript/React files that might use Supabase
fd "\.(tsx?|jsx?)$" | xargs rg "supabase"

Length of output: 20125

packages/web/src/utils/supabase.server.ts (1)

Line range hint 59-67: 로그아웃 시 추가 정리 작업 필요

토큰 삭제는 잘 구현되어 있으나, 사용자 관련 추가 데이터 정리가 필요할 수 있습니다.

로컬 스토리지나 다른 저장소에 사용자 관련 데이터가 있는지 확인이 필요합니다:

✅ Verification successful

로그아웃 구현이 적절합니다

LocalStorage 구현을 검토한 결과, 저장되는 데이터가 사용자 인증과 관련이 없는 가이드, 업데이트 버전, 설치 상태 등의 앱 설정 데이터만 포함하고 있습니다. 따라서 현재 구현된 토큰 삭제만으로도 충분합니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 사용자 관련 데이터를 저장하는 다른 위치 확인
rg -l "localStorage" --type ts
rg -l "sessionStorage" --type ts

Length of output: 304


Script:

#!/bin/bash
# Check LocalStorage.ts implementation and usage
cat packages/web/src/utils/LocalStorage.ts

# Check if there are any user-related data in localStorage
rg "localStorage\." -A 3 --type ts

Length of output: 1736

chrome-extension/lib/background/index.ts (4)

1-1: 상수 관리 방식이 개선되었습니다.

URL 관련 상수들이 CONFIGURL 객체로 통합되어 관리되는 것은 좋은 변경사항입니다. 이는 상수 관리를 더욱 체계적으로 만들어줍니다.


27-27: 로그인 URL이 CONFIG 객체를 통해 참조되도록 변경되었습니다.

CONFIG.webUrl을 사용하여 로그인 URL을 구성하는 것은 일관된 접근 방식입니다.


51-51: 메모 페이지 URL도 CONFIG 객체를 통해 참조되도록 변경되었습니다.

CONFIG.webUrl을 사용하여 메모 페이지 URL을 구성하는 것은 일관성 있는 변경입니다.


54-55: 가이드 URL 참조 방식이 개선되었습니다.

언어별 가이드 URL을 URL 객체의 속성으로 접근하는 것은 코드의 가독성과 유지보수성을 향상시킵니다.

packages/web/src/app/[lng]/memos/components/MemoDialog/index.tsx (1)

8-8: 훅 임포트 추가가 적절해 보입니다.

useSupabaseClient 훅을 사용하는 것은 React의 관례를 잘 따르고 있습니다.

pages/options/src/components/OptionForm.tsx (1)

3-8: 임포트 구문이 잘 정리되었습니다.

유틸리티 함수들이 명확하게 구조분해되어 임포트되었으며, getMemogetMemosSupabase로 이름을 변경한 것이 전체적인 리팩토링 방향과 일치합니다.

package.json (1)

42-42: Supabase SSR 패키지 추가 검토

@supabase/ssr 패키지가 추가된 것은 서버 사이드 렌더링 지원을 위한 적절한 변경으로 보입니다. 다만, 현재 최신 버전과의 호환성을 확인해보시기를 권장드립니다.

packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx (2)

4-10: import 구문이 잘 정리되어 있습니다!

새로운 의존성들이 논리적으로 잘 구성되어 있으며, 각각의 import가 명확한 목적을 가지고 있습니다.


18-20: 타입 변경에 따른 영향도를 확인해주세요.

GetMemoType에서 GetMemoResponse로의 타입 변경이 다른 컴포넌트들에도 영향을 미칠 수 있습니다.

다음 스크립트를 실행하여 GetMemoType의 사용처를 확인해주세요:

✅ Verification successful

타입 변경이 올바르게 적용되었습니다

검색 결과에 따르면 GetMemoType은 더 이상 코드베이스에서 사용되지 않으며, GetMemoResponse로의 마이그레이션이 완전히 이루어졌습니다. 이 타입은 다음 위치에서만 사용되고 있습니다:

  • packages/shared/src/utils/Supabase.ts: 타입 정의
  • packages/web/src/app/[lng]/memos/components/MemoView/MemoItem.tsx: 단일 메모 타입
  • packages/web/src/app/[lng]/memos/components/MemoView/MemoGrid.tsx: 메모 배열 타입
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# GetMemoType이 여전히 사용되고 있는 곳이 있는지 확인
rg "GetMemoType" --type typescript

# GetMemoResponse로 마이그레이션이 필요한 파일 확인
rg "memo\?: GetMemoType" --type typescript

Length of output: 149


Script:

#!/bin/bash
# Search for GetMemoType usage
rg "GetMemoType"

# Search for files containing memo with GetMemoType type annotation
rg "memo.*GetMemoType"

# Search for GetMemoResponse usage to verify migration
rg "GetMemoResponse"

Length of output: 614

pages/side-panel/src/components/MemoForm.tsx (2)

10-11: 훅 임포트 구조가 개선되었습니다.

확장 프로그램 관련 훅들을 extension 폴더로 이동하여 코드 구조가 더 명확해졌습니다.


24-27: Supabase 클라이언트 접근 방식이 개선되었습니다.

useSupabaseClientQuery를 사용하여 클라이언트 접근 방식이 일관되게 변경되었고, 타입 안정성이 향상되었습니다.

✅ Verification successful

웹 확장과 웹 애플리케이션에서 Supabase 클라이언트 훅 사용이 분리되어 있습니다

검색 결과를 통해 확인된 바로는:

  • 웹 확장(pages/side-panel)에서는 useSupabaseClientQuery를 일관되게 사용
  • 웹 애플리케이션(packages/web)에서는 useSupabaseClient를 사용

이는 의도된 설계로 보이며, 각 환경에 맞는 적절한 구현을 사용하고 있습니다. 웹 확장의 코드 변경은 해당 컨텍스트 내에서 일관성 있게 이루어졌습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify consistent usage of useSupabaseClientQuery across the codebase

# Check for any remaining useSupabaseClient usage
rg "useSupabaseClient[^Q]" --type ts --type tsx

Length of output: 77


Script:

#!/bin/bash
# Description: Verify consistent usage of useSupabaseClientQuery across the codebase
# Using ripgrep with proper file extensions and checking both patterns

# Check for any remaining useSupabaseClient usage
rg "useSupabaseClient[^Q]" -t typescript -t tsx

# Check for new useSupabaseClientQuery usage
rg "useSupabaseClientQuery" -t typescript -t tsx

# Find all hook imports to verify the pattern
rg "import.*useSupabase" -t typescript -t tsx

Length of output: 251


Script:

#!/bin/bash
# Description: Verify consistent usage of useSupabaseClientQuery across the codebase
# Using ripgrep without file type filters since they're not supported in the environment

# Check for any remaining useSupabaseClient usage
rg "useSupabaseClient[^Q]"

# Check for new useSupabaseClientQuery usage
rg "useSupabaseClientQuery"

# Find all hook imports to verify the pattern
rg "import.*useSupabase"

Length of output: 4728

packages/web/src/app/[lng]/memos/components/MemoView/MemoOption.tsx (2)

18-18: Supabase 클라이언트 초기화 방식 개선 👍

훅 기반의 접근 방식으로 전환하여 컴포넌트 전반에 걸쳐 일관성이 향상되었습니다.


32-32: useSupabaseClient 훅 사용 검증 필요

컴포넌트 라이프사이클 내에서 Supabase 클라이언트가 적절하게 초기화되고 정리되는지 확인이 필요합니다.

✅ Verification successful

useSupabaseClient 훅 구현이 적절함

useSupabaseClient 훅은 useMemo를 통해 클라이언트 인스턴스를 메모이제이션하고 있으며, 싱글톤 패턴으로 구현되어 있어 안전합니다. 별도의 정리(cleanup) 로직이 필요하지 않습니다.

  • 클라이언트는 전역 변수로 캐시되어 재사용됨
  • useMemo를 통해 컴포넌트 렌더링 시 안정적으로 동일한 인스턴스 유지
  • Supabase 클라이언트는 자체적으로 연결 관리를 하므로 추가 정리가 불필요
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify proper cleanup of Supabase client

# Check for cleanup handling in useSupabaseClient hook
ast-grep --pattern 'export function useSupabaseClient() {
  $$$
  useEffect(() => {
    $$$
    return () => {
      $$$
    }
  }, [])
  $$$
}'

Length of output: 146


Script:

#!/bin/bash
# Let's first check where useSupabaseClient is defined and its implementation
rg "useSupabaseClient" -A 5

# Also check for any Supabase client cleanup patterns in the codebase
rg "cleanup.*supabase|supabase.*cleanup" -i

# Check for any useEffect hooks related to Supabase client
ast-grep --pattern 'useEffect(() => {
  $$$
  supabase
  $$$
})'

Length of output: 14383


Script:

#!/bin/bash
# Let's check the implementation of useSupabaseClient hook
cat packages/web/src/hooks/useSupabaseClient.ts

# Also check getSupabaseClientBrowser implementation
rg "getSupabaseClientBrowser" -A 10

Length of output: 1162

packages/shared/src/utils/Environment.ts Show resolved Hide resolved
packages/shared/src/constants/Supabase.ts Show resolved Hide resolved
packages/web/src/hooks/useSupabaseClient.ts Show resolved Hide resolved
packages/shared/src/utils/Sentry.ts Show resolved Hide resolved
packages/shared/src/hooks/supabase/useMemoQuery.ts Outdated Show resolved Hide resolved
pages/options/src/components/OptionForm.tsx Show resolved Hide resolved
pages/side-panel/src/components/MemoForm.tsx Show resolved Hide resolved
@guesung guesung merged commit 1c3a06d into develop Nov 26, 2024
8 checks passed
@guesung guesung deleted the feature/dx-supabase branch November 26, 2024 03:43
Copy link

개발자 경험 개선

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.

1 participant