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<PackageReference Include="Datagsm.OpenApi" Version="1.1.1" />Install-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 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
Grade | int? | 학년 (1~3) |
ClassNum | int? | 반 번호 |
Page | int? | 페이지 번호 (0부터) |
Size | int? | 페이지당 항목 수 |
동아리 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 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
FromDate | DateOnly | 조회 시작 날짜 |
ToDate | DateOnly | 조회 종료 날짜 |
예외 처리
SDK는 HTTP 상태 코드별로 구체적인 예외 타입을 제공합니다.
예외 종류
| 예외 타입 | HTTP 상태 | 발생 상황 | 권장 처리 방법 |
|---|---|---|---|
UnauthorizedException | 401 | API 키 유효하지 않음 또는 만료 | API 키 갱신 또는 재발급 |
ForbiddenException | 403 | 필요한 권한 범위 부족 | 권한 범위 확인 및 요청 |
BadRequestException | 400 | 잘못된 요청 파라미터 | 요청 파라미터 검증 |
RateLimitException | 429 | Rate limit 초과 | 재시도 로직 구현 (Exponential Backoff) |
ServerErrorException | 500 | 서버 내부 오류 | 잠시 후 재시도 또는 관리자 문의 |
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-hereService 클래스에서 사용
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 runWindows (PowerShell)
$env:DATAGSM_API_KEY="your-api-key-here"
dotnet runASP.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 저장소: Datagsm OpenAPI SDK .NET ↗
- 이슈 트래커: GitHub Issues ↗
문의사항이나 버그 리포트는 GitHub Issues를 통해 제출해 주세요.