[들어가며]
처음 과제를 진행할 때 저번주에 진행했던 레이싱 게임에 비해서 확실히 난이도가 상승했다고 생각했다. 요구사항들이 꽤 추가 되어 있었고, 당연히 구현은 더 오랜시간이 걸렸다.저번주와 마찬가지로 테스트 코드를 미리 작성하는 TDD 방식은 아직 익숙 하지 않아 꾸준한 노력이 필요하다고 생각한다. 가장 먼저 피드백으로 제공해주신 내용을 확인하면서, 학습테스트를 통해 JUnit 학습하기 문서를 가장 먼저 읽어 보았고, 메일서 목표로 주어진 내용인 테스트코드와 리팩토링을 중점적으로 연습하려고 노력했다.
[도메인 로직에 대한 단위 테스트를 작성하는 연습]
가장 먼저 단위테스트를 작성하는 연습을 하기 위해서는 도메인 로직에 대한 단위 테스트가 무엇인지 파악하는게 먼저였다. 구글링과 GPT에 질문해보면서 어떤 내용의 테스트 인지 파악해본 결과 특정 함수, 또는 클래스와 같은 도메인 로직의 작은 부분에 대해 수행되는 테스트라는 설명이 많았다. 피드백과 함께 제공된 문서를 보며 String 클래스에 대해서 먼저 작성해보려고 나는 문자열 정수를 받았을 때 “,”로 split하고 List로 바꿔 주는 클래스를 만들어서 처음에는 assertEquals 로 비교해서 맞는지 검증해보았다.
테스트 작성 연습을 위해 검증을 해보면서 assertEquals , containsExactly, contains 차이에 대해서 이해하는데 많은 도움을 받았고, 더불어 Set Collection에 대한 테스트 공부를 하면서 진행했던 @ParameterizedTest를 사용하면서 @ValueSource를 함께 사용하면서 코드를 제거하고 한번에 많은 케이스를 테스트하는 과정에서 처음 사용해 보았는데 많은 도움이 되었다. @ValueSource에 대해서 알게된점은 매번 배열의 인수 하나를 메서드 매개 변수에 할당 한다. 예를 들어 @ValueSource(strings = { "500", "0" }) 이 경우 총 2번 전달한다. 또 short,byte,int,long,float,double,char,String,Class 유형만 전달할 수 있었고, 매번 테스트 메서드에 하나의 인수만 전달할 수 있었다. null을 인수로 전달할 수 없다는 정보도 알게 되었다. null을 인수로 전달 받기 위해서는 ValueSource가 아닌 NullSource를 이용해서 단일 null값을 전달 할 수 있다. 기본 데이터 유형의 경우는 null을 전달 받을 수 없기 때문에 EmptySource을 사용하여 빈 값을 전달 할 수 있다고 한다.
많은 정보를 Guide to JUnit 5 Parameterized Tests 문서를 통해 알게 되었고, 더 많은 내용을 테스트 코드에 직접 적용해보기 위해 더 많은 공부가 필요하다고 느꼈다. 또 다른 테스트들을 진행하면서 수익률 계산에 맞지 않는 경우가 있어서 확인 해보니, 내 처음 코드에서는 총 상금에서 로또의 구입금액까지 빼고있어서 오류가 발생한 부분이 있었다. 단위 테스트로 작게 만들다 보니 작은 기능에서 문제가 생겼을 때 빠른 피드백을 받을 수 있었고, 어떤 기능에 문제가 생겼는지 한번에 알아보기가 편해진 것 같았다. 또 리팩토링을 진행하면서 한번 진행할 때 마다 한번씩 테스트 케이스가 정상적으로 통과하는지 확인하다보니 리팩토링중에도 오류가 발생하거나 원하는 결과가 나오지 않았을 때 테스트 코드로 인해 더 빠른 리팩토링을 경험 할 수 있었다.
[클래스(객체)를 분리하는 연습]
확실히 저번 주 미션에서도 진행했던 부분이어서 어떤식으로 분리하고 메서드를 줄일 수 있을지 생각하면서 코드를 작성하다 보니, 처음부터 작은 메서드를 만들려고 노력하고 있는 나를 확인 할 수 있었다. 그래도 구현을 마치고 보니 많은 요구사항에 맞지않는 코드들이 너무 많았고, 최대한 더 읽기 편하고 메서드가 하나의 기능만 수행하도록 만들고 싶었는데, 생각보다 어려운 부분이 많았다.
특히 예외 처리 부분에서 재입력을 받다보니 while문 안에 try-catch문까지 들어가니까 정말 보기 힘들었다. 그래서 예외처리 메서드를 최대한 나누고 do-while문에서 예외처리메서드 안에 인수를 넣어서 보기 좋게 바꾸려고 노력했다. 상수 부분에서도 아직 어떤 부분을 상수로 만들어야 할지 감이 잘 잡히진않는다. 하지만 가장 많이 사용되고 있다고 느끼는 로또의 가격부분과 로또의 1~45 부분, 로또 숫자의 개수를 상수로 처리 해줬는데 확실히 가독성이 좋아졌고, 어떤 숫자인지 내 코드를 처음보는 사람도 알 수 있었다면 좋겠다는 생각으로 진행했다. 확실히 1주차 보다는 코드가 많이 좋아졌다고 느끼는데 공부하다보면 아직 많이 부족하고, 배울게 정말 많다고 느껴진다. 더 노력하는 4주차가 되었으면 좋겠다.
[개선 해야 할 점]
확실히 테스트 코드작성을 프리코스에서 처음 진행하다보니 나 스스로도 아직 많이 부족함이 느껴진다. 이번주 피드백에서 주어진 테스트 코드 학습 문서를 통해 조금 더 테스트 코드에 대해서 공부해봐야 할 것 같고, 리팩토링에서 메서드 분리나 클래스 분리도 어떻게 해야 좋은 코드가 될지 고민 해봐야한다. 4주차는 조금 더 성장한 코드를 작성 했으면 좋겠다.