Skip to content

[Refactor/#137] 타입 위치 변경, 구조 정리#140

Merged
dew102938 merged 6 commits into
developfrom
refactor/#137
May 10, 2026
Merged

[Refactor/#137] 타입 위치 변경, 구조 정리#140
dew102938 merged 6 commits into
developfrom
refactor/#137

Conversation

@dew102938
Copy link
Copy Markdown
Contributor

@dew102938 dew102938 commented May 6, 2026

🔢 관련 이슈 링크

📌 변경사항PR

  • ✨Feature: 새로운 기능 추가
  • 🐞Bugfix: 버그/오류 수정
  • 📃Docs: 문서 수정(README 등)
  • 🔨Refactor: 코드 리팩토링 (기능 변경 없음)
  • 🧪Test: 테스트 코드 추가/수정
  • 🎨UI/UX: 디자인 및 사용성 수정
  • ⚙️Setting: 기본 세팅 작업

💻 작업내용

  • 컴포넌트에 산재해 있던 재사용성 있는 타입들만 타입 폴더로 이동
  • 객체 구조 정의는 interface, 그 외 조합/계산형은 type으로 표준화
  • 중복 타입 통합

🪧 미완성 작업

  • 네이밍

🤔 논의 사항 및 참고 사항

  • 타입, 인터페이스 앞에 T, I 붙이는 네이밍은 일단 적용하지 않았습니다
    타입스크립트 공식 가이드에서 이 방식을 비권장하고 있어 조사해보니
    더 이상 변수명으로 역할 구분할 필요 없음 / 명명규칙 늘어나고 가독성 떨어짐/ 캡슐화 원칙 위반
    등의 이유로 사용을 지양한다고 합니다
    그래서 앞에 T나 I를 붙이지 않는 방향으로 진행하면 어떨까요?
  • GetAvailableTablesParams는 객체 구조이지만 interface 사용 시 인덱스 시그니처 누락 에러(TS2345)가 발생하여 예외적으로 type으로 정의했습니다

✅ 체크리스트

  • 브랜치는 잘 맞게 올렸는지
  • 관련 이슈를 맞게 연결했는지
  • 로컬에서 정상 동작을 확있했는지
  • 충돌은 없는지
  • 불필요한 console.log 제거했는지

Summary by CodeRabbit

  • Refactor

    • 타입 정의와 API/컴포넌트 선언을 중앙화·정리하여 코드 일관성과 유지보수성 향상
    • UI·동작에는 영향 없음 (기존 화면/행동 유지)
  • New Features

    • 결제 확인 흐름과 회원 탈퇴 호출이 추가되어 관련 작업 흐름 안정화 및 기능 완결성 향상

@dew102938 dew102938 requested a review from jjjsun May 6, 2026 16:19
@dew102938 dew102938 self-assigned this May 6, 2026
@dew102938 dew102938 added the 🔨 Refactor 코드 리팩토링 label May 6, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eatsfine Ready Ready Preview, Comment May 10, 2026 10:26am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 6, 2026

Warning

Rate limit exceeded

@dew102938 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 49 minutes and 55 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 53ae9600-1356-44b5-a867-ffb7560bd36f

📥 Commits

Reviewing files that changed from the base of the PR and between ab9635b and 761b36c.

📒 Files selected for processing (1)
  • src/pages/myPage/reservationPage.tsx
📝 Walkthrough

Walkthrough

로컬에 흩어졌던 타입/DTO를 src/types/*로 통합하고, API 엔드포인트·어댑터·훅·컴포넌트·페이지에서 인라인 타입을 제거해 공용 타입(주로 interface)과 ApiResponse 제네릭으로 통일했습니다. 일부 UI에서 state 업데이트 안전성(functional updater)과 매핑(shape) 조정이 포함됩니다.


Changes

타입 구조 중앙화 및 통합

Layer / File(s) Summary
공용 타입 선언
src/types/* (api.ts, auth.ts, booking.ts, inquiry.ts, layout.ts, map.ts, member.ts, menus.ts, payment.ts, reservation.ts, restaurant.ts, store.ts, table.ts, kakao.d.ts)
도메인별 타입 모듈을 추가/확장하고 다수의 type 별칭을 interface로 변환함. ApiResponseWithFlags, 예약/메뉴/결제/멤버/상점/테이블/레이아웃 관련 인터페이스 및 DTO들이 선언됨.
axios·어댑터 정리
src/api/axios.ts, src/api/adapters/store.adapter.ts, src/api/dto/store.dto.ts
axios에서 로컬 응답/flag 타입 제거 및 공용 ApiResponseWithFlags/ApiResponse 사용으로 통일. 기존 DTO 파일의 타입 선언 일부 삭제.
엔드포인트 공용 타입 적용
src/api/endpoints/*, src/api/*
각 엔드포인트에서 인라인 타입/DTO 제거, ApiResponse<T> 제네릭과 @/types/*의 공용 타입으로 제네릭/시그니처를 표준화(런타임 흐름은 유지).
Owner API 정리
src/api/owner/*
owner 관련 API(menus, reservation, stores, storeLayout, table)에서 로컬 타입 제거 및 @/types/*로 타입 의존성 통합.
훅·클라이언트 수정
src/hooks/**
hooks의 파라미터/결과 타입을 공용 타입으로 변경하고, 일부 매핑(위경도 변환)과 쿼리 파라미터 타입을 정리.
컴포넌트 Props 정리
src/components/**, src/pages/**
다수 컴포넌트에서 local type Propsinterface Props로 통일. 컴포넌트/페이지에서 사용하는 타입 import를 @/types/*로 정리.
상태 안전성·매핑 변경
src/components/owner/tableDashboard.tsx, src/components/owner/MenuManagement.tsx, src/hooks/store/useSearchStores.ts
setState functional updater 적용, 서버 메뉴형 변경(MenuDraft 도입), useSearchStores의 파라미터 타입을 `SearchStoreParams

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes


Possibly related PRs

  • Eatsfine/FE#133: 타입 리팩터 및 ApiResponseWithFlags/StoreDetailDataDTO 관련 변경과 겹침.
  • Eatsfine/FE#48: store.adapter.ts의 toRestaurantDetail/StoreDetailDataDTO 사용과 직접 연관.
  • Eatsfine/FE#57: owner/reservation/layout/table 타입·API 변경 사항과 상호 영향 가능성.

Suggested reviewers

  • jjjsun

"흩어진 타입들 모아 한데,
인터페이스로 이름 새겨 넣네.
API는 제네릭으로 통일되어,
컴포넌트는 깔끔히 타입을 찾네.
축하해요 — 리팩터의 한 걸음! 🎉"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PR의 핵심 내용을 충분히 잘 나타내고 있습니다. 타입 위치 변경과 구조 정리라는 주요 변경사항이 명확합니다.
Description check ✅ Passed PR 설명이 변경사항, 적용한 표준화 규칙, 미완성 작업, 그리고 논의사항을 명확히 포함하고 있습니다.
Linked Issues check ✅ Passed 타입 폴더로 이동 [#137], 중복 타입 통합 [#137], 미사용 타입 제거 [#137]를 완료했고 interface/type 표준화도 적용되었습니다.
Out of Scope Changes check ✅ Passed 타입 정리, 이동, 표준화가 주요 변경이며 모두 #137 이슈 범위 내입니다. 기능 변경 없이 순수 리팩토링입니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#137

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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 and usage tips.

@dew102938
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 7, 2026

✅ 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.

Copy link
Copy Markdown

@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: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/components/owner/MenuManagement.tsx (1)

51-58: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

카테고리 강제 캐스팅 대신 런타임 정규화가 안전합니다.

(s.category as MenuCategory)는 서버에서 예상 외 문자열이 와도 그대로 통과되어 필터/표시 불일치가 생길 수 있습니다. 허용 목록 체크 후 fallback을 두는 쪽이 안전합니다.

예시 수정
+const MENU_CATEGORIES: MenuCategory[] = ["MAIN", "SIDE", "BEVERAGE", "ALCOHOL"];
+
+const normalizeCategory = (category: unknown): MenuCategory =>
+  typeof category === "string" && MENU_CATEGORIES.includes(category as MenuCategory)
+    ? (category as MenuCategory)
+    : "MAIN";
+
 const mapServerToLocal = (s: MenuDraft, restaurantId?: string): MenuItem => ({
   id: String(s.menuId ?? `MENU_${crypto.randomUUID()}`),
   restaurantId: restaurantId ?? "",
   name: s.name ?? "",
   description: s.description ?? "",
   price: s.price ?? 0,
-  category: (s.category as MenuCategory) ?? "MAIN",
+  category: normalizeCategory(s.category),
   imageUrl: s.imageUrl ?? undefined,
   isSoldOut: s.isSoldOut ?? false,
   isActive: s.isActive ?? true,
 });

Also applies to: 89-90

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/owner/MenuManagement.tsx` around lines 51 - 58, Replace the
unsafe type cast (s.category as MenuCategory) in mapServerToLocal with runtime
normalization: check s.category against the allowed MenuCategory values (e.g.,
via Object.values(MenuCategory) or a small allowedCategories array) and use that
value only if it matches, otherwise fallback to "MAIN"; do the same runtime
validation for the other mapping site that reads s.category (the similar
s.category handling around lines 89-90) so unexpected server strings cannot slip
through.
src/api/endpoints/reservations.ts (1)

38-38: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

!data.isSuccess에서 옵셔널 체이닝 누락

같은 파일의 getAvailableTimes(Line 21)와 createBooking(Line 58)은 모두 !data?.isSuccess를 사용하는데, getAvailableTables!data.isSuccess입니다. data가 드물게 undefined/null인 상황에서 에러 분기 대신 TypeError가 던져질 수 있습니다.

🛠️ 제안 수정
-  if (!data.isSuccess) {
+  if (!data?.isSuccess) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/api/endpoints/reservations.ts` at line 38, The if-check in
getAvailableTables currently uses a direct property access (if
(!data.isSuccess)) which can throw when data is null/undefined; change the
condition to use optional chaining (check !data?.isSuccess) so it matches
getAvailableTimes and createBooking and safely handles when the response `data`
is undefined; update the `getAvailableTables` branch where `data` is inspected
to use `data?.isSuccess`.
🧹 Nitpick comments (11)
src/components/reservation/parts/TableMap.tsx (1)

4-11: ⚡ Quick win

Props 대신 TableMapProps로 명시적으로 이름 붙여주세요.

현재 동작에는 문제 없지만, 컴포넌트별 props 타입 식별성이 떨어집니다. 타입 이동/재사용이 많은 PR 맥락에서는 TableMapProps처럼 구체 이름이 유지보수에 더 유리합니다.

예시 변경
-interface Props {
+interface TableMapProps {
   layout: SeatLayout;
   availableIds: Set<number>;
   selectedTableId: number | null;
   seatType: SeatType | null;
   onSelectTable: (tableId: number) => void;
   onSelectSeatType: (seatType: SeatType) => void;
 }

 export default function TableMap({
   layout,
   availableIds,
   selectedTableId,
   seatType,
   onSelectTable,
   onSelectSeatType,
-}: Props) {
+}: TableMapProps) {

As per coding guidelines, src/components/**: "컴포넌트는 단일 책임, props 타입/네이밍 명확히, 접근성(aria) 체크."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/reservation/parts/TableMap.tsx` around lines 4 - 11, Rename
the generic interface Props to a more specific TableMapProps and update all
local references accordingly: change the interface declaration interface Props {
... } to interface TableMapProps { ... } and update the TableMap component type
annotations/usages (e.g., React.FC<Props>, function parameters or any exported
type names) to use TableMapProps; ensure any other local variables, exports or
imports inside TableMap.tsx that referenced Props are updated to TableMapProps
so the component props type remains explicit and reusable.
src/types/booking.ts (1)

55-55: 💤 Low value

UserBookingItem = BookingListItem 별칭이 중복이에요

BookingListItem과 완전히 동일한 타입을 가리키는 별칭이라면 유지 비용만 생깁니다. UserBookingItem을 직접 BookingListItem으로 교체하거나, 두 타입 간에 의미상 차이가 생길 예정이라면 그 의도를 주석으로 남겨 주세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/booking.ts` at line 55, UserBookingItem is currently just a
redundant alias of BookingListItem; remove maintenance overhead by replacing all
uses of UserBookingItem with BookingListItem, or if you intend them to diverge
later, keep the alias and add a clarifying comment above the declaration
explaining the semantic distinction and future divergence plan (referencing the
UserBookingItem and BookingListItem symbols to locate the code).
src/types/reservation.ts (3)

1-12: 💤 Low value

Slot.statusSlotStatus 간 의도 주석이 있으면 좋겠어요

Slot.status"AVAILABLE" | "BOOKED" | "BLOCKED" 3가지이고, SlotStatus(수정 요청용)는 "AVAILABLE" | "BLOCKED" 2가지예요. "BOOKED"는 시스템이 자동으로 설정하는 값이라 수동 설정이 불가하다는 의도인 것 같은데, 짧은 주석 하나면 나중에 읽는 사람이 헷갈리지 않아요.

💡 예시
+/** 슬롯 상태 수정 시 허용 값 (BOOKED는 시스템 전용이므로 제외) */
 export type SlotStatus = "AVAILABLE" | "BLOCKED";
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/reservation.ts` around lines 1 - 12, Add a short clarifying comment
explaining the difference between Slot.status and SlotStatus: note that
Slot.status (in the Slot interface) can be "AVAILABLE" | "BOOKED" | "BLOCKED"
and that "BOOKED" is set by the system (not manually editable), whereas
SlotStatus (the type) only includes "AVAILABLE" | "BLOCKED" and is intended for
manual/patch operations; place the comment near the Slot interface’s status
field and/or above the SlotStatus type to prevent future confusion.

84-94: ⚡ Quick win

status: "PENDING" | "CONFIRMED" | string도 동일한 문제예요

Line 86의 status 필드도 위와 동일하게 | string이 리터럴 유니언을 흡수해버려요. 실제로 백엔드가 내려줄 수 있는 상태값을 모두 열거하거나, (string & {})를 사용하는 걸 권장해요.

💡 제안
 export interface CreateBookingResult {
   bookingId: number;
-  status: "PENDING" | "CONFIRMED" | string;
+  status: "PENDING" | "CONFIRMED" | "CANCELLED" | (string & {});
   storeName: string;
   // ...
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/reservation.ts` around lines 84 - 94, The CreateBookingResult.type
for status currently uses the broad union ' "PENDING" | "CONFIRMED" | string'
which collapses the string literals; update the status definition in the
CreateBookingResult interface to either enumerate all expected backend status
literals (e.g., include any other known values) or replace the trailing '|
string' with the open-ended type pattern '(string & {})' so the literals remain
distinct (modify the status field on CreateBookingResult accordingly).

48-48: ⚡ Quick win

| string 때문에 리터럴 유니언이 사실상 무력화돼요

TypeScript에서 "WINDOW" | "GENERAL" | string은 컴파일러가 string으로 평탄화해버려서 "WINDOW", "GENERAL" 리터럴이 타입 검사에 전혀 기여하지 못해요. IDE 자동완성 힌트도 사라지고 오타가 있어도 컴파일 오류가 안 나요.

  • API가 정해진 값만 내려준다면 | string을 제거해 완전히 좁히는 게 제일 좋아요.
  • API에서 확장된 값이 올 수 있다면 (string & {}) 패턴을 쓰면 IDE 힌트는 살리면서 임의 문자열도 허용해요.
💡 제안
-export type SeatsTypes = "WINDOW" | "GENERAL" | string;
+// 값이 고정돼 있을 때
+export type SeatsTypes = "WINDOW" | "GENERAL" | "ROOM" | "BAR" | "OUTDOOR";

+// 또는 확장 가능성을 열어둘 때 (IDE 힌트 유지)
+export type SeatsTypes = "WINDOW" | "GENERAL" | "ROOM" | "BAR" | "OUTDOOR" | (string & {});

참고로 AddTableModal.tsx<option> 값들("ROOM", "BAR", "OUTDOOR")도 현재 SeatsTypes에 없어서 타입 불일치가 발생해요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/reservation.ts` at line 48, The SeatsTypes union is being flattened
by the trailing "| string" so the literal members ("WINDOW" | "GENERAL") lose
type-checking and IDE hints; either remove "| string" to lock SeatsTypes to the
known literals, or if you must allow unknown values change the type to the
open-but-literal-friendly pattern (string & {}) for SeatsTypes; also update the
literal set to include the values used in AddTableModal.tsx (e.g., "ROOM",
"BAR", "OUTDOOR") so the option values match the SeatsTypes union and avoid type
mismatches.
src/types/payment.ts (1)

11-20: 💤 Low value

status / paymentMethod / paymentProvider 필드 타입 보강 고려

현재 세 필드가 순수 string이라 오타나 API 계약 이탈을 컴파일 타임에 잡지 못해요. 백엔드가 내려주는 실제 값이 고정돼 있다면 리터럴 유니언으로 좁혀두면 좋겠어요.

💡 예시
 export interface PaymentConfirmResult {
   paymentId: number;
-  status: string;
+  status: "PENDING" | "COMPLETED" | "FAILED" | "CANCELLED" | (string & {});
   approvedAt: string;
   orderId: string;
   amount: number;
-  paymentMethod: string;
-  paymentProvider: string;
+  paymentMethod: "CARD" | "VIRTUAL_ACCOUNT" | (string & {});
+  paymentProvider: "TOSS" | (string & {});
   receiptUrl: string;
 }

백엔드 스펙이 아직 유동적이라면 (string & {}) 패턴만 써도 IDE 힌트를 유지하면서 임의 문자열도 허용할 수 있어요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/payment.ts` around lines 11 - 20, The PaymentConfirmResult
interface currently types status, paymentMethod, and paymentProvider as plain
strings; narrow them to safer types by replacing those fields with either
literal union types of the known backend values (e.g., 'PAID' | 'PENDING' |
'FAILED' for status, specific provider/method strings) or, if the backend is
still fluid, use the (string & {}) pattern to preserve IDE completions while
allowing unknown values; update the PaymentConfirmResult declaration accordingly
so consumers get compile-time checks or helpful IDE hints.
src/api/endpoints/reservations.ts (1)

31-46: ⚡ Quick win

getAvailableTables 반환 타입 명시 권장

함수 반환 타입이 명시되어 있지 않아 data.result의 타입 (AvailableTablesResult | undefined | null)이 그대로 추론됩니다. 호출부에서 undefined를 기대하지 않을 경우 런타임 오류로 이어질 수 있습니다.

✨ 제안 수정
-export async function getAvailableTables(params: GetAvailableTablesParams) {
+export async function getAvailableTables(
+  params: GetAvailableTablesParams,
+): Promise<AvailableTablesResult> {
   const { storeId, ...query } = params;
   const { data } = await api.get<ApiResponse<AvailableTablesResult>>(
     `/api/v1/stores/${storeId}/bookings/available-tables`,
     { params: query },
   );

   if (!data?.isSuccess) {
     throw {
       status: 0,
       code: data?.code,
       message: data?.message ?? "예약 가능 테이블 조회를 실패하였습니다.",
     };
   }
-  return data.result;
+  return data.result!;
 }

data.resultisSuccess === true일 때 항상 존재한다면 ! 단언이 적절하며, ApiResponse<T>에서 result: T로 타이핑되어 있다면 단언 없이도 됩니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/api/endpoints/reservations.ts` around lines 31 - 46, The
getAvailableTables function lacks an explicit return type so callers may get an
inferred union (AvailableTablesResult | undefined | null); update the function
signature to an explicit Promise<AvailableTablesResult> (or
Promise<AvailableTablesResult | null> if nullable) and ensure you return a
non-null result by either asserting data.result! when you know isSuccess
guarantees presence or by fixing ApiResponse<T> so result is typed as T when
isSuccess is true; adjust the signature of getAvailableTables and the return
statement accordingly (reference function getAvailableTables and type
AvailableTablesResult / ApiResponse).
src/api/owner/reservation.ts (1)

23-24: ⚡ Quick win

응답 제네릭 타입을 끝까지 명시해 주세요.

patchBreakTime, cancelBookingByOwner는 현재 반환 타입 제네릭이 없어 호출부에서 타입 안전성이 끊깁니다. 동일 파일의 다른 함수들처럼 ApiResponse<...>를 지정해 통일하는 게 좋아요.

As per coding guidelines, "src/api/**: 에러 처리/타임아웃/리트라이 전략 확인, 응답 타입 안전성 유지."

Also applies to: 32-33

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/api/owner/reservation.ts` around lines 23 - 24, The two functions
patchBreakTime and cancelBookingByOwner lack the ApiResponse generic, breaking
type safety; update their returns to use the appropriate ApiResponse<T> generic
(e.g., api.patch<ApiResponse<YourResponseType>>(...) and
api.post<ApiResponse<YourResponseType>>(...) ) that matches the backend contract
(replace YourResponseType with the actual response DTO such as BreakTimeResponse
or a void/null type if no payload). Ensure both patchBreakTime and
cancelBookingByOwner use the same ApiResponse<> pattern as other functions in
this file so callers receive a fully typed response.
src/components/owner/tableDashboard.tsx (1)

256-257: ⚡ Quick win

exhaustive-deps 비활성화 대신 stale 참조를 제거해 주세요.

Line 256에서 lint를 끄는 방식은 Line 229의 tableData 클로저 참조 문제를 숨길 수 있습니다. setPlacedTables도 이전 상태 기반으로 이미지 URL을 보존하면 tableData 의존성을 제거하고 lint disable 없이 안정적으로 유지할 수 있어요.

예시 수정안
-                tableImageUrl:
-                  t.tableImageUrl ??
-                  tableData[t.gridY * layout.gridInfo.gridCol + t.gridX + 1]?.tableImageUrl ??
-                  null,
+                tableImageUrl: t.tableImageUrl ?? null,
...
-    fetchLayout();
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [storeId]);
+    fetchLayout();
+  }, [storeId]);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/owner/tableDashboard.tsx` around lines 256 - 257, The
eslint-disable hides a stale-closure bug: instead of suppressing exhaustive-deps
for the effect keyed by storeId, remove the eslint-disable and update the effect
body to use the functional updater of setPlacedTables so it doesn't close over
tableData; compute the new placed tables from the latest tableData but when
mapping/merging preserve existing image URLs by looking them up in the previous
state (e.g., setPlacedTables(prev => { const prevMap = new
Map(prev.map(p=>[p.id,p])); return tableData.map(t => ({ ...t, imageUrl:
prevMap.get(t.id)?.imageUrl ?? t.imageUrl })); })). This keeps the effect
dependent only on storeId (or explicitly adds tableData if needed) and avoids
stale references to tableData without disabling react-hooks/exhaustive-deps.
src/types/layout.ts (1)

31-37: ⚡ Quick win

CreateTableResponse.seatsType 타입이 과도하게 넓습니다.

현재 LayoutTable/CreateTableRequestSeatsType인데 응답만 string이라 후속 코드에서 불필요한 분기/캐스팅이 생깁니다. 서버 스펙이 고정이라면 SeatsType으로 맞추고, 확장 가능성을 남기려면 SeatsType | string처럼 의도를 명시해 주세요.

타입 정합성 개선 예시
 export interface CreateTableResponse {
   tableId: number;
   tableNumber: string;
   minSeatCount: number;
   maxSeatCount: number;
-  seatsType: string;
+  seatsType: SeatsType;
   gridX: number;
   gridY: number;
   tableImageUrl: string | null;
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/layout.ts` around lines 31 - 37, The CreateTableResponse interface
currently types seatsType as string, causing downstream casts compared to
LayoutTable/CreateTableRequest which use SeatsType; update
CreateTableResponse.seatsType to use the same type to maintain
consistency—either change it to SeatsType if the server spec is fixed or to
SeatsType | string if you want to allow extensions, and ensure you update any
imports/usages of CreateTableResponse accordingly so callers no longer need
extra branching or casting.
src/types/menus.ts (1)

75-80: ⚡ Quick win

메뉴 생성/수정 요청의 category는 좁은 타입으로 유지하는 편이 안전합니다.

요청 DTO에서 category: string이면 잘못된 값이 컴파일 단계에서 걸러지지 않습니다. 가능하면 MenuCategory로 제한해 API 요청 타입 안정성을 유지해 주세요.

타입 강화 예시
 export interface MenuUpdateItem {
   name: string;
   description?: string;
   price: number;
-  category: string;
+  category: MenuCategory;
   imageKey?: string;
 }

 export interface MenuCreateItem {
   name: string;
   description?: string;
   price: number;
-  category: string;
+  category: MenuCategory;
   imageKey?: string;
 }

Also applies to: 92-97

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/menus.ts` around lines 75 - 80, The MenuUpdateItem interface
currently types category as a plain string which allows invalid values; change
its category property to the existing MenuCategory union type (replace
"category: string" with "category: MenuCategory") to enforce valid enum-like
values at compile time, and apply the same change to the corresponding interface
defined later (the other menu DTO at lines ~92-97, e.g., MenuCreateItem) so both
request DTOs use MenuCategory instead of string.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/api/endpoints/member.ts`:
- Around line 19-22: patchMemberInfo currently returns res.data.result directly
which can propagate undefined for failed responses; update patchMemberInfo to
check the ApiResponse success flag (e.g., res.data.isSuccess) and only return
res.data.result when true, otherwise throw an Error (including useful info from
res.data or status) so callers get explicit failures; ensure you follow the same
error/timeout/retry handling pattern used by other endpoints in src/api (use
existing helper logic if present) and reference the ApiResponse type and
patchMemberInfo function when applying the change.

In `@src/types/booking.ts`:
- Around line 3-55: The Booking and BookingListItem interfaces have inconsistent
shared field types (bookingTime and amount) which can cause misuse; update the
declarations for Booking and BookingListItem to document their differences with
clear JSDoc comments above each interface (mentioning which API/endpoint each
represents and the exact format: Booking.bookingTime is a formatted string and
amount may be number|null; BookingListItem.bookingTime is the serialized
LocalTime object and amount is number), or alternatively unify the types by
creating a shared type alias (e.g., BookingTimeString vs BookingTimeObject and
OptionalAmount) and reference those in Booking and BookingListItem so the intent
is explicit and safe when these types are used.

In `@src/types/member.ts`:
- Around line 9-12: PatchMemberInfo currently requires both name and phoneNumber
which conflicts with PATCH semantics and the project's PatchTableRequest
pattern; change PatchMemberInfo so name?: string and phoneNumber?: string (make
both optional) in src/types/member.ts and then update any call sites such as
MyInfoPage.tsx to handle possibly undefined fields (only include fields present
when building the PATCH payload) so partial updates work correctly.

In `@src/types/store.ts`:
- Around line 135-145: MyStore의 category 필드가 string으로 되어 있어 타입 안전성이 떨어지므로,
MyStore 인터페이스의 category 타입을 기존 유니온 타입 Category로 변경하여 RestaurantSummary와 일관되게
만드세요; 파일에 Category 선언이 동일 파일에 있는지 확인하고 없다면 해당 Category 타입을 import하거나 재사용하도록
조정하고, MyStore 인터페이스(심볼: MyStore)만 변경하면 됩니다.
- Around line 200-214: ApiStoreSummary currently exposes four optional
coordinate fields (latitude, longitude, lat, lng) causing ambiguity; change the
ApiStoreSummary interface to use only lat and lng (remove latitude/longitude),
add a short comment stating which field the API actually returns, then update
all consumers (e.g., useSearchStores.ts where you currently do s.latitude ??
s.lat, KakaoMap.tsx, StepStoreInfo.tsx) to read only lat/lng (and coerce string
→ number if needed), and normalize StoreInfo.schema.ts to accept/store lat/lng
instead of latitude/longitude so the whole codebase consistently uses lat and
lng.
- Around line 147-154: The MyStoreResponse interface duplicates the common
envelope; replace it with the generic ApiResponse usage instead of inlining
fields: remove the MyStoreResponse shape and export a type alias using
ApiResponse with the appropriate result payload (e.g., ApiResponse<{ stores:
MyStore[] }> or ApiResponse<SearchStoresResult>), keeping references to MyStore;
update any usages of MyStoreResponse to the new alias name.

In `@src/types/table.ts`:
- Around line 27-33: UpdatedTable.seatsType is currently typed as string while
PatchTableRequest.seatsType uses the narrower SeatsType; update the UpdatedTable
interface to use SeatsType instead of string, importing or referencing the
SeatsType union where it's declared, and run/adjust any affected consumers or
tests (e.g., places casting UpdatedTable.seatsType) to remove unnecessary casts
or fix type mismatches; ensure the change is applied to the UpdatedTable
declaration and any export/imports that reference it.

---

Outside diff comments:
In `@src/api/endpoints/reservations.ts`:
- Line 38: The if-check in getAvailableTables currently uses a direct property
access (if (!data.isSuccess)) which can throw when data is null/undefined;
change the condition to use optional chaining (check !data?.isSuccess) so it
matches getAvailableTimes and createBooking and safely handles when the response
`data` is undefined; update the `getAvailableTables` branch where `data` is
inspected to use `data?.isSuccess`.

In `@src/components/owner/MenuManagement.tsx`:
- Around line 51-58: Replace the unsafe type cast (s.category as MenuCategory)
in mapServerToLocal with runtime normalization: check s.category against the
allowed MenuCategory values (e.g., via Object.values(MenuCategory) or a small
allowedCategories array) and use that value only if it matches, otherwise
fallback to "MAIN"; do the same runtime validation for the other mapping site
that reads s.category (the similar s.category handling around lines 89-90) so
unexpected server strings cannot slip through.

---

Nitpick comments:
In `@src/api/endpoints/reservations.ts`:
- Around line 31-46: The getAvailableTables function lacks an explicit return
type so callers may get an inferred union (AvailableTablesResult | undefined |
null); update the function signature to an explicit
Promise<AvailableTablesResult> (or Promise<AvailableTablesResult | null> if
nullable) and ensure you return a non-null result by either asserting
data.result! when you know isSuccess guarantees presence or by fixing
ApiResponse<T> so result is typed as T when isSuccess is true; adjust the
signature of getAvailableTables and the return statement accordingly (reference
function getAvailableTables and type AvailableTablesResult / ApiResponse).

In `@src/api/owner/reservation.ts`:
- Around line 23-24: The two functions patchBreakTime and cancelBookingByOwner
lack the ApiResponse generic, breaking type safety; update their returns to use
the appropriate ApiResponse<T> generic (e.g.,
api.patch<ApiResponse<YourResponseType>>(...) and
api.post<ApiResponse<YourResponseType>>(...) ) that matches the backend contract
(replace YourResponseType with the actual response DTO such as BreakTimeResponse
or a void/null type if no payload). Ensure both patchBreakTime and
cancelBookingByOwner use the same ApiResponse<> pattern as other functions in
this file so callers receive a fully typed response.

In `@src/components/owner/tableDashboard.tsx`:
- Around line 256-257: The eslint-disable hides a stale-closure bug: instead of
suppressing exhaustive-deps for the effect keyed by storeId, remove the
eslint-disable and update the effect body to use the functional updater of
setPlacedTables so it doesn't close over tableData; compute the new placed
tables from the latest tableData but when mapping/merging preserve existing
image URLs by looking them up in the previous state (e.g., setPlacedTables(prev
=> { const prevMap = new Map(prev.map(p=>[p.id,p])); return tableData.map(t =>
({ ...t, imageUrl: prevMap.get(t.id)?.imageUrl ?? t.imageUrl })); })). This
keeps the effect dependent only on storeId (or explicitly adds tableData if
needed) and avoids stale references to tableData without disabling
react-hooks/exhaustive-deps.

In `@src/components/reservation/parts/TableMap.tsx`:
- Around line 4-11: Rename the generic interface Props to a more specific
TableMapProps and update all local references accordingly: change the interface
declaration interface Props { ... } to interface TableMapProps { ... } and
update the TableMap component type annotations/usages (e.g., React.FC<Props>,
function parameters or any exported type names) to use TableMapProps; ensure any
other local variables, exports or imports inside TableMap.tsx that referenced
Props are updated to TableMapProps so the component props type remains explicit
and reusable.

In `@src/types/booking.ts`:
- Line 55: UserBookingItem is currently just a redundant alias of
BookingListItem; remove maintenance overhead by replacing all uses of
UserBookingItem with BookingListItem, or if you intend them to diverge later,
keep the alias and add a clarifying comment above the declaration explaining the
semantic distinction and future divergence plan (referencing the UserBookingItem
and BookingListItem symbols to locate the code).

In `@src/types/layout.ts`:
- Around line 31-37: The CreateTableResponse interface currently types seatsType
as string, causing downstream casts compared to LayoutTable/CreateTableRequest
which use SeatsType; update CreateTableResponse.seatsType to use the same type
to maintain consistency—either change it to SeatsType if the server spec is
fixed or to SeatsType | string if you want to allow extensions, and ensure you
update any imports/usages of CreateTableResponse accordingly so callers no
longer need extra branching or casting.

In `@src/types/menus.ts`:
- Around line 75-80: The MenuUpdateItem interface currently types category as a
plain string which allows invalid values; change its category property to the
existing MenuCategory union type (replace "category: string" with "category:
MenuCategory") to enforce valid enum-like values at compile time, and apply the
same change to the corresponding interface defined later (the other menu DTO at
lines ~92-97, e.g., MenuCreateItem) so both request DTOs use MenuCategory
instead of string.

In `@src/types/payment.ts`:
- Around line 11-20: The PaymentConfirmResult interface currently types status,
paymentMethod, and paymentProvider as plain strings; narrow them to safer types
by replacing those fields with either literal union types of the known backend
values (e.g., 'PAID' | 'PENDING' | 'FAILED' for status, specific provider/method
strings) or, if the backend is still fluid, use the (string & {}) pattern to
preserve IDE completions while allowing unknown values; update the
PaymentConfirmResult declaration accordingly so consumers get compile-time
checks or helpful IDE hints.

In `@src/types/reservation.ts`:
- Around line 1-12: Add a short clarifying comment explaining the difference
between Slot.status and SlotStatus: note that Slot.status (in the Slot
interface) can be "AVAILABLE" | "BOOKED" | "BLOCKED" and that "BOOKED" is set by
the system (not manually editable), whereas SlotStatus (the type) only includes
"AVAILABLE" | "BLOCKED" and is intended for manual/patch operations; place the
comment near the Slot interface’s status field and/or above the SlotStatus type
to prevent future confusion.
- Around line 84-94: The CreateBookingResult.type for status currently uses the
broad union ' "PENDING" | "CONFIRMED" | string' which collapses the string
literals; update the status definition in the CreateBookingResult interface to
either enumerate all expected backend status literals (e.g., include any other
known values) or replace the trailing '| string' with the open-ended type
pattern '(string & {})' so the literals remain distinct (modify the status field
on CreateBookingResult accordingly).
- Line 48: The SeatsTypes union is being flattened by the trailing "| string" so
the literal members ("WINDOW" | "GENERAL") lose type-checking and IDE hints;
either remove "| string" to lock SeatsTypes to the known literals, or if you
must allow unknown values change the type to the open-but-literal-friendly
pattern (string & {}) for SeatsTypes; also update the literal set to include the
values used in AddTableModal.tsx (e.g., "ROOM", "BAR", "OUTDOOR") so the option
values match the SeatsTypes union and avoid type mismatches.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: cf3b9166-34fc-4599-9d0e-227719e02715

📥 Commits

Reviewing files that changed from the base of the PR and between e85bf04 and fa1e991.

📒 Files selected for processing (59)
  • src/api/adapters/store.adapter.ts
  • src/api/axios.ts
  • src/api/bookings.ts
  • src/api/dto/store.dto.ts
  • src/api/endpoints/bookings.ts
  • src/api/endpoints/member.ts
  • src/api/endpoints/menus.ts
  • src/api/endpoints/payments.ts
  • src/api/endpoints/reservations.ts
  • src/api/inquiry.ts
  • src/api/owner/menus.ts
  • src/api/owner/reservation.ts
  • src/api/owner/storeLayout.ts
  • src/api/owner/stores.ts
  • src/api/owner/table.ts
  • src/components/customer-support/support.schema.ts
  • src/components/main/FeatureCard.tsx
  • src/components/main/Header.tsx
  • src/components/map/KakaoMap.tsx
  • src/components/owner/AddTableModal.tsx
  • src/components/owner/BreakTimeModal.tsx
  • src/components/owner/MenuManagement.tsx
  • src/components/owner/StoreSettings.tsx
  • src/components/owner/menuFormModal.tsx
  • src/components/owner/tableDashboard.tsx
  • src/components/owner/tableDetailModal.tsx
  • src/components/reservation/modals/PaymentModal.tsx
  • src/components/reservation/modals/ReservationCompleteModal.tsx
  • src/components/reservation/modals/ReservationConfirmModal.tsx
  • src/components/reservation/modals/ReservationMenuModal.tsx
  • src/components/reservation/modals/ReservationModal.tsx
  • src/components/reservation/parts/TableMap.tsx
  • src/components/restaurant/RestaurantCard.tsx
  • src/components/restaurant/RestaurantDetailModal.tsx
  • src/components/restaurant/RestaurantList.tsx
  • src/hooks/common/useInView.ts
  • src/hooks/reservation/useAvailableTables.ts
  • src/hooks/reservation/useAvailableTimes.ts
  • src/hooks/store/useRestaurantDetail.ts
  • src/hooks/store/useSearchStores.ts
  • src/pages/SearchPage.tsx
  • src/pages/myPage/MyInfoPage.tsx
  • src/pages/myPage/StoreRegistrationPage.tsx
  • src/pages/myPage/reservationPage.tsx
  • src/pages/myPage/storePage.tsx
  • src/types/api.ts
  • src/types/auth.ts
  • src/types/booking.ts
  • src/types/inquiry.ts
  • src/types/kakao.d.ts
  • src/types/layout.ts
  • src/types/map.ts
  • src/types/member.ts
  • src/types/menus.ts
  • src/types/payment.ts
  • src/types/reservation.ts
  • src/types/restaurant.ts
  • src/types/store.ts
  • src/types/table.ts
💤 Files with no reviewable changes (2)
  • src/components/customer-support/support.schema.ts
  • src/api/dto/store.dto.ts

Comment thread src/api/endpoints/member.ts
Comment thread src/types/booking.ts Outdated
Comment thread src/types/member.ts
Comment thread src/types/store.ts
Comment thread src/types/store.ts Outdated
Comment thread src/types/store.ts
Comment thread src/types/table.ts
@jjjsun
Copy link
Copy Markdown
Contributor

jjjsun commented May 7, 2026

넵! T나 I를 안붙이는걸로 하는게 더 깔끔할것같아요! 좋습니다!

Copy link
Copy Markdown

@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.

🧹 Nitpick comments (2)
src/types/booking.ts (1)

38-40: ⚡ Quick win

BookingResponseUserBookingsResult 구조 중복은 한쪽을 기준으로 합치는 게 안전해요

Line 11-13, Line 38-40 기준으로 두 타입이 완전히 동일해서, 이후 한쪽만 수정되는 드리프트가 생기기 쉬워요. 하나를 기준 타입으로 두고 alias 또는 extends로 정리해두면 유지보수성이 좋아집니다.

예시 코드
 export interface BookingResponse extends Pagination {
   bookingList: BookingListItem[];
 }
 
-export interface UserBookingsResult extends Pagination {
-  bookingList: BookingListItem[];
-}
+export type UserBookingsResult = BookingResponse;

Also applies to: 11-13

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/booking.ts` around lines 38 - 40, The two identical interfaces
BookingResponse and UserBookingsResult should be consolidated to avoid drift:
pick one as the canonical type (e.g., BookingResponse) and make the other an
alias or extend it (e.g., type UserBookingsResult = BookingResponse or interface
UserBookingsResult extends BookingResponse {}), ensuring both still reference
Pagination and bookingList: BookingListItem[]; update all usages to
import/reference the canonical symbol and remove duplicated fields from the
non-canonical declaration.
src/types/store.ts (1)

161-163: 🏗️ Heavy lift

StoreDetailDataDTO.storeId는 단일 타입으로 고정하는 걸 권장해요

Line 162의 number | string은 동일 ID라도 1/"1" 불일치(비교, 캐시 키, 맵 키) 리스크를 만들 수 있습니다. 공용 타입은 number로 고정하고, 문자열 가능성은 어댑터에서 정규화하는 편이 안전합니다.

제안 변경
 export interface StoreDetailDataDTO {
-  storeId: number | string;
+  storeId: number;
   storeName: string;
   description: string;
   address: string;
   phone: string;
// adapter 예시 (파일 외 변경)
const normalizedStoreId = Number(dto.storeId);
if (!Number.isFinite(normalizedStoreId)) {
  throw new Error("Invalid storeId");
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/types/store.ts` around lines 161 - 163, Change StoreDetailDataDTO.storeId
from a union to a single number type by updating the interface
(StoreDetailDataDTO.storeId: number); then ensure all callers/adapters normalize
incoming string IDs to numbers (e.g., in the DTO-to-domain adapter convert
dto.storeId -> Number, validate Number.isFinite and throw on invalid IDs) so
runtime inputs remain safe and consistent for comparisons, cache keys, and Map
usage.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/types/booking.ts`:
- Around line 38-40: The two identical interfaces BookingResponse and
UserBookingsResult should be consolidated to avoid drift: pick one as the
canonical type (e.g., BookingResponse) and make the other an alias or extend it
(e.g., type UserBookingsResult = BookingResponse or interface UserBookingsResult
extends BookingResponse {}), ensuring both still reference Pagination and
bookingList: BookingListItem[]; update all usages to import/reference the
canonical symbol and remove duplicated fields from the non-canonical
declaration.

In `@src/types/store.ts`:
- Around line 161-163: Change StoreDetailDataDTO.storeId from a union to a
single number type by updating the interface (StoreDetailDataDTO.storeId:
number); then ensure all callers/adapters normalize incoming string IDs to
numbers (e.g., in the DTO-to-domain adapter convert dto.storeId -> Number,
validate Number.isFinite and throw on invalid IDs) so runtime inputs remain safe
and consistent for comparisons, cache keys, and Map usage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8996bf45-e597-49ad-a19d-58c8582a67ee

📥 Commits

Reviewing files that changed from the base of the PR and between fa1e991 and ab9635b.

📒 Files selected for processing (6)
  • src/api/endpoints/member.ts
  • src/hooks/store/useSearchStores.ts
  • src/types/booking.ts
  • src/types/member.ts
  • src/types/store.ts
  • src/types/table.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/types/member.ts
  • src/hooks/store/useSearchStores.ts
  • src/types/table.ts
  • src/api/endpoints/member.ts

Copy link
Copy Markdown
Contributor

@jjjsun jjjsun left a comment

Choose a reason for hiding this comment

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

확인했습니다! 고생하셨어요!!

@dew102938 dew102938 merged commit 9b1fe28 into develop May 10, 2026
4 checks passed
@dew102938 dew102938 deleted the refactor/#137 branch May 10, 2026 13:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 Refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

♻️ [Refactor] 타입 구조 정리

2 participants