12월 17일 선릉 교육장에서 우아한 테크 프리코스 최종 코딩테스트가 치러졌다.
결론부터 얘기하면 최종 코테에서 "불합격" 했다.
"기말고사와 기간이 겹쳐 우테코 공부에 조금 소홀했다" 가 변명이라면 변명이다. 돌이켜보면 나보다 더 간절해 기말고사를 포기하고 우테코를 공부한 사람이 합격하는게 맞다고 생각이 든다.
지난 기수에는 Java 파일을 읽기로 불러들이는 방법을 문제에 도입했었다.이번 기수 시험에는 어떤 새로운 문제가 출제될지 모르는 상황이었지만, 어떤 문제가 나오든 요구사항을 찬찬히 읽어보면서 풀자는 마음가짐으로 시험에 돌입했다.
문제는 다음 링크에서 확인할 수 있다.
https://github.com/gkdbssla97/java-menu
문제를 읽어보니 요구사항이 생각보다 간단하다고 생각하다고 생각했다.
코치들에게 월화수목금 점심메뉴를 랜덤으로 추천해주는 기능을 구현하라.
초기설정, 기능목록작성
Domain + Service 개발 - 2시간
InputView에서 입력받아 Controller에 전달 - 2시간
입력값 검증, 파싱 후 Model에 넘기기 - 0.5시간
Model에서 반환된 값 OutputView에 넘기기 - 0.5시간
이렇게 큰 틀을 잡고 시작해나갔다. OOP원칙을 지키기 위해 model 안에 각 도메인을 생성했다. (코치, 음식메뉴, 음식 카테고리) 그리고 Repository, Service, Controller 그리고 예외사항 및 파싱을 위한 util 디렉토리까지 줄기를 잡고 코딩을 진행해 나갔다. 약 2시간을 남기고 어느정도 구현을 한 상태였지만, 테스트 케이스를 컴파일 했지만 계속 테스트 실패가 발생하여 당황하였다.
1. 요일에 해당하는 음식 카테고리의 메뉴가 출력되지 않고 다른 카테고리의 메뉴가 출력되었다.
2. <월 화 수 목 금>이 아닌 <화 수 목 금 월>로 출력이 되었다.
1번의 경우는, 코치마다 먹지 못하는 음식메뉴를 설정하는 로직이 꼬여서 발생했다고 판단하고 코드를 천천히 하나하나 곱씹어보았다. 여기서부터 내 문제풀이 계획이 틀려 평정심을 잃은 게 최종 코테의 패인이라고 느꼈다. 단위테스트를 해봐야하는데, 급한 마음에 단위 테스트를 진행하지 않고 줄줄이코드를 작성해나갔다.
2번의 경우는, 요일별 리스트를 HashMap으로 작성했다. HashMap은 작성한 순서대로 배열 인덱스가 정해지지 않는다. Java 문법을 제대로 인지하지 못하고 구조 설계를 해나가 원인을 제대로 파악하지 못해 시간을 낭비했다.
HashMap
은 데이터의 순서가 보장되지 않는다.
HashMap
의 순서를 보장하고 싶은경우에는LinkedHashMap
을 활용하면 된다.
public class Study_HashMap {
public static void test1() {
System.out.println("HashMap->");
Map<String, Integer> map = new HashMap<>();
map.put("월 ", 1);
map.put("화 ", 2);
map.put("수 ", 3);
map.put("목 ", 4);
map.put("금 ", 5);
map.keySet().stream().forEach(System.out::print);
}
public static void test2() {
System.out.println("LinkedHashMap->");
Map<String, Integer> map = new LinkedHashMap<>();
map.put("월 ", 1);
map.put("화 ", 2);
map.put("수 ", 3);
map.put("목 ", 4);
map.put("금 ", 5);
map.keySet().stream().forEach(System.out::print);
}
public static void main(String[] args) {
test1();
test2();
}
//출력 결과
HashMap->
목 월 화 금 수
LinkedHashMap->
월 화 수 목 금
15줄 이하로 메서드 작성, 메서드는 하나의 기능만 하도록 구현, 예외처리, 매직넘버 사용 등의 원칙을 지키지 못 한채로 문제를 풀었다. 결국 시험시간이 종료되고, 테스트를 성공시키지 못한 채 PR하게 되었다.
시간 내에 모든 기능 요구 사항을 충족하기 위해 최선을 다하세요.
안 돌아가는 프로그램보다 돌아가는 쓰레기
를 만들어도 괜찮아요.
그런 다음 클린 코드, 리팩터링, 테스트 등을 챙기는 거예요.
"1순위" 목표인 프로그램이 돌아가게 해야하는 채점기준을 넘지 못했다. 이 상황에서 나는 클린 코드, 리팩터링, 테스트 등을 챙기고 부분점수라도 챙겨보자 라는 마음이 맞았을까, 아니면 어떻게든 코드를 돌아가게끔 하는게 맞았을까, 라는 갈림길에서 어떤 선택이 맞았을까 라는 후회를 했다.
지나간 일은 이제 잊고 앞으로 나가야한다. 어떤게 내 실패 원인이고, 어디서 막혀서 구현을 못했는지 체크를 하며 이해하고 깨닫는 과정이 성장이라고 생각한다.
짧다면 짧은 1달이라는 프리코스 과정에서 나는 많은 것을 배웠다.
프리코스 1~4주차 기간동안 공부했던 내용들, 기능
, 프로그래밍
, 과제 진행
요구 사항을 지키면서 기능을 구현하기 전에 기능 목록을 작성
, 기능 단위로 커밋
, 객체생활체조
, 자바 컨벤션
, 깃 커밋 컨벤션
, JUnit
, AssertJ
등 TDD원칙에 대해 새롭게 배우면서 내 습관으로 익히도록 했던 노력은 사라지지 않을 것이다.