DataOps 서버가 구현할 API 3개
목록 · 매니페스트 · 파일 엔드포인트의 요청과 응답, 인증, 오류 형식, 인식하는 필드 별칭
플랫폼에 기준 URL 하나를 등록하면 플랫폼이 그 아래 세 경로를 호출. 예시의 기준 URL 은 https://data.example.com/api.
| # | 메서드 · 경로 | 용도 |
|---|---|---|
| 1 | GET {base}/datasets | 데이터셋 목록 + 갱신 시각 |
| 2 | GET {base}/datasets/{id}/manifest | 파일 목록 + SHA-256. 변경 판단의 유일한 근거 |
| 3 | GET {base}/datasets/{id}/files/{file_id} | 파일 본문(바이너리) |
경로 형식은 위 형식 고정. 대신 응답의 필드 이름은 제공 측 규칙을 따라도 무방. 플랫폼은 의미가 같은 여러 이름을 인식(아래 필드 별칭).
공통 규약
| 항목 | 요구 |
|---|---|
| 인증 | Authorization: Bearer <token> 헤더 하나. 토큰 없는 서버는 토큰 입력란을 비워 등록. 플랫폼은 이 토큰을 전송할 때 사용해야 하므로 원문으로 보관. DataOps 측은 플랫폼 전용 읽기 토큰 발급. |
| 전송 | HTTPS 권장. 플랫폼은 http:// · https:// 만 허용, 링크로컬(169.254.x.x) · 멀티캐스트 IP 주소는 거부. |
| 경로의 id | {id} · {file_id} 는 퍼센트 인코딩해 경로에 포함(/ 는 %2F). 영문 · 숫자 · - · _ · . 만 사용하면 인코딩 문제 없음. |
| 응답 형식 | 1 · 2번은 application/json(UTF-8) 객체, 3번은 바이너리 |
| 시각 | ISO 8601, 타임존 포함(예: 2026-07-21T09:30:00Z). 타임존이 없으면 UTC 로 해석. |
| 오류 | HTTP 상태 코드 + JSON 본문. 인증 실패 401, 없는 자원 404. 목록 · 매니페스트 호출의 오류는 본문 앞 200자를 화면 메시지에 그대로 표시(파일 호출은 상태 코드만). |
| 호출 빈도 | 사용자가 버튼을 누를 때만 호출(예약 동기화 없음) |
| 시간 제한 | 요청 한 번당 30초 안에 응답 시작 필요. 대용량 파일도 읽기 단위로 측정하므로 전송 시간이 길어도 무방. |
1. 데이터셋 목록
curl -H "Authorization: Bearer $TOKEN" \
"https://data.example.com/api/datasets?page=1&page_size=50&updated_after=2026-07-01T00:00:00Z"
{
"items": [
{
"id": "ds-inspect-2026w29",
"name": "라인 검사 이미지 2026-W29",
"modality": "image",
"file_count": 412,
"size_bytes": 1073741824,
"updated_at": "2026-07-21T09:30:00Z"
}
],
"page": 1,
"total": 3
}
| 필드 | 필수 | 설명 |
|---|---|---|
id | 필수 | 변하지 않는 고유 ID(256자 이하). 이름이 변경되어도 유지 필요. 플랫폼이 다시 동기화할 대상을 찾는 키. id 가 없는 항목이 하나라도 있으면 목록 전체가 오류. |
name | 권장 | 원격 데이터셋 선택 목록에 표시할 이름. 없으면 id 사용. |
modality | 권장 | image · pointcloud · timeseries · tabular. 화면에서 새 데이터셋 생성 시 기본 모달리티. |
file_count · size_bytes | 권장 | 선택 화면 표시용 |
updated_at | 권장 | 파일이 추가 · 변경 · 삭제될 때마다 갱신 필요. 선택 목록의 "갱신" 시각과 updated_after 조회의 기준. |
- 플랫폼은
page(1부터) 전송.page_size는 연결 확인(page=1&page_size=1)과, 플랫폼 API 호출자가 값을 지정할 때만 추가. 화면의 원격 데이터셋 목록은page만 전송. - 페이지를 나눠 반환하면
total반드시 포함. 화면은 불러온 항목 수가total보다 적을 때만 "더 불러오기" 로 다음page요청.total이 없으면 첫 응답의 항목 수를 전체 개수로 간주하므로 두 번째 페이지부터는 표시되지 않음. 나누지 않으면page·page_size를 무시하고 전체 반환 가능. updated_after가 지정되면 그 시각 이후 변경된 항목만 반환(권장). 화면은 이 값을 전송하지 않고, 스크립트가GET /api/v1/external-sources/{id}/remote-datasets?updated_after=…로 호출할 때만 UTC(…Z)로 전달.- 동기화는 목록을 호출하지 않음. 매니페스트와 파일 경로만 사용.
2. 매니페스트
curl -H "Authorization: Bearer $TOKEN" \
"https://data.example.com/api/datasets/ds-inspect-2026w29/manifest"
{
"dataset_id": "ds-inspect-2026w29",
"name": "라인 검사 이미지 2026-W29",
"modality": "image",
"updated_at": "2026-07-21T09:30:00Z",
"annotation_format": "coco",
"classes": [{ "id": 0, "name": "defect_a" }, { "id": 1, "name": "defect_b" }],
"files": [
{
"file_id": "f-0001",
"filename": "20260721_line3_0001.png",
"kind": "image",
"size_bytes": 2493833,
"sha256": "9f8a1c…",
"meta": { "line": "line-3", "measured_at": "2026-07-21T09:30:12+09:00" }
}
]
}
| 필드 | 필수 | 설명 |
|---|---|---|
name | 권장 | 새 데이터셋 생성 시 이름을 비우면 이 값 사용. 없으면 원격 id 를 이름으로 사용. 목록의 name 과 동일하게 지정. |
modality | 선택 | API 로 데이터셋을 만들며 모달리티를 생략하면 이 값 사용 |
updated_at | 권장 | 동기화 종료 후 외부 소스 카드의 "원격 갱신 시각" 으로 표시 |
files[].file_id | 필수 | 다운로드 경로에 사용하는 변하지 않는 파일 키. 같은 파일의 내용이 변경되어도 유지 필요(그래야 "변경" 으로 판정되어 같은 행이 교체됨). |
files[].filename | 필수 | 확장자를 포함한 파일 이름. 플랫폼은 확장자로 파일 종류 판정. 경로(a/b.png)는 제외하고 마지막 이름(b.png)만 사용. 따라서 다른 폴더의 같은 이름은 충돌하고, 뒤의 것은 건너뜀. |
files[].sha256 | 사실상 필수 | 본문의 SHA-256 (16진, 대소문자 무관). 없으면 그 파일은 매번 다시 내려받음. |
files[].size_bytes | 권장 | 진행률 표시용 |
files[].kind | 선택 | CSV · TSV · Parquet 파일에서만 사용. timeseries 나 tabular 이면 그 값대로 분류. 다른 파일의 종류는 확장자로 결정. |
files[].meta | 선택 | 파일별 메타. 플랫폼 파일의 meta.source 에 그대로 보관. |
annotation_format · classes | 선택 | 기록만 하고 해석하지 않음. 라벨은 내려받은 어노테이션 파일을 플랫폼 검증기가 직접 읽음. |
file_id 나 filename 이 없는 항목이 하나라도 있으면 매니페스트 전체를 읽지 못하고, 그 동기화는 실패.
3. 파일 본문
curl -H "Authorization: Bearer $TOKEN" -o 0001.png \
"https://data.example.com/api/datasets/ds-inspect-2026w29/files/f-0001"
- 파일 본문을 그대로 스트리밍.
Content-Type제한 없음. - 플랫폼이 리다이렉트를 따르므로, 본문 대신 presigned URL 로 302 반환 가능. 다른 호스트로 리다이렉트되면
Authorization헤더를 전송하지 않으므로, presigned URL 은 토큰 없이 다운로드 가능해야 함. - 이어받기(
Range)는 아직 미사용. 실패한 파일은 다음 동기화에서 전체를 다시 내려받음. - 파일 하나는 2 GiB 까지(서버 설정으로 변경 가능). 초과하는 파일은 내려받는 도중에 중단하고 경고로 기록.
오류 응답
// 401
{ "error": "invalid_token", "message": "토큰이 만료되었습니다." }
// 404
{ "error": "dataset_not_found", "message": "ds-xxxx 를 찾을 수 없습니다." }
// 429
{ "error": "rate_limited", "message": "잠시 후 다시 시도해 주십시오." }
플랫폼은 이 본문을 해석하지 않고 앞부분을 사용자에게 표시. 원인을 알 수 있는 한 문장 포함 필요.
플랫폼은 오류 응답을 재시도하지 않고 Retry-After 도 읽지 않음. 파일 호출이 실패하면 그 파일만 경고로 기록되고 다음 동기화에서 다시 내려받음. 매니페스트 호출이 실패하면 그 동기화 실패.
필드 별칭
응답 필드 이름은 아래 중 어느 것이든 사용 가능. 앞에 있는 이름부터 찾고, 비어 있지 않은 첫 값 사용.
| 뜻 | 인식하는 이름 |
|---|---|
| 목록 배열 | items · datasets · results · data |
| 총 개수 | total · count · total_count |
| 데이터셋 id | id · dataset_id · datasetId |
| 이름 | name · title |
| 모달리티 | modality · type |
| 파일 수 | file_count · fileCount · files |
| 크기 | size_bytes · sizeBytes · size |
| 갱신 시각 | updated_at · updatedAt · modified_at · last_modified (매니페스트는 updated_at · updatedAt) |
| 파일 배열 | files · items · entries |
| 파일 id | file_id · fileId · id |
| 파일 이름 | filename · name · path |
| 체크섬 | sha256 · checksum_sha256 · checksum · hash |
| 파일 종류 | kind · type |
| 클래스 표 | classes · categories · labels |
| 어노테이션 형식 | annotation_format · annotationFormat · label_format |
이 표에 없는 이름이 반드시 필요하면 플랫폼 팀에 별칭 추가 요청.
지원하는 파일 형식
| 종류 | 형식 |
|---|---|
| 이미지 | PNG · JPG · BMP · TIFF · WebP |
| 시계열 · 표 | CSV · TSV · Parquet (첫 행 헤더 필수) |
| 포인트클라우드 | PLY. 포인트별 정수 라벨 속성이 있으면 자동으로 찾아 클래스 집계 |
| 어노테이션 | COCO JSON · LabelMe JSON · VOC XML |
CSV · TSV · Parquet 는 확장자로 시계열과 표 구분 불가. 매니페스트의 파일별 kind 를 timeseries 나 tabular 로 지정하면 그 값을 따름. 지정하지 않으면 데이터셋 모달리티로 결정(tabular 면 표, 그 밖에는 시계열). 이때는 목록의 modality 를 tabular 로 지정하거나, 데이터셋 생성 시 모달리티 직접 선택 필요.
연동 확인 체크리스트 (제공 측)
플랫폼에 등록하기 전에 curl 로 세 경로를 직접 호출해 확인. 명령은 참조 구현의 "실행 예시" 와 동일. 플랫폼의 연결 확인 은 목록만 호출하므로, 매니페스트와 파일 경로는 여기서 확인.
| # | 확인 | 통과하지 못하면 |
|---|---|---|
| 1 | 토큰으로 목록이 200 인가 | 인증 방식부터 재확인 |
| 2 | 목록과 매니페스트의 모든 항목에 id · file_id · filename 이 있는가 | 목록이나 매니페스트 전체를 읽지 못함 |
| 3 | 페이지를 나눈다면 total 이 있는가 | 화면에 첫 페이지만 표시됨 |
| 4 | updated_after 가 동작하는가 | 증분 조회 없이 전체 조회만 사용 |
| 5 | 매니페스트의 sha256 이 내려받은 파일의 sha256sum 결과와 같은가 | 파일이 경고와 함께 탈락 |
| 6 | 내려받은 파일이 손상 없이 열리는가 | 전송 계층 확인 |
| 7 | 같은 데이터셋을 두 번 동기화하면 두 번째는 내려받은 파일이 0개인가 | 증분 동기화 불가(file_id 가 변경되는지 확인) |