Article

공인인증서 우회 NEIS 학교 조회 API 개발

문제 상황

NEIS(National Education Information System)는 한국의 모든 학교 정보를 관리하는 공식 시스템입니다. 과거에는 학교 코드를 쉽게 조회할 수 있는 공개 API가 있었으나, 보안 강화 정책에 따라 공인인증서 인증을 요구하게 되었습니다.

발생한 문제점

  • 급식 알림 서비스: 학교 급식 정보를 제공하는 API들이 학교 코드를 구할 수 없음
  • 교육용 애플리케이션: 학교 검색 기능이 필요한 앱들이 정보 업데이트 불가
  • 데이터 관리: 엑셀이나 수동 입력으로 학교 정보를 관리해야 함

해결책: 웹 스크래핑 기반 API

이 문제를 해결하기 위해 여전히 접근 가능한 NEIS 웹 인터페이스를 활용하여 자동으로 학교 정보를 조회하는 Node.js 패키지를 개발했습니다.

기술 스택

  • 런타임: Node.js
  • 스크래핑: cheerio, axios
  • 패키지 관리: npm
  • 배포: npmjs.com

neis-api 패키지 소개

주요 기능

  • 학교명으로 검색하여 학교 목록 조회
  • 학교 코드, 설립 유형, 주소 정보 제공
  • 동명학교 구별 가능
  • 실시간 데이터 동기화

설치 방법

npm install neis-api

기본 사용 방법

const neisApi = require("neis-api");

// 학교명으로 검색
neisApi("고기").then(list => {
    console.log(list);
});

응답 데이터 형식

[
    {
        "name": "고기초등학교",
        "code": "E10001234",
        "founded": "PUBLIC",
        "address": "서울특별시 강남구 테헤란로 123"
    },
    {
        "name": "고기중학교",
        "code": "M10005678",
        "founded": "PUBLIC",
        "address": "서울특별시 강남구 테헤란로 456"
    }
]

고급 사용법

비동기/대기 처리

const neisApi = require("neis-api");

async function searchSchool(name) {
    try {
        const results = await neisApi(name);
        return results;
    } catch (error) {
        console.error("검색 실패:", error.message);
        return [];
    }
}

// 사용
searchSchool("서울대학교").then(results => {
    console.log(`검색 결과: ${results.length}`);
});

다중 검색

const schools = ["서울초", "부산중", "대구고"];

Promise.all(
    schools.map(name => neisApi(name))
).then(results => {
    console.log("모든 검색 완료");
});

실제 활용 사례

1. 급식 정보 알림 서비스

학교 코드를 얻은 후 교육청 급식 API와 연동하여 학생들에게 실시간 급식 정보 제공

const neisApi = require("neis-api");

async function getSchoolMeal(schoolName, date) {
    const schools = await neisApi(schoolName);
    const schoolCode = schools[0].code;
    
    // 급식 API 호출
    const meal = await fetchMealInfo(schoolCode, date);
    return meal;
}

2. 교육 관리 시스템

학교 검색 기능이 있는 교육용 소프트웨어에 통합

// Express.js 라우트
app.get("/api/schools/search", async (req, res) => {
    const query = req.query.q;
    const schools = await neisApi(query);
    res.json(schools);
});

3. 데이터 마이그레이션

레거시 시스템의 수동 입력된 학교 정보를 자동으로 검증하고 업데이트

오픈소스 저장소

이 프로젝트는 MIT 라이선스로 공개되어 있어 누구나 자유롭게 사용, 수정, 배포할 수 있습니다.

기술적 고려사항

성능 최적화

  • 캐싱: 자주 검색되는 학교명 결과를 메모리에 캐시
  • 시간 제한: 응답 시간 3초 이내 설정
  • 동시성 제어: 대량 요청 시 큐 관리

안정성

  • 에러 처리: 네트워크 실패 시 자동 재시도
  • 버전 관리: NEIS 웹사이트 변경에 대응하는 버전 업데이트
  • 로깅: 요청/응답 로그 기록

향후 개선 계획

  1. TypeScript 지원: 타입 안정성 강화
  2. 데이터베이스 캐시: MongoDB/Redis 지원
  3. GraphQL 인터페이스: REST API와 함께 제공
  4. 학교별 상세정보: 교사 수, 학생 수, 시설 정보 등

마치며

공식 API가 막혀있는 상황에서도 대안을 찾아 개발자 커뮤니티에 기여할 수 있다는 것이 보람됩니다. 이 프로젝트가 급식 알림, 교육 앱, 학사 관리 시스템 등 다양한 분야에서 활용되어 학생들과 교사들의 생활을 더 편하게 만드는 데 도움이 되길 바랍니다.

오픈소스 프로젝트이므로 버그 리포트, 기능 제안, 코드 기여를 언제든 환영합니다. 함께 이 프로젝트를 발전시켜 나갈 수 있으면 좋겠습니다.

댓글