각종 후기/우아한테크코스

우아한 테크코스 3기 프리코스 3주차 미션 수행 후기

제이온 (Jayon) 2020. 12. 16.

안녕하세요? 코딩중독입니다.

 

저번 포스팅에서는 프리코스 2차 미션에 대한 이야기를 하였습니다. 궁금하신 분은 참고하시면 되겠습니다. 1차 미션이 종료된 다음날 2차 미션과 관련된 메일이 왔습니다.

 

과제를 fork해서 받아오고 나중에 pr을 통해 제출하는 과정이나 commit 규칙 등은 동일하고, 제약 조건은 2차 미션과 거의 동일합니다. 가령, else 예약어를 쓰지 말라는 것이나 indent depth을 2이하로 설정하는 것이 있었죠.

 

이제, 3차 미션의 주제를 알아보도록 합시다.

 

 

3주차 미션 주제

3주차 미션은 2기 3주차 미션인 '블랙잭'이 아니고, '지하철 노선도'를 구현하는 것이었습니다.

 

지하철 노선도를 관리하는 프로그램이 주 목적이고, 메뉴를 입력하여 이동하는 방식으로 프로그램이 작동합니다.

 

처음에는 메인 메뉴에서 실행되는데 선택지가 '역 관리', '노선 관리', '구간 관리', '지하철 노선도 출력', '종료'가 있습니다.

 

그리고 역 관리 메뉴 안에는 '역 등록', '역 삭제', '역 조회'가 있고, 노선 관리 메뉴 안에는 '노선 등록', '노선 삭제', '노선 조회'가 있으며, 구간 관리 메뉴 안에는 '구간 등록', '구간 삭제'가 있습니다. 마지막으로, 지하철 노선도 출력은 단순히 어떠한 호선에는 무슨 역들이 있는지 출력하면 되는 기능입니다.

 

상세한 기능 설명은 이곳을 참조하시길 바랍니다. 꽤나 구현해야할 내용이 많았습니다.

 

 

힘들었던 점

제가 1, 2차 미션에서는 구현 자체는 쉬웠으나 프로그램을 '잘' 만들기 위해서는 생각해야할 요소가 많다고 하였습니다.

 

하지만, 이번 미션은 요구 사항에 맞춰서 구현하기조차 매우 매우 힘들었습니다...

 

 

(1) 메뉴 구성 방식의 어려움

이 프로그램은 메뉴에서 선택지를 던져주고, 사용자가 입력하는 값에 따라 진행됩니다. 가령, 메인 메뉴에는 5개의 선택지가 있는데 이 중에 하나를 고르는 것이죠.

 

이때, 우리는 지켜야 할 제약 사항이 하나 있는데, 메소드의 길이는 15줄 이하라는 것입니다. 따라서, 가장 기본적으로 생각할 수 있는 방식인 if ~ else if ~ else 문을 통하여 메뉴를 구성하면 안 됩니다. (물론, 이 마저도 else 예약어는 사용할 수 없으므로 if문만 연달아서 5개를 써야 합니다.)

 

마찬가지로, 각 서브 메뉴(역 관리, 노선 관리 등)에도 등록, 삭제, 조회(구간 관리에는 사용 안 함.) 기능을 선택하도록 구현해야 합니다. 저는 if문이 끝나고 바로 return이나 출력문을 찍지 않는 이상 한 줄을 띄어주는 편인데, 그렇게 하면 메소드의 길이가 15줄을 넘어갈 여지가 많게 됩니다.

 

그래서 결국 메인 메뉴와 서브 메뉴로 구분하고, 서브 메뉴를 상속받는 역 관리, 노선 관리, 구간 관리, 지하철 노선도 출력 클래스를 정의하였습니다. 그리고 부모 클래스인 서브 메뉴에서 출력을 담당하는 메소드를 두어, 자식 클래스들에게 다형성을 부여하였습니다. 이렇게 하니까 깔끔하게 "메인 메뉴 출력 -> 입력에 따라 적절한 서브 메뉴 출력"까지는 원활하게 되었습니다.

 

예를 들어, 사용자가 역 관리를 호출하도록 하였다면, '역 등록', '역 삭제', '역 조회', '뒤로 가기' 선택지가 나오게 해야 합니다. '뒤로 가기'는 따로 예외처리한다고 치고, '등록', '삭제', '조회' 부분을 또 어떻게 처리할까 고민하였습니다. 특히, 이것들은 노선 관리와 구간 관리에도 동일하게 나오기때문에 '등록', '삭제', '조회'의 부모 클래스인 action을 정의하였습니다. 그리고 위에서 서브 메뉴에서 출력한 것처럼 action에도 등록인지 삭제인지 조회인지에 따라서 적절하게 시스템 메시지를 출력하도록 조정하였습니다.

 

문제는 이 다음부터입니다. 등록 클래스, 삭제 클래스, 조회 클래스는 각각 또 역인지 노선인지 구간인지에 따라서 해야할 일이 달라집니다. 가령, 등록 클래스를 역 관리가 호출하였다면 해야할 일이 역 등록이 되는 것이고, 노선 관리가 호출하였다면 해야할 일이 노선 등록이 되는 것입니다.

 

저는 여기서도 부모-자식 클래스를 통하여 다형성을 구현하려고 하였으나, 생각보다 구조가 잡히지 않았고 시간 상의 이유로 결국 if문을 통하여 반복된 코드를 작성할 수 밖에 없었습니다. 그리고 이것은 가독성을 매우 매우 해치고, 구조도 엉망이 되는 패인이 되었습니다.

 

 

(2) 상수 처리

저는 1, 2차 미션까지 상수가 있으면 하나의 폴더 안에 클래스를 만들어 놓고, 대부분 그 곳에 몰아 넣었습니다. 하지만, 이번 미션은 구현해야할 범위가 상대적으로 매우 넓어졌기때문에 그렇게 하면 유지 보수 측면에서 아주 꽝이 되어 버립니다. 그래서 어떻게 상수를 이쁘게(?) 처리해야할지 검색하다가 enum을 알게 되었습니다.

 

사실 이 enum을 알고는 있었으나, 그 전까지 미션에서는 굳이 적용할 필요성을 느끼지 못해서 넣지 않았습니다. 이번 미션도 처음 봤을 때는 단순히 빡구현이고 어떻게 하다보면 되겠지라는 생각으로 작성하다보니 상수가 생각보다 매우 많음을 알게 되었습니다. 따라서, enum을 적용하려고 노력했는데 생각보다 쉽지 않았고, 이마저도 시간 상의 이유로 어쩔 수 없이 폴더에다가 상수를 때려 박아버렸습니다.

 

 

(3) MVC 패턴 적용

결과부터 말씀드리자면 이것도 실패하였습니다. MVC 패턴은 디자인 패턴 중 하나로 프로그램을 개발하는 방식인데, 우테코 오픈 채팅에서 주워 듣게 되었고, 실제로 pr을 보니까 많은 사람들이 이 패턴을 채택하였습니다.

 

저도 간단하게 공부해서 적용하려고 하는데.... 위의 (1), (2)에서의 엄청난 삽질로 인하여 구조 자체가 망해버렸기때문에 inputView정도만 어찌저찌 구현을 하였습니다. 출력 부분도 outputView로 구현하고 싶었으나, 제출 3시간 남기고 예외 처리를 끝낸 터라 도저히 리팩토링을 할 시간이 없었고, 제가 너무 지쳤습니다 ㅠㅠ

 

 

(4) 학교 기말고사 및 장학 일지 병크

사실 제가 포스팅에서 계속 써온 것인데, 그전까지는 구현 난이도가 높지 않아서 커버를 쳤지만, 이번에는 정말 죽는 줄 알았습니다. 프리코스 3차 미션을 진행할 동안 시험을 무려 4개나 봐야 했고, 그 중에서 전공은 3개나 되었기때문에 학교 공부하랴 프리코스 미션 수행하랴 아주 바빴습니다.

 

거기다가 제가 파이썬 조교로 80시간 일을 했는데, 그 부분에 대한 장학 일지 내용이 부족하다고 빠꾸를 당했습니다.. 그래서 안그래도 급해 죽겠는데 서류 30장을 다시 꼼꼼하게 써서 제출을 하느라 한 8시간 날렸죠 허..

 

이것도 어떻게 보면 핑계거리는 맞지만, 이 이유때문에 구조를 더 생각하고 enum을 적용할 시간이 촉박하였습니다.

 

 

정리

제가 만든 이 지하철 노선 관리 프로그램은 상당히 마음에 들지는 않습니다. 그렇지만, 어찌되었든 프로그램의 요구 사항은 모두 충족하였고, 예외 처리도 꼼꼼하게 하여 프로그램이 동작하게끔 구현해서 제출하였습니다.

 

지금와서 느끼는 것이지만, 시간 촉박하다고 구조를 반복적으로 짜지 않았다면 오히려 더 금방 끝나지 않았을까 생각이 듭니다. 반복적으로 코드를 짜다보니, 메소드의 길이가 15줄이 넘어가는 메소드는 따로 대충 이름을 지어서 메소드를 분할하게 되고, 이것은 나중에 디버그를 할 때 어려움을 초래하였습니다. 그렇습니다.. 제가 제 코드를 못 알아 보는 것이죠.

 

우테코 피드백에서는 '반복은 악이다.'라는 의미심장한 말이 적혀 있었습니다. 그리고 이것은 3차 미션을 수행하면서 아주 아주 뼈저리게 느꼈죠. 등록과 삭제를 하는 과정에서 아주 많이 반복된 코드가 발생하였고, 이것은 코드의 양이 길어지게 되어 유지 보수를 하기 매우 힘들게 만들었습니다. 그 와중에 마감 기한은 임박해서 수정은 못하겠고, 단순히 프로그램을 돌아가게만 만드는 데 급급하였습니다.

 

그리고 저는 개발 내내 즐겁지가 않았습니다. 초반에는 어느 정도 상속을 통하여 구조를 이쁘게 잡아서 만족스럽지만, 중반부부터는 구조가 망했기때문에 단순히 마감 기한 맞춰서 개발을 완료해야하는 SI 기업 노동자를 떠올릴 정도였습니다. 아 물론 일부 악덕한 SI 기업을 말하는 것입니다. 그래서 어떻게든 미션을 완수하고나서도 뿌듯하기보다는, '내가 지금까지 뭘 한거지?'와 같이 현타와 피곤함만 몰려올 뿐이었죠.

 

이렇게 3주 간의 짧은 프리 코스가 끝났습니다. 마지막 주차는 썩 만족스럽지는 않았지만, 상속과 java stream api, 그리고 반복의 단점을 배우는 좋은 기회였다고 생각합니다.

 

미천한 제 지하철 노선도 미션 코드는 이곳에서 확인하실 수 있고, 이렇게 짜면 안 되는구나만 배워가시면 좋을 것 같습니다.

 

혹시, 궁금한 점이 있다면 편하게 댓글로 남겨주시면 되겠습니다~

댓글

추천 글