처음에 접근했던 방식은 알고리즘 문제를 해결하듯이, 구현 기능 목록은 큰 기능들 위주로 간단하게 적고 무작정 결과만 나오게 해결하려고 했습니다.
리팩토링을 진행해 보려 했지만 이미 코드들이 서로 엉켜있어서 내가 작성한 코드의 의미를 내가 알아보지 못하는 경우가 발생했고 잘못된 방향으로 코딩을 진행했다는 것을 알게 되었습니다. 잘해보고자 했던 마음이 크고 급해져서 이러한 상황이 생긴 거 같았습니다. 문제를 해결한다는 방식이 아닌 코딩하는 방법을 배운다는 생각으로 요구사항 분석 및 구현 기능 목록 작성 부분으로 다시 시작하였습니다. 조금이라도 막혔던 부분은 바로 찾아보고 공부하면서 진행했습니다.
항상 정답만을 보고 해결하는 것에만 급급했던 저는 설계하는 부분에 대해서는 어색했습니다.
이전 우테코 선배님들은 이 부분을 어떻게 작성하였는지 알아보았고 이 방식을 토대로 저만의 규칙을 세웠습니다.
1. 요구사항과 문제의 실행 결과 예시를 확인한 뒤에, 프로그램에 필요한 큰 기능들을 항목화
2. 그 밑으로 위에 기능들을 완성하기 위해서는 어떤 작은 기능들이 필요한지를 항목화
3. 명확하게 구현 방식이 정해질 때까지 2번 과정 반복
이전처럼 머릿속으로 생각해서 목록을 작성할 때보다 이러한 규칙을 바탕으로 작성했을 때가 더 깔끔하게 정리해고 기능들이 명확해졌습니다.
작성한 구현 기능 목록을 따라서 코딩을 작성하던 중 이전과는 다르게 보기 쉽고 깔끔하게 적어봐야겠다고 생각했습니다. 하지만 방법을 모르고 헤매던 저는 프리코스 커뮤니티의 함께-나누기 채널에서 클린 코드에 대한 정보를 얻을 수 있었습니다. 덕분에 저는 들여쓰기 규칙, 메서드가 한 가지 일만 담당하는지 등등의 클린 코드 규칙을 알게 되었고 이 규칙을 맞춰보면서 코드를 작성하였습니다. 규칙들에 맞춰서 작성하는 것이 처음이었기에 힘들었지만, 작성된 코드를 되돌아보았을 때 코드만 보고 해당 부분이 어떤 기능을 담당하는지 쉽게 알 수 있는 것을 확인했고 이것이 가독성을 높이는 부분이라는 것을 알게 되었습니다.
특히 클린 코드 규칙 중에서 ‘메서드가 한 가지 일만 담당하도록 구현했는가?’ 이 부분을 지키기 위해 메서드를 작은 단위로 자르다 보니 자연스럽게 구현 기능 목록과 맞아떨어지게 구현할 수 있었습니다.
또한, 작은 단위의 공통적인 메서드를 갖고 있을 수 있다는 것을 발견했고 이를 ‘Util’ 클래스로 만들어서 관리했습니다. 1주 차를 진행하면서 많은 과정이 저의 성장을 도와주었지만, 특히 이 과정이 1주 차를 진행하면서 가장 의미 있던 과정이었습니다. 사소한 점이겠지만 이 사실을 알았을 때 나 자신이 너무나 대견했고 개발에 대한 더 깊은 흥미를 갖게 해주는 발견이었습니다.
많은 정보를 학습할 수 있는 커뮤니티를 열어주셔서 감사합니다!
조금 더 가독성을 높일 방법은 없는지, 클린 코드 규칙은 제대로 지켜졌는지, 기능에 맞게 네이밍이 잘 이루어졌는지, 또 다른 객체들을 설계할 수 있지는 않은지, 놓친 부분은 없는지 고민하였고 프로그램을 완성하는 시간보다 훨씬 더 많은 시간을 리팩토링하는 데에 사용했습니다. 하루도 빠짐없이 리팩토링하는 방법에 대해서 학습했지만 지금 작성된 코드가 옳은 코드인지에 대한 답이 없었기에 ‘정답이 없는 문제’라고, 생각했습니다. 결국 계속해서 더 나은 방법을 알기 위해 학습을 반복해야 했고 코딩하지 않을 때도 리팩토링할 방법에 대해 생각하게 되었고 빨리 리뷰하는 시간이 와서 많은 분의 의견 또한 듣고 싶어졌습니다. 또한, 이 프리코스 과정이 끝나고 성장하였을 때 진행했던 문제들에 대해서도 다시 한번 리팩토링해 보고 싶어졌습니다.
이러한 과정이 ‘정답이 없는 문제’가 가져다주는 효과적인 학습 방식이자 매력이라고 생각했습니다.
이번 1주 차를 진행하면서 가장 많은 시간을 투자했던 부분입니다. 각각의 객체들에게 어떤 속성들을 쥐여줄 것인지, 세부적인 기능들이 어디 클래스에 지정되어야 하는지, 또 클래스는 어떤 패키지에 속해야 하는지가 고민이었습니다. 세부적인 기능들은 구현되었지만, 이 기능들이 어디 클래스에 위치해야 하고 어떻게 실행되어야 할지를 정하지 못해서 계속 코드를 수정하고 원래 대로로 돌리는 것을 반복했습니다. 많은 시간을 사용했지만 개선되지 않는 코드를 보는 것이 가장 힘들었던 시간이었습니다. 하지만 이 시간 또한 하나의 학습이자 성장하는 과정이라고 생각했습니다. ‘생활 코딩’ 유튜브의 객체 지향 프로그래밍이라는 영상을 보면서 객체 지향 프로그래밍에 대해서 다시 한번 공부하면서 리팩토링을 반복하다가 이전에 ‘김영한’님의 ‘스프링 핵심 원리’라는 강의를 들으면서 따라 했던 구조가 생각이 났고 우선 이 구조를 이용하자고 생각했습니다. controller, service, domain 패키지를 사용해서 배치했고 기능들은 domain->service->controller 순으로 사용되게 구현하였습니다. 이전보다는 객체화되었지만, 아직 부족함을 느꼈기에 2주 차 때 이 부분에 대해서 더 학습에서 적용해 보겠습니다.
이렇게 클래스만 만들어 놓고 진행하던중 가독성과 프로그램의 구조를 더 확실하게 나타낼 수 있는 패키지 구조가 필요하다고 생각했고 이전에 Spring 공부할때 접했던 mvc 라는 패턴에 대해서 위에 첨부한 블로그를 중점으로 작성해보았습니다.
이 분의 회고록이 저한테 가장 큰 도움이 되었기에 저도 회고록을 작성해보았습니다!