1. 팀 소개 & 역할 분담
    1. 팀 소개
      1. 팀명 : 팔팔하조 / B8조
      2. 팀 소개 : 팀원들과 라포 쌓으며 자바 씹어 먹기,,
      • Part One
    2. 역할분담
      1. 이희수 (팀장)
        1. 기본 요구 사항 - 수강생 등록
        2. 추가 요구 사항 - 상태별 수강생 목록 조회
        3. 그 외 - 입력 받은 학생 이름을 가진 ID 값 보여주기, 배포
      2. 김가은
        1. 기본 요구사항 - 특정 과목 점수 조회
        2. 추가 요구 사항 - 수강생 과목별 평균 등급 조회
        3. 그 외 - 발표 자료 정리
      3. 이정빈 :
        1. 기본 요구사항 - 과목별 회차와 점수 등록
        2. 추가 요구 사항 - 특정 수강생 필수 과목 평균 등급 조회
        3. 그 외 - App 클래스에 있는 메소드 분리, 발표
      4. 김성찬 :
        1. 기본 요구사항 - 동록된 점수 수정
        2. 추가 요구 사항 - 수강생 및 수강생 점수 삭제
        3. 그 외 - API 명세 정리
      5. 주장현
        1. 기본 요구사항 - 수강생 목록 조회
        2. 추가 요구 사항 - 수강생 정보 조회
        3. 그 외 - 시연 영상 촬영
      • Part Two
  2. ERD 소개

https://dbdiagram.io/d/TEAM88-663c44019e85a46d555f7e55

  1. 트러블 슈팅

    1. 구조 변경한 것

      1. Student 객체에서 Map으로 관리하려고 하였으나 Student 객체에 의존적인 코드 작성이 이루어져서 Score를 따로 관리하는 scoreList를 생성

      2. 상태별 수강생을 조회하는 메소드 구현할 때 studentList에 stream을 활용해서 구현함

        → filter에 조건을 걸고 forEach로 출력을 하면해당 상태의 수강생이 없는 경우를 찾아내지 못함. filter 조건 이후에 findFirst() 메소드를 사용해서 list가 비었는지 객체가 있는지 확인 하려고 함 그랬더니 forEach를 적용하지 못함

        ⇒ 결국 stream을 사용해서 studentStatusList(조회하려는 상태와 같은 학생들)를 List로 추출하고.isEmpty() 메소드를 활용해 List가 비어있는지 확인하고, 비어있지 않으면 수강생들을 출력함

      3. 특정 과목에 대한 grade를 조회할 때 학생 ID와 과목만 입력 받아 선택한 과목의 모든 회차의 성적을 출력하도록 구현함

        → 1회차부터 차례대로 성적을 입력하지 않으면 성적 조회가 되지 않는 문제가 발생

        ⇒ 학생 ID와 과목은 물론 회차까지 선택을 하여 그에 대한 Grade를 출력하도록 수정함

      4. 점수를 수정할 때 GradeCalculator의 calculateGrade 메소드를 호출하지 않고 구현함.

        → 점수를 수정할 때 등급(Grade)이 자동으로 업데이트되지 않아, 점수와 등급이 다른 경우가 발생

        ⇒ 점수를 수정할 때, 새로운 점수에 대해 자동으로 등급을 계산하도록 GradeCalculator의 calculateGrade 메소드를 호출하여 새로운 점수를 입력 받은 후 점수를 Score에 설정하고, 동시에 계산된 등급도 Score에 설정되게 함.

        ⇒ setScoreAndGrade라는 하나의 메소드로 점수와 등급 계산 및 업데이트를 한번에 처리하도록 수정함.

    2. Git 사용

  2. 기획 의도 (콘텐츠가 어떤 내용을 보여주는지)

    1. 수강생 관리
      1. 수강생 등록 및 과목 선택, 수강생 정보 수정 등 수강생의 전반적인 정보를 관리
        1. 수강생 등록하기 - 등록할 수강생의 이름을 입력 받아 ID 값을 부여 함, 조건에 맞게 최소 3개 이상의 필수 과목과 2개 이상의 선택 과목을 필수적으로 입력 받도록 함.
        2. 수강생 아이디 검색 - 수강생의 ID를 찾을 때 사용하는 기능으로, 수강생의 이름을 입력하면 해당 이름을 가진 ID 값을 전부 보여주는 기능 ⇒ 동명이인
        3. 수강생 전체 목록 조회 - 1번 기능을 통해 등록된 모든 수강생의 정보(이름, ID, 상태, 선택한 과목)를 출력함.
        4. 수강생 상태별 목록 조회 - GREEN, RED, YELLOW 3가지의 상태별로 수강생을 조회할 수 있는 기능 ⇒ 기본적으로 수강생을 등록할 때 GREEN으로 저장되어 있으며 상태 변경을 원한다면 아래의 5번 기능에서 수정할 수 있음.
        5. 수강생 정보 수정하기 - 선택한 수강생의 이름 또는 상태를 변경할 수 있는 기능.
        6. 수강생 삭제하기 - 저장되어 있는 수강생을 삭제하는 기능으로 수강생을 삭제하면 해당 수강생의 점수 기록도 함께 삭제되도록 함.
    2. 점수 관리
      1. 수강생의 시험 점수 등록, 회차별 등급 조회, 점수 수정 등 점수와 관련된 전반적인 부분을 관리
        1. 수강생의 과목별 시험 회차 및 점수 등록 - 점수를 등록할 수강생이 선택한 과목 중 한 과목을 선택하여 회차와 점수를 입력할 수 있음. 이때 점수를 입력하면 자동으로 등급이 추가되어 저장됨.
        2. 수강생의 과목별 회차 점수 수정 - 점수를 수정할 수강생의 ID를 입력하면 저장되어 있는 점수 목록을 출력해줌. 이를 보고 수정할 과목의 ID와 회차를 선택하고 수정할 점수를 입력 받아 저장함.
        3. 수강생의 특정 과목 회차에 대한 등급 조회 - 2번 기능과 마찬가지고 조회하고 싶은 학생의 ID를 입력 하면 해당 학생이 수강중인 과목을 보여줌. 이를 보고 조회할 과목의 ID와 회차를 입력 하면 성적을 출력함.
        4. 수강생의 과목별 평균 등급 조회 - 평균 등급을 조회하고 싶은 학생의 ID를 입력하면 해당 학생에 점수가 등록되어있는 모든 과목별 평균 등급이 출력 됨.
        5. 상태별 수강생들의 평균 등급 조회 - 현재 상태별 수강생의 인원수를 볼 수 있도록 출력해줌. 이후 조회하고 싶은 상태를 입력 하면 상태별 필수 과목의 평균 등급을 조회할 수 있음.
  3. 기술적 의사 선택

    1. 해당 기술 사용한 이유

      1. enum - 임의의 정수 또는 문자열 상수를 사용하여 상태를 나타내는 것에 비해 코드를 더 읽기 쉽기 때문에 사용
        1. enum Status, Grade, SubjectType에서 학생 상태나 과목 유형과 같은 특정 고정 값 집합을 나타내기 위해 사용함.
      2. sequence - 데이터의 무결성을 보장하고 여러 부분에서 ID를 생성할 때 일관된 방법으로 제공하기 위해 사용.
        1. String sequence(String type) {}에서 학생과 과목에 대한 고유한 순차 ID를 생성하는 데 사용됨.
      3. Stream - 코드의 가독성과 효율을 향상 시키기 위해 사용
        • studentStatusInquiry()및 findStudentId()에서 사용함.
        1. studentStatusInquiry()에서는 상태에 따라 학생 목록을 필터링 하는 데 stream을 사용하여 전체 목록을 수동적으로 반복하지 않고, 특정 상태의 학생을 검색할 수 있도록 하기 위해 사용함
        2. findStudentId()에서는 이름을 기준으로 학생 목록을 필터링 하는데 stream을 사용함.
    2. 우리 팀이 개인적으로 추가한 기술 등

      1. 학생 이름을 입력 받으면, 해당 이름을 가진 아이디 값들 보여주는 기능을 추가
    3. App class 분리

      1. App 클래스에 수강생 관리, 점수 관리 메서드를 작성했음.
      2. 600줄이 넘는 코드가 App 클래스에 작성됨.

      ⇒ 코드 동작에는 문제가 없었지만 가독성 및 관리의 용이성 등을 생각해 메서드를 용도에 맞게 manager 패키지 내에 3개의 클래스로 분리하고, type 패키지 내에 학점, 상태, 과목 타입을 3개의 enum으로 분리함.

  4. GitHub 활용 방법

    1. 이슈를 생성하여 연관 번호로 각자 파트에 맞는 브랜치를 만들어 진행
    2. 팀원들이 PR한 코드를 보고 서로 리뷰를 달아주며 피드백 진행
  5. 아쉬운 점 (시간이 남는다면 추가)

| --- | --- |