콘텐츠 작업

이 페이지

EmDash 관리자를 사용해 항목을 첫 초안부터 게시된 페이지까지 진행하세요. 편집기는 초안 변경 사항을 방문자가 볼 수 있는 버전과 분리해 유지하므로, 저장과 게시는 서로 다른 두 동작입니다.

컬렉션 열기

사이트에서 /_emdash/admin을 열고 로그인하세요. 사이드바에서 Posts나 Pages 같은 컬렉션을 선택합니다.

컬렉션 페이지에는 해당 컬렉션의 항목이 나열됩니다. 여기에서 다음을 할 수 있습니다.

  • Add New를 선택해 항목 만들기
  • 항목 제목, 슬러그, 검색 가능으로 표시된 필드로 검색하기
  • 게시 상태, 작성자, 바이라인, 날짜, 로캘로 필터링하기
  • 항목 페이지 사이를 이동하고, 한 페이지에 20개, 50개, 100개 중 몇 개를 표시할지 선택하기
  • 항목을 선택해 일괄 게시, 초안으로 되돌리기, 휴지통으로 이동하기
  • Trash를 열어 항목을 복원하거나 영구 삭제하기

편집기에서 사용할 수 있는 필드와 게시 기능은 컬렉션의 콘텐츠 모델에 따라 달라집니다. 예를 들어 컬렉션은 리비전, 미리보기, 택소노미, 검색을 지원할 수 있습니다.

항목 만들기 및 게시

  1. 컬렉션 페이지에서 Add New를 선택합니다.

  2. 필수 필드를 입력합니다. 컬렉션에 제목 필드가 있으면 EmDash가 이를 사용해 슬러그를 제안합니다. 게시하기 전에 슬러그를 편집할 수 있습니다.

  3. 본문과 발췌문, 대표 이미지, 바이라인, 카테고리, 태그 같은 보조 필드를 추가합니다.

  4. Save를 선택합니다. 첫 저장은 항목을 초안으로 만들고 고정 편집기 URL을 엽니다.

  5. 초안을 검토합니다. 컬렉션이 미리보기를 지원하면 Preview를 선택해 게시하기 전에 렌더링된 페이지를 확인합니다.

  6. Publish now를 선택한 다음 확인합니다. 저장된 초안이 공개 콘텐츠 쿼리가 반환하는 라이브 버전이 됩니다.

항목에는 안정적인 콘텐츠 ID와 별도의 슬러그가 있습니다. 슬러그가 바뀌어도 ID는 계속 같은 항목을 식별합니다. 템플릿은 보통 getEmDashCollection()이 반환하는 URL용 식별자를 사용합니다. 콘텐츠 쿼리 가이드에서 두 값을 설명합니다.

서식 있는 텍스트 작성

Portable Text 필드는 제목, 단락, 인용, 목록, 링크, 이미지, 동영상, 갤러리, 코드 블록, 표, HTML 블록, 재사용 가능한 섹션을 위한 블록 편집기를 제공합니다. 설치된 플러그인이 블록을 더 추가할 수도 있습니다.

선택한 텍스트의 서식은 도구 모음으로 지정합니다. 블록을 삽입하려면 단락 옆의 블록 추가 컨트롤을 선택하거나 /를 입력하고 이름으로 블록을 검색하세요. 이미지 블록과 갤러리 블록은 이미지 필드와 같은 미디어 선택기를 엽니다.

이미지 및 동영상 파일을 편집기로 드래그하거나 복사한 이미지 또는 스크린샷을 붙여 넣을 수도 있습니다. 각 파일은 미디어 라이브러리에 업로드되고 업로드가 끝나면 주변 블록 사이에 나타납니다. 업로드가 실패하면 파일이 들어갈 자리에 그 이유가 표시됩니다.

이미지 블록을 선택하면 위에 도구 모음이 나타납니다. 이를 사용해 이미지를 교체하고, 대체 텍스트를 편집하고, 정렬하고, 링크를 추가하거나, 블록을 삭제할 수 있습니다. 이미지에 설명이 있으면 Alt text 버튼이 강조 표시되며, 마우스를 올리면 설명이 표시됩니다. 미디어 라이브러리 이미지의 파일 이름뿐인 대체 텍스트는 설명으로 인정되지 않습니다. 이미지 아래 필드에 캡션을 입력하고 Enter를 누르면 그 아래에서 계속 작성할 수 있습니다. 선택한 이미지에서 Tab을 누르면 캡션으로, 그다음 도구 모음으로 이동합니다.

도구 모음의 Image settings는 표시 크기와 선택 사항인 툴팁을 포함해 해당 이미지 사용에 대한 모든 설정을 엽니다. 그곳의 Edit asset은 기반이 되는 미디어 라이브러리 항목을 엽니다. 에셋을 변경하거나 교체하면 이를 사용하는 다른 항목에도 영향을 줄 수 있습니다. 이 차이에 대해서는 미디어 라이브러리를 참조하세요.

동영상 추가

/video를 입력해 동영상 블록을 추가한 다음, 미디어 라이브러리에서 동영상을 고르거나 열린 선택기에서 동영상을 업로드하세요. 선택기를 닫아도 빈 동영상 블록은 놓은 자리에 그대로 남아 있으므로 나중에 채울 수 있습니다. 블록을 클릭하거나, 선택한 상태에서 Enter를 누르거나, 동영상 파일을 블록 위에 놓으면 됩니다. 빈 동영상 블록은 사이트에 아무것도 표시하지 않습니다. 동영상 파일을 텍스트의 아무 곳에나 놓을 수도 있습니다.

동영상은 사이트에서 보이는 것과 같은 방식으로, 텍스트 너비에 맞춰 편집기에서 재생됩니다. 동영상 아래 필드에 캡션을 입력하고 Enter를 누르면 그 아래에서 계속 글을 쓸 수 있습니다.

동영상 위에 마우스를 올리거나 동영상을 선택하면 모서리에 Replace video와 Delete video가 표시됩니다. 선택한 동영상에서 Tab을 누르면 플레이어로 이동하며, 스페이스바로 재생할 수 있습니다. 이어서 캡션과 두 버튼으로 이동합니다. Escape를 누르면 블록으로 돌아갑니다.

업로드에는 미디어 라이브러리의 크기 제한인 maxUploadSize가 적용되며, 올리지 않는 한 50 MiB입니다.

HTML, CSS, JavaScript 추가

HTML 블록에는 임베드, 가입 양식, 작은 위젯처럼 다른 블록으로는 표현할 수 없는 코드를 넣습니다. 탭은 HTML, CSS, JS, Preview입니다. 각 코드 탭은 Tab 키로 들여쓰기가 되는 코드 편집기이며, 주변 텍스트로 돌아가려면 Escape 키를 누르세요. CSS 탭과 JS 탭은 선택 사항입니다. <style> 요소와 <script> 요소가 포함된 코드 조각 전체를 HTML 탭에 붙여넣을 수도 있습니다.

Preview는 사이트에서 렌더링되는 모습 그대로 블록을 보여 줍니다. 항목을 열 때 JavaScript를 실행하는 블록은 Run preview를 선택할 때까지 대기하므로, 잘못된 스크립트가 편집기를 멈추게 할 수 없습니다.

블록의 메뉴에서 사이트가 블록을 렌더링하는 방식을 설정합니다.

  • Isolated frame은 블록의 HTML, CSS, JavaScript를 콘텐츠에 맞게 커지는 샌드박스 프레임 안에서 실행합니다. 이 프레임은 사이트의 쿠키, 스토리지, 페이지를 읽을 수 없고, 사이트의 스타일도 적용되지 않습니다. 상대 링크는 사이트의 루트를 기준으로 해석됩니다. 방문자가 프레임 안을 클릭한 뒤에는 프레임이 방문자의 탭이나 새 탭에서 다른 페이지를 열 수 있습니다. 새 HTML 블록은 이 모드를 사용하지만, 다른 웹사이트나 브라우저 탭에서 붙여넣은 블록은 사용하지 않습니다. height: 100vh처럼 프레임의 뷰포트에 맞춰 콘텐츠 크기를 지정하지 마세요. 프레임이 콘텐츠에 맞게 커지면 콘텐츠가 다시 높아지고, 이 과정은 프레임이 20,000픽셀에 이를 때까지 반복됩니다.
  • Inline은 HTML을 페이지 안에 넣어 사이트의 스타일을 사용합니다. 사이트는 텍스트 서식, 링크, 목록, 표, 이미지, iframe을 유지하고, 스크립트, <style> 요소, style 속성, 미디어, 양식 컨트롤 같은 나머지 마크업은 제거합니다. YouTube와 Vimeo 이외 사이트의 iframe은 비워집니다. 인라인 블록에는 CSS 탭이나 JS 탭이 없습니다.

검색 엔진은 격리된 프레임 안의 텍스트를 페이지의 일부로 취급하지 않을 수 있습니다. 검색에 중요한 텍스트는 단락이나 인라인 블록에 넣으세요.

다른 사이트의 페이지 임베드

iframe 블록은 동영상, 지도, 양식처럼 다른 사이트의 페이지를 보여 줍니다. /iframe을 입력한 다음 해당 사이트의 임베드 코드나 링크를 Code 탭에 붙여넣으세요. YouTube와 Vimeo 링크는 각각의 플레이어가 되고, 그 밖의 https 링크는 있는 그대로 임베드됩니다. Preview는 임베드된 페이지를 보여 줍니다. 항목을 열 때 저장된 블록은 Load preview를 선택할 때까지 대기하므로, 요청하기 전에는 관리자가 다른 사이트의 페이지를 불러오지 않습니다. 다른 웹사이트나 브라우저 탭에서 붙여넣은 iframe 블록은 비어 있는 상태로 들어옵니다.

https 페이지만 임베드할 수 있으며, 블록은 임베드 코드에서 필요한 부분만 유지합니다. 주소, 제목, 크기, 전체 화면 지원, 그리고 플레이어가 사용하는 권한입니다. 일부 사이트는 다른 사이트의 페이지 안에 표시되는 것을 거부하며, 이 경우 미리보기가 비어 있거나 해당 사이트의 오류가 표시됩니다.

iframe 대신 스크립트를 실행하는 임베드 코드(예: 일부 소셜 미디어 게시물)는 HTML 블록에 넣어야 합니다.

초안 변경 사항 저장

첫 저장 이후에는 입력을 멈추고 2초 뒤에 편집기가 변경 사항을 자동 저장합니다. Save 버튼은 **Saving…**을 거쳐 Saved로 바뀌므로 서버가 초안을 받아들였는지 확인할 수 있습니다. 자동 저장은 멈출 때마다 체크포인트로 리비전 기록을 채우는 대신 현재의 자동 저장 리비전을 대체합니다.

편집 과정의 어느 시점을 리비전 기록에 남기고 싶다면 Save를 선택하세요. 저장에 실패하면 편집기는 저장되지 않은 필드를 그대로 유지하고 오류를 표시합니다. 버튼이 Saved로 돌아오거나 저장되지 않은 작업을 다른 곳에 복사하기 전에는 페이지를 떠나지 마세요.

게시된 항목에서는 변경 사항을 저장해도 초안만 업데이트됩니다. 방문자는 계속 이전 라이브 리비전을 받습니다. 대기 중인 버전은 Preview draft로, 공개 버전은 Live View로 확인하고, 초안이 그것을 대체할 준비가 되면 Publish changes를 사용하세요.

게시된 항목의 슬러그를 변경하는 것도 같은 초안 흐름을 따릅니다. 공개 URL은 초안을 게시할 때 바뀌며, 자동 저장이 실행될 때는 바뀌지 않습니다.

다른 편집자와 함께 작업

항목을 열면 해당 항목과 로캘에 대한 편집 잠금을 얻습니다. 다른 사람이 이미 열어 두었다면 EmDash가 잠금을 가진 사람을 알려 주고 두 가지 선택지를 제공합니다.

  • Open read-only는 편집을 받지 않고 항목을 표시하므로, 버려질 작업을 입력하는 일이 없습니다.
  • Take over는 잠금을 사용자에게 넘깁니다. 상대방은 입력한 내용을 유지하지만, 2분 이내에 상대방의 편집기에 사용자가 항목을 가지고 있다고 표시됩니다. 상대방의 다음 저장은 거부됩니다.

잠금은 항목이 열려 있는 동안 갱신되고, 편집기를 떠나거나 탭을 닫으면 해제됩니다. 브라우저나 컴퓨터가 잠금을 해제하지 않고 종료되면, 마지막 갱신으로부터 7분 후에 잠금이 만료됩니다.

잠금은 로캘마다 독립적이므로 두 사람이 같은 항목의 서로 다른 번역을 편집할 수 있습니다. 스크립트, API 클라이언트, MCP 클라이언트도 다른 편집자가 잠금을 가지고 있는 동안에는 문서화된 재정의를 사용하지 않는 한 거부됩니다. API의 전체 동작은 항목 편집 잠금을, MCP 도구는 콘텐츠 수명 주기와 바이라인을 참조하세요.

관리자는 Content Types, 해당 컬렉션, Edit locking 순서로 열어 컬렉션의 잠금을 끌 수 있습니다.

변경 사항 게시 또는 예약

게시와 예약은 별도의 컨트롤을 사용합니다.

  • Publish now는 확인 후 새 초안을 라이브로 만듭니다.
  • Publish changes는 확인 후 게시된 항목의 대기 중인 변경 사항을 라이브로 만듭니다.
  • Schedule은 새 항목 또는 대기 중인 변경 사항이 라이브가 되는 시점을 설정합니다.
  • Change schedule은 기존 예약을 업데이트합니다.
  • Remove schedule은 기존 예약을 취소합니다.
  • Unpublish는 공개 쿼리에서 라이브 리비전을 제거하고, 모든 예약을 취소하며, 편집 가능한 초안을 유지합니다.

항목을 예약하려면 먼저 저장하고, 게시 요약 아래의 Schedule을 선택한 다음 미래의 날짜와 시간을 고르세요. 편집기에는 예약에 사용되는 시간대가 표시됩니다. 그 시간까지는 현재 라이브 리비전이 공개 상태로 유지되며, 새 항목이라면 아직 공개되는 것이 없습니다.

Node.js 배포는 예약 게시 스윕을 자동으로 실행합니다. Cloudflare Workers에는 Cron Trigger가 필요합니다. Cloudflare 스타터 템플릿에는 포함되어 있으며, 기존 배포는 예약 게시를 따라 트리거를 확인할 수 있습니다.

게시 캘린더 검토

캘린더에는 모든 컬렉션에서 게시된 것과 예약된 것이 표시됩니다. Contributor 이상의 역할은 사이드바나 명령 팔레트에서 Calendar를 열 수 있습니다. 예약된 것이 있으면 대시보드의 Scheduled 개수도 캘린더로 연결됩니다.

캘린더에는 두 가지 보기가 있습니다.

  • Month는 날짜 그리드를 표시합니다. 게시된 항목은 일반 줄로, 예약된 항목은 카드로 나타납니다. 항목에 마우스를 올리거나 포커스를 두면 전체 제목, 상태, 시간, 컬렉션이 표시됩니다. 하루에 표시할 수 있는 것보다 항목이 많으면 +N more를 선택해 모두 나열합니다.
  • Agenda는 한 달을 날짜별로, 각 항목의 시간과 함께 나열합니다. 현재 달에서는 오늘 이전의 날짜가 접힌 상태로 시작하되, 기한이 지난 항목이 있는 날은 예외이며, 빨간 선이 현재를 나타냅니다.

휴대폰이나 다른 좁은 화면에서는 캘린더가 Agenda로 열리고, Month는 항목이 있는 날에 점이 표시된 날짜 선택기를 보여 줍니다. 날짜를 선택하면 그날의 항목이 나열됩니다.

항목을 선택하면 세부 정보가 측면 패널에 열리고, Ctrl(macOS에서는 Cmd)을 누른 채 클릭하면 새 탭의 편집기에서 열립니다. 패널에는 항목의 상태, 시간, 컬렉션, 로캘과 번역, 바이라인, 마지막 편집 시점이 표시됩니다. 패널에서 편집기로 항목을 열고, 예약된 변경 사항을 미리 보거나, 게시된 항목을 사이트에서 볼 수 있습니다. 항목을 게시할 수 있다면 (Author는 자기 항목, Editor 이상의 역할은 모든 항목), 다시 예약하고, 예약을 제거하고, 기한이 지난 항목을 즉시 게시할 수도 있습니다. 휴대폰에서는 패널이 화면 하단의 시트로 열립니다.

Filter를 사용해 컬렉션과 상태로, 다국어 사이트에서는 로캘로도 두 보기를 모두 좁힐 수 있습니다. 필터, 보기, 월, 열려 있는 항목은 페이지 URL에 유지되므로 북마크하거나 공유할 수 있습니다.

항목은 사이트의 시간대를 기준으로 날짜에 배치되며, 이 시간대는 월 옆에 표시됩니다. 브라우저가 다른 시간대를 사용하면 캘린더가 이를 알려 주며, 항목 시간은 사용자의 시간대로도 표시됩니다.

캘린더에는 다음이 표시됩니다.

  • 게시된 항목은 게시된 날짜에 표시됩니다.
  • 예약된 항목은 예약된 날짜에 표시됩니다.
  • 게시된 항목의 예약된 변경 사항은 예약된 날짜에 Update 표시와 함께 나타납니다. 변경 사항이 라이브가 되면 항목은 원래 게시 날짜에만 표시됩니다.

예약 시간을 2분 넘게 지난 예약에는 Overdue 표시가 붙습니다. 이는 보통 예약 게시 스윕이 실행되고 있지 않다는 뜻입니다. 변경 사항 게시 또는 예약을 참조하세요.

캘린더에는 예약이 없는 초안, 휴지통의 항목, 사이드바에서 숨겨진 컬렉션이 포함되지 않습니다. 대시보드의 Scheduled 개수는 모든 달을 대상으로 하고 숨겨진 컬렉션도 포함하므로, 캘린더가 한 달에 대해 보여 주는 것보다 많을 수 있습니다.

캘린더는 한 달에 최대 1,000개의 항목을 불러옵니다. 여기에는 그리드에 표시되는 인접한 달의 날짜도 포함됩니다. 그보다 많으면 불러온 항목이 어느 날짜에서 끝나는지 알려 주고 그 이후의 날짜를 불러오지 않은 것으로 표시합니다.

리비전 복원

리비전을 지원하는 컬렉션은 설정 패널에 Revisions를 표시합니다. 펼치면 저장된 버전과 그 사이에 변경된 필드를 볼 수 있습니다. 리비전을 선택해 내용을 확인한 다음, 그 버전을 다시 사용하려면 Restore를 선택하세요.

복원하면 선택한 내용이 담긴 새 리비전이 만들어집니다. 그 이전의 리비전은 지워지지 않으므로 복원한 뒤에도 전체 순서를 확인할 수 있습니다.

항목 번역

국제화가 활성화되어 있으면 Translations 패널에 현재 항목에 대해 구성된 로캘이 표시됩니다.

  1. 원본 항목을 열고 설정 패널에서 Translations를 찾습니다.

  2. 아직 항목이 없는 로캘에 대해 Translate를 선택합니다.

  3. 복사된 제목, 슬러그, 본문 및 기타 번역 가능한 필드를 편집합니다.

  4. Save를 선택하고, 준비가 되면 번역을 게시하거나 예약합니다.

각 번역에는 고유한 슬러그, 게시 상태, 예약, 리비전 기록이 있습니다. 컬렉션 페이지의 로캘 선택기를 사용해 한 번에 한 언어씩 볼 수 있습니다.

콘텐츠를 휴지통으로 이동

항목의 작업을 열거나 컬렉션 페이지에서 하나 이상의 행을 선택한 다음 Move to Trash를 선택하세요. 휴지통으로 이동한 항목은 일반 콘텐츠 쿼리에 나타나지 않지만 컬렉션의 Trash 탭에서는 계속 사용할 수 있습니다.

Trash에서 Restore를 선택하면 항목이 컬렉션으로 돌아갑니다. 복원된 항목은 예약이 없는 초안으로 돌아옵니다. 공개하려면 게시하세요.

콘텐츠 작업 자동화

REST API와 EmDash CLI는 같은 초안 및 게시 워크플로를 지원합니다. 컬렉션 필드는 요청의 data 객체 안에 넣습니다. 업데이트는 초안 리비전을 저장하며, 게시는 별도의 동작입니다. 서버가 최신 작업을 덮어쓰는 대신 오래된 쓰기를 거부하도록, 업데이트하거나 게시할 때 최신 _rev 값을 전달하세요.

상태 전환, 권한, 충돌, 훅은 콘텐츠 수명 주기 레퍼런스를 참조하세요. REST API 레퍼런스는 요청과 응답 본문을 정의하고, CLI 레퍼런스는 이에 해당하는 터미널 명령을 다룹니다.

게시된 항목을 Astro 사이트에서 렌더링하려면 콘텐츠 쿼리로, 재사용 가능한 파일을 추가하고 관리하려면 미디어 라이브러리로 이어서 진행하세요.