우아한 테크캠프 Pro — 2주차

Byungkyu Ju
byungkyu-ju
Published in
5 min readDec 31, 2020

2주차- 로또- TDD

https://unsplash.com/photos/RSsqjpezn6o

2주차 강의

2주차 강의는 지난 1주차에 했었던 레이싱게임을 포비가 TDD로 라이브코딩을 하면서 어떤 흐름으로 접근을 하는지 직접 보여주는 것으로 시작했다. TDD를 잘하는 것은 요구사항을 분석하는것이 첫번째라고 했다. 분석한 요구사항을 TODO List로 만들고, 하나씩 구현해 나가는 순서로 코드를 구현했다.

TDD로 구현을 하면서 생기는 어려움을 해결하는 방법을 몇가지 설명했다.

테스트하기 어려운 코드를 테스트 가능하도록 구현하는 방법

메소드 signature를 변경하지 않으면서 테스트가 가능한 구조로 리팩토링

테스트를 할 수 있는 구조를 만드는데 내부 테스트코드에서 변경가능한 포인트를 만드는것이 중요하다. 이것을 seam(옷감의 솔기)을 만든다라고 표현할 수 있는데, 기존의 메소드 내부를 별도의 메소드로 추출한 후 protected로 선언하는 순간 (테스트를 위한)seam이 생성된다고 볼 수 있다.

protected로 코드를 오픈해서 기능의 확장 포인트를 만든 다음, 테스트코드에서 직접 기능을 구현함으로써 테스트가 가능하도록 구현할 수 있게된다.

기존 레거시코드를 테스트코드로 개선하기 위해서 이러한 방법을 활용하는 것이 유용하다고 한다.

포비의 영상은 올릴 수 없다 ㅠㅠ

메소드 인자로 값을 전달해 테스트 가능한 구조로 리팩토링하기

위의 방식으로 테스트코드를 통해 안정적인 기능동작을 확인한 다음, 기존에 메소드 인자가 없는 상태의 메소드였다면 과도기상태의 오버로딩을 구현한 후 차근차근 이전 메소드를 지워나갈 수 있다. 메소드 인자가 없는 기존 메소드를 메소드가 존재하도록 만듦으로써 유동적으로 테스트가 가능한 구조로 변경할 수 있게 되는 것이다.

인터페이스를 인자로 전달해 테스트 가능한 구조로 리팩토링하기

기능이 추가되고 확장포인트가 많아진다면 인터페이스를 구현하는 방식으로도 개선할 수 있다. 인터페이스로 추상화하여 테스트시 결과값을 정할 수 있게 되므로 테스트가 유용한 구조로 개선될 수 있게 된다.

모든 원시값과 문자열을 포장한다.

원시 타입의 값을 그대로 사용하지 않고, 원시값을 포장하는 인스턴스 필드를 가지는 클래스로 만들어 값 자체에게 의미를 부여한다.

일급 콜렉션을 쓴다.

콜렉션을 wrapping하고, 다른 멤버 변수가 없는 상태를 일급 콜렉션이라고 한다. 자료구조형을 바로 사용하지 않고 wrapping함으로써 고정적인 타입이 아닌 비즈니스 로직에 해당하는 자료구조를 가지게 의미를 부여한다.

2주차 미션

2주차 미션은 1주차에 했던 문자열 계산기와 조금 다른 계산기를 구현하고, 콘솔로 로또게임을 구현하는 과제였다.

1주차보다 지켜야 할 규칙이 늘어나고, 단계별로 요구사항이 크게 바뀌는것이 특징이었다. 이번 미션에서는 요구사항에 맞는 자료구조를 적절하게 사용하는 부분이 부족했었다는걸 알게 되었고, 리팩토링을 하기 위해 코드를 더욱 꼼꼼히 봐야겠다고도 생각했다.

적합하지 않은 자료구조를 사용했었고, 그 자료구조로 억지로 기능을 맞추기 위해 계속해서 기능을 만들었어야 했다. 코드를 작성하기전에 충분히 구조를 고민해야 시간을 아낌과 더불어 불필요한 수고를 덜 수 있다ㅠ

--

--