최신 학습 콘텐츠 번들 조회 API
최신 학습 콘텐츠 번들 조회 API는 가장 최신 버전의 학습 콘텐츠 번들 정보를 조회하는 기능을 제공합니다. 번들에는 세션, 레슨, 퀴즈가 포함되며, 언어별 번역 데이터와 함께 제공됩니다.
최신 번들 조회
가장 최신 버전의 학습 콘텐츠 번들을 자동으로 조회하여 설정된 언어에 따라 번역된 데이터를 반환합니다. 번들은 사용자의 캐싱 최적화를 위해 설계되어 있으며, 앱은 번들 ID 기반으로 콘텐츠를 효율적으로 관리할 수 있습니다.
- HTTP Method:
GET - Path:
/v1/learning/bundles/latest - 인증: App Token 필요 (Authorization: Bearer
{appToken})
Headers
| Header | Type | Description | Required |
|---|---|---|---|
Authorization | Bearer {appToken} | App 토큰을 통한 인증 | Yes |
Accept-Language | string | 응답 언어 지정 (Language Code 참조, 예: de-DE, en-US, ko-KR) | Yes |
Responses
| HTTP Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 번들 조회 성공 | - |
404 Not Found | 활성 번들을 찾을 수 없음 | 11001 |
401 Unauthorized | 앱 토큰 인증 실패 | 2051 |
500 Internal Server Error | 서버 내부 오류 | 11000 |
200 OK - 번들 조회 성공
성공적으로 최신 번들을 조회하면 LatestLearningBundleResponseDto에 정의된 번들 정보가 반환됩니다. 여기에는 번들 ID, 언어 설정, 그리고 번들에 포함된 세션, 레슨, 퀴즈 목록이 포함됩니다.
최신 번들 응답 예시
{
"bundleId": "bfc82be1-3b4f-4db2-8518-d9d37f0b2301",
"language": "ko-KR",
"sessions": [
{
"id": "8240c09e-6bdd-4dd7-883c-092cdf8c3dba",
"name": "Lesson 1",
"title": "Basics",
"orderIndex": 0,
"lessons": [
{
"label": 1,
"id": "c91676eb-7b8c-4296-8f51-15de14d3dc4f",
"title": "What to expect in the next 3 months",
"jsonUrl": "https://www.json_01.com/",
"orderIndex": 0
},
{
"label": 2,
"id": "a0561383-717b-47f9-a548-1149106eb1c0",
"title": "The Sleep Diary",
"jsonUrl": "https://www.json_02.com/",
"orderIndex": 1
},
{
"label": 3,
"id": "9326371d-edb3-4738-b026-5cc8e1738d8c",
"title": "Sleep Diary: How it works",
"jsonUrl": "https://www.json_03.com/",
"orderIndex": 2
}
]
},
{
"id": "eb4a8e72-d90d-45c4-8eab-5fcbf3808eee",
"name": "Lesson 2",
"title": "Stress Management",
"orderIndex": 1,
"lessons": [
{
"id": "7a46a64b-8445-4e9c-82f0-2048a4045dfe",
"title": "Stress and Relaxation",
"jsonUrl": "https://www.json_11.com/",
"orderIndex": 10,
"label": 11
}
]
}
],
"quizzes": [
{
"id": "quiz_001",
"type": "SINGLE_CHOICE",
"question": "건강한 수면 주기에서 렘수면이 차지하는 비율은 얼마인가요?",
"options": [
{
"id": "option_1",
"value": "1",
"isCorrectValue": false,
"orderIndex": 0,
"text": "약 5-10%"
},
{
"id": "option_2",
"value": "2",
"isCorrectValue": true,
"orderIndex": 1,
"text": "약 20-25%"
},
{
"id": "option_3",
"value": "3",
"isCorrectValue": false,
"orderIndex": 2,
"text": "약 40-50%"
},
{
"id": "option_4",
"value": "4",
"isCorrectValue": false,
"orderIndex": 3,
"text": "약 70-80%"
}
],
"explanation": "건강한 성인의 수면 주기에서 렘수면은 총 수면 시간의 약 20-25%를 차지합니다.",
"relatedLessonId": "lesson_124"
},
{
"id": "quiz_002",
"type": "TRUE_FALSE",
"question": "수면 부족은 면역 시스템을 약화시킬 수 있습니다.",
"options": [
{
"id": "option_true",
"value": "TRUE",
"isCorrectValue": true,
"orderIndex": 0,
"text": "참"
},
{
"id": "option_false",
"value": "FALSE",
"isCorrectValue": false,
"orderIndex": 1,
"text": "거짓"
}
],
"explanation": "연구에 따르면 충분하지 않은 수면은 면역 시스템의 기능을 저하시켜 감염에 대한 저항력을 약화시킵니다.",
"relatedLessonId": "lesson_123"
}
]
}
LatestLearningBundleResponseDto 필드 설명
| 필드 | 타입 | 설명 | 예시 | 필수 (Yes/No) |
|---|---|---|---|---|
bundleId | string | 번들 ID | bfc82be1-3b4f-4db2-8518-d9d37f0b2301 | Yes |
language | string | 응답 언어 (Language Code 참조) | ko-KR | Yes |
sessions | LatestSessionSectionDto[] | 세션 및 레슨 정보 배열 | (아래 상세 참조) | Yes |
quizzes | LatestQuizSectionDto[] | 퀴즈 정보 배열 | (아래 상세 참조) | Yes |
LatestSessionSectionDto 필드 설명
| 필드 | 타입 | 설명 | 예시 | 필수 (Yes/No) |
|---|---|---|---|---|
id | string | 세션 ID | session_101 | Yes |
name | string | 세션 이름 (예: 레슨 01) | 레슨 01 | Yes |
title | string | 세션 제목 (예: 수면 입문) | 수면 입문 | Yes |
orderIndex | integer | 세션 순서 | 0 | Yes |
lessons | LatestLessonSectionDto[] | 세션에 속한 레슨 목록 | (아래 상세 참조) | Yes |
LatestLessonSectionDto 필드 설명
| 필드 | 타입 | 설명 | 예시 | 필수 (Yes/No) |
|---|---|---|---|---|
label | integer | 치료 프로그램의 권장 수강 일차 (번들 내 모든 레슨에서 고유값, 불변값) | 1 | Yes |
id | string | 레슨 ID | lesson_101 | Yes |
title | string | 레슨 제목 | 수면의 중요성 이해하기 | Yes |
jsonUrl | string | 레슨 콘텐츠 JSON URL | content_json_url_101 | Yes |
orderIndex | integer | 세션 내 레슨 순서 | 0 | Yes |
LatestQuizSectionDto 필드 설명
| 필드 | 타입 | 설명 | 예시 | 필수 (Yes/No) |
|---|---|---|---|---|
id | string | 퀴즈 ID | quiz_001 | Yes |
type | string | 퀴즈 타입 (Quiz Type 참조) | SINGLE_CHOICE | Yes |
question | string | 퀴즈 질문 | 건강한 수면 주기에서 렘수면이 차지하는 비율은 얼마인가요? | Yes |
options | LatestQuizOptionSectionDto[] | 퀴즈 선택지 | (아래 상세 참조) | Yes |
explanation | string | 해설 | 건강한 성인의 수면 주기에서 렘수면은 총 수면 시간의 약 20-25%를 차지합니다. | Yes |
relatedLessonId | string | 관련 레슨 ID | lesson_124 | Yes |
LatestQuizOptionSectionDto 필드 설명
| 필드 | 타입 | 설명 | 예시 | 필수 (Yes/No) |
|---|---|---|---|---|
id | string | 옵션 ID | option_1 | Yes |
value | string | 옵션 값 | 1 | Yes |
isCorrectValue | boolean | 정답 여부 | true | Yes |
orderIndex | integer | 옵션 순서 | 0 | Yes |
text | string | 옵션 텍스트 | 약 5-10% | Yes |
404 Not Found - 활성 번들을 찾을 수 없음
활성 상태인 최신 번들이 존재하지 않는 경우 반환됩니다.
{
"code": 11001,
"message": "LEARNING_BUNDLE_NOT_FOUND",
"detail": "활성 상태인 학습 번들을 찾을 수 없습니다"
}
401 Unauthorized - 앱 토큰 인증 실패
유효하지 않은 앱 토큰이 제공되었거나 토큰이 만료된 경우 반환됩니다.
{
"code": 2051,
"message": "INVALID_APP_TOKEN",
"detail": "유효하지 않은 앱 토큰입니다."
}
500 Internal Server Error - 서버 내부 오류
데이터베이스 연결 실패 등 서버 내부 오류가 발생한 경우 반환됩니다.
{
"code": 11000,
"message": "SERVER_ERROR",
"detail": "서버 내부 오류"
}
주요 특징
자동 최신 번들 선택
- 현재 활성 상태인 가장 최신 버전의 번들을 자동으로 선택합니다
- 별도의 번들 ID를 지정할 필요가 없어 클라이언트 구현이 간소화됩니다
- 새로운 번들이 배포되면 자동으로 최신 버전으로 응답됩니다
고정 옵션
- 학습 콘텐츠의 일관성을 위해 다음 옵션들이 고정적으로 적용됩니다:
includeLessons = true: 항상 레슨 정보 포함includeQuizzes = true: 항상 퀴즈 정보 포함includeMedia = false: 미디어 정보는 제외
다국어 지원
Accept-Language헤더를 통해 원하는 언어로 번역된 콘텐츠를 받을 수 있습니다- 지원 언어: 독일어(de-DE), 한국어(ko-KR), 영어(en-US)
- 요청한 언어의 번역이 없는 경우 기본 언어(독일어)로 대체됩니다
응답 구조
- bundleId: 현재 활성 번들의 고유 식별자
- language: 요청된 응답 언어
- sessions: 세션 및 포함된 레슨 정보 배열
- lessons: 각 세션에 속한 레슨들의 상세 정보
- jsonUrl: 레슨 콘텐츠 JSON의 URL (DB의
content필드에서 매핑) - label: 45일 프로그램에서 권장되는 일차
- jsonUrl: 레슨 콘텐츠 JSON의 URL (DB의
- lessons: 각 세션에 속한 레슨들의 상세 정보
- quizzes: 학습 내용 복습을 위한 퀴즈 배열
- options: 각 퀴즈의 선택지
- isCorrectValue: 정답 여부 (boolean)
- options: 각 퀴즈의 선택지
캐싱 고려사항
- 클라이언트는
bundleId를 기준으로 응답을 캐싱할 수 있습니다 - 번들 버전이 업데이트되면 새로운
bundleId가 생성되므로 캐시 무효화가 자동으로 처리됩니다 - 동일한
bundleId에 대해서는 안전하게 캐시된 데이터를 사용할 수 있습니다
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 1.1.0 | 2025-07-10 | elizabeth@weltcorp.com | label 필드 우선순위 변경 및 독일어 응답 예시 제거 |
| 1.0.0 | 2025-07-10 | elizabeth@weltcorp.com | 최초 문서 작성 |