2026년 9월 6일 일요일

[행정/연구] 교구 대여 관리 시스템 - REST API CRUD로 교육 기자재 대여 전산화



수기 대장을 은퇴시키는 교구 대여 관리 시스템 — REST API로 중복 대여 원천 차단

🖨️ 3D 프린터, 드론, VR 기기 등 고가 교구의 대여·반납 일정을 4단계 절차(기획 → DB → API → UI)로 설계된 경량 CRUD 시스템으로 전산화합니다. 서버 재료는 스프링부트(Spring Boot) 또는 파이썬(Python) 경량 서버 중 선택 — 중복 대여는 상태(status) 칸과 409 충돌 응답으로 원천 차단하고, 분실 애매함은 대출 이력으로 투명하게 남깁니다.

관리자 웹 인터페이스에서 대여 현황이 실시간으로 갱신됩니다. 서버·DB는 모두 교내(학내망) 안에서만 동작하고, 대출자 칸은 부서·닉네임만 쓰며, 데이터가 학교 밖으로 전송되는 구조는 없습니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
해결 문제 수기 대장의 3대 리스크 — ① 중복 대여(이미 나간 교구를 또 빌려줌) ② 분실 시 책임 애매(기록 불완전) ③ 현황 불명(지금 어디에 있는지 모름). 상태 관리 전산화로 세 가지가 한 번에 해결됩니다. STATUS 칸 하나로 시작하기.
4단계 절차 재활용 4단계(기획→DB→API→UI) 절차를 그대로 씁니다. 규칙만 바꾸면 도구가 달라지는 — 절차의 재사용성이 이 설계의 핵심 교훈입니다. 요구사항 3줄(대여 규칙)부터 쓰기.
중복 대여 원천 차단 AVAILABLE(대여 가능)·LOANED(대여 중) 상태를 먼저 확인하고, 대여 중이면 409 충돌 응답으로 거절합니다. 사람의 주의가 아니라 시스템이 실수를 막습니다. GET /equipments/available 만들어보기.
서버 재료 선택 스프링부트(Spring Boot) — 표준적·견실한 Java 서버. 파이썬(Python) Flask — 적은 코드로 빠르게 만드는 경량 서버. 초등 교내용은 어느 쪽이든 4단계 절차가 동일하니 익숙한 재료를 고릅니다. 한 가지를 골라 3단계 API 코드 요청.
백업·정합성 인메모리·경량 DB를 쓰더라도 하루 한 번 CSV 내보내기로 대여 이력을 백업합니다. '기술 도구가 대장을 대체'가 아니라 '도구가 대장을 보조'하는 운영 원칙입니다. 퇴근 전 CSV 백업 1회 루틴.

2. 핵심 아키텍처 해설 — 교구 관리의 5개 층

① 1단계 기획: 대여 규칙 3줄

  • 최대 대여 기간 5일 (반납 예정일 자동 계산)
  • 동시 대여는 교구당 1팀
  • 반납 시 상태 점검 후 AVAILABLE로 전환

② 2단계 DB 설계: 교구 표의 칸

CREATE TABLE EQUIPMENT (
  ID     INT PRIMARY KEY,
  NAME   VARCHAR(50),    -- 3D 프린터-1, 드론-A 등
  STATUS VARCHAR(10),    -- AVAILABLE / LOANED
  DEPT   VARCHAR(20),    -- 대여 부서·닉네임 (실명 최소 수집)
  DUE    DATE            -- 반납 예정일
);

③ 3단계 CRUD REST API

GET  /equipments/available   — 대여 가능 목록 (Read)
POST /equipments/{id}/loan   — 대여 처리 (중복 체크)
POST /equipments/{id}/return — 반납 처리
GET  /equipments/overdue     — 연체 목록 (Read)

④ 중복 대여 차단 로직: 상태가 지키는 규칙

function loan(id) {
  const e = findEquipment(id);
  if (e.STATUS === "LOANED") {
    return { status: 409, message: "이미 대여 중인 교구입니다" };
  }
  e.STATUS = "LOANED";
  e.DUE = addDays(today(), 5);
  save(e);
  return { status: 200 };
}

⑤ 파이썬(Python) Flask 슬림 예시

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/equipments/available")
def available():
    rows = [e for e in EQUIPMENTS if e["STATUS"] == "AVAILABLE"]
    return jsonify(rows)

하루 한 번 CSV 내보내기를 붙이면 대여 이력 백업이 완성됩니다 — 인메모리·경량 DB의 안전장치입니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 1·2단계 프롬프트 — 대여 규칙 정리 + 스키마 설계 코드를 받아 요구사항을 확정합니다.
  2. 3단계 프롬프트 — CRUD REST API 코드를 받아 교내 서버에서 실행하고, 중복 대여 거절(409)을 직접 시험합니다.
  3. 4단계 프롬프트 — 관리자 대시보드(단일 HTML)를 받아 교내망 브라우저에서 대여·반납을 운영합니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 4단계(기획-DB-API-UI) 순서를 지켜 답변하되, 최종 결과물은 교내 서버 + 단일 HTML 관리 화면으로 완성한다.
2. 데이터베이스는 경량(H2 인메모리 또는 파이썬 메모리 구조)으로 하되, 하루 한 번 CSV 내보내기 기능을 포함한다.
3. 대여 중인 교구에 대한 대여 요청은 409 충돌 응답과 한국어 안내 메시지로 거절한다(중복 대여 원천 차단).
4. 대여자 칸은 부서·닉네임만 허용한다 — 실명 칸을 만들지 않는다(개인정보 최소 수집).
5. UI의 fetch는 교내 localhost 내부 API만 호출한다 — 외부 CDN·API·전송 0.
6. 대여·반납 완료 시 Web Audio 알림음('똑'), 중복 대여 거절 시 '삑'을 합성한다.
7. 반납 예정일(DUE)은 대여일 + 5일로 자동 계산하고, 연체 목록 화면을 별도로 제공한다.
8. // TODO, /* 생략 */ 같은 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 서버 재료는 무엇으로 할까? (스프링부트 / 파이썬 Flask)
Q2. 대여 규칙은 무엇으로 할까? (기간·팀 수·연장 규칙)
Q3. 관리 화면의 첫 화면은 무엇으로 할까? (대여 가능 목록 / 연체 목록 / 전체 현황)

🎯 에디터 한줄평

'누가 가져갔지?'라는 한숨이 API 쿼리 한 줄로 바뀌는 것 — 관리 투명성은 결국 신뢰의 기술입니다. 409 충돌 응답 하나로 '잊고 또 빌려주는 실수'가 구조적으로 사라지고, 반납 예정일 자동 계산이 독촉의 마찰을 줄입니다. 4단계 절차를 행정에 그대로 쓸 수 있다는 점은 '절차의 재사용'이 작동한다는 증거입니다. 고가 교구는 아이들의 희망이자 학교의 재산 — 데이터가 그 둘을 함께 지켜줍니다.

📚 기술·교육 참고 링크

  • Spring Boot 공식 사이트 : Java 경량 백엔드 표준
  • Flask 공식 문서 : 파이썬 경량 서버 프레임워크
  • H2 Database : 교탁 PC 도구용 경량 DB
  • 활용 팁: 과학실·도서실·체육창고의 관리 규칙만 바꾸면 같은 4단계로 또 하나의 도구가 완성됩니다