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 라이선스로 공개되어 있어 누구나 자유롭게 사용, 수정, 배포할 수 있습니다.
- GitHub: https://github.com/yousung/neis-school-list
- NPM 레지스트리: https://www.npmjs.com/package/neis-api
기술적 고려사항
성능 최적화
- 캐싱: 자주 검색되는 학교명 결과를 메모리에 캐시
- 시간 제한: 응답 시간 3초 이내 설정
- 동시성 제어: 대량 요청 시 큐 관리
안정성
- 에러 처리: 네트워크 실패 시 자동 재시도
- 버전 관리: NEIS 웹사이트 변경에 대응하는 버전 업데이트
- 로깅: 요청/응답 로그 기록
향후 개선 계획
- TypeScript 지원: 타입 안정성 강화
- 데이터베이스 캐시: MongoDB/Redis 지원
- GraphQL 인터페이스: REST API와 함께 제공
- 학교별 상세정보: 교사 수, 학생 수, 시설 정보 등
마치며
공식 API가 막혀있는 상황에서도 대안을 찾아 개발자 커뮤니티에 기여할 수 있다는 것이 보람됩니다. 이 프로젝트가 급식 알림, 교육 앱, 학사 관리 시스템 등 다양한 분야에서 활용되어 학생들과 교사들의 생활을 더 편하게 만드는 데 도움이 되길 바랍니다.
오픈소스 프로젝트이므로 버그 리포트, 기능 제안, 코드 기여를 언제든 환영합니다. 함께 이 프로젝트를 발전시켜 나갈 수 있으면 좋겠습니다.
댓글