diff --git a/next.config.ts b/next.config.ts
index cae4153..818d7bf 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -36,7 +36,7 @@ const nextConfig: NextConfig = {
remotePatterns: [
{
protocol: "https",
- hostname: "campustable-s3.s3.ap-northeast-2.amazonaws.com",
+ hostname: "campus-table-s3.s3.ap-northeast-2.amazonaws.com",
port: "",
pathname: "/**",
},
diff --git a/src/assets/icons/index.ts b/src/assets/icons/index.ts
index d8ae768..b03098a 100644
--- a/src/assets/icons/index.ts
+++ b/src/assets/icons/index.ts
@@ -10,6 +10,10 @@ export { default as HomeDisableIcon } from "./home-disable.svg";
export { default as HomeEnableIcon } from "./home-enable.svg";
export { default as JingwanDisableIcon } from "./jingwan-disable.svg";
export { default as JingwanEnableIcon } from "./jingwan-enable.svg";
+export { default as MinusIcon } from "./minus.svg";
export { default as MyDisableIcon } from "./my-disable.svg";
export { default as MyEnableIcon } from "./my-enable.svg";
-export { default as ShoppingBag } from "./shopping-bag.svg";
\ No newline at end of file
+export { default as PlusIcon } from "./plus.svg";
+export { default as PlusDisableIcon } from "./plus-disable.svg";
+export { default as ShoppingBagIcon } from "./shopping-bag.svg";
+export { default as TrashIcon } from "./trash.svg";
\ No newline at end of file
diff --git a/src/assets/icons/minus.svg b/src/assets/icons/minus.svg
new file mode 100644
index 0000000..ba960e4
--- /dev/null
+++ b/src/assets/icons/minus.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/plus-disable.svg b/src/assets/icons/plus-disable.svg
new file mode 100644
index 0000000..4093fcc
--- /dev/null
+++ b/src/assets/icons/plus-disable.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/plus.svg b/src/assets/icons/plus.svg
new file mode 100644
index 0000000..9a897d0
--- /dev/null
+++ b/src/assets/icons/plus.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/trash.svg b/src/assets/icons/trash.svg
new file mode 100644
index 0000000..e92ec1a
--- /dev/null
+++ b/src/assets/icons/trash.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/features/cart/components/button/QuantityStepper.module.css b/src/features/cart/components/button/QuantityStepper.module.css
new file mode 100644
index 0000000..2843538
--- /dev/null
+++ b/src/features/cart/components/button/QuantityStepper.module.css
@@ -0,0 +1,27 @@
+.container {
+ display: flex;
+ justify-content: center;
+ align-content: center;
+
+ padding-block: 0.44rem;
+ padding-inline: 0.5rem;
+
+ border-radius: 0.25rem;
+ border: 1px solid var(--color-gray-200);
+ background-color: var(--color-white);
+}
+
+.wrapper {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.label {
+ color: var(--color-black);
+ font-size: var(--text-xs);
+ font-style: normal;
+ font-weight: var(--font-medium);
+ line-height: var(--line-height-single);
+ letter-spacing: var(--letter-spacing);
+}
\ No newline at end of file
diff --git a/src/features/cart/components/button/QuantityStepper.tsx b/src/features/cart/components/button/QuantityStepper.tsx
new file mode 100644
index 0000000..d73682e
--- /dev/null
+++ b/src/features/cart/components/button/QuantityStepper.tsx
@@ -0,0 +1,65 @@
+"use client";
+
+import styles from "./QuantityStepper.module.css";
+import { MinusIcon, PlusDisableIcon, PlusIcon, TrashIcon } from "@/assets/icons";
+import { useCart } from "@/features/cart/hooks/useCart";
+import { useToast } from "@/shared/hooks/useToast";
+
+interface QuantityStepperProps {
+ menuId: number;
+ quantity: number;
+}
+
+export default function QuantityStepper({
+ menuId,
+ quantity
+}: QuantityStepperProps) {
+ const { addToCart, removeFromCart, isAddingToCart } = useCart();
+ const { showToast } = useToast();
+
+ const handleIncrement = () => {
+ if (quantity >= 9) {
+ showToast("메뉴는 최대 9개까지만 담을 수 있어요!");
+ return;
+ }
+ addToCart(menuId, {
+ onError: (message) => showToast(message)
+ });
+ }
+
+ const handleDecrement = () => {
+ if (quantity <= 0) {
+ return;
+ }
+
+ removeFromCart(menuId, {
+ onError: (message) => showToast(message)
+ });
+ }
+
+ const decrementIcon = quantity === 1 ?