이 험난한 세상에서어어~

[우아한 테크 코스 프리코스] 4주간의 프리코스를 마치며... 전체 회고 본문

회고

[우아한 테크 코스 프리코스] 4주간의 프리코스를 마치며... 전체 회고

토끼띠NJW 2023. 11. 22. 22:27
우아한 테크 코스의 프리코스를 통해 나의 잘못된 코딩 버릇을 고칠 수 있었으며 Service의 존재 이유나 객체 지향을 직접 내 코드를 통해 이해할 수 있는 기회를 얻었다.

회고를 작성하는 이유

사실 최근에 좀 바빴다. 우아한 테크 코스 프리코스를 진행할 때는 시험과 프리코스 때문에 바빴고 현재는 시험과(...) 자소서, 과제 등등으로 정신이 없다. 그래도 프리코스에 참여하면서 배운 것들과 느낀 감정들을 정리하고 싶어서 회고를 작성하게 됐다.

 

1. 우테코에 참석하게 된 계기

사실 우테코는 작년 3월부터 알고 있었다. 당시에는 코로나로 혼란스러웠던 2학년, 3학년 생활을 마치고 이 상태로 4학년으로 올라가면 안 된다고 생각해 휴학을 했다. 여전히 개발자라는 진로에 확신이 없던 상황에서 java를 공부하기 시작하면서(나는 전공 수업 내내 C와 C++을 다뤘다) 개발과 관련된 교육을 찾다가 발견한 것이었다.

 

22년 우테코가 열렸을 때는 완성된 사람들이 가는 곳이라고 생각해서 지원하지 않았다. 하지만, 이번에는 여전히 부족한 실력임에도 한 번 해보자는 마음으로 지원을 했다. 23년 우테코 프리코스에서 배운 게 많아서 22년에도 지원을 했으면 좋았을 거라고 생각한다. 그러니까 개발에 관심이 있다면 우테코에 망설이지 말고 지원해볼 것을 추천한다.

2. 각 주차별 회고

간단 요약

1, 2주차는 문제 자체는 쉽다고 생각해서 놓친 부분이 많아 아쉽다. 그래도 프로그램은 구현만 되면 끝나는 게 아니라 커밋이나 의존성 등 유지보수를 언제나 함께 생각해야 한다는 점을 배웠다. 특히 커밋 부분에서 내가 지금까지 잘못된 커밋을 하고 있다는 걸 알게 됐다.

 

3주차부터는 본격적으로 어려워진 문제 때문에 시간을 굉장히 많이 사용했다. 특히 1, 2주차에서 아쉬웠던 부분을 보완하려고 노력을 많이 했는데 여전히 MVC 패턴의 활용이나 의존성과 같은 부분에서 부족한 점이 많이 나타났다. 

 

4주차는 정말... 어려웠다. 자신감도 떨어졌고 시험까지 겹쳐서 정신적으로 힘들기도 했다. 그럼에도 불구하고 계속해서 리펙토링을 진행했으며 결국에는 MVC 패턴과 Service의 존재 이유에 대해 이해하게 됐다. 또한 의존성을 낮추는 방법에 대해서도 이해했으며 추상 클래스나 상속 등 객체지향의 특징을 활용하는 미션이 됐다.

각 주차별로 간단한 회고를 작성했는데, 핵심만 읽고 싶다면 4주차를 추천한다.

1주차

솔직히 문제 자체는 쉽다고 생각했다. 그래서 깊게 고민하지 않고 풀었으며 프로그램의 구조나 클래스와 메소드가 하나의 기능을 담고있는지 등 객체지향적인 부분에 대해서도 크게 생각하지 않았다. 

 

게다가 Readme에 기능 정리를 해달라는 요구 사항을 클래스 별로 잘못 이해해 전혀 엉뚱한 것을 적어 냈다. 1주차를 풀 때는 제대로 기능하는 것에만 신경을 썼지 다른 요소들은 전혀 생각하지 않았다는 점이 많이 아쉽다.

https://github.com/Jiwonna52/java-baseball-6/tree/Jiwonna52

 

GitHub - Jiwonna52/java-baseball-6

Contribute to Jiwonna52/java-baseball-6 development by creating an account on GitHub.

github.com

2주차

1주차에서 신경쓰지 않았던 부분을 조금씩 고려하기 시작했다. 솔직히 2주차 초반에는 단순 구현에만 신경썼지만, 디스코드에 올라오는 다른 참가자들의 코드나 회고 글을 읽으면서 내가 지금 잘못된 방향으로 가고 있다는 걸을 알게 됐다. 그렇기에 2주차에서는 리팩토링이란 것을 생각하기 시작했으며 기능이 변경될 때마다 커밋하고 커밋 메시지 또한 컨벤션을 따르기 위해 노력했다.

 

이러한 과정에서 나의 잘못된 커밋 버릇을 알게 됐다. 과거의 나는 여러 기능을 고치고 그것들을 전부 하나의 커밋으로 깃허브 저장소에 올렸다. 게다가 커밋 메시지의 일관성도 없었다. 하지만, 2주차를 통해 올바른 커밋 방식을 알게 됐으며 이를 내 개인 프로젝트에 적용해서 진행할 예정이다.

 

또한 구현에 MVC 패턴을 적용해봤다. 이때까지만 해도 MVC 패턴의 존재 이유를 정확히 이해하지 못했지만, 4주차를 마치면서 왜 MVC 패턴이 탄생했고 의존성을 낮추는 것은 어떻게 해야 하는지 코드를 통해 알게 됐다.

https://github.com/Jiwonna52/java-racingcar-6/tree/Jiwonna52

 

GitHub - Jiwonna52/java-racingcar-6

Contribute to Jiwonna52/java-racingcar-6 development by creating an account on GitHub.

github.com

 

3주차

이때부터 점점 미션 구현 난이도가 올라가기 시작했다. 게다가 에러 메시지를 출력한 후 다시 에러가 발생한 지점으로 돌아가 입력을 진행하라니? 이런 건 해본 적이 없어서 조건을 읽고 당황했다(솔직히 가능할 거라고 생각하지도 못했다). 그래도 인터넷과 책을 참고해서 조건을 만족하기 위해 노력했고 결국에는 성공했다.

 

또한, 3주차에서는 커밋 주기나 메시지, 하나의 클래스와 메소드에는 하나의 기능만 포함과 같은 1, 2주차에 부족했던 부분을 최대한 신경쓰면서 미션을 진행했다. 그러다 보니 자연스럽게 클래스의 수와 커밋 수가 증가했다. 심지어 커밋은 149회나 되어서 지금 봐도 놀라울 정도다.

 

이번에도 MVC 패턴을 적용했는데, Model은 데이터를 담는 역할만 해야 한다는 편견 때문에 Model 클래스에는 아무 메소드도 적지 않았다. 하지만, 이 부분은 4주차 공통 피드백을 받고 고치게 된다. 그뿐만 아니라 여전히 MVC 패턴을 완전히 이해하지 못한 상태로 미션을 진행했기에 '애플리케이션의 수정 및 관리 용이'라는 MVC 패턴의 목적을 배반한 채 그저 겉핥기 식으로 따라하고만 있었다. 놀랍게도 위의 부분은 4주차를 진행하면서 자연스럽게 어느정도 고치게 된다.

https://github.com/Jiwonna52/java-lotto-6/tree/Jiwonna52

 

GitHub - Jiwonna52/java-lotto-6

Contribute to Jiwonna52/java-lotto-6 development by creating an account on GitHub.

github.com

4주차

문제 조건부터 쉽지 않았다. 문제를 읽는 동안 내가 이걸 할 수 있을까 생각이 들었고 심지어 시험까지 겹쳐서 더 힘들었다. 그래도 3주차까지 완성했으니 끝까지 해보자는 마음 가짐으로 임했고 덕분에 많은 것들을 얻을 수 있었다.

 

제일 먼저 신경쓴 건 클래스와 메소드가 하나의 기능만 담게하는 것이었다. 이렇게 하다보니 클래스와 패키지 수가 자연스럽게 늘어나게 됐고 전체적인 흐름을 조절하는 Play 클래스에 너무 많은 의존성이 추가됐다. 결국 코드가 길어지고 복잡해지면서 최대한 기능을 나누려고 한 의도가 무시 된 것이다.

 

이 문제를 어떻게 해결할까 고민을 하다가 얻은 결론은 Play와 다른 클래스 사이에 정거장 같은 것을 만들어주자는 것이었다.

 

즉, 혜택 기능을 예로 들면 하나의 클래스에 혜택을 구분하는 기능들이 들어 있고 이것들을 Play에서 적절한 로직으로 처리해주는 것이었다. 하지만, 변경된 구조에서는 둘 사이에 클래스를 하나 더 둬서 새 클레스에 기능 클래스의 메소드를 활용해 처리를 해주는 것이다. 이렇게 하면 Play는 단순히 새로운 클래스 하나를 꺼내서 처리하면 된다.

 

그림으로 그려보면 아래와 같다.

 

아래처럼 만들어 주니, 각 클래스 별로 정체성이 확실해졌고 의존성도 확실하게 줄어들었다.

 

그러다가 문득 든 생각.

 

기능 모음 클래스와 기능 활용한 로직 클래스... 이거 Service와 Controller아닌가?

그렇다. 나도 모르게 Service와 Controller를 분리한 것이다. 월요일 밤이었나. 그전까지는 다른 사람들의 코드를 봐도 왜 Service가 있고 Controller있는지 진정으로 이해하기 어려웠는데, 직접 코드를 짜고 하나의 프로그램을 만들면서 번개가 치듯 이해했다. 역시 실전이 좋다.

 

이렇게 되니 MVC 패턴 또한 자연스럽게 존재 이유를 알게 됐고 유지 보수가 용이하게 만들어야 한다는 것 또한 이해하게 됐다. 실제로 기능을 고쳐야 하면 Service로 기능의 활용을 고치려면 Controller로 이동하면 되기에 후에 리팩토링을 할 때 굉장히 편했다. 

 

물론 내가 짠 코드가 완벽한 코드는 아니지만, 위의 경험을 겪었을 때의 감정은 진짜 잊기 힘들 것이다. 죽을 때까지 생각날지도... 

 

뿐만 아니라 추상 클래스나 상속 등을 활용해서 객체 지향적인 개념을 적용하기 위해 노력했다. 그러면서 내가 지금까지 이론으로 배운 내용들을 직접 적용해봤다. 

 

https://github.com/Jiwonna52/java-christmas-6-Jiwonna52

 

GitHub - Jiwonna52/java-christmas-6-Jiwonna52

Contribute to Jiwonna52/java-christmas-6-Jiwonna52 development by creating an account on GitHub.

github.com

3. 결론

1주일 마다 하나의 프로그램을 완성하는 것을 4주 동안 반복하는 게 정말 쉽지 않았다. 위에서 썼듯이 4주차에서는 진짜 그만두고 싶기도 했고. 그럼에도 끝까지 완성했다는 점에서 나에게 박수를 주고 싶다. 게다가 나의 잘못된 코딩 습관도 고칠 수 있었으며 이론으로만 배운 것들을 실전을 통해 진심으로 이해할 수 있는 좋은 기회였다. 

4. 앞으로 하고 싶은 것들

1. 4주 동안 배운 내용들을 적용해서 다시 미션을 진행해보고 싶다.

2. 코드 리뷰를 받아보고 싶다. 프리코스에 참여할 때는 시간 문제 때문에 코드 리뷰를 진행하지 못했다. 여전히 시간이 많지 않지만(곧 기말 고사다), 그래도 1주차부터 다시 진행하면서 코드를 통해 나의 의도가 다른 사람에게도 잘 전달되는지 확인하고 싶다.

 

앞으로 기말도 있고 코테도 계속 준비해야 하고 개인 프로젝트나 취준 등등 해야 할 것이 많은데, 그래도 최선을 다해볼 예정이다. 힘을 내자고!