포스트 북마크 & 좋아요 기능 추가

2025. 6. 29. 09:00·Next.js
728x90
반응형

블로그에서 좋아요(Like)와 북마크(Bookmark) 기능은 작지만 강력한 UX 요소입니다.
간단한 버튼 클릭 하나로 독자는 반응을 남기고, 글쓴이는 피드백을 얻을 수 있죠.

이번 글에서는 Next.js에서 좋아요와 북마크 기능을 다음 방식으로 구현해볼게요:

  • ① 좋아요: 클릭 시 서버에 count 증가
  • ② 북마크: 로컬스토리지 기반, 로그인 없이도 구현 가능

🩷 1. 좋아요 기능: 서버에 count 저장

1) API 만들기

// pages/api/like.ts
let likes: { [slug: string]: number } = {};

export default function handler(req, res) {
  const { slug } = req.query;

  if (req.method === 'GET') {
    res.status(200).json({ count: likes[slug as string] || 0 });
  } else if (req.method === 'POST') {
    likes[slug as string] = (likes[slug as string] || 0) + 1;
    res.status(200).json({ count: likes[slug as string] });
  }
}

2) 클라이언트에서 좋아요 요청

const [likes, setLikes] = useState(0);

useEffect(() => {
  fetch(`/api/like?slug=${slug}`)
    .then(res => res.json())
    .then(data => setLikes(data.count));
}, [slug]);

const handleLike = async () => {
  const res = await fetch(`/api/like?slug=${slug}`, { method: "POST" });
  const data = await res.json();
  setLikes(data.count);
};
<button onClick={handleLike}>❤️ {likes} Likes</button>

간단한 API 기반 좋아요 기능 완성!


📌 2. 북마크 기능: 로컬스토리지 기반

북마크 기능은 로컬 스토리지를 이용하면 로그인 없이도 구현할 수 있어요.

const [bookmarked, setBookmarked] = useState(false);

useEffect(() => {
  const stored = localStorage.getItem('bookmarks');
  const bookmarks = stored ? JSON.parse(stored) : [];
  setBookmarked(bookmarks.includes(slug));
}, [slug]);

const toggleBookmark = () => {
  const stored = localStorage.getItem('bookmarks');
  const bookmarks = stored ? JSON.parse(stored) : [];

  if (bookmarks.includes(slug)) {
    const updated = bookmarks.filter((s) => s !== slug);
    localStorage.setItem('bookmarks', JSON.stringify(updated));
    setBookmarked(false);
  } else {
    const updated = [...bookmarks, slug];
    localStorage.setItem('bookmarks', JSON.stringify(updated));
    setBookmarked(true);
  }
};
<button onClick={toggleBookmark}>
  {bookmarked ? "🔖 Bookmarked" : "📌 Bookmark"}
</button>

장점: 클라이언트만으로도 빠르게 구현 가능

단점: 로그인 연동이 없으면 다른 기기에서 동기화 안 됨


📊 3. 두 기능을 UI로 정리해 보기

<div className="flex gap-4 mt-6">
  <button onClick={handleLike} className="text-pink-500">❤️ {likes}</button>
  <button onClick={toggleBookmark}>
    {bookmarked ? "🔖" : "📌"} 북마크
  </button>
</div>

작지만 유용한 인터랙션을 통해 글에 더 많은 참여를 유도할 수 있어요.


✅ 마무리하며

좋아요와 북마크는 개발자 블로그에 꼭 필요한 핵심 UX 기능입니다.
복잡한 인증 없이도 구현 가능하고, 사용자는 즉각적인 피드백을 느낄 수 있어요.

“작은 반응이 큰 연결을 만든다.”

728x90
반응형

'Next.js' 카테고리의 다른 글

Notion을 CMS처럼 활용해서 블로그 연결하기  (0) 2025.07.01
구글 애널리틱스 연결해서 트래픽 추적하기  (2) 2025.06.30
배포까지 한 번에! — Vercel로 CI/CD 구성하기  (1) 2025.06.28
댓글 기능 추가하기 — Disqus, GitHub Discussion, 자체 API  (6) 2025.06.27
마크다운 에디터 연결하기 — CMS 없이 블로그 글 쓰는 워크플로우 만들기  (3) 2025.06.26
'Next.js' 카테고리의 다른 글
  • Notion을 CMS처럼 활용해서 블로그 연결하기
  • 구글 애널리틱스 연결해서 트래픽 추적하기
  • 배포까지 한 번에! — Vercel로 CI/CD 구성하기
  • 댓글 기능 추가하기 — Disqus, GitHub Discussion, 자체 API
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    뉴스앱
    flutter기초
    정적사이트
    개발블로그
    캘린더앱
    flutterui
    UIUX
    flutter게시판
    Flutter
    table_calendar
    Firebase
    날씨앱
    ActiveRecord
    flutter디자인
    코드를걷는사람
    다크모드
    모바일앱개발
    flutter개발
    메모앱
    rails보안
    flutter앱개발
    openweather
    백엔드개발
    fluttertips
    Nextjs
    flutter상태관리
    감성앱
    RubyOnRails
    UI디자인
    북마크기능
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
포스트 북마크 & 좋아요 기능 추가
상단으로

티스토리툴바