Admin APIDM 자동화
잡 상세 조회
수집 진행 상태와 결과 엑셀 다운로드 링크를 조회합니다. 폴링에 사용합니다.
잡 상세 조회
잡 하나의 진행 상태와 결과 다운로드 링크를 조회합니다. 수집 API 호출 후 폴링하는 용도입니다.
HTTP 요청
GET /ai/admin/dm-automation/jobs/{jobId}
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
jobId | Long | 예 | 수집 API가 반환한 잡 번호 |
응답
성공 응답 — 진행 중
{
"status": 200,
"code": null,
"message": "조회 성공",
"data": {
"jobId": 42,
"jobType": "COLLECT",
"status": "RUNNING",
"requestedBy": "admin01",
"inputFileName": "계정목록.xlsx",
"resultFileName": null,
"downloadUrl": null,
"rowCount": null,
"errorCount": null,
"errorMessage": null,
"createdAt": "2026-07-23T14:02:11",
"completedAt": null
}
}성공 응답 — 완료
{
"status": 200,
"code": null,
"message": "조회 성공",
"data": {
"jobId": 42,
"jobType": "COLLECT",
"status": "COMPLETED",
"requestedBy": "admin01",
"inputFileName": "계정목록.xlsx",
"resultFileName": "dm_collect_result.xlsx",
"downloadUrl": "https://storage.googleapis.com/glowb-input/dm-automation/COLLECT/9f2c7b1e4a5d4c8e9b0a1f2e3d4c5b6a/result_dm_collect_result.xlsx",
"rowCount": 218,
"errorCount": 3,
"errorMessage": null,
"createdAt": "2026-07-23T14:02:11",
"completedAt": "2026-07-23T14:05:47"
}
}성공 응답 — 실패
{
"status": 200,
"code": null,
"message": "조회 성공",
"data": {
"jobId": 43,
"jobType": "COLLECT",
"status": "FAILED",
"requestedBy": "admin01",
"inputFileName": "계정목록.xlsx",
"resultFileName": null,
"downloadUrl": null,
"rowCount": null,
"errorCount": null,
"errorMessage": "ValueError: 처리할 Instagram 계정 URL이 없습니다.",
"createdAt": "2026-07-23T14:10:02",
"completedAt": "2026-07-23T16:22:41"
}
}응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
jobId | Long | 잡 번호 |
jobType | String | COLLECT / GENERATE_MESSAGE |
status | String | QUEUED / RUNNING / COMPLETED / FAILED |
requestedBy | String | 요청한 관리자 ID |
inputFileName | String | 업로드한 원본 파일명 |
resultFileName | String | 결과 파일명. COMPLETED가 아니면 null |
downloadUrl | String | 결과 엑셀 공개 URL. COMPLETED가 아니면 null |
rowCount | Integer | 처리 행 수. COMPLETED가 아니면 null |
errorCount | Integer | 실패 행 수. COMPLETED가 아니면 null |
errorMessage | String | 실패 사유. 파이썬 워커의 예외 메시지("ValueError: ..." 형태) 또는 등록 단계 에러가 담김 (2000자 절단) |
createdAt | LocalDateTime | 잡 생성 시각 |
completedAt | LocalDateTime | 종료 시각. 진행 중이면 null |
rowCount와 errorCount는 파이썬이 해당 응답 헤더를 주지 않으면 COMPLETED 상태에서도 null일 수 있습니다.
"보고되지 않음"과 "0건"을 구분하기 위해 0으로 대체하지 않습니다.
폴링 예시
async function pollJob(jobId) {
while (true) {
const res = await fetch(`/ai/admin/dm-automation/jobs/${jobId}`, {
headers: { Authorization: `Bearer ${token}` },
});
const body = await res.json();
// HTTP 상태가 아니라 본문 status로 판별
if (body.status !== 200) throw new Error(body.message);
const job = body.data;
if (job.status === 'COMPLETED') return job;
if (job.status === 'FAILED') throw new Error(job.errorMessage);
await new Promise((r) => setTimeout(r, 30000));
}
}수집은 수 시간이 걸릴 수 있습니다 (수천수만 계정이면 2시간 이상). 짧은 간격으로 무한 폴링을 걸지 말고
넉넉한 간격(예: 30초1분)으로, UI는 실시간 대기보다 "진행 중 목록에서 나중에 확인"하는 흐름을 권장합니다.
파이썬 워커가 완료되면 콜백으로 잡 상태를 갱신하므로, 워커가 살아 있는 한 결국 COMPLETED / FAILED로 바뀝니다.
다만 워커가 재배포로 죽으면 그 잡은 콜백을 못 보내 RUNNING으로 남습니다 — 프론트에서 아주 오래된 RUNNING
(예: 하루 이상)은 사용자에게 재실행을 안내하는 편이 안전합니다.
에러 응답
HTTP 상태는 항상 200이며, 아래 코드는 응답 본문의 status 값입니다.
본문 status | code | 설명 |
|---|---|---|
404 | INVALID_DATA | 존재하지 않는 잡 번호 |
401 | - | 인증 실패 |
403 | - | ADMIN 권한 필요 |