부트캠프/프로젝트

[부트캠프] NBCStudentManager 프로젝트 1일차

Cocori_ 2024. 8. 7. 20:54

프로젝트 명 NBCStudentManager 

학생 정보를 관리하는 프로그램을 만드는 프로젝트로 

다음의 UML 기반으로 제작했다.

 

[ 프로그램 UML ]

내가 맡은 역할 

조회하고자 하는 학생이 듣는 과목의 특정 회차 등급을 조회하는 함수를 구현하는 것이 내가 맡은 역할이었다. 

 

우선, 제일 먼저 해당 함수의 시나리오를 구상해봤다.

 

  • 학생의 고유번호를 입력 받는다.
  • 학생이 실존하는 학생인지 체크한다.
  • 과목 번호를 입력 받는다.
  • 학생이 해당 과목을 듣는지 체크한다.
  • 회차를 입력 받는다.
  • 학생이 해당 회차에 시험을 봤는지 체크한다.
  • 출력한다.

그 다음, 아래와 내용과 같이 세부적으로 파고 들었다.

  • 학생이 실존하는 학생인지 체크하기
    • List에 해당 학생의 ID가 있는지 확인한다.
  • 과목 번호를 입력받는다.
    • List에 해당 과목ID와 일치한 객체가 있는지 확인한다.
    • 그 후, 해당 Student객체에서 수강중인 과목 List에 입력받은 과목 번호가 있는지 체크한다.
  • 회차를 입력 받는다.
    • 회차가 1~10 사이의 숫자인지 체크한다.
    • Score List에 입력받은 과목 ID, 학생 ID 정보를 담고 있는 내용이 있는지 확인하고, 
      해당 회차에 시험을 봤는지 확인한다.

 

문제점

Filter와 findFirst와 같은 메서드를 처음 써보다보니 확인하는 기능을 구현하던 중 길을 잃었다.

 

내가 예상한 findFirst는 매개 변수로 Ramda 함수를 넣어줄 경우 해당 내용과 일치하는 첫번째 객체를 반환할 줄 알았지만,

Stream.Filter와 연계되어 작동되는 것이었다.

시나리오대로 작성한 코드

// 수강생의 특정 과목 회차별 등급 조회
    private static void inquireRoundGradeBySubject() {
        try {
            Student student = getStudentByInput();
            showStudentInfo(student);
            Subject foundSubject = getSubjectByInput(student);
            Score subjectScore = findScoreByStudentIDSubjectId(foundSubject.getSubjectId(), student.getStudentId());
            int round = getRoundByInput() - 1;

            // 회차 점수 확인
            if (subjectScore.getScores()[round] == -1) {
                throw new Exception("해당 회차의 시험을 본 이력이 존재하지 않습니다.");
            }

            System.out.printf("%s의 %s과목 %d회차 등급은 %c입니다.", student.getStudentName(), foundSubject.getSubjectName(), round + 1, subjectScore.getRank()[round]);
        } catch (Exception ex) {
            System.out.println("Error : " + ex.toString());
        }
    }

완성

[ 결과 ]