설문 구성
설문 정의는 survey.json의 surveys 목록에서 읽습니다. 현행 구성은 설문 아래에 sessions → screens → questions를 두며, 과거 screens 직접 배치 형식도 호환 경로로 남아 있습니다.
질문에는 안정적인 id, type, label을 지정합니다. 슬라이더 범위와 선택지, 필수 응답 여부를 문항별로 구성합니다. 문항 ID를 바꾸면 응답 데이터 해석에도 영향을 줄 수 있습니다.
최소 설문 예제
다음은 survey.json 형식의 설명용 예제입니다. 기존 연구 파일을 통째로 대체하는 용도가 아닙니다.
{
"surveys": [{
"id": "demo-mood",
"title": "기분 확인",
"sessions": [{
"id": "demo-session",
"screens": [{
"id": "demo-screen",
"questions": [{
"id": "mood",
"type": "slider",
"label": "지금 기분은 어떤가요?",
"required": true,
"min": 0,
"max": 10
}]
}]
}]
}]
}
필수 응답과 분기
question.required와 화면의 required·skippable은 다른 설정입니다. 질문의 필수 여부만으로 화면 건너뛰기까지 결정하지 않습니다. 선택지의 skipScreens는 응답에 따라 건너뛸 화면 ID를 지정합니다. 분기 후 도달하는 화면과 완료 상태를 실제 연구용 앱에서 확인하세요.
슬라이더, 단일 선택, 다중 선택, 입력·날짜/시간·음성 등 질문 유형의 정확한 문자열과 지원 속성은 현재 모델 및 렌더러를 기준으로 사용해야 합니다. 임의의 질문 유형 이름을 추가하면 렌더링이 보장되지 않습니다.
응답 저장
제출은 SurveyResponseSubmitter 경계를 통해 앱의 제출 구현으로 전달됩니다. 응답은 Room의 survey_response_records에 저장되며 surveyId, 소유자, 제출 시각, bundleJson, syncState, dedupeKey 등을 포함합니다.
동일 회차의 제출은 별도 새 응답을 무조건 추가하는 방식이 아닙니다. 현재 구현은 회차 또는 슬롯을 기준으로 응답 ID와 중복 키를 결정합니다. 시간 제한이 있는 설문은 제출 시점의 응답 가능 여부도 검사합니다.