최종 코딩 테스트
지난 토요일, 12월 19일에 우아한테크코스 최종 코딩 테스트를 응시했습니다.
오후 1시부터 6시까지 총 5시간 동안 온라인 시험을 치뤘습니다.
원래는 오프라인 시험인데, 올해는 코로나로 인해 온라인 시험으로 진행되었습니다.
오프라인 시험을 봤다면 우아한형제들 사옥에 가볼 수 있는 기회였는데.. 아쉽습니다. 😥
최종 코딩 테스트는 일반적인 알고리즘 문제 풀이와는 다른 형태로,
프리코스 과정에서 해온 것처럼 미션이 주어지면 해당 과제를 구현하는 방식이었습니다.
최종 코딩 테스트에 대해서 조금이라도 기억이 남아있을 때,
스스로 되돌아보고 반성하는 의미로 기록하기 위해 이번 글을 작성합니다.
시험 준비
프리코스가 끝나고 최종 코딩 테스트까지 총 3일의 준비 기간이 있었습니다.
시간이 넉넉하지는 않았기에, 해당 기간 동안 할 수 있는 분량의 투두리스트를 적었습니다.
이런식으로 미션에 대한 투두, 자바에 대한 투두를 나누어서 리스트업 했습니다.
미션에 대한 투두는 각 미션 리팩토링과 README 작성 연습에 초점을 맞추었고,
자바에 대한 투두는 부족한 부분을 보완하며 새로운 개념을 다져가는 방향으로 작성했습니다.
특히, 최종 코딩 테스트에서 MVC 패턴과 객체지향을 제대로 활용하고 싶어 이를 중심으로 준비했습니다.
미션 투두
미션 투두는 3차 미션 리팩토링을 제외하고 모두 완료했습니다.
자바 공부도 병행하여 3차 미션 리팩토링은 못했으나,
틈틈이 시간을 내어 1차 미션 리팩토링과 2차 미션 리팩토링은 했습니다.
미션 요구사항과 1차, 2차 피드백을 기반으로 이전보다 더 나은 코드를 작성하기 위해 노력했습니다.
자바 투두
자바 투두는 계획 내용을 모두 완료했습니다.
MVC 패턴, SOLID, 객체지향 생활체조, 일급 컬렉션은 블로그 글을 통해 학습했고,
Effective Java는 현재 읽고 있어 책을 통해 공부했습니다.
이런식으로 MVC 패턴은 그림도 그려보고, 주변 친구들에게 질문도 하면서 개념을 다잡고자 노력했습니다.
1차, 2차 미션 리팩토링 과정에서 발견했는데,
Service에서 View의 함수를 가져오고.. 구조가 잘못되었다는 것을 깨달았습니다.
따라서, 최종 코딩 테스트에서는 이런 부분을 유의하며 구조를 제대로 설계하겠다고 다짐했습니다.
시험 응시
최종 코딩 테스트 미션은 지하철 노선도 경로 조회가 출제되었습니다.
제가 작성한 최종 코딩 테스트 미션 코드는 여기에서 확인하실 수 있습니다.
최종 미션인 지하철 노선도 경로 조회는 3차 미션이었던 지하철 노선도와 유사한 형태였습니다.
3차 미션이 지하철 관리자 입장에서 역, 노선, 구간을 관리하고 노선도를 조회해야 되었다면,
최종 미션은 지하철 사용자 입장에서 경로를 최단 거리 또는 최소 시간을 기준으로 조회해야 되었습니다.
최종 미션을 확인하고 시험 준비 과정에서 3차 미션만 딱 리팩토링을 못했던 것이 아쉬웠습니다.
그렇지만, 3차 미션은 비교적 최근에 수행했기에 기억을 더듬어가며 코드를 참고할 수 있었습니다.
요구사항 정리
미션 구현을 시작하기 앞서 평소처럼 구현할 기능 목록과 확인할 프로그래밍 목록을 정리했습니다.
구현할 기능 목록은 크게 초기 설정, 경로 조회, 최단 거리, 최소 시간, 입출력으로 나누어 내용을 작성했고,
확인할 프로그래밍 목록은 이전 미션에서 적어두었던 내용을 가져와서 사용했습니다.
특히, 구현할 기능 목록을 작성할 때 예외 처리 조건을 어떤 식으로 작성하는 게 보기 편할지 고민했습니다.
3차 미션에서는 앵커를 클릭하면 상세 내용을 확인할 수 있게 작성했습니다.
그러나, 이 방식은 예외 조건을 확인하기 위해 한번 더 클릭해야 한다는 번거로움이 있습니다.
또한, 문서 구조가 깔끔하지 못하다고 느끼게 합니다. 따라서, 다른 방식이 없을까 생각하게 되었습니다.
최종 미션에서는 구현할 기능과 예외 처리 조건을 함께 배치했습니다.
또한, 해당 예외 처리 조건에 대한 메시지 내용을 바로 아래에 적어두었습니다.
이때, 예외 메시지 내용은 ERROR + 문구 형태로 통일하여 한눈에 알아보기 쉽게 구성했습니다.
디렉토리 구조
최종 미션의 전체적인 디렉토리 구조는 지난 미션을 참고하여 설계했습니다.
한편, 일부 클래스나 함수는 지난 미션에서 부족했던 MVC 패턴과 객체지향을 보완하여 생성했습니다.
MVC 패턴은 그림으로 그렸던 View ↔ Controller ↔ Model을 계속 머리 속에서 되뇌며 상기시켰습니다.
객체지향은 인터페이스, 추상 메소드 재정의를 활용하고, 이를 통해 중복을 최소화하고자 했습니다.
다익스트라 알고리즘
경로를 최단 거리 또는 최소 시간 기준으로 조회하기 위해 다익스트라 알고리즘을 사용해야 되었습니다.
처음에는 다익스트라 알고리즘을 구현해야 하나 걱정이 되었지만,
다행히도 힌트를 통해 jgrapht 라이브러리를 사용하면 쉽게 구현할 수 있다는 것을 알았습니다.
힌트는 이렇게 주어졌고, 해당 내용을 활용하면 금세 알고리즘 구현이 가능했습니다.
힌트를 참고해서 거리 또는 시간을 가중치로 가지는 그래프를 생성하는 방식으로 코드를 작성했습니다.
DistanceMapService 클래스를 보면,
getShortestDistance()는 그래프 가중치에 따른 최단 거리를 반환합니다.
getShortestDistanceStations()는 최단 거리에 따른 역 목록을 반환합니다.
TimeMapService 클래스를 보면,
getShortestTime()은 그래프 가중치에 따른 최소 시간을 반환합니다.
getShortestTimeStations()는 최소 시간에 따른 역 목록을 반환합니다.
이처럼 힌트를 통해 다익스트라 알고리즘은 금방 구현할 수 있었습니다.
그러나, 경로 조회 기능 구현에 있어서는 아쉬움이 남았습니다.
그래프를 이용하여 최단 거리 기준에서 거리, 최소 시간 기준에서 시간을 확인하는 기능은 완성했습니다.
한편, 최단 거리 기준에서 시간, 최소 시간 기준에서 거리를 확인하는 기능은 미완성했습니다.
그래프를 2개로 나누지 않고 1개를 사용했다면 나머지 기능도 구현할 수 있지 않았을까 생각합니다.
일급 컬렉션
다익스트라 그래프 개수 외에 하나 더 반성할 내용은 도메인 모델을 일급 컬렉션화 하지 않은 것입니다.
최종 미션에서 도메인 모델을 일급 컬렉션으로 만들고 싶어 준비 기간에도 공부하며 리팩토링 했습니다.
그러나, 막상 시험에서 이를 적용하지 않았고 기본 형태 그대로 도메인 모델을 사용했습니다.
역과 같은 도메인 모델의 생성자 부분에 검증 로직을 추가하여 일급 컬렉션으로 만들 수 있었는데,
최종 미션은 초기 설정만 고려하면 되겠다는 생각에 한번 더 고민하지 않은 점이 아쉽습니다.
최종 코딩 테스트를 마무리하며
어느덧 최종 코딩 테스트를 응시한 지 1주일이 넘었습니다.
이렇게 글을 작성하며 지난 시험을 되돌아볼 수 있었습니다.
어떤 점이 부족했고 보충할 필요가 있었는지 반성하는 계기가 되었습니다.
한편으로는 3주간의 프리코스 동안 많이 배우고 성장했다는 것을 깨달았습니다.
미션을 수행할 때마다 좋은 코드란 무엇인지, 어떻게 작성해야 하는지 수없이 고민했습니다.
저의 이러한 노력이 제가 작성한 코드에 잘 드러났고 전달되었기를 바랍니다.
아직 최종 발표 전이지만, 꼭 최종 합격을 해서 본 코스도 함께 할 수 있기를 진심으로 소망합니다.
이번 프리코스에 몰입한 것처럼 본 코스도 몰두하여 더 큰 발전을 이뤄낼 수 있을 것이라 생각합니다.
지금까지 저의 최종 코딩 테스트 회고를 읽어주셔서 감사합니다! 🤗
최종 코딩 테스트 결과
2020-12-30 추가했습니다.
우아한테크코스 3기에 최종 합격했습니다!
2020년도에 마음 고생한 일이 많았는데, 연말 선물을 받은 기분입니다. 🎁
이번주는 공부에 집중이 안되고, 오늘은 발표까지 떨리고 긴장됐는데..
결과를 확인하고 너무 기뻤습니다! 바로 부모님께 연락드리고, 행복한 시간이었어요. 🥰
2021년에는 10개월 동안 우테코에 몰입할 일만 남았네요!
1월에는 지금처럼 공부하던 거 이어가면서 우테코에 참여할 준비를 해야겠습니다.
프리코스 참가하신 모든 분들 수고 많으셨고, 우아한테크코스 3기 여러분 모두 잘 부탁드립니다! 🙌