Skip to main content

Command Palette

Search for a command to run...

SvelteKit으로 만든 초고속 만화 뷰어: 웹 스크래핑부터 배포까지 완전 가이드

Published
•4 min read•View as Markdown

# 서론 – “만화 읽을 때마다 느끼는 불편함”

온라인에서 만화를 감상할 때, 페이지 전환이 느리거나 광고가 끊임없이 나타나는 경험, 한 번쯤은 해보셨을 겁니다. 특히 모바일 환경에서는 로딩 시간 하나가 독서 흐름을 깨뜨리는 큰 요인이 되죠. 이런 일상적인 불편을 해결하고 싶어 “코드로 내 손에 맞는 만화 뷰어를 만들 수 있지 않을까?” 하는 생각이 떠오릅니다.

이번 포스트에서는 SvelteKit을 활용해 초고속 만화 뷰어를 직접 구현하는 과정을 단계별로 풀어보겠습니다. 웹 스크래핑, 이미지 최적화, 배포까지 초보자도 따라 할 수 있도록 상세히 설명합니다.

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


# 1️⃣ 프로젝트 개요와 목표

| 목표 | 내용 |

|------|------|

| 빠른 로딩 | 이미지 프리로드와 CDN 캐시 활용 |

| 광고 차단 | 불필요한 스크립트와 요소를 제거 |

| 반응형 UI | 모바일·데스크톱 모두 최적화 |

| 쉽게 확장 | 새로운 만화 사이트 추가 시 최소 수정 |

프로젝트는 크게 세 부분으로 나뉩니다.

  1. 프론트엔드 – SvelteKit으로 UI와 라우팅 구현

  2. 백엔드(Edge Function) – 웹 스크래핑을 통해 원본 이미지 URL을 추출

  3. 배포 – Vercel·Netlify 등 서버리스 플랫폼에 배포


# 2️⃣ SvelteKit 기본 설정 (초보자도 OK)

  1. 프로젝트 생성
bash

npm init svelte@next manga-reader

cd manga-reader

npm install
  1. 파일 구조

src/

 ├─ routes/

 │   └─ +page.svelte   # 메인 뷰 페이지

 └─ lib/

     └─ api/

         └─ fetchManga.ts   # Edge Function 호출 함수
  1. 라우팅 – src/routes/+page.svelte에 간단한 입력 폼을 만든 뒤, 사용자가 입력한 만화 URL을 fetchManga 함수에 전달합니다.
svelte

<script lang='ts'>

  import { fetchManga } from '$lib/api/fetchManga';

  let mangaUrl = '';

  let images: string[] = [];

  async function loadManga() {

    images = await fetchManga(mangaUrl);

  }

</script>

<input bind:value={mangaUrl} placeholder='만화 페이지 URL 입력' />

<button on:click={loadManga}>읽기</button>

{#if images.length}

  <div class='gallery'>

    {#each images as src}

      <img src={src} loading='lazy' />

    {/each}

  </div>

{/if}

SvelteKit은 SSR(Server‑Side Rendering)과 CSR(Client‑Side Rendering)를 자동으로 최적화해 주기 때문에 별도 설정 없이도 빠른 초기 로딩을 경험할 수 있습니다.


# 3️⃣ 웹 스크래핑 구현 – Edge Function에서 이미지 URL 추출

# 3.1 왜 Edge Function인가?

  • 지연 시간 최소화: 사용자와 가장 가까운 엣지 서버에서 실행 → API 호출 횟수 감소

  • 서버 비용 절감: 사용량 기반 과금, 무한히 확장 가능

# 3.2 구현 코드 (Node.js + Cheerio)

src/lib/api/fetchManga.ts

ts

import { json } from '@sveltejs/kit';

import cheerio from 'cheerio';

export async function GET({ url }) {

  const target = url.searchParams.get('url');

  const res = await fetch(target);

  const html = await res.text();

  const $ = cheerio.load(html);

  // 사이트마다 다르지만 보통 이미지가 <img class='page'> 형태

  const imgUrls = $('img.page')

    .map((_, el) => $(el).attr('src'))

    .get()

    .filter(Boolean);

  return json({ images: imgUrls });

}

위 코드는 Vercel Edge Functions 혹은 Netlify Functions에 그대로 배포할 수 있습니다.

# 3.3 CORS와 보안

  • fetch 시 mode: 'no-cors' 대신 서버 측에서 직접 요청 → 브라우저 CORS 문제 회피

  • 외부 도메인에 대한 무분별한 요청을 방지하기 위해 허용 도메인 화이트리스트를 설정합니다.


# 4️⃣ 이미지 최적화와 캐시 전략

  1. 이미지 포맷 변환 – sharp 라이브러리로 WebP 변환 후 반환 (Edge Function 안에서 처리 가능)

  2. CDN 캐시 – Vercel/Netlify가 제공하는 자동 캐시 헤더(Cache-Control: public, max-age=31536000) 활용

  3. Lazy Loading – <img loading='lazy'> 속성으로 화면에 보일 때만 로드

팁: 이미지가 많을 경우 IntersectionObserver를 직접 구현하면 더욱 세밀한 로딩 제어가 가능합니다.


# 5️⃣ 배포와 성능 테스트

| 단계 | 작업 내용 |

|------|-----------|

| 빌드 | npm run build (SvelteKit이 정적 파일과 서버less 함수 생성) |

| 배포 | Vercel CLI vercel --prod 혹은 Netlify UI에 연결 |

| 테스트 | Lighthouse(Chrome DevTools)로 Performance 점수 90점 이상 목표 |

| 모니터링 | Vercel Analytics → 페이지 뷰, 응답 시간 확인 |

배포 후 실제 모바일 기기에서 네트워크·CPU throttling을 적용해 테스트하면, 페이지 최초 로딩이 1~2초 내에 완료되는 것을 확인할 수 있습니다.


# 결론 – 직접 만들고 공유해 보세요!

SvelteKit과 Edge Function을 조합하면, 복잡한 서버 구축 없이도 초고속 만화 뷰어를 손쉽게 구현할 수 있습니다. 웹 스크래핑을 통해 원하는 콘텐츠를 직접 가져오고, 이미지 최적화와 CDN 캐시로 사용자 경험을 크게 향상시킬 수 있죠.

지금 바로 위 과정을 따라해 보시고, 자신만의 커스텀 만화 뷰어를 만들면서 프론트엔드·백엔드 통합 개발 역량을 한 단계 끌어올려 보세요.

행동 유도: 프로젝트를 직접 깃허브에 올리고, 블로그에 사용 후기와 개선 아이디어를 공유해 주세요! 여러분의 피드백이 다음 업데이트를 만드는 원동력이 됩니다. 🚀

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