우테코 프리코스 기간이 14일 화요일로 종료가 되었고 바로 평상시와 과제 안내처럼 수요일 15시에 최종 코딩테스트 안내 메일을 받았습니다.
원래는 오프라인으로 치루는 시험이지만 최근 코로나 확진자가 역대급으로 많이 나오게 되어 지난 3주차 과제 안내에서 말한 바와 같이 올해 최종 코딩테스트는 비대면으로 치루게 되었습니다..
지원자들의 코드 리뷰를 많이 하며 대단하다고 느낀 여러 우테코 지원자들과 우테코 포비님을 직접 뵐 수 있을 기회라고 생각했는데 아쉬운 것 같습니다😥😥
시험은 1-6시 예정이며 Pull Request
는 지원자들이 미리 제출한 지원자의 코드를 보고 테스트를 진행하는 것을 막기 위해 5시 30분 이후로 미션 제출을 할 수 있도록 한 것 같습니다.
최종 코딩테스트는 비대면인 만큼 줌으로 지원자와 컴퓨터 모니터가 나오게 라이브로 송출을 하여야 하며 마이크 또한 켜둔 상태로 시험을 치뤄야합니다.
(주말이라 가족들이 모두 있을텐데 미리 말을 해둬야겠어요..😎)
그 외의 메인 안내사항으로는 인터넷 구글링이 허용된다는 점이 있는 것 같습니다.
MVC를 지난 3주차 과제를 하며 익혀 아직 익숙하지 않고 과제 진행을 하면서도 많은 시간들을 소모하였던 저는 최종 테스트에 주어지는 5시간은 시간이 많이 부족할 것이라 생각되어 문제들을 다시 풀어보며 대비를 하고자 마음먹었습니다.
과제를 받은 수요일인 어제는 평상시와 같이 3주차 과제를 제출한 다른 지원자들의 코드리뷰를 하였습니다. 여러 코드를 보던 중 조동현 님 의 코드가 MVC구조가 잘 나뉘어져 있고 여러 기술들을 사용하며 코딩을 한 것 같아 유심히 리뷰하고 배우게 되었습니다.
조동현 님의 코드를 상세히 리뷰하며 몇가지 배운 점이 있습니다.
itemParser를 비롯한 모든 데이터들의 전달을 DTO객체를 생성하여 전달하는 방법으로 코딩하였습니다. 해당 방법은 Spring학습을 하였을 때 배우곤 하였는데 우테코의 백엔드 교육생으로 지원한 만큼 DTO를 활용한 데이터 전달 방법은 좋은 프로그래밍 방식이라고 생각되었습니다.
해당 지원자님은 equals
, hashCode
, toString
과 같은 기본 메서드들을 재정의하여 사용하였습니다. 지난 과제를 할 때 List
로 상품 객체들을 저장하여 관리하면 해당 List에서 특정 상품 객체를 어떻게 불러와야 할지 방법이 떠오르지 않아서 저는 HashMap
을 통해 상품을 관리하였습니다. 하지만 equals
와 hashCode
를 재정의하여 사용한다면 List
를 사용해도 상품의 이름을 통해 해당 객체로 접근할 수 있을 것 같습니다. 금요일에 이번 과제를 다시 프로그래밍 해볼 예정인데 그 때는 equals
, hashCode
를 재정의하여 사용해봐야겠습니다.
또한 지난 과제를 하며 해당 피드백을 놓쳤었는데 금요일 미션을 다시 풀이할 때는 로그 메시지 성격이 강한 자판기 보유 동전같은 것은 toString
재정의를 통해 출력을 하도록 해야겠습니다.
오늘은 지난해 우테코 3기의 프리코스 3주차 미션이었던 subway-map-precourse 문제를 fork
한 후 풀어봤습니다.
풀어보지 못한 새로운 미션이기도하고 최종 테스트가 얼마 남지 않았기에 오늘은 시간을 측정하며 문제 풀이를 진행하여 보았습니다.
기능 및 구현할 내용 정리는 최종 테스트를 치룬다는 생각을 하며 평상시와 다르게 최소한의 필요한 내용들만 적으려고 해봤습니다. 그렇게 적은 내용은 다음과 같습니다.
구현해야 할 내용
- 역 등록기능 만들기
- 중복된 역 등록 금지
- 역 이름은 2글자 이상이어야 한다.
- 역 이름이 공백으로 시작하는 경우
- 역 이름의 입력이 없는 경우
- 역 삭제기능 만들기
- 노선에서도 삭제 필요
- 역 조회기능 (모든 역 출력)
- 노선 등록 기능
- 노선 이름이 2글자 이상이어야 한다.
- 노선 이름이 공백으로 시작하는 경우
- 노선 이름의 입력이 없는 경우
- 중복된 노선 이름이 존재하는 경우
- 상행 하행 종접 입력 받기
- 이름이 존재하는 역인지
- 둘의 이름이 유요한지
- 둘의 이름이 겹치지 않는지 체크
- 노선 삭제 기능
- 노선 조회 기능
- 구간 등록 기능 (노선에 역 추가)
- 노선 입력
- 존재하지 않는 노선인지 체크
- 순서 입력
- 숫자인지 체크
- 해당 순서가 가능한 순서인지 체크
- 노선에 중복된 역 등록 금지
이번 미션을 진행하면서는 지난 3주차 자판기 미션에서 놓쳤던 기본 메서드의 재정의를 하였습니다. 아래의 코드는 노선을 나타내는 Line
클래스의 일부입니다.
노선의 이름이 같은 객체는 같은 객체라고 판단을 하기 위해 equals
와 hashCode
메서드를 재정의하였으며 해당 미션의 기능중에 노선 정보를 출력하는 기능은 로그 메시지를 남기는 성격이어서 toString
을 재정의하여 코드를 작성하였습니다.
@Override
public int hashCode() {
return Objects.hashCode(name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Line))
return false;
return this.name.equals(((Line) obj).getName());
}
@Override
public String toString() {
return "[INFO] " + this.name;
}
코딩은 역시 많이 해봐야 느는 것 같습니다..지난 미션에서는 "이 기능은..service에 가야하나??아니면 Controller에 가야하나..?"하는 고민을 하며 애매한 위치에 작성된 메서드들이 존재하였다면 오늘 프로그래밍한 미션은 한층 더 체계가 갖춰진 것 같습니다.
코드를 작성한 체계는 다음과 같습니다.
Validator
클래스와 에러 메시지가 담긴 ExceptionMessage
가 들어있습니다.코드의 구조는 다음과 같습니다.
반복적이고 간단하게 나타낼 수 있는 코드의 경우 스트림과 람다식을 활용하여 코드를 간결하게 만들어보려고 노력하였습니다.
public static void printStationList(List<Station> stations) {
System.out.println("\n## 역 목록");
stations.stream().forEach(station -> System.out.println(station));
}
toString
을 재정의하여 사용하자!equals
, hashCode
들도 활용하자!문제를 풀이하다보니 올해 3주차 과제로 나왔던 자판기 미션과 비교를 하였을 때 문제에서 구현하여야 할 내용이 많았던 문제였던 것 같습니다. 기능이 크게 역 관련 기능, 노선 관련 기능, 지하철 구간 추가 기능으로 나뉘게 되고 문제에서 초기 설정해야하는 역과 노선의 데이터들과 해당 기능들을 통합하여 main에서 한번에 실행시켜야하다보니 시간이 부족하였던 것 같습니다.
결론부터 말하자면 해당 미션을 요구사항 정리부터 문제 풀이 완료까지 소요된 시간은 6시간 5분이 소요되었습니다. 미션 종료 시간인 5시간이 되었을 때는 개별 기능들까지는 완성을 하였는데 해당 기능들의 통합을 하지 못하였습니다..
최종 미션이 해당 미션처럼 한가지 기능이 아닌 여러 기능을 구현하고 해당 기능을 통합하는 미션이 나온다면 시간부족을 피하지 못할 것 같습니다😥😥
그래도 좋은 소식은 지난 3주차 미션기간동안 MVC방식으로 미션을 2번 실행해봐서 그런지 속도가 확실히 빨라진 것 같습니다. 자판기 미션을 처음 풀이할 당시 대략 12시간의 시간이 걸렸던 것 같은데 오늘 풀이한 미션은 훨씬 많은 기능을 구현하였는데도 6시간이 걸렸으니 많이 발전한 것 같습니다.
시험을 준비할 기간은 이제 17일 하루밖에 남지 않았습니다.
작년 최종 문제가 3주차 미션의 내용과 연관되어 나온 만큼 올해도 그럴 것이라 예측을 하며 내일은 3주차 미션이었던 자판기 문제를 처음부터 다시 프로그래밍해보려합니다.
후회하지 않는 결과를 만들기 위해 남은 하루도 노력하겠습니다🔥🔥🔥
오늘 작성한 지하철 노선도 미션 코드는 다음 링크를 통해 확인하실 수 있습니다.
지하철 노선도 미션