DataGSM OpenAPI SDK Python

개요

DataGSM OpenAPI SDK Python은 DataGSM API를 Python 애플리케이션에서 쉽고 안전하게 사용할 수 있도록 설계된 공식 클라이언트 SDK입니다.

이 SDK를 사용하면 복잡한 HTTP 요청을 직접 작성할 필요 없이, 타입 안전한 인터페이스를 통해 학생, 동아리, 프로젝트, NEIS 데이터에 접근할 수 있습니다.

주요 특징

특징설명
타입 안전성타입 힌트를 통해 IDE 자동완성과 정적 타입 검사를 지원합니다.
Pydantic 검증Pydantic v2를 통한 자동 데이터 검증 및 직렬화를 제공합니다.
dataclass 기반직관적이고 유연한 API 요청 구성을 지원합니다.
자동 리소스 관리Context manager를 통해 리소스 누수를 자동으로 방지합니다.
구체적인 예외 처리HTTP 상태 코드별 전용 예외 타입을 제공하여 정확한 에러 핸들링이 가능합니다.
검증된 HTTP 클라이언트httpx 기반으로 안정적이고 효율적인 통신을 보장합니다.

시스템 요구사항

항목최소 버전권장 버전
Python3.93.12 이상
httpx0.27.0최신 버전
Pydantic2.0.0최신 버전

설치

프로젝트 패키지 관리자에 맞는 명령어를 사용하세요.

pip install datagsm-openapi-sdk

빠른 시작

1. 클라이언트 초기화

먼저 DataGsmClient 인스턴스를 생성합니다. API 키는 필수 파라미터입니다.

from datagsm_openapi import DataGsmClient

# 기본 설정으로 클라이언트 생성
with DataGsmClient(api_key="your-api-key-here") as client:
    # API 사용
    pass

# 커스텀 Base URL 설정 (선택사항)
with DataGsmClient(
    api_key="your-api-key-here",
    base_url="https://api.datagsm.com"
) as client:
    # API 사용
    pass

2. API 호출 예제

클라이언트를 생성한 후, 다양한 API를 호출할 수 있습니다.

학생 데이터 조회

from datagsm_openapi import DataGsmClient
from datagsm_openapi.api.student import StudentRequest

# 요청 파라미터 설정
request = StudentRequest(
    grade=1,  # 1학년
    class_num=1,  # 1반
    page=0,  # 첫 번째 페이지
    size=50  # 페이지당 50명
)

with DataGsmClient(api_key="your-api-key") as client:
    # API 호출
    response = client.students.get_students(request)

    # 결과 처리
    for student in response.students:
        print(f"{student.name} - {student.email}")

급식 데이터 조회

from datagsm_openapi import DataGsmClient
from datagsm_openapi.api.neis import MealRequest
from datetime import date

# 오늘 날짜의 급식 조회
request = MealRequest(date=date.today())

with DataGsmClient(api_key="your-api-key") as client:
    meals = client.neis.get_meals(request)

    # 급식 데이터 출력
    for meal in meals:
        print(f"{meal.meal_type}:")
        for menu in meal.meal_menu:
            print(f" - {menu}")

API 레퍼런스

SDK는 다음과 같은 API 클라이언트를 제공합니다.

학생 API

client.students - 학생 데이터 조회 및 관리

메서드설명반환 타입
get_students(request)조건에 맞는 학생 목록 조회StudentResponse
get_student(id)특정 학생의 상세 데이터 조회Student
# 학생 목록 조회
students = client.students.get_students(request)

# 특정 학생 조회
student = client.students.get_student(1)

동아리 API

client.clubs - 동아리 데이터 조회 및 관리

메서드설명반환 타입
get_clubs(request)조건에 맞는 동아리 목록 조회ClubResponse
get_club(id)특정 동아리의 상세 데이터 조회ClubDetail
# 동아리 목록 조회
clubs = client.clubs.get_clubs(request)

# 특정 동아리 조회
club = client.clubs.get_club(1)

프로젝트 API

client.projects - 프로젝트 데이터 조회 및 관리

메서드설명반환 타입
get_projects(request)조건에 맞는 프로젝트 목록 조회ProjectResponse
get_project(id)특정 프로젝트의 상세 데이터 조회Project
# 프로젝트 목록 조회
projects = client.projects.get_projects(request)

# 특정 프로젝트 조회
project = client.projects.get_project(1)

NEIS API

client.neis - 나이스 교육정보시스템 데이터 조회

메서드설명반환 타입
get_meals(request)급식 데이터 조회list[Meal]
get_schedules(request)학사일정 조회list[Schedule]
# 급식 데이터 조회
meals = client.neis.get_meals(request)

# 학사일정 조회
schedules = client.neis.get_schedules(request)

예외 처리

SDK는 HTTP 상태 코드별로 구체적인 예외 타입을 제공합니다.

예외 종류

예외 타입HTTP 상태발생 상황권장 처리 방법
UnauthorizedException401API 키 유효하지 않음 또는 만료API 키 갱신 또는 재발급
ForbiddenException403필요한 권한 범위 부족권한 범위 확인 및 요청
BadRequestException400잘못된 요청 파라미터요청 파라미터 검증
RateLimitException429Rate limit 초과재시도 로직 구현 (Exponential Backoff)
ServerErrorException500서버 내부 오류잠시 후 재시도 또는 관리자 문의
DataGsmException기타기타 API 오류에러 메시지 확인 후 적절한 처리

예외 처리 예제

import logging
from datagsm_openapi import DataGsmClient
from datagsm_openapi.exceptions import (
    UnauthorizedException,
    ForbiddenException,
    RateLimitException,
    BadRequestException,
    ServerErrorException,
    DataGsmException
)

logger = logging.getLogger(__name__)

try:
    with DataGsmClient(api_key="your-api-key") as client:
        students = client.students.get_students(request)
        # 성공적인 응답 처리
except UnauthorizedException as e:
    # API 키 갱신 필요
    logger.error("API key expired or invalid", exc_info=e)
    renew_api_key()
except ForbiddenException as e:
    # 권한 범위 부족
    logger.warning("Insufficient permissions", exc_info=e)
    notify_user_about_permissions()
except RateLimitException as e:
    # Rate limit 초과 - 적절한 재시도 로직 구현 필요
    logger.warning("Rate limit exceeded", exc_info=e)
    # 실제로는 exponential backoff 등의 재시도 전략 구현 권장
except BadRequestException as e:
    # 잘못된 요청 파라미터
    logger.error(f"Invalid request parameters: {e.message}")
    validate_parameters()
except ServerErrorException as e:
    # 서버 오류
    logger.error("Server error occurred", exc_info=e)
    notify_admin()
except DataGsmException as e:
    # 기타 예외
    logger.error(f"API error: {e.message}", exc_info=e)

리소스 관리

SDK는 Context manager를 구현하여 자동 리소스 정리를 지원합니다.

with문 사용

# with문을 사용한 자동 리소스 관리
with DataGsmClient(api_key="your-api-key") as client:
    students = client.students.get_students(request)
    # 클라이언트 사용
# 블록이 끝나면 자동으로 리소스 정리

Python 웹 프레임워크에서 사용하기

Python 웹 프레임워크에서 DataGsmClient를 사용하는 방법입니다.

의존성 설정

from fastapi import FastAPI, Depends
from datagsm_openapi import DataGsmClient
from datagsm_openapi.api.student import StudentRequest
from functools import lru_cache
from typing import Annotated
import os

app = FastAPI()

@lru_cache
def get_datagsm_client() -> DataGsmClient:
  """DataGSM 클라이언트 싱글톤"""
  api_key = os.getenv("DATAGSM_API_KEY")
  if not api_key:
      raise ValueError("DATAGSM_API_KEY 환경 변수가 설정되지 않았습니다")
  return DataGsmClient(api_key=api_key)

# 타입 별칭 정의
DataGsmClientDep = Annotated[DataGsmClient, Depends(get_datagsm_client)]

@app.get("/students")
def get_students(
  grade: int,
  class_num: int,
  client: DataGsmClientDep
):
  """학생 목록 조회 API"""
  request = StudentRequest(grade=grade, class_num=class_num)
  response = client.students.get_students(request)
  return {"students": response.students}

@app.on_event("shutdown")
def shutdown_event():
  """애플리케이션 종료 시 리소스 정리"""
  client = get_datagsm_client()
  client.close()

환경 변수 설정

export DATAGSM_API_KEY="your-api-key-here"
export DATAGSM_BASE_URL="https://openapi.data.hellogsm.kr"  # 선택사항

일반 Python 프로젝트에서 사용하기

프레임워크를 사용하지 않는 일반 Python 애플리케이션에서는 직접 클라이언트를 생성하여 사용합니다.

전체 예제

from datagsm_openapi import DataGsmClient
from datagsm_openapi.api.student import StudentRequest
from datagsm_openapi.api.neis import MealRequest
from datagsm_openapi.exceptions import (
    UnauthorizedException,
    RateLimitException,
    DataGsmException
)
from datetime import date

def main():
    # with문으로 자동 리소스 관리
    try:
        with DataGsmClient(api_key="your-api-key-here") as client:

            # 학생 데이터 조회
            students_response = client.students.get_students(
                StudentRequest(grade=1, class_num=1, size=10)
            )

            # 결과 출력
            for student in students_response.students:
                print(f"{student.name} ({student.student_number}) - {student.email}")

            # 급식 데이터 조회
            meals = client.neis.get_meals(
                MealRequest(date=date.today())
            )

            # 급식 출력
            for meal in meals:
                print(f"{meal.meal_type}:")
                for menu in meal.meal_menu:
                    print(f"  - {menu}")

    except UnauthorizedException as e:
        print("인증 오류: API 키가 유효하지 않습니다.")
        print(e)
    except RateLimitException as e:
        print("요청 제한 초과: 잠시 후 다시 시도해주세요.")
        print(e)
    except DataGsmException as e:
        print(f"API 오류 발생: {e.message}")
        print(e)
    except Exception as e:
        print(f"예상치 못한 오류 발생: {e}")
        raise

if __name__ == "__main__":
    main()

보안

API 키 관리

API 키는 민감한 데이터이므로 절대 코드에 직접 하드코딩하지 마세요. 환경 변수나 설정 파일을 통해 안전하게 관리하세요.

환경 변수 사용 (권장)

import os
from datagsm_openapi import DataGsmClient

def main():
    # 환경 변수에서 API 키 로드
    api_key = os.getenv("DATAGSM_API_KEY")

    if not api_key:
        raise ValueError("환경 변수 DATAGSM_API_KEY가 설정되지 않았습니다.")

    with DataGsmClient(api_key=api_key) as client:
        # API 사용
        pass

if __name__ == "__main__":
    main()

환경 변수 설정 방법

Linux/macOS

export DATAGSM_API_KEY="your-api-key-here"
python main.py

Windows (PowerShell)

$env:DATAGSM_API_KEY="your-api-key-here"
python main.py

문제 해결

자주 발생하는 문제

401 Unauthorized 오류

원인: API 키가 유효하지 않거나 만료됨

해결 방법:

  • API 키가 올바르게 설정되었는지 확인
  • API 키가 만료되지 않았는지 확인
  • 필요시 새로운 API 키 발급

403 Forbidden 오류

원인: 요청한 API에 대한 권한 범위 부족

해결 방법:

  • API 키의 권한 범위 확인
  • 필요한 권한 범위가 부여되었는지 확인
  • 권한 범위 추가가 필요한 경우 관리자에게 문의

추가 리소스

문의사항이나 버그 리포트는 GitHub Issues를 통해 제출해 주세요.