We will find a way, we always have.

-interstellar

우아한테크코스

[우테코 레벨 1]: 1주차 회고

Redddy 2024. 2. 18. 17:42

 

회고를 작성하는게 언제까지 지속될진 모르겠지만 일단 해보자!!
레디의 1주차 회고 시작합니다.


 

OT


2월 13일부터 본과정이 시작되었다.
 
데일리 조는 제제, 비토, 백호, 커비, 종이, 안나, 테바, 러쉬, 리건이였다.
연극조는 그 중 제제, 비토, 백호, 커비 이렇게 였고, 
첫 페어는 백호였다!
 
OT때 기억에 남았던 문장들을 남겨본다.
 

  • 다양한 피드백을 통해 메타인지 역량을 키움
  • 모르는 것을 모른다고 할 수 있는 용기
  • 빠르게 실패하기
  • 일단 도전하기

 
페어 프로그래밍의 맛보기로 문자열 계산기 프로그램을 작성하는 하는 것이였다. 
 
주어진 시간이 무척이나 짧았기에 고민보다는 GO를 하였어야 했는데 처음이다 보니 서툴렀다. 일단 기능부터 빠르게 구현하고 그 이후에 피드백을 받는 것이, 제한 시간안에 동작할 수 있는 쓰레기를 만들 수 있는 방법이었다.
 
그래서 끝나고 바로 앞 스타벅스에 가서 백호와 마무리를 짓고 갔다.
 
문자열 계산기의 피드백 중 기억에 남았던 것은
 

  • 클린코드가 빛을 발하는 시점은 프로그램이 동작하고 있을 때이다.
  • 일단 쉬운거부터 빠르게 작성하기.

 
위의 조항들을 기억하며 프로그래밍 해도록 하자.
 

레벨 1 자동차 경주 step1

 
첫번째 미션은 자동차 경주 미션이였고, step1은 페어 프로그래밍으로 진행하였다.
 
8분 타이머를 맞추고 시간이 끝날 때 마다 네비게이터와 드라이버의 역할을 바꿨다. 백호와 나는 비슷한 구조로 프로그래밍을 하여 크게 안맞는 부분은 없었다. 하지만 그래도 많이 고민했던 부분은 있다. 
 
커스텀 예외
백호는 예외를 IllegalArgumentException을 상속받아 예외를 커스텀하여 사용하였는데, 나는 커스텀하지 않고, 메시지만 다르게 출력해주었다.
예외를 커스텀한다 하여도 결국에 커스텀하는 것은 클래스의 이름뿐이고 나머지는 상속하고 있는  IllegalArgumentException을 사용하고 있었다. 커스텀 예외를 만들면 결국 관리해야하는 클래스가 늘어나는 것이고, 비용이 발생하게 되는데 현재 이 단점을 커버할만한 장점이 보이지 않아 커스텀 예외를 만들지 않고, 예외 메시지만 다르게 출력하기로 정했다.
 
예외 입력 시 재입력
프리코스 때에는 인덴트 제한이 2였기 때문에, while 문과 try 를 사용하여 예외 입력 시 재입력 받는 기능을 인덴트 제한에 걸리지 않고 구현할 수 있었다. 하지만 본과정에서는 인덴트 제한이 1로 줄었기에 다른 방법이 필요했다.
 

1
2
3
4
5
6
7
8
9
public Object getXX() {
    while (true) {
        try {
            return readXX();
        } catch (IllegalArgumentException exception) {
            outputView.printErrorMessage(exception);
        }
    }
}
cs

 
 
그래서 재귀를 사용하여 해당 기능을 구현하였다.
 
 

1
2
3
4
5
6
7
8
 public static <T> T generate(final Supplier<T> supplier, final Consumer<String> consumer) {
        try {
            return supplier.get();
        } catch (IllegalArgumentException exception) {
            consumer.accept(exception.getMessage());
            return generate(supplier, consumer);
        }
    }
cs

 
 
하지만 재귀의 문제점은 바로 스택 오버플로우가 발생 가능성이 있다는 것이다. 테스트 코드로도 확인을 했다. 하지만 인덴트 1이라는 요구사항을 지키기 위해 재귀를 사용하여 제출하였다.
 
이런 고민들을 가지고 PR을 요청하였다.
 
 
자동차 경주 1단계 PR

 

[1단계 - 자동차 경주 구현] 레디(최동근) 미션 제출합니다. by reddevilmidzy · Pull Request #728 · woowacour

안녕하세요 범블비! 레디라고 합니다:) 리뷰 받았으면 좋을 것 같은 부분 남겨보아요! 예외 커스텀 자동차 경주에서 사용자가 입력하는 값 중 발생할 수 있는 예외는 이름 입력할 때와 시도횟수

github.com

 
 


 

레벨 1 자동차 경주 step2

 
받은 피드백을 요약하면
 

  • getter 지양
  • 테스트가 추가되어도 안전한 테스트 코드 작성
  • 인덴트 1로 재귀 없이 재입력 구현 가능!
    • 다만 이번 미션 요구 사항에선 재입력 요구 사항이 없었으므로 예외를 던져도 괜춚!
  • 일급컬렉션, VO, DTO 사용이유?

 
스스로 생각해볼 수 있도록 내가 사용한 개념들에 대해서 장점을 물어봐주셨다.
 
view에 넘겨줄 때 model인 cars를 바로 넘겨준 것이 아니라 dto를 만들어서 넘겨주는 방식을 사용하고 있었는데, 현재 CarDto는 Car의 필드와 동일하기 때문에 Dto의 장점을 활용하지 못하고, 단순히 코드의 크기만 키우고 있었다. 
 
CarDto
 

1
2
3
4
5
6
public record CarDto(String name, int position) {
 
    public static CarDto from(final Car car) {
        return new CarDto(car.getName(), car.getPosition());
    }
}
cs

 
Car
 

1
2
3
4
5
6
7
8
9
10
11
public class Car {
 
    private static final int MIN_NUMBER = 4;
    private static final int START_POSITION = 0;
 
    private final CarName name;
    private int position;
 
    // 생략
 
}
cs

 
 
 
그래서 DTO를 제거하였다.
 
VO와 일급 컬렉션의 장점은 모두 각자 맡은 책임을 스스로 책임질 수 있어 응집력이 올라가고, 자신만의 이름이 생긴다는 것이다.
 
 
getter를 지양하기 위해 Comparable을 구현하는 방식을 사용하였다. 그리고 getter로 값을 꺼내서 확인하는 것이 아니라 비교하고자 하는 값을 객체에 물어봐 같은지 다른지 boolean으로 확인하는 방식으로 변경하였다.
 
재귀없이 인덴트 1로 구현은 메서드 분리와 null 을 사용하여 구현하였다.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Cars getCars() {
    Cars cars = null;
    while (cars == null) {
        cars = readCars();
    }
    return cars;
}
 
private Cars readCars() {
    try {
        String carNames = inputView.readCarNames();
        return Cars.from(carNames);
    } catch (IllegalArgumentException exception) {
        outputView.printError(exception.getMessage());
        return null;
    }
}
 
cs

 
 
자동차 경주 2단계 PR

 

[2단계 - 자동차 경주 리팩터링] 레디(최동근) 미션 제출합니다. by reddevilmidzy · Pull Request #747 · woo

안녕하세요 범블비! 🐝 1단계와 달라진 점을 적어봅니다! 우승자를 찾는 로직을 getter를 사용하여 비교하는 방식이 아니라 Comparable를 구현하여, 우승자를 찾는 방식으로 변경하였습니다. DTO를

github.com

 
 


 
이곳에 엄청 빠르게 적응한 거 같다. 조금만 움직여도 토론의 장이 열리는 이 곳에서 살아남으려면 역시 끈질기게 생각하고 명쾌하게 설명해야 할 거 같다.
 
여담으로 OT빼고 매일 6시 칼퇴 없이 저녁 먹고 남아서 더 하고 갔다. 풀파워로 달리는 중🏃‍♂️
결과는 수요일엔 코피흘리고, 금요일엔 열이났다.😎
 
잠을 제대로 자지 못하고 있는데 자려해도 계속 코드가 생각나고 구조를 그리게 된다. 꿈에서도 코드를 짜고 있는 날이 많아졌다.🌇
 


KPT

 

  • Keep
    • 크루와 같이 토론하기
    • 지각하지 않기
    • 캠퍼스에 남아서 더 하고가기

 

  • Problem
    • 숙면을 취하지 못한다.
    • 운동 부족
    • 미션 이외에 공부를 하지 못하고 있다. (CS, 알고리즘)

 

  • Try
    • 운동하기 (계단 오르기, 달리기)
    • 지하철에서 보내는 시간을 효율적으로 사용하기