본문으로 건너뛰기
버전: 0.68.0

설문지 번들 조회 API

설문지 번들 조회 API는 특정 번들 ID를 통해 설문지 번들의 정보를 조회하는 기능을 제공합니다. 번들에는 하나 이상의 설문지가 포함되며, 언어별 번역 데이터와 함께 제공됩니다.

특정 번들 버전 조회

번들 ID를 통해 설문지 번들의 특정 버전을 조회하고, 설정된 언어와 옵션에 따라 필터링된 데이터를 반환합니다.

  • HTTP Method: GET
  • Path: /v1/questionnaires/bundles/{bundleId}
  • 인증: App Token 필요 (Authorization: Bearer {appToken})

Headers

HeaderTypeDescriptionRequired
AuthorizationBearer {appToken}App 토큰을 통한 인증Yes
Accept-Languagestring응답 언어 지정 (Language Code 참조, 예: de-DE, en-US, ko-KR)Yes

Path Parameters

파라미터타입설명필수 (Yes/No)예시
bundleIdstring번들 IDYesbundle_welt_001

Query Parameters

파라미터타입설명필수 (Yes/No)기본값예시
includeQuestionsboolean문항 포함 여부Notruetrue
includeScoreLevelsboolean점수 구간 포함 여부Notruetrue

Responses

HTTP Status Code설명Error Code(s)
200 OK번들 조회 성공-
401 Unauthorized앱 토큰 인증 실패2051
404 Not Found요청한 번들을 찾을 수 없음9010, 9033
500 Internal Server Error서버 내부 오류9000, 9500
200 OK - 번들 조회 성공

성공적으로 번들을 조회하면 QuestionnaireBundleResponseDto에 정의된 번들 정보가 반환됩니다. 여기에는 번들 ID, 언어 설정, 그리고 번들에 포함된 설문지 목록이 포함됩니다.

각 설문지 유형별로 필수 필드가 다르므로, 아래 예시들을 참고하여 클라이언트에서 적절히 처리하시기 바랍니다.

1. WIS (WELT Insomnia Scale) 설문 예시

{
"bundleId": "22f11e85-dc3c-4ab4-92b5-2e0717708377",
"language": "de-DE",
"questionnaires": [
{
"id": "82a4e123-c57b-4489-a0bc-b6e3fd4f6e16",
"type": "WIS",
"info": {
"title": "WELT Insomnia Scale",
"intro": "Der \"Welt-Insomnia-Scale(WIS)\" wurde von uns entwickelt...",
"postDescription": "Danke fürs Ausfüllen! Deine Antworten helfen..."
},
"question": {
"count": 9,
"questions": [
{
"id": "fa534b73-f3a0-4cb5-a229-b25ecc57b40c",
"orderIndex": 0,
"type": "SINGLE_CHOICE",
"isRequired": true,
"headline": "Im folgenden Fragebogen geht es um...",
"text": "Nimmst du derzeit Schlafmittel ein?",
"options": [
{
"id": "ef3169ae-eba3-475b-955c-e168a80d5bb4",
"value": "0",
"orderIndex": 0,
"text": "Nein"
}
]
},
{
"id": "55101767-de71-4405-8e2c-7cf60d341b45",
"orderIndex": 5,
"type": "TIME",
"isRequired": true,
"headline": "Im folgenden Fragebogen geht es um...",
"text": "Wann würdest du idealerweise schlafen gehen?"
}
]
},
"score": {
"calculationType": "CUSTOM"
},
"additionalInformationRules": [
{
"id": "wis-rule-001",
"triggerType": "ANSWER_VALUE",
"questionId": "fa534b73-f3a0-4cb5-a229-b25ecc57b40c",
"answerValue": "1",
"presentationType": "INLINE",
"content": "Bitte gib den Namen des Medikaments an."
},
{
"id": "wis-rule-002",
"triggerType": "ANSWER_VALUE",
"questionId": "fa534b73-f3a0-4cb5-a229-b25ecc57b40c",
"answerValue": "2",
"presentationType": "INLINE",
"content": "Bitte gib den Namen des Medikaments an."
}
]
}
]
}

2. ISI (Insomnia Severity Index) 설문 예시

{
"bundleId": "22f11e85-dc3c-4ab4-92b5-2e0717708377",
"language": "de-DE",
"questionnaires": [
{
"id": "019c8b68-39b9-4c49-a4c0-7814b6d888ac",
"type": "ISI",
"info": {
"title": "Insomnia Severity Index",
"intro": "Der \"Insomnia Severity Index\"(ISI)- Fragebogen..."
},
"question": {
"count": 7,
"questions": [
{
"id": "2fae3e99-71d8-44d8-94b0-0f4e88b4e5ef",
"orderIndex": 0,
"type": "SINGLE_CHOICE",
"isRequired": true,
"headline": "Bitte kreuze für jede der folgenden Fragen...",
"text": "Schwierigkeit, einzuschlafen.",
"options": [
{
"id": "a5757dd4-361b-42f1-9ba9-0c062fa3d410",
"value": "0",
"orderIndex": 0,
"text": "Keine"
},
{
"id": "9eaa2d31-ad7e-4cca-89eb-a6ac9c43cf8f",
"value": "1",
"orderIndex": 1,
"score": 1,
"text": "Leichte"
}
]
}
]
},
"score": {
"calculationType": "SUM",
"range": {
"min": {
"value": 0
},
"max": {
"value": 28
}
},
"levels": [
{
"id": "08b5bbb5-9e0f-4249-88f6-546acc342dee",
"range": {
"min": {
"value": 0
},
"max": {
"value": 7
}
},
"label": "Keine klinisch relevante Schlaflosigkeit",
"chartLabel": "0-7 Punkte",
"description": "Gesunder und erholsamer Schlaf...",
"feedback": "Super! Dein Schlaf ist aktuell stabil..."
}
]
}
}
]
}

3. PHQ9 설문 예시

{
"bundleId": "22f11e85-dc3c-4ab4-92b5-2e0717708377",
"language": "de-DE",
"questionnaires": [
{
"id": "c7c46ca0-6e84-4507-bc76-cdfc37c0ee25",
"type": "PHQ9",
"info": {
"title": "Gesundheitsfragebogen für Patient*innen PHQ-9",
"intro": "Die neun Fragen des Gesundheitsfragebogens..."
},
"question": {
"count": 9,
"questions": [
{
"id": "df63205f-de3a-485c-892c-b1232784718e",
"orderIndex": 0,
"type": "SINGLE_CHOICE",
"isRequired": true,
"headline": "Wie oft hast du dich im Verlauf der letzten 2 Wochen...",
"text": "Wenig Interesse oder Freude an deinen Tätigkeiten",
"options": [
{
"id": "7bd8007b-4206-4246-a8b5-50995ac751fe",
"value": "0",
"orderIndex": 0,
"text": "Überhaupt nicht"
},
{
"id": "eab34250-84fb-490f-82a5-30e18321bf7f",
"value": "1",
"orderIndex": 1,
"score": 1,
"text": "An einzelnen Tagen"
}
]
}
]
},
"score": {
"calculationType": "SUM",
"range": {
"min": {
"value": 0
},
"max": {
"value": 27
}
},
"levels": [
{
"id": "1540e4e8-fd3a-4fb8-a069-666cc13c82eb",
"range": {
"min": {
"value": 0
},
"max": {
"value": 4
}
},
"label": "Keine oder minimale depressive Symptome",
"chartLabel": "0-4 Punkte",
"description": "Kein Hinweis auf depressive Symptome...",
"feedback": "Super! Deine Stimmung scheint aktuell stabil..."
}
]
},
"additionalInformationRules": [
{
"id": "225ba942-1059-47bb-89a9-c3b2cc226cf9",
"triggerType": "ANSWER_VALUE",
"questionId": "1f6008e8-3584-4e5b-b4c2-4ae549c39dbf",
"answerValue": "1",
"content": "Falls du dich stark belastet fühlst..."
},
{
"id": "672455c1-08d5-4755-bdfc-c9ee17d824d9",
"triggerType": "SCORE_THRESHOLD",
"minScore": 15,
"content": "Warnhinweis\n\nDeine Antworten deuten darauf hin..."
}
]
}
]
}

4. GAD7 설문 예시

{
"bundleId": "22f11e85-dc3c-4ab4-92b5-2e0717708377",
"language": "de-DE",
"questionnaires": [
{
"id": "cfb4d375-75d8-4331-8c06-b3349c09a994",
"type": "GAD7",
"info": {
"title": "Generalisierte Angststörung Skala (GAD-7)",
"intro": "Die sieben Fragen des GAD-7 dienen der Einschätzung..."
},
"question": {
"count": 7,
"questions": [
{
"id": "780aa807-8e86-431c-85b7-71235384836a",
"orderIndex": 0,
"type": "SINGLE_CHOICE",
"isRequired": true,
"headline": "Wie oft hast du dich im Verlauf der letzten 2 Wochen...",
"text": "Nervosität, Ängstlichkeit oder Anspannung",
"options": [
{
"id": "38e8f989-3866-4d25-959b-d6b105877fc0",
"value": "0",
"orderIndex": 0,
"text": "Überhaupt nicht"
},
{
"id": "88a2c3d4-2aec-455b-a23e-1b73b8596e97",
"value": "1",
"orderIndex": 1,
"score": 1,
"text": "An einzelnen Tagen"
}
]
}
]
},
"score": {
"calculationType": "SUM",
"range": {
"min": {
"value": 0
},
"max": {
"value": 21
}
},
"levels": [
{
"id": "1df23eba-fc79-47f0-9e02-2733a3c76515",
"range": {
"min": {
"value": 0
},
"max": {
"value": 4
}
},
"label": "Keine oder minimale Angstsymptome",
"chartLabel": "0-4 Punkte",
"description": "Kein Hinweis auf Angstsymptome...",
"feedback": "Super! Dein Ergebnis zeigt..."
}
]
}
}
]
}

5. PSS (Perceived Stress Scale) 설문 예시

{
"bundleId": "22f11e85-dc3c-4ab4-92b5-2e0717708377",
"language": "de-DE",
"questionnaires": [
{
"id": "77908d2b-b21d-48a9-9f23-0d39dc8667c9",
"type": "PSS",
"info": {
"title": "Perceived Stress Scale (PSS-10)",
"intro": "Fragebogen zur Erfassung des wahrgenommenen Stresses (PSS-10)"
},
"question": {
"count": 10,
"questions": [
{
"id": "aa94211b-384a-440f-a9d9-61025677746f",
"orderIndex": 0,
"type": "SINGLE_CHOICE",
"isRequired": true,
"headline": "Die folgenden Fragen beschäftigen sich mit...",
"text": "Wie oft warst du im letzten Monat aufgewühlt...",
"options": [
{
"id": "9ea3bcbf-15f5-4bfb-9db7-e9ff03df8595",
"value": "0",
"orderIndex": 0,
"text": "Nie"
},
{
"id": "c90b7368-11ce-40ef-aee6-7e2bd5375b3c",
"value": "1",
"orderIndex": 1,
"score": 1,
"text": "Fast nie"
}
]
},
{
"id": "0cc2faaf-5338-488d-b1be-93e88989e82b",
"orderIndex": 3,
"type": "SINGLE_CHOICE",
"isRequired": true,
"headline": "Die folgenden Fragen beschäftigen sich mit...",
"text": "Wie oft warst du im letzten Monat zuversichtlich...",
"options": [
{
"id": "3af52c9e-ddce-4249-8110-c7d97001ff20",
"value": "0",
"orderIndex": 0,
"score": 4,
"text": "Nie"
},
{
"id": "e95bead7-6167-497b-a72d-1493f6340a02",
"value": "4",
"orderIndex": 4,
"text": "Sehr oft"
}
]
}
]
},
"score": {
"calculationType": "SUM",
"range": {
"min": {
"value": 0
},
"max": {
"value": 40
}
},
"levels": [
{
"id": "90cb7a76-a209-4343-8b55-fe8af09a11d6",
"range": {
"min": {
"value": 0
},
"max": {
"value": 13
}
},
"label": "Geringes Stresslevel",
"chartLabel": "0-13 Punkte",
"description": "Geringes Stresslevel...",
"feedback": "Dein Ergebnis zeigt..."
}
]
}
}
]
}

6. DBAS16 설문 예시

{
"bundleId": "22f11e85-dc3c-4ab4-92b5-2e0717708377",
"language": "de-DE",
"questionnaires": [
{
"id": "ae781d52-5b98-4d49-b0b0-2349b0dbe754",
"type": "DBAS16",
"info": {
"title": "Dysfunktionale Überzeugungen und Einstellungen zum Schlaf (DBAS-16)",
"intro": "Dieser Fragebogen erfasst Ihre Überzeugungen..."
},
"question": {
"count": 16,
"questions": [
{
"id": "03c4c583-e86d-4b04-a4c5-98cd2e4503d9",
"orderIndex": 0,
"type": "LINEAR_SCALE",
"isRequired": true,
"headline": "Du findest im Folgenden einige Aussagen...",
"text": "Ich brauche 8 Stunden Schlaf, um mich erholt zu fühlen...",
"range": {
"min": {
"value": 0,
"label": "Stimme gar nicht zu"
},
"max": {
"value": 10,
"label": "Stimme völlig zu"
}
}
}
]
},
"score": {
"calculationType": "AVERAGE",
"range": {
"min": {
"value": 0
},
"max": {
"value": 10
}
},
"levels": [
{
"id": "efc372e1-0fc3-4e7c-a683-a9dba8c3428a",
"range": {
"min": {
"value": 0
},
"max": {
"value": 3.8
}
},
"label": "Realistische Schlafüberzeugungen",
"chartLabel": "0-≤3.8.Punkte",
"description": "Gesunde Einstellungen zum Schlaf...",
"feedback": "Dein Ergebnis zeigt..."
}
]
}
}
]
}

설문지별 필수 필드 요약

필드 경로WISISIPHQ9GAD7PSSDBAS16
공통 필수 필드
id
type
info
info.title
info.intro
question
question.count
question.questions
question.questions[].id
question.questions[].orderIndex
question.questions[].type
question.questions[].isRequired
question.questions[].text
score
score.calculationTypeCUSTOMSUMSUMSUMSUMAVERAGE
설문별 선택 필드
info.postDescription
question.questions[].headline
question.questions[].description
question.questions[].options
question.questions[].range
question.questions[].options[].score부분
score.range
score.levels
additionalInformationRules

범례:

  • ✅ 필수 존재
  • ❌ 존재하지 않음
  • 부분: 일부 옵션에만 존재 (PSS의 역점수 계산)

QuestionnaireBundleResponseDto 필드 설명

필드타입설명예시필수 (Yes/No)
bundleIdstring번들 IDbundle_welt_001Yes
languagestring응답 언어 (Language Code 참조)de-DEYes
questionnairesQuestionnaireSectionDto[]번들에 포함된 설문지 목록(아래 상세 참조)Yes

QuestionnaireSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring설문지 ID550e8400-e29b-41d4-a716-446655440000Yes
typestring설문지 유형 (QuestionnaireType 참조)ISIYes
infoInfoDto설문지 정보(아래 상세 참조)Yes
questionQuestionSectionDto질문 섹션(아래 상세 참조)Yes
scoreScoreSectionDto점수 섹션(아래 상세 참조)Yes
additionalInformationRulesAdditionalInformationRuleDto[]추가 정보 규칙 목록(아래 상세 참조)No

InfoDto 필드 설명

필드타입설명예시필수 (Yes/No)
titlestring설문지 제목Insomnia Severity IndexYes
introstring설문지 소개이 설문지는 지난 2주 동안의 불면증 심각도를 평가합니다.Yes
postDescriptionstring설문 끝 설명 (선택사항)설문 완료 후 결과를 확인하실 수 있습니다.No

QuestionSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
countinteger질문 수7Yes
questionsQuestionDto[]질문 목록 (includeQuestions=false인 경우 빈 배열)(아래 상세 참조)Yes

ScoreSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
calculationTypestring점수 계산 유형 (ScoreCalculationType 참조)SUMYes
rangeRangeDto점수 범위(아래 상세 참조)No
levelsScoreLevelDto[]점수 구간 목록 (includeScoreLevels=false인 경우 빈 배열)(아래 상세 참조)No

QuestionDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring질문 ID550e8400-e29b-41d4-a716-446655440001Yes
orderIndexinteger정렬 순서1Yes
typestring질문 유형 (QuestionType 참조)SINGLE_CHOICEYes
isRequiredboolean필수 여부trueYes
headlinestring헤드라인 (선택사항)수면 시간No
textstring질문 텍스트지난 2주 동안 잠들기 어려운 정도는?No
descriptionstring질문 설명 (선택사항)해당하는 정도를 선택해주세요.No
optionsQuestionOptionDto[]선택지 목록(아래 상세 참조)No
rangeRangeDto질문 범위 (선택사항)(아래 상세 참조)No

RangeDto 통합 구조 설명

Range 구조는 사용 위치에 따라 두 가지 형태로 제공됩니다:

RangeDto 필드 설명

필드타입설명예시필수 (Yes/No)
minRangeValueDto최소값(아래 상세 참조)Yes
maxRangeValueDto최대값(아래 상세 참조)Yes

RangeValueDto 필드 설명

필드타입설명예시필수 (Yes/No)
valuefloat범위의 숫자값0, 3.8Yes
labelstring해당 값에 대한 설명 라벨 (Question의 range에서만 제공)전혀 없음No

사용 위치별 구조:

1. ScoreLevel의 range (label 없음)

{
"min": { "value": 0 },
"max": { "value": 7 }
}

2. Question의 range (label 포함)

{
"min": { "value": 0, "label": "전혀 없음" },
"max": { "value": 10, "label": "매우 많음" }
}

QuestionOptionDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring선택지 ID550e8400-e29b-41d4-a716-446655440010Yes
valuestring선택지 값0Yes
orderIndexinteger정렬 순서1Yes
scorefloat점수0No
textstring선택지 텍스트전혀 없음No

ScoreLevelDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring점수 구간 ID550e8400-e29b-41d4-a716-446655440020Yes
rangeRangeDto점수 범위(아래 상세 참조)Yes
labelstring라벨 (선택사항)불면 증상이 거의 없음No
chartLabelstring차트 라벨 (선택사항)수면 상태 좋음No
descriptionstring점수 구간 설명 (선택사항)해당 범위는 불면의 증상이 거의 없거나 매우 적은 경우를 나타냅니다.No
feedbackstring피드백 (선택사항)수면에 거의 문제가 없는 편입니다...No

AdditionalInformationRuleDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring규칙 ID550e8400-e29b-41d4-a716-446655440030Yes
triggerTypestring트리거 유형 (AdditionalInfoTriggerType 참조)SCORE_THRESHOLDYes
questionIdstring질문 ID (선택사항, 특정 질문 답변에 따른 트리거인 경우)nullNo
answerValuestring답변 값 (선택사항, 특정 답변에 따른 트리거인 경우)nullNo
minScorefloat최소 점수 (선택사항, 점수 범위에 따른 트리거인 경우)11No
maxScorefloat최대 점수 (선택사항, 점수 범위에 따른 트리거인 경우)21No
presentationTypestring표시 방식 (AdditionalInfoPresentationType 참조)INLINEYes
contentstring콘텐츠수면 전문의와 상담을 권장합니다.Yes
401 Unauthorized - 앱 토큰 인증 실패
{
"code": 2051,
"message": "INVALID_TOKEN",
"detail": "토큰이 유효하지 않습니다"
}
404 Not Found - 요청한 번들을 찾을 수 없음

번들을 찾을 수 없는 경우 (9010)

{
"code": 9010,
"message": "QUESTIONNAIRE_BUNDLE_NOT_FOUND",
"detail": "설문지 번들을 찾을 수 없습니다"
}

이 오류는 QuestionnaireBundleNotFoundError에 해당하며, 요청한 번들 ID에 해당하는 설문지 번들이 존재하지 않을 때 발생합니다.

번역을 찾을 수 없는 경우 (9033)

{
"code": 9033,
"message": "TRANSLATION_NOT_FOUND",
"detail": "요청한 언어의 번역을 찾을 수 없습니다"
}

이 오류는 TranslationNotFoundError에 해당하며, 요청한 언어에 대한 번역 데이터가 존재하지 않을 때 발생합니다.

발생 경로:

  • Controller → Service → Handler → Repository의 모든 계층에서 일관되게 처리됩니다.
  • Repository에서 번들을 찾지 못하면 Handler에서 QuestionnaireBundleNotFoundError를 throw합니다.
  • Repository에서 요청한 언어의 번역을 찾지 못하면 Handler에서 TranslationNotFoundError를 throw합니다.
  • 이 에러들은 Service와 Controller를 거쳐 최종적으로 HTTP 404 응답으로 변환됩니다.
500 Internal Server Error - 서버 내부 오류

일반적인 서버 오류 (9000)

{
"code": 9000,
"message": "SERVER_ERROR",
"detail": "서버 내부 오류"
}

데이터베이스 접근 오류 (9500)

{
"code": 9500,
"message": "REPOSITORY_ERROR",
"detail": "데이터베이스 접근 중 오류가 발생했습니다"
}

이 오류들은 처리 중 예기치 않은 서버 내부 문제나 데이터베이스 접근 문제가 발생했을 때 반환됩니다.

설명

  • 주요 처리 단계 (서비스 로직 내):
    1. 언어 결정: Accept-Language 헤더를 사용하여 응답 언어를 결정합니다. (쿼리 파라미터 language는 더 이상 지원하지 않음)
    2. CQRS 쿼리를 사용하여 번들 조회 (GetQuestionnaireBundleByIdQuery)
    3. 번들 데이터를 응답 DTO로 변환
    4. 옵션에 따른 데이터 필터링 (질문, 점수 구간 포함 여부)
  • 에러 처리:
    • 번들이 존재하지 않는 경우 QuestionnaireBundleNotFoundError를 발생시켜 404 Not Found 응답을 반환합니다.
    • 모든 계층(Controller, Service, Handler, Repository)에서 일관된 에러 처리를 수행합니다.
    • 요청한 언어의 번역이 없는 경우 TranslationNotFoundError가 발생할 수 있습니다.
  • 언어별 번역 처리: 요청된 언어의 번역 데이터가 없는 경우, 첫 번째 사용 가능한 번역 데이터를 사용합니다. 지원되는 언어 코드는 Language Code를 참조하세요.
  • 데이터 필터링: includeQuestionsincludeScoreLevels 파라미터를 통해 응답 데이터의 크기를 조절할 수 있습니다.
  • 점수 계산: 설문지마다 다른 점수 계산 방식(scoreCalculationType)을 지원합니다.
  • 추가 정보 규칙: 점수나 특정 답변에 따라 사용자에게 추가 정보를 제공하는 규칙을 포함합니다.

사용 예시

기본 번들 조회 (모든 데이터 포함)

GET /v1/questionnaires/bundles/bundle_welt_001
Authorization: Bearer {your_app_token}
Accept-Language: de-DE

질문 없이 번들 메타데이터만 조회

GET /v1/questionnaires/bundles/bundle_welt_001?includeQuestions=false&includeScoreLevels=false
Authorization: Bearer {your_app_token}
Accept-Language: en-EN

특정 언어로 번들 조회

GET /v1/questionnaires/bundles/bundle_welt_001
Authorization: Bearer {your_app_token}
Accept-Language: ko-KR

변경 이력

버전날짜작성자변경 내용
0.1.02025-05-28elizabeth@weltcorp.com최초 문서 작성
0.2.02025-06-13elizabeth@weltcorp.com언어 지정 방식 변경: Accept-Language 헤더만 지원, language 쿼리 파라미터 제거 및 문서 설명 수정
0.2.12025-06-16elizabeth@weltcorp.comDTO 구조 변경 반영: InfoDto, QuestionSectionDto, ScoreSectionDto 분리, Range 구조 추가, ScoreLevelDto range 사용
0.2.22025-06-20elizabeth@weltcorp.com숫자 타입 명세 개선: DB 스키마 기준으로 integer/float 타입 명시
0.2.32025-6-21elizabeth@weltcorp.comDTO 통합: QuestionRangeDto와 RangeDto 통합, 재사용성 개선 및 구조 간소화
0.2.42025-06-22elizabeth@weltcorp.comDTO 이름 수정: QuestionnaireDto → QuestionnaireSectionDto, ScoreDto → ScoreSectionDto로 실제 구현과 일치