학사일정 위젯
오늘부터 30일 안의 학부 학사일정을 시작일 순으로 보여 줍니다. 로그인이 필요 없습니다.
요청 파라미터
섹션 제목: “요청 파라미터”필드 이름은 Python snake_case 기준이고, Node.js는 camelCase 객체 인자({ start, end }), Java는 위치 인자입니다. 로그인은 필요 없습니다.
| 메서드 | 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|---|
calendar |
start |
문자열 | 예 | 시작일 (yyyy-MM-dd) |
|
end |
문자열 | 예 | 종료일 (yyyy-MM-dd) |
||
category_code |
문자열 | 아니오 | 0001 |
분류 코드 (0001 학부, 0002~0007 대학원) |
|
graduate_calendar |
site_id |
문자열 | 예 | 대학원 사이트 이름 (예: graduate). 호출하는 쪽이 넘기므로 새 대학원도 릴리스 없이 조회 |
|
year / month |
정수 | 예 | 조회할 연도 / 월 |
응답 데이터 구조
섹션 제목: “응답 데이터 구조”calendar(start, end)가 돌려주는 목록의 한 건입니다. 필드 이름은 Python snake_case이고, Node.js는 camelCase(start_date → startDate), Java는 getter(getStartDate())입니다. 값은 형태를 보여 주기 위한 예시입니다.
[ { "year": "2026", "month": "3", "category_code": "0001", "category_name": "학부", "title": "2학기 중간고사 성적 입력", "title_en": "Grades input for Fall semester Midterm Examination", "start_date": "2026-03-02", "end_date": "2026-03-08", "extra": {} }]| 필드 | 의미 |
|---|---|
title / title_en |
제목 / 영문 제목 (학교 원문) |
start_date / end_date |
시작일 / 종료일 (학부는 yyyy-MM-dd, 하루짜리는 같은 값) |
year / month |
일정이 속한 연도 / 월 |
category_code / category_name |
분류 코드 / 이름 (0001 학부) |
extra |
그 밖의 학교 필드 (학부 일정은 비어 있음) |
전체 필드는 학사일정을 보세요.
실패 시: 학교 서버가 실패하면 예외 없이 마지막 캐시 또는 빈 목록입니다. 일정이 없는 기간과 구분되지 않습니다.
알아둘 점
섹션 제목: “알아둘 점”- 날짜 형식은 학부
yyyy-MM-dd, 대학원 사이트MM.dd로 다릅니다. 학사일정 - 위젯이 열릴 때마다 학교에 요청하지 않습니다. 같은 인자는 24시간 캐시됩니다. 실패 격리와 캐시
- 제목은 학교 원문입니다. 영문 제목은
title_en/titleEn입니다.
예시 코드
섹션 제목: “예시 코드”import java.time.LocalDate;import java.util.List;import kr.suhsaechan.sejongpeia.publicdata.SejongPublicData;import kr.suhsaechan.sejongpeia.publicdata.model.CalendarEvent;
class AcademicCalendarWidget {
static List<CalendarEvent> upcomingAcademicEvents(SejongPublicData publicData, int daysAhead) { LocalDate today = LocalDate.now(); return publicData.calendar(today.toString(), today.plusDays(daysAhead).toString()).stream() .sorted(java.util.Comparator.comparing(CalendarEvent::getStartDate)) .toList(); }}from datetime import date, timedelta
from sejongpeia import SejongPublicData
public_data = SejongPublicData()
def upcoming_academic_events(days_ahead: int = 30) -> list: """오늘부터 days_ahead일 안에 걸쳐 있는 학부 학사일정 (시작일 순)""" today = date.today() events = public_data.calendar(today.isoformat(), (today + timedelta(days=days_ahead)).isoformat()) # 날짜는 학교가 주는 yyyy-MM-dd 문자열이라 문자열 정렬이 날짜 순서와 같음 return sorted(events, key=lambda event: event.start_date)
if __name__ == "__main__": for event in upcoming_academic_events(): period = event.start_date if event.start_date == event.end_date else f"{event.start_date} ~ {event.end_date}" print(f"{period} {event.title}")import { SejongPublicData } from 'pro-sejongpeia';
const publicData = new SejongPublicData();
/** 오늘부터 daysAhead일 안에 걸쳐 있는 학부 학사일정 (시작일 순) */export async function upcomingAcademicEvents(daysAhead = 30) { const toDateText = (date) => date.toLocaleDateString('sv-SE'); // yyyy-MM-dd (로컬 날짜) const today = new Date(); const end = new Date(today.getTime() + daysAhead * 24 * 60 * 60 * 1000); const events = await publicData.calendar({ start: toDateText(today), end: toDateText(end) }); // 날짜는 학교가 주는 yyyy-MM-dd 문자열이라 문자열 정렬이 날짜 순서와 같음 return events.sort((first, second) => first.startDate.localeCompare(second.startDate));}
for (const event of await upcomingAcademicEvents()) { const period = event.startDate === event.endDate ? event.startDate : `${event.startDate} ~ ${event.endDate}`; console.log(`${period} ${event.title}`);}