두번째 미니 프로젝트

수강생 관리 프로그램(Java, 팀과제)

류정근 2024. 5. 7. 20:56

 

이번에 맡은 역할은 코드의 베이스를 까는 부분

또 처음 맡아보는 역할에 살짝 갈피를 못잡고 있었지만 검색도 하고, 다른 팀에서 뭐하나 살짝 구경도 하며 갈피를 잡았다.

우선 우리팀이 사용할 프로그램의 구조를 정리해보자.

예전에는 유니자드를 통해 간단히 디자인만 했었는데 이번에는 페이지가 없이 실행만 있기 때문에 구조를 만들어보자!!

그리고 미로가 좋다더라!!

 

 

그래서 만들어본 구조도!!

다 만들고 나니까 뿌듯하긴 했다.

그 다음은 템플릿을 참고 하며 코드를 작성하던중 템플릿에서 개선하고 싶은 욕구를 생성하는 코드를 발견했다.

 

 

템플릿으로 주어진 코드

private static void setInitData() {
        studentExStore = new ArrayList<>();
        subjectExStore = List.of(
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "Java",
                        SUBJECT_TYPE_MANDATORY
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "객체지향",
                        SUBJECT_TYPE_MANDATORY
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "Spring",
                        SUBJECT_TYPE_MANDATORY
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "JPA",
                        SUBJECT_TYPE_MANDATORY
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "MySQL",
                        SUBJECT_TYPE_MANDATORY
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "디자인 패턴",
                        SUBJECT_TYPE_CHOICE
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "Spring Security",
                        SUBJECT_TYPE_CHOICE
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "Redis",
                        SUBJECT_TYPE_CHOICE
                ),
                new SubjectEx(
                        sequence(INDEX_TYPE_SUBJECT),
                        "MongoDB",
                        SUBJECT_TYPE_CHOICE
                )
        );
        scoreStore = new ArrayList<>();
    }

 

 

내가 느낀 개선 부분: 과제에서 요구하는 부분에 사용자가 과목을 추가하는 코드가 없었다.  그렇기 때문에 Enum을 통해 상수로 따로 묶어 내면 더 가독성 좋고 짧은 코드로 만들 수 있지 않을까??

 

하지만 Enum에 대해선 제대로 알지 못했기에 수많은 자료를 참고하고 튜터님을 끝도 없이 찾아갔다. 그렇게 완성된 코드

public enum SubjectList {
    // 상수로 과목 생성

     JAVA(SubjectType.MANDATORY, "Java"),
     OBJECT_ORIENTED(SubjectType.MANDATORY,"객체지향"),
     SPRING(SubjectType.MANDATORY,"Spring"),
     JPA(SubjectType.MANDATORY,"JPA"),
     MYSQL(SubjectType.MANDATORY,"MYSQL"),
     DESIGN_PATTERN(SubjectType.CHOICE,"디자인 패턴"),
     SPRING_SECURITY(SubjectType.CHOICE,"Spring Security"),
     REDIS(SubjectType.CHOICE,"Redis"),
     MONGODB(SubjectType.CHOICE,"MongoDB")
     ;


    private final String subjectName;
    private final SubjectType subjectType;


    // Subject 타입의 subjectType 와 String 타입의 subjectName을 입렵받는다
    SubjectList(SubjectType subjectType , String subjectName) {
       this.subjectName = subjectName;
       this.subjectType = subjectType;

    }
    // Getter
    public String getSubjectName() {
        return subjectName;
    }

    public SubjectType getSubjectType() {
        return subjectType;
    }
}

 

Subject 리스트에 과목 이름과 타입 때려박기!!!

그리고 과목 타입도 고정되어 있기 때문에 타입을 선택할 떄 실수를 방지하기 위해 enum으로 제약을 걸었다.

 

하지만 오늘 가장 힘들었던 부분은 공부하는 것보다 실제 적용하는 것 이었다.

subjectStore 라는 ArrayList에 이 값을 담아야 의미가 있는데 사용하는 부분에서 막혔다. 엄청

 

그래서 튜터님에게 찾아가 스파르타식으로 가르침을 받았다. 김순철 튜터님에게 무언가를 배우면 바로 블로그를 키게 된다. 튜터님께서 절대 정답을 가르쳐 주시지 않고 스스로 잘못된 부분을 찾게 도와주고 어디가 잘못 된지 바로 알려주시지 않고 항상 내가 스스로 답을 찾게해 주신다. 물론 그과정이 하드하긴 하지만 결국 배운는 것이 너무 많아서 머리속에서 빠져나가기 전에 블로그에 정리하고 싶게 만드는 욕구를 생성하게 하신다. 항상 감사드립니다.

 

가장 오래 막혀 있던 부분은

subjectExStore = List.of(
        new SubjectEx(
                sequence(INDEX_TYPE_SUBJECT),
                "Java",
                SUBJECT_TYPE_MANDATORY
        )

템플릿에서 했던것 처럼 내가만든 값을 넣어주는것 !!! 

긴과정이 있었지만 가장 막힌 혈을 뚫어 준 부분은 밀키트 비유와 줄타고 가기였다.

 

내가 해야할 것은 위의 모양처럼 List에 Suject란 모양으로 담아줘야 하는데 Subject 안에 어떤 값을 넣어야 하는지 또 그 값을 넣기 위해 다른 클래스들을 어떤 모양으로 만들어 줘야하는지 이해를 못하고 있었다.

 

 

그중 가장 이해가 와닿아서 와 이건 무조건 정리를 한번 해봐야 겠다라고 생각했던 부분은 밀키트를 통한 비유였다.

밀키트에 이런 내용물 들이있다. 이것을 한팩으로 담은 부분이 무엇인지 생각해 보라는 것!!

 

그 말을 들으니 눈에 바로 보이기 시작했다.

Subject 라는 패키지에 (인덱스, 과목이름, 과목타입) 이 담겨져 있는 구조라는 것

하지만 나는 Enum을 통해 (과목이름,과목타입)을 작은 패키지로 묶었고 결국 Subject에는 (인덱스,묶은 Enum)이 들어가야되는 것이 당연한 것 이었다. 그런데 이 당연한 것이 당연하게 눈에 보이는데 어려움이 있었고 튜터님께서 깨닫게 해 주셨다. 

 

허탈(?) 하긴 하지만 긴코드를 짧게 줄일 수 있었다. 50줄이나 되던것을 15줄로 줄인것!!!

private static void setInitData() {
    studentStore = new ArrayList<>(); // 학생 배열 초기화
    // 과목 배열 초기화 , Enum을 활용하여 리펙토링
    subjectStore = List.of(
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.JAVA),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.OBJECT_ORIENTED),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.SPRING),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.JPA),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.MYSQL),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.DESIGN_PATTERN),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.SPRING_SECURITY),
           new  Subject(sequence(INDEX_TYPE_SUBJECT), SubjectList.MONGODB)
    );
    scoreStore = new ArrayList<>(); // 점수 배열 초기화
}

 

그 결과물이다. 정말 오래걸렸지만 Enum을 사용하여 이렇게 줄인것에 만족하기로 했다. 이제 나는 자잘한 기능을 구현해 보는게 남은 역할인거 같다. 혹시 또 코드 간략화를 할게 눈에보인다면 다시 시도해 볼 것이다.