출석 저장소를 기반으로 미션을 진행한다. 온라인 코드 리뷰 요청 1단계 문서를 참고해 실습 환경을 구축한다.
- 미션 시작 버튼을 눌러 미션을 시작한다.
- 저장소에 자신의 GitHub 아이디로 된 브랜치가 생성되었는지 확인한다.
- 저장소를 자신의 계정으로 Fork 한다.
우아한테크코스에서는 학생(이하 크루)의 출석 관리에 특별한 주의를 기울이고 있습니다. 하지만, 지금까지 수동으로 관리하던 출석부로는 많은 크루의 출석 현황을 효율적으로 파악하기 어려워졌습니다. 특히, 지난달에는 출석 관리의 어려움으로 인해 여러 가지 문제가 발생했습니다. 제때 누적 지각 크루를 파악하지 못해 면담이 지연되었고, 결석 일수를 계산하는 과정에서 실수가 발생하기도 하였습니다.
따라서 2024년 12월 한 달 동안 시범적으로 최소한의 기능을 갖춘 출석 시스템을 개발하여 출석을 체계적으로 관리하기로 하였습니다. 이 시스템은 코치가 사용하게 됩니다. 아래 요구 사항을 충족하는 출석 시스템을 개발해 주시기를 바랍니다.
- 출석 시스템의 출석 확인은 크루가 캠퍼스에 들어온 후 시스템에 출석 데이터가 저장된 시간을 기준으로 한다.
- 시간은 24시간 형식만 사용한다. 예를 들어, "22:30"은 오후 10시 30분을 의미한다.
- 교육 시간은 월요일은 13:00
18:00, 화요일금요일은 10:00~18:00이다.- 해당 요일의 시작 시각으로부터 5분 초과는 지각으로 간주한다.
- 해당 요일의 시작 시각으로부터 30분 초과는 결석으로 간주한다.
- 등교하지 않아 출석 기록이 없는 날은 결석으로 간주한다.
- 누적 지각 및 결석 횟수에 따라 경고 또는 면담을 시행한다. 또한 결석 횟수가 5회를 초과할 때 제적을 시행한다.
- 지각 3회는 결석 1회로 간주한다.
- 경고 대상자: 결석 2회 이상
- 면담 대상자: 결석 3회 이상
- 제적 대상자: 결석 5회 초과
- 지각 3회는 결석 1회로 간주한다.
- 캠퍼스 운영 시간은 매일 08:00~23:00이다.
- 주말 및 공휴일에는 출석을 받지 않는다.
- 출석 시스템에 등록된 크루와 12월 출석 기록은 제공된 파일(attendances.csv)에서 확인할 수 있다.
- 프로그램은 사용자가 종료할 때까지 종료되지 않으며, 해당 기능을 수행한 후 초기 화면으로 돌아간다.
- 닉네임과 등교 시간을 입력하면 출석할 수 있다.
- 출석 후 출석 기록을 확인할 수 있다.
- 이미 출석한 경우, 다시 출석할 수 없으며 수정 기능을 이용하도록 안내한다.
닉네임을 입력해 주세요.
이든
등교 시간을 입력해 주세요.
09:59
12월 05일 화요일 09:59 (출석)
- 출석 확인을 수정하려면 닉네임, 수정하려는 날짜, 등교 시간을 입력하여 기록을 수정할 수 있다.
- 수정 후에는 변경 전과 변경 후의 출석 기록을 확인할 수 있다.
출석을 수정하려는 크루의 닉네임을 입력해 주세요.
빙티
수정하려는 날짜(일)를 입력해 주세요.
3
언제로 변경하겠습니까?
09:58
12월 03일 화요일 10:07 (지각) -> 09:58 (출석) 수정 완료!
- 닉네임을 입력하면 전날까지의 크루 출석 기록을 확인할 수 있다.
닉네임을 입력해 주세요.
빙티
이번 달 빙티의 출석 기록입니다.
12월 02일 월요일 13:00 (출석)
12월 03일 화요일 10:07 (지각)
12월 04일 수요일 10:02 (출석)
12월 05일 목요일 10:06 (지각)
12월 06일 금요일 10:01 (출석)
12월 09일 월요일 --:-- (결석)
12월 10일 화요일 10:03 (출석)
12월 11일 수요일 --:-- (결석)
12월 12일 목요일 --:-- (결석)
12월 13일 금요일 10:02 (출석)
출석: 5회
지각: 2회
결석: 3회
면담 대상자입니다.
- 전날까지의 크루 출석 기록을 바탕으로 제적 위험자를 파악한다.
- 제적 위험자는 제적 대상자, 면담 대상자, 경고 대상자순으로 출력하며, 대상 항목별 정렬 순서는 지각을 결석으로 간주하여 내림차순한다. 출석 상태가 같으면 닉네임으로 오름차순 정렬한다.
제적 위험자 조회 결과
- 빙티: 결석 3회, 지각 4회 (면담)
- 이든: 결석 2회, 지각 5회 (면담)
- 빙봉: 결석 1회, 지각 6회 (면담)
- 쿠키: 결석 2회, 지각 3회 (면담)
- 짱수: 결석 0회, 지각 6회 (경고)
자세한 입력 예시는 실행 결과 예시를 참고하며, 프로그램을 시작하면 **src/main/resources/attendances.csv
**를 통해 구현에 필요한 정보를 조회한다.
- 닉네임과 출석 일시가 기록되어 있다.
nickname,datetime
쿠키,2024-12-13 10:08
빙봉,2024-12-13 10:07
빙티,2024-12-13 10:07
이든,2024-12-13 10:07
오늘은 12월 14일 토요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
1
[ERROR] 12월 14일 토요일은 등교일이 아닙니다.
오늘은 12월 13일 금요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
1
닉네임을 입력해 주세요.
빈봉
[ERROR] 등록되지 않은 닉네임입니다.
오늘은 12월 13일 금요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
1
닉네임을 입력해 주세요.
이든
등교 시간을 입력해 주세요.
09:59
12월 13일 금요일 09:59 (출석)
오늘은 12월 13일 금요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
2
출석을 수정하려는 크루의 닉네임을 입력해 주세요.
빙티
수정하려는 날짜(일)를 입력해 주세요.
3
언제로 변경하겠습니까?
09:58
12월 03일 화요일 10:07 (지각) -> 09:58 (출석) 수정 완료!
오늘은 12월 13일 금요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
3
닉네임을 입력해 주세요.
빙티
이번 달 빙티의 출석 기록입니다.
12월 02일 월요일 13:00 (출석)
12월 03일 화요일 09:58 (출석)
12월 04일 수요일 10:02 (출석)
12월 05일 목요일 10:06 (지각)
12월 06일 금요일 10:01 (출석)
12월 09일 월요일 --:-- (결석)
12월 10일 화요일 10:08 (지각)
12월 11일 수요일 --:-- (결석)
12월 12일 목요일 --:-- (결석)
출석: 4회
지각: 2회
결석: 3회
면담 대상자입니다.
오늘은 12월 13일 금요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
4
제적 위험자 조회 결과
- 빙티: 결석 3회, 지각 2회 (면담)
- 이든: 결석 2회, 지각 4회 (면담)
- 쿠키: 결석 2회, 지각 2회 (경고)
- 빙봉: 결석 1회, 지각 5회 (경고)
오늘은 12월 13일 금요일입니다. 기능을 선택해 주세요.
1. 출석 확인
2. 출석 수정
3. 크루별 출석 기록 확인
4. 제적 위험자 확인
Q. 종료
Q
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 기본적으로 Java Style Guide을 원칙으로 한다.
- indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
- 3항 연산자를 쓰지 않는다.
- else 예약어를 쓰지 않는다.
- else 예약어를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
- 힌트: if문에서 값을 반환하는 방식으로 구현하면 else 예약어를 사용하지 않아도 된다.
- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다.
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- 배열 대신 컬렉션을 사용한다.
- Java Enum을 적용한다.
- 모든 원시 값과 문자열을 포장한다
- 줄여 쓰지 않는다(축약 금지).
- 일급 컬렉션을 쓴다.
- README.md 파일에 구현할 기능 목록을 정리해 추가한다.
- Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.
- AngularJS Git Commit Message Conventions 참고해 커밋 메시지를 작성한다.
nickname,datetime
쿠키,2024-12-13 10:08
빙봉,2024-12-13 10:07
빙티,2024-12-13 10:07
이든,2024-12-13 10:07
빙봉,2024-12-12 11:11
이든,2024-12-12 10:06
짱수,2024-12-12 10:00
빙봉,2024-12-11 10:02
쿠키,2024-12-11 10:02
빙티,2024-12-10 10:08
빙봉,2024-12-10 10:06
이든,2024-12-10 10:02
쿠키,2024-12-10 10:01
짱수,2024-12-10 10:00
쿠키,2024-12-09 13:03
빙봉,2024-12-09 13:02
이든,2024-12-09 13:01
짱수,2024-12-09 13:00
빙봉,2024-12-06 10:08
이든,2024-12-06 10:07
빙티,2024-12-06 10:01
짱수,2024-12-06 10:00
쿠키,2024-12-05 10:07
빙봉,2024-12-05 10:06
빙티,2024-12-05 10:06
짱수,2024-12-05 10:00
이든,2024-12-04 10:08
빙봉,2024-12-04 10:07
빙티,2024-12-04 10:02
쿠키,2024-12-04 10:02
짱수,2024-12-04 10:00
빙티,2024-12-03 10:07
이든,2024-12-03 10:06
쿠키,2024-12-03 10:06
빙봉,2024-12-03 10:03
짱수,2024-12-03 10:00
빙봉,2024-12-02 13:06
이든,2024-12-02 13:02
쿠키,2024-12-02 13:01
빙티,2024-12-02 13:00
짱수,2024-12-02 13:00