우아한 테크코스 8기 프리코스 2주차[1] - 과제 진행 소감

BrokenFinger98·2025년 11월 11일

우아한 테크코스

목록 보기
5/5

우아한 테크코스 8기 프리코스 2주차 과제를 진행하고 느낀점을 작성해보려고 한다.

2주차 과제 소감문

2주차는 1주차에 비해 readme.md를 작성하는게 더 쉬웠습니다. 1주차때 readme.md를 어떻게 작성해야될지 고민했던 과정이 2주차에서는 도움이 되어 빠르게 기능 구현 목록을 작성할 수 있었습니다. 2주차에서는 JUnit 5와 AssertJ를 이용하여 테스트 코드를 작성해야 했습니다. 과거에 테스트를 작성해본 경험이 있었기 때문에 전반적인 흐름은 익숙했지만, “테스트하기 좋은 코드로 설계하기”라는 점에서는 많은 고민이 있었습니다.

테스트 가능한 구조로 리팩토링하기
초기 설계에서는 아래와 같이 랜덤 값을 직접 호출하는 방식이었습니다.

public class RandomMoveStrategy implements MoveStrategy {

    @Override
    public boolean shouldMove() {
        return Randoms.pickNumberInRange(0, 9) >= 4;
    }
}

이 방식은 단순하고 직관적이지만, 테스트 코드에서 Randoms.pickNumberInRange()의 반환값을 제어할 수 없어 결정적 테스트가 불가능했습니다.

이를 해결하기 위해 NumberPicker 인터페이스를 도입하고, 랜덤 로직을 외부에서 주입받는 방식으로 리팩토링했습니다.

public interface NumberPicker {
    int pickNumberInRange(int min, int max);
}
public class MissionUtilsNumberPicker implements NumberPicker {
    @Override
    public int pickNumberInRange(int min, int max) {
        return Randoms.pickNumberInRange(min, max);
    }
}

그리고 RandomMoveStrategy는 이제 의존성 주입(DI)을 통해 NumberPicker를 받아 사용하도록 변경했습니다.

public class RandomMoveStrategy implements MoveStrategy {
    private final NumberPicker picker;

    public RandomMoveStrategy(NumberPicker picker) {
        this.picker = picker;
    }

    @Override
    public boolean shouldMove() {
        return picker.pickNumberInRange(0, 9) >= 4;
    }
}

테스트 코드에서는 다음과 같이 FixedNumberPicker를 만들어, 반환값을 고정시킬 수 있게 했습니다.

private static class FixedNumberPicker implements NumberPicker {
    private final int value;

    FixedNumberPicker(int value) {
        this.value = value;
    }

    @Override
    public int pickNumberInRange(int min, int max) {
        return value;
    }
}

이제 랜덤성에 의존하지 않고, 테스트 코드에서 명확한 입력과 출력을 검증할 수 있었습니다.
이를 통해 “테스트가 가능한 구조로 설계한다”는 원칙의 중요성을 몸소 느낄 수 있었습니다.

이번 과제를 통해 테스트 가능한 설계가 곧 좋은 설계라는 사실을 다시 한번 깨달았습니다.
단순히 기능을 구현하는 것에서 끝나는 것이 아니라, 코드가 얼마나 유연하고 검증 가능한 구조로 되어있는지가 중요하다는 것을 느꼈습니다.

또한 인터페이스 분리를 통해 의존성을 주입(DI) 하고, 테스트에서 이를 활용하는 경험은 앞으로의 객체지향 설계에도 큰 도움이 될 것 같습니다.
다음 주차 과제에서는 “더 나은 책임 분리와 테스트 설계”를 목표로 도전해보려 합니다.

profile
나는야 개발자

0개의 댓글