방과후 운영 한눈에 웹 서비스 개발 안내서
1. 서비스 개요
한 줄 설명
여러 초등학교·중학교에 방과후·늘봄 강사를 보내는 위탁업체 대표가 학교별 수업과 강사 배정을 관리하고, 같은 강사의 시간대 중복 배정을 막아 확정된 시간표를 강사에게 전달하는 서비스입니다.
서비스 형태
- 제품 형태: 위탁업체용 월 구독형 웹 서비스
- 개발 대상: Next.js 기반 웹
- 운영자 사용 환경: PC·노트북 중심
- 강사 사용 환경: 휴대전화에서도 볼 수 있는 반응형 웹
- 앱 스토어용 모바일 앱: 개발하지 않음
- 서비스 내 결제: 첫 버전에서 제외
- 구독료 수납: 서비스 밖에서 별도 청구 후 계좌이체
첫 검증 현장
- 강사 약 35명
- 운영 학교 약 20곳
- 창업자가 직접 운영하는 방과후·늘봄 위탁업체
- 실제 학기 시작 전 배정 업무에 사용
2. 핵심 고객과 사용자 역할
| 구분 | 사용자 | 서비스에서 달성할 목표 |
|---|---|---|
| 구매자 | 위탁업체 대표·운영 책임자 | 엑셀 중심 업무를 줄이고 중복 배정을 개강 전에 방지 |
| 주 사용자 | 학교별 배정을 관리하는 대표·운영 담당자 | 학교와 강사를 등록하고 시간표를 확정·공개 |
| 보조 사용자 | 소속 강사 | 공개된 개인 시간표와 변경 알림 확인 |
| 후속 이해관계자 | 학교, 학부모 | 첫 버전 계정이나 전용 화면은 제공하지 않음 |
역할별 권한
운영자
- 업체 계정 생성
- 학교와 강사 등록·수정
- 학교별 학기와 교시표 등록
- 수업 계획 직접 등록·수정
- 엑셀 시간표 업로드
- 중복 배정 확인과 수정
- 같은 학교 시간 겹침 예외 승인
- 시간표 확정·공개
- 강사 계정 초대
- 전체 시간표 열람
강사
- 초대받은 업체 계정과 본인 강사 정보 연결
- 공개된 자신의 시간표만 열람
- 자신에게 온 시간표 공개·변경 알림 열람
- 다른 강사와 다른 업체의 정보는 열람할 수 없음
강사료·재료비와 지급 예정액 확인은 후속 기능입니다. 첫 버전 강사 화면에는 시간표와 알림함만 포함합니다.
3. 해결할 문제
현재 위탁업체는 다음 업무를 서로 다른 도구로 관리합니다.
- 시간표와 강사 배정: 엑셀
- 강사 서류: 강사 이름별 폴더
- 결강·대체강사·민원 확인: 카카오톡
- 강사료·재료비 정산: 별도 엑셀 자료
첫 개발에서는 이 가운데 학기 시작 전 중복 배정 문제를 먼저 해결합니다.
핵심 문제
- 학교마다 교시명과 실제 시간이 다릅니다.
- 한 강사가 보통 여러 학교를 담당합니다.
- 같은 강사가 같은 시간에 두 학교에 배정돼도 엑셀에서는 즉시 알기 어렵습니다.
- 중복을 개강 직전에 발견하면 여러 학교의 배정을 다시 짜야 합니다.
- 확정된 시간표를 강사에게 전달한 뒤 변경 사항을 다시 안내하는 과정도 수작업입니다.
4. 사용자가 달성해야 하는 목표
운영자의 핵심 완료 업무
운영자는 다음 과정을 한 번에 끝낼 수 있어야 합니다.
여러 학교의 수업과 강사를 등록하고 → 중복 배정을 수정하고 → 충돌 없는 확정 시간표를 공개하고 → 강사가 개인 시간표를 확인하게 한다.
강사의 핵심 완료 업무
강사는 다음을 할 수 있어야 합니다.
초대받은 계정으로 로그인하고 → 자신에게 공개된 학교·요일·교시·실제 시간·과목을 확인하고 → 변경 알림에서 최신 시간표로 이동한다.
5. 첫 개발 범위
5.1 반드시 구현할 기능
| ID | 기능 | 구현 내용 |
|---|---|---|
| F15 | 업체 계정 시작 | 대표가 업체 계정을 만들고 운영자 권한으로 시작 |
| F16 | 학교·강사 목록 관리 | 학교와 강사를 등록·수정하고 강사 초대 상태 확인 |
| MF01 | 학교별 학기·교시표 관리 | 학교별 학기, 운영 기간, 교시명, 실제 시작·종료 시각 등록 |
| F17 | 수업 및 강사 배정 직접 등록 | 화면에서 수업 계획을 한 건씩 등록·수정 |
| MF03 | 엑셀 양식 다운로드 | 서비스가 요구하는 열과 입력 예시가 있는 양식 제공 |
| F18 | 엑셀 시간표 일괄 등록 | 작성한 엑셀을 올리고 저장 전 표로 확인 |
| F19 | 엑셀 등록 오류 표시 | 등록되지 않은 학교, 강사 이름 매칭 문제, 빈 시간 등을 행별 표시 |
| F20 | 중복 배정 경고·저장 차단 | 서로 다른 학교의 동일 강사 시간 중복은 저장 불가 |
| F21 | 중복 수업 현장 수정 | 겹치는 두 수업을 나란히 표시하고 한쪽을 즉시 수정 |
| F22 | 같은 학교 시간 겹침 예외 | 같은 학교의 겹침은 사유를 입력한 경우에만 저장 |
| F23 | 전체 시간표 확인 | 전체 학교·강사의 시간표와 충돌 상태 확인 |
| MF04 | 강사 계정 초대·연결 | 등록된 강사 정보와 초대받은 사용자 계정 연결 |
| F11 | 강사 개인 시간표 확인 | 강사가 자신의 공개된 시간표 확인 |
| F24 | 시간표 공개·변경 알림 | 최초 공개 또는 공개 후 변경 시 강사 알림함에 생성 |
5.2 첫 버전에서 제외할 기능
- 학교별 서류 상태와 만료일 관리
- 서류 만료 알림
- 성범죄 경력·아동학대 전력 조회 회신서 원본 저장
- 대체강사 탐색
- 강사료·재료비 정산
- 지급 예정액과 정산 확정 알림
- 민원 기록
- 카카오톡 연동
- 서비스 내 구독 결제
- 공고 파일 자동 해석
- 지도 기반 학교 간 이동시간 계산
- 이동시간 부족 경고
- 휴강·보강·대강과 날짜별 수업 회차
- 직전 학기 시간표 복사
- 학교 담당자 전용 계정
- 앱 스토어용 모바일 앱
6. 핵심 사용자 이용 순서
운영자 회원가입
→ 업체 계정 생성
→ 학교 등록
→ 학교별 학기·교시표 등록
→ 강사 등록
→ 직접 입력 또는 엑셀 업로드
→ 행별 오류 수정
→ 전체 시간표에서 중복 확인
→ 겹치는 두 수업 중 한쪽 수정
→ 충돌 없는 시간표 확정
→ 강사 계정 초대
→ 시간표 공개
→ 강사가 개인 시간표 확인
→ 공개 후 변경 시 강사 알림함에 변경 알림 생성
신규 업체의 첫 이용 순서
- 대표가 운영자 계정을 만듭니다.
- 업체 이름을 등록합니다.
- 학교 약 20곳을 등록합니다.
- 각 학교의 학기와 교시표를 등록합니다.
- 강사 약 35명을 등록합니다.
- 엑셀 양식을 내려받아 시간표를 작성합니다.
- 엑셀을 올리고 문제가 있는 행을 수정합니다.
- 전체 시간표에서 강사 중복을 해결합니다.
- 시간표를 확정하고 공개합니다.
- 강사를 초대해 개인 시간표를 확인하게 합니다.
학기 중 수업 변경 순서
- 운영자가 수업 계획을 검색합니다.
- 학교, 요일, 교시, 실제 시간, 과목 또는 강사를 수정합니다.
- 서버가 전체 학교의 동일 강사 일정을 다시 검사합니다.
- 충돌이 없으면 저장합니다.
- 이미 공개된 수업이면 영향을 받는 강사에게 변경 알림을 생성합니다.
7. 주요 화면 명세
7.1 운영자 로그인 및 업체 시작 화면
화면 ID: admin-login-start
목적
대표가 계정을 만들고 위탁업체의 운영 공간을 생성합니다.
주요 항목
- 이메일
- 비밀번호
- 대표 이름
- 업체 이름
- 로그인
- 비밀번호 재설정
- 업체 생성
동작
- 신규 운영자는 회원가입 후 업체를 생성합니다.
- 기존 운영자는 자신이 소속된 업체로 로그인합니다.
- 업체가 생성되면 학교·강사 목록 관리 화면으로 이동합니다.
완료 조건
- 운영자 사용자 계정이 생성되어야 합니다.
- 업체 식별값이 발급되어야 합니다.
- 해당 운영자에게 업체 운영자 권한이 연결되어야 합니다.
- 다른 업체 데이터에는 접근할 수 없어야 합니다.
7.2 학교·강사 목록 관리 화면
화면 ID: school-instructor-list
목적
시간표를 만들기 전에 학교와 강사 기본 정보를 준비합니다.
학교 탭
- 학교명
- 주소 또는 운영 메모
- 사용 상태
- 등록·수정일
- 학기·교시표 설정 버튼
학교명은 한 업체 안에서 같은 이름이 중복되지 않게 관리합니다.
강사 탭
- 강사명
- 연락처
- 이메일
- 내부 메모
- 계정 연결 상태
- 초대 전
- 초대 발송
- 연결 완료
- 초대 만료
- 초대 링크 발송 또는 재발송
강사 이름은 같을 수 있습니다. 수업은 이름이 아니라 시스템이 발급한 강사 식별값으로 연결합니다.
완료 조건
- 시간표에 사용할 학교가 등록되어야 합니다.
- 강사가 고유 식별값을 가진 상태로 등록되어야 합니다.
- 동일한 이름의 강사가 있어도 별개의 강사로 관리되어야 합니다.
- 삭제할 학교나 강사가 기존 수업에 사용 중이면 바로 삭제하지 않고 사용 중지로 전환해야 합니다.
7.3 학교별 학기·교시표 설정 화면
화면 ID: school-term-period-settings
목적
학교가 사용하는 교시명을 실제 시간과 연결합니다.
학기 정보
- 학교
- 학기 이름
- 예:
2026년 1학기
- 예:
- 운영 시작일
- 운영 종료일
교시표 정보
- 교시표 이름
- 예:
2026년 1학기 기본 교시표
- 예:
- 적용 시작일
- 적용 종료일
- 요일
- 교시명
- 시작 시각
- 종료 시각
입력 예시
| 요일 | 교시명 | 시작 | 종료 |
|---|---|---|---|
| 화요일 | 늘봄 1교시 | 13:10 | 13:50 |
| 화요일 | 늘봄 2교시 | 14:00 | 14:40 |
| 화요일 | 늘봄 3교시 | 14:50 | 15:30 |
검증 기준
- 종료 시각은 시작 시각보다 늦어야 합니다.
- 적용 종료일은 적용 시작일보다 빠를 수 없습니다.
- 같은 학교·같은 날짜·같은 요일·같은 교시명에 적용할 실제 시간이 두 개 이상이면 저장할 수 없습니다.
- 수업 계획의 운영 기간은 선택한 학기 범위 안에 있어야 합니다.
교시표 변경 규칙
교시표를 수정해도 기존 수업의 실제 시간을 자동으로 덮어쓰지 않습니다.
- 교시표 변경 전에 영향을 받는 기존 수업 수를 보여줍니다.
- 기존 수업 계획에는 등록 당시 실제 시간이 그대로 남습니다.
- 변경된 시간을 반영하려면 운영자가 해당 수업을 별도로 수정합니다.
- 공개된 수업을 수정하면 강사 변경 알림 대상이 됩니다.
완료 조건
- 모든 교시의 시작·종료 시각이 정상이어야 합니다.
- 해당 적용 범위에서 사용할 교시표를 한 가지로 결정할 수 있어야 합니다.
- 수업 등록 화면에서 교시명을 선택했을 때 실제 시간이 자동으로 채워져야 합니다.
7.4 학교별 수업 및 강사 배정 등록 화면
화면 ID: class-assignment
목적
운영자가 학기 중 반복되는 수업 계획을 한 건씩 등록하거나 수정합니다.
입력 항목
- 학교
- 학기
- 운영 시작일
- 운영 종료일
- 요일
- 교시명
- 실제 시작 시각
- 실제 종료 시각
- 과목
- 담당 강사
- 상태
- 임시 배정
- 확정 시간표
- 운영자 메모
시간 입력 방식
교시표 사용
- 학교와 학기를 선택합니다.
- 요일과 교시명을 선택합니다.
- 실제 시작·종료 시각이 자동으로 입력됩니다.
실제 시간 직접 입력
- 교시표에 없는 수업은 실제 시간을 직접 입력할 수 있습니다.
- 교시명은 알아보기 위한 표시값으로 입력할 수 있습니다.
- 충돌은 교시명이 아니라 실제 시작·종료 시각으로 판단합니다.
저장 동작
- 화면에서 기본 입력값을 검사합니다.
- 서버에서 다시 충돌을 검사합니다.
- 서로 다른 학교의 동일 강사 시간이 겹치면 저장을 차단합니다.
- 같은 학교에서 시간이 겹치면 예외 사유 입력 화면을 표시합니다.
- 충돌이 없거나 적법한 예외 사유가 있으면 저장합니다.
완료 조건
- 필수 입력값이 모두 존재해야 합니다.
- 실제 종료 시각이 시작 시각보다 늦어야 합니다.
- 운영 기간이 학기 범위를 벗어나지 않아야 합니다.
- 저장 불가 중복이 없어야 합니다.
- 수업이 강사 이름이 아닌 강사 식별값과 연결되어야 합니다.
7.5 엑셀 양식 다운로드 및 업로드
엑셀 양식 열
| 열 이름 | 필수 | 설명 |
|---|---|---|
| 학교명 | 필수 | 등록된 학교명과 연결 |
| 수업 시작일 | 필수 | 반복 수업의 운영 시작일 |
| 수업 종료일 | 필수 | 반복 수업의 운영 종료일 |
| 요일 | 필수 | 월요일~일요일 |
| 과목 | 필수 | 방과후·늘봄 과목명 |
| 강사명 | 필수 | 등록 강사와 연결 |
| 교시명 | 조건부 | 학교 교시표로 실제 시간을 찾을 때 사용 |
| 시작 시각 | 조건부 | 실제 시간을 직접 입력할 때 사용 |
| 종료 시각 | 조건부 | 실제 시간을 직접 입력할 때 사용 |
| 비고 | 선택 | 운영자 메모 |
교시명 또는 시작 시각·종료 시각 중 한 가지 방식은 반드시 입력해야 합니다.
시간 해석 우선순위
- 시작 시각과 종료 시각이 모두 있으면 해당 실제 시간을 사용합니다.
- 실제 시간이 없고 교시명만 있으면 학교·학기·요일의 교시표에서 시간을 찾습니다.
- 교시명과 실제 시간이 다르면 실제 시간을 사용하되 경고를 표시합니다.
- 교시명만으로 시간을 한 가지로 결정할 수 없으면 저장 차단 오류로 표시합니다.
7.6 엑셀 업로드 확인 및 수정 화면
화면 ID: excel-import-preview
목적
엑셀 내용을 바로 저장하지 않고 임시 표로 보여 준 뒤, 문제가 있는 행만 수정하게 합니다.
표시 항목
- 엑셀 행 번호
- 학교
- 운영 기간
- 요일
- 교시명
- 실제 시간
- 과목
- 강사
- 검증 상태
- 오류 이유
- 수정 버튼
행별 상태
| 상태 | 표시 | 저장 가능 여부 |
|---|---|---|
| 정상 | 기본색 또는 초록색 | 가능 |
| 경고 | 노란색 | 확인 후 가능 |
| 오류 | 빨간색 | 수정 전 불가 |
저장 차단 오류
- 업체에 등록되지 않은 학교명
- 동일한 이름의 강사가 여러 명이라 자동 연결할 수 없는 경우
- 등록되지 않은 강사명
- 시작 시각 또는 종료 시각 누락
- 종료 시각이 시작 시각보다 빠르거나 같은 경우
- 잘못된 날짜나 요일
- 교시명을 실제 시간으로 결정할 수 없는 경우
- 서로 다른 학교의 동일 강사 시간 중복
- 업로드된 행끼리 발생한 시간 중복
- 기존 시간표와 업로드 행 사이의 시간 중복
수정 방법
- 오류 행을 눌러 학교·강사·시간을 화면에서 직접 수정
- 동일 이름의 강사가 여러 명이면 후보 목록에서 한 명 선택
- 중복된 두 수업을 나란히 확인하고 한쪽 수정
- 같은 학교 시간 겹침이면 예외 사유 입력
확정 규칙
- 엑셀 파일 자체는 시간표에 바로 저장하지 않습니다.
- 모든 저장 차단 오류가 해결되어야
시간표에 반영버튼을 누를 수 있습니다. - 최종 반영 시 서버가 전체 행을 다시 검사합니다.
- 확정 과정에서 새 충돌이 발견되면 전체 저장을 중단하고 해당 행을 다시 표시합니다.
7.7 전체 시간표와 중복 배정 경고 화면
화면 ID: master-timetable
목적
운영자가 어느 학교 어느 시간에 누가 들어가는지 한 화면에서 확인하고 충돌을 해결합니다.
기본 보기
- 학교별 보기
- 강사별 보기
- 요일별 보기
- 임시 배정·확정·공개 상태 필터
- 학교 검색
- 강사 검색
- 학기 선택
시간표 표시 내용
- 학교
- 요일
- 교시명
- 실제 시작·종료 시각
- 과목
- 강사
- 운영 기간
- 공개 상태
- 중복 또는 예외 표시
표시 예시:
새봄초 · 화요일 · 늘봄 2교시 · 14:00~14:40 · 창의미술 · 김미술
중복 발견 시 표시
겹치는 두 수업을 나란히 보여 줍니다.
| 기존 수업 | 새 수업 |
|---|---|
| 새봄초 | 햇살초 |
| 화요일 | 화요일 |
| 14:00~14:40 | 14:20~15:00 |
| 창의미술 | 클레이 |
| 김미술 | 김미술 |
가능한 해결 행동:
- 왼쪽 수업 시간 변경
- 오른쪽 수업 시간 변경
- 왼쪽 담당 강사 변경
- 오른쪽 담당 강사 변경
- 해당 수업 편집 화면으로 이동
공개 버튼
시간표 공개 전 다음을 검사합니다.
- 서로 다른 학교의 동일 강사 시간 중복이 없는지
- 같은 학교 시간 겹침에 예외 사유가 있는지
- 학교·강사·과목·운영 기간·실제 시간이 모두 입력되었는지
- 강사와 수업이 정상 연결되었는지
완료 조건
- 저장 불가 충돌이 0건이어야 합니다.
- 모든 예외 건에 사유와 처리자가 남아 있어야 합니다.
- 공개된 수업은 해당 강사의 개인 시간표에 나타나야 합니다.
- 최초 공개 알림은 강사별로 한 번만 생성되어야 합니다.
7.8 강사 로그인 및 초대 연결 화면
화면 ID: instructor-login-invite
목적
초대받은 강사가 사용자 계정을 만들고 업체에 등록된 자신의 강사 정보와 연결합니다.
이용 순서
- 운영자가 강사 목록에서 초대합니다.
- 강사는 초대 링크를 엽니다.
- 로그인하거나 신규 계정을 만듭니다.
- 초대 대상 업체와 본인 이름을 확인합니다.
- 연결을 완료합니다.
- 강사 개인 시간표로 이동합니다.
보안 규칙
- 초대 링크에는 만료 시간이 있어야 합니다.
- 만료된 링크는 사용할 수 없으며 운영자가 재발송할 수 있어야 합니다.
- 하나의 초대는 지정된 강사 정보에만 연결됩니다.
- 이미 연결된 강사 정보에 다른 계정을 중복 연결할 수 없습니다.
완료 조건
- 사용자 계정과 업체 내부 강사 식별값이 연결되어야 합니다.
- 강사 권한으로 전체 운영자 화면에 접근할 수 없어야 합니다.
- 연결 완료 후 자신의 공개 시간표와 알림함만 볼 수 있어야 합니다.
구현 가정: 첫 버전 초대와 로그인은 이메일 기준으로 구현합니다. 이메일이 없는 강사의 초대 방식은 도입 전에 확인 필요입니다.
7.9 강사 개인 시간표 화면
화면 ID: instructor-timetable
목적
강사가 자신의 최신 공개 시간표를 직접 확인합니다.
표시 항목
- 학기
- 요일
- 학교
- 교시명
- 실제 시작·종료 시각
- 과목
- 운영 기간
- 최근 변경 표시
표시 규칙
- 임시 배정은 강사에게 보이지 않습니다.
- 운영자가 공개한 수업만 표시합니다.
- 다른 강사의 일정은 표시하지 않습니다.
- 교시명과 실제 시간을 함께 표시합니다.
예시:
화요일
새봄초
늘봄 1교시 · 13:10~13:50
창의미술
운영 기간: 2026.03.03~2026.07.14
완료 조건
- 강사가 로그인하면 자신의 공개된 수업만 조회되어야 합니다.
- 운영자가 공개 후 수업을 변경하면 최신 값이 나타나야 합니다.
- 휴대전화 화면에서 가로 스크롤 없이 핵심 내용을 확인할 수 있어야 합니다.
7.10 강사 알림함 화면
화면 ID: instructor-notifications
목적
강사가 시간표 최초 공개와 변경 내역을 모아 봅니다.
알림 종류
최초 공개
2026년 1학기 시간표가 공개되었습니다.
공개 후 변경
새봄초 화요일 늘봄 2교시 수업 시간이 변경되었습니다.
변경 전: 14:00~14:40
변경 후: 14:20~15:00
알림 데이터
- 알림 종류
- 학교
- 요일
- 교시명
- 변경 전 실제 시간
- 변경 후 실제 시간
- 과목
- 변경 시각
- 읽음 여부
- 변경된 개인 시간표로 이동하는 링크
생성 규칙
- 같은 공개 작업에서 한 강사에게 여러 수업 변경이 있으면 강사별 알림 한 건으로 묶을 수 있습니다.
- 알림 안에서는 변경된 각 수업의 상세 내용을 확인할 수 있어야 합니다.
- 공개된 수업이 추가·수정·삭제된 경우 모두 변경 대상으로 처리합니다.
- 카카오톡, 문자, 이메일 알림은 첫 버전에서 제공하지 않습니다.
8. 핵심 업무 규칙
8.1 시간 중복 판단
교시명이 아니라 실제 시작·종료 시각으로 판단합니다.
계산식
기존 수업 시작 < 새 수업 종료
그리고
새 수업 시작 < 기존 수업 종료
예시
| 기존 수업 | 새 수업 | 결과 |
|---|---|---|
| 14:00~14:40 | 14:20~15:00 | 중복 |
| 14:00~14:40 | 14:39~15:20 | 중복 |
| 14:00~14:40 | 14:00~14:40 | 중복 |
| 14:00~14:40 | 14:40~15:20 | 중복 아님 |
시작 시각은 포함하고 종료 시각은 제외합니다. 따라서 앞 수업 종료 시각과 다음 수업 시작 시각이 같으면 시간 중복은 아닙니다.
8.2 운영 기간 판단
다음 조건을 모두 만족할 때만 중복으로 처리합니다.
- 업체가 같습니다.
- 강사가 같습니다.
- 요일이 같습니다.
- 두 수업의 운영 기간이 겹칩니다.
- 실제 시작·종료 시각이 겹칩니다.
예를 들어 1학기 수업과 2학기 수업처럼 운영 기간이 겹치지 않으면 같은 요일·시간이어도 중복이 아닙니다.
8.3 서로 다른 학교의 중복
같은 강사가 서로 다른 학교의 겹치는 시간에 배정되면 저장할 수 없습니다.
- 운영자 화면에서 차단
- 엑셀 확정 단계에서 차단
- 서버 저장 단계에서 차단
- 동시에 두 저장 요청이 들어와도 최종 데이터베이스 저장 전에 다시 검사
운영자 사유 입력으로도 예외 저장할 수 없습니다.
8.4 같은 학교의 시간 겹침
같은 강사가 같은 학교 안에서 겹치는 수업에 배정된 경우에는 운영자가 상황을 알고 저장해야 할 수 있습니다.
따라서 다음 정보를 필수로 남긴 경우에만 저장합니다.
- 예외 사유
- 처리한 운영자
- 처리 시각
- 서로 겹치는 수업 식별값
예외 사유는 전체 시간표에서 다시 확인할 수 있어야 합니다.
구현 가정: 첫 버전에서는 같은 학교의 겹침 시간 길이에 별도 제한을 두지 않고, 사유 입력을 필수로 합니다. 허용 가능한 최대 겹침 시간은 확인 필요입니다.
8.5 임시 배정도 충돌 검사에 포함
강사에게 공개하지 않은 임시 배정도 전체 충돌 검사에 포함합니다. 임시 배정을 제외하면 학기 초 작성 중인 중복을 놓칠 수 있기 때문입니다.
8.6 공개된 시간표 변경
- 공개된 수업을 수정하면 저장 전에 충돌을 다시 검사합니다.
- 저장이 완료되면 변경 전후 값을 기록합니다.
- 영향을 받는 강사에게 서비스 안 알림을 생성합니다.
- 변경한 운영자와 변경 시각을 남깁니다.
- 공개된 시간표를 조용히 변경하고 알림을 생략할 수 없게 합니다.
9. 데이터 구조
9.1 주요 데이터 표
| 데이터 | 주요 항목 |
|---|---|
| 업체 | 업체 식별값, 업체명, 상태 |
| 사용자 | 사용자 식별값, 이메일, 이름, 로그인 정보 |
| 업체 사용자 권한 | 업체, 사용자, 운영자·강사 역할 |
| 학교 | 업체, 학교 식별값, 학교명, 주소·메모, 사용 상태 |
| 강사 | 업체, 강사 식별값, 이름, 연락처, 이메일, 계정 연결 상태 |
| 학교 학기 | 학교, 학기명, 운영 시작일·종료일 |
| 교시표 | 학교, 학기, 교시표명, 적용 시작일·종료일 |
| 교시 항목 | 교시표, 요일, 교시명, 실제 시작·종료 시각 |
| 수업 계획 | 학교, 학기, 운영 기간, 요일, 교시명, 실제 시간, 과목, 강사, 상태 |
| 시간 겹침 예외 | 관련 수업 2건, 사유, 처리 운영자, 처리 시각 |
| 엑셀 업로드 작업 | 업체, 파일명, 처리 상태, 업로드 시각 |
| 엑셀 임시 행 | 원본 행, 변환된 값, 연결된 학교·강사, 오류 목록 |
| 공개 기록 | 업체, 학기, 공개한 운영자, 공개 시각, 공개본 식별값 |
| 수업 변경 이력 | 변경 전 값, 변경 후 값, 변경자, 변경 시각 |
| 알림 | 업체, 강사, 알림 종류, 상세 내용, 읽음 상태 |
9.2 수업 계획 필수 항목
- 업체 식별값
- 학교 식별값
- 학기 식별값
- 운영 시작일
- 운영 종료일
- 요일
- 교시명
- 실제 시작 시각
- 실제 종료 시각
- 과목
- 강사 식별값
- 임시 배정·확정 상태
- 공개 여부
- 생성자
- 수정자
- 생성 시각
- 수정 시각
9.3 이름과 식별값 사용 규칙
- 학교와 강사는 시스템 내부에서 고유 식별값으로 연결합니다.
- 이름은 화면 표시와 엑셀 매칭에만 사용합니다.
- 강사 이름이 같으면 자동 연결하지 않습니다.
- 운영자가 후보 중 올바른 강사를 직접 선택해야 합니다.
- 모든 데이터에는 업체 식별값을 포함합니다.
10. 서버 기능과 저장 규칙
10.1 주요 서버 기능
| 구분 | 서버 기능 |
|---|---|
| 인증 | 회원가입, 로그인, 로그아웃, 초대 연결 |
| 업체 | 업체 생성, 사용자 권한 확인 |
| 학교 | 학교 목록·등록·수정·사용 중지 |
| 강사 | 강사 목록·등록·수정·초대 |
| 학기·교시표 | 학기와 교시표 등록·수정·검증 |
| 수업 계획 | 등록·수정·조회·충돌 검사 |
| 엑셀 | 양식 다운로드, 업로드, 임시 행 검증, 최종 반영 |
| 전체 시간표 | 학교·강사·요일·학기별 조회 |
| 공개 | 공개 전 전체 검사, 공개 기록 생성 |
| 알림 | 공개·변경 알림 생성, 목록 조회, 읽음 처리 |
| 이력 | 시간표 변경 전후 값과 처리자 기록 |
10.2 중복 배정 저장 절차
- 운영자의 업체 접근 권한을 확인합니다.
- 강사·학교·학기가 같은 업체 데이터인지 확인합니다.
- 입력 형식과 운영 기간을 검사합니다.
- 해당 강사와 요일을 기준으로 동시 저장을 잠급니다.
- 데이터베이스에서 기존 수업을 다시 조회합니다.
- 운영 기간과 실제 시간이 겹치는지 검사합니다.
- 다른 학교 중복이면 저장을 중단합니다.
- 같은 학교 중복이면 예외 사유를 검사합니다.
- 정상인 경우 수업과 변경 이력을 함께 저장합니다.
- 공개된 수업의 변경이면 알림을 생성합니다.
화면 검사는 사용 편의를 위한 1차 검사입니다. 최종 판단은 반드시 서버와 데이터베이스 저장 과정에서 다시 수행합니다.
11. 권장 기술 구성
기본 구성
- 웹 프레임워크: Next.js App Router
- 개발 언어: TypeScript
- 데이터베이스: PostgreSQL
- 화면 구성: 운영자용 표 중심 화면, 강사용 반응형 화면
- 인증: 업체와 역할을 구분할 수 있는 인증 서비스 또는 검증된 인증 라이브러리
- 엑셀 처리:
.xlsx파일을 읽고 시간·날짜 형식을 통일할 수 있는 서버 라이브러리 - 시간 기준: 한국 표준시
- 배포: Next.js와 PostgreSQL을 안정적으로 운영할 수 있는 관리형 환경
구현 원칙
- 운영자 기능과 강사 기능의 경로를 분리합니다.
- 모든 조회와 수정에서 업체 식별값과 권한을 검사합니다.
- 엑셀은 임시 데이터로 먼저 읽고 검증이 끝난 뒤 본 데이터에 반영합니다.
- 공개된 수업의 변경 전후 값은 이력으로 보관합니다.
- 운영자가 보지 못한 상태에서 교시표 변경이 기존 수업 시간을 자동 변경하지 않게 합니다.
- 민감한 서류 원본을 올리는 메뉴와 저장 공간은 첫 버전에서 만들지 않습니다.
12. 개인정보와 접근 관리
첫 버전에서 다루는 개인정보
- 운영자 이름과 이메일
- 강사 이름
- 강사 로그인용 이메일
- 필요할 경우 연락처
필수 보호 기준
- 비밀번호는 원문으로 저장하지 않습니다.
- 운영자와 강사의 접근 범위를 서버에서 구분합니다.
- 강사는 자신의 일정과 알림만 조회할 수 있어야 합니다.
- 업체 A의 운영자가 업체 B의 주소를 직접 입력해도 데이터가 조회되지 않아야 합니다.
- 엑셀 원본은 검증에 필요한 기간만 보관하고 불필요해지면 삭제합니다.
- 로그인, 시간표 공개, 공개 후 변경, 예외 승인 이력을 남깁니다.
- 데이터베이스 백업과 장애 복구 방법을 마련합니다.
첫 버전에서 저장하지 않는 정보
- 성범죄 경력·아동학대 전력 조회 회신서 원본
- 자격증 사본
- 계약서 원본
- 학교별 민감 서류 파일
- 강사료 지급 계좌
- 결제 정보
13. 핵심 시험 항목
13.1 시간 충돌 시험
| 시험 상황 | 기대 결과 |
|---|---|
| 같은 강사, 같은 요일, 다른 학교, 14:00~14:40과 14:20~15:00 | 저장 차단 |
| 같은 강사, 같은 요일, 다른 학교, 14:00~14:40과 14:40~15:20 | 저장 가능 |
| 같은 강사, 같은 시간, 운영 기간이 겹치지 않음 | 저장 가능 |
| 같은 강사, 같은 학교, 시간이 겹치고 사유 없음 | 저장 차단 |
| 같은 강사, 같은 학교, 시간이 겹치고 사유 있음 | 예외 이력과 함께 저장 |
| 다른 강사, 같은 시간, 같은 학교 | 저장 가능 |
| 교시명이 같지만 실제 시간이 다름 | 실제 시간으로 판단 |
| 교시명이 다르지만 실제 시간이 겹침 | 중복으로 판단 |
| 두 운영자가 동시에 같은 강사의 겹치는 수업 저장 | 한 요청만 저장되거나 둘 다 정상적으로 재검사되어 중복 방지 |
13.2 엑셀 시험
- 등록되지 않은 학교명이 빨간색 오류로 표시되는지
- 동일 이름 강사가 여러 명이면 후보 선택이 필요한지
- 빈 시간 셀이 오류로 표시되는지
- 엑셀 시간 형식과 문자열 시간이 같은 값으로 변환되는지
- 종료 시각이 시작 시각보다 빠르면 저장이 차단되는지
- 업로드 행끼리의 중복도 검출되는지
- 기존 시간표와 업로드 행 사이의 중복이 검출되는지
- 오류 수정 전에는 최종 반영할 수 없는지
- 최종 반영 직전에 서버가 다시 검사하는지
13.3 공개와 알림 시험
- 임시 배정이 강사 화면에 보이지 않는지
- 시간표 공개 후 해당 강사에게만 나타나는지
- 최초 공개 알림이 중복 생성되지 않는지
- 공개된 수업의 학교·요일·시간·과목·강사 변경이 기록되는지
- 변경된 강사에게만 알림이 생성되는지
- 알림을 누르면 최신 개인 시간표로 이동하는지
- 알림 읽음 상태가 저장되는지
13.4 권한 시험
- 강사가 운영자 화면에 접근할 수 없는지
- 강사가 다른 강사의 시간표를 볼 수 없는지
- 다른 업체의 학교·강사·시간표가 조회되지 않는지
- 만료되거나 이미 사용한 초대 링크를 다시 사용할 수 없는지
- 연결된 강사 정보에 다른 계정을 중복 연결할 수 없는지
14. 첫 개발 완료 기준
다음 조건을 모두 만족하면 첫 개발을 완료한 것으로 봅니다.
업체 시작
- 대표가 회원가입하고 업체 계정을 생성할 수 있다.
- 운영자와 강사의 권한이 구분된다.
- 업체별 데이터가 서로 섞이지 않는다.
학교·강사 준비
- 운영자가 학교와 강사를 등록·수정할 수 있다.
- 같은 이름의 강사를 별개의 강사로 관리할 수 있다.
- 학교별 학기와 교시표를 등록할 수 있다.
- 교시명과 실제 시작·종료 시각이 함께 저장된다.
시간표 입력
- 화면에서 수업 계획을 한 건씩 등록·수정할 수 있다.
- 지정 엑셀 양식을 내려받을 수 있다.
- 엑셀 내용을 저장 전에 표로 확인할 수 있다.
- 문제가 있는 행만 빨간색으로 확인하고 직접 수정할 수 있다.
중복 배정 차단
- 서로 다른 학교의 동일 강사 실제 시간이 겹치면 저장되지 않는다.
- 운영 기간이 겹치지 않으면 중복으로 처리하지 않는다.
- 14:00~14:40과 14:40~15:20은 중복으로 처리하지 않는다.
- 겹치는 두 수업을 한 화면에서 나란히 확인하고 수정할 수 있다.
- 같은 학교 겹침은 사유, 처리자, 처리 시각을 남긴 경우에만 저장된다.
- 화면과 서버, 최종 데이터베이스 저장 단계에서 모두 충돌을 검사한다.
공개와 강사 사용
- 운영자가 충돌 없는 시간표를 확정하고 공개할 수 있다.
- 운영자가 강사 계정을 초대하고 연결 상태를 확인할 수 있다.
- 강사는 자신의 공개된 학교·요일·교시·실제 시간·과목을 볼 수 있다.
- 최초 공개와 공개 후 변경이 강사 알림함에 표시된다.
- 변경 알림에서 최신 개인 시간표로 이동할 수 있다.
실제 검증
- 창업자 업체의 학교 약 20곳과 강사 약 35명을 등록할 수 있다.
- 실제 학기 시간표를 엑셀로 올려 오류를 수정할 수 있다.
- 기존 엑셀에서 발견하기 어려웠던 중복 배정을 입력 또는 업로드 단계에서 잡을 수 있다.
- 대표가 시간표를 공개하고 실제 강사가 자신의 일정에 접속할 수 있다.
15. 4~6개월 개발 계획
| 기간 | 주요 작업 | 결과물 |
|---|---|---|
| 1개월 차 | 현재 엑셀 수집, 데이터 항목 확정, 화면 설계, 권한 설계 | 화면 설계서, 엑셀 양식, 데이터 정의 |
| 2개월 차 | 로그인, 업체 계정, 학교·강사 관리, 학기·교시표 | 운영 기본 정보 등록 가능 |
| 3개월 차 | 수업 직접 등록, 전체 시간표, 시간 충돌 검사 | 화면에서 수업 등록과 중복 차단 가능 |
| 3~4개월 차 | 엑셀 다운로드·업로드·행별 수정·최종 반영 | 실제 시간표 일괄 등록 가능 |
| 4~5개월 차 | 강사 초대, 개인 시간표, 공개·변경 알림 | 운영자와 강사 이용 흐름 완성 |
| 5~6개월 차 | 실제 35명·20개 학교 데이터 적용, 오류 수정, 사용성 개선 | 실제 학기 운영에 사용하는 MVP |
개발 우선순위
- 업체별 데이터 분리와 권한
- 학교별 교시명과 실제 시간 관리
- 서버의 중복 배정 차단
- 엑셀 업로드와 행별 수정
- 전체 시간표와 현장 수정
- 강사 초대와 개인 시간표
- 공개·변경 알림
- 실제 학기 검증과 오류 수정
16. 구현 가능성과 주요 위험
구현 가능성이 높은 이유
- 첫 버전은 시간표와 충돌 검사에 집중합니다.
- 학교 공고 파일을 자동으로 해석하지 않고 지정 엑셀 양식을 사용합니다.
- 지도 이동시간, 카카오톡, 결제 같은 외부 연동을 제외합니다.
- 서류 원본과 정산을 제외해 개인정보와 계산 규칙의 복잡성을 낮춥니다.
- 창업자의 실제 업체 데이터를 바로 시험에 사용할 수 있습니다.
주요 위험과 대응
| 위험 | 대응 |
|---|---|
| 학교마다 교시명이 다름 | 교시명과 실제 시간을 함께 저장 |
| 교시표 변경으로 기존 수업 시간이 바뀜 | 자동 변경하지 않고 영향 수를 먼저 표시 |
| 같은 이름의 강사가 여러 명 존재 | 이름이 아닌 강사 식별값으로 저장하고 엑셀에서 직접 선택 |
| 동시 저장으로 중복이 생김 | 서버의 데이터베이스 저장 과정에서 강사·요일 단위로 다시 검사 |
| 엑셀 시간 형식이 서로 다름 | 문자열과 엑셀 시간값을 같은 형식으로 변환 |
| 공개 후 운영자가 잘못 수정함 | 변경 전후 값과 처리자 기록, 강사 변경 알림 생성 |
| 기능 범위가 커져 개발이 늦어짐 | 서류·대체강사·정산·민원·결제·카카오톡을 후속 버전으로 유지 |
17. 후속 개발 순서
첫 시간표 MVP가 실제 학기 운영에서 검증된 뒤 다음 순서로 확장합니다.
-
직전 학기 복사
- 직전 학기 시간표를 복사하고 변경된 부분만 수정
-
서류 상태 관리
- 강사·학교 조합별 필수 서류 종류, 제출 상태, 만료일 기록
- 민감한 원본 파일은 저장하지 않음
-
서류 만료 알림
- 필수 서류 누락
- 유효기간 30일 이내 만료 예정
- 어느 학교, 어느 강사, 어떤 서류인지 표시
-
대체강사 탐색
- 해당 시간에 다른 수업이 없는 강사
- 담당 가능 과목
- 해당 학교 서류 완료 상태
- 바로 연락할 수 있는 정보
-
강사료·재료비 정산
- 학교별 수강 인원
- 강사료와 재료비 분리
- 학교별 지급일
- 강사별 월 지급 예정액
-
민원 기록
- 학교, 수업, 강사, 발생일, 처리 내용 연결
18. 구현 전 확정하거나 가정할 항목
다음 항목은 핵심 기능을 바꾸지 않지만 개발 계약 전에 기준을 문서로 확정해야 합니다.
- 강사 초대 방식: 첫 버전은 이메일 초대로 가정
- 같은 학교 겹침 허용 범위: 첫 버전은 시간 길이 제한 없이 사유 입력 필수로 가정
- 지원 엑셀 형식:
.xlsx를 기본으로 가정 - 교시표 변경: 기존 수업 시간은 자동 변경하지 않는 것으로 확정
- 단축수업·재량휴업일: 첫 버전 수업 계획에서는 제외
- 휴강·보강·격주 수업: 첫 버전에서는 제외
- 이동시간 부족: 첫 버전에서는 계산하거나 경고하지 않음
- 강사 휴대전화 사용: 별도 앱이 아닌 반응형 웹으로 제공
- 브라우저 범위: 최신 Chrome·Edge·Safari 지원을 기본으로 가정
- 한국 표준시: 모든 날짜와 시간을 한국 표준시 기준으로 저장·표시
이 범위를 유지하면 4~6개월 안에 창업자 업체의 실제 학교 약 20곳, 강사 약 35명 데이터를 사용해 중복 배정 방지와 강사 시간표 공개를 검증할 수 있습니다.