본문 바로가기
우아한테크코스/프리코스

우아한테크코스 3기 프리코스를 마치며

by 조엘 2020. 12. 15.

지난 3주 동안 착실하게 임했던 우아한테크코스(이하 우테코)의 프리코스 과정을 마무리 지었다. 

 

우테코의 프리코스 과정은 코딩 테스트+자소서를 기반으로 한 1차 심사에 통과한 인원을 대상으로 진행되었다. 

프리코스를 통해 우테코의 교육 과정에 본인이 잘 녹아들 수 있는지를 검증해 보라고 하셨다. 

프리코스의 목적

총 3주에 걸쳐 프리코스는 진행되었다.

매주 1개의 미션이 주어졌고, 점점 구현의 난이도와 제약 조건이 더해지면서 생각을 많이 요했던 것 같다. 

해당 Repository의 master 브랜치에는 과제에 대한 설명을, PapimonLikelion 브랜치에는 내 구현 방법을 올려놓았다. 

 

[1주차 - 숫자 야구 게임]

https://github.com/joelonsw/java-baseball-precourse/tree/PapimonLikelion

 

[2주차 자동차 경주 게임]

https://github.com/joelonsw/java-racingcar-precourse/tree/PapimonLikelion

 

[3주차 지하철 노선도 미션]

https://github.com/joelonsw/java-subway-map-precourse/tree/PapimonLikelion

 

3주의 시간 동안 미션을 수행하면서 내가 느낀 점은 다음과 같다. 

 

1. 자바 기초 문법

사실 나는 자바에 대한 경험이 거의 전무했다. 프리코스 과정을 위해 자바의 기초 문법을 나동빈 님의 강좌를 통해 학습하였고, 다행히 C++과 유사한 부분이 많아 기초적인 문법은 습득에 큰 어려움이 없었다. 

3주 동안 자바를 써보면서 어느덧 자바가 꽤 친숙해진 것 같다. 그리고 자바를 쓰는 게 꽤나 재미있다. 

덕분에 이번 학기 모바일 컴퓨팅 기말고사 프로젝트에도 팀에 크게 기여를 하고 있다. 

 

2. 가독성

지금까지 컴퓨터공학과 과제나, 멋쟁이사자처럼에서 진행한 프로젝트를 구현할 때에는 가독성을 우선순위에 둔 적이 없었다. 사실 구현하고 돌아가기만 하면 장땡이라는 마인드로 코딩을 했었다. '구현만 해도 잘하는 거지!'라는 생각도 솔직히 있었다.

 

이제는 아니다. 우선 변수명, 함수명, 클래스명을 신경 쓰며 짓는 연습을 할 수 있었는데 점점 글쓰기 같아지는 내 코드를 보며 흥미로웠다. 그 동안은 더 빠른, 더 효율적인 코드에 집중했다면, 이제는 읽기 좋은, 읽고 싶은 코드를 작성하는데에 신경을 써야겠다고 다짐했다. 읽자마자 무엇을 하는 코드인지 모두가 알아차릴 수 있게 계속해서 연습해야겠다.  

 

3. MVC 디자인 패턴

Django를 통해 웹 프로그래밍을 공부할 때 MVT 패턴을 사용했었다. 이와 비슷하게 콘솔 프로그래밍에서도 MVC 패턴을 사용할 수 있었다. 호돌님의 블로그를 참조하여 MVC 패턴을 공부하였다. 

hodol.dev/posts/%EC%84%B8%EC%83%81%EC%97%90%EC%84%9C-%EC%A0%9C%EC%9D%BC-%EC%89%AC%EC%9A%B4-MVC-%ED%8C%A8%ED%84%B4

 

세상에서 제일 쉬운 MVC 패턴 - 호돌록

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고

hodol.dev

아직 완벽하게 MVC 디자인 패턴을 구현해내진 못했지만, 이를 흉내 내 보면서 클래스들에게 소속감을 주며 그 안에서 제대로 동작하게 하는 것이 아주 재미있었다. 디자인 패턴이라는 용어 자체를 처음 접했어서, 이에 대한 공부를 더 진행하고 싶다는 마음이 생겼다. 

 

4. 메서드는 하나의 기능만을 담당

어디까지가 "하나의 기능"에 인가에 대해 생각을 했던 것 같다. 하나의 작업을 위해 input을 받고 데이터를 처리하고 output을 출력하는 것 까지 모두 하나의 기능이라 생각하였다.

 

비즈니스 로직과 UI 로직을 분리하라는 피드백을 통해서 더욱 생각보다 내가 "하나의 기능"을 크게 두고 있다는 것을 깨달았다. 3주 차 미션에서는 최대한 자세히 메서드를 분리하려 노력하였다. 

 

5. 인스턴스 변수에 대한 올바른 접근

공통 피드백 중에서 가장 인상에 깊었던 피드백은 객체에서 데이터를 꺼내려하지 말고 "객체에 메시지를 보내라"였다. 피드백의 예시 코드를 보며 객체에 관련한 내용은 객체 내부에서 처리하는 게 훨씬 깔끔하다는 깨달음을 얻었다.

 

이를 마음에 품고 3주 차 과제를 진행하였다. 다행히 리팩터링 과정에서 무의식에 써놓은 객체에서 데이터를 꺼내는 코드를 수정해 낼 수 있었다. 의식적 연습을 통해 한 층 발전한 것 같아서 기분이 좋았다. 

https://github.com/joelonsw/java-subway-map-precourse/commit/2ecc36071fd85c24ee0fbaaf4c1bf55eeebfb914

 

6. 패키지의 분리

비슷한 성격의 자바 클래스를 모아놓은 자바의 디렉토리를 패키지라고 한다.

"비슷한 성격"은 언제까지나 주관적인 판단이 들어갈 수밖에 없고, 이를 명확히 분리하는 객관적 기준이 필요하다고 느꼈다. MVC 디자인 패턴이 하나의 해결책이라고 생각하였고, 3주 차 과제에서는 이를 구현하려 노력하였다. 

 

7. Static의 사용

Static의 사용은 사실 나에게 생소한 부분이었다.

1주 차에는 static 예약어가 내가 기존에 생각하던 절차 지향 방식의 코딩에 유리해서 많이 적용하였다.

2, 3주 차를 지나오면서 static에 대한 공부를 진행하며 필요한 부분에 적용시키려고 노력했다. 

 

해당 블로그의 내용을 통해 static 키워드에 대한 전반적인 이해를 할 수 있었다. 

vaert.tistory.com/101

 

[Java] Static 키워드 바로 알고 사용하자

자바를 한번쯤 공부해본사람이라면 static키워드를 모르지는 않을 것입니다. 하지만, 바르게 알고 있는 사람들은 그리 많지 않습니다. 자바경력자를 면접볼 때 static키워드에 대해서 질문하곤 합

vaert.tistory.com

 

2, 3주 차를 기점으로 클래스를 생성 시, 이게 어떤 식으로 관리되어야 하는지 생각을 하면서 구현에 임했다.

MVC 패턴 기준으로 view 부분은 static 하게, domain 부분은 필요에 따라 인스턴스를 생성하며 구현에 임했다. 

View 부분은 모든 사용자가 매번 같은 input/output을 봐야 하니 static으로 구현하는 게 유리하다고 판단하였다. 

 

8. 효율적인 예외상황 처리의 실패

3주 차 구현을 마치며 아쉬웠던 점은 validation을 담당하는 클래스들의 메서드가 구조가 비슷한데, 이 코드를 하나하나 작성해줬다는 점이었다. 해당 조건을 시도하고, 조건을 만족하지 않으면 예외처리한다는 같은 로직 안에서 조건만 바꾸어 체크하는 메서드들을 줄일 방법이 분명히 있을 텐데 라고 생각하였다. 

이를 해결하고자 솔루션으로 전략 패턴 및 함수형 프로그래밍을 찾아보았지만, 구현에 옮기기에는 시간이 모자랐다. 디자인 패턴에 대한 공부를 필히 해야겠다고 결심하였다. 

 

9. 좋은 설계, 좋은 구현

코딩 하기 전, 어찌 코드를 작성할 지 구상하는데에 시간을 더 많이 사용하는 편이다. 프리코스 과정 중에도 마찬가지였다. 하지만 오래 설계한다고 좋은 설계도가 나오지 않는다. 프리코스를 통해 느낀점은 바로 "아는 만큼 보인다" 였다.

 

사실 첫 주에는 구현하는 거에 급급해서 굉장히 절차지향적으로 그저 알맞은 결과를 도출하기 위한 설계를 진행했었다.  2, 3주차를 지나오면서 MVC 디자인 패턴 및 클래스/패키지 분리를 공부하면서 조금 더 미래지향적인(?) 설계를 했던 것 같다. 기능의 확장성과 추가 요구 사항에 대처할 수 있게 클래스를 생각하게 되었고, 3주차에는 내 나름대로 최선의 설계를 해냈던 것 같다.

 

또한 다 마친 설계는 구현하는 사람의 역량에 따라 성능이 다른 프로그램으로 세상에 나오게 되는데, 내가 다른 지원자의 PR을 훔쳐보면서 감탄했던 적이 있었다. 3주차 미션에서는 메인 화면에서 사용자의 선택에 따라 다른 기능으로 제어를 넘겨주고, 해당 기능이 종료되면 다시 메인화면을 보여줘야 한다. 나는 이 과정을 아무생각 없이 while문으로 구현하였다. 하지만 다른 지원자가 stack을 사용해 기능을 구현 해낸 것을 보고 무릎을 탁 쳤었다. 

 

좋은 설계, 좋은 구현을 생각하고 공부해야겠다. 이를 위해서 무엇보다 내 틀 안에서 갇히지 않고, 다른 사람들과 생각을 교류해 나가야 더 빨리 성장하겠구나 느꼈다. 

 

10. README.md 작성

README.md에 구현할 기능 목록과 디렉터리 구조를 작성하는 것은 아주 재미있었다. 무엇보다 프로젝트를 다 해놓고 작성하는 README가 아닌 중간 중간 고치면서 개선시키는 "살아있는 문서"를 만드는 과정이 재미있었다. 

 

README.md 작성은 나에게 프로젝트를 끊임없이 설명시키는 과정이라고 생각이 들었다. 

구현할 기능 목록을 하나하나 작성하며 어떤 기능을 제공할 건지, 어떤 예외상황을 생각했는지, 어떤 조건이 만족되어야 종료되는지를 작성하였다. 나의 설계를 머리와 종이에서 그치지 않고 직접 글로 풀어내는 과정이 한 층 더 깊은 설계를 가능하게 했다. 

 

2,3 주차에는 디렉터리 구조를 추가하여 작성했다. 구현할 기능 목록이 설계도였다면, 디렉토리 구조는 제품 설명서 같았다. 작성한 파일 하나씩 무슨 역할을 하는지 알아볼 수 있게 작성하려 노력하였다. 

 

 

프리코스를 마치며...

무엇보다 프리코스를 거치면서 우테코에 가고자 하는 마음이 더욱 커졌다. 

 

지금이 올바른 방향으로 빠르게 성장할 수 있는 적기이지 않을까 라는 생각이 들었다. 

기초적인 CS 지식과 개발 지식을 공부했고, 피드백을 받으면 이를 흡수하기 위해 노력할 마음도 충분하다. 

또한 아직 나쁜 버릇이 고착화 될 정도로 코딩을 오래, 많이 한 것도 아니다. 

 

가야할 방향을 누군가가 잡아주며 발전할 수 있는 기회는 흔치 않다. 

또한 나와 같은 목표를 가진 서로를 위해 줄 팀원들을 만나기도 쉽지 않다.

(우테코 2기 유튜브 영상을 보면 이게 참 부럽고 멋졌다)

 

토요일에 있을 마지막 코딩테스트에서 최선을 다해 이 기회를 꼭 잡았으면 한다. 나 자신 화이팅 🤞

 

+ 프리코스를 준비해 주신 우테코 관계자 여러분들 정말 감사합니다! 

반응형

댓글2