Notion API 명세 DB의 현재 데이터를 기준으로 생성한 백엔드 API 경로 명세다. 경로는 YouthPick/back-end의 엔티티 설계 방향을 반영해 리소스 중심으로 정리했다. 사용자 식별은 JWT 인증 정보에서 얻는 전제이므로 사용자별 API 경로에 /me 또는 /users/{userId}를 붙이지 않는다.
백엔드 API를 추가하거나 수정할 때는 이 문서를 기준으로 컨트롤러 경로, HTTP 메서드, 파라미터, 권한을 맞춘다. 공통 응답 래퍼(ApiResponse<T>), Bean Validation, 에러코드 체계 같은 구현 규칙은 ../.claude/rules/api-design.md, ../.claude/rules/error-handling.md를 따르며 이 문서에서 중복 서술하지 않는다.
| 기준 | 내용 |
|---|---|
| base path | /api/v1 |
| 사용자 식별 | JWT 인증 정보에서 식별 |
| 사용자별 엔티티 경로 | /me, /users/{userId} 없이 엔티티 리소스명 사용 |
| 프로필 엔티티 | /api/v1/user-profiles |
| 정책 신청관리 엔티티 | /api/v1/policy-applications |
| 정책 신청관리 체크리스트 엔티티 | /api/v1/policy-application-checklists |
| 정책 배치 이력 엔티티 | /api/v1/policy-batch-histories |
| 챗봇 API | FastAPI 직접 호출 경로이므로 Spring Boot 구현 대상과 분리 |
| 기능 | 이름 | 메서드 | 경로 | 권한 | 파라미터 |
|---|---|---|---|---|---|
| 인증 | 로그아웃 | POST |
/api/v1/auth/logout |
회원 | body: refreshToken |
| 인증 | 내 로그인 사용자 조회 | GET |
/api/v1/auth/me |
회원 | 없음 |
| 인증 | OAuth 인가 URL 생성 | GET |
/api/v1/auth/oauth/{provider}/authorization-url |
비회원 | path: provider(kakao, naver, google). 파라미터 없음(state는 서버가 생성해 Redis에 저장, redirect_uri는 서버 설정값 고정) |
| 인증 | 소셜 로그인 콜백 | POST |
/api/v1/auth/oauth/{provider}/callback |
비회원 | path: provider(kakao, naver, google). body: code, state(서버가 발급한 값을 그대로 반환, CSRF 방어용) |
| 인증 | 액세스 토큰 갱신 | POST |
/api/v1/auth/token/refresh |
비회원 | body: refreshToken |
| 인증 | 회원 탈퇴 | DELETE |
/api/v1/users |
회원 | body: confirmText="탈퇴합니다" |
| 온보딩/프로필 | 프로필 선택지 조회 | GET |
/api/v1/profile-options |
비회원 | 없음 |
| 온보딩/프로필 | 내 프로필 조회 | GET |
/api/v1/user-profiles |
회원 | 없음 |
| 온보딩/프로필 | 프로필 저장/수정 | PUT |
/api/v1/user-profiles |
회원 | body: birthYear, region, subRegion, employmentStatus, educationLevel, categories[], keywords[] |
| 정책 검색 | 정책 검색/필터 | GET |
/api/v1/policies |
비회원 | query: keyword 선택, region 선택, category 선택, page 기본 0, size 기본 20, sort 기본 relevance |
| 정책 검색 | 검색어 제안 | GET |
/api/v1/policies/search-suggestions |
비회원 | query: keyword 선택 |
| 정책 검색 | 정책 상세 조회 | GET |
/api/v1/policies/{policyId} |
비회원 | path: policyId |
| 정책 채팅 | 메시지 이력 조회 | GET |
/api/v1/policies/{policyId}/chat/messages |
회원 | path: policyId, query: afterId 기본 0 |
| 정책 채팅 | STOMP 연결 | WebSocket |
/api/ws |
회원 | STOMP CONNECT header: Authorization: Bearer <accessToken> |
| 정책 채팅 | 실시간 메시지 전송 | STOMP SEND |
/app/policies/{policyId}/chat/messages |
회원 | body: content(1~1000자) |
| 정책 채팅 | 실시간 메시지 수신 | STOMP SUBSCRIBE |
/user/queue/policies/{policyId}/chat/messages |
회원 | path: policyId |
| 정책 채팅 | 오류 수신 | STOMP SUBSCRIBE |
/user/queue/policies/{policyId}/chat/errors |
회원 | path: policyId |
| 맞춤 추천 | 맞춤정책 조회 | GET |
/api/v1/recommended-policies |
회원 | query: region 선택, category 선택, keyword 선택 |
| 신청관리 | 신청 등록 | POST |
/api/v1/policy-applications |
회원 | body: policyId, status(INTERESTED|PREPARING|APPLIED|COMPLETED), memo 선택, endAt 선택 |
| 신청관리 | 신청 목록 조회 | GET |
/api/v1/policy-applications |
회원 | query: page 기본 1, size 기본 20 |
| 신청관리 | 상태 변경 | PATCH |
/api/v1/policy-applications/{id}/status |
회원 | path: id. query: status(INTERESTED|PREPARING|APPLIED|COMPLETED) |
| 신청관리 | 메모 수정 | PATCH |
/api/v1/policy-applications/{id}/memo |
회원 | path: id. body: memo (필수, 최대 2000자) |
| 신청관리 | 마감일 수정 | PATCH |
/api/v1/policy-applications/{id}/end-at |
회원 | path: id. body: endAt 선택(ISO-8601 date-time, 생략 시 마감일 초기화) |
| 신청관리 | 신청 삭제 | DELETE |
/api/v1/policy-applications/{id} |
회원 | path: id |
| 신청관리 | 체크리스트 추가 | POST |
/api/v1/policy-application-checklists |
회원 | body: applicationId, message |
| 신청관리 | 체크리스트 조회 | GET |
/api/v1/policy-application-checklists/application/{applicationId} |
회원 | path: applicationId. query: page 기본 1, size 기본 20 |
| 신청관리 | 체크리스트 체크 | PATCH |
/api/v1/policy-application-checklists/{id}/check |
회원 | path: id |
| 신청관리 | 체크리스트 체크 해제 | PATCH |
/api/v1/policy-application-checklists/{id}/uncheck |
회원 | path: id |
| 신청관리 | 체크리스트 삭제 | DELETE |
/api/v1/policy-application-checklists/{id} |
회원 | path: id |
| 최근 본 정책 | 최근 본 정책 목록 | GET |
/api/v1/policy-recent-views |
회원 | query: page 기본 0, size 기본 20 |
| 읽음 상태 | 읽음 상태 목록 조회 | GET |
/api/v1/policy-read-states |
회원 | query: policyIds 반복 |
| 읽음 상태 | 정책 읽음 처리 | PUT |
/api/v1/policy-read-states/{policyId} |
회원 | path: policyId |
| 정책 비교 | 정책 비교 조회 | GET |
/api/v1/policy-comparisons |
비회원 | query: policyIds 반복(2~3개) |
| 정책 동기화 | 정책 수집 이력 목록 | GET |
/api/v1/policy-batch-histories |
관리자 | query: page 기본 0, size 기본 20 |
| 정책 동기화 | 정책 수집 실행 | POST |
/api/v1/policy-batch-histories |
관리자 | body: mode(FULL 또는 DELTA) |
| 정책 동기화 | 검색 인덱스 재생성 | POST |
/api/v1/search-indexes/rebuild |
관리자 | 없음 |
| 관리자/운영 | 운영 지표 조회 | GET |
/api/v1/admin/metrics |
관리자 | 없음 |
현재 로그인 세션을 종료하고 refresh token을 무효화한다.
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/auth/logout |
| 권한 | 회원 |
| 파라미터 | body: refreshToken |
현재 액세스 토큰 기준 로그인 사용자와 권한 정보를 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/auth/me |
| 권한 | 회원 |
| 파라미터 | 없음 |
소셜 로그인 시작을 위한 OAuth 제공자별 인가 URL을 생성한다. CSRF 방어용 state는 서버가 생성해 Redis에 짧은 TTL로 저장하고 응답 URL에 포함시킨다. provider로 리다이렉트할 redirect_uri도 서버 설정값(youthpick.oauth.frontend-callback-uri)으로 고정되어 있어 프론트가 별도로 넘길 파라미터는 없다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/auth/oauth/{provider}/authorization-url |
| 권한 | 비회원 |
| 파라미터 | path: provider(kakao, naver, google). 그 외 파라미터 없음 |
OAuth 인가 코드로 로그인을 완료하고 사용자 정보와 토큰을 발급받는다. 프론트는 자신의 콜백 라우트(redirect_uri)에서 provider가 붙여준 code/state를 그대로 읽어 이 API로 전달한다. state는 authorization-url 발급 시 서버가 준 값과 일치해야 하며, 1회 사용 후 폐기된다(CSRF 방어).
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/auth/oauth/{provider}/callback |
| 권한 | 비회원 |
| 파라미터 | path: provider(kakao, naver, google). body: code, state |
저장된 refresh token으로 새 access token과 refresh token을 발급받는다. 프론트는 이 API를 공통 requestJson이 아니라 직접 fetch로 호출하므로, 401 재시도 루프 없이 성공 시 새 토큰 쌍을 반환하고 실패 시 클라이언트가 로컬 인증 상태를 지우게 만든다.
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/auth/token/refresh |
| 권한 | 비회원 |
| 파라미터 | body: refreshToken |
현재 로그인 사용자의 계정을 탈퇴 처리한다.
| 항목 | 내용 |
|---|---|
| 메서드 | DELETE |
| 경로 | /api/v1/users |
| 권한 | 회원 |
| 파라미터 | body: confirmText="탈퇴합니다" |
온보딩 프로필 입력에 필요한 지역, 상태, 카테고리, 키워드 선택지를 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/profile-options |
| 권한 | 비회원 |
| 파라미터 | 없음 |
로그인 사용자의 저장된 정책 추천 프로필을 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/user-profiles |
| 권한 | 회원 |
| 파라미터 | 없음 |
로그인 사용자의 정책 추천 프로필을 저장하거나 수정한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PUT |
| 경로 | /api/v1/user-profiles |
| 권한 | 회원 |
| 파라미터 | body: birthYear, region, subRegion, employmentStatus, educationLevel, categories[], keywords[] |
정책 목록을 키워드와 필터 조건으로 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policies |
| 권한 | 비회원 |
| 파라미터 | query: keyword 선택, region 선택, category 선택, page 기본 0, size 기본 20, sort 기본 relevance |
입력 중인 키워드 기준으로 정책 검색어 추천 목록을 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policies/search-suggestions |
| 권한 | 비회원 |
| 파라미터 | query: keyword 선택 |
단일 정책의 상세 정보를 조회한다. 삭제·숨김 처리된 정책은 404(P001)로 응답한다. 로그인 사용자(access token 포함 요청)가 조회하면 해당 정책이 최근 본 정책으로 기록된다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policies/{policyId} |
| 권한 | 비회원 |
| 파라미터 | path: policyId |
삭제되지 않은 VISIBLE 정책에서 로그인 회원끼리 메시지를 주고받는다. 숨김·삭제된 정책은 이력 조회, 전송, 구독 모두 거부한다. 메시지는 정책별 ID 오름차순이며 afterId를 제외한 이후 메시지만 반환한다.
현재 저장된 메시지를 즉시 반환한다. 실시간 수신은 아래 STOMP 구독을 사용한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policies/{policyId}/chat/messages |
| 권한 | 회원 |
| 파라미터 | path: policyId. query: afterId 기본 0 |
| 응답 data | messages[{id, policyId, authorName, content, createdAt, mine}], nextCursor |
브라우저 WebSocket handshake에는 토큰을 넣지 않는다. 클라이언트는 /api/ws에 native WebSocket으로 연결한 뒤 STOMP CONNECT frame의 Authorization native header에 access token을 보낸다. 토큰이 없거나 유효하지 않으면 연결을 거부한다.
| 항목 | 내용 |
|---|---|
| WebSocket endpoint | /api/ws |
| application prefix | /app |
| user destination prefix | /user |
| broker prefix | /queue만 사용. 정책 채팅에 /topic broadcast를 사용하지 않음 |
| 전송 | SEND /app/policies/{policyId}/chat/messages, body: {content}(필수, 공백 불가, 최대 1000자) |
| 메시지 구독 | SUBSCRIBE /user/queue/policies/{policyId}/chat/messages |
| 오류 구독 | SUBSCRIBE /user/queue/policies/{policyId}/chat/errors |
메시지는 DB commit이 끝난 뒤 해당 정책을 구독 중인 사용자에게만 개별 전송한다. 메시지 payload는 {id, policyId, authorName, content, createdAt, mine}이며 mine은 수신 사용자별로 계산한다. 사용자 id, 이메일, 소셜 provider, token은 노출하지 않는다. 오류 payload는 {code, message}다. 허용 목록 밖의 전역 목적지와 /topic SEND/SUBSCRIBE는 거부한다.
로그인 사용자의 프로필과 조건을 바탕으로 맞춤 정책을 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/recommended-policies |
| 권한 | 회원 |
| 파라미터 | query: region 선택, category 선택, keyword 선택 |
기존 즐겨찾기(관심 정책) 개념을 흡수한 정책 신청관리 엔티티다. 상태(ApplicationStatus: INTERESTED/PREPARING/APPLIED/COMPLETED)·메모·마감일과 하위 체크리스트를 함께 관리한다.
정책을 신청관리 목록에 등록한다. 이미 등록된(soft-delete 되지 않은) 항목이면 P002 충돌 에러를 반환하고, soft-delete된 항목이면 재활성화하면서 기존 체크리스트를 초기화한다.
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/policy-applications |
| 권한 | 회원 |
| 파라미터 | body: policyId, status(INTERESTED|PREPARING|APPLIED|COMPLETED), memo 선택, endAt 선택 |
로그인 사용자의 신청관리 목록을 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policy-applications |
| 권한 | 회원 |
| 파라미터 | query: page 기본 1, size 기본 20 |
신청관리 항목의 상태를 변경한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PATCH |
| 경로 | /api/v1/policy-applications/{id}/status |
| 권한 | 회원 |
| 파라미터 | path: id. query: status(INTERESTED|PREPARING|APPLIED|COMPLETED) |
신청관리 항목의 개인 메모를 수정한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PATCH |
| 경로 | /api/v1/policy-applications/{id}/memo |
| 권한 | 회원 |
| 파라미터 | path: id. body: memo (필수, 최대 2000자) |
신청관리 항목의 마감일(endAt)을 수정한다. endAt을 생략하면 필수값 오류가 아니라 마감일 초기화(clear)로 처리한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PATCH |
| 경로 | /api/v1/policy-applications/{id}/end-at |
| 권한 | 회원 |
| 파라미터 | path: id. body: endAt 선택(ISO-8601 date-time, 생략 시 마감일 초기화) |
신청관리 항목을 삭제(soft-delete)한다.
| 항목 | 내용 |
|---|---|
| 메서드 | DELETE |
| 경로 | /api/v1/policy-applications/{id} |
| 권한 | 회원 |
| 파라미터 | path: id |
신청관리 항목에 체크리스트 항목을 추가한다.
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/policy-application-checklists |
| 권한 | 회원 |
| 파라미터 | body: applicationId, message (필수, 최대 500자) |
특정 신청관리 항목의 체크리스트 목록을 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policy-application-checklists/application/{applicationId} |
| 권한 | 회원 |
| 파라미터 | path: applicationId. query: page 기본 1, size 기본 20 |
체크리스트 항목을 체크 완료 상태로 표시한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PATCH |
| 경로 | /api/v1/policy-application-checklists/{id}/check |
| 권한 | 회원 |
| 파라미터 | path: id |
체크리스트 항목의 체크를 해제한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PATCH |
| 경로 | /api/v1/policy-application-checklists/{id}/uncheck |
| 권한 | 회원 |
| 파라미터 | path: id |
체크리스트 항목을 삭제(soft-delete)한다.
| 항목 | 내용 |
|---|---|
| 메서드 | DELETE |
| 경로 | /api/v1/policy-application-checklists/{id} |
| 권한 | 회원 |
| 파라미터 | path: id |
로그인 사용자가 최근에 상세 조회한 정책 목록을 마지막 조회 시각 내림차순으로 조회한다. 같은 정책을 다시 보면 기록이 늘어나지 않고 조회 시각만 갱신된다. 삭제·숨김 처리된 정책은 목록에서 제외된다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policy-recent-views |
| 권한 | 회원 |
| 파라미터 | query: page 기본 0, size 기본 20 |
여러 정책에 대한 로그인 사용자의 읽음 상태를 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policy-read-states |
| 권한 | 회원 |
| 파라미터 | query: policyIds 반복 |
특정 정책을 읽음 상태로 표시한다.
| 항목 | 내용 |
|---|---|
| 메서드 | PUT |
| 경로 | /api/v1/policy-read-states/{policyId} |
| 권한 | 회원 |
| 파라미터 | path: policyId |
비교 결과를 저장하지 않고 요청받은 정책들을 그때그때 조회해 내려주는 순수 조회다. 그래서 생성(POST) + 식별자(comparisonId) 재조회 구조가 아니라 쿼리 파라미터를 받는 **단일 GET**이다. 저장하는 것이 없으므로 POST는 만들 리소스가 없고, 식별자 역시 요청에 담긴 policyIds를 그대로 다시 표현한 값이라 정보를 더하지 않는다. 공유가 필요하면 이 요청 URL 자체가 공유 링크가 된다.
응답은 항상 조회 시점의 최신 정책 정보이며, 요청에 담긴 policyIds 순서를 그대로 보존한다(비교표 열 순서 = 사용자가 고른 순서).
여러 정책을 나란히 비교할 수 있도록 항목별 값을 함께 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policy-comparisons |
| 권한 | 비회원 |
| 파라미터 | query: policyIds 반복 — 서로 다른 정책 2~3개 (예: ?policyIds=1&policyIds=2) |
| 에러 | 개수가 2~3개를 벗어나거나 숫자가 아니거나 누락되면 C001, 중복된 정책이 있으면 P008 INVALID_COMPARISON_REQUEST, 존재하지 않는 정책이 섞여 있으면 P001 POLICY_NOT_FOUND |
data는 비교 대상 정책 배열이다. 각 원소는 Policy 엔티티 전체가 아니라 비교에 필요한 필드만 담은 값이며, 정책 상세 조회 응답의 부분집합으로 유지한다 — 같은 정책을 상세로 볼 때 감춰지는 값이 비교로 볼 때만 드러나면 안 되기 때문이다. 비교표는 자격 원문(추가 자격조건·참여 제한사항 등)만 나란히 보여주면 되므로, 상세 응답이 노출하는 자격 판정용 내부 코드(jobCodes, schoolCodes, majorCodes, specializationCodes, maritalStatusCode — #92부터 정책 목록/상세 응답에 노출)와 보류 필드, raw payload는 비교 응답에는 포함하지 않는다.
| 필드 | 타입 | 내용 |
|---|---|---|
policyId |
number | 정책 ID |
title |
string | 정책명 |
category |
string | 대분류 |
organizationName |
string | 주관기관 |
minAge / maxAge |
number | null | 지원 나이 범위 (null = 제한없음) |
incomeConditionCode |
string | null | 소득 조건 구분 코드 |
incomeMaxAmount |
number | null | 연소득 상한(만원) |
incomeEtcContent |
string | null | 소득 조건 기타 설명 |
additionalQualification |
string | null | 추가 자격조건 원문 |
participationRestriction |
string | null | 참여 제한사항 원문 |
applicationEndDate |
string(YYYY-MM-DD) | null |
신청 마감일 |
applicationUrl |
string | null | 신청 바로가기 링크 |
regions[] |
array | 지원 지역 목록. 비어 있으면 지역 조건 없음 |
regions[].regionCode |
string | 법정동 코드 |
regions[].provinceName |
string | 시도명 |
regions[].districtName |
string | 시군구명 |
관리자용 정책 동기화 작업 이력 목록을 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/policy-batch-histories |
| 권한 | 관리자 |
| 파라미터 | query: page 기본 0, size 기본 20 |
관리자가 정책 데이터 수집 작업을 시작한다. 수집 실행은 같은 컬렉션에 작업 요청을 생성하는 것으로 해석한다.
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/policy-batch-histories |
| 권한 | 관리자 |
| 파라미터 | body: mode(FULL 또는 DELTA) |
관리자가 정책 검색 인덱스 재생성 작업을 요청한다.
| 항목 | 내용 |
|---|---|
| 메서드 | POST |
| 경로 | /api/v1/search-indexes/rebuild |
| 권한 | 관리자 |
| 파라미터 | 없음 |
관리자 화면에서 사용할 정책, 사용자, 동기화 운영 지표를 조회한다.
| 항목 | 내용 |
|---|---|
| 메서드 | GET |
| 경로 | /api/v1/admin/metrics |
| 권한 | 관리자 |
| 파라미터 | 없음 |
아래 항목은 Notion DB에 유지된 기존 데이터다. 현재 프론트 필요 API 경로 변경 작업의 직접 대상이 아니므로 별도 확인 후 사용한다.
| 기능 | 이름 | 메서드 | 경로 | 권한 | 파라미터 |
|---|---|---|---|---|---|
| 온보딩/프로필 | 프로필 삭제 | DELETE |
/api/v1/me/profile |
회원 | 없음 |
| 정책 동기화 | 정책 수집 상세 | GET |
/api/v1/admin/policy-sync-jobs/{jobId} |
관리자 | path: jobId |
| 관리자/운영 | 헬스 체크 | GET |
/api/v1/health |
공통 | 없음 |
사용자별 데이터는 JWT에서 얻은 사용자 식별자를 서비스 계층에서 사용한다. URL 경로는 user-profiles, policy-applications, policy-read-states처럼 엔티티 리소스를 직접 드러내고, 컨트롤러 내부에서 인증 principal과 매핑한다.
policy_applications는 기존 즐겨찾기 개념을 흡수한 신청관리 엔티티다. 관심정책 등록·해제는 별도 favorites 리소스가 아니라 policy-applications의 생성/삭제와 상태 변경(status)으로 구현되어 있다. 신청관리 하위 체크리스트는 policy_application_checklists 엔티티로 별도 관리하며, 신청관리 삭제·재등록(soft-delete → reactivate) 시 체크리스트도 함께 초기화된다.
policy-batch-histories는 정책 수집 작업 이력을 나타낸다. 수집 실행은 같은 컬렉션에 작업 요청을 생성하는 POST /api/v1/policy-batch-histories로 해석한다.