이 글은 "슬기로운 자바 학습 방법 Ep2. DFS 학습 방법"에서 이어지며 이번 시리즈의 마지막 글이다.

만들어 보자.

이전까지 글에서 설명했던 방법으로 학습을 꾸준히 했다면 자꾸 이전에 찾아봤던 문서나 API를 다시 찾아보거나 '아.. 이건 그런거였지'라며 되새김질 하는 시간이 잦아질 것이다. 그럼 이제 때가 된것이다. 본격적으로 만들는데 집중할 시간이. 다만 처음부터 너무 큰 그림을 그리진 않았으면 좋겠다. 페이스북을 만들겠다거나 아마존을 만들겠다거나.. 제발 그러진 말자. 하나씩 차근차근. 조그만것부터 시작해보는게 좋다.

작은거 혼자 만들기.

학교에서 과제 때문에 짰던 코드 말고, 내가 스스로 생각해서 처음 만들어 본 애플리케이션은 켄트벡의 "테스트 주도 개발"을 보다가 생각난 아주 간단한 태스크 관리 툴이었다. 구현할 기능 목록을 작성할 수 있고 각 작업 마다 시작과 완료 버튼이 있어서 해당 기능마다 구현하는데 시간이 얼마나 걸렸고 작업을 완료할 수 있는 데스크탑 애플리케이션이었다. 자바 Swing API를 이용해서 대략 4~5일 정도 걸렸던거 같다. 만들면서 여러가지 고민과 생각이 오갔다. UI가 좀 생소한데 좀 더 운영체제 어울리는 UI로 만들 수는 없을까? JAR 파일 더블 클릭하는거 말고 .exe나 .bat를 쓰도록 배포할 순 없을까? 데이터는 파일로 저장할까 DB에 저장할까? 별도의 애플리케이션이 아니라 이클립스 안에서 쓸 수는 없을까? 어쩌면 고민중에 몇몇은 만들기 전에 할 수도 있었겠지만 막상 만들면서 생기는 고민이 더 많았다. 그리고 그 고민들은 정말 소중한 경험이 되고 다음에 또 무언가를 만들 때 마치 이전의 내 자신이 내게 속삭이듯 되새김질 해주었다.

시간이 중요해

무엇을 만들지는 본인이 만들고 싶은걸 정하고 다만 2~3일 안에 만들 수 있겠다는 생각이 드는걸로 선택하면 좋겠다. 실제로는 그것 보다 오래 걸릴 수 있으니까. 이때 개발 시간을 기록하거나 대충이라도 기억해 두는게 중요하다. 자신의 실력을 객관화하는데 도움이 된다. 계획보다 오래 걸렸다면 그렇게 오래 걸린 이유가 있을것이다. 어떤 고민에 빠져서 그걸 해결하느라.. 또는 모르는걸 학습하느라.. 또는 버그를 잡느라. 그럼 그렇게 또 실력과 경험이 늘었으니 지연된 시간은 손해가 아니라 이득이다. 원래 계획과 비슷하거나 더 빨리 개발을 마쳤다면 조금씩 더 큰 프로젝트를 시도할 수 있다.

기본기도 중요해

원했던 기능이 동작한다고 다 된것은 아니다. 테스트는 작성했는지, 커밋은 적절한 크기로 만들었는지, IDE를 사용하며 자주 사용하는 기능에 대한 단축키는 익혔는지, 메이븐이나 그래들과 같은 빌드툴을 사용할 때 발생했던 문제와 원인 그리고 해결책은 무엇이었는지 이 모든 걸 무시하고 오로지 자신이 계획했던 일정안에 기능을 만들기만 했다면 배운게 많이 없으니 그만큼 학습의 의미가 무색하다. 쉽게 말해서, 게임은 끝냈지만 난이도를 최하 수준으로 낮추고 플레이 했거나 본인은 한 일이 없지만 다른 팀웜들이 잘해서 이겼다면 '자신의 실력 향상'이라는 목적에 의미가 있는 시간 이었을까 되돌아 볼 필요가 있다.

연습할 때 주의할 것

  • 테스트 코드 작성
  • 프로젝트 빌드 또는 패키징
  • 커밋 히스토리 관리
  • IDE 사용에 익숙해질 것

테스트 코드에 대한 중요성을 무시한다면 취직할 마음은 버리는 것이 좋다. 내가 다녀본 회사들(네이버, 아마존 그리고 마이크로소프트)을 비롯해 지인들이 다니고 있는 여러 회사가 규모를 막론하고 그 어느곳에서도 테스트 코드의 중요성을 무시하는 회사는 들어 본 적이 없다.

더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런
자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다.

보통은 개발 중에 애플리케이션을 이클립스나 인텔리J에서 직접 실행해보고 잘 동작하면 끝이라 생각하지만 막상 패키징을 해서 실행해보면 또 다른 문제가 생기는 상황이 여럿 존재한다. 따라서 반드시 애플리케이션을 빌드하고 패키징해서 실행해 보는 연습을 하길 권장한다.

혼자 개발할 때는 사실 Git과 같은 소스 코드 관리 툴의 장점을 만끽하기 쉽진 않지만 브랜치를 사용하여 실험적인 코드를 작성해 보거나 커밋을 적절한 크기로 나누는 연습은 충분히 할 수 있다.

개발자가 가장 자주 사용하는 툴인 IDE를 다루는데 익숙해 질 수록 자신의 생산성도 향상되고 그만큼 툴에 대한 이해도가 높아진다. 단축키를 외워 쓰는것은 기본이고 IDE를 사용해서 애플리케이션을 실행하고 디버깅 하는 방법 정도는 꼭 연습해야 한다.

자바 웹 애플리케이션 개발

많은 분들이 이 모든 과정을 건너뛰고 바로 스프링으로 자바 웹 애플리케이션 개발을 시작한다. 그래서 어려운거다. 사실 어려워도 괜찮다. 다시 "슬기로운 자바 학습 방법 Ep2. DFS 학습 방법"을 떠올리며 기능 개발 보다는 자신이 이해하기 어려운 자바 기술이나 개념들에 집중해가며하며 모르는 것들을 파고 들고 학습하기 시작한다면 그 어려움도 극복하고 어느 순간부터는 만드는데 집중할 수도 있다.

지름길은 없다.

간혹, 모르는걸 무시하고 어떻게든 동작하는 무언가를 만들기도 하지만 이미 앞서 말했다시피 그렇게 한다고 본인의 실력이 늘었다고 착각해선 안된다. 그런 착각이 길어질수록 본인 실력을 갉아먹는 좀벌레가 커진다.

게시판 만들기

가장 흔히 시도하는 웹 프로젝트가 게시판 만들기인데 여러가지 이유가 있겠지만 대부분의 애플리케이션에서 사용하는 CRUD(Create, Read, Update, Delete) 즉, 만들고, 조회하고, 수정하고, 삭제하는 기능을 직관적으로 구현해 볼 수 있기 때문일 것이다.

처음 만드는 게시판이라면 아주 단순한 형태로 글을 하나 작성하고 조회하고 수정하고 삭제하고 기능을 만들어 보는게 좋겠다. 그러다 조금씩 복잡한 로직을 만들어 넣기 시작해보자. 가령, 특정 키워드를 가지고 있는 글을 검색하거나, 글 목록을 작성일자 역순으로 정렬하고 페이징, 글을 작성한 사람만 해당 글을 수정할 수 있다거나, 글을 작성 중에 임시로 저장해 놓을 수 있는 기능, 관리자 역할의 사용자는 모든 글을 수정하거나 삭제할 수 있다거나... 축하한다. 스파게티처럼 엉켜고 설켜, 여기 저기 비슷한 코드를 붙여 넣고, 어떤 코드는 한참을 봐도 내가 왜 이렇게 작성했고 무슨 뜻인지 의도를 분간하기 어렵고, 버그가 넘쳐나서 누군가에게 써보라고 하기엔 부끄러운 코드를 만들었다면 성공한 것이다. 무엇이 문제이고 무엇을 모르는지 알아냈으니 이제 한걸음씩 더 앞으로 나가면 된다.

스프링 기반 REST API 개발 - 인프런
다양한 스프링 기술을 사용하여 Self-Descriptive Message와 HATEOAS(Hypermedia as the engine of application state)를 만족하는 REST API를 개발하는 강의입니다.
스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런
이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다.

스프링 등판

코드가 복잡하게 꼬이는 이유는 많지만 가장 대표적인 이유가 인프라 성격의 코드를 비즈니스 로직에서 분리하지 못했기 때문이다. 여기서 말하는 인프라 성격의 코드라면 객체간의 의존성 관리, 트랜잭션 처리, 인증 및 보안 등을 예로 들 수 있다. 코드를 다시 잘 살펴보기 바란다. 분명히 서로 다른 일을 하는 코드가 하나의 클래스 또는 하나의 메소드 안에 길고 복잡하게 섞여 있을 것이다. 코드를 정돈하는 방법을 익혀야 할 시간이다. 그리고 더 나아가 인프라 성격의 코드를 스프링을 사용해서 처리하고 최대한 비즈니스 로직만 코딩할 수 있게끔 만들 수 있다. 그렇게 하려면 스프링에 대한 학습이 필요하다. 그리고 여기까지 차근차근 따라 왔다면 내게 그러했듯이 결코 스프링을 학습하는게 그렇게 어렵지 않을것이다. 오히려 재미있을 것이다.

스프링 프레임워크 핵심 기술 - 인프런
이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다.
스프링 웹 MVC - 인프런
이 강좌는 자바 서블릿(Servlet) 기반의 MVC 프레임워크인 스프링 웹 MVC(이하 스프링 MVC)에 대해 학습합니다.
스프링 부트 개념과 활용 - 인프런
스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다.

각자 만들며 비교하기

스프링을 이용해 혼자서 비즈니스 로직이 들어간 게시판을 만을 수 있다면 스터디를 통해 각자의 진척 상황을 공유하고 서로 비슷한 기능을 어떻게 구현하고 테스트 했는지 비교할 수 있다. 그런 과정을 통해 다른 개발자의 코드를 보는데 익숙해 질 수 있으며 코드 리뷰에 관심을 갖게 될 것이다.

같이 만들기

드디어 목적지에 다다랐다. 각자 게시판을 만들 수 있는 개발자를 모아 공동으로 만들 프로젝트를 정하고 모여서 같이 만들어 배포해보는  연습을 하는 것이다. 이 과정을 통해 의견을 나누고 설득하고 주장에 대한 근거를 제시하고 코드로 증명해가며 협업에 필요한 다양한 활동을 직접 경험할 수 있다. 또한 Git을 좀 더 다양한 방법으로 활용할 수 있고 이슈 트래커와  CI와 CD 도구까지 설치하고 구성해 볼 수 있다. 배포 이후에 운영하는 서비스의 모니터링과 로그 메시지 분석과 장애 탐지 및 알림 설정까지 경험할 수 있다.

이렇게하여 협업하며 서비스 개발 및 운영 할 수 있는 능력을 갖췄다면 소프트웨어 개발 엔지니어라 할 수 있지 않을까? 자바와 스프링 학습이 잠시나마 목표가 될 순 있지만 항상 이 궁극적인 목표를 잊지 말아야한다. 자바는 언제든 회사나 업무에 따라 자바스크립트나 코틀린, C#, Go, Pythong 등으로 바뀔 수 있고 스프링은 Node.js에 Express, 장고, PlayFramework 등 다양한 프레임워크로 바뀔 수 있다. 본 시리즈에서 설명한대로 학습을 해왔다면 상황에 따라 주어진 도구가 바뀌더라도 그동안의 경험과 지식을 활용해 보다 빠르게 학습하고 본래의 목적을 달성할 수 있을것이다.

이것으로 "슬기로운 자바 학습 방법" 시리즈를 마친다.