ACDA (App Content Delivery API)
최종 수정: 2026년 6월 22일
ACDA(App Content Delivery API)는 제품에 가입한 회원, 곧 ServiceUser에게 발행된 Content와 Media를 전달하는 읽기 전용 API입니다. Space를 운영하는 쪽이 콘텐츠를 발행해 두면, 회원은 ACDA로 그 발행 자료를 읽어 갑니다. CDA가 공개 방문자에게 발행 콘텐츠를 전달하는 것과 같은 역할을, 회원 신원으로 수행하는 ServiceUser 버전이라고 보면 됩니다. ACDA에는 조회(GET) 엔드포인트만 있으며 생성·수정·삭제는 ACMA 소관입니다.
ACDA 호출에는 ServiceLogin이 발급한 Bearer 토큰을 씁니다. 이 토큰은 ACMA와 ACDA에서만 유효하며 CMA·CDA에는 쓸 수 없습니다(토큰 발급 흐름은 Auth API 참조).
CDA와 다른 점
ACDA의 응답 형태는 CDA와 같습니다. 발행된 자료의 스냅샷만 전달하고(sys에 version·status·publish 없이 공개 시점 버전인 revision만 담음), 조회 때 locale로 받을 언어를 정합니다. CDA와 다른 점은 읽기 범위와 신원 하나입니다.
- 회원별 읽기 범위: CDA는 하나의 DeliveryAccessToken으로 호출하는 누구나 같은 발행 집합을 봅니다. ACDA는 호출한 ServiceUser에게 허용된 것만 돌려주며, 무엇이 허용되는지는 그 회원의 ServiceUserRole과 배정에 따라 정해집니다. 신원도 다릅니다. CDA는 DeliveryAccessToken으로, ACDA는 ServiceLogin이 발급한 회원 토큰으로 호출합니다.
locale 쿼리 파라미터로 어떤 언어로 받을지 정하는 방식도 CDA와 같습니다. locale=ko-KR처럼 코드를 주면 fields를 그 로케일의 값 하나로 돌려주고(없고 Fallback도 닿지 않으면 비거나 null), 생략하면 Space의 기본 Locale로 같은 방식으로 돌려주며, locale=*로 주면 모든 로케일 값을 담은 맵을 그대로 돌려줍니다. 한 언어로 받는 앞 두 경우에는 실제로 쓴 로케일을 알려 주는 x-weegloo-locale 헤더가 실립니다(locale=*일 때는 실리지 않습니다).
리소스 구조
다음은 데모 Space의 "상품" Content 하나를 ACDA가 전달하는 형태입니다. locale=ko-KR로 조회한 결과이며, fields의 각 값이 ko-KR의 값 하나로 들어 있습니다.
{
"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:35:11.210Z",
"revision": 3
},
"fields": {
"productName": "스테인리스 텀블러 500ml",
"price": 18000,
"description": "이중 진공 단열로 보온·보냉이 오래갑니다. 500ml 대용량."
}
}주요 키:
sys.id: Content의 고유 식별자입니다. 단일 조회 경로의{contentId}에 들어갑니다.sys.type: 리소스 종류로, Content는 항상"Content"입니다.sys.space: 이 Content가 속한 Space를 가리키는 참조입니다.sys.contentType: 이 Content가 따르는 Content Type을 가리키는 참조입니다.sys.revision: 공개된 시점의 버전입니다. 발행할 때마다 그 시점의 버전이 여기 담깁니다. ACDA는 관리용version·status·publish를 담지 않으므로, 발행 버전을 가리키는 값은revision하나입니다.sys.createdBy·sys.updatedBy: Content Type의publishWithAuthor가 켜졌을 때만 포함되어 작성자·수정자를 가리킵니다. 위 예시는 이 옵션이 꺼져 있어 두 키가 생략되었습니다.fields: 각 필드의 값을{ apiName: value }형태로 담습니다. CMA·ACMA의 로케일 맵({ apiName: { locale: value } })과 달리, ACDA는 조회한locale의 값 하나만 담습니다. 위 예시에서 대표 사진photo는 해당 로케일에 값이 없어 생략되었습니다.
Media도 같은 발행 전달형으로 돌아오며, sys에 revision만 담고 version·status·publish는 담지 않습니다. Media는 작성자 정보(createdBy·updatedBy)를 항상 생략합니다. Media의 fields.file도 조회한 로케일의 단일 객체로 돌아옵니다.
API
세 엔드포인트 모두 조회(GET)이며, locale 쿼리 파라미터로 받을 언어를 정합니다(코드면 그 로케일, 생략하면 기본 Locale, *이면 전체 맵 — 위 참조).
관련 문서
- ACMA: 회원이 자기 콘텐츠를 만들고 고치는 관리 API.
- Auth API: ACDA 호출 토큰 발급.
- ServiceUser 로그인 (개념): ServiceLogin·ServiceUserRole·배정 설정.
