저는 지난 한 주 동안 아래와 같은 것들을 배우고 느꼈습니다.
이번 주차 추가돤 요구 사항에 "도메인 로직에 단위 테스트를 구현해야한다"라는 요구사항이 있는 것을 발견했습니다.
부가적인 설명으로는 핵심 로직을 구현하는 코드와 UI를 담당하는 코드를 분리하는 것이라고 작성되어있어서
제가 기존에 작성하던 MVC 패턴을 적용하던 것에 Model에 해당 하는 부분이 이번 주차 요구사항에 적혀진 도메인에 해당하는 부분임을 깨달았습니다.
따라서 model로 알고 있던 부분과 도메인에 대한 차이를 공부해보며 어떻게 다른 것인지에 대해 알게 되었습니다. 그러다가 도메인의 깊은 이해를 바탕으로 만들어진 도메인 모델을 중심으로 개발하는 방법인 DDD 방법을 알게 되었습니다. DDD 구현 방법에 대해 자세하게 설명해준 글을 읽다가 이 방법은 객체 지향을 먼저 잘 이해해야 활용할 수 있을 것 같아 객체 지향 공부에 대해 필요성을 느꼈습니다.
여기서 객체 지향?을 생각하다가 지난 주차 공통 피드백에 "JavaScript에서 객체를 만드는 다양한 방법을 이해하고 사용한다." 이 피드백을 떠올렸습니다. 객체 지향에서의 핵심은 결국 무언가를 만드는 주체인 객체이기에 "아 이래서 이번주차에 추가 요구사항이 이렇구나!" 라고 깨닫게 되었습니다.
따라서 이번 주 기능 구현을 본격적으로 시작하기 전에 객체와 클래스, 객체지향 문법에 대해 다시 한번 복습을 진행하고 나서 구현을 시작하게 되었습니다.
지난 주 미션에서 TDD 방식을 학습해오기 시작하면서 미션을 구현하는 과정에서 도입해보려 노력했지만 아직 구현이 어렵고 어떻게 작성해야할까 고민이 2주내내 많았습니다. 지난 주에는 한 가지 작은 기능에 대해서만 TDD 방식을 구현에 성공하였는데 이번주에는 더 많은 기능을 TDD방식으로 구현하고자 다짐했었습니다.
하지만 이번 주차 미션에서도 도입이 쉽지 않았습니다. 이번주차 미션은 미션 공개일 3일 뒤부터 본격적으로 구현하기 시작했었는데 이는 공개 후 3일 동안 작은 단위의 테스트 케이스를 작성해보려고 노력했지만 본 기능을 구현하기에는 정말 부족한 테스트 케이스를 구현해 이번 주차에서도 TDD 방식으로 구현에 실패하였습니다.
이번 미션에서 제가 TDD를 구현하기 위해 노력해온 방식을 예를 들어 설명해보겠습니다. 이번 주차의 미션 중 하나였던 사용자가 입력한 구매 가격에 대한 유효성 검사를 진행하는 기능에 대한 테스트 코드를 먼저 작성하려고 시도했습니다. 테스트 케이스를 먼저 작성하는 과정에서 정말 도움이 많이 되었던 것은 다양한 예외의 상황을 먼저 생각해 볼 수 있어서 구현이 효율적으로 진행된다는 것입니다. 따라서 여러 가지 구매 가격에 대한 예외 처리 상황을 정리할 수 있었고 이를 테스트 케이스로 작성해볼 수 있었습니다.
하지만, 테스트 케이스를 작성하면서 사용하는 문법이나 구현 방식(로직)에 대해 많은 부족함을 느꼈습니다. 어떤 것을 구현할 지는 알지만 테스트가 제대로 돌아가도록 먼저 작성하는 것에 대해 어려움이 많았던 것 같습니다. 따라서 1차적으로 테스트 케이스를 작성하면, 본 기능을 구현하고 다시 테스트를 실행했을 때 테스트 케이스를 다시 수정하는 일이 계속해서 발생했습니다. 한 기능에 대해 하루를 테스트 케이스 작성 및 수정하는데 쏟아 이번 주차 미션을 완성하지 못할 것 같아 우선 기능 구현을 먼저 시작했습니다.
계속해서 이번주차에도 실패하여 아쉬움이 남았습니다. 어떻게 하면 테스트 코드 방식을 잘 작성할 수 있을까 고민이 많았습니다. 그러다 이번주차에 2-3일을 먼저 tdd로 구현하기 위해서 노력해본 결과 지난주차에서도 이번주에서도 결국 작성 패턴이 비슷하고 이 패턴을 반복해서 학습하다보면 동일한 코드 패턴으로 작성해볼 수 있겠다는 사실을 깨달았습니다. 따라서 지난주차 부터 도입해온 한 기능을 구현하면, 구현한 기능에 대한 테스트 코드를 작성하는 방식을 지속적으로 진행하기로 결심했습니다.
이번 주차에 모든 기능을 하나씩 구현하면서 구현이 되면 바로 테스트 케이스를 작성해 확인해보았습니다. 그러다 비슷한 패턴으로 작성되는 코드들을 파악할 수 있었고 테스트 코드가 이제 프리코스를 진행하면서 익숙해지게 되었습니다.
지난 주차에 반드시 tdd방식을 도입해 구현하고자 했던 열정이 테스트 케이스 코드에 대한 깊은 고찰을 할 수 있게 해준 원동력이 되었습니다. 저는 남은 마지막 주차에도 반드시 도입하겠다는 욕심을 버리고 2주간 몰입했던 경험을 토대로 더 나은 테스트 코드를 작성할 수 있도록 많이 노력할 것 입니다.
지난 2주 간 MVC 패턴을 도입하면서 구현해왔었는데 이번 주차에는 새로운 싱글톤 패턴이라는 개념을 학습하게 되었습니다.
이번주에는 객체 지향을 생각하며 공부했기 때문에 객체의 인스턴스가 오직 1개만 생성되는 패턴인 싱글톤 패턴에 대해 알게 되었습니다. 싱글톤 패턴을 공부하면서 인스턴스를 1개만 가져가면 좋은 점이 뭔지 궁금해 찾아보니 메모리 낭비를 방지하고, 다른 클래스 간의 데이터 공유가 쉽다는 이점이 있다는 것을 파악했습니다.
따라서 이번 주차 미션에서 싱글톤 패턴을 도입해보기로 하였습니다. 유효성 검사를 진행하는 클래스들에 도입하여 각각의 클래스가 상태를 가질 수 있도록 구현해보았습니다. 이러한 과정을 통해 싱글톤 패턴으로 구현하는 것에 대한 감을 익히게 되었던 좋은 학습 경험이었습니다.
싱글톤 패턴에 대해 더 공부해보니 내부 상태를 변경하기 어렵다는 단점도 가지고 있지만 효율적인 측면에서는 충분히 도움이 많이 되는 디자인 패턴이기에 앞으로 적절히 사용할 수 있도록 고민해보아야겠다는 목표가 생겼습니다.
저는 Model, Controller, View로 분리해 2주간 구현을 진행했었습니다. 처음으로 구현해본 지난 주차에는 로직을 분리하는데 고민이 많아 최대한 많이 잘게 나누려고 했었습니다. 하지만 이번 주차에서는 유효성 검사 부분 / Domain 부분 / 사용자의 입출력을 담당하는 UI부분 / 게임을 제어하는 컨트롤러로 나누어 타인이 제 프로젝트 코드를 확인해도 명확히 하는 일이 구분 되도록 분리하고자 노력했습니다. 적절히 로직을 분리하고, 가독성이 좋고, 유지보수를 원활하게 하기 위한 코드를 구현하고자 2주 간 연습한 노력이 많이 보이는 것 같았습니다.
지난 주차 까지는 사용자가 잘못된 값을 입력했을 때 에러를 던지고 애플리케이션을 종료하였던 로직으로 출제되었었습니다. 하지만 이번주차의 요구사항을 살펴보니 "사용자가 잘못된 값을 입력하면 에러메세지를 출력하고 해당 부분부터 다시 입력을 받는다"는 새로운 요구사항이 추가된 것을 확인했습니다. 따라서 해당 부분을 try-catch 구문으로 에러를 처리하는 로직을 구현해 사용자에게 다시 입력받을 수 있도록 구현하였습니다.
처음에는 다시 입력 받도록 요구된 기능 사항에 대해 제시된 테스트 코드에는 잘 되는지 파악할 수 없어서 따로 입력받는 부분에 대한 테스트 코드를 작성해보고자 노력하며 해당 기능을 구현해보려했습니다.
지난 주 미션에 대한 소감을 작성하면서 기능을 구현하는 과정에서 자주 해당 스타일 문법을 적용해야겠다고 반성했었습니다. 하지만 이번 주에 구현하는 과정에 생각해보니 해당 스타일을 자주 적용하더라도 계속해서 추가되는 코드로 인해서 자주 적용해도 적은 효과를 발생시킨다는 것을 알게 되었습니다. 따라서 이번 주차에는 전반적인 코드 구현이 다 끝난 후 마무리 단계에서 해당 스타일을 적용시키기로 하였습니다.
앞으로 협업하는 과정에서도 이를 어떻게 도입할까 고민해보았는데 Pull Request를 보내기 직전에 스타일을 적용하면서 협업하면 효율적 일 것 같다고 생각하게 되었습니다. 다른 사람들은 어떻게 생각하는지 미션이 마무리되면 커뮤니티를 통해 의견을 공유하고 싶다고 생각했습니다.
기능을 본격적으로 구현하기 전에 작성한 기능 구현 목록을 지속적으로 꾸준히 업데이트를 진행하면서 이번주차 미션을 진행했어야 하는데 미션 초반 3일을 TDD 방식에 몰입하다보니 마음이 급해졌던 것 같아 기능 구현 목록을 계속적으로 검토하지 않고 꾸준히 업데이트를 하지 못한 것에 아쉬움이 남았습니다. 첫 번째로 작성한 기능 목록과 최종적으로 작성한 기능 목록에 수정된 내용들을 꾸준히 구현하는 과정에서 업데이트를 진행했었다면 더 좋았을 학습 기록이었을 것 같았습니다.
다음 미션에서는 조급해하지말고 하나씩 천천히 기능을 구현해나가고 리팩토링하는 과정에서 기능을 추가하면 기능 목록을 꾸준히 업데이트 할 수 있도록 신경쓰면서 진행해보도록 노력할 것입니다.