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 기반으로 안정적이고 효율적인 통신을 보장합니다. |
시스템 요구사항
| 항목 | 최소 버전 | 권장 버전 |
|---|---|---|
| Python | 3.9 | 3.12 이상 |
| httpx | 0.27.0 | 최신 버전 |
| Pydantic | 2.0.0 | 최신 버전 |
설치
프로젝트 패키지 관리자에 맞는 명령어를 사용하세요.
pip install datagsm-openapi-sdkuv pip install datagsm-openapi-sdkpoetry add 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 사용
pass2. 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 상태 | 발생 상황 | 권장 처리 방법 |
|---|---|---|---|
UnauthorizedException | 401 | API 키 유효하지 않음 또는 만료 | API 키 갱신 또는 재발급 |
ForbiddenException | 403 | 필요한 권한 범위 부족 | 권한 범위 확인 및 요청 |
BadRequestException | 400 | 잘못된 요청 파라미터 | 요청 파라미터 검증 |
RateLimitException | 429 | Rate limit 초과 | 재시도 로직 구현 (Exponential Backoff) |
ServerErrorException | 500 | 서버 내부 오류 | 잠시 후 재시도 또는 관리자 문의 |
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()from flask import Flask, request, jsonify
from datagsm_openapi import DataGsmClient
from datagsm_openapi.api.student import StudentRequest
import os
app = Flask(__name__)
# 전역 클라이언트 (애플리케이션 생명주기 동안 유지)
datagsm_client = None
@app.before_first_request
def init_client():
"""첫 요청 전에 클라이언트 초기화"""
global datagsm_client
api_key = os.getenv("DATAGSM_API_KEY")
if not api_key:
raise ValueError("DATAGSM_API_KEY 환경 변수가 설정되지 않았습니다")
datagsm_client = DataGsmClient(api_key=api_key)
@app.teardown_appcontext
def shutdown_client(exception=None):
"""애플리케이션 종료 시 리소스 정리"""
global datagsm_client
if datagsm_client:
datagsm_client.close()
@app.route("/students")
def get_students():
"""학생 목록 조회 API"""
grade = request.args.get("grade", type=int)
class_num = request.args.get("class_num", type=int)
req = StudentRequest(grade=grade, class_num=class_num)
response = datagsm_client.students.get_students(req)
return jsonify({
"students": [s.model_dump() for s in response.students]
})
if __name__ == "__main__":
app.run()# settings.py
import os
from datagsm_openapi import DataGsmClient
# DataGSM 클라이언트 설정
DATAGSM_API_KEY = os.getenv("DATAGSM_API_KEY")
DATAGSM_BASE_URL = os.getenv("DATAGSM_BASE_URL", "https://openapi.data.hellogsm.kr")
# views.py
from django.http import JsonResponse
from django.conf import settings
from datagsm_openapi import DataGsmClient
from datagsm_openapi.api.student import StudentRequest
# 클라이언트를 모듈 레벨에서 초기화 (재사용)
_datagsm_client = None
def get_datagsm_client():
"""DataGSM 클라이언트 가져오기 (싱글톤)"""
global _datagsm_client
if _datagsm_client is None:
_datagsm_client = DataGsmClient(
api_key=settings.DATAGSM_API_KEY,
base_url=settings.DATAGSM_BASE_URL
)
return _datagsm_client
def get_students(request):
"""학생 목록 조회 뷰"""
grade = int(request.GET.get("grade", 1))
class_num = int(request.GET.get("class_num", 1))
client = get_datagsm_client()
req = StudentRequest(grade=grade, class_num=class_num)
response = client.students.get_students(req)
return JsonResponse({
"students": [s.model_dump() for s in response.students]
})
# apps.py (애플리케이션 종료 시 정리)
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp'
def ready(self):
# 앱 종료 시 클라이언트 정리
import atexit
from .views import get_datagsm_client
def cleanup():
client = get_datagsm_client()
if client:
client.close()
atexit.register(cleanup)환경 변수 설정
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.pyWindows (PowerShell)
$env:DATAGSM_API_KEY="your-api-key-here"
python main.py문제 해결
자주 발생하는 문제
401 Unauthorized 오류
원인: API 키가 유효하지 않거나 만료됨
해결 방법:
- API 키가 올바르게 설정되었는지 확인
- API 키가 만료되지 않았는지 확인
- 필요시 새로운 API 키 발급
403 Forbidden 오류
원인: 요청한 API에 대한 권한 범위 부족
해결 방법:
- API 키의 권한 범위 확인
- 필요한 권한 범위가 부여되었는지 확인
- 권한 범위 추가가 필요한 경우 관리자에게 문의
추가 리소스
- GitHub 저장소: DataGSM OpenAPI SDK Python ↗
- 이슈 트래커: GitHub Issues ↗
문의사항이나 버그 리포트는 GitHub Issues를 통해 제출해 주세요.