3주 차 미션 - 로또
시작하기 앞서

어느덧 3주 차가 끝났다. 매주마다 프로그래밍에 대해 고민하는 시간이 많았고, 내가 작성한 코드를 몇 번이고 반복하는 시간이었던 것 같다. 3주 차 미션은 로또였다. 이번 주 또한 크게 구현하는 데는 어렵지 않았지만, 요구사항과 피드백이 많아지니 생각할 것도 많았던 것 같다.

 

🔍 진행 방식
미션은 기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구사항 세 가지로 구성되어 있고, 세 개의 요구사항을 만족하기 위해 노력해야 하며, 기능 구현 전에 기능 목록을 만들고, 기능 단위로 커밋해야 한다.

매주 진행 방식은 같지만 주어진 요구사항을 해내는 것도 어렵고, 요구사항을 잘 파악해서 문제를 해결해야 한다. 메일이 도착했을 때 요구하는 사항은 두 가지 있었다.

  1. 클래스(객체)를 분리하는 연습
  2. 도메인 로직에 대한 단위 테스트를 작성하는 연습

클래스를 분리하는 건 2주 차부터 열심히 연습하고, 객체화하며 구현하고 있었다. 다만 객체는 일련의 순서가 딱 들어맞게 구현해야 하는데, 맞게 하고 있는지는 잘 모르겠다,,

문제는 2번이다. 2주 차에서도 테스트를 하는 게 어려웠다. private으로 선언돼있으면 호출하기도 힘들었고, 어떤 기능을 테스트해야 하는지 잘 몰랐기 때문에 굉장히 많은 고민을 했다.

 

피드백에서 테스트를 작성하는 건 경험을 토대로 작성해보라는 말이 있었고, 그 말이 무슨 뜻일까 고민을 많이 했다.

개인적인 생각으로는 테스트를 경험에 의해 작성한다는 것은 자신이 코딩한 기능을 왜 만들었고, 어떤 오류가 있을지, 또는 실행하며 이러한 오류가 발생했을 때 다시는 오류가 발생하지 않게 경험을 토대로 테스트를 작성하라는 의미 같았다.

 

문제 속 추가된 요구사항은 다음과 같았다.

  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다
  • else 예약어를 쓰지 않는다.
  • Java Enum을 적용한다.
  • 도메인 로직에 단위 테스트를 구현해야 한다. 단 UI로직은 제외한다.

첫 번째와 두 번째 요구사항은 저번 주차에서도 지키려 노력했던 부분이기에 크게 어렵게 느껴지지 않았다. Enum을 사용하는 법과 단위 테스트를 구현하는 것이 관건이었고, 사용하기 전에 공부를 충분히 하고 진행을 하였다.

 

📈 진행 과정

2주 차를 진행하고, 우테코 디스커션을 통해 다른 지원자 분들의 피드백을 많이 받았다. 다른 사람들이 지적해준다는 것은 내가 성장할 수 있도록 도와준다고 생각하기에 피드백이 많아서 오히려 기분이 좋았다. 첫 번째는 디미터의 법칙에 대해서 가르쳐 주었다. 디미터의 법칙은 간단하게는 한 줄에 점을 한 번만 찍는 것이고, 자세하게는 다른 객체를 탐색하여 무언가를 일어나게 하면 안 된다는 것이다.  물론 내가 지적받은 부분은 한 줄에 점이 여러 번이 있었기에 가독성에도 문제가 있다고 생각했고, 다른 지원자분이 친절하게 링크도 올려주셔서 디미터의 법칙에 대해 자세하게 알 수 있었다.

 

다음은 getter는 객체를 통해 전달하면 더욱더 OOP에 가까워질 것이었다. getter를 통해 접근할 수 있게 방치를 해두었다. 이것이 바로 디미터의 법칙에도 어긋날 수 도있고, 객체 보안(?)도 약해질 수 있지 않을까 싶었다. 크게 이 두 가지를 추가적으로 지키며 과제를 진행하려 노력하였다.

 

로또 과제를 진행하며 주어진 요구사항이 많았기에 고민도 많이했지만, 코딩하는 속도도 빨라진 느낌이었다. 3주 차를 진행하면서 어려웠던 점은 세 가지였다.

 

첫 번째는 enum이었다. Enum 클래스를 사용하기 전 기능을 만들 때는 쉽게 쉽게 진행되었다. 그러다 순위를 반환해야 한다고 생각했을 때 enum을 사용해야 한다는 생각이 들었지만 막상 손이 움직이지는 않았다,,, 개념은 이해를 했는데, 어떻게 해야 할지 고민이었다. 계속 작성하고 지우고 반복하다가 내가 만든 것은 틀리지 않았을 것이라고 판단하였고, 막상 만들고 보니 public static void랑 다르지 않았던 것 같다.

 

두 번 째는 예외 테스트였다. 이 주차와 마찬가지로 IllegalArgumentException예외를 발생시키고, 종료하게 만들었다. 하지만, 제공된 예외 테스트는 실패였다. 다른 분들도 똑같은 경우를 겪은 것 같다.

사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 종료한다. -> 위 요구 사항은 예외 발생 시 로그를 남기고, 프로그램이 종료되는 상황을 생각해 보세요.

추가적인 메일이 왔고, 우테코에서 힌트(?)를 주었다. 예외에 대해 구글링을 많이 했고, Exception과 Error에 대해서 알 수 있었지만, 해결책을 찾지는 못했다ㅠㅠ  문장을 천천히 읽으며 생각을 했고,  해결하고 난 뒤에는 막상 크게 어렵진 않았다.

말 그대로 예외 발생시 로그를 남긴 후 종료하는 것이었다.

public class Exception {
    public static void main(String[] args) {
        try {
        	validateInput("1000j");
        } catch(Exception e) {
        	System.out.println(e.getMessage());
        }
    }
    
    private static void validateInput(String input) {
    	if(!input.matches("^[0-9]*$")) {
        	throw new IllegalArgumentException("[ERROR] 형식에 알맞는 입력이 아닙니다.");
        }
    }
}

필자는 예시로 위와 같은 상황이었다고 생각을 한다. 막상 찾았을 때는 이해를 했지만, 해결을 하지 못했을 때는 굉장히 고민을 많이 했다.

 

마지막으로는 테스트였다. 테스트를 진행할 때 2주 차의 피드백에서는 본인의 경험을 토대로 작성하라고 했다. 본인의 경험을 토대로 작성하라는 것은 자신이 기능을 구현하고, 왜 구현하였는지, 그럼 여기서 생각되는 문제가 뭐가 있었는지에 대해 생각을 하고 작성하라는 메시지라고 생각을 했다.

구매자는 7000원의 돈을 주고 7장의 로또를 샀다. 그럼 7000원 줬을 때 7장이 맞는가? 에 대해 생각을 하고 테스트를 하면 된다고 느꼈다. 하지만 막상 테스트 코드를 작성하려고 했을 때는 생각이 잘 안 나고, 무엇을 만들어야 할지 생각이 잘 안 났다. 그래도 테스트를 진행하면서, 잘못된 부분을 많이 발견한 느낌이었고, 기능들의 위치에 대해서 많이 수정했던 것 같다.

 

🌅 3주 차 후기

벌써 시작한 지 3주가 흘러 어느덧 4주 차가 시작한다. 3주 차를 진행하면서 많이 발전한다고 생각하지만 다른 사람들의 코드를 보러 가면 아직 많이 멀었구나 라는 생각이 들었다. 또 마지막에는 일급 컬렉션에 대해 알았고, 일급 컬렉션을 지키지 못한 것에 대해 아쉬움을 느꼈다. 구조들도 완벽하게 OOP를 가기엔 아직 멀은 것 같다. 하지만 뭔가 깨달은 것 같기도 했다! 합격도 중요하지만 이 과정을 통해 성장한다는 것을 느껴 스스로 보람차기도 한 것 같다. 마지막까지 최선을 다하고 스스로 부족하다고 느끼는 부분은 4주 차에서 수정하고, 고쳐 성장하려고 노력해야겠다.

 

✏️ 3주 차 피드백
  • 함수 라인에 대한 기준
    • 미션의 요구사항에 대한 피드백이었다.
  • 발생할 수 있는 예외 상황에 대해 고민한다.
  • 비즈니스 로직과 UI로직을 분리한다.
    • 3주 차 미션 때는 통계 클래스를 작성했는데 지키지 못했다ㅠㅠ
  • 연관성이 있는 상수는 enum을 활용한다.
  • final 키워드를 사용해 값의 변경을 막는다.
  • 객체의 상태 접근을 제한한다.
  • 객체는 객체스럽게 사용한다
    • 객체지향 프로그래밍 중 제일 단순하면서 제일 중요 한말,,
  • 필드의 수를 줄이기 위해 노력한다.
  • 성공하는 케이스뿐만 아니라 예외 케이스도 테스트한다.
  • 테스트 코드도 코드다.
  • 테스트를 위한 코드는 구현 코드에서 분리되어야 한다.
  • 단위 테스트하기 어려운 코드를 단위 테스트하기
  • private 함수를 테스트하고 싶다면 클래스 분리를 고려한다.

4주 차에서는 이 모든 피드백을 적용하여 구현해보려고 노력할 것이다!

ps. 우테코 지원자분들 모두 4주 차까지 파이팅입니다!

+ Recent posts