- Published on
우아한테크코스 5기 백엔드 프리코스 1주차 후기 (feat. 미완성)
지난주 수요일(10/26)부터 진행됐던 우아한테크코스 프리코스 1주차가 오늘로 끝났다. 학습면에서도, 학습 외적인 면에서도 개인적으로 많은 시련을 겪었던 기간이다. 그만큼 배운 것도 많아 이번 프리코스 1주차 후기를 기록으로 남기고자 한다.
응애 나 자바 1일차
이번 프리코스를 통해 처음으로 자바를 사용해보게 되었다! 자바를 처음 써보는데 하필 그게 프리코스라니.. 걱정도 되었지만 막상 코드를 쳐보니 나의 발목을 잡은 건 자바보다도, 후술할 클린코드에 대한 고민이었다. 자바로 했어도 평소 백준 문제 풀듯 냅다 solution()에 다 적어내려갔으면 별로 어렵진 않았을 거다. 반대로 익숙한 언어로 했어도 이렇게 클린코드를 위한 규칙과 설계를 처음 익히고 부딪혀가며 코드를 짰다면 꽤 어려웠을 것이다.

킵고잉~
아무튼 결코 쉽지 않은 4주가 되겠다는 생각이 들었지만, 자바는 여러 이유로 작년부터 배우고 싶던 언어였기 때문에 이런 좋은 기회에 많이 배우고 성장할 수 있을 것 같아 기대가 되었다.
클린코드 도전기
내가 지금까지 해커톤, 프로젝트, 알고리즘 문제 풀이 등을 통해 했던 프로그래밍은 대부분 코드보다는 1회성 결과물 구현에 초점이 맞춰져 있었다. 그렇다보니 장기적 관점에서의 클린코드를 고민해 본 적이 거의 없다. 따라서 내가 이번 프리코스 기간에 성장하기 위해서는 단순히 '동작하는 코드'만을 짜는 것이 아니라 장기적 관점에서 코드 자체의 품질을 고려하며 코드를 짤 수 있는 역량을 길러야 한다고 생각했다.
이번 1주차에는 코드 작성에 있어 별도의 조건은 따로 없었지만, 이번 기회에 '결과가 아닌 코드를 위한 개발'을 해보고 싶어 자체적으로 클린코드 작성을 위해 고민하며 학습했다. 그렇다보니 오히려 코드를 치는 시간보다도 관련 개념을 스스로 찾아 부딪히는 시간이 더 많았던 것 같다.
코드도 양파도 한 번에 되는 것은 없다
이런 다짐을 가지고 프리코스를 시작한 첫날, 변수/메소드 네이밍, 클린코드 규칙, 자바 컨벤션, 커밋 컨벤션 등을 찾아보며 좋은 코드를 작성하기 위해 알아야 할 것들을 확인했다. 당시 이것저것 알아보면서 보았던 자료들 중 특히 도움이 된 레퍼런스들.
- 우아한테크코스 PR 전 체크리스트 - 우아한테크코스 문서
- 좋은 코드를 위한 자바 변수명 네이밍 - 테코블
- 좋은 코드를 위한 자바 메소드 네이밍 - 테코블
- 변수명 짓기 - curiostore (adultlee님으로부터 추천 받아 내내 야무지게 잘 사용했다. 👍)
- 5 tips for writing Clean Code - 노마드코더 유튜브 (추천 ✨)
하지만 결코 쉽지 않다. 내가 이해할 수 있는 내용도 있었지만 생전 처음 들어보는 말들도 있었다. 또, 자바를 처음 사용해보는 나는 엄청난 스압이 느껴지는 자바 컨벤션을 파고 드는 것부터 벽이 느껴졌다.
원시 타입 포장? 일급 콜렉션? getter/setter는 외않되? 1학년 때 그걸로 했는데? 근데 DTO는 돼? DTO가 뭔데?
당장 이해하기도 어려운 내용을 가지고 끙끙대느니 먼저 코드를 짜고, 나중에 리팩토링하며 차근차근 새로 배운 것들을 적용해보기로 했다. 이에 대한 좋은 조언을 위 노마드코더 유튜브 영상에서도 들을 수 있었다.

+) 그리고 이 영상 보고 박막례할머니 잡채 만들기 영상 보다가.. 비슷한 조언을 발견..
코드도 양파 썰기도 한 번에 되는 것은 없다
아무튼 두 선배님의 조언으로 '일단 쓰자'라는 마인드를 가지고 우선 다음의 원칙들만 지켜보기로 했다.
- 한 메서드는 하나의 기능만 담당하도록 메서드를 분리하자.
- indent를 최소한으로 하자. 가능한 1단계로.
- 코드 한 줄에는 하나의 점(.)만을 쓰자. 메서드 체이닝이 필요하다면, 따로 변수를 만들어 분리하자.
- 제3자가 보고 주석 없이 이해할 수 있도록 변수와 메서드 이름을 최대한 구체적으로 짓자.
- 누가 본다 생각하고 커밋 메시지도 최대한 구체적으로
이런 것들을 지켜가며 코드를 작성하고자 했고, 리팩토링도 해보았다. 이런 식으로!
👎 수정 전) 코드 한 줄에서 함수 호출이 두 번 수행된다. 또한 if...else 문의 두 분기에서 동일한 자료를 다루고 있음에도 불구하고 해당 자료를 사용하기 위해서는 매번 번거로운 함수 호출을 해주어야 한다. 추후 코드 유지보수 시 비용이 증가하고 정확도가 하락할 수 있음을 예상할 수 있다.
public static String convertOriginalWord(String originalWord){
String convertedWord="";
for(int wordIndex=0;wordIndex<originalWord.length();wordIndex++){
if(originalWord.charAt(wordIndex)==' ') { // 공백일 경우
convertedWord+=" ";
} else{
convertedWord+=convertAlphabet(originalWord.charAt(wordIndex));
}
}
return convertedWord;
👍 수정 후) charAt()의 결과를 담아 사용하는 char 타입 변수를 하나 선언해 사용함으로써 반복되는 함수 호출을 줄이고, 코드 가독성을 높였다. 수정 전에 비해 유지보수가 용이해졌다.
public static String convertOriginalWord(String originalWord){
String convertedWord="";
for(int wordIndex=0;wordIndex<originalWord.length();wordIndex++){
char digitInWordByIndex=originalWord.charAt(wordIndex);
if(digitInWordByIndex==' ') { // 공백일 경우
convertedWord+=" ";
} else{
convertedWord+=convertAlphabet(digitInWordByIndex);
}
}
return convertedWord;
물론 수정 후 코드도 완벽하진 않다. indent를 한 단계 더 감소시킬 수 있으면 좋을 것 같다.
메서드 쪼개다 머리가 쪼개질 것 같아요
하나의 메서드에 하나의 기능? ㅇㅋ 당연이 할수잇지~^^ 하지만 그렇게 만만하지 않음을 느끼게 된다. 이번에 처음으로 기능 목록을 작성해 기능 단위 커밋을 본격적으로 해보았는데, 어디부터 어디까지를 하나의 기능으로 보고 메서드를 분리할지 판단하기 쉽지 않은 경우가 있었다. 메서드를 작성하다보니 메서드(기능)를 하나 더 분리해야 할 것 같다는 생각이 뒤늦게 든다거나..

그래서 1번 문제를 풀 때는 개발 중간중간에 기능 목록이 자주 바뀌었다. 기초 설계가 탄탄하지 못하다는 생각이 들어 다음 문제를 풀면서는 어떤 기능이 필요할지 함수 단위로 고민을 했고, 개발 도중에 기능 목록이 계속 바뀌는 경우는 적어졌다.
기능 단위로 메소드를 분리하고 나니 코드의 응집도가 높아져 함수의 기능이 확실해진다는 장점이 있음을 체감했다. 또, 나중에 요구사항이 수정되었을 때 유지보수의 비용도 적을 것이다. (실제로 이런 것들을 계속 생각하며 설계를 하고자 했다.) 그러나 서로 연관이 있는 함수들을 분리하다보니 상위 레벨의 함수 실행을 위해서는 하위 레벨의 함수가 줄줄이 실행되어야 하는 구조가 되어 메소드간 결합도는 그닥 낮지 않다는 생각이 들었고, 내가 잘 하고 있나.. 싶기도 했다. 🤔 더 많은 공부가 필요하다.
슬랙에서 소통하기
올해 프리코스에 새로이 도입된 것 중 하나가 바로 커뮤니티. 1주차에는 슬랙만을 사용했고, 2주차부터는 GitHub Discussion을 함께 사용하게 된다. 3000명이 넘게 모인 슬랙이라니! 쏠쏠한 재미도 있고, 또 훌륭한 분들로부터 많이 배울 수 있었다.

슬쩍 다른 분의 GitHub 질문에 답변도 해드리기
예상치 못한 시련과 미완성 제출
이렇게 나름대로 여러 좌충우돌을 겪으며 학습을 이어갔지만, 결국 나의 1주차 프리코스 미션은 미완성 상태로 제출되고 만다. 급한 개인 사정이 생겨 며칠간 거의 종일을 병원에 있어야 했고, 프리코스에 시간을 쓰지 못했다. 결국 어찌저찌 7문제 중 4문제만을 풀이했고, 그마저도 수정할 부분이 많은 상태로 제출하게 되어 미련이 남는다..🤕
사실 구현 수준과 테스트 점수를 보았을 때, 나의 프리코스 합격은 꽤나 힘든 일이 되었다. 그러나 여기서 포기하지 않고, 1주차를 무사히 끝내지 못한 아쉬움이 남은 만큼 남은 3주의 기간을 더 열심히 보내볼 예정이다. 프리코스 1주차를 진행하며 계속 부딪히는 과정에서 새로운 배움을 얻게 되는 것을 체감했고, 합불을 떠나 이번 한 달의 기간 동안 많은 것을 배워가고 싶기 때문이다.
🍀