diff --git a/apps/landing/public/spinner.svg b/apps/landing/public/spinner.svg
new file mode 100644
index 00000000..654d4a89
--- /dev/null
+++ b/apps/landing/public/spinner.svg
@@ -0,0 +1,5 @@
+
diff --git a/apps/landing/src/app/StarButton.css b/apps/landing/src/app/StarButton.css
new file mode 100644
index 00000000..23331d25
--- /dev/null
+++ b/apps/landing/src/app/StarButton.css
@@ -0,0 +1,9 @@
+@keyframes spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
diff --git a/apps/landing/src/app/StarButton.tsx b/apps/landing/src/app/StarButton.tsx
index f3eb6ed1..71f6dee7 100644
--- a/apps/landing/src/app/StarButton.tsx
+++ b/apps/landing/src/app/StarButton.tsx
@@ -1,10 +1,37 @@
+'use client'
+
+import './StarButton.css'
+
import { Center, css, Flex, Image, Text } from '@devup-ui/react'
import Link from 'next/link'
+import { useEffect, useState } from 'react'
+
+export default function StarButton() {
+ const [starCount, setStarCount] = useState(null)
-export default async function StarButton() {
- const res = await fetch('https://api.github.com/repos/dev-five-git/devup-ui')
- const data = await res.json()
- const starCount = data.stargazers_count
+ useEffect(() => {
+ const abortController = new AbortController()
+ const fetchStarCount = async () => {
+ try {
+ const data = await fetch(
+ 'https://api.github.com/repos/dev-five-git/devup-ui',
+ {
+ signal: abortController.signal,
+ },
+ ).then((res) => res.json())
+ setStarCount(data.stargazers_count)
+ } catch (error) {
+ console.error(error)
+ } finally {
+ setStarCount((prev) => (typeof prev === 'number' ? prev : -1))
+ }
+ }
+ fetchStarCount()
+
+ return () => {
+ abortController.abort()
+ }
+ }, [])
return (
-
- {starCount}
-
+ {starCount === null ? (
+
+ ) : (
+
+ {starCount}
+
+ )}
diff --git a/apps/landing/src/app/markdown.css b/apps/landing/src/app/markdown.css
index 76722b3e..4cf3eb56 100644
--- a/apps/landing/src/app/markdown.css
+++ b/apps/landing/src/app/markdown.css
@@ -1,4 +1,4 @@
-@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css');
+@import url(https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css);
table {
border-collapse: collapse;