이 글은 이전 글인, "슬기로운 자바 학습 방법 Ep1. 스터디는 개인주의야"에서 이어진다.


어느정도 자바에 대한 기본을 마쳤다면 자바 진영에서 가장 널리 사용하고 있는 프레임워크인 스프링을 자연스럽게 보고 듣게 된다. 스프링은 사실 매우 복잡하고 또 방대하다. 내가 처음 스프링을 학습할 때는 스프링과 Acegi(지금의 스프링 시큐리티) 정도가 있었을 뿐인데 지금은 스프링 배치, 스프링 부트, 스프링 데이터를 비롯해 스프링 클라우드까지 스프링 대항해시대라 해도 과언이 아닐정도로 스프링은 계속해서 새로운 영역을 발견하고 그곳에 스프링의 철학을 적용하고 있다.

다시 말하자면, 자바 기반의 애플리케이션을 개발할 때 스프링을 사용할 일이 많아졌다는 일이다. 스프링 부트와 스프링 웹 MVC가 제공하는 기능을 사용하면 아주 단순한 웹 애플리케이션이라면 5분안에 만드는 것도 가능하다.

자바를 잘하고 싶은데 스프링을 공부해야 할까?

다시 돌아가서, 누군가 내게 "자바를 잘하고 싶은데 스프링을 공부해야 할까?" 라고 묻는다면  "도움이 된다." 정도로 답하겠다. 자바를 좀 더 잘 이해하고 잘 쓰고 싶을 때 반드시 스프링을 학습해야 하는 것은 아니지만 스프링을 학습하며 자바를 비롯한 프로그래밍 전반에 대한 많은 지식을 습득할 수 있기 때문이다.

스프링은 여러 디자인패턴과 객체지향 원칙을 기반으로 자바 엔터프라이즈 에디션(Java EE) 기술을 지원하는 프레임워크로써 그것을 이해하는데 필요한 배경 지식이 상당히 많은 편이다. 그래서 어쩌면 이제 막 자바 기본에 대한 학습을 마친 개발자가 스프링을 보고 어려워하는건 어찌보면 너무도 당연한 일이다.

토비의 스프링 3.1 세트
『토비의 스프링 3.1』은 스프링을 처음 접하거나 스프링을 경험했지만 스프링이 어렵게 느껴지는 개발자부터 스프링을 활용한 아키텍처를 설계하고 프레임워크를 개발하려고 하는 아키텍트에 이르기까지 모두 참고할 수 있는 스프링 완벽 바이블이다.[Vol. 1 스프링의 이해와 원리] 단순한 예제를 스프링 3.0과 스프링 3.1의 기술을 적용하며 발전시켜 나가는 과정을...

지금 이 글을 읽으며 'Jave EE라는게 있었어? 그게 뭐지?'라는 생각을 했다면 지금이라도 구글링을 해보기 바란다. JEE가 생소한 분들을 위해 간략하게 설명하자면, 지금까지 본인이 학습한 자바는 자바 스탠다드 에디션 즉, JSE라고 부르는 기술의 일부에 해당하며 JEE는 JSE 기반으로 엔터프라이즈 즉 기업용 소프트웨어를 개발하는데 필요한 기술이라 생각할 수 있다. 여기에는 의존성 주입(CDI), 트랜잭션 처리(JTA), 영속화 기술 (JPA), 이메일, 서블릿, JSP, 빈(bean) 검증 등 정말 다양한 기술이 속해 있으며 아마도 대부분의 것들이 생소하게 느껴질 것이다. 생소한 개념이 갑자기 너무 많이 등장했다고 당황할 필요는 없다. 누구에게나 처음이 있다는 사실을 잊지 말자.

만들면서 배우자.

그럼 이 다양한 기술을 어떻게 학습하느냐? 하나씩 스팩(specification) 또는 레퍼런스 문서를 읽어가면서? 글쎄, 그 지루함을 견딜 자신이 있다면 그것 또한 좋은 방법일 것이다. 하지만 나처럼 무언가 동작하는 코드를 보며 학습하고 싶다면 스프링을 사용하며 자바를 익히는 방법을 추천한다. 다만, 조심해야 할 것은 스프링이 아니라 자바에 집중해야 한다는 사실을 잊지말아야 한다. 아직 이 시점에는 스프링에 집중할 필요도 없고 그럴만한 학습 수준이 아니기 때문이다. 따라서 스프링을 학습하다가 자주 JSE 또는 JEE의 문서와 API를 확인하는데 시간을 소비하는 것이 자연스러운 단계다. 이 시점에 스프링의 API와 문서를 더 자주 본다면 학습의 초점이 자바가 아니라 스프링으로 바뀌었다는 사실을 깨닫고 다시 방향을 조절해야 한다.

DFS 학습법

이제서야 바로 이 글의 제목인 DFS(Depth-First-Search)가 무슨 뜻인지 이해했을 것이다. 사실 DFS는 알고리듬 용어인데 깊이 우선 탐색을 뜻한다. 무언가를 학습하다가 꼬리에 꼬리를 물고 깊게 파고 들어가는게 딱 이 알고리듬과 어울린다고 생각했다. (이런 학습 방법을 유튜브 라이브 방송으로 설명 중에 어떤 분께서 댓글로 DFS라는 단어를 사용했는데 거기서 착안했다.) 또는 이런 학습 방법을 야크 쉐이빙(Yak Shaving)이라고 표현할 수도 있는데 야크 털을 깎으려다가 털을 깎을 도구를 다듬고 또 다시 그 도구를 다듬는데 필요한 작업을 하게 되는 , 흔히 '삼천포에 빠진다'는 말과 비슷하다. 이런 작업은 업무를 하는데 있어서는 굉장히 비효율적인 방법이지만 학습에 있어서는 조금 다르다. 스프링을 야크 삼아 자바 실력을 다듬는다고 생각하면 좋겠다.

그래서 어떤 걸 알게 되냐면...

그렇게 학습을 이어간다면 여러분은 분명히 자바를 이전보다 더 많이 이해하고 쓸 수 있는 자신을 발견하게 될 것이다. 스프링의 IoC를 학습하며 최소한 자바의 리플렉션이나 클래스로더와 클래스패스에 대한 개념이 좀 더 견고해 질 것이다. 스프링이 제공하는 다양한 애노테이션에 대해 진지하게 공부하다보면 어느새 애노테이션 프로세싱에 대해 공부하고 있을 것이며 스프링 AOP를 공부하며 다시 클래스로더, 바이트 코드조작 그리고 다이나믹 프록시 등 자바 기본 서적에는 좀처럼 등장하지 않지만 자바를 기반으로 한 여러 프레임워크 및 라이브러리에서 자주 사용하는 기술에 대해 학습하고 있는 자신을 발견했다면 야크 쉐이빙, DFS 방식의 학습에 성공했다고 볼 수 있다. 이 기술들은 스프링을 통해 사용하지 않더라도 독자적으로 활용할 수 있는 기술이다. 따라서 자바를 주력으로 삼은 개발자라면 반드시 알아야 할만큼 중요하다.

스프링 프레임워크 핵심 기술 - 인프런
이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다.
더 자바, 코드를 조작하는 다양한 방법 - 인프런
여러분이 사용하고 있는 많은 자바 라이브러리와 프레임워크가 ”어떻게” 이런 기능을 제공할 지 궁금한적 있으신가요? 이번 강좌를 통해 자바가 제공하는 다양한 코드 또는 객체를 조작하는 방법에 대해 학습하고 여러분의 자바 기술을 한 단계 업그레이드 하세요.

어디 그뿐일까. 앞서 언급했던 JEE 기술인 Bean Validation, CDI가 제공하는 애노테이션과 JPA와 Servlet에 대한 공부까지 이어질 수 있다. 스프링을 공부하다보면 끊임없이 삼천포로 빠져들고 이전까지 몰랐던 자바에 대해 한층 더 폭넓고 깊이있는 지식을 습득할 수 있다. 개인적으로 모든 JEE 기술까지 일일히 깊게 파고 드는건 다소 시간 대비 효율이 떨어진다고 생각한다. JEE는 여러 스펙과 모듈의 집합체인데 각각의 모듈이 제공하는 기능에 대한 개요와 가장 중요한 기능 몇개만 파악하고 넘어가고 나중에 해당 기능을 업무에서 사용하게 됐을 때 좀 더 깊게 살펴보는 방법을 추천한다. JEE 기술은 모듈화 되어 있어 반드시 모든 JEE 기술을 써야 하는게 아니라 일부는 스프링이 제공하는 비표준 기술을 사용하고 일부는 JEE 스팩이 제공하는 기술을 선택적으로 사용할 수 있기 때문이다. 가령 예를 들어 의존성 주입 및 빈 관리 기능은 CDI 대신에 스프링이 제공하는 빈팩토리와 의존성 주입용 애노테이션으로 대체하고 JPA와 Bean Validation만 사용할 수 있다. 이런 경우에 당연히 CDI 보다는 JPA와 Bean Validation에 대해서만 조금 더 공부하는게 시간을 아낄 수 있는 방법일 것이다.

다음으로

이런식으로 야크 쉐이빙을 하며 학습에 집중하다보면 사실 원래 만들고 싶었던 것에 비해 아주 초라한 무언가를 만들고 있는 자신을 발견하게 된다. 괜찮다. 어차피 목적이 만들면서 학습하는 것이었기 때문이다. 이런식의 학습을 몇번 반복하며 학습하는 주제를 조금씩 다르게 집중해 보는것도 좋다. 이것도 역시 스터디를 통해서 다른 사람들은 비슷한 기능을 만들었을 때 서로 어떤것을 학습했는지 비교해 보는 것도 좋다. 이 과정을 반복하며 JSE와 JEE에 좀 더 익숙해 졌다면 다음은 본격적으로만드는데 집중을 해 볼 차례다. 이번 시리즈의 마지막 글에서 조금 더 자세히 다루겠다.