요즘 블로그에 글을 쓰는게 너무 뜸한 것 같아 최근 수강하고 있는 데브코스의 회고록이라도 적어보고자 한다.
현재는 7월 30일부터 12월 23일까지 예정된 프로그래머스의 백엔드 데브코스를 수강하고 있다. 데브코스는 K-Digital Training에 속하는 국비교육 과정으로 내일배움카드로 수강할 수 있다.
교육은 LMS를 활용한 강의 수강 및 팀 프로젝트 형식으로 진행된다. 사실 처음에는 부스트캠프나 42서울처럼 일정한 커리큘럼 없이 매일 주어지는 과제 수행 및 상호 피드백이 아니라서 아쉬웠다. 왜냐면 나의 지난 4학년의 비대면 수업의 경험으로 미루어 볼 때 혼자 강의만 듣는 방식은 굉장히 나태해지기 쉬웠기 때문이다.
하지만 6개월이라는 긴 기간동안 프로그래머스(정확히는 그렙) 측에서 열심히 만든 커리큘럼을 따라가면서 다른 사람과 스터디도 하고 프로젝트도 진행하면 충분히 좋은 결과를 얻을 수 있으리라 생각했다.
데브코스를 시작하고 초반 한 두달은 같은 팀원끼리 익숙해져야하기도 하고 특강이나 다른 일정이 많아서 따로 프로젝트 활동을 하긴 어려웠다. 대신 강의를 들으면서 TIL이란 것도 작성해보고 PR에 다른 사람을 리뷰어로 등록해서 코드 리뷰도 하는 등 다양한 경험을 할 수 있었다.
사실 TIL이랑은 좀 다른데 그냥 그날 강의들은 내용을 메모해둔 곳이다. Gitbook을 활용해서 그날 그날 작성했는데 매니저들의 조언에 따라 단순 기록이 아닌 좀 더 많은 것을 적기 위해 노력했다.
데브코스에서는 이런 과정을 배움 기록이라 칭하고 이곳과 같은 가이드를 제공했는데 굉장히 유익해서 자주 읽어보았다.
하지만 갈수록 매너리즘에 빠져서 강의 내용을 거의 그대로 옮겨적은 게 아닌가 생각된다. 앞으로는 배운 내용 뿐 아니라 뭐가 이해가 안 됐는지, 추가적으로 공부할 사항은 무엇인지를 기록하는 걸 위주로 진행해야겠다.
오리엔테이션 기간이 끝난 후 그냥 강의만 듣긴 뭐하니 팀원끼리 스터디를 해보자고 안건이 나왔는데 그 중 가장 대표적이고 흔하지만 중요한 알고리즘(코딩 테스트) 스터디를 진행했다.
나는 프로그래머스와 리트코드 위주로 코딩 테스트를 준비했는데 다른 사람들은 대부분 백준을 많이 활용하는 것 같았다. 팀원 중에 대기업(라인, 카카오 등) 코딩 테스트를 준비하는 사람이 있어서 그 분의 지도 하에 스터디를 진행했는데 특정 주제(DFS, 완전 탐색 등)에 대해서 몇 문제를 각자 풀고 풀이를 발표하는 식으로 진행했다.
백준 온라인 저지에는 코딩 스터디 그룹과 문제집 기능을 지원해서 이 곳에 우리 팀 구성원으로 이루어진 그룹을 만들고 매주 선정한 문제를 문제집으로 만들어서 관리했다.
첫 주차와 그 다음 주차는 문제없이 풀 수 있었지만 3주차, 4주차는 골드 단계의 문제들이 포함되서 풀지 못했다. 그래도 이렇게 문제집으로 기록해 뒀기 때문에 나중에 생각나면 다시 도전해 볼 수 있을 것이다.
많이 활성화되진 않았지만 GitHub 저장소에 각자의 풀이 코드도 올리고 코드 리뷰(#1, #2, #3)도 진행했다. 역시 코딩 테스트를 준비할 때는 문제를 풀어서 맞는 게 아니라 다른 사람은 어떻게 풀었는지 살펴보는 과정이 더 얻어가는 게 많다고 생각한다.
초반에 목표로 했던 것보다 점점 문제 양이 줄어들었는데 데브코스를 진행하면서 다들 바빠졌기 때문에 추진력이 조금 약해지지 않았나 하는 아쉬움도 있다.
모든 팀원들이 참여했던 알고리즘 스터디와 달리 디자인 패턴 스터디는 나 포함 총 3명의 팀원들만 참가했다. 데브코스 커리큘럼에서 2주차에 자바 심화 과정을 다뤘는데 Refactoring Guru에 소개된 23가지 디자인 패턴을 정리하는 과제가 있었다. 그래서 마침 처음 학습하는 사람도 있고 나도 복습하는 김에 같이 스터디하는게 어떤가 해서 진행하게 되었다.
스터디는 23가지 디자인 패턴을 각자 몇 개씩 맡아서 한 4, 5일마다 발표하는 시간을 가지는 방식으로 진행했다. 팀원들도 정리한 내용을 블로그에 정리하거나 위의 팀 노션(비공개)에 아래처럼 정리하는 방식으로 진행했다.
나는 주로 아래처럼 PPT를 만들어서 발표 자료로 발표 후 샘플 코드를 시연하는 방식으로 진행했다. 다른 팀원들은 각자 블로그에 정리한 내용이나 Refactoring Guru 뿐 아니라 다른 책에서 읽은 내용을 문서로 정리해서 발표했다.
샘플 코드는 GitHub 저장소에 각 패턴의 하위 폴더에 자신의 이름으로 폴더를 만들어서 공유하는 방식으로 작성했다. 아쉬운 점은 위의 알고리즘 스터디 때처럼 코드 리뷰도 해보고 싶었지만 간단한 코드만 작성하고 발표 때 시연하다보니 별다른 코드 리뷰 없이 진행하게 되었다.
23가지 패턴을 모두 발표하고 나니(생각보다 오래걸렸다) 왠지 성취감있고 후련했다. 다른 팀원들과 같이 하지 않았으면 아마 하다가 중간에 또 흐지부지 됐을 것이다. 아쉬운 점은 내가 발표자료를 따로 챙겨놓지 않았고(간단한 PPT라 끝나고 휴지통으로 직행했다) 비공개 노션에 자료를 작성했기 때문에 스터디의 결과를 종합하기 좀 까다롭다는 것이다. 나중에 양해를 구하고 GitHub 저장소의 README.md에 옮겨적거나 하는 방식으로 결과를 다듬어봐야겠다.
데브코스에서는 단순히 한 명의 강사와 여러 명의 수강생으로 이루어진 게 아니라 여러 명의 강사(퍼실리테이터, 멘토, 리더 등)와 여러 명의 수강생이 다대다 연관관계(JPAㅋㅋ)를 가진다. 어떤 수강생이든 어떤 멘토에게 자유롭게 질문할 수 있도록 슬랙과 노션, GatherTown 등 다양한 커뮤니티를 활용하고 있다.
그렇지만 코드 리뷰나 좀 더 집중적인 학습을 위해 수강생들은 각 멘토별로 6명에서 8명 정도로 분배되었다. 이렇게 나뉜 팀끼리 매일 오후 2시에 스크럼 회의를 하면서 오늘은 어떤 작업을 할 것이고 어떤 공지사항이나 궁금한 점이 있는지 자유롭게 이야기하는 시간을 가졌다.
물론 처음에는 어색했지만 매일매일 게더타운에 모여서 스크럼 회의를 진행하고 매주 수요일마다 멘토님과의 면담 시간을 가지면서 점차 익숙해졌다. 특히 멘토님이 코드 리뷰같은 부분에서 굉장히 신경을 많이 써 주셔서 큰 도움이 됐다.
내가 답변한 것도 있지만 PR 코멘트가 66개나 쌓였다. 초반 과제는 단순 실습이라 살살하고 코딩 과제에서는 빡세게 리뷰할거라고 하셨는데 빈말이 아니었다... 그렇지만 Optional의 올바른 활용이라던가 switch-case 대신 enum과 함수형 인터페이스를 활용한 변화에 강건한 코딩 등등 정말 얻어가는게 많았다. 예전에 참여했던 블랙커피 스터디 때도 느낀 거지만 코드 리뷰가 정말 좋은 활동인 것 같다.
지금은 1차 팀이 끝나고 새로운 팀으로 결성되면서 다른 멘토님과 지내고 있지만 그렇다고 완전히 남남이 되는게 아니기 때문에 앞으로도 자주 교류하고자 한다.
사실 자바 심화라기보다는 본격적으로 데브코스에서 스프링을 배우기 전에 잊어버렸던 자바의 기능들을 다지고 Java 8 이후의 다양한 기능(Optional, 함수형 인터페이스 등)에 대해 알아보는 시간을 가졌다. 이 주차에 23가지 디자인 패턴에 대해서 조사해보는 과제가 나와서 위의 디자인 패턴 스터디를 진행했었다.
항상 그렇지만 Java 8은 자바 역사에서 정말 중요한 의미를 가지기 때문에 어떤 변화가 일어났는지는 기본적인 상식으로 가져가야 할 것 같다.
간단하게 데이터베이스가 무엇이고 SQL 쿼리의 기본적인 문법을 배웠다. 프로그래머스의 SQL 고득점 키트를 풀어보는 과제가 나왔는데 이 문제들은 예전에 프로그래머스의 데브 매칭을 준비할 때 다 풀어봐서 딱히 할 게 없었다.
하지만 멘토님과 리뷰하던 중 알게 된 것이 SQL 쿼리를 작성했다면 데이터베이스에서 해당 쿼리를 어떻게 실행하는지 실행 계획을 보고 비교해 볼 필요가 있다고 하셨다. 처음에는 실행 계획이 뭔가 했는데 MySQL Workbench 프로그램에서 공식 문서처럼 우리가 작성한 쿼리를 데이터베이스가 어떻게 실행하는지 과정을 시각화해서 보여준다는 것을 알 수 있었다.
지금은 SQL 쿼리에 따라서 유의미한 속도 차이를 얻을 수 있는 실습이나 프로젝트를 진행하고 있지 않기 때문에 큰 의미는 없다. 하지만 나중에 대용량 더미 데이터를 집어넣고 인덱스나 WHERE 조건절 등에 따른 실행 계획을 비교해보는 스터디를 해보는 것도 좋을 것 같다.
스프링 프레임워크의 핵심 기술(IoC Container, DI 등)에 대해 학습하고 YAML을 활용한 프로퍼티 설정이나 로깅, JDBC API 활용 등에 대해 학습했다. 워낙 광범위한 내용을 짧게 다루는 시간이라 깊이 있는 학습은 어려웠지만 부족한 내용을 스스로 찾아보는 방식으로 더 학습행 할 것이다.
스프링 MVC의 기초적인 내용을 학습했다. 자바 서블릿부터 DispatcherServlet, HandlerMapping, HandlerAdapter 등 웹 요청 처리에 관련된 다양한 구성 요소들에 대해 인지하고 스프링 부트의 자동 설정으로 변환하는 방법에 대해 학습했다.
계속 결심만 하고 실천은 못하고 있는 대표적인 항목으로 스프링 공식 문서 정독이 있다. 개인 프로젝트를 진행하거나 궁금한 점을 찾다가 구글링 - 스택오버플로우나 quora 등을 뒤적거리다 보면 결국 스프링 공식 홈페이지에서 제공하는 문서로 이어지는 경우가 많았다. 그래서 좀 무식하지만 한 번 쭉 읽어보면서 전반적인 지식을 얻고 싶었는데 혼자 있다보면 나태해지는 경우가 많아서 아직까지도 읽어보지 않았다.
모든 부분을 읽기보다 필요한 부분(MVC 쪽이나 Core)만 몇 개 골라서 계획을 세우고 읽어보는 것이 좋을 것 같다. 물론 Data JPA나 Security 쪽은 전체적으로 읽어봐야 할 것이다.
사실 위에서 언급한 스프링 기초, 스프링 웹 기초는 내가 개인 프로젝트를 진행하고 책을 읽으면서 습득한 내용과 많이 겹치기 때문에 이미 알고 있는 내용이 많았다. 그래서 강의 내용을 스킵하다보니 조금 애매하게 넘어간 부분이 있긴 한데 아직까지 걱정되는 점은 스프링 부트를 못 쓴다고 할 때 스프링 레거시로 전환할 수 있는지다.
요즘은 유지보수가 아닌 이상 스프링 부트로 웹 애플리케이션을 개발한다고는 하지만 결국은 스프링 레거시의 설정을 간편화해준 게 스프링 부트다. 그렇다면 반대로 스프링 부트 없이도 레거시를 부트 애플리케이션처럼 사용할 수 있어야 하는 게 아닐까라는 생각이 자주 든다.
하지만 거기까지 내려가면 아예 서블릿부터 쌓아올려야 되는게 아닌가라고 생각할 수 있기 때문에 너무 큰 부담은 가지지 않으려고 한다. 대신 스프링 부트 자동 설정에서 어떤 Bean 객체들을 등록해주는지 정도는 좀 알아보고자 한다.
데브코스를 진행하면서, 아니 그 이전부터 네이버 웹툰 면접에 탈락한 이후로 내가 진행했던 개인 프로젝트(SimpleBBS, SimpleTodoList)는 한 번도 건드리지 않았다. 이전에 세미나나 설명회에서 단기적인 목적을 위한 한두 달짜리 짧은 프로젝트는 좋은 인상을 주지 못한다고 들었다. 그래서 꾸준히 관심을 가지고, 즉 개발에 대한 열정을 가지고 프로젝트를 진행하는게 좋다고 했는데 그 결심과 열정은 다 어디로 갔는지 커밋 한 번 하지 않아서 많이 부끄럽다.
일단 SimpleBBS 쪽은 내가 개인적으로 Vue.js를 학습한 후에 전통적인 MVC 방식(폼 제출 + 응답)에서 API와 프론트엔드 프레임워크가 통신하는 방식으로 변경하고자 한다.
SimpleTodoList 쪽은 좀 더 RESTful하게 API를 디자인하기 위해 HATEOAS를 적용하고 가능하다면 마찬가지로 프론트엔드 페이지를 구축해서 제공해보는 쪽을 목표로 하고 있다.
이렇든 저렇든 프론트엔드 쪽 지식이 필요한데 지금 당장 리액트나 그런 프레임워크를 배우긴 까다롭다. 하지만 지난 면접에서 프론트엔드 지식이 있는지 물어보기도 했고 큰 회사가 아니라면 프론트, 백 둘 다 다룰 수도 있다고 하니 일단 러닝커브가 낮은 Vue.js 쪽으로 학습해보고자 한다.
아마 하루종일 내 뒤에서 내가 뭘 하는지 관찰하는 사람이 있다면 이게 취준생이 맞나 싶을정도로 나태하게 보내는 것을 볼 수 있을 것이다. 그래서 이번 주말을 보내고 다음 주 부터라도 좀 시간표를 짜서 생활하고 싶은데 해야 할 건 많고 들어야 할 것도 많기 때문에 이를 적당히 4가지로 분배하고자 한다.
이렇게 해서 하루에 그래도 12시간은 공부(또는 개발)를 해야 취준생이 아닌가 싶다. 물론 과제를 다 했거나 코드 리뷰가 끝났다면 남은 3시간은 유동적으로 휴식을 취하거나 다른 곳(온라인 강의 등)에서 부족한 시간으로 활용할 수 있을 것이다.
중요한 건 벌써 10월이라는 것이다. 2021년을 허투루 보내기 싫다면 당장 내일부터라도 이에 맞춰서 생활해보자.
2021년의 초반~중반기에는 개인 프로젝트나 스프링을 처음 배우면서 흥미 반 의무감 반으로 뭐라도 했지만 후반기로 갈수록 점차 추진력이 떨어진 것 같다. 이 데브코스도 허무하게 보내기 싫다면 더 노력하는 편이 좋을 것이다.