DataGSM

DataGSM OpenAPI SDK for .NET

.NET SDK — 비공식 패키지

.NET SDK는 공식 지원 패키지가 아닌 커뮤니티 기여 비공식 패키지입니다. 기능 및 업데이트 지원이 공식 SDK와 다를 수 있으므로 사용 시 유의하시기 바랍니다.

개요

DataGSM OpenAPI SDK for .NET은 DataGSM API를 .NET 애플리케이션에서 쉽고 안전하게 사용할 수 있도록 설계된 비공식 커뮤니티 기여 SDK입니다.

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

주요 특징

특징설명
타입 안전성강타입 시스템으로 컴파일 타임에 오류를 검출하여 런타임 에러를 방지합니다.
async/await 지원.NET의 비동기 패턴을 완벽하게 지원하여 효율적인 비동기 애플리케이션을 작성할 수 있습니다.
IDisposable 구현using 구문을 통한 자동 리소스 관리로 리소스 누수를 방지합니다.
구체적인 예외 처리HTTP 상태 코드별 전용 예외 타입을 제공하여 정확한 에러 핸들링이 가능합니다.
검증된 HTTP 클라이언트HttpClient 기반으로 안정적이고 효율적인 통신을 보장합니다.
NuGet 패키지 지원NuGet을 통한 간편한 설치 및 업데이트를 지원합니다.

시스템 요구사항

항목최소 버전권장 버전
.NET.NET 8.0.NET 9.0 이상

설치

프로젝트 패키지 관리자에 맞는 방법으로 설치하세요.

dotnet add package Datagsm.OpenApi

빠른 시작

1. 클라이언트 초기화

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

using Datagsm.OpenApi;

// 기본 설정으로 클라이언트 생성 (using으로 자동 리소스 관리)
using var client = new DataGsmClient("your-api-key-here");

// 커스텀 Base URL 설정 (선택사항)
using var clientWithCustomUrl = new DataGsmClient(
    apiKey: "your-api-key-here",
    baseUrl: "https://api.datagsm.com" // 설정하지 않는다면 공식 Base URL 사용
);

2. API 호출 예제

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

학생 데이터 조회

using Datagsm.OpenApi;
using Datagsm.OpenApi.Models;

// 요청 파라미터 설정
var request = new StudentRequest
{
    Grade = 1,    // 1학년
    ClassNum = 1, // 1반
    Page = 0,     // 첫 번째 페이지
    Size = 50     // 페이지당 50명
};

using var client = new DataGsmClient("your-api-key");

// API 호출
var response = await client.Students.GetStudentsAsync(request);

// 결과 처리
foreach (var student in response.Students)
{
    Console.WriteLine($"{student.Name} - {student.Email}");
}

급식 데이터 조회

using Datagsm.OpenApi;

using var client = new DataGsmClient("your-api-key");

// 오늘 날짜의 급식 조회
var meals = await client.Neis.GetMealsAsync();

// 급식 데이터 출력
foreach (var meal in meals)
{
    Console.WriteLine($"{meal.MealType}:");
    foreach (var menu in meal.MealMenu)
    {
        Console.WriteLine($" - {menu}");
    }
}

API 레퍼런스

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

학생 API

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

메서드설명반환 타입
GetStudentsAsync(request)조건에 맞는 학생 목록 조회StudentResponse
GetStudentAsync(id)특정 학생의 상세 데이터 조회Student
// 학생 목록 조회
var students = await client.Students.GetStudentsAsync(request);

// 특정 학생 조회
var student = await client.Students.GetStudentAsync(1);

StudentRequest 파라미터

파라미터타입설명
Gradeint?학년 (1~3)
ClassNumint?반 번호
Pageint?페이지 번호 (0부터)
Sizeint?페이지당 항목 수

동아리 API

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

메서드설명반환 타입
GetClubsAsync(request)조건에 맞는 동아리 목록 조회ClubResponse
GetClubAsync(id)특정 동아리의 상세 데이터 조회ClubDetail
// 전공 동아리 목록 조회
var clubs = await client.Clubs.GetClubsAsync(new ClubRequest
{
    ClubType = ClubType.MajorClub
});

// 특정 동아리 조회
var club = await client.Clubs.GetClubAsync(1);

ClubType 열거형

설명
MajorClub전공 동아리
CreativeClub창체 동아리

프로젝트 API

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

메서드설명반환 타입
GetProjectsAsync()등록된 프로젝트 목록 조회ProjectResponse
GetProjectAsync(id)특정 프로젝트의 상세 데이터 조회Project
// 프로젝트 목록 조회
var projects = await client.Projects.GetProjectsAsync();

// 특정 프로젝트 조회
var project = await client.Projects.GetProjectAsync(1);

NEIS API

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

메서드설명반환 타입
GetMealsAsync()오늘의 급식 조회IList<Meal>
GetSchedulesAsync(request)학사일정 범위 조회IList<Schedule>
// 오늘의 급식 조회
var meals = await client.Neis.GetMealsAsync();

// 학사일정 범위 조회
var schedules = await client.Neis.GetSchedulesAsync(new ScheduleRequest
{
    FromDate = new DateOnly(2025, 3, 1),
    ToDate   = new DateOnly(2025, 3, 31)
});

ScheduleRequest 파라미터

파라미터타입설명
FromDateDateOnly조회 시작 날짜
ToDateDateOnly조회 종료 날짜

예외 처리

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

예외 종류

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

예외 처리 예제

using Datagsm.OpenApi;
using Datagsm.OpenApi.Exceptions;
using Microsoft.Extensions.Logging;

try
{
    var students = await client.Students.GetStudentsAsync(request);
    // 성공적인 응답 처리
}
catch (UnauthorizedException e)
{
    // API 키 갱신 필요
    logger.LogError(e, "API key expired or invalid");
    await RenewApiKeyAsync();
}
catch (ForbiddenException e)
{
    // 권한 범위 부족
    logger.LogWarning(e, "Insufficient permissions");
    NotifyUserAboutPermissions();
}
catch (RateLimitException e)
{
    // Rate limit 초과 - 적절한 재시도 로직 구현 필요
    logger.LogWarning(e, "Rate limit exceeded");
    // 실제로는 exponential backoff 등의 재시도 전략 구현 권장
}
catch (BadRequestException e)
{
    // 잘못된 요청 파라미터
    logger.LogError("Invalid request parameters: {Message}", e.Message);
    ValidateParameters();
}
catch (ServerErrorException e)
{
    // 서버 오류
    logger.LogError(e, "Server error occurred");
    NotifyAdmin();
}
catch (DataGsmException e)
{
    // 기타 예외
    logger.LogError(e, "API error: {Message}", e.Message);
}

리소스 관리

SDK는 IDisposable 인터페이스를 구현하여 자동 리소스 정리를 지원합니다.

using 구문 사용

// using 선언 - 현재 스코프가 끝날 때 자동으로 리소스 정리
using var client = new DataGsmClient("your-api-key");
var students = await client.Students.GetStudentsAsync(request);
// 메서드가 끝나면 자동으로 리소스 정리

// using 블록 - 블록이 끝날 때 자동으로 리소스 정리
using (var client = new DataGsmClient("your-api-key"))
{
    var students = await client.Students.GetStudentsAsync(request);
    // 블록이 끝나면 자동으로 리소스 정리
}

ASP.NET Core 프로젝트에서 사용하기

ASP.NET Core 애플리케이션에서는 DataGsmClient를 DI 컨테이너에 등록하여 의존성 주입 방식으로 사용할 수 있습니다.

서비스 등록

// Program.cs
using Datagsm.OpenApi;

var builder = WebApplication.CreateBuilder(args);

// appsettings.json 또는 환경 변수에서 API 키 로드
var apiKey = builder.Configuration["DataGsm:ApiKey"]
    ?? throw new InvalidOperationException("DataGsm:ApiKey is not configured.");

// 싱글톤으로 등록 (HttpClient 재사용을 위해 권장)
builder.Services.AddSingleton(new DataGsmClient(apiKey));

var app = builder.Build();

설정 파일

// appsettings.json
{
  "DataGsm": {
    "ApiKey": "" // 실제 키는 환경 변수나 Secret Manager로 관리하세요
  }
}
# 환경 변수로 설정 (권장)
DataGsm__ApiKey=your-api-key-here

Service 클래스에서 사용

using Datagsm.OpenApi;
using Datagsm.OpenApi.Models;

public class SchoolDataService
{
    private readonly DataGsmClient _dataGsmClient;

    public SchoolDataService(DataGsmClient dataGsmClient)
    {
        _dataGsmClient = dataGsmClient;
    }

    public async Task<IList<Student>> GetStudentsByClassAsync(int grade, int classNum)
    {
        var response = await _dataGsmClient.Students.GetStudentsAsync(new StudentRequest
        {
            Grade = grade,
            ClassNum = classNum,
            Size = 50
        });
        return response.Students;
    }
}

Controller에서 사용

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class StudentsController : ControllerBase
{
    private readonly SchoolDataService _schoolDataService;

    public StudentsController(SchoolDataService schoolDataService)
    {
        _schoolDataService = schoolDataService;
    }

    [HttpGet]
    public async Task<IActionResult> GetStudents([FromQuery] int grade, [FromQuery] int classNum)
    {
        var students = await _schoolDataService.GetStudentsByClassAsync(grade, classNum);
        return Ok(students);
    }
}

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

ASP.NET Core를 사용하지 않는 일반 .NET 애플리케이션에서는 직접 클라이언트를 생성하여 사용합니다.

전체 예제

using Datagsm.OpenApi;
using Datagsm.OpenApi.Models;
using Datagsm.OpenApi.Exceptions;

class Program
{
    static async Task Main(string[] args)
    {
        // 환경 변수에서 API 키 로드
        var apiKey = Environment.GetEnvironmentVariable("DATAGSM_API_KEY")
            ?? throw new InvalidOperationException("DATAGSM_API_KEY 환경 변수가 설정되지 않았습니다.");

        // using으로 자동 리소스 관리
        using var client = new DataGsmClient(apiKey);

        try
        {
            // 학생 데이터 조회
            var students = await client.Students.GetStudentsAsync(new StudentRequest
            {
                Grade = 1,
                ClassNum = 1,
                Size = 10
            });

            // 결과 출력
            foreach (var student in students.Students)
            {
                Console.WriteLine($"{student.Name} ({student.StudentNumber}) - {student.Email}");
            }

            // 급식 데이터 조회
            var meals = await client.Neis.GetMealsAsync();

            // 급식 출력
            foreach (var meal in meals)
            {
                Console.WriteLine($"{meal.MealType}:");
                foreach (var menu in meal.MealMenu)
                {
                    Console.WriteLine($"  - {menu}");
                }
            }

            // 학사일정 조회
            var schedules = await client.Neis.GetSchedulesAsync(new ScheduleRequest
            {
                FromDate = new DateOnly(2025, 3, 1),
                ToDate   = new DateOnly(2025, 3, 31)
            });

            foreach (var schedule in schedules)
            {
                Console.WriteLine($"{schedule.Date}: {schedule.EventName}");
            }
        }
        catch (UnauthorizedException)
        {
            Console.Error.WriteLine("인증 오류: API 키가 유효하지 않습니다.");
        }
        catch (RateLimitException)
        {
            Console.Error.WriteLine("요청 제한 초과: 잠시 후 다시 시도해주세요.");
        }
        catch (DataGsmException e)
        {
            Console.Error.WriteLine($"API 오류 발생: {e.Message}");
        }
    }
}

보안

API 키 관리

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

환경 변수 사용 (권장)

// 환경 변수에서 API 키 로드
var apiKey = Environment.GetEnvironmentVariable("DATAGSM_API_KEY");

if (string.IsNullOrEmpty(apiKey))
{
    Console.Error.WriteLine("환경 변수 DATAGSM_API_KEY가 설정되지 않았습니다.");
    Environment.Exit(1);
}

using var client = new DataGsmClient(apiKey);
// API 사용

환경 변수 설정 방법

Linux/macOS

export DATAGSM_API_KEY="your-api-key-here"
dotnet run

Windows (PowerShell)

$env:DATAGSM_API_KEY="your-api-key-here"
dotnet run

ASP.NET Core에서 Secret Manager 사용 (개발 환경 권장)

dotnet user-secrets init
dotnet user-secrets set "DataGsm:ApiKey" "your-api-key-here"

문제 해결

자주 발생하는 문제

401 Unauthorized 오류

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

해결 방법:

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

403 Forbidden 오류

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

해결 방법:

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

ObjectDisposedException 오류

원인: Dispose()된 클라이언트를 재사용하려 함

해결 방법:

  • using 블록 범위 내에서만 클라이언트를 사용하세요.
  • ASP.NET Core에서는 싱글톤으로 등록하여 애플리케이션 전체에서 재사용하세요.

추가 리소스

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