D

DataGSM OpenAPI SDK for Go

Go SDK — 비공식 패키지

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

개요

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

복잡한 HTTP 요청을 직접 작성할 필요 없이, 타입 안전한 인터페이스를 통해 학생, 동아리, 프로젝트, NEIS(급식, 학사일정, 시간표) 데이터에 효율적으로 접근할 수 있습니다.

주요 특징

특징설명
타입 안전성Go의 정적 타입 시스템을 활용하여 컴파일 타임에 오류를 검출하고 런타임 에러를 방지합니다.
함수형 옵션 패턴WithBaseURL, WithTimeout, WithHTTPClient 등 유연한 클라이언트 설정을 지원합니다.
context 지원모든 API 호출에 context.Context를 지원하여 타임아웃 및 취소 제어가 가능합니다.
구체적인 에러 처리*APIError 타입으로 HTTP 상태 코드별 명확한 에러 핸들링을 지원합니다.
자동 리소스 관리defer client.Close() 패턴으로 유휴 HTTP 연결을 자동으로 정리합니다.
Ptr 헬퍼선택적 필드에 인라인 포인터 생성을 지원하는 제네릭 헬퍼 함수를 제공합니다.

시스템 요구사항

항목최소 버전권장 버전
Go1.21 이상최신 버전

설치

go get github.com/jihoonwjj/datagsm-openapi-sdk-go

빠른 시작

1. 클라이언트 초기화

NewClient로 클라이언트를 생성합니다. API 키는 필수 파라미터입니다.

package main

import (
    "context"
    "fmt"
    "log"

    datagsm "github.com/jihoonwjj/datagsm-openapi-sdk-go"
)

func main() {
    client, err := datagsm.NewClient("your-api-key")
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()

    ctx := context.Background()

    resp, err := client.Students().List(ctx, datagsm.StudentQuery{
        Grade: datagsm.Ptr(1),
        Page:  0,
        Size:  20,
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("학생 수: %d명\n", resp.TotalElements)
    for _, s := range resp.Students {
        fmt.Printf("  %s (%d학년 %d반)\n", s.Name, s.Grade, s.ClassNum)
    }
}

상세 설정이 필요한 경우 함수형 옵션을 사용하세요.

import "time"

client, err := datagsm.NewClient("your-api-key",
    datagsm.WithBaseURL("https://openapi.datagsm.kr"), // 기본값
    datagsm.WithTimeout(10 * time.Second),             // 기본값: 30초
    datagsm.WithHTTPClient(myHTTPClient),              // 커스텀 http.Client 주입
)

2. API 호출 예제

학생 데이터 조회

// 학생 목록 조회 (2학년, AI 전공)
resp, err := client.Students().List(ctx, datagsm.StudentQuery{
    Grade:   datagsm.Ptr(2),
    Major:   datagsm.Ptr(datagsm.MajorAI),
    SortBy:  datagsm.StudentSortByName,
    SortDir: datagsm.SortDirASC,
    Page:    0,
    Size:    50,
})

// 학생 단건 조회
student, err := client.Students().Get(ctx, 123)

급식 데이터 조회

// 오늘 급식
today := time.Now()
meals, err := client.NEIS().Meals(ctx, datagsm.MealQuery{Date: &today})

// 결과 출력
for _, meal := range meals {
    fmt.Printf("[%s]\n", meal.MealType)
    for _, menu := range meal.MealMenu {
        fmt.Printf("  - %s\n", menu)
    }
}

API 레퍼런스

학생 API

client.Students() — 학생 데이터 조회

메서드설명반환 타입
List(ctx, query)조건에 맞는 학생 목록 조회(*StudentResponse, error)
Get(ctx, id)학생 단건 조회(*Student, error)

StudentQuery 파라미터

파라미터타입설명
StudentID*int학생 ID
Name*string이름
Email*string이메일
Grade*int학년
ClassNum*int
Number*int번호
Sex*Sex성별
Role*StudentRole학생 역할
DormitoryRoom*int기숙사 호실
Specialty*string특기 분야
Major*Major전공
GithubID*stringGitHub ID
IncludeGraduatesbool졸업생 포함 여부
IncludeWithdrawnbool자퇴생 포함 여부
OnlyEnrolledbool재학생만 조회
Pageint페이지 번호
Sizeint페이지 크기
SortByStudentSortBy정렬 기준
SortDirSortDirection정렬 방향

동아리 API

client.Clubs() — 동아리 데이터 조회

메서드설명반환 타입
List(ctx, query)조건에 맞는 동아리 목록 조회(*ClubResponse, error)
Get(ctx, id)동아리 상세 조회(*ClubDetail, error)

ClubQuery 파라미터

파라미터타입설명
ClubID*int동아리 ID
ClubName*string동아리 이름
ClubType*ClubType동아리 유형
Status*ClubStatus동아리 상태
FoundedYear*int설립 연도
Pageint페이지 번호
Sizeint페이지 크기
IncludeLeaderInParticipantsbool참여자 목록에 부장 포함
SortByClubSortBy정렬 기준
SortDirSortDirection정렬 방향

프로젝트 API

client.Projects() — 프로젝트 데이터 조회

메서드설명반환 타입
List(ctx, query)조건에 맞는 프로젝트 목록 조회(*ProjectResponse, error)
Get(ctx, id)프로젝트 단건 조회(*Project, error)

NEIS API

client.NEIS() — 급식·학사일정·시간표 조회

메서드설명반환 타입
Meals(ctx, query)급식 데이터 조회([]Meal, error)
Schedules(ctx, query)학사일정 조회([]Schedule, error)
Timetables(ctx, query)시간표 데이터 조회([]Timetable, error)

NEIS 쿼리 파라미터

타입파라미터설명
MealQueryDate*time.Time — 조회 날짜
MealQueryFromDate*time.Time — 조회 시작 날짜
MealQueryToDate*time.Time — 조회 종료 날짜
ScheduleQueryDate*time.Time — 조회 날짜
ScheduleQueryFromDate*time.Time — 조회 시작 날짜
ScheduleQueryToDate*time.Time — 조회 종료 날짜
TimetableQueryGradeint — 학년 (필수)
TimetableQueryClassNumint — 반 (필수)
TimetableQueryDate*time.Time — 조회 날짜
TimetableQueryFromDate*time.Time — 조회 시작 날짜
TimetableQueryToDate*time.Time — 조회 종료 날짜
// 학사일정 조회
from := time.Date(2026, 3, 1, 0, 0, 0, 0, time.Local)
to   := time.Date(2026, 3, 31, 0, 0, 0, 0, time.Local)
schedules, err := client.NEIS().Schedules(ctx, datagsm.ScheduleQuery{
    FromDate: &from,
    ToDate:   &to,
})

// 시간표 조회 (Grade, ClassNum 필수)
timetables, err := client.NEIS().Timetables(ctx, datagsm.TimetableQuery{
    Grade:    2,
    ClassNum: 3,
    Date:     datagsm.Ptr(time.Now()),
})

에러 처리

SDK는 *APIError 타입으로 HTTP 오류를 반환합니다. errors.As를 사용하여 상태 코드를 확인하세요.

에러 코드

상태 코드의미
400잘못된 요청 파라미터
401유효하지 않거나 만료된 API 키
403권한 부족
429요청 속도 제한 초과
5xx서버 오류

에러 처리 예제

import "errors"

resp, err := client.Students().List(ctx, query)
if err != nil {
    var apiErr *datagsm.APIError
    if errors.As(err, &apiErr) {
        switch apiErr.StatusCode {
        case 401:
            fmt.Println("API 키가 유효하지 않거나 만료되었습니다")
        case 403:
            fmt.Println("권한이 없습니다. API 키의 권한 범위를 확인하세요")
        case 429:
            fmt.Println("요청 속도 제한 초과. 잠시 후 재시도하세요")
        default:
            fmt.Printf("API 오류 %d: %s\n", apiErr.StatusCode, apiErr.Message)
        }
    } else {
        fmt.Println("네트워크 오류:", err)
    }
}

Ptr 헬퍼

선택적 필드는 포인터 타입(*int, *string 등)을 사용합니다. Ptr 헬퍼로 인라인 포인터를 간결하게 생성할 수 있습니다.

datagsm.Ptr(1)       // *int
datagsm.Ptr("hello") // *string
datagsm.Ptr(true)    // *bool

보안 가이드

API 키는 환경 변수로 관리하고 소스 코드에 직접 포함하지 마세요.

# .env
DATAGSM_API_KEY=your_secret_api_key
import "os"

client, err := datagsm.NewClient(os.Getenv("DATAGSM_API_KEY"))

문제 해결

자주 발생하는 문제

401 Unauthorized 오류

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

해결 방법:

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

403 Forbidden 오류

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

해결 방법:

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

타임아웃 오류

원인: 네트워크 연결 불안정 또는 서버 응답 지연

해결 방법:

  • 네트워크 상태 확인
  • WithTimeout 옵션으로 타임아웃 값을 늘려 재시도 (기본값: 30초)
  • 서버 상태 확인

추가 리소스

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