diff --git a/src/pages/GroupPage.tsx b/src/pages/GroupPage.tsx index d06d75e..98e0874 100644 --- a/src/pages/GroupPage.tsx +++ b/src/pages/GroupPage.tsx @@ -36,20 +36,32 @@ export default function GroupPage() { description: string; }) => { try { + // 디버깅: 요청 전 데이터 확인 + console.log("📤 보내는 데이터:", { + name: data.name, + meetingName: data.category ?? "", // undefined 방지 + maxMembers: Number(data.totalMembers), // 숫자로 강제 변환 + password: "1234", + description: data.description, + }); + const response = await createStudy({ name: data.name, + meetingName: data.category ?? "", // undefined 방지 + maxMembers: Number(data.totalMembers), // number 강제 변환 + password: "1234", description: data.description, }); // API 응답을 StudyGroup 형식으로 변환 const newGroup: StudyGroup = { - id: response.id, // UUID 그대로 사용 - category: data.category, // 모달에서 입력받은 모임명 - title: response.name, + id: response.id, // UUID + category: data.category, // 사용자가 입력한 모임명 유지 + title: response.name, // 백엔드 name 사용 leader: "나", // 생성자는 자동으로 스터디장 - totalMembers: data.totalMembers, // 모달에서 입력받은 인원수 + totalMembers: response.maxMembers, // ⚠️ 서버 응답값 사용 currentMembers: 1, // 생성자 포함 - createdAt: response.createdAt, // 생성일시 저장 (정렬용) + createdAt: response.createdAt, // 백엔드 createdAt }; setStudyGroups((prev) => [...prev, newGroup]); @@ -60,6 +72,7 @@ export default function GroupPage() { alert("스터디 생성 중 오류가 발생했습니다."); } }; + // 정렬 적용된 배열 (createdAt 우선, 없으면 id 기준) const sortedGroups = [...studyGroups].sort((a, b) => { diff --git a/src/services/api.ts b/src/services/api.ts index 370590e..637f386 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,39 +1,34 @@ -import type { AxiosInstance } from "axios"; import axios from "axios"; +import type { AxiosInstance } from "axios"; +// 🔥 axios 인스턴스 단 하나만 생성 const api: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, - withCredentials: true, // 필요 없으면 제거 가능 - // 기본 헤더는 설정하지 않음 (각 요청에서 필요에 따라 설정) + withCredentials: true, }); // 요청 인터셉터 api.interceptors.request.use( (config) => { - // Token 자동 삽입 (필요하면) + // 🔥 Access Token 자동 삽입 const token = localStorage.getItem("accessToken"); if (token) { config.headers.Authorization = `Bearer ${token}`; } - - // FormData를 보낼 때는 Content-Type을 제거하여 브라우저가 자동으로 boundary를 포함한 Content-Type을 설정하도록 함 + + // 🔥 FormData 처리 if (config.data instanceof FormData) { - // axios의 기본 Content-Type 헤더를 완전히 제거 - // 브라우저가 자동으로 multipart/form-data; boundary=... 를 설정하도록 함 if (config.headers) { - // 모든 가능한 Content-Type 헤더 제거 delete config.headers["Content-Type"]; delete config.headers["content-type"]; - // 명시적으로 undefined로 설정하여 axios가 헤더를 설정하지 않도록 함 config.headers["Content-Type"] = undefined as any; } } else { - // FormData가 아닐 때만 application/json 설정 if (!config.headers["Content-Type"]) { config.headers["Content-Type"] = "application/json"; } } - + return config; }, (error) => Promise.reject(error) diff --git a/src/services/study.service.ts b/src/services/study.service.ts index c9e4624..d7d6f98 100644 --- a/src/services/study.service.ts +++ b/src/services/study.service.ts @@ -8,16 +8,18 @@ import type { /** * 스터디 생성 API - * @param data 스터디 생성 요청 데이터 (name, description) + * @param data 스터디 생성 요청 데이터 (name, meetingName, maxMembers, password, description) * @returns 생성된 스터디 정보 */ export async function createStudy( data: CreateStudyRequest ): Promise { + console.log("📤 실제 요청 바디:", data); const response = await api.post("/studies", data); return response.data; } + /** * 초대 코드로 스터디 정보 조회 API * 인증 불필요한 공개 API이므로 별도 인스턴스 사용 diff --git a/src/types/group.ts b/src/types/group.ts index 93e7bd9..eaa644c 100644 --- a/src/types/group.ts +++ b/src/types/group.ts @@ -10,17 +10,22 @@ export interface StudyGroup { export type SortOrder = "최신순" | "오래된순"; -// API 응답 타입 +// API 요청 타입 export interface CreateStudyRequest { name: string; - description: string; + meetingName: string; + maxMembers: number; + password: string; + description?: string; } +// API 응답 타입 export interface CreateStudyResponse { id: string; name: string; inviteCode: string; - description: string; + meetingName: string; + maxMembers: number; status: string; createdAt: string; } diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..8ff31d2 --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ "rewrites": +[ + { + "source": "/api/:path*", + "destination": "http://3.27.86.20:8080/api/:path*" + } +] +}