From 1f9cf34e31eed1803c917f5d20268acdbfb1dd05 Mon Sep 17 00:00:00 2001 From: caadiq Date: Sat, 10 Jan 2026 00:02:42 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20publi?= =?UTF-8?q?c=20=ED=8E=98=EC=9D=B4=EC=A7=80=20API=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 수정된 파일 (5개): - pages/mobile/public/Album.jsx - fetch('/api/albums') → getAlbums() - pages/mobile/public/Members.jsx - fetch('/api/members') → getMembers() - pages/mobile/public/AlbumDetail.jsx - fetch('/api/albums') → getAlbums() - fetch('/api/albums/{id}/tracks') → getAlbumTracks() - pages/mobile/public/AlbumGallery.jsx - fetch('/api/albums') → getAlbums() - fetch('/api/albums/{id}/photos') → getAlbumPhotos() - pages/mobile/public/Schedule.jsx - fetch('/api/schedules?year=...') → getSchedules() - fetch('/api/schedules/categories') → getCategories() - fetch('/api/schedules?search=...') → searchSchedules() Home.jsx는 이미 API 모듈 사용 중이므로 제외 --- frontend/src/pages/mobile/public/Album.jsx | 4 ++-- frontend/src/pages/mobile/public/AlbumDetail.jsx | 7 +++---- frontend/src/pages/mobile/public/AlbumGallery.jsx | 7 +++---- frontend/src/pages/mobile/public/Members.jsx | 4 ++-- frontend/src/pages/mobile/public/Schedule.jsx | 11 ++++------- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/frontend/src/pages/mobile/public/Album.jsx b/frontend/src/pages/mobile/public/Album.jsx index 5e59ee9..972f2e5 100644 --- a/frontend/src/pages/mobile/public/Album.jsx +++ b/frontend/src/pages/mobile/public/Album.jsx @@ -1,6 +1,7 @@ import { motion } from 'framer-motion'; import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; +import { getAlbums } from '../../../api/public/albums'; // 모바일 앨범 목록 페이지 function MobileAlbum() { @@ -9,8 +10,7 @@ function MobileAlbum() { const [loading, setLoading] = useState(true); useEffect(() => { - fetch('/api/albums') - .then(res => res.json()) + getAlbums() .then(data => { setAlbums(data); setLoading(false); diff --git a/frontend/src/pages/mobile/public/AlbumDetail.jsx b/frontend/src/pages/mobile/public/AlbumDetail.jsx index fe6adbe..f62105c 100644 --- a/frontend/src/pages/mobile/public/AlbumDetail.jsx +++ b/frontend/src/pages/mobile/public/AlbumDetail.jsx @@ -2,6 +2,7 @@ import { motion } from 'framer-motion'; import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { ArrowLeft, Play } from 'lucide-react'; +import { getAlbums, getAlbumTracks } from '../../../api/public/albums'; // 모바일 앨범 상세 페이지 function MobileAlbumDetail() { @@ -13,15 +14,13 @@ function MobileAlbumDetail() { useEffect(() => { // 앨범 정보 로드 - fetch('/api/albums') - .then(res => res.json()) + getAlbums() .then(data => { const found = data.find(a => a.folder_name === name); if (found) { setAlbum(found); // 트랙 정보 로드 - fetch(`/api/albums/${found.id}/tracks`) - .then(res => res.json()) + getAlbumTracks(found.id) .then(setTracks) .catch(console.error); } diff --git a/frontend/src/pages/mobile/public/AlbumGallery.jsx b/frontend/src/pages/mobile/public/AlbumGallery.jsx index ea026de..8af74fc 100644 --- a/frontend/src/pages/mobile/public/AlbumGallery.jsx +++ b/frontend/src/pages/mobile/public/AlbumGallery.jsx @@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { ArrowLeft, X, ChevronLeft, ChevronRight } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; +import { getAlbums, getAlbumPhotos } from '../../../api/public/albums'; // 모바일 앨범 갤러리 페이지 function MobileAlbumGallery() { @@ -13,14 +14,12 @@ function MobileAlbumGallery() { const [selectedIndex, setSelectedIndex] = useState(null); useEffect(() => { - fetch('/api/albums') - .then(res => res.json()) + getAlbums() .then(data => { const found = data.find(a => a.folder_name === name); if (found) { setAlbum(found); - fetch(`/api/albums/${found.id}/photos`) - .then(res => res.json()) + getAlbumPhotos(found.id) .then(setPhotos) .catch(console.error); } diff --git a/frontend/src/pages/mobile/public/Members.jsx b/frontend/src/pages/mobile/public/Members.jsx index 2ffcb34..27b256a 100644 --- a/frontend/src/pages/mobile/public/Members.jsx +++ b/frontend/src/pages/mobile/public/Members.jsx @@ -1,6 +1,7 @@ import { motion, AnimatePresence } from 'framer-motion'; import { useState, useEffect } from 'react'; import { Instagram } from 'lucide-react'; +import { getMembers } from '../../../api/public/members'; // 모바일 멤버 페이지 function MobileMembers() { @@ -9,8 +10,7 @@ function MobileMembers() { const [selectedMember, setSelectedMember] = useState(null); useEffect(() => { - fetch('/api/members') - .then(res => res.json()) + getMembers() .then(data => { setMembers(data.filter(m => !m.is_former)); setFormerMembers(data.filter(m => m.is_former)); diff --git a/frontend/src/pages/mobile/public/Schedule.jsx b/frontend/src/pages/mobile/public/Schedule.jsx index a9f08ba..76918b8 100644 --- a/frontend/src/pages/mobile/public/Schedule.jsx +++ b/frontend/src/pages/mobile/public/Schedule.jsx @@ -3,6 +3,7 @@ import { motion, AnimatePresence } from 'framer-motion'; import { Clock, Tag, Link2, ChevronLeft, ChevronRight, ChevronDown, Search, X, Calendar } from 'lucide-react'; import { useInfiniteQuery } from '@tanstack/react-query'; import { useInView } from 'react-intersection-observer'; +import { getSchedules, getCategories, searchSchedules } from '../../../api/public/schedules'; // 모바일 일정 페이지 function MobileSchedule() { @@ -37,11 +38,7 @@ function MobileSchedule() { } = useInfiniteQuery({ queryKey: ['mobileScheduleSearch', searchTerm], queryFn: async ({ pageParam = 0 }) => { - const response = await fetch( - `/api/schedules?search=${encodeURIComponent(searchTerm)}&offset=${pageParam}&limit=${SEARCH_LIMIT}` - ); - if (!response.ok) throw new Error('Search failed'); - return response.json(); + return searchSchedules(searchTerm, { offset: pageParam, limit: SEARCH_LIMIT }); }, getNextPageParam: (lastPage) => { if (lastPage.hasMore) { @@ -72,8 +69,8 @@ function MobileSchedule() { setLoading(true); Promise.all([ - fetch(`/api/schedules?year=${year}&month=${month}`).then(res => res.json()), - fetch('/api/schedules/categories').then(res => res.json()) + getSchedules(year, month), + getCategories() ]).then(([schedulesData, categoriesData]) => { setSchedules(schedulesData); setCategories(categoriesData);