diff --git a/src/components/layout/footer/footer.tsx b/src/components/layout/footer/footer.tsx
index d4de13d..ff7d751 100644
--- a/src/components/layout/footer/footer.tsx
+++ b/src/components/layout/footer/footer.tsx
@@ -11,10 +11,10 @@ const Footer = () => {
©codeit - 2023
-
+
Privacy Policy
-
+
FAQ
diff --git a/src/components/layout/footer/index.ts b/src/components/layout/footer/index.ts
index e69de29..13f355b 100644
--- a/src/components/layout/footer/index.ts
+++ b/src/components/layout/footer/index.ts
@@ -0,0 +1 @@
+export { default as Footer } from './footer';
diff --git a/src/components/layout/frame/index.ts b/src/components/layout/frame/index.ts
index e69de29..1a4475a 100644
--- a/src/components/layout/frame/index.ts
+++ b/src/components/layout/frame/index.ts
@@ -0,0 +1 @@
+export { default as Frame } from './frame';
diff --git a/src/components/layout/index.ts b/src/components/layout/index.ts
index 7dda070..0232f88 100644
--- a/src/components/layout/index.ts
+++ b/src/components/layout/index.ts
@@ -1,2 +1,4 @@
export { Container, Wrapper } from './container';
+export { Footer } from './footer';
+export { Frame } from './frame';
export { Header } from './header';
diff --git a/src/components/ui/pagination/index.ts b/src/components/ui/pagination/index.ts
new file mode 100644
index 0000000..9128b29
--- /dev/null
+++ b/src/components/ui/pagination/index.ts
@@ -0,0 +1 @@
+export { default as Pagination } from './pagination';
diff --git a/src/components/ui/pagination/pagination.tsx b/src/components/ui/pagination/pagination.tsx
new file mode 100644
index 0000000..a634c4b
--- /dev/null
+++ b/src/components/ui/pagination/pagination.tsx
@@ -0,0 +1,74 @@
+import { Icon } from '@/components/ui';
+import { useEffect, useState } from 'react';
+
+const PAGE_GROUP_SIZE = 7;
+
+interface PaginationProps {
+ totalItems: number;
+ currentPage: number;
+ itemsPerPage: number;
+ onPageChange: (page: number) => void;
+}
+// totalItems 는 API 통신 시 Response 로 받는 """count""" 부모로부터 넘겨주기!
+
+const Pagination = ({ totalItems, currentPage, itemsPerPage, onPageChange }: PaginationProps) => {
+ const [pageGroup, setPageGroup] = useState(0);
+
+ const totalPages = totalItems ? Math.ceil(totalItems / itemsPerPage) : 0;
+
+ useEffect(() => {
+ const newGroup = Math.floor((currentPage - 1) / PAGE_GROUP_SIZE);
+ setPageGroup(newGroup);
+ }, [currentPage]);
+
+ if (totalPages < 1) return null;
+
+ const startPage = pageGroup * PAGE_GROUP_SIZE + 1;
+ const endPage = Math.min(startPage + PAGE_GROUP_SIZE - 1, totalPages);
+ const pageNumbers = Array.from({ length: endPage - startPage + 1 }, (_, i) => startPage + i);
+ const isPrevDisabled = pageGroup === 0;
+ const isNextDisabled = (pageGroup + 1) * PAGE_GROUP_SIZE >= totalPages;
+
+ return (
+ <>
+
+
+
+ {pageNumbers.map(page => (
+
+ ))}
+
+
+
+ >
+ );
+};
+
+export default Pagination;
diff --git a/src/context/appProvider.tsx b/src/context/appProvider.tsx
index a699ead..32dff00 100644
--- a/src/context/appProvider.tsx
+++ b/src/context/appProvider.tsx
@@ -1,6 +1,6 @@
import { ReactNode } from 'react';
import AuthProvider from './authProvider';
-import ToastProvider from './toastContext/toastContext';
+import { ToastProvider } from './toastContext';
const AppProvider = ({ children }: { children: ReactNode }) => {
return (
diff --git a/src/context/toastContext/index.ts b/src/context/toastContext/index.ts
index e69de29..683120c 100644
--- a/src/context/toastContext/index.ts
+++ b/src/context/toastContext/index.ts
@@ -0,0 +1 @@
+export { default as ToastProvider } from './toastContext';
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 5cd8804..2328246 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,5 +1,5 @@
-import { Header, Wrapper } from '@/components/layout';
-import Footer from '@/components/layout/footer/footer';
+import { Footer, Header, Wrapper } from '@/components/layout';
+
import AppProvider from '@/context/appProvider';
import '@/styles/fonts.css';