기존 Astro 프로젝트에 EmDash 추가하기

이 페이지

이 가이드는 Astro 프로젝트에 EmDash를 추가하고 하나의 게시된 항목으로 통합을 검증합니다. Node.js 어댑터, SQLite, 로컬 미디어 스토리지를 사용하여 전체 경로가 한 대의 머신에서 작동합니다.

시작하기 전에

Astro 6 이상과 Node.js 22.16 이상을 사용하세요. 프로젝트에서 두 버전을 확인합니다:

node --version
npx astro --version

이 가이드는 사이트를 Astro의 server 출력으로 변경하고 Node.js 어댑터를 구성합니다. 이로 인해 사이트의 빌드와 배포 방식이 변경됩니다. 프로젝트가 이미 다른 서버 어댑터를 사용하는 경우, 두 번째를 추가하지 마세요. 해당 어댑터를 유지하고 배포 요구사항을 따르세요. Cloudflare의 경우 Cloudflare Workers 가이드를 사용하세요.

구성을 변경하기 전에 현재 프로젝트를 커밋하거나 다른 방법으로 저장하세요.

EmDash 설치

  1. EmDash, Node.js 어댑터, React 지원을 설치합니다:

    npm

    npm install emdash @astrojs/node @astrojs/react react react-dom

    pnpm

    pnpm add emdash @astrojs/node @astrojs/react react react-dom

    yarn

    yarn add emdash @astrojs/node @astrojs/react react react-dom

    EmDash는 공개 사이트에 React 컴포넌트가 없더라도 관리자 패널에 React를 사용합니다.

  2. astro.config.mjs에서 어댑터, React, EmDash를 등록합니다. 파일에 이미 다른 통합이나 설정이 있는 경우 유지하고 이 예제에서 관련 항목을 추가하세요:

    import node from "@astrojs/node";
    import react from "@astrojs/react";
    import { defineConfig } from "astro/config";
    import emdash, { local } from "emdash/astro";
    import { sqlite } from "emdash/db";
    
    export default defineConfig({
        output: "server",
        adapter: node({ mode: "standalone" }),
        integrations: [
            react(),
            emdash({
                database: sqlite({ url: "file:./data.db" }),
                storage: local({
                    directory: "./uploads",
                    baseUrl: "/_emdash/api/media/file",
                }),
            }),
        ],
    });

    SQLite는 콘텐츠와 콘텐츠 모델을 data.db에 저장합니다. 로컬 스토리지 어댑터는 미디어를 uploads/에 쓰고 EmDash의 미디어 라우트를 통해 제공합니다. 아직 제외되지 않은 경우 두 경로를 .gitignore에 추가하세요.

  3. src/live.config.ts를 생성하여 EmDash를 Astro의 콘텐츠 시스템에 연결합니다:

    import { defineLiveCollection } from "astro:content";
    import { emdashLoader } from "emdash/runtime";
    
    export const collections = {
        _emdash: defineLiveCollection({ loader: emdashLoader() }),
    };

    프로젝트에 이미 src/live.config.ts가 있는 경우, 파일을 교체하는 대신 내보낸 collections 객체에 _emdash 항목을 추가하세요. 파일 기반 컬렉션을 위한 별도의 src/content.config.ts는 함께 계속 작동합니다.

  4. 로컬 암호화 키를 생성하고 .env에 작성합니다:

    npx emdash secrets generate --write .env

    .env.gitignore에서 제외되어 있는지 확인하세요. 키는 데이터베이스에 저장된 플러그인 시크릿을 보호합니다. 키를 교체하거나 잃으면 암호화된 값을 읽을 수 없게 되므로, 사이트를 배포하기 전에 보호된 백업을 유지하세요.

사이트와 콘텐츠 설정

  1. 개발 서버를 시작합니다:

    npm run dev
  2. http://localhost:4321/_emdash/admin/을 엽니다. 첫 방문 시 설정 마법사로 리디렉션됩니다. 사이트 세부 정보를 입력하고, 관리자 계정을 만들고, 패스키를 등록합니다.

    이 프로젝트에는 시드 파일이 없으므로, 설정은 EmDash의 내장 시작 모델을 적용합니다. Posts와 Pages 컬렉션, 제목과 콘텐츠 필드, 카테고리와 태그 택소노미를 생성합니다. 샘플 항목은 추가하지 않습니다.

  3. Posts를 열고 New Post를 선택하고 제목으로 EmDash is connected를 입력합니다. Save를 선택하여 항목을 생성한 다음 Publish를 선택합니다.

데이터베이스에는 이제 내장 posts 컬렉션에 하나의 게시된 항목이 포함되어 있습니다. 다음 단계에서는 Astro 페이지에서 이를 읽습니다.

항목 쿼리하기

게시된 포스트를 나열하는 서버 렌더링 테스트 페이지를 생성합니다:

---
import { getEmDashCollection } from "emdash";

const { entries: posts, error } = await getEmDashCollection("posts");

if (error) {
	throw error;
}
---

<h1>EmDash posts</h1>
<ul>
	{posts.map((post) => <li>{post.data.title}</li>)}
</ul>

http://localhost:4321/emdash-test/를 엽니다. 페이지에 EmDash is connected가 표시됩니다. 관리자 패널에서 제목을 변경하고 다시 게시하면, 이 페이지를 새로고침할 때 업데이트된 제목이 표시됩니다.

로컬 개발 중 EmDash는 현재 콘텐츠 모델에서 emdash-env.d.ts도 생성합니다. 생성된 선언은 TypeScript에 posts 컬렉션 이름과 title 필드를 제공합니다. 생성된 파일을 수동으로 편집하지 마세요.

검증이 실패하는 경우

  • 관리자가 **Loading EmDash…**에서 멈춘 경우, Astro integrations 배열에 react()가 포함되어 있는지 확인하세요. @astrojs/react를 설치하기만 하고 등록하지 않으면 충분하지 않습니다.
  • getEmDashCollection()이 라이브 컬렉션에 대한 오류를 반환하는 경우, src/live.config.tsemdashLoader()_emdash를 내보내는지 확인하세요.
  • 개발에서는 페이지가 작동하지만 배포된 편집이 표시되지 않는 경우, 페이지가 프리렌더링되지 않았는지, 배포된 애플리케이션이 서버 출력을 사용하는지 확인하세요.
  • 빌드가 임포트 중 하나를 해석할 수 없는 경우, 설치 명령어를 다시 실행하고 다섯 개의 패키지가 다른 워크스페이스 디렉토리가 아닌 이 프로젝트에 추가되었는지 확인하세요.

다른 데이터베이스, 스토리지 어댑터, 인증 옵션에 대해서는 구성을 참조하세요. 콘텐츠 쿼리 가이드에서 필터, 페이지네이션, 미리보기, 캐시 힌트를 다룹니다.