GraphQL API Reference
1. Overview
1.1. Endpoints
-
도메인은 각 환경 별 도메인 문서 참고 바랍니다.
| 구분 | URL |
|---|---|
GraphiQL |
|
|
|
1.2. 공통 헤더 정보
GraphQL API도 REST API와 동일하게 HTTP Header로 인증 정보를 전달합니다.
| Header | Description | Mandatory | Example |
|---|---|---|---|
Authorization |
인증 토큰 (액세스 토큰) |
인증이 필요한 Query는 Y |
Bearer 4B561A51-7773-4CA4-8E67-851EF4E85145 |
Request-Id |
요청 식별 ID |
N |
c64af254-d067-475c-b4ce-15a6f0a73f99 |
Authorization 헤더 값은 Bearer {accessToken} 형식입니다.
인증이 필요한 GraphQL Query에서 Authorization 헤더가 없거나 유효하지 않으면 인증 오류가 발생합니다.
1.2.1. 설정 방법
GraphiQL에서 인증이 필요한 Query를 테스트할 때는 Headers 영역에 다음 JSON을 입력합니다.
{
"Authorization": "Bearer 4B561A51-7773-4CA4-8E67-851EF4E85145",
"Request-Id": "c64af254-d067-475c-b4ce-15a6f0a73f99"
}
1.3. GraphQL 응답 모델
GraphQL 응답은 성공 시 data 필드를 포함합니다.
| Path | Type | Mandatory | Description |
|---|---|---|---|
|
Object |
Y |
Query 실행 결과 |
{
"data": {
"myUser": {
"userId": "1",
"name": "홍길동",
"profileImageUrl": null
}
}
}
GraphQL 요청이 실패하면 errors 필드에 오류 정보가 포함됩니다. 클라이언트는 errors[].extensions.code 값을 기준으로 오류를 분기합니다.
| Path | Type | Mandatory | Description |
|---|---|---|---|
|
Array<Object> |
Y |
GraphQL 오류 목록 |
|
String |
Y |
오류 메시지 |
|
Array<String> |
N |
오류가 발생한 GraphQL field path |
|
String |
Y |
애플리케이션 에러 코드 |
|
Array<Object> |
N |
필드별 상세 오류 목록 |
|
String |
Y |
필드명 |
|
String |
Y |
오류 설명 |
|
Object |
N |
부분 성공 데이터. 전체 실패 시 |
{
"errors": [
{
"message": "인증이 필요합니다.",
"path": ["experiences"],
"extensions": {
"code": "invalid_auth_token"
}
}
],
"data": null
}
{
"errors": [
{
"message": "입력한 내용을 다시 확인해 주세요.",
"path": ["experiences"],
"extensions": {
"code": "invalid_arguments",
"details": [
{
"field": "size",
"reason": "1 이상이어야 합니다."
}
]
}
}
],
"data": null
}
| GraphQL 응답은 일부 오류 상황에서도 HTTP status가 200으로 내려갈 수 있습니다. 클라이언트는 HTTP status만 보지 말고 `errors[].extensions.code`를 기준으로 처리해야 합니다. |
1.4. 공통 에러 코드
모든 GraphQL Query에서 공통적으로 발생할 수 있는 에러 코드입니다.
각 Query별로 발생할 수 있는 에러 정보는 각 Query의 에러 코드 문서를 참고해주세요.
| Code | Message | Description |
|---|---|---|
invalid_arguments |
입력한 내용을 다시 확인해 주세요. |
필수 파라미터가 없거나, 파라미터가 유효하지 않는 경우 |
invalid_auth_token |
인증이 필요합니다. |
인증 토큰이 없거나 유효하지 않은 경우 |
token_expired |
인증이 만료되었습니다. 다시 로그인해 주세요. |
인증 토큰이 만료된 경우 (액세스 토큰 갱신 필요) |
internal_error |
일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요. |
서버 내부적으로 문제 발생 시 |
service_unavailable |
현재 서비스를 이용할 수 없습니다. 잠시 후 다시 시도해 주세요. |
현재 서비스를 이용할 수 없는 경우 |
1.5. 커서 페이징
목록 Query는 cursor, size 파라미터를 사용합니다.
| Parameter | Type | Description |
|---|---|---|
cursor |
String |
다음 페이지 조회를 위한 커서입니다. 첫 페이지는 `null`로 요청합니다. |
size |
Int |
한 번에 조회할 개수입니다. |
응답의 cursor.hasNext+`가 `+true+`이면 `+cursor.nextCursor 값을 다음 요청의 `cursor`로 전달합니다.
query Experiences($workspaceId: ID!, $cursor: String, $size: Int!) {
experiences(workspaceId: $workspaceId, cursor: $cursor, size: $size) {
experiences {
experienceId
title
}
cursor {
hasNext
nextCursor
}
}
}
첫 페이지 Variables:
{
"workspaceId": "8f13f49e-132a-47b7-b704-d7eec18fd44b",
"cursor": null,
"size": 20
}
다음 페이지 Variables:
{
"workspaceId": "8f13f49e-132a-47b7-b704-d7eec18fd44b",
"cursor": "5",
"size": 20
}
2. APIs
2.1. User
2.1.1. 내 정보 조회
Type: Query
Operation: me
요청 샘플:
query Me {
me {
userId
email
name
profileImageUrl
workspaces {
workspaceId
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
user_not_found |
사용자를 찾을 수 없습니다. |
유저를 찾을 수 없는 경우 |
2.2. Experience
2.2.1. 경험 단건 조회
Type: Query
Operation: experience
요청 샘플:
query Experience {
experience(
workspaceId: "00000000-0000-0000-0000-000000000002"
experienceId: 1
) {
experienceId
tags
title
project {
projectId
name
summary
period {
startAt
endAt
}
role
experienceCount
}
contents {
type
star {
situation
task
action
result
}
free {
content
}
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_not_found |
존재하지 않는 경험입니다 |
경험을 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
|
2.2.2. 경험 목록 조회
Type: Query
Operation: experiences
요청 샘플:
query Experiences {
experiences(
workspaceId: "00000000-0000-0000-0000-000000000002"
projectId: 1
jdId: "00000000-0000-0000-0000-000000000003"
cursor: null
size: 10
) {
experiences {
experienceId
tags
title
matchRate
recommendedReason
project {
projectId
name
}
contents {
type
star {
situation
task
action
result
}
free {
content
}
}
}
cursor {
nextCursor
hasNext
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
`projectId`로 특정 프로젝트의 경험 목록을 조회했으나 프로젝트를 찾을 수 없는 경우 |
2.2.3. 경험 검색
Type: Query
Operation: searchExperiences
요청 샘플:
query SearchExperiences {
searchExperiences(
workspaceId: "00000000-0000-0000-0000-000000000002"
keyword: "GraphQL"
cursor: null
size: 10
) {
experiences {
experienceId
tags
title
project {
projectId
name
}
contents {
type
star {
situation
task
action
result
}
free {
content
}
}
}
cursor {
nextCursor
hasNext
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.2.4. 경험 생성
Type: Mutation
Operation: createExperience
요청 샘플:
mutation CreateExperience {
createExperience(
workspaceId: "00000000-0000-0000-0000-000000000002"
request: {
projectId: 1
tags: ["GraphQL", "Kotlin", "API"]
title: "이력서 생성 API 구현"
contents: {
type: STAR
star: {
situation: "이력서 섹션과 아이템을 자유롭게 구성해야 하는 요구사항이 있었습니다."
task: "클라이언트가 한 번의 요청으로 전체 이력서 스냅샷을 저장할 수 있는 API가 필요했습니다."
action: "SaveResumeInput을 기준으로 섹션 타입과 payload를 검증하고, core 서비스에서 저장 흐름을 일관되게 처리했습니다."
result: "생성, 수정 API의 입력 구조를 통일해 프론트엔드 연동 비용을 줄이고 테스트 커버리지를 확보했습니다."
}
}
}
) {
experienceId
tags
title
project {
projectId
name
}
contents {
type
star {
situation
task
action
result
}
free {
content
}
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
경험 프로젝트를 찾을 수 없는 경우 |
2.2.5. 경험 수정
Type: Mutation
Operation: updateExperience
요청 샘플:
mutation UpdateExperience {
updateExperience(
workspaceId: "00000000-0000-0000-0000-000000000002"
experienceId: 1
request: {
projectId: 1
tags: ["GraphQL", "Spring Boot"]
title: "이력서 GraphQL API 개선"
contents: {
type: STAR
star: {
situation: "이력서 섹션과 아이템을 자유롭게 구성해야 하는 요구사항이 있었습니다."
task: "클라이언트가 한 번의 요청으로 전체 이력서 스냅샷을 저장할 수 있는 API가 필요했습니다."
action: "SaveResumeInput을 기준으로 섹션 타입과 payload를 검증하고, core 서비스에서 저장 흐름을 일관되게 처리했습니다."
result: "생성, 수정 API의 입력 구조를 통일해 프론트엔드 연동 비용을 줄이고 테스트 커버리지를 확보했습니다."
}
}
}
) {
experienceId
tags
title
project {
projectId
name
}
contents {
type
star {
situation
task
action
result
}
free {
content
}
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_not_found |
존재하지 않는 경험입니다 |
경험을 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
경험 프로젝트를 찾을 수 없는 경우 |
2.2.6. 경험 삭제
Type: Mutation
Operation: deleteExperience
요청 샘플:
mutation DeleteExperience {
deleteExperience(
workspaceId: "00000000-0000-0000-0000-000000000002"
experienceId: 1
)
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_not_found |
존재하지 않는 경험입니다 |
경험을 찾을 수 없는 경우 |
2.3. Experience Project
2.3.1. 경험 프로젝트 단건 조회
Type: Query
Operation: experienceProject
요청 샘플:
query ExperienceProject {
experienceProject(
workspaceId: "00000000-0000-0000-0000-000000000002"
projectId: 1
) {
projectId
name
summary
period {
startAt
endAt
}
role
experienceCount
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
경험 프로젝트를 찾을 수 없는 경우 |
2.3.2. 경험 프로젝트 목록 조회
Type: Query
Operation: experienceProjects
요청 샘플:
query ExperienceProjects {
experienceProjects(
workspaceId: "00000000-0000-0000-0000-000000000002"
cursor: null
size: 10
) {
projects {
projectId
name
summary
period {
startAt
endAt
}
role
experienceCount
}
cursor {
nextCursor
hasNext
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.3.3. 경험 프로젝트 생성
Type: Mutation
Operation: createExperienceProject
요청 샘플:
mutation CreateExperienceProject {
createExperienceProject(
workspaceId: "00000000-0000-0000-0000-000000000002"
input: {
name: "잡도리 이력서 서비스"
summary: "사용자가 이력서와 경험을 구조화해 관리할 수 있는 채용 플랫폼 기능"
period: { startAt: "2025-01-01", endAt: "2025-06-30" }
role: "Backend Developer"
}
) {
projectId
name
summary
period {
startAt
endAt
}
role
experienceCount
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.3.4. 경험 프로젝트 수정
Type: Mutation
Operation: updateExperienceProject
요청 샘플:
mutation UpdateExperienceProject {
updateExperienceProject(
workspaceId: "00000000-0000-0000-0000-000000000002"
projectId: 1
request: {
name: "잡도리 이력서 플랫폼 고도화"
summary: "이력서 작성, 경험 정리, GraphQL API를 개선한 프로젝트"
period: { startAt: "2025-01-01", endAt: "2025-07-31" }
role: "Backend Developer"
}
) {
projectId
name
summary
period {
startAt
endAt
}
role
experienceCount
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
경험 프로젝트를 찾을 수 없는 경우 |
2.3.5. 경험 프로젝트 삭제
Type: Mutation
Operation: deleteExperienceProject
요청 샘플:
mutation DeleteExperienceProject {
deleteExperienceProject(
workspaceId: "00000000-0000-0000-0000-000000000002"
projectId: 1
)
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_project_not_found |
존재하지 않는 프로젝트입니다 |
경험 프로젝트를 찾을 수 없는 경우 |
2.4. Notion
2.4.1. Notion 연결
Type: Mutation
Operation: connectNotion
요청 샘플:
mutation ConnectNotion {
connectNotion(
workspaceId: "00000000-0000-0000-0000-000000000002"
request: {
authorizationCode: "notion-oauth-authorization-code"
redirectUri: "http://localhost:3000/notion/callback"
}
) {
connectionId
notionWorkspaceName
notionWorkspaceIcon
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
notion_api_request_failed |
Notion API 요청에 실패했습니다. |
Notion OAuth 토큰 교환 요청이 실패한 경우 |
2.4.2. Notion 연결 해제
Type: Mutation
Operation: disconnectNotion
요청 샘플:
mutation DisconnectNotion {
disconnectNotion(
workspaceId: "00000000-0000-0000-0000-000000000002"
connectionId: 740000000000000001
)
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.4.3. Notion 연결 목록 조회
Type: Query
Operation: notionConnections
요청 샘플:
query NotionConnections {
notionConnections(
workspaceId: "00000000-0000-0000-0000-000000000002"
cursor: null
size: 10
) {
connections {
connectionId
notionWorkspaceName
notionWorkspaceIcon
}
cursor {
nextCursor
hasNext
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.4.4. Notion 페이지 검색
Type: Query
Operation: notionPages
요청 샘플:
query NotionPages {
notionPages(
workspaceId: "00000000-0000-0000-0000-000000000002"
connectionId: 740000000000000001
query: "이력서"
cursor: null
size: 10
) {
pages {
pageId
title
url
lastEditedTime
}
cursor {
nextCursor
hasNext
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
notion_connection_not_found |
Notion 연결을 찾을 수 없습니다. |
요청한 Notion 연결이 없거나 접근 권한이 없는 경우 |
notion_connection_need_reconnect |
Notion을 다시 연결해야 합니다. |
Notion 토큰 갱신에 실패했거나 연결 권한이 해제된 경우 |
notion_page_access_denied |
Notion 페이지에 접근할 수 없습니다. |
해당 페이지가 연결에 공유되지 않았거나 권한이 없는 경우 |
notion_api_request_failed |
Notion API 요청에 실패했습니다. |
Notion API 호출이 실패한 경우 |
2.4.5. Notion 경험 불러오기
Type: Mutation
Operation: importNotionExperiences
요청 샘플:
mutation ImportNotionExperiences {
importNotionExperiences(
workspaceId: "00000000-0000-0000-0000-000000000002"
request: {
connectionId: 740000000000000001
pageId: "notion-page-id"
}
)
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
notion_connection_not_found |
Notion 연결을 찾을 수 없습니다. |
요청한 Notion 연결이 없거나 접근 권한이 없는 경우 |
notion_connection_need_reconnect |
Notion을 다시 연결해야 합니다. |
Notion 토큰 갱신에 실패했거나 연결 권한이 해제된 경우 |
notion_page_access_denied |
Notion 페이지에 접근할 수 없습니다. |
해당 페이지가 연결에 공유되지 않았거나 권한이 없는 경우 |
notion_api_request_failed |
Notion API 요청에 실패했습니다. |
Notion API 호출이 실패한 경우 |
2.5. Resume
2.5.1. 이력서 목록 조회
Type: Query
Operation: resumes
요청 샘플:
query Resumes {
resumes(
workspaceId: "00000000-0000-0000-0000-000000000002"
statuses: [COMPLETED, DRAFT]
) {
resumes {
resumeId
targetJd {
jdId
sourceUrl
companyName
positionTitle
insight {
strategy
}
status
}
template
status
createdAt
}
cursor {
nextCursor
hasNext
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.5.2. 이력서 상태별 개수 조회
Type: Query
Operation: resumeCounts
요청 샘플:
query ResumeCounts {
resumeCounts(
workspaceId: "00000000-0000-0000-0000-000000000002"
) {
status
count
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.5.3. 이력서 상세 조회
Type: Query
Operation: resume
요청 샘플:
query Resume {
resume(
workspaceId: "00000000-0000-0000-0000-000000000002"
resumeId: 94123123213123123
) {
resumeId
targetJd {
jdId
sourceUrl
companyName
positionTitle
companyIntro
responsibilities
requiredExperiences
preferredExperiences
hiringProcess
coreCompetencies
insight {
strategy
}
status
createdAt
}
template
status
createdAt
sections {
sectionId
type
displayText
displayOrder
visible
createdAt
items {
itemId
displayOrder
visible
createdAt
payload {
basicInfo {
name
email
phone
hideContact
}
coreSkill {
content
}
career {
companyName
role
period {
startAt
endAt
}
contents
}
experience {
name
role
period {
startAt
endAt
}
contents
}
education {
schoolName
major
degree
status
period {
startAt
endAt
}
}
award {
name
organization
awardedAt
}
language {
examName
scoreOrGrade
acquiredAt
}
certificate {
name
organization
acquiredAt
}
skill {
name
level
}
}
}
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
resume_not_found |
존재하지 않는 이력서입니다 |
이력서를 찾을 수 없는 경우 |
2.5.4. 이력서 생성
Type: Mutation
Operation: createResume
요청 샘플:
mutation CreateResumeWithDefaultItems {
createResume(
workspaceId: "00000000-0000-0000-0000-000000000002"
input: {
targetJdId: "00000000-0000-0000-0000-00000000000a"
template: DEFAULT
status: DRAFT
optimizationMode: JOB_SPECIFIC
sections: [
{
type: BASIC_INFO
displayOrder: 10.0
visible: true
items: []
useDefaultItems: true
}
{
type: CORE_SKILL
displayOrder: 20.0
visible: true
items: []
useDefaultItems: true
}
{
type: EXPERIENCE
displayOrder: 30.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
experience: {
name: "이력서 관리 GraphQL API 개발"
role: "Backend Developer"
period: { startAt: "2025-01-01", endAt: "2025-06-30" }
contents: "이력서 생성, 조회, 수정, 삭제 GraphQL API 설계 및 구현"
}
}
}
]
}
{
type: CAREER
displayOrder: 40.0
visible: true
items: []
useDefaultItems: true
}
{
type: EDUCATION
displayOrder: 60.0
visible: true
items: []
useDefaultItems: true
}
{
type: AWARD
displayOrder: 70.0
visible: true
items: []
useDefaultItems: true
}
{
type: LANGUAGE
displayOrder: 80.0
visible: true
items: []
useDefaultItems: true
}
{
type: CERTIFICATE
displayOrder: 90.0
visible: true
items: []
useDefaultItems: true
}
{
type: SKILL
displayOrder: 100.0
visible: true
items: []
useDefaultItems: true
}
]
}
) {
resumeId
targetJd {
jdId
sourceUrl
companyName
positionTitle
companyIntro
responsibilities
requiredExperiences
preferredExperiences
hiringProcess
coreCompetencies
status
createdAt
}
template
status
createdAt
sections {
sectionId
type
displayText
displayOrder
visible
items {
itemId
displayOrder
visible
payload {
basicInfo {
name
email
phone
hideContact
}
coreSkill {
content
}
experience {
name
role
period {
startAt
endAt
}
contents
}
career {
companyName
role
period {
startAt
endAt
}
contents
}
education {
schoolName
major
degree
status
period {
startAt
endAt
}
}
award {
name
organization
awardedAt
}
language {
examName
scoreOrGrade
acquiredAt
}
certificate {
name
organization
acquiredAt
}
skill {
name
level
}
}
}
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.5.5. 이력서 수정
Type: Mutation
Operation: updateResume
요청 샘플:
mutation UpdateResume {
updateResume(
workspaceId: "00000000-0000-0000-0000-000000000002"
resumeId: 94123123213123123
input: {
targetJdId: "00000000-0000-0000-0000-00000000000a"
template: DEFAULT
status: COMPLETED
optimizationMode: JOB_SPECIFIC
sections: [
{
type: BASIC_INFO
displayOrder: 1.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
basicInfo: {
name: "잡도리"
email: "jobdori.backend@example.com"
phone: "010-1234-5678"
hideContact: false
}
}
}
]
}
{
type: CORE_SKILL
displayOrder: 2.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
coreSkill: {
content: "Kotlin, Spring Boot, PostgreSQL 기반 백엔드 개발과 GraphQL API 설계에 강점이 있습니다."
}
}
}
]
}
{
type: EXPERIENCE
displayOrder: 3.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
experience: {
name: "이력서 관리 GraphQL API 개발"
role: "Backend Developer"
period: { startAt: "2025-01-01", endAt: "2025-06-30" }
contents: "이력서 생성, 조회, 수정, 삭제 API 설계 및 구현"
}
}
}
]
}
{
type: CAREER
displayOrder: 4.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
career: {
companyName: "잡도리"
role: "Backend Developer"
period: { startAt: "2024-01-01", endAt: "2025-12-31" }
contents: "채용 플랫폼 백엔드 개발 및 운영"
}
}
}
]
}
{
type: EDUCATION
displayOrder: 5.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
education: {
schoolName: "잡도리대학교"
major: "컴퓨터공학"
degree: "BACHELOR"
status: "GRADUATED"
period: { startAt: "2018-03-01", endAt: "2024-02-29" }
}
}
}
]
}
{
type: AWARD
displayOrder: 6.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
award: {
name: "잡도리 해커톤 대상"
organization: "잡도리 테크랩"
awardedAt: "2024-08-01"
}
}
}
]
}
{
type: LANGUAGE
displayOrder: 7.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
language: {
examName: "TOEIC"
scoreOrGrade: "900"
acquiredAt: "2024-03-15"
}
}
}
]
}
{
type: CERTIFICATE
displayOrder: 8.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
certificate: {
name: "정보처리기사"
organization: "한국산업인력공단"
acquiredAt: "2024-05-20"
}
}
}
]
}
{
type: SKILL
displayOrder: 9.0
visible: true
useDefaultItems: false
items: [
{
displayOrder: 1.0
visible: true
payload: {
skill: {
name: "Kotlin"
level: "HIGH"
}
}
}
]
}
]
}
) {
resumeId
targetJd {
jdId
sourceUrl
companyName
positionTitle
companyIntro
responsibilities
requiredExperiences
preferredExperiences
hiringProcess
coreCompetencies
insight {
strategy
}
status
createdAt
}
template
status
createdAt
sections {
sectionId
type
displayText
displayOrder
visible
items {
itemId
displayOrder
visible
payload {
basicInfo { name email phone hideContact }
coreSkill { content }
experience {
name
role
period { startAt endAt }
contents
}
career {
companyName
role
period { startAt endAt }
contents
}
education {
schoolName
major
degree
status
period { startAt endAt }
}
award { name organization awardedAt }
language { examName scoreOrGrade acquiredAt }
certificate { name organization acquiredAt }
skill { name level }
}
}
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
resume_not_found |
존재하지 않는 이력서입니다 |
이력서를 찾을 수 없는 경우 |
2.5.6. 이력서 삭제
Type: Mutation
Operation: deleteResume
요청 샘플:
mutation DeleteResume {
deleteResume(
workspaceId: "00000000-0000-0000-0000-000000000002"
resumeId: 94123123213123123
)
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
resume_not_found |
존재하지 않는 이력서입니다 |
이력서를 찾을 수 없는 경우 |
2.6. JD
2.6.1. JD 단건 조회
Type: Query
Operation: jd
요청 샘플:
query Jd {
jd(
workspaceId: "00000000-0000-0000-0000-000000000002"
id: "00000000-0000-0000-0000-00000000000a"
) {
jdId
sourceUrl
companyName
positionTitle
companyIntro
responsibilities
requiredExperiences
preferredExperiences
hiringProcess
coreCompetencies
insight {
strategy
}
status
createdAt
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
jd_not_found |
등록되지 않은 JD입니다. |
존재하지 않거나 소유자가 아닌 JD 조회 |
2.6.2. JD 목록 조회
Type: Query
Operation: jds
요청 샘플:
query Jds {
jds(
workspaceId: "00000000-0000-0000-0000-000000000002"
sort: LATEST
status: IN_PROGRESS
) {
jdId
companyName
positionTitle
status
createdAt
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.6.3. JD 등록
Type: Mutation
Operation: registerJd
요청 샘플:
mutation RegisterJd {
registerJd(
workspaceId: "00000000-0000-0000-0000-000000000002"
request: { sourceUrl: "https://example.com/jd" }
) {
jd {
jdId
companyName
positionTitle
insight {
strategy
}
status
}
candidates {
title
body
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
experience_required |
경험 정리가 필요합니다. 경험을 추가해주세요. |
워크스페이스에 활성 상태의 경험이 없어 JD를 등록할 수 없는 경우 |
jd_invalid_url |
요청할 수 없는 URL입니다. |
허용되지 않은 스킴이거나 내부 네트워크 주소(SSRF 차단) |
jd_access_denied |
해당 페이지에 접근할 수 없습니다. 내용을 직접 붙여넣어 주세요. |
JD URL 접근 거부(4xx) |
jd_fetch_failed |
공고 내용을 가져오지 못했습니다. 내용을 직접 붙여넣어 주세요. |
JD 본문 수집 실패(모든 크롤 단 실패) |
jd_not_a_posting |
채용 공고가 아닌 것 같아요. 공고 URL이나 내용을 확인해 주세요. |
AI가 채용 공고로 인식하지 못한 본문/URL |
ai_rate_limited |
AI 요청이 많아 잠시 후 다시 시도해 주세요. |
AI 요청 한도 초과 |
ai_generation_failed |
일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요. |
AI 응답 생성 실패 |
ai_unavailable |
현재 AI 서비스를 이용할 수 없습니다. 잠시 후 다시 시도해 주세요. |
AI 서비스 접근 불가 |
ai_timeout |
AI 응답이 지연되고 있습니다. 잠시 후 다시 시도해 주세요. |
AI 응답 지연/시간 초과 |
2.6.4. JD 완료 처리
Type: Mutation
Operation: markJdCompleted
요청 샘플:
mutation MarkJdCompleted {
markJdCompleted(
workspaceId: "00000000-0000-0000-0000-000000000002"
id: "00000000-0000-0000-0000-00000000000a"
) {
jdId
status
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
jd_not_found |
등록되지 않은 JD입니다. |
존재하지 않거나 소유자가 아닌 JD 조회 |
2.7. Profile
2.7.1. 이력서 기본 정보 프로필 조회
Type: Query
Operation: profile
요청 샘플:
query Profile {
profile(workspaceId: "00000000-0000-0000-0000-000000000002") {
profileId
name
phone
email
coreCompetency
educations {
school
major
degree
status
period {
startAt
endAt
}
}
careers {
company
position
period {
startAt
endAt
}
description
}
languageTests {
testName
score
acquiredAt
}
awards {
title
organization
awardedAt
}
certifications {
name
issuer
acquiredAt
}
skills {
name
level
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.7.2. 이력서 기본 정보 프로필 수정
Type: Mutation
Operation: updateProfile
요청 샘플:
mutation UpdateProfile {
updateProfile(
workspaceId: "00000000-0000-0000-0000-000000000002"
request: {
name: "잡도리"
phone: "010-1111-2222"
email: "rlajae14@gmail.com"
coreCompetency: "콘텐츠 기획과 데이터 기반 개선에 강점이 있는 마케터입니다."
educations: [
{
school: "잡도리대학교"
major: "경영학과"
degree: BACHELOR
status: EXPECTED_GRADUATION
period: {
startAt: "2020-03-01"
endAt: "2026-02-28"
}
}
]
careers: [
{
company: "잡도리컴퍼니"
position: "마케팅 인턴"
period: {
startAt: "2024-07-01"
endAt: "2024-12-31"
}
description: "신규 서비스 런칭 캠페인의 콘텐츠 기획과 성과 분석을 담당했습니다."
}
]
certifications: [
{
name: "GAIQ"
issuer: "Google"
acquiredAt: "2024-05-10"
}
]
skills: [
{
name: "GA4"
level: HIGH
}
]
}
) {
profileId
name
phone
email
coreCompetency
educations {
school
degree
status
period {
startAt
endAt
}
}
careers {
company
position
description
}
certifications {
name
acquiredAt
}
skills {
name
level
}
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
2.7.3. 핵심역량 AI 생성
Type: Mutation
Operation: generateCoreCompetency
요청 샘플:
mutation GenerateCoreCompetency {
generateCoreCompetency(
workspaceId: "00000000-0000-0000-0000-000000000002"
resumeId: 94123123213123123
jdId: "00000000-0000-0000-0000-000000000003"
) {
coreCompetency
strategy
}
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
invalid_arguments |
입력한 내용을 다시 확인해 주세요. |
필수 파라미터가 없거나, 파라미터가 유효하지 않는 경우 |
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
resume_not_found |
존재하지 않는 이력서입니다 |
이력서를 찾을 수 없는 경우 |
jd_not_found |
등록되지 않은 JD입니다. |
존재하지 않거나 소유자가 아닌 JD 조회 |
ai_generation_failed |
일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요. |
AI 응답 생성 실패 |
2.7.4. 프로필 텍스트 AI 다듬기
Type: Mutation
Operation: polishProfileText
요청 샘플:
mutation PolishProfileText {
polishProfileText(
workspaceId: "00000000-0000-0000-0000-000000000002"
request: {
text: "런칭 캠페인에서 메시지 A/B 테스트를 수행해서 전환율을 많이 개선했음"
kind: EXPERIENCE_DESCRIPTION
structure: BULLET
instruction: "정중한 어투로, 전환율 수치를 강조"
title: "콘텐츠 마케팅 캠페인 운영"
jdId: "00000000-0000-0000-0000-000000000003"
}
)
}
커스텀 에러 코드:
전역 공통 에러 코드는 공통 에러 코드를 참고해 주세요.
아래에는 각 GraphQL operation의 요청 샘플과 도메인 로직에 따라 발생할 수 있는 커스텀 에러 코드만 명시합니다.
| Code | Message | Description |
|---|---|---|
workspace_access_denied |
워크스페이스에 접근할 권한이 없습니다. |
워크스페이스 접근 권한이 없는 경우 |
workspace_not_found |
워크스페이스를 찾을 수 없습니다. |
워크스페이스를 찾을 수 없는 경우 |
jd_not_found |
등록되지 않은 JD입니다. |
존재하지 않거나 소유자가 아닌 JD 조회 |
ai_generation_failed |
일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요. |
AI 응답 생성 실패 |