onboarding 2주차
test/java/study
를 참고하여 학습test/java/study
를 참고하여 학습ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
solid원칙이든 TDD든 결국 클린코드를 구현하기 위해서는 기능 목록을 작성하며 큰 그림을 완성시키는 것이 좋다고 생각된다. 우선 기능 구현을 완료한 후에 클래스와 메소드, 인터페이스 등을 구상하고 이를 그림으로 나타낸 후에 구현해보자.
내부 클래스와 외부 클래스의 차이점?
Integer.parseInt();
이 메소드는 문자열을 기본형 정수 (primitive type int)로 리턴한다. 문자열이 유효한 숫자를 포함하지 않는다면 NumberFormatException이 쓰로우 된다.
생각보다 TDD방식을 따라하는게 너무 어렵다.
무엇보다 기능 구현 단위를 나누고 그 단위로 커밋하는 습관이 잡혀있지 않아 계속 먼저 구현해버려서 커밋을 나중에 하고 있다. 일단 어쩔 수 없으니 기능구현을 다 한 후에 리펙토링하는 과정에서라도 제대로 다시 해봐야겠다.
공부해보면서 느낀 점들이 역시나 많다. 인터넷으로 구글링을 하면서 정보를 찾는 것도 도움이 되지만 결국 프로그램 자체의 코드를 뜯어보는 것이 정도(正道)인 것 같다. 코수다에서 코치님이 말씀해주신 내용중에 인터넷으로 찾아서 공부하다보면 잘못된 지식을 얻는 경우도 있다고 하셨는데 그런 경우를 몇번 당한 것 같다… 차라리 코드 자체를 교과서라고 생각하고, 영어 울렁증 이겨내고, 하나하나 읽어보는 습관을 들여야 할 것 같다.
처음엔 TDD패턴을 최대한 적용하려고 했다. 하지만 Junit5과 AssertJ에 대한 학습이 너무 늦어지고 각종 학업을 병행하다보니 과제 해결에 너무 급하게 돼서 결국 또다시 문제만 먼저 해결해버리고 말았다. 이번 기회를 통해 테스트 코드에 대한 식견과 실력을 어느 정도 기본기는 닦았으니 다음 과제때는 꼭 TDD 스타일로 해보고자 한다.
역시 쉽지 않았다. 커밋 양식은 어느정도 이해했고 맞춰서 하려고 시도했다. 하지만 단위가 문제였다. 기능 구현 목록을 처음부터 엄청 세밀하게 짜지 못해 구현 목록을 계속 세분화하는 일이 많아졌고, 그러다보니 커밋도 조금씩 복잡해지는 느낌이었다. 무엇보다 초기 설계가 부실하다보니 클린코드를 실천하기도 어려웠다. 초반 설계에 전체 시간의 대부분을 쏟아부어도 좋으니 우선 코드를 머릿속으로 쭉 시뮬레이션해보고 최대한 세밀하게 목록을 작성해야겠다고 생각했다.
숫자 야구 게임이라는 프로젝트를 구현하면서 SOLID 원칙, 객체 지향 등 클린코드를 위한 각종 원칙과 패턴을 적용하려고 노력했다. 그 일환으로 draw.io를 사용하면서 최대한 현재 프로젝트가 어떻게 구성되어 있는지, 기능들은 어떤 식으로 나눠져있는지 정리하면서 나도 모르게 놓치고 있는 코드들은 없는지 하나도 흘리지 않기 위해 노력했다. 그 과정에서 몇가지 수정해야할 내용들이 보여 리펙토링을 수행하였다. 결과적으로 특정 기능에 따라 클래스들을 구분하고 메소드들도 최대한 한 기능만 하도록 하다보니 끊임없이 리펙토링을 하게 되었다. 이 역시 초기 기능 구현 목록을 세분화하지 못해 일어난 일이므로.. 다시 한번 초기 설계의 중요성을 깨닫게 되었다. 무작정 초기 조건만 보고 달려드는 것이 아닌, 문제를 쭉 읽어보며 요구 사항, 조건들을 전부 이해한 다음에 전체적인 풀이 과정을 설계하여 접근해야 하는 것이다. 마치 수학문제를 푸는 것처럼.