본문 바로가기
교육 활동/TDD, Clean Code With Java 14기

TDD, Clean Code With Java 14기 2주차 회고 [2022. 04. 11 ~ 2022. 04. 18]

by WangTak 2022. 4. 19.
반응형

2주 차에 접어들면서 첫 번째 미션인 자동차 경주를 끝냈습니다. 

첫 번째 미션에서는 테스트 작성 방법과 함께 메소드 분리, 클래스 분리 등과 같은 역할과 책임을 나누는데 초점을 둔 미션 같았습니다. 평소 코딩하던 습관이 있었기 때문에 리뷰를 통해서 좋은 코드를 작성하는 방법과 의식하는 코딩을 배울 수 있어서 재밌었습니다. 뿐만 아니라 메소드의 위치라던지 변수의 선언, 인스턴스 변수가 꼭 필요할지? 등과 같이 다른 개발자분들과 협업을 할 때 오해의 소지라던지 미스 커뮤니케이션이 날 수 있는 부분을 고민하고 개선하는 과정을 거쳤습니다.

 

미션을 진행하면서 스트림을 사용해봤는데 제가 작성한 스트림에서 더 간결한 방법이 있어서 그 내용을 정리하고 지금까지 진행한 두 번째 미션인 로또에 대해서 정리해보도록 하겠습니다.

 

자동차 경주 미션 끝

String[] carNames = {"car1", "car2", "car3"};

// myCode
List<String> carNameList = Arrays.asList(carNames);
List<RacingCar> racingCars = carNameList.stream()
	.map(RacingCar::new)
	.collect(Collectors.toList());

RacingGame racingGame = new RacingGame(racingCars);

// reviewedCode
RacingGame racingGame = Arrays.stream(carNames)
	.map(RacingCar::new)
	.collect(Collectors.collectingAndThen(Collectors.toList(), RacingGame::new));

 

아마 스트림을 사용하신 분들이라면 위 코드가 바로 이해가 되실텐데요. 저 같은 경우는 스트림의 맛을 살릴 수 있을 정도로 유연하게 사용하지 못하는 배우고 있는 단계입니다. 그래서 제가 작성한 코드를 보시면 스트림을 사용하는 거 같지만 리뷰해주신 코드에 비해서는 좀 덜 간결해 보이고 오히려 복잡해 보입니다. 의도한 바는 다음과 같습니다.

 

1. carNames 문자열 배열을 List<String>으로 바꿉니다.

2. List<String>에 스트림을 사용하여 List의 각 요소들을 사용하여 RacingCar 객체를 생성하고 그 결과를 List로 만듭니다.

3. RacingGame에서는 List<RacingCar>를 인자로 하는 생성자가 있기 때문에 스트림을 사용하여 만든 List<RacingCar>를 넘겨줍니다.

 

=> 간단히 말해서 문자열 배열(String[] carNames)RacingGame으로 만드는 과정을 거친 것입니다.

※ 메소드 참조인 Class::new에 대한 설명은 생략하도록 하겠습니다.

 

스트림을 세부적으로 몰랐던 저는 하나하나 일일이 변환 과정을 하고 그 결과에 스트림을 또 적용한 코드라고 보시면 될 거 같습니다.

 

리뷰해주신 코드를 보면 문자열 배열(String[] carNames)을 RacingGame으로 만들었습니다. 정말 놀랍고 재밌었습니다. 약간 이게 되네..? 하는 느낌이 들었습니다.

 

물론 리뷰어분께서 평소에 리뷰를 해주실 때는 정답보다는 힌트를 주시고 저 스스로 생각하거나 고민할 수 있는 질문을 던져주시지만 위 코드와 같이 정답을 바로 알려주신 거는 너무 감사했습니다. 사실 Collectors.collectingAndThen이라는 구문을 처음 접했고 있는지 조차 몰랐기 때문에 이런 문법적인 내용은 정답을 통해 적극 활용하는 것이 좋다고 생각하기에 감사했습니다.

메소드 이름을 정말 잘 짜야겠구나라고 생각이 된 게 collectingAndThen의 이름만 봐도 collecting 한 이후에 뭔가를 하겠구나~ 뭘 할지를 내가 정하면 되는 거구나를 명확하게 알 수 있었습니다.

예시 코드에서 Collectors를 static import하면 더욱더 깔끔하고 가독성이 좋은 코드로 개선될 수 있습니다.

 

로또 -TDD 미션 시작

자동차 경주 미션이 끝나고 바로 두 번째 미션인 로또를 시작했습니다. 재성님께서 라이브 강의에서 미션이 점차 어려워질 것이라고 말씀해주셨는데 확실히 난이도가 올라간 것이 느껴졌습니다. 그래서 2주 차에는 자동차 경주 미션을 마무리하고 로또 미션의 step 1, 2를 끝냈습니다.

 

중요한 내용을 빼먹었네요. TDD 수업의 가장 큰 장점 중 하나가 온라인 코드 리뷰인데 그중에서도 각 미션마다 리뷰어님들이 바뀝니다. 총 4개의 미션이 있으니깐 8.5주 동안 4명의 리뷰어분들에게 피드백을 받고 다양한 의견, 피드백, 성향을 알 수 있는 좋은 구성입니다.

 

step 1은 사칙 연산 프로그램을 만들었고, step 2는 로또 프로그램을 만들었습니다. 로또 미션에서 가장 중요하게 느껴지는 부분이 기능 별 유닛 테스트 작성 및 enum의 활용 같습니다. 요구 사항을 보고 어떤 기능이 필요할지 정리하고, 정리한 기능에 대해서 테스트 코드를 작성하면서 설계 및 구현을 하는 방식으로 코딩을 이끌어주셨습니다. 그 과정에서 enum을 사용해서 사칙 연산의 기호를 관리하고 로또에서는 당첨 등수에 대한 금액을 Rank라는 enum으로 관리했습니다. 

 

확실히 14기의 전통이 있는 만큼 각 미션마다 목표하는 바가 있는 거 같습니다.

자동차 경주 미션에서는 단위 테스트 작성 방법, MVC 구조를 통해 역할과 책임의 분리의식하는 코딩(else 사용하지 않기, indent depth 2 넘기지 않기)를 통해 가독성이 좋은 코드를 짜도록 하는 것이었습니다.

 

로또 미션에서는 자동차 경주 미션에서 체득한 것을 가져가면서 기능 별 테스트 케이스 작성을 먼저 하고 설계 및 구현을 하는 TDD를 사용하는 것이었고 enum을 활용하여 프로그램에서 사용되는 특정 상태를 관리하였습니다.

 

여태 코딩을 하면서 enum을 잘 활용하지 못했는데 이번 기회에 또 한 번 성장한 느낌을 받았고 앞으로도 꾸준히 성장하겠습니다. 또한, 세 번째 미션은 함수형 프로그래밍이 주제인데 매우 기대가 됩니다. 아마 3, 4주 차 회고 때 배운 내용을 정리할 수 있지 않을까 생각됩니다.

 

앞 광고, 뒷 광고는 아니지만 정말 다음 단계로 성장을 원하시는 분들은 nextstep의 TDD 강의를 꼭 들어보시는 것을 추천 드립니다.

 

 

 

반응형