[우테코] 최종 코딩테스트 대비-1

SeongWon Oh·2021년 12월 16일
2

우테코 회고록

목록 보기
6/9
post-thumbnail

최종 코딩테스트 일정

우테코 프리코스 기간이 14일 화요일로 종료가 되었고 바로 평상시와 과제 안내처럼 수요일 15시에 최종 코딩테스트 안내 메일을 받았습니다.

원래는 오프라인으로 치루는 시험이지만 최근 코로나 확진자가 역대급으로 많이 나오게 되어 지난 3주차 과제 안내에서 말한 바와 같이 올해 최종 코딩테스트는 비대면으로 치루게 되었습니다..

지원자들의 코드 리뷰를 많이 하며 대단하다고 느낀 여러 우테코 지원자들과 우테코 포비님을 직접 뵐 수 있을 기회라고 생각했는데 아쉬운 것 같습니다😥😥

시험 안내

시험은 1-6시 예정이며 Pull Request는 지원자들이 미리 제출한 지원자의 코드를 보고 테스트를 진행하는 것을 막기 위해 5시 30분 이후로 미션 제출을 할 수 있도록 한 것 같습니다.

최종 코딩테스트는 비대면인 만큼 줌으로 지원자와 컴퓨터 모니터가 나오게 라이브로 송출을 하여야 하며 마이크 또한 켜둔 상태로 시험을 치뤄야합니다.
(주말이라 가족들이 모두 있을텐데 미리 말을 해둬야겠어요..😎)

그 외의 메인 안내사항으로는 인터넷 구글링이 허용된다는 점이 있는 것 같습니다.

코딩테스트 대비🔥

MVC를 지난 3주차 과제를 하며 익혀 아직 익숙하지 않고 과제 진행을 하면서도 많은 시간들을 소모하였던 저는 최종 테스트에 주어지는 5시간은 시간이 많이 부족할 것이라 생각되어 문제들을 다시 풀어보며 대비를 하고자 마음먹었습니다.

📝 D-3. 코드리뷰

과제를 받은 수요일인 어제는 평상시와 같이 3주차 과제를 제출한 다른 지원자들의 코드리뷰를 하였습니다. 여러 코드를 보던 중 조동현 님 의 코드가 MVC구조가 잘 나뉘어져 있고 여러 기술들을 사용하며 코딩을 한 것 같아 유심히 리뷰하고 배우게 되었습니다.

조동현 님의 코드를 상세히 리뷰하며 몇가지 배운 점이 있습니다.

배운점 1. DTO를 통한 데이터 전달

itemParser를 비롯한 모든 데이터들의 전달을 DTO객체를 생성하여 전달하는 방법으로 코딩하였습니다. 해당 방법은 Spring학습을 하였을 때 배우곤 하였는데 우테코의 백엔드 교육생으로 지원한 만큼 DTO를 활용한 데이터 전달 방법은 좋은 프로그래밍 방식이라고 생각되었습니다.

배운점 2. 기본 메서드의 재정의

해당 지원자님은 equals, hashCode, toString과 같은 기본 메서드들을 재정의하여 사용하였습니다. 지난 과제를 할 때 List로 상품 객체들을 저장하여 관리하면 해당 List에서 특정 상품 객체를 어떻게 불러와야 할지 방법이 떠오르지 않아서 저는 HashMap을 통해 상품을 관리하였습니다. 하지만 equalshashCode를 재정의하여 사용한다면 List를 사용해도 상품의 이름을 통해 해당 객체로 접근할 수 있을 것 같습니다. 금요일에 이번 과제를 다시 프로그래밍 해볼 예정인데 그 때는 equals, hashCode를 재정의하여 사용해봐야겠습니다.

또한 지난 과제를 하며 해당 피드백을 놓쳤었는데 금요일 미션을 다시 풀이할 때는 로그 메시지 성격이 강한 자판기 보유 동전같은 것은 toString재정의를 통해 출력을 하도록 해야겠습니다.


📝 D-2. 작년 3주차 미션 풀이

오늘은 지난해 우테코 3기의 프리코스 3주차 미션이었던 subway-map-precourse 문제를 fork한 후 풀어봤습니다.

풀어보지 못한 새로운 미션이기도하고 최종 테스트가 얼마 남지 않았기에 오늘은 시간을 측정하며 문제 풀이를 진행하여 보았습니다.

구현할 내용 정리

기능 및 구현할 내용 정리는 최종 테스트를 치룬다는 생각을 하며 평상시와 다르게 최소한의 필요한 내용들만 적으려고 해봤습니다. 그렇게 적은 내용은 다음과 같습니다.

구현해야 할 내용

  • 역 등록기능 만들기
    • 중복된 역 등록 금지
    • 역 이름은 2글자 이상이어야 한다.
    • 역 이름이 공백으로 시작하는 경우
    • 역 이름의 입력이 없는 경우
  • 역 삭제기능 만들기
    • 노선에서도 삭제 필요
  • 역 조회기능 (모든 역 출력)

  • 노선 등록 기능
    • 노선 이름이 2글자 이상이어야 한다.
    • 노선 이름이 공백으로 시작하는 경우
    • 노선 이름의 입력이 없는 경우
    • 중복된 노선 이름이 존재하는 경우
    • 상행 하행 종접 입력 받기
      • 이름이 존재하는 역인지
      • 둘의 이름이 유요한지
      • 둘의 이름이 겹치지 않는지 체크
  • 노선 삭제 기능
  • 노선 조회 기능

  • 구간 등록 기능 (노선에 역 추가)
    • 노선 입력
    • 존재하지 않는 노선인지 체크
    • 순서 입력
    • 숫자인지 체크
    • 해당 순서가 가능한 순서인지 체크
    • 노선에 중복된 역 등록 금지

미션을 하며 새롭게 반영한 내용

1. 기본 메서드의 재정의

이번 미션을 진행하면서는 지난 3주차 자판기 미션에서 놓쳤던 기본 메서드의 재정의를 하였습니다. 아래의 코드는 노선을 나타내는 Line클래스의 일부입니다.

노선의 이름이 같은 객체는 같은 객체라고 판단을 하기 위해 equalshashCode메서드를 재정의하였으며 해당 미션의 기능중에 노선 정보를 출력하는 기능은 로그 메시지를 남기는 성격이어서 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;
    }

2. 더욱 체계가 갖춰진 MVC

코딩은 역시 많이 해봐야 느는 것 같습니다..지난 미션에서는 "이 기능은..service에 가야하나??아니면 Controller에 가야하나..?"하는 고민을 하며 애매한 위치에 작성된 메서드들이 존재하였다면 오늘 프로그래밍한 미션은 한층 더 체계가 갖춰진 것 같습니다.

코드를 작성한 체계는 다음과 같습니다.

  • Controller는 View와 Service에 위치한 메서드를 호출하여 최종적인 단일 기능의 메서드를 생성합니다. (해당 메서드를 호출하면 완벽하게 실행되도록 말이죠😎)
  • Service는 Repository와 Controller사이에서 비즈니스 로직들이 위치하여 있습니다. 예를 들면 repository의 데이터를 조회하여 입력값이 유요한지를 체크하는 로직과 repository에 최종 데이터 등록, 삭제를 명령하는 메서드들이 들어가 있습니다.
  • Repository는 실제 DB라 생각하여 Singleton을 적용하여 관리를 하고 값을 return하는 역할만을 하도록 작성하였습니다.
  • domain은 해당 프로그램에서 사용되는 객체 클래스 파일이 담겨있습니다.
  • utils에는 앞에서 말한 코드 외의 입력 값이 조건에 맞는 값인지 체크하는 로직이 담긴 Validator클래스와 에러 메시지가 담긴 ExceptionMessage가 들어있습니다.

코드의 구조는 다음과 같습니다.

3. 스트림과 람다식의 사용

반복적이고 간단하게 나타낼 수 있는 코드의 경우 스트림과 람다식을 활용하여 코드를 간결하게 만들어보려고 노력하였습니다.

    public static void printStationList(List<Station> stations) {
        System.out.println("\n## 역 목록");
        stations.stream().forEach(station -> System.out.println(station));
    }

시험때 반영할 내용 정리

  1. 구현해야 할 내용은 과제를 진행할 때 처럼 너무 깊게 정리하지 말고 일단 생각나는 기능과 예외 상황들만 정리하자! (미션을 진행할 때는 과제 및 구현내용 정리를 하는데 하루를 투자한 날도 있습니다..😵)
  2. 람다식과 Stream을 활용하자!!
  3. 큰 기능별로 Controller와 Service를 만들어 관리를 하자!
  4. Repository는 싱글톤으로 관리하자! 그리고 Repository는 실제 DB 테이블이라 생각하고 관리하며 데이터 return만을 하자! (비즈니스 로직은 가능하면 Service에서!)
  5. 로그 느낌의 메시지들은 객체들의 toString을 재정의하여 사용하자!
  6. equals, hashCode들도 활용하자!

구현 후기

문제를 풀이하다보니 올해 3주차 과제로 나왔던 자판기 미션과 비교를 하였을 때 문제에서 구현하여야 할 내용이 많았던 문제였던 것 같습니다. 기능이 크게 역 관련 기능, 노선 관련 기능, 지하철 구간 추가 기능으로 나뉘게 되고 문제에서 초기 설정해야하는 역과 노선의 데이터들과 해당 기능들을 통합하여 main에서 한번에 실행시켜야하다보니 시간이 부족하였던 것 같습니다.

결론부터 말하자면 해당 미션을 요구사항 정리부터 문제 풀이 완료까지 소요된 시간은 6시간 5분이 소요되었습니다. 미션 종료 시간인 5시간이 되었을 때는 개별 기능들까지는 완성을 하였는데 해당 기능들의 통합을 하지 못하였습니다..

최종 미션이 해당 미션처럼 한가지 기능이 아닌 여러 기능을 구현하고 해당 기능을 통합하는 미션이 나온다면 시간부족을 피하지 못할 것 같습니다😥😥

그래도 좋은 소식은 지난 3주차 미션기간동안 MVC방식으로 미션을 2번 실행해봐서 그런지 속도가 확실히 빨라진 것 같습니다. 자판기 미션을 처음 풀이할 당시 대략 12시간의 시간이 걸렸던 것 같은데 오늘 풀이한 미션은 훨씬 많은 기능을 구현하였는데도 6시간이 걸렸으니 많이 발전한 것 같습니다.

시험을 준비할 기간은 이제 17일 하루밖에 남지 않았습니다.
작년 최종 문제가 3주차 미션의 내용과 연관되어 나온 만큼 올해도 그럴 것이라 예측을 하며 내일은 3주차 미션이었던 자판기 문제를 처음부터 다시 프로그래밍해보려합니다.

후회하지 않는 결과를 만들기 위해 남은 하루도 노력하겠습니다🔥🔥🔥

오늘 작성한 지하철 노선도 미션 코드는 다음 링크를 통해 확인하실 수 있습니다.
지하철 노선도 미션

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글