Content
최종 수정: 2026년 7월 3일
CDA(Content Delivery API)는 발행된 리소스를 공개 방문자에게 전달하는 읽기 전용 API입니다. 이 페이지는 발행된 Content, 곧 Content Type이라는 틀을 따라 만들어진 실제 데이터 한 건 한 건을 조회하는 방법을 다룹니다. CDA는 발행된 시점의 스냅샷을 전달하므로, 콘텐츠 스튜디오에서 아직 발행하지 않은 작업본은 여기에 나타나지 않습니다.
CDA에는 조회(GET) 엔드포인트만 있고, Content를 만들거나 고치고 발행하는 작업은 CMA Content가 담당합니다. 인증과 발행 전달 모델(발행 스냅샷·revision·발행된 것만 보임·작성자 노출은 publishWithAuthor 종속) 등 CDA 공통 동작은 CDA 개요를 참조하세요. locale로 받을 언어를 정하는 방법은 아래 locale와 fields에서 다룹니다.
리소스 구조
다음은 데모 Space의 발행 Content 한 건("스테인리스 텀블러 500ml" 상품)을 CDA가 locale=ko-KR로 단일 조회해 전달하는 형태입니다. sys(시스템 속성)와 함께, 이 Content가 따르는 Content Type의 필드 값이 담긴 fields를 가집니다.
{
"sys": {
"id": "3trmXRM3RqbgSnifyg7OGhwhlqvAvq",
"type": "Content",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA", "type": "Refer", "targetType": "ContentType" } },
"createdAt": "2026-06-15T15:16:12.151Z",
"updatedAt": "2026-06-16T14:31:20.073Z",
"revision": 3
},
"fields": {
"price": 18000,
"description": "이중 진공 단열로 보온·보냉이 오래갑니다. 500ml 대용량.",
"photo": null,
"productName": "스테인리스 텀블러 500ml"
}
}주요 키:
sys.id: Content의 고유 식별자입니다. 단일 조회 경로의{contentId}에 들어갑니다.sys.contentType: 이 Content가 따르는 Content Type(틀)을 가리키는Refer입니다.sys.id가 그 Content Type의 식별자이며, 어떤 필드를 갖는지는 CDA Content Type에서 읽을 수 있습니다.sys.revision: 공개된 시점의 버전입니다. CDA는 관리용version을 담지 않으므로, 발행 버전을 가리키는 값은revision하나입니다.fields: Content Type의 각 필드apiName을 키로 갖는 객체입니다. 값은 요청한locale의 값 하나입니다(로케일 맵이 아닙니다). 위 예시의photo는 연결된 Media가 없어null입니다.
시스템 속성 (sys)
발행 Content의 sys는 발행 스냅샷용 속성만 담습니다. space·contentType·createdBy·updatedBy는 Refer 모양({ "sys": { "id", "type": "Refer", "targetType" } })으로 들어갑니다.
| 속성 | 타입 | 설명 |
|---|---|---|
id | string | 리소스 고유 식별자. |
type | string | 리소스 종류. Content는 항상 "Content". |
space | Refer<Space> | 이 Content가 속한 Space. |
contentType | Refer<ContentType> | 이 Content가 따르는 Content Type(틀). |
createdAt | string (date-time) | 생성 시각. |
updatedAt | string (date-time) | 마지막 수정 시각. |
revision | integer | 공개된 시점의 버전. 발행할 때마다 그 시점의 버전이 여기 담깁니다. |
createdBy | Refer<User> | 생성한 사용자. 이 Content가 따르는 Content Type의 publishWithAuthor가 켜졌을 때만 포함됩니다. |
updatedBy | Refer<User> | 마지막으로 수정한 사용자. publishWithAuthor가 켜졌을 때만 포함됩니다. |
발행 스냅샷이므로 CMA의 sys에 있는 version·status·publish·archive는 담기지 않습니다. 발행 버전을 가리키는 값은 revision 하나뿐입니다.
locale와 fields
locale 쿼리 파라미터로 어떤 언어로 받을지 정합니다. 세 가지로 동작합니다.
locale=ko-KR처럼 코드를 주면,fields를 그 로케일의 값 하나로 돌려줍니다. CMA가fields.productName.ko-KR처럼 로케일별 값을 모두 담은 맵을 돌려주는 것과 달리, CDA는 요청한 로케일 하나의 값을 골라fields.productName에 바로 넣어 줍니다. 값이 없고 Fallback도 닿지 않으면 그 필드는null입니다(위 리소스 구조의photo가null인 것은 연결된 Media가 없기 때문입니다).locale을 생략하면 Space의 기본 Locale로 같은 방식으로 돌려줍니다.locale=*로 주면 한 언어로 고르지 않고, CMA처럼 로케일별 값을 모두 담은 맵(fields.productName.ko-KR)을 그대로 돌려줍니다.
코드나 생략으로 한 언어를 받을 때는 응답에 실제로 쓴 로케일을 알려 주는 x-weegloo-locale 헤더가 실립니다(locale=*일 때는 실리지 않습니다). 로케일 값 선택과 Fallback 규칙은 다국어 (개념)에서 다룹니다.
API
아래 네 엔드포인트의 기준 URL은 https://cda.weegloo.com/v1이며, Authorization 헤더에 CDA를 인증하는 Bearer 토큰이 필요합니다. 네 엔드포인트 모두 locale 쿼리 파라미터를 받습니다(위 locale와 fields 참조). 앞의 두 엔드포인트는 Space의 모든 발행 Content를 대상으로 하고, 뒤의 두 엔드포인트는 특정 Content Type에 속한 Content만 대상으로 합니다.
앞의 두 엔드포인트(Space의 모든 발행 Content 목록)를 fields.*로 필터하거나 정렬할 때는 sys.contentType.sys.id={contentTypeId}로 Content Type을 함께 지정해야 합니다. contentType={contentTypeId} 형태로는 대신할 수 없습니다. 뒤의 두 엔드포인트는 Content Type이 경로에 명시되어 있어 따로 지정할 필요가 없습니다.
관련 문서
- CDA Content Type: 이 Content가 따르는 발행 틀.
- CDA Media: Content가 참조하는 발행 파일 자산.
- CMA Content: Content를 만들고 수정하는 관리 API.
- 다국어 (개념): locale·fallback 동작.
