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

최신 학습 콘텐츠 번들 조회 API

최신 학습 콘텐츠 번들 조회 API는 가장 최신 버전의 학습 콘텐츠 번들 정보를 조회하는 기능을 제공합니다. 번들에는 세션, 레슨, 퀴즈가 포함되며, 언어별 번역 데이터와 함께 제공됩니다.

최신 번들 조회

가장 최신 버전의 학습 콘텐츠 번들을 자동으로 조회하여 설정된 언어에 따라 번역된 데이터를 반환합니다. 번들은 사용자의 캐싱 최적화를 위해 설계되어 있으며, 앱은 번들 ID 기반으로 콘텐츠를 효율적으로 관리할 수 있습니다.

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

Headers

HeaderTypeDescriptionRequired
AuthorizationBearer {appToken}App 토큰을 통한 인증Yes
Accept-Languagestring응답 언어 지정 (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)
bundleIdstring번들 IDbfc82be1-3b4f-4db2-8518-d9d37f0b2301Yes
languagestring응답 언어 (Language Code 참조)ko-KRYes
sessionsLatestSessionSectionDto[]세션 및 레슨 정보 배열(아래 상세 참조)Yes
quizzesLatestQuizSectionDto[]퀴즈 정보 배열(아래 상세 참조)Yes

LatestSessionSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring세션 IDsession_101Yes
namestring세션 이름 (예: 레슨 01)레슨 01Yes
titlestring세션 제목 (예: 수면 입문)수면 입문Yes
orderIndexinteger세션 순서0Yes
lessonsLatestLessonSectionDto[]세션에 속한 레슨 목록(아래 상세 참조)Yes

LatestLessonSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
labelinteger치료 프로그램의 권장 수강 일차 (번들 내 모든 레슨에서 고유값, 불변값)1Yes
idstring레슨 IDlesson_101Yes
titlestring레슨 제목수면의 중요성 이해하기Yes
jsonUrlstring레슨 콘텐츠 JSON URLcontent_json_url_101Yes
orderIndexinteger세션 내 레슨 순서0Yes

LatestQuizSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring퀴즈 IDquiz_001Yes
typestring퀴즈 타입 (Quiz Type 참조)SINGLE_CHOICEYes
questionstring퀴즈 질문건강한 수면 주기에서 렘수면이 차지하는 비율은 얼마인가요?Yes
optionsLatestQuizOptionSectionDto[]퀴즈 선택지(아래 상세 참조)Yes
explanationstring해설건강한 성인의 수면 주기에서 렘수면은 총 수면 시간의 약 20-25%를 차지합니다.Yes
relatedLessonIdstring관련 레슨 IDlesson_124Yes

LatestQuizOptionSectionDto 필드 설명

필드타입설명예시필수 (Yes/No)
idstring옵션 IDoption_1Yes
valuestring옵션 값1Yes
isCorrectValueboolean정답 여부trueYes
orderIndexinteger옵션 순서0Yes
textstring옵션 텍스트약 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일 프로그램에서 권장되는 일차
  • quizzes: 학습 내용 복습을 위한 퀴즈 배열
    • options: 각 퀴즈의 선택지
      • isCorrectValue: 정답 여부 (boolean)

캐싱 고려사항

  • 클라이언트는 bundleId를 기준으로 응답을 캐싱할 수 있습니다
  • 번들 버전이 업데이트되면 새로운 bundleId가 생성되므로 캐시 무효화가 자동으로 처리됩니다
  • 동일한 bundleId에 대해서는 안전하게 캐시된 데이터를 사용할 수 있습니다

변경 이력

버전날짜작성자변경 내용
1.1.02025-07-10elizabeth@weltcorp.comlabel 필드 우선순위 변경 및 독일어 응답 예시 제거
1.0.02025-07-10elizabeth@weltcorp.com최초 문서 작성