개설강좌
학기별 개설강좌를 학과 코드, 과목명, 교수명으로 검색합니다. 로그인이 필요 없고, 세 조건이 모두 선택이라 모두 비우면 그 학기 전체를 받습니다. 학과와 학기 코드는 학과·학기 코드로 확인하세요. 공통 규칙은 공통 규칙입니다.
요청 파라미터
섹션 제목: “요청 파라미터”Python은 snake_case, Node.js와 Java는 camelCase입니다 (예: department_code > departmentCode). Java는 선택 인자도 빈 문자열("")로 직접 넘깁니다.
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
category_code |
문자열 | 필수 | - | 소속 분류 코드 (학부 20, 일반대학원 30 등). 값은 코드표에서 받아 넘깁니다 |
year |
문자열 | 필수 | - | 연도 |
semester_code |
문자열 | 필수 | - | 학기 코드 (10, 11, 20, 21) |
department_code |
문자열 | 선택 | "" |
학과 코드. 비우면 학과 제한 없음 |
course_name |
문자열 | 선택 | "" |
과목명 검색어 (부분 일치). 비우면 제한 없음 |
instructor_name |
문자열 | 선택 | "" |
교수명 검색어. 비우면 제한 없음 |
- 세 조건은 서로 독립이며 원하는 것만 조합합니다. 셋 모두 비우면 그 학기 전체입니다.
- 반환은
Lecture목록입니다.
학교 요청
POST https://sjpt.sejong.ac.kr/sch/sch/ext/SueOpenTimeQ/doList.do, 본문{"dm_search": {...}}, 응답 데이터셋dl_main.- 학교는 필터 키가 하나라도 빠지면
_SUBMIT_ERROR_로 답하므로, 라이브러리가 사용하지 않는 키도 빈 값으로 모두 채워 보냅니다. - 공백 한 칸도 검색어로 받으므로 값은 앞뒤 공백을 지운 뒤 보냅니다.
응답 데이터 구조
섹션 제목: “응답 데이터 구조”예시 JSON입니다. 필드 이름은 Python snake_case이고 Node.js와 Java는 camelCase입니다. 학교 데이터는 바뀌므로 값은 예시입니다.
[ { "course_number": "011839", "section": "001", "name": "전공탐색", "course_type_code": "1E", "course_type_name": "공필", "credits": "1.0", "hours": "1.0 / 0 / 1", "total_hours": "1", "schedule": "목19:00-20:00", "room": "센B104", "instructor": "홍길동", "grade_level": "1", "department_code": "3517", "department_name": "AI로봇학과", "year": "2026", "semester_code": "20", "extra": { "PLAN_REG_YN": "Y", "YEAR_SMT_NM": "2026/2학기" } }]모든 필드는 문자열이고 없으면 빈 문자열입니다. extra는 위 표에 쓰지 않은 학교 필드를 담은 문자열 맵입니다.
| 필드 | 학교 키 | 설명 |
|---|---|---|
course_number |
CURI_NO |
과목 번호 |
section |
CLASS |
분반 |
name |
CURI_NM |
과목명 |
course_type_code, course_type_name |
CURI_TYPE_CD, CURI_TYPE_CD_NM |
이수 구분 코드와 이름 |
domain_code, domain_name |
SLT_DOMAIN_CD, SLT_DOMAIN_CD_NM |
선택 영역 코드와 이름 |
credits |
CDT |
학점 (예: 3.0) |
hours |
TM_NUM |
시간 (학교 표기 그대로, 예: 3.0 / 3 / 0) |
total_hours |
TOT_TM_NUM |
총 시간 |
schedule |
LESN_TIME |
강의 시간 (예: 화13:00-15:00) |
room |
LESN_ROOM |
강의실 |
instructor |
LESN_EMP |
교수 이름 |
grade_level |
STUDENT_YEAR |
학년 |
language_code, language_name |
CURI_LANG_CD, CURI_LANG_NM |
강의 언어 |
department_code, department_name |
DEPT_CD, SCH_DEPT_ALIAS |
개설 학과 코드와 이름 |
managing_department |
MANAGE_DEPT_NM |
관리 학과 |
remark |
REMARK |
비고 |
year, semester_code |
YEAR, SMT_CD |
연도, 학기 코드 |
extra |
그 밖의 필드 | 학교 원문 필드 |
- 조건 조합마다 하루(기본 86400초) 캐시하고, 호출당 학교 요청은 한 번입니다.
- 학교 쪽 실패(연결, 시간 초과, 비정상 응답,
_SUBMIT_ERROR_)는 마지막 캐시 값 또는 빈 목록입니다. 캐시가 없으면failure_cache_seconds(기본 60초) 동안 요청 없이 빈 목록을 돌려줍니다. lectures는 필터 값 때문에 예외를 던지지 않습니다.- 빈 목록은 「조건에 맞는 강의가 없음」과 「학교 쪽 문제」를 구분하지 못합니다.
알려진 한계
섹션 제목: “알려진 한계”- 비공식 엔드포인트입니다. 필터 키 요구 사항 같은 동작은 학교가 바꾸면 달라집니다.
- 언어 필터는
LANG_CHK="KOR"로 고정해서 보냅니다. - 조건을 모두 비운 응답은 수 MB로 크고 캐시 항목 하나가
cache_ttl_seconds동안 메모리에 남습니다. 전체가 필요하지 않다면 학과 단위로 조회하세요. - 강의 계획서(수업계획서)는 제공하지 않습니다. 양식에 교수 이름과 연락처 줄이 있어 기본 제공 대상에서 뺐습니다. 교과목 개요는 교육과정의
overview로 받을 수 있습니다. - 계약 원본: spec/PUBLIC_DATA.md
예시 코드
섹션 제목: “예시 코드”// 학과 하나의 강의 (학기 코드 20 = 2학기, 과목명·교수명은 비움)List<Department> departments = publicData.departments("20", "2026", "20");List<Lecture> lectures = publicData.lectures("20", "2026", "20", departments.get(0).getCode(), "", "");
// 과목명으로만 검색List<Lecture> byName = publicData.lectures("20", "2026", "20", "", "알고리즘", "");departments = public_data.departments("20", "2026", "20")lectures = public_data.lectures("20", "2026", "20", department_code=departments[0].code)
# 과목명으로만 검색by_name = public_data.lectures("20", "2026", "20", course_name="알고리즘")const departments = await publicData.departments({ categoryCode: '20', year: '2026', semesterCode: '20' });const lectures = await publicData.lectures({ categoryCode: '20', year: '2026', semesterCode: '20', departmentCode: departments[0].code });
// 과목명으로만 검색const byName = await publicData.lectures({ categoryCode: '20', year: '2026', semesterCode: '20', courseName: '알고리즘' });강의의 course_number와 department_code로 그 학과 교육과정의 학년·학기·교과목 개요를 이어서 조회할 수 있습니다 (교육과정).
