Skip to main content

Command Palette

Search for a command to run...

스크래핑으로 만든 초고속 만화 뷰어, SvelteKit으로 구현하기

Published
•3 min read•View as Markdown

SEO 키워드: SvelteKit, 만화 뷰어, 웹 스크래핑


# 서론 – “만화 읽기가 이렇게 불편할 줄은 몰랐어요”

일상에서 작은 불편함을 마주하면 “코드로 해결할 수 있겠지” 하는 생각이 듭니다.

특히 만화를 읽을 때, 광고가 끊임없이 뜨고, 페이지 전환이 느려서 독서 흐름이 깨지는 경험은 누구에게나 익숙합니다.

이 글에서는 SvelteKit과 웹 스크래핑을 활용해, 광고 없이 빠르게 로드되는 만화 뷰어를 직접 만드는 과정을 초보자도 이해할 수 있도록 단계별로 설명합니다.


# 본론

# 1. 프로젝트 준비 – SvelteKit 기본 설정

  1. Node.js 설치 (버전 18 이상 권장)

  2. 터미널에서 아래 명령어로 SvelteKit 프로젝트 생성

bash

   npm init svelte@next manga-reader

   cd manga-reader

   npm install

   npm run dev
  1. src/routes에 +page.svelte 파일을 만들고, 기본 레이아웃을 잡습니다.

    SvelteKit은 SSR(서버 사이드 렌더링)과 CSR(클라이언트 사이드 렌더링)을 자유롭게 전환할 수 있어, 페이지 로드 속도를 최적화하는 데 큰 장점이 있습니다.

# 2. 웹 스크래핑 – 만화 이미지 추출하기

만화 사이트는 일반적으로 이미지 URL을 직접 노출하지 않으므로, 서버 측에서 스크래핑을 수행합니다.

  1. Cheerio와 node-fetch 설치
bash

   npm install cheerio node-fetch
  1. src/lib/scraper.js 파일을 만들고, 목표 사이트의 HTML을 파싱해 이미지 URL을 추출합니다.
js

   import fetch from 'node-fetch';

   import cheerio from 'cheerio';

   export async function getMangaPages(chapterUrl) {

     const res = await fetch(chapterUrl);

     const html = await res.text();

     const $ = cheerio.load(html);

     // 예시: <img class='page-img' src='...'>

     const imgUrls = [];

     $('img.page-img').each((_, el) => {

       imgUrls.push($(el).attr('src'));

     });

     return imgUrls;

   }
  1. Edge Runtime(Vercel, Netlify 등)에서 동작하도록 src/routes/api/[chapter].js 엔드포인트를 만들면, 클라이언트는 별도 CORS 문제 없이 이미지 리스트를 받아올 수 있습니다.

# 3. 프리로드와 캐시 전략 – 초고속 로딩 구현

SvelteKit의 load 함수와 Service Worker를 활용해 페이지 전환 시마다 이미지를 미리 받아두는 전략을 적용합니다.

js

// +page.js

export async function load({ params, fetch }) {

  const { chapter } = params;

  const res = await fetch(`/api/${chapter}`);

  const pages = await res.json();

  return { pages };

}

그리고 src/service-worker.js에 캐시 로직을 추가합니다.

js

self.addEventListener('fetch', (event) => {

  if (event.request.destination === 'image') {

    event.respondWith(

      caches.open('manga-images').then(cache =>

        cache.match(event.request).then(resp =>

          resp || fetch(event.request).then(networkResp => {

            cache.put(event.request, networkResp.clone());

            return networkResp;

          })

        )

      )

    );

  }

});

이렇게 하면 사용자가 다음 페이지를 넘길 때마다 네트워크 요청이 최소화돼 즉시 표시가 가능합니다.

# 4. UI/UX – 직관적인 만화 뷰어 만들기

  1. 가로·세로 자동 맞춤: 이미지가 화면 크기에 맞게 object-fit: contain을 적용합니다.

  2. 스크롤 대신 페이지 넘김: wheel 이벤트와 touch 이벤트를 감지해 페이지를 전환합니다.

  3. 다크 모드와 배경 색상 옵션을 제공해 눈의 피로를 줄입니다.

svelte

<script>

  export let pages = [];

  let current = 0;

  function next() {

    if (current < pages.length - 1) current += 1;

  }

  function prev() {

    if (current > 0) current -= 1;

  }

</script>

<div class='viewer' on:wheel|preventDefault={e => e.deltaY > 0 ? next() : prev()}>

  <img src={pages[current]} alt='Manga page' />

</div>

<style>

  .viewer {

    display:flex; justify-content:center; align-items:center;

    height:100vh; background:#111;

  }

  img { max-width:100%; max-height:100%; object-fit:contain; }

</style>

# 5. 배포와 모니터링 – Edge에서 최적화 유지하기

  • Vercel 혹은 Netlify에 프로젝트를 푸시하면 자동으로 Edge 네트워크에 배포됩니다.

  • vercel.json에 regions 옵션을 지정해 사용자와 가장 가까운 엣지 로케이션을 선택하면 지연 시간이 30ms 이하로 떨어집니다.

  • Google Analytics와 Sentry를 연동해 페이지 전환 속도와 에러를 실시간 모니터링합니다.


# 결론 – 직접 만들어 보는 초고속 만화 뷰어

SvelteKit과 웹 스크래핑을 조합하면, 광고 없이 즉시 로드되는 만화 뷰어를 손쉽게 구현할 수 있습니다.

1️⃣ 프로젝트 초기 설정 → 2️⃣ 서버‑사이드 스크래핑 → 3️⃣ 프리로드·캐시 전략 → 4️⃣ 직관적인 UI → 5️⃣ 엣지 배포

위 흐름을 따라가면 초보자도 몇 시간 안에 나만의 만화 뷰어를 만들 수 있습니다.

지금 바로 코드를 복제하고, 자신만의 만화 컬렉션을 빠르게 즐겨보세요!

행동 유도: 이 글이 도움이 되었다면 GitHub에 포크하고, 댓글로 구현 중 겪은 어려움을 공유해주세요. 여러분의 피드백이 다음 개선에 큰 힘이 됩니다. 🚀

More from this blog

개발자 vs AI: 연말에 되돌아보는 내가 되고 싶은 개발자 유형은 무엇일까?

# 서론 – 연말, 개발자의 일상이 왜 달라지는가 12월이 되면 많은 개발자들은 데드라인이 느려지고, 팀 채팅은 조용해지며, 풀 리퀘스트(PR)는 한가해지는 것을 경험합니다. “올해는 정말 바빴다”는 감회와 함께, 동시에 “다음 해에는 어떤 개발자가 되고 싶을까?” 하는 고민이 자연스럽게 떠오릅니다. 특히 최근 AI 기술이 급격히 발전하면서, “AI가 내 일을 빼앗을까?” 라는 불안감과 “AI와 협업하면 내 역량을 어떻게 강화할 수 있을까?” ...

Dec 29, 20255 min read

인사이트 부채(Insight Debt)란? 초보 개발자를 위한 쉬운 이해와 해결 방법

# 서론 – 왜 우리는 “인사이트 부채”에 주목해야 할까? 소프트웨어 개발 현장에서 인사이트 부채(Insight Debt) 라는 용어를 들어본 적이 있나요? 프로젝트를 진행하면서 “이 부분은 나중에 다시 살펴볼게” 라는 생각을 자주 하게 됩니다. 하지만 이런 미뤄진 고민이 쌓이면 결국 코드 품질 저하, 버그 증가, 팀 커뮤니케이션 비용 등 다양한 문제를 야기합니다. 이번 포스트에서는 인사이트 부채가 정확히 무엇인지, 왜 발생하는지, 그리고 초보...

Dec 29, 20253 min read

블록체인 활용: 일상 속 5가지 실생활 적용 사례와 시작 가이드

# 서론 – “블록체인, 우리 생활에 뭐가 바뀔까?” 최근 뉴스와 SNS에서 블록체인이라는 단어를 자주 보지만, 실제로 우리 주변에 어떻게 적용되고 있는지는 잘 모르는 경우가 많습니다. “복잡하고 비싸다”는 인식이 남아 있지만, 최근는 블록체인 활용이 점점 쉬워지고 비용도 낮아져 일반인도 직접 체험할 수 있는 시대가 왔습니다. 이번 글에서는 블록체인 적용 사례 5가지를 중심으로, 초보자도 바로 이해하고 시작할 수 있는 방법을 알려드립니다. #...

Dec 29, 20254 min read

스크래핑 온 더 엣지: SvelteKit으로 만든 초고속 만화 뷰어 만들기 (50자)

# 서론 – “만화 읽기가 이렇게 불편할 수 있을까?” 우리 모두가 한 번쯤 겪어본 일입니다. 만화를 읽고 싶을 땐 원하는 사이트가 로딩이 오래 걸리거나, 페이지를 넘길 때마다 광고가 끊임없이 뜨고, 이미지가 깨져서 눈이 피로해지는 경우가 있죠. 이런 불편함을 그냥 견뎌야 할까요? 개발자라면 “코드로 해결할 수 있지 않을까?” 하는 생각이 떠오릅니다. 이번 포스트에서는 SvelteKit과 웹 스크래핑을 활용해, 초고속 만화 뷰어를 직접 만드는 ...

Dec 29, 20254 min read

Tim van der Lippe가 Mockito 유지보수자를 떠나다 – Java 테스트 생태계에 미치는 영향은?

SEO 키워드: Mockito, Java 단위 테스트, 테스트 자동화 # 서론 – “왜 이 소식이 중요한가?” 최근 Reddit의 r/programming 커뮤니티에 올라온 글에서 Tim van der Lippe가 오랜 기간 담당해 온 Mockito 프로젝트의 유지보수자를 물러난다는 소식이 전해졌습니다. Mockito는 Java 개발자 사이에서 가장 널리 쓰이는 테스트 자동화 라이브러리 중 하나이며, 수많은 오픈소스 프로젝트와 기업 서비스의 ...

Dec 29, 20253 min read2
H

HA JIN-YOUNG's blog

967 posts