Skip to content

[Deploy] develop → main 배포 반영#270

Merged
Seojegyeong merged 109 commits into
mainfrom
develop
Jun 25, 2026
Merged

[Deploy] develop → main 배포 반영#270
Seojegyeong merged 109 commits into
mainfrom
develop

Conversation

@Seojegyeong

@Seojegyeong Seojegyeong commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator

🚨 관련 이슈

N/A

✨ 변경사항

  • 🐞 BugFix Something isn't working
  • 💻 CrossBrowsing Browser compatibility
  • 🌏 Deploy Deploy
  • 🎨 Design Markup & styling
  • 📃 Docs Documentation writing and editing (README.md, etc.)
  • ✨ Feature Feature
  • 🔨 Refactor Code refactoring
  • ⚙️ Setting Development environment setup
  • ✅ Test Test related (storybook, jest, etc.)

✏️ 작업 내용

N/A

😅 미완성 작업

N/A

📢 논의 사항 및 참고 사항

N/A

💬 리뷰어 가이드 (P-Rules)
P1: 필수 반영 (Critical) - 버그 가능성, 컨벤션 위반. 해결 전 머지 불가.
P2: 적극 권장 (Recommended) - 더 나은 대안 제시. 가급적 반영 권장.
P3: 제안 (Suggestion) - 아이디어 공유. 반영 여부는 드라이버 자율.
P4: 단순 확인/칭찬 (Nit) - 사소한 오타, 칭찬 등 피드백.

Summary by CodeRabbit

  • New Features

    • 대시보드와 타임라인에 새로운 화면과 차트가 추가되어, 성과·트래픽·기간별 흐름을 더 쉽게 확인할 수 있습니다.
    • 플랫폼 연동 페이지와 연동 카드가 추가되어 Google, Meta, Naver 계정 연결을 시작할 수 있습니다.
    • 사이드바에 플랫폼 연동 메뉴와 연동 상태 배지가 표시됩니다.
  • Bug Fixes

    • 예산, 지표, 차트의 숫자/라벨 표시가 더 일관되게 정리되었습니다.
    • 로딩 표시와 비활성 버튼/입력 스타일이 개선되었습니다.

YermIm and others added 30 commits May 24, 2026 06:42
overview.ts, platform.ts에 중복 선언되어 있던 IRoasRanking을
provider.ts 단일 출처로 이동하고 각 파일에서 re-export
IMetricsResponse, IRoasRanking을 common.ts 단일 출처로 이동
IPlatformPerformance는 IMetricsResponse를 extend해 중복 필드 제거
overview.ts, platform.ts는 common.ts에서 re-export
중복된 예산 타입 2개를 common.ts의 IBudgetResponse 단일 타입으로 통합
소비 파일(api, mock) import명 일괄 수정
provider 유무로 query key 분기해 캐시 네임스페이스 유지
중복된 상수(WARNING/DANGER_THRESHOLD)와 select 로직 단일화
useOverviewMetrics의 toKpis, SinglePlatformView의 인라인 변환 제거
타이틀 문자열과 소수점(2자리) 통일
PlatformRoasTable, TopPerformanceList의 중복 로고 선언 제거
각 컴포넌트는 공통 상수에서 컴포넌트 레퍼런스를 가져와 고유 className 적용
TrafficChart, PlatformTrafficChart의 YYYYMMDDHHmm → timestamp 변환 중복 제거
…ormRoasRankings 날짜 상수화

AllPlatformTrafficChart의 인라인 파싱 로직을 parseMinuteToTimestamp 유틸로 교체
usePlatformRoasRankings의 하드코딩 날짜를 OVERVIEW_DAILY_METRICS_RANGE 상수로 교체
YermIm and others added 26 commits June 23, 2026 20:12
useCoreMutation 내부와 useAiAnalysisReport에서 모듈 레벨 싱글턴을
직접 import하던 방식을 useQueryClient() 훅으로 변경.
테스트 환경에서 QueryClientProvider 주입 시 동일 인스턴스를 참조하도록 수정.
[Refactor/#240] queryClient 싱글턴 import를 useQueryClient() 훅으로 교체
axiosInstance 인터셉터가 401 재발급을 별도로 처리하므로
전역 retry: 1이 4xx 에러에서 불필요한 중복 재시도를 유발하는 문제를 수정
백그라운드 갱신 의도를 void로 명시해 암묵적 Promise 무시 패턴 제거
setIsOpen(false)가 await Promise.all 이전에 실행되어
드롭다운이 캐시 갱신 전에 닫히던 문제를 수정
Workspace.tsx: 워크스페이스 생성 후 setCreateOpen(false) 이전에 캐시 갱신 완료 보장
MemberManagement.tsx: 멤버 삭제 후 setIsDeleteModalOpen(false) 이전에 캐시 갱신 완료 보장
[Feature/#254] 타임라인 기간 선택 컴포넌트 UI 구현
[Bugfix/#249] 사이드바 아이콘 스타일 통일 및 접기 버튼 호버 크기 조정
[Feature/#244] 플랫폼 연동 목록 및 연동 시작 API 연동
[Feature/#252] 타임라인 본체 UI 컴포넌트 및 Storybook 구현
[Feature/#257] 타임라인 성과 요약 패널 UI 구현
@Seojegyeong Seojegyeong self-assigned this Jun 25, 2026
@Seojegyeong Seojegyeong added the 🌏 Deploy 배포 관련 label Jun 25, 2026
@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2e7e8d78-cf2e-4545-be4c-1d78306771fe

📥 Commits

Reviewing files that changed from the base of the PR and between df1a789 and 902d09d.

⛔ Files ignored due to path filters (7)
  • .cursor/rules/always.mdc is excluded by none and included by none
  • .cursor/rules/private-always.mdc is excluded by none and included by none
  • src/assets/icon/sidebar/connect.svg is excluded by !**/*.svg and included by src/**
  • src/assets/icon/sidebar/dashboard.svg is excluded by !**/*.svg and included by src/**
  • src/assets/icon/sidebar/workspace.svg is excluded by !**/*.svg and included by src/**
  • vite.config.ts is excluded by none and included by none
  • vite/oauthRedirectDevPlugin.ts is excluded by none and included by none
📒 Files selected for processing (106)
  • src/api/dashboard/overview.ts
  • src/api/integration/google.ts
  • src/api/integration/meta.ts
  • src/api/integration/naver.ts
  • src/api/integration/platformAccounts.ts
  • src/components/auth/common/CommonAuthInput.tsx
  • src/components/auth/common/PasswordForm.tsx
  • src/components/auth/flows/find-email/EnterPhoneStep.tsx
  • src/components/auth/flows/find-email/ShowEmailResultStep.tsx
  • src/components/auth/flows/signup/ProfileSetupStep.tsx
  • src/components/common/dropdownmenu/DropdownMenu.tsx
  • src/components/common/textarea/TextareaField.tsx
  • src/components/dashboard/charts/BudgetGaugeChart.tsx
  • src/components/dashboard/charts/PerformanceEfficiencyChart.tsx
  • src/components/dashboard/charts/TrafficChart.tsx
  • src/components/dashboard/charts/budgetGaugeChart.mock.ts
  • src/components/dashboard/charts/performanceEfficiencyChart.config.ts
  • src/components/dashboard/charts/trafficChart.config.ts
  • src/components/dashboard/platform/AllPlatformTrafficChart.tsx
  • src/components/dashboard/platform/AllPlatformView.tsx
  • src/components/dashboard/platform/PlatformDetailCard.tsx
  • src/components/dashboard/platform/PlatformDetailTable.tsx
  • src/components/dashboard/platform/PlatformRoasTable.tsx
  • src/components/dashboard/platform/PlatformTrafficChart.tsx
  • src/components/dashboard/platform/SinglePlatformView.tsx
  • src/components/dashboard/platform/TopPerformanceList.tsx
  • src/components/dashboard/platform/skeleton/PlatformSkeleton.tsx
  • src/components/integration/NaverConnectModal.tsx
  • src/components/integration/PlatformIntegrationCard.tsx
  • src/components/integration/UpcomingPlatformCard.tsx
  • src/components/integration/skeleton/PlatformIntegrationsSkeleton.tsx
  • src/components/sidebar/Sidebar.tsx
  • src/components/sidebar/SidebarItem.tsx
  • src/components/sidebar/WorkspaceSwitcher.tsx
  • src/components/timeline/TimelineAxis.tsx
  • src/components/timeline/TimelineBar.tsx
  • src/components/timeline/TimelineCanvas.stories.tsx
  • src/components/timeline/TimelineGrid.tsx
  • src/components/timeline/TimelinePerformancePanel.stories.tsx
  • src/components/timeline/TimelinePerformancePanel.tsx
  • src/components/timeline/TimelinePeriodSelector.stories.tsx
  • src/components/timeline/TimelinePeriodSelector.tsx
  • src/components/workspace/InviteMemberModal.tsx
  • src/constants/dashboard/platformLogos.tsx
  • src/constants/sidebarNav.ts
  • src/constants/timeline/layout.ts
  • src/constants/timeline/statusStyle.ts
  • src/constants/timeline/viewUnit.ts
  • src/hooks/ads/useCampaignDetail.ts
  • src/hooks/ads/useCampaignGroup.ts
  • src/hooks/auth/useEmailVerification.ts
  • src/hooks/auth/useIsAdmin.ts
  • src/hooks/customQuery.ts
  • src/hooks/dashboard/useAiAnalysisReport.ts
  • src/hooks/dashboard/useBudget.ts
  • src/hooks/dashboard/useOverviewCampaignList.ts
  • src/hooks/dashboard/useOverviewMetrics.ts
  • src/hooks/dashboard/useOverviewRoasRankings.ts
  • src/hooks/dashboard/usePlatformAdCount.ts
  • src/hooks/dashboard/usePlatformBudget.ts
  • src/hooks/dashboard/usePlatformMetricFacts.ts
  • src/hooks/dashboard/usePlatformMetrics.ts
  • src/hooks/dashboard/usePlatformPerformance.ts
  • src/hooks/dashboard/usePlatformRoasRankings.ts
  • src/hooks/integration/usePlatformConnections.ts
  • src/layout/main/MainLayout.tsx
  • src/layout/workspace/WorkspaceManageLayout.tsx
  • src/lib/loadable.tsx
  • src/lib/queryClient.ts
  • src/lib/queryKeys.ts
  • src/pages/ads/list/AdsListPage.tsx
  • src/pages/auth/Login.tsx
  • src/pages/dashboard/overview/OverviewDashboard.tsx
  • src/pages/dashboard/overview/sections/OverviewBudgetSection.tsx
  • src/pages/dashboard/overview/sections/OverviewKpiSection.tsx
  • src/pages/dashboard/platform/PlatformDashboard.tsx
  • src/pages/dashboard/platform/platformDashboard.mock.ts
  • src/pages/integration/PlatformIntegrationsPage.tsx
  • src/pages/workspace/MemberManagement.tsx
  • src/pages/workspace/Workspace.tsx
  • src/pages/workspace/WorkspaceSetting.tsx
  • src/routes/AuthRoutes.tsx
  • src/routes/MainRoutes.tsx
  • src/routes/RoleGuard.tsx
  • src/styles/base.css
  • src/types/dashboard/common.ts
  • src/types/dashboard/overview.ts
  • src/types/dashboard/platform.ts
  • src/types/dashboard/provider.ts
  • src/types/integration/naver.ts
  • src/types/integration/platformConnection.ts
  • src/types/timeline/api.ts
  • src/types/timeline/form.ts
  • src/types/timeline/summary.ts
  • src/types/timeline/timeline.mock.ts
  • src/types/timeline/ui.ts
  • src/utils/auth/formatPhoneNumber.ts
  • src/utils/auth/maskEmail.ts
  • src/utils/auth/validation.ts
  • src/utils/dashboard/downloadChart.ts
  • src/utils/dashboard/metricRegistry.ts
  • src/utils/dashboard/metricsToKpis.ts
  • src/utils/dashboard/parseMinuteToTimestamp.ts
  • src/utils/dashboard/platformMetricsQuery.ts
  • src/utils/integration/mapPlatformAccounts.ts
  • src/utils/integration/startPlatformConnect.ts

📝 Walkthrough

Walkthrough

METRIC_REGISTRY와 중앙화된 QUERY_KEYS를 신규 추가하고, 대시보드 타입·훅·차트·뷰 전반을 이에 맞게 리팩터링합니다. 동시에 Google/Meta OAuth 및 Naver 자격증명 방식의 플랫폼 연동 페이지와 사이드바 배지를 구현하고, 타임라인 그리드/성과 패널 UI의 초기 컴포넌트를 추가합니다.

Changes

대시보드 지표 표준화 및 쿼리 인프라

Layer / File(s) Summary
쿼리 인프라: QUERY_KEYS, queryClient, customQuery
src/lib/queryKeys.ts, src/lib/queryClient.ts, src/hooks/customQuery.ts
QUERY_KEYS 상수를 신규 추가하고, queryClient retry 정책을 4xx 즉시 실패/5xx 1회 재시도 방식으로 변경합니다. useCoreMutation이 싱글턴 대신 useQueryClient()로 QueryClient를 획득하도록 수정됩니다.
대시보드 공통 타입 통합 및 API 시그니처 수정
src/types/dashboard/common.ts, src/types/dashboard/overview.ts, src/types/dashboard/platform.ts, src/api/dashboard/overview.ts
IMetricsResponse, IBudgetResponse, IRoasRankingcommon.ts로 이동하고 재-export합니다. IPlatformPerformanceIMetricsResponse를 상속하고, IBudgetStatus/IBudgetsResponse가 제거되며 getBudget 반환 타입이 IBudgetResponse로 변경됩니다. IPlatformRankingItemclickRate/ctrDeltaclicks/clickDelta로 교체됩니다.
METRIC_REGISTRY 및 KPI 유틸 추가
src/utils/dashboard/metricRegistry.ts, src/utils/dashboard/metricsToKpis.ts, src/utils/dashboard/parseMinuteToTimestamp.ts, src/utils/dashboard/platformMetricsQuery.ts
지표별 label/format/formatDelta를 제공하는 METRIC_REGISTRY, 응답을 IStatCardProps[]로 변환하는 metricsToKpis, 12자리 분 문자열을 타임스탬프로 파싱하는 parseMinuteToTimestamp, 캐시 공유용 fetchPlatformMetrics를 추가합니다. printAsPdf는 제거됩니다.
대시보드 데이터 훅 리팩터링
src/hooks/dashboard/useBudget.ts, src/hooks/dashboard/useOverviewMetrics.ts, src/hooks/dashboard/useOverviewRoasRankings.ts, src/hooks/dashboard/usePlatform*.ts, src/hooks/ads/...
useOverviewBudget/usePlatformBudgetuseBudget(provider?)로 통합합니다. 모든 훅의 queryKeyQUERY_KEYS 기반으로 전환하고, useOverviewRoasRankingsfetchPlatformMetrics를 사용하도록 변경합니다.
대시보드 차트/테이블 UI에 METRIC_REGISTRY 적용
src/components/dashboard/charts/*, src/components/dashboard/platform/PlatformDetailTable.tsx, src/components/dashboard/platform/PlatformRoasTable.tsx, src/components/dashboard/platform/TopPerformanceList.tsx, src/components/dashboard/platform/PlatformDetailCard.tsx
하드코딩된 통화/퍼센트 포맷과 한국어 라벨 문자열을 M.*.label/M.*.format으로 교체합니다. PlatformDetailCardmetricsToKpis로 KPI 배열을 동적 렌더링합니다. PLATFORM_CIRCLE_LOGO_MAP을 도입해 로고 선택 로직을 통일합니다.
플랫폼 대시보드 뷰 로딩 상태 단순화
src/components/dashboard/platform/AllPlatformView.tsx, src/components/dashboard/platform/SinglePlatformView.tsx, src/components/dashboard/platform/PlatformTrafficChart.tsx, src/pages/dashboard/platform/PlatformDashboard.tsx, src/pages/dashboard/overview/...
외부 isLoading prop 전달을 제거하고 각 데이터 훅의 is*Loading 상태를 직접 사용합니다. setTimeout 기반 로딩 해제 로직이 삭제됩니다. OverviewDashboard/OverviewBudgetSectionuseBudget으로 교체됩니다.
앱 전체 QUERY_KEYS 마이그레이션 및 기타 변경
src/layout/main/MainLayout.tsx, src/layout/workspace/WorkspaceManageLayout.tsx, src/pages/workspace/*, src/routes/RoleGuard.tsx, src/components/workspace/InviteMemberModal.tsx, src/components/common/dropdownmenu/DropdownMenu.tsx, src/styles/base.css
워크스페이스/캠페인 관련 모든 하드코딩 쿼리 키를 QUERY_KEYS 상수로 전환합니다. WorkspaceManageLayout이 워크스페이스 저장 mutation과 역할 설정 로직을 추가합니다. WorkspaceSetting에서 useIsAdmin을 제거하고 useMemo 기반으로 대체합니다. 인증 유틸 import 경로를 @/utils/auth/*로 변경하고, DropdownMenudanger/labelClassName 속성, 버튼 disabled 스타일, CSS 커서 규칙을 개선합니다.

플랫폼 연동 기능

Layer / File(s) Summary
연동 API, 타입, 매핑 유틸
src/types/integration/platformConnection.ts, src/types/integration/naver.ts, src/api/integration/*.ts, src/utils/integration/mapPlatformAccounts.ts, src/utils/integration/startPlatformConnect.ts, src/hooks/integration/usePlatformConnections.ts
TPlatformConnectionStatus, IPlatformConnectionItem 등 연동 UI 타입을 정의합니다. Google/Meta OAuth redirect API, Naver POST API, 플랫폼 계정 목록 조회 API를 구현하고, 토큰 만료 판정/UI 상태 매핑 유틸과 usePlatformConnections 훅을 추가합니다.
연동 UI 컴포넌트
src/components/integration/PlatformIntegrationCard.tsx, src/components/integration/NaverConnectModal.tsx, src/components/integration/UpcomingPlatformCard.tsx, src/components/integration/skeleton/PlatformIntegrationsSkeleton.tsx
상태별(connected/disconnected/error) 배지와 액션 버튼을 분기하는 PlatformIntegrationCard, Zod 폼 기반 Naver 자격증명 입력 모달, 카카오/준비 중 upcoming 카드, 로딩 스켈레톤을 구현합니다.
연동 페이지, 라우팅, 사이드바 배지
src/pages/integration/PlatformIntegrationsPage.tsx, src/routes/MainRoutes.tsx, src/constants/sidebarNav.ts, src/components/sidebar/Sidebar.tsx, src/components/sidebar/SidebarItem.tsx
integrations 라우트를 추가하고 PlatformIntegrationsPage를 연결합니다. 사이드바 footer에 "플랫폼 연동" 항목을 추가하고, SidebarItemtrailing prop을 확장해 연동 오류 시 "연동 필요" 배지를 표시합니다.

타임라인 기능 초기 구현

Layer / File(s) Summary
타임라인 타입, 상수, 목 데이터
src/types/timeline/*.ts, src/constants/timeline/*.ts
API 응답/폼/요약/UI 타입과 성과 상태/뷰 단위 상수, 레이아웃 픽셀 상수, 상태별 Tailwind 스타일 맵, 목 데이터를 정의합니다.
타임라인 그리드 컴포넌트 및 기간 선택기
src/components/timeline/TimelineAxis.tsx, src/components/timeline/TimelineBar.tsx, src/components/timeline/TimelineGrid.tsx, src/components/timeline/TimelinePeriodSelector.tsx, src/components/timeline/TimelineCanvas.stories.tsx, src/components/timeline/TimelinePeriodSelector.stories.tsx
날짜 축(오늘 배지), 캠페인 바(절대좌표 배치, 성과 상태 스타일), 그리드(열 구분선, 오늘 배경), 기간 선택 드롭다운(ARIA 포함)을 구현하고 Storybook 스토리를 추가합니다.
타임라인 성과 패널 및 스토리
src/components/timeline/TimelinePerformancePanel.tsx, src/components/timeline/TimelinePerformancePanel.stories.tsx
AI 요약(idle/loading/done 상태 시뮬레이션), KPI 카드, 플랫폼 기여율 바, 차트 영역을 포함하는 Drawer 기반 성과 패널을 구현합니다. Closed/Open/OpenWithSummary/Interactive 스토리를 추가합니다.

Sequence Diagram(s)

sequenceDiagram
  participant 사용자
  participant PlatformIntegrationsPage
  participant usePlatformConnections
  participant 백엔드
  participant 브라우저

  rect rgba(59, 130, 246, 0.5)
    note over PlatformIntegrationsPage, 백엔드: 연동 목록 조회
    PlatformIntegrationsPage->>usePlatformConnections: mount
    usePlatformConnections->>백엔드: GET /api/platform/{orgId}/accounts
    백엔드-->>usePlatformConnections: IPlatformAccountsResponseData
    usePlatformConnections-->>PlatformIntegrationsPage: IPlatformConnectionItem[] (connected/disconnected/error)
  end

  rect rgba(16, 185, 129, 0.5)
    note over 사용자, 브라우저: Google/Meta OAuth 연동
    사용자->>PlatformIntegrationsPage: 연동하기 클릭 (GOOGLE)
    PlatformIntegrationsPage->>백엔드: GET /api/google/login (Accept: application/json)
    백엔드-->>PlatformIntegrationsPage: {redirectUrl}
    PlatformIntegrationsPage->>브라우저: window.location.assign(redirectUrl)
  end

  rect rgba(245, 158, 11, 0.5)
    note over 사용자, 백엔드: Naver 자격증명 연동
    사용자->>PlatformIntegrationsPage: 연동하기 클릭 (NAVER)
    PlatformIntegrationsPage->>사용자: NaverConnectModal 표시
    사용자->>PlatformIntegrationsPage: customerId/apiKey/secretKey 입력 후 제출
    PlatformIntegrationsPage->>백엔드: POST /api/platform/{orgId}/accounts/naver
    백엔드-->>PlatformIntegrationsPage: 성공 응답
    PlatformIntegrationsPage->>usePlatformConnections: platform-connections 쿼리 무효화
  end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • WhereYouAd/WhereYouAd-Frontend#248: 동일한 queryKey 상수 중앙화 리팩터링을 다루며, 이번 PR의 QUERY_KEYS 도입과 직접적으로 연결됩니다.
  • WhereYouAd/WhereYouAd-Frontend#255: Google/Meta/Naver OAuth 연동 API 및 PlatformIntegrationsPage, usePlatformConnections 등 동일한 플랫폼 연동 기능 파일을 다룹니다.
  • WhereYouAd/WhereYouAd-Frontend#261: TimelinePerformancePanel, DropdownMenu danger 스타일, 타임라인 관련 타입/상수/목 데이터 등 동일한 파일 범위에서 변경이 이루어졌습니다.

Suggested reviewers

  • YermIm
  • jjjsun
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Seojegyeong Seojegyeong merged commit 31520f7 into main Jun 25, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🌏 Deploy 배포 관련

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants