방과후 운영 한눈에 기능 요구사항 문서
1. 문서 목적
여러 초등학교·중학교에 방과후·늘봄 강사를 보내는 위탁업체가 학교별 수업과 강사를 배정하고, 같은 강사의 시간 중복을 개강 전에 발견해 수정한 뒤 확정 시간표를 강사에게 공개할 수 있는 웹 서비스를 정의한다.
- 대상 플랫폼: Next.js 기반 웹
- 첫 검증 규모: 강사 약 35명, 학교 약 20곳
- 주요 사용자: 위탁업체 대표·운영 담당자, 소속 강사
- 목표 제작 기간: 외부 개발자 또는 개발사 선정 후 4~6개월
2. 첫 개발 범위
포함
- 위탁업체 계정 시작과 운영자 로그인
- 학교·강사 등록 및 수정
- 학교별 학기·교시 템플릿 설정
- 수업 계획 직접 등록 및 수정
- 지정 엑셀 양식 다운로드와 일괄 등록
- 엑셀 업로드 전 행별 오류 확인과 화면 수정
- 실제 시작·종료 시각 기준 강사 시간 중복 검사
- 서로 다른 학교의 시간 중복 저장 차단
- 중복된 두 수업을 나란히 확인하고 현장에서 수정
- 같은 학교 시간 겹침 예외와 사유 기록
- 전체 시간표 확인
- 확정 시간표 공개
- 강사 초대와 강사 정보 연결
- 강사 개인 시간표 확인
- 시간표 공개·변경 알림과 강사 알림함
첫 개발에서 제외
- 성범죄 경력·아동학대 전력 조회 회신서 등 서류 상태와 만료일 관리
- 민감한 서류 원본 파일 저장
- 서류 만료 알림
- 대체강사 탐색
- 강사료·재료비 정산과 지급 예정액
- 민원 기록
- 카카오톡 연동
- 서비스 내 구독 결제
- 정산 확정 알림
- 직전 학기 시간표 복사
- 이동시간 부족 자동 검사
- 휴강·보강·수업 회차 관리
- 학교 공고 파일 자동 해석
업체 구독료는 서비스 밖에서 별도 청구하고 계좌이체로 받는다.
3. 사용자와 권한
| 사용자 | 할 수 있는 일 | 볼 수 없는 정보 |
|---|---|---|
| 대표·운영 담당자 | 업체, 학교, 강사, 학기, 교시 템플릿, 수업 계획을 관리한다. 시간 중복을 해결하고 시간표를 확정·공개한다. | 다른 위탁업체의 모든 정보 |
| 강사 | 초대받은 위탁업체에 연결된 후 자신의 공개된 개인 시간표와 알림함을 확인한다. | 다른 강사의 시간표, 전체 시간표, 운영자 설정 화면 |
모든 학교, 강사, 수업 계획, 공개본, 알림에는 위탁업체 식별값을 적용한다. 이름이 같아도 학교와 강사는 위탁업체 안에서 발급한 고유 식별값으로 구분한다.
4. 기능 요구사항
FR-001 업체 계정 시작
- 주체: 위탁업체 대표
- 시작 조건: 대표가 업체 계정을 가지고 있지 않다.
- 정상 흐름:
- 대표가 운영자 계정을 만든다.
- 위탁업체 기본 정보를 입력한다.
- 서비스가 위탁업체 식별값을 발급한다.
- 대표 계정에 해당 위탁업체의 운영자 권한을 부여한다.
- 학교·강사 등록을 시작할 수 있는 운영자 화면으로 이동한다.
- 예외 흐름:
- 필수 정보가 빠지면 빠진 항목을 표시하고 완료를 막는다.
- 이미 사용 중인 로그인 정보라면 기존 계정으로 로그인하도록 안내한다.
- 계정은 생성되었지만 위탁업체 생성에 실패하면 불완전한 업체 데이터가 남지 않도록 전체 처리를 취소한다.
- 완료 조건: 대표가 자신의 위탁업체 운영자 화면에 로그인하고 학교·강사 정보를 등록할 수 있다.
FR-002 역할별 로그인과 화면 접근
- 주체: 대표·운영 담당자, 강사
- 시작 조건: 사용자가 운영자 계정을 만들었거나 강사 초대를 통해 계정을 연결했다.
- 정상 흐름:
- 사용자가 로그인한다.
- 서비스가 계정의 역할과 연결된 위탁업체를 확인한다.
- 운영자는 운영자 화면으로 이동한다.
- 강사는 강사 개인 화면으로 이동한다.
- 요청할 때마다 해당 화면에 접근할 권한이 있는지 다시 확인한다.
- 예외 흐름:
- 로그인 정보가 맞지 않으면 계정 존재 여부를 과도하게 노출하지 않고 실패를 안내한다.
- 초대 연결이 끝나지 않은 강사는 개인 시간표 대신 초대 연결 화면으로 이동한다.
- 강사가 운영자 주소로 직접 접근하면 접근을 차단한다.
- 완료 조건: 사용자는 자신의 역할에 허용된 화면과 데이터만 볼 수 있다.
FR-003 학교 정보 관리
- 주체: 대표·운영 담당자
- 시작 조건: 운영자가 위탁업체에 로그인했다.
- 정상 흐름:
- 운영자가 학교를 새로 등록한다.
- 서비스가 학교 고유 식별값을 발급한다.
- 운영자가 등록된 학교 목록을 확인한다.
- 학교 표시 정보를 수정한다.
- 학교를 선택해 학기와 교시 템플릿 설정으로 이동한다.
- 예외 흐름:
- 학교명이 비어 있으면 저장하지 않는다.
- 같은 이름의 학교가 이미 있으면 기존 학교인지 확인하도록 경고한다.
- 학교 이름을 바꾸더라도 연결된 수업 계획은 고유 식별값을 기준으로 유지한다.
- 완료 조건: 운영자가 시간표를 등록할 모든 학교를 목록에서 선택할 수 있다.
FR-004 강사 정보 관리
- 주체: 대표·운영 담당자
- 시작 조건: 운영자가 위탁업체에 로그인했다.
- 정상 흐름:
- 운영자가 강사 정보를 등록한다.
- 서비스가 강사 고유 식별값을 발급한다.
- 운영자가 강사 목록과 강사 초대 상태를 확인한다.
- 강사 표시 정보를 수정한다.
- 등록된 강사를 수업 계획의 담당 강사로 선택한다.
- 예외 흐름:
- 강사 이름이 비어 있으면 저장하지 않는다.
- 이름이 같은 강사가 있어도 서로 다른 고유 식별값으로 저장한다.
- 이름이 같은 강사는 엑셀 업로드에서 자동 선택하지 않고 운영자가 직접 구분하게 한다.
- 완료 조건: 운영자가 모든 강사를 목록에서 구분하고 수업 계획에 배정할 수 있다.
FR-005 학교별 학기·교시 템플릿 관리
- 주체: 대표·운영 담당자
- 시작 조건: 학교가 등록되어 있다.
- 정상 흐름:
- 운영자가 학교와 학기를 선택한다.
- 학기의 시작일과 종료일을 등록한다.
- 교시 템플릿 이름과 적용 기간을 입력한다.
- 요일별 교시명과 실제 시작·종료 시각을 등록한다.
- 서비스가 시간과 적용 기간을 검증한다.
- 검증을 통과한 교시 템플릿을 저장한다.
- 예외 흐름:
- 종료 시각이 시작 시각과 같거나 빠르면 저장하지 않는다.
- 적용 종료일이 시작일보다 빠르면 저장하지 않는다.
- 동일한 학교·학기·요일·적용 범위에서 적용할 교시 템플릿을 한 가지로 결정할 수 없으면 저장을 막는다.
- 이미 등록된 수업 계획에 영향을 주는 교시 템플릿을 변경하면 영향받는 수업 수를 먼저 보여준다.
- 공개된 수업의 실제 시간이 바뀌는 경우에는 충돌 검사를 다시 통과해야 한다.
- 완료 조건: 수업 계획에서 선택한 학교·학기·요일·교시를 실제 시작·종료 시각으로 바꿀 수 있다.
FR-006 엑셀 시간표 양식 다운로드
- 주체: 대표·운영 담당자
- 시작 조건: 운영자가 수업 및 강사 배정 등록 화면에 들어왔다.
- 정상 흐름:
- 운영자가 엑셀 양식 다운로드를 선택한다.
- 서비스가 현재 지원하는 열 이름과 입력 예시가 포함된 파일을 제공한다.
- 운영자가 파일을 내려받아 학교별 수업 내용을 작성한다.
- 예외 흐름:
- 양식 생성에 실패하면 빈 파일을 내려받게 하지 않고 다시 시도하도록 안내한다.
- 완료 조건: 내려받은 양식에 학교명, 운영 기간, 요일, 과목, 강사명, 교시명 또는 시작·종료 시각을 입력할 수 있다.
FR-007 엑셀 파일 임시 읽기와 미리보기
- 주체: 대표·운영 담당자
- 시작 조건: 운영자가 지정 엑셀 양식에 수업 정보를 작성했다.
- 정상 흐름:
- 운영자가 엑셀 파일을 선택해 올린다.
- 서비스가 파일 내용을 시간표에 바로 저장하지 않고 임시 데이터로 읽는다.
- 문자열 시간과 엑셀 시간 형식을 같은 형식으로 변환한다.
- 읽은 행을 표 형태로 보여준다.
- 각 행에 정상, 경고 또는 오류 상태를 표시한다.
- 예외 흐름:
- 지원하지 않는 파일이거나 필수 열을 읽을 수 없으면 업로드를 중단한다.
- 파일의 일부 행을 읽지 못하면 행 번호와 원인을 표시한다.
- 파일 자체를 읽을 수 없으면 기존 시간표에는 아무 데이터도 저장하지 않는다.
- 완료 조건: 운영자가 저장 전에 업로드된 모든 행과 행별 검증 결과를 확인할 수 있다.
FR-008 엑셀 행 검증·수정·확정
- 주체: 대표·운영 담당자
- 시작 조건: 엑셀 파일이 임시 데이터로 읽혀 미리보기 표에 표시되어 있다.
- 정상 흐름:
- 서비스가 각 행의 필수값을 검사한다.
- 학교명과 강사명을 등록된 고유 식별값 후보와 연결한다.
- 교시명만 입력된 경우 학교·학기·요일에 맞는 실제 시간을 찾는다.
- 실제 시작·종료 시각이 모두 입력된 경우 해당 시간을 충돌 검사 기준으로 사용한다.
- 문제가 있는 행을 빨간색과 오류 문구로 표시한다.
- 운영자가 해당 행을 화면에서 직접 수정한다.
- 모든 저장 차단 오류가 해결되면 전체 데이터를 확정한다.
- 예외 흐름:
- 등록되지 않은 학교명은 오류로 처리한다.
- 같은 이름의 강사가 여러 명이면 운영자가 올바른 강사를 선택할 때까지 오류로 처리한다.
- 시간과 교시명 모두 없거나 교시명으로 시간을 찾을 수 없으면 오류로 처리한다.
- 종료 시각이 시작 시각보다 늦지 않으면 오류로 처리한다.
- 교시명과 직접 입력한 실제 시간이 다르면 경고를 표시하고 사용할 값을 확인하게 한다.
- 확정 시점에 다른 저장 요청 때문에 새로운 시간 중복이 생기면 전체 확정을 중단하고 해당 행을 다시 표시한다.
- 완료 조건: 모든 행이 고유한 학교와 강사에 연결되고, 저장 차단 오류 없이 수업 계획으로 저장된다.
FR-009 수업 계획 직접 등록 및 수정
- 주체: 대표·운영 담당자
- 시작 조건: 학교, 강사, 학기 정보가 등록되어 있다.
- 정상 흐름:
- 운영자가 학교와 학기를 선택한다.
- 운영 기간, 요일, 교시 또는 실제 시작·종료 시각, 과목, 담당 강사를 입력한다.
- 교시를 선택하면 해당 교시 템플릿의 실제 시간이 자동으로 표시된다.
- 서비스가 필수값과 시간 중복을 검사한다.
- 문제가 없으면 임시 배정으로 저장한다.
- 운영자가 기존 수업 계획을 열어 같은 방식으로 수정한다.
- 예외 흐름:
- 운영 기간이 학기 범위를 벗어나면 확인할 항목을 표시한다.
- 실제 종료 시각이 시작 시각보다 늦지 않으면 저장하지 않는다.
- 선택한 교시를 실제 시간으로 바꿀 수 없으면 교시 템플릿 등록이나 직접 시간 입력을 요구한다.
- 시간 중복이 발견되면 FR-010과 FR-011의 처리로 연결한다.
- 완료 조건: 수업 계획에 위탁업체, 학교, 학기 또는 운영 기간, 요일, 교시명, 실제 시작·종료 시각, 과목, 강사, 공개 상태가 저장된다.
FR-010 동일 강사 시간 중복 검사와 저장 차단
- 주체: 서비스, 대표·운영 담당자
- 시작 조건: 운영자가 수업 계획을 새로 저장하거나 기존 수업의 시간·요일·운영 기간·강사를 변경한다.
- 정상 흐름:
- 서비스가 같은 위탁업체의 동일한 강사 고유 식별값을 가진 수업을 찾는다.
- 요일이 같고 운영 기간이 겹치는 수업만 비교한다.
- 실제 시작·종료 시각이 겹치는지 검사한다.
- 서로 다른 학교의 수업이 겹치면 저장을 차단한다.
- 충돌한 두 수업의 정보를 운영자에게 보여준다.
- 예외 흐름:
14:00~14:40과14:40~15:20처럼 종료 시각과 다음 시작 시각이 같으면 시간 중복으로 처리하지 않는다.- 실제 시간이 같아도 운영 기간이 겹치지 않으면 저장을 막지 않는다.
- 강사 이름이 같더라도 고유 식별값이 다른 강사라면 충돌로 처리하지 않는다.
- 같은 학교 안의 시간 중복은 FR-012에 따른 예외 저장만 허용한다.
- 완료 조건: 같은 강사가 실제 시간이 겹치는 서로 다른 학교 수업에 저장되지 않는다.
시간 중복 계산식은 다음과 같다.
기존 수업 시작 < 새 수업 종료
그리고
새 수업 시작 < 기존 수업 종료
FR-011 중복된 두 수업 현장 수정
- 주체: 대표·운영 담당자
- 시작 조건: 시간 중복 검사에서 저장 차단 충돌이 발견되었다.
- 정상 흐름:
- 서비스가 충돌한 두 수업을 나란히 펼친다.
- 각 수업의 학교, 요일, 교시, 실제 시간, 과목, 강사를 보여준다.
- 운영자가 수정할 수업 한쪽을 선택한다.
- 시간, 교시 또는 담당 강사를 변경한다.
- 서비스가 변경된 내용으로 충돌을 다시 검사한다.
- 충돌이 해소되면 수업을 저장한다.
- 예외 흐름:
- 변경 후 다른 수업과 새로운 충돌이 발생하면 새 충돌 대상을 표시하고 계속 저장을 막는다.
- 수정을 취소하면 원래 저장되지 않은 상태로 돌아간다.
- 서로 다른 학교의 시간 중복에는 사유 입력을 통한 강제 저장을 제공하지 않는다.
- 완료 조건: 운영자가 전체 시간표를 처음부터 다시 작성하지 않고 충돌한 수업 한쪽만 바꿔 저장할 수 있다.
FR-012 같은 학교 시간 겹침 예외 저장
- 주체: 대표·운영 담당자
- 시작 조건: 동일한 강사의 수업 두 건이 같은 학교 안에서 실제 시간이 겹친다.
- 정상 흐름:
- 서비스가 같은 학교의 시간 겹침임을 표시한다.
- 운영자가 예외 저장을 선택한다.
- 운영자가 예외 사유를 입력한다.
- 서비스가 사유, 처리한 운영자, 처리 시각, 관련 수업 식별값을 저장한다.
- 수업을 저장하고 전체 시간표에 예외 표시를 남긴다.
- 예외 흐름:
- 사유가 비어 있으면 예외 저장을 허용하지 않는다.
- 두 수업의 학교가 다르면 예외 저장을 허용하지 않는다.
- 이후 수업의 학교나 시간이 바뀌면 예외 적용 가능 여부를 다시 검사한다.
- 완료 조건: 운영자가 같은 학교 안의 의도된 시간 겹침을 사유와 함께 저장하고 나중에 다시 확인할 수 있다.
FR-013 전체 시간표 확인
- 주체: 대표·운영 담당자
- 시작 조건: 한 건 이상의 수업 계획이 등록되어 있다.
- 정상 흐름:
- 운영자가 전체 시간표를 연다.
- 서비스가 학교, 요일, 교시, 실제 시간, 과목, 강사, 배정 상태를 표로 보여준다.
- 운영자가 학기, 학교, 강사, 요일을 기준으로 필요한 수업을 찾는다.
- 시간 중복과 같은 학교 시간 겹침 예외를 해당 수업에 표시한다.
- 수업을 선택하면 등록·수정 화면 또는 충돌 수정 영역을 연다.
- 예외 흐름:
- 등록된 수업이 없으면 첫 수업 직접 등록과 엑셀 업로드로 이동할 수 있는 빈 화면을 보여준다.
- 필터 결과가 없으면 시간표 전체가 없는 것으로 오해하지 않도록 적용 중인 조건을 표시한다.
- 완료 조건: 운영자가 여러 학교의 수업 배정 상태와 해결할 충돌을 한 화면에서 확인할 수 있다.
FR-014 확정 시간표 생성과 공개
- 주체: 대표·운영 담당자
- 시작 조건: 수업 계획이 등록되어 있고 시간 충돌 검사를 수행할 수 있다.
- 정상 흐름:
- 운영자가 공개할 학기와 수업 범위를 선택한다.
- 서비스가 서로 다른 학교의 시간 중복을 다시 검사한다.
- 같은 학교의 시간 중복에는 예외 사유가 있는지 확인한다.
- 조건을 통과한 수업을 확정 시간표로 처리한다.
- 운영자가 시간표 공개를 실행한다.
- 서비스가 공개본 식별값과 공개 시각을 저장한다.
- 해당 강사가 자신의 개인 시간표에서 공개된 수업을 볼 수 있게 한다.
- 예외 흐름:
- 해결되지 않은 시간 중복이 있으면 확정과 공개를 막고 충돌 수업으로 이동시킨다.
- 같은 학교 시간 중복의 예외 사유가 빠져 있으면 공개하지 않는다.
- 공개 처리 중 일부만 반영되는 오류가 발생하면 공개본을 생성하지 않는다.
- 완료 조건: 충돌 검사를 통과한 최신 시간표가 공개본으로 기록되고 해당 강사에게 보인다.
FR-015 강사 초대와 강사 정보 연결
- 주체: 대표·운영 담당자, 강사
- 시작 조건: 운영자가 강사 정보를 등록했다.
- 정상 흐름:
- 운영자가 등록된 강사에 대한 초대 링크를 생성한다.
- 서비스가 초대 전, 초대됨, 연결 완료 상태를 표시한다.
- 강사가 초대 링크를 연다.
- 강사가 계정을 만들거나 기존 계정으로 로그인한다.
- 서비스가 초대 대상 강사 정보와 로그인 계정을 연결한다.
- 강사가 개인 시간표와 알림함으로 이동한다.
- 예외 흐름:
- 이미 다른 계정과 연결된 초대는 중복 연결하지 않는다.
- 유효하지 않은 초대 링크는 연결하지 않고 운영자에게 새 초대를 요청하도록 안내한다.
- 한 계정이 다른 사람의 강사 정보에 임의로 연결되지 않도록 초대 대상을 확인한다.
- 완료 조건: 강사 계정이 위탁업체에 등록된 정확한 강사 고유 식별값과 연결된다.
초대 링크를 강사에게 전달할 채널은 확인 필요이다. 첫 버전에는 카카오톡 자동 발송을 포함하지 않으며, 링크 복사 방식은 지원해야 한다.
FR-016 강사 개인 시간표 확인
- 주체: 강사
- 시작 조건: 강사 계정이 위탁업체의 강사 정보와 연결되어 있고 시간표가 공개되었다.
- 정상 흐름:
- 강사가 로그인한다.
- 서비스가 연결된 강사 고유 식별값을 확인한다.
- 해당 강사에게 공개된 최신 수업만 조회한다.
- 학교, 요일, 교시, 실제 시작·종료 시각, 과목을 보여준다.
- 강사가 알림함에서 변경된 시간표로 이동할 수 있다.
- 예외 흐름:
- 공개된 수업이 없으면 “공개된 시간표가 없습니다”라는 상태를 보여준다.
- 임시 배정과 공개 전 확정 시간표는 강사에게 보여주지 않는다.
- 강사가 다른 강사의 주소나 식별값으로 접근해도 해당 데이터를 반환하지 않는다.
- 완료 조건: 강사가 운영자에게 별도로 묻지 않고 자신의 최신 공개 시간표를 확인할 수 있다.
FR-017 시간표 공개·변경 알림 생성
- 주체: 서비스
- 시작 조건: 운영자가 시간표를 처음 공개하거나 공개된 시간표를 변경해 다시 저장했다.
- 정상 흐름:
- 서비스가 직전 공개본과 새 공개본을 비교한다.
- 추가, 변경 또는 제외된 수업과 영향을 받는 강사를 찾는다.
- 영향을 받는 강사별로 서비스 안 알림을 한 번 생성한다.
- 알림에 변경된 학교, 요일, 교시명, 실제 시간, 과목, 변경 시각을 포함한다.
- 여러 수업이 한 번에 바뀌면 한 변경 작업 안에서 해당 강사의 변경 목록을 함께 제공한다.
- 예외 흐름:
- 같은 공개 또는 변경 작업을 다시 처리하더라도 같은 강사에게 중복 알림을 만들지 않는다.
- 강사 계정이 아직 연결되지 않았으면 강사 정보에 알림을 연결해 두고 계정 연결 후 확인할 수 있게 한다.
- 변경 저장이 실패하면 알림을 생성하지 않는다.
- 완료 조건: 시간표 공개 또는 변경에 영향을 받은 강사의 알림함에 정확히 한 번 알림이 생성된다.
FR-018 강사 알림함 확인
- 주체: 강사
- 시작 조건: 강사 계정에 하나 이상의 시간표 공개·변경 알림이 연결되어 있다.
- 정상 흐름:
- 강사가 알림함을 연다.
- 서비스가 읽지 않은 알림과 읽은 알림을 구분해 보여준다.
- 강사가 알림을 선택한다.
- 서비스가 해당 알림을 읽음으로 처리한다.
- 변경된 개인 시간표 위치로 이동한다.
- 예외 흐름:
- 알림에 포함된 수업이 이후 제외되었으면 현재 최신 시간표와 제외 사실을 함께 이해할 수 있게 표시한다.
- 다른 강사의 알림 주소에 접근하면 내용을 보여주지 않는다.
- 완료 조건: 강사가 자신에게 온 시간표 공개·변경 알림을 확인하고 최신 개인 시간표로 이동할 수 있다.
FR-019 공개본과 예외 기록 조회
- 주체: 대표·운영 담당자
- 시작 조건: 시간표를 공개했거나 같은 학교 시간 겹침 예외를 저장했다.
- 정상 흐름:
- 운영자가 수업 상세 또는 전체 시간표에서 기록을 연다.
- 서비스가 공개본 식별값과 공개 시각을 보여준다.
- 같은 학교 시간 겹침 예외가 있으면 사유, 처리한 운영자, 처리 시각, 관련 수업을 보여준다.
- 공개된 시간표가 변경된 경우 변경 전후 값을 확인할 수 있게 한다.
- 예외 흐름:
- 기록과 연결된 운영자 계정의 표시 정보가 바뀌어도 당시 처리한 계정 식별값과 처리 시각은 유지한다.
- 수업 표시 정보가 수정되어도 예외 기록이 다른 수업에 잘못 연결되지 않게 한다.
- 완료 조건: 운영자가 시간표가 언제 공개되었고 시간 겹침을 어떤 사유로 허용했는지 나중에 확인할 수 있다.
5. 화면 요구사항
UIR-001 운영자 로그인 및 업체 시작 화면
- 화면 ID:
admin-login-start - 사용 목적: 대표가 업체 계정을 만들거나 로그인해 운영을 시작한다.
- 주요 구성:
- 계정 생성 및 로그인 영역
- 위탁업체 기본 정보 입력
- 업체 시작 완료 후 학교·강사 등록 이동
- 예외 표시: 빠진 필수값, 로그인 실패, 업체 생성 실패를 해당 입력 영역에 표시한다.
- 완료 조건: 운영자가 자신의 위탁업체 운영자 화면에 들어간다.
- 연결 기능: FR-001, FR-002
UIR-002 운영자 화면
- 화면 ID:
operator - 사용 목적: 운영자가 학교·강사·수업 배정·전체 시간표로 이동한다.
- 주요 구성:
- 학교·강사 목록
- 학기·교시표 설정
- 수업 직접 등록
- 엑셀 등록
- 전체 시간표
- 로그아웃
- 예외 표시: 업체 연결이 없는 운영자는 업체 시작 화면으로 이동한다.
- 완료 조건: 운영자가 학기 시작 전 업무에 필요한 각 관리 화면으로 이동할 수 있다.
- 연결 기능: FR-002, FR-003, FR-004, FR-013
UIR-003 학교·강사 목록 관리 화면
- 화면 ID:
school-instructor-list - 사용 목적: 운영자가 수업 배정에 필요한 학교와 강사를 등록·수정한다.
- 주요 구성:
- 학교 목록과 등록·수정
- 강사 목록과 등록·수정
- 강사 초대 상태와 초대 링크 생성
- 학교별 학기·교시표 설정 이동
- 수업 배정 등록 이동
- 예외 표시: 같은 이름 후보, 빠진 이름, 저장 실패를 항목별로 표시한다.
- 완료 조건: 운영 대상 학교와 강사를 수업 계획에서 선택할 수 있다.
- 연결 기능: FR-003, FR-004, FR-015
UIR-004 학교별 학기·교시표 설정 화면
- 화면 ID:
school-term-period-settings - 사용 목적: 학교별 학기와 교시 템플릿의 적용 기간, 교시명, 실제 시간을 설정한다.
- 주요 구성:
- 학교와 학기 선택
- 학기 시작일·종료일
- 교시 템플릿 이름과 적용 기간
- 요일별 교시명·시작 시각·종료 시각 입력 표
- 기존 수업 영향 건수
- 예외 표시: 종료 시각 오류, 적용 기간 오류, 적용 범위가 겹쳐 템플릿을 결정할 수 없는 상태를 표시한다.
- 완료 조건: 모든 교시의 종료 시각이 시작 시각보다 늦고, 동일 적용 범위에서 사용할 교시 템플릿이 한 가지로 결정된다.
- 연결 기능: FR-005
UIR-005 학교별 수업 및 강사 배정 등록 화면
- 화면 ID:
class-assignment - 사용 목적: 운영자가 수업 계획을 한 건씩 등록하고 학기 중 변경 사항을 수정한다.
- 주요 구성:
- 학교·학기
- 운영 기간
- 요일
- 교시명
- 실제 시작·종료 시각
- 과목
- 담당 강사
- 임시 배정 저장
- 엑셀 양식 다운로드 및 업로드 이동
- 예외 표시: 필수값 누락, 시간 오류, 교시 해석 오류, 시간 중복을 구체적인 원인과 함께 표시한다.
- 완료 조건: 충돌이 없는 수업 계획이 임시 배정으로 저장된다.
- 연결 기능: FR-006, FR-009, FR-010
UIR-006 엑셀 업로드 확인 및 수정 화면
- 화면 ID:
excel-import-preview - 사용 목적: 지정 엑셀 양식의 내용을 저장 전에 확인하고 문제가 있는 행만 수정한다.
- 주요 구성:
- 업로드 파일 정보
- 행 번호
- 학교, 운영 기간, 요일, 과목, 강사, 교시, 실제 시간
- 행별 정상·경고·오류 상태
- 오류 행 직접 수정
- 전체 검증
- 확정 저장
- 예외 표시: 오류 행은 빨간색만 사용하지 않고 오류 아이콘과 원인 문구를 함께 표시한다.
- 완료 조건: 모든 저장 차단 오류가 해결된 후 전체 행이 수업 계획으로 확정된다.
- 연결 기능: FR-007, FR-008, FR-010
UIR-007 전체 시간표와 중복 배정 경고 화면
- 화면 ID:
master-timetable - 사용 목적: 운영자가 여러 학교의 전체 시간표와 해결되지 않은 시간 중복을 한 화면에서 확인한다.
- 주요 구성:
- 학기, 학교, 강사, 요일 찾기 조건
- 학교, 요일, 교시명, 실제 시간, 과목, 강사, 상태가 포함된 표
- 시간 중복 표시
- 같은 학교 시간 겹침 예외 표시
- 충돌한 두 수업의 나란히 보기
- 한쪽 수업 바로 수정
- 확정 및 공개
- 예외 표시: 서로 다른 학교의 시간 중복에는 예외 저장 버튼을 제공하지 않는다.
- 완료 조건: 운영자가 모든 저장 차단 충돌을 해결하고 시간표를 확정·공개할 수 있다.
- 연결 기능: FR-010, FR-011, FR-012, FR-013, FR-014, FR-019
UIR-008 강사 로그인 및 초대 연결 화면
- 화면 ID:
instructor-login-invite - 사용 목적: 초대받은 강사가 계정을 만들거나 로그인하고 등록된 강사 정보와 연결한다.
- 주요 구성:
- 초대 대상 위탁업체와 강사 정보 확인
- 계정 생성 또는 로그인
- 연결 완료 안내
- 개인 시간표 이동
- 알림함 이동
- 예외 표시: 유효하지 않은 초대, 이미 사용된 초대, 다른 계정에 연결된 상태를 표시한다.
- 완료 조건: 로그인 계정과 위탁업체의 강사 고유 식별값이 연결된다.
- 연결 기능: FR-002, FR-015
UIR-009 강사 개인 화면
- 화면 ID:
instructor - 사용 목적: 강사가 개인 시간표와 알림함으로 이동한다.
- 주요 구성:
- 개인 시간표
- 읽지 않은 알림 표시
- 알림함
- 로그아웃
- 예외 표시: 연결된 강사 정보가 없으면 초대 연결 화면으로 이동한다.
- 완료 조건: 강사가 다른 강사의 정보 없이 자신의 기능만 사용할 수 있다.
- 연결 기능: FR-002, FR-016, FR-018
UIR-010 강사 개인 시간표 화면
- 화면 ID:
instructor-timetable - 사용 목적: 강사가 자신의 최신 공개 시간표를 확인한다.
- 주요 구성:
- 학교
- 요일
- 교시명
- 실제 시작·종료 시각
- 과목
- 최신 공개 시각
- 알림함 이동
- 예외 표시: 공개된 시간표가 없으면 빈 상태와 안내 문구를 보여준다.
- 완료 조건: 강사가 자신이 어느 학교의 어느 시간에 어떤 과목을 담당하는지 확인한다.
- 연결 기능: FR-016
UIR-011 강사 알림함 화면
- 화면 ID:
instructor-notifications - 사용 목적: 강사가 시간표 공개·변경 알림을 모아 보고 최신 개인 시간표로 이동한다.
- 주요 구성:
- 읽지 않음·읽음 상태
- 공개 또는 변경 구분
- 학교, 요일, 교시명, 실제 시간, 과목
- 변경 시각
- 개인 시간표 이동
- 예외 표시: 삭제되거나 제외된 수업의 알림은 현재 시간표에 없다는 사실을 표시한다.
- 완료 조건: 강사가 알림을 읽고 변경된 개인 시간표를 확인할 수 있다.
- 연결 기능: FR-017, FR-018
6. 비기능 요구사항
NFR-001 위탁업체별 데이터 분리
- 모든 학교, 강사, 학기, 교시 템플릿, 수업 계획, 공개본, 예외 기록, 알림에는 위탁업체 식별값을 저장한다.
- 화면 접근과 서버 요청에서 모두 위탁업체와 사용자 역할을 검사한다.
- 주소나 요청값을 바꾸더라도 다른 위탁업체의 데이터가 조회·수정되지 않아야 한다.
- 강사는 자신의 강사 고유 식별값에 연결된 공개 시간표와 알림만 볼 수 있어야 한다.
NFR-002 중복 배정의 서버·데이터베이스 차단
- 시간 중복 검사는 화면에서 먼저 수행하고 서버에서 다시 수행한다.
- 동시에 두 개의 저장 요청이 들어와도 서로 다른 학교의 시간 중복이 만들어지지 않도록 데이터베이스 저장 과정에서 재검사한다.
- 충돌 검사와 저장은 중간 상태가 남지 않는 하나의 처리로 수행한다.
- 엑셀 확정 과정에서도 개별 화면 등록과 같은 충돌 규칙을 사용한다.
NFR-003 시간 처리 일관성
- 모든 시간은 한국 표준시를 기준으로 저장하고 표시한다.
- 실제 시간 비교는 시작 시각을 포함하고 종료 시각을 제외한다.
- 날짜와 시간은 화면, 엑셀 업로드, 서버 검사에서 같은 규칙으로 변환한다.
- 운영 기간의 시작일과 종료일은 충돌 검사에 포함한다.
NFR-004 인증과 전송 보안
- 로그인 상태가 필요한 모든 화면은 인증되지 않은 접근을 차단한다.
- 비밀번호를 사용하는 경우 원문 그대로 저장하지 않는다.
- 로그인 정보와 서비스 데이터는 암호화된 웹 연결을 통해 전송한다.
- 강사 초대는 임의로 추측하기 어려운 초대 링크를 사용한다.
- 초대 연결 완료 후 같은 링크로 다른 계정을 추가 연결할 수 없어야 한다.
NFR-005 민감정보 최소화
- 첫 버전에는 성범죄 경력·아동학대 전력 조회 회신서 등 민감한 원본 파일을 저장하는 입력란, 업로드 영역, 데이터 저장소를 만들지 않는다.
- 첫 버전에는 서류 종류, 제출 상태, 만료일도 저장하지 않는다.
- 시간표 운영에 필요하지 않은 강사 개인정보는 필수 입력으로 요구하지 않는다.
NFR-006 엑셀 업로드 안전성
- 업로드된 파일을 실행 가능한 프로그램으로 처리하지 않고 데이터 읽기 용도로만 사용한다.
- 파일을 읽지 못하거나 양식이 다르면 기존 시간표를 변경하지 않는다.
- 엑셀 데이터는 임시 상태로 검증한 후 운영자가 확정해야 실제 수업 계획에 반영한다.
- 확정 실패 시 일부 행만 저장된 상태가 남지 않아야 한다.
NFR-007 접근성과 오류 표현
- 시간 중복과 엑셀 오류를 색상만으로 구분하지 않고 아이콘과 문구를 함께 사용한다.
- 입력 오류 문구는 어떤 항목이 잘못되었고 어떻게 고쳐야 하는지 설명한다.
- 로그인, 수업 입력, 엑셀 행 수정, 공개, 알림 확인의 주요 기능은 키보드로 이동하고 실행할 수 있어야 한다.
- 입력 항목에는 화면에서 의미를 알 수 있는 이름을 제공한다.
NFR-008 검증 데이터 규모
- 첫 MVP는 강사 약 35명, 학교 약 20곳의 실제 학기 데이터를 이용해 검수한다.
- 해당 규모에서 전체 시간표 조회, 수업 저장과 충돌 검사, 엑셀 미리보기와 확정 작업을 완료할 수 있어야 한다.
- 대량 데이터 처리 중 화면이 멈추거나 일부 데이터가 사라지는 오류가 없어야 한다.
- 구체적인 응답 시간 기준은 개발 계약 전에 실제 엑셀 행 수를 확인해 확정한다.
NFR-009 웹 제공 기준
- 서비스는 Next.js 기반 웹으로 제공한다.
- 운영자 시간표 편집은 표를 충분히 볼 수 있는 데스크톱 웹을 우선 기준으로 한다.
- 별도 모바일 앱과 앱 스토어 배포는 첫 개발 범위에 포함하지 않는다.
- 강사 개인 시간표와 알림함의 좁은 화면 최적화 수준은 확인 필요이다.
7. MVP 최종 검수 시나리오
| 검수 상황 | 통과 기준 |
|---|---|
| 운영자가 업체를 시작하고 학교·강사를 등록한다. | 학교와 강사가 고유 식별값으로 저장되고 수업 등록에서 선택된다. |
| A학교 화요일 14:00~14:40과 B학교 화요일 14:20~15:00에 같은 강사를 배정한다. | 저장이 차단되고 두 수업이 나란히 표시된다. |
| A학교 화요일 14:00~14:40과 B학교 화요일 14:40~15:20에 같은 강사를 배정한다. | 실제 시간은 겹치지 않으므로 저장된다. 이동시간 부족은 첫 버전에서 판단하지 않는다. |
| 실제 시간은 같지만 두 수업의 운영 기간이 겹치지 않는다. | 시간 중복으로 차단하지 않는다. |
| 같은 학교에서 동일 강사의 시간이 겹친다. | 사유 없이는 저장되지 않고, 사유 입력 후 예외 기록과 함께 저장된다. |
| 엑셀에 미등록 학교, 같은 이름의 강사, 비어 있는 시간을 포함한다. | 해당 행이 오류로 표시되고 화면에서 수정하기 전에는 확정되지 않는다. |
| 충돌이 없는 시간표를 공개한다. | 공개본 식별값과 공개 시각이 저장되고 강사 개인 시간표에 나타난다. |
| 공개된 수업의 학교·요일·교시·시간·과목을 변경한다. | 영향을 받는 강사에게 변경 알림이 한 번 생성되고 최신 시간표로 이동한다. |
| 강사가 다른 강사의 시간표 주소로 접근한다. | 접근이 차단되고 다른 강사의 데이터가 반환되지 않는다. |
| 두 운영자가 동시에 같은 강사를 겹치는 시간에 저장한다. | 데이터베이스 저장 단계에서 하나의 요청이 차단되어 서로 다른 학교의 시간 중복이 남지 않는다. |
8. 구현 전 확인 필요 항목
- 운영자와 강사의 구체적인 로그인 방식
- 강사 초대 링크의 기본 전달 방식
- 교시 템플릿 변경 시 기존 수업 시간을 유지할지 새 시간으로 바꿀지 선택하는 상세 화면
- 운영 기간이 여러 교시 템플릿 적용 기간을 가로지르는 경우의 입력 방식
- 강사 개인 시간표와 알림함의 좁은 모바일 웹 화면 최적화 수준
- 실제 검증에 사용할 한 학기 엑셀 행 수와 이에 따른 응답 시간 기준
- 직전 학기 복사 기능의 후속 개발 시점
- 이동시간 부족, 단축수업, 재량휴업일, 휴강·보강·수업 회차의 후속 처리 범위