상세 컨텐츠

본문 제목

[우아한 테크코스] 프리코스 후기

우아한 테크코스

by seungpang 2021. 12. 14. 21:18

본문

반응형

지원 동기

개발자로 성장하려면 평생 공부하는데 늘 의문이 따라왔습니다.
무엇이 더 나은 코드인지 내가 무엇을 모르고 무엇을 아는지도 잘 모르는 게 너무 답답했습니다.

위의 그림처럼 몰라서 그냥 가만히 있는 것이 아닌 주체적으로 해결하고 싶은 욕구가 있었습니다.

때마침 우아한 테크코스에 지원 글을 보게 되었고 여기라면 이 의문을 같이 해결해 나갈 동료 개발자들과
코치분들이 있으니까 해답을 얻을 수 있지 않을까 싶어서 지원하게 되었습니다.


프리코스 시작

프리코스는 3주로 진행되며 각 주차별 미션이 있고 마지막 최종 테스트가 있는 방식이다. 매주 공통 피드백이 있고 정해진 규칙들을 지켜나가면서 내가 어제보다 성장했구나를 느낄 수 있는 경험이었습니다.

 

프리코스 시작과 끝은 '왜?'였습니다. 어떠한 고민이 있었고 무엇을 느꼈는지 써보려고 합니다.


1주차

1주차 미션은 숫자 야구 게임 미션이었습니다.

1주차에는 최대한 함수를 분리하는 것이 목표였습니다.

 

막상 처음 미션을 시작하려고 했을 때 뭐부터 해야 할지 몰랐습니다. 그래서 주어진 요구 사항에 대해 충실하자고 생각 했고 기능 목록을 작성한 후 상수 처리와 예외 처리에 신경을 쓰면서 시작했습니다. 

 

클래스 이름도 Referee 실제 심판이 볼카운트를 계산하듯이 Referee라는 클래스가 볼카운트를 계산하는 책임을 가지게하고 최대한 클래스 이름도 의미있게 지으려고 노력했습니다.

 

1주차 과제는 간단한 과제라고 했지만 의외로 생각할게 너무 많았습니다. 원시값 포장, 주어진 규칙과 코드 컨벤션에 익숙해지는게 여간 쉽지 않았고 이 때 이전 기수 미션들과 다르게 TestCode가 추가되었고 그것을 통과하는게 주어진 요구 사항이여서 나름대로 missionutils를 뜯어보면서 공부했습니다.


2주차

2주차 미션은 자동차 경주 미션이었습니다.

2주차에는 최대한 클래스를 분리하는 것이 목표였습니다.

 

어떤 방식으로 해야 효율적으로 클래스를 분리할 수 있을까? 라는 의문이 들었고 '객체 지향의 사실과 오해', '오브젝트' 책을 읽고 자료조사를 하면서 목표를 설정하였습니다.

 

  • 행동을 먼저 결정하자
  • 협력 속에서 책임을 결정하자
  • 원시 값을 최대한 포장하자
  • 일급 컬렉션을 사용하자
  • 자율적인 객체를 만들기 위해 노력하자

행동을 먼저 결정하는 것은 기능 목록을 작성하는 것으로 해결되었습니다. 기능 목록들을 작성 하니 어떤 객체가 어느 객체에 대하여 메시지를 전달하면 되겠다라는 생각이 들었고 그 메시지를 통하여 책임을 설정하였습니다.

기능 목록은 여기를 통해 확인 할 수 있습니다.

 

그리고 모든 원시 값을 최대한 포장하려고 Car의 name, position과 시도 횟수를 Round로 포장 했습니다. 그럼으로써 각각 CarName, Position, Round의 대한 책임을 위임 할 수 있었고 객체들의 상태를 보장할 수 있었습니다. 그러나 원시값 포장에 너무 신경을 쓴 나머지 Car클래스의 기본 생성자를 추가 할 수 없다는 프로그래밍 요구 사항을 위반해버렸습니다... ㅠㅠ

잘못되었다는 것을 알았을때는 이미 제출 시간을 넘기고 나서라 다음부터는 실수 하지 말자는 생각을 했습니다.

 

그리고 추가적으로 학습한 내용은 일급컬렉션인데 일급 컬렉션은

일급컬렉션 - Collection을 Wrapping하면서,그 외 다른 멤버 변수가 없는 상태이고 장점으로는 아래와 같이 있습니다.

 

  • 비지니스에 종속적인 자료구조
  • Collection의 불변성을 보장
  • 상태와 행위를 한 곳에서 관리
  • 이름이 있는 컬렉션

따라서 저는 Car객체들을 각 Round마다 move라는 행위를 수행해야 하고 우승자도 찾아야 하는데 그걸 해결해주는게 바로 일급컬렉 Cars를 생성하여 상태와 행위를 한 곳에서 관리 해줄수 있었습니다.


3주차

3주차 미션은 자판기 미션이었습니다.

3주 차 미션의 목표는 여러 개의 클래스를 분리한 후 서로 관계를 맺어 하나의 프로그램을 완성하는 경험을 하는 것, 그리고 2주 차 미션보다 더 극단적인 연습을 해보는 것입니다.

 

여러 기능들의 메시지를 정하고 그 메세지를 책임 할 클래스들을 정해 나가는데 3번째라서 어느 정도 나누는 것에 익숙해졌습니다.

그러나 고민도 늘어났습니다. 원시 값을 어느정도로 포장할 것인가가 고민이였습니다. 2주차 미션때 Car의 원시값을 다 포장하다가

프로그래밍 요구사항을 지키지 못한 실수를 해서 이번에는 더 많은 생각을 했습니다.

 

원시값을 포장한다는 게 의미 있는 객체로 포장하고 그 객체의 유효성 검사의 책임을 위임할 수 있습니다. 그런데 이번 미션을 하면서 상품 수량, 상품 가격, 자판기의 현재 금액을 다 포장하기에는 유효성 검사의 중복이 강하다는 것을 지울 수 없어서 숫자인지 아닌지 판단하는 Util 클래스를 하나 만들어서 재사용성을 높이고 원시 값은 자판기의 현재 금액만 포장했습니다. 3주 전의 저 자신이었다면 이런 고민조차 하지 않았을 텐데 이런 걸 보면서 많이 놀랐습니다.

 

이번 미션에서 추가적으로 신경 쓴 것은

 

  • 람다, 스트림을 최대한 사용하자
  • 예외 더!!! 처리를 꼼꼼히 하자

2주 차 미션 때 람다와 스트림을 사용했는데 그때는 익숙하지 않아서 쓰는 경우도 있고 안 쓰는 경우가 있었지만 이번 미션만큼은 모든 경우에 람다와 스트림을 사용할 수 있도록 노력했습니다. 미션을 진행하면서 함수는 15라인을 넘지 말아야 하고 indent와 depth의 제한을 피하기 위해서라도 람다와 스트림은 선택이 아닌 필수라고 생각하고 연습했습니다. 확실하게 코드도 간결해지고 가독성이 좋아지는 게 느껴졌습니다.


마치며

개발자라는 직업은 평생 공부하는 직업인데 이번 프리코스를 계기로 동기부여가 있는 의식 있는 연습이 얼마나 중요한지를 깨달았습니다. 공통 피드백을 보면서 미처 깨닫지 못한 부분을 개선해 나가고 어떤 코드가 좋은 코드 일지 3주간 지속적으로 생각했습니다. 하지만 아쉬운 점도 있습니다. 공통 피드백만 받다 보니 내가 잘 설계하고 코딩한 것인지 이게 맞는 것인가?라는 의문이 들기도 했습니다. 확실한 건 이 3주의 시간이 최고의 시간이었다는 건 변함이 없습니다.

프리코스 미션을 진행해 나가면서 클린 코드, 객체지향의 사실과 오해, 오브젝트, 모던 자바 인 액션 등등 여러 책들을 읽어 나가면서 클린코드, 리팩토링, 람다와 스트림을 학습하며 많이 배우고 성장할 수 있는 시간이었습니다.