웹 백엔드 프리코스 3주차 후기
미션에서 나의 목표
이번 미션의 목표는 여러 개의 클래스를 분리한 후 서로 관계를 맺어 하나의 프로그램을 완성하는 것이다.
나는 2주차 미션의 피드백 중 하나인 "객체에게 메세지를 보내라"가 목표가 밀접한 연관이 있다고 느껴졌다.
따라서 이번에는 객체 지향 설계의 원칙인 SOLID 중, 단일 책임의 원칙을 최대한 지키기 위해 노력해보았다.
이 외에도,,
"비즈니스 로직과 UI로직을 분리하라"는 피드백을 보고 MVC패턴을 도입하였다.
MVC란, Model, View, Controller 세가지로 구분하여 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 사용되는 소프트웨어 디자인 패턴이다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있어, 독립적으로 개발하기 쉽고 로직 재사용이 효과적이다.
- Model: 데이터와 비즈니스 로직 관리
- View: 레이아웃과 화면을 처리
- Controller: 명령을 모델과 뷰 부분으로 라우팅
알고있던 개념이지만 이전에는 개발할 때, 웹 애플리케이션을 만들어야지. 기본구조는 MVC로.... 이렇게 무의식적으로 흘러갔었다. 하지만 3주차까지 점차적으로 늘어난 클래스들로 패키징의 필요성과 MVC 디자인 패턴을 사용하는 것에 타당성을 느낄수 있던 부분이 재미있었다.
최대한 가독성 좋은 코드를 작성하기 위해 노력하였다.
Java가 지원하는 Stream을 최대한 활용하려고 노력하다보니 아래와 같이 코드 자체도 매우 간결해졌으며, (Stream을 알고 있다면) 가독성도 높아졌다.
return Coin.of(Randoms.pickNumberInList(Stream.of(Coin.values())
.map(Coin::getAmount)
.collect(Collectors.toList())));
추가적으로, Effective Java의 9장-일반적인 프로그래밍 원칙을 참조하며 혹시 내 코드중 위배되는 사항은 없나 비교해보았다.
아쉬운 점
- 제출한 이후, 다시 살펴보니 validator에게 값의 검증을 넘긴 점이 아쉬웠다. 클래스가 하나의 책임만을 갖도록 만들었어야했는데 validator가 여러 객체의 상태를 검사하며 책임을 나눠가진 코드가 되어버렸다. 객체를 생성할 때 생성자에서 바로 검증하는게 더 바람직하다는 생각이 뒤늦게 들었다...
- 동전 값 중 랜덤으로 선택할 때, enum타입인 Coin의 값 amount를 알기 위해 결국 getter를 사용했다.... 리스트에 10, 50, 100, 500을 넣고 랜덤으로 돌려 값을 뽑는 방법도 생각해보았지만, 코인 종류가 추가/삭제 되는 경우를 고려하면 하드코딩 영역에 가깝다고 판단해 차라리 getter를 사용하였다. 차라리 Coin이 가진 값의 종류를 리스트로 만들어서 반환하는 메소드를 하나 만들껄.. 이라는 생각이 또 뒤늦게 들었다....
- 상수 타입을 enum으로 처리하지 못한 점도 아쉽다...
어떻게 학습하였는가
2주차까지는 아래와 같은 3가지 정도가 나의 목표였다.
- 주어진 요구사항을 모두 충족시키기
- 꾸준하게 예외처리 생각해내기
- 피드백을 모두 지키기
그런데 3주차를 수행하기 전에는, 이전 미션의 다른 참가자들의 PR을 열어보며 문득 "응..? 나 혹시 대학 과제처럼 시키는 대로만 하는중은 아닐까...?"라는 느낌을 받았다. 이전에도 몇번 참가자들의 코드를 구경하고 싶었지만(이전 기수껀 못참고 열어보았다) 다른 사람의 작업을 훔쳐보는 죄책감이 들어 커밋정도만 구경하였다. 하지만 PR은 누구에게나 열려있고 메일에서도 다른 참가자의 학습과정에서 배울 수 있다는 점을 언급하고 있어 아주 사정없이(?!) 다른 사람들의 작업물을 보며 "미션"이라는 틀안에 갇혀 있던 내 자신을 반성할 수 있었다 👀 👀 👀
따라서 이번에는 단순히 요구사항만 지키려고 노력한 참가자가 아닌, 미션을 통해 성장한 참가자가 되기 위해 이번에라도 나만의 목표를 설정하고 이에 도달하기 위해 노력해보았다. 결과적으로, 미션의 난이도도 높은만큼 훨씬 더 고통스러웠지만 얻은 것은 더 많았다. 계속해서 찝찝한(?) 코드에 대해 개선 방안을 검색하다 보니 일급 컬렉션, 커스텀 객체의 비교 등 새롭고 다양한 키워드를 찾아내고 이에 대해 공부할 수 있었다.
얼마나 성장하였는가
프리코스는 어느정도 프로그래밍을 할 수 있다고 생각하던 나에게
"음.. 이렇게 기능 구현할 수 있다는건 알겠는데... 이것도 지키면서 구현해볼 수 있어?"
이렇게 끊임없이 질문하며 기본기를 짚어준 느낌이였다.
MVC 패턴, 객체지향의 원칙, 클래스 분리, 메소드 분리, 코딩 컨벤션 등의 필요성을 지난 3주를 통해 체감할 수 있었으며, 이제 이정도의 기본기는 지키면서 프로그래밍 할 필요가 있다고 생각하게 되었다. 그리고 그렇지 못한 나의 오래된 코드들도 떠올랐다....
이전에는 기능을 구현하는 것에 초점을 맞췄고 그러한 로직을 만들어내는게 더 재미있어 다른 부분은 크게 신경쓰지 못했다. 프리코스 과정에서는 예외처리를 생각해내는 것도 나름 알고리즘의 히든 케이스를 찾아내는 것처럼 재미있게 느껴졌으며 무엇보다도 코드 리팩토링의 재미를 찾을 수 있었다. 15줄이 넘는 로직을 여러개의 메소드로 나눴을 때 or Stream을 활용해서 클~린해진 쾌감..은 오바를 조금만 더 보태서 사이다가 따로 없다^___^
아무래도 좋은 책이나 글을 읽고 적용하는 것이 아닌, 미션을 수행하면서 직접 체감하고 적용한 경험을 통해 지속적으로 "좋은 코드"를 작성하는 것을 추구할 것이다. 마음같아선 그렇지 못한 나의 과거의 코드를 모두 수정하고 싶다!!!
우테코 프리코스 과정도 좋았으며 비록 PR이지만 다른 참가자들의 열정도 엿볼수 있어서 매우 즐거웠다.
온라인으로만 진행하는데 다른 참가자들에게 이정도로 큰 동기부여를 받을 수 있다는 점도 놀라웠다.
이렇게 3주차 과제를 제출한 뒤, 시험을 위해 3주차 과제를 중심으로 공부하고 있었는데...
최종 시험에는 완전히 새로운 문제가 나왔고...
특히 마지막 커밋으로 원래 돌아가는 기능도 잘못 리팩토링했다는 것을 깨닫고 좌절 TIME,,,
을 이겨내고 일단 3주차 후기를 마무리해보았다... :)