![]() |
로드북 |
강컴 | |
교보 | |
반디 | |
알라딘 | |
예스24 | |
인터파크 |
이 책의 여기 저기에 “양파 껍질을 벗긴다.”, “첫 번째, 두 번째 양파 껍질”과 같은 표현이 등장한다. 나는 학생들에게 양파 껍질을 벗기듯이 학습하라고 이야기한다. 이 무슨 뚱딴지 같은 소리인가?
나는 한 번에 한 가지 지식을 깊이 있게 학습하는 것에 집중하기 보다 다양한 분야의 얕은 지식을 학습한 후 일정 수준이 되면 다음 단계의 깊은 지식으로 서서히 깊이를 더해가라는 의미이다. 예를 들어 웹 애플리케이션을 개발하기 위해 이산수학, 자료구조/알고리즘, 네트워크, 데이터베이스, 운영체제, 자바, 서블릿/JSP, HTML/CSS/자바스크립트를 모두 학습한 후에 접근하기보다는 웹 애플리케이션을 개발하기 위한 최소한의 지식을 습득해 일단 만들어 보는 경험을 해 첫 번째 양파 껍질을 벗긴 후 두 번째 양파 껍질을 벗기기 위해 도전하는 방식으로 학습하라는 조언이다. 이 책 또한 완벽하지는 않지만 이 같은 접근 방식으로 설계하고 진행하려는 시도를 하고 있다.
이 장은 웹 프로그래밍을 처음 시작하는 개발자가 첫 번째 양파 껍질을 벗길 수 있도록 도움을 주기 위한 가이드 문서를 제공하고 있다. 다음과 같은 경험이 있는 독자라면 바로 2장으로 건너 뛰어도 괜찮다.
두 번째 양파 껍질은 첫 번째 양파 껍질보다 훨씬 더 두껍고, 알아야할 지식도 폭발적으로 늘어나는 경향이 있기 때문이다 . 이 두 번째 양파 껍질 단계에서 더 많은 도전자들이 중도 포기하거나, 현재 상태에 만족하고 다음 단계로 성장하지 못한다. 이 두 번째 양파 껍질을 벗는 순간 소프트웨어 개발과 관련한 대략적인 그림도 그릴 수 있으며, 앞으로 무엇을 학습해야할 것인지에 대한 통찰도 얻을 수 있다. 쉽지 않은 과정이 될 것이다.
두 번째 양파 껍질을 벗기기 위한 첫 번째 과정으로 추천하는 학습은 테스트와 리팩토링이다. 테스트와 리팩토링은 개발자가 갖추어야할 중요한 역량이다. 리팩토링의 즐거움을 한 번 맛보면 프로그래밍하는 즐거움과 재미를 느낄 수 있다.
3장은 웹 애플리케이션을 개발, 버전관리시스템에서 소스 코드를 관리, 개발한 웹 애플리케이션을 원격 서버에 실제 배포하는 경험을 하고, 우리가 12장까지 구현해야 할 질문/답변 게시판에 대한 서비스 요구사항과 실습 요구사항(실습을 위한 힌트도 포함되어 있다.)을 제시하고 있다. 또한 HTTP 웹 서버를 직접 구현하는 경험을 함으로써 웹 클라이언트와 서버 간에 데이터를 어떻게 주고 받는지에 대해 학습한다.
웹 애플리케이션 개발자가 반드시 학습해야할 주제 중의 하나가 HTTP에 대한 이해이다. 하지만 현장에서 애플리케이션 개발에 집중하다보면 HTTP에 대해 학습할 기회가 많지 않다. 또한 대부분의 경우 책을 통해 HTTP에 대해 학습하는 것이 일반적인데, HTTP가 프로토콜 스펙에 대한 내용인지라 재미가 없는 것 또한 사실이다. 이 같은 단점을 보완하기 위해 HTTP 웹 서버를 직접 구현하면서 웹 클라이언트와 서버 사이 주고 받는 HTTP에 대해 학습해 봤으면 하는 바람으로 이 실습을 설계했다
우리가 3장의 요구사항을 구현하면서 HTTP 웹 서버에 대한 지식이 많아졌듯이 프로젝트 요구사항에 대한 지식은 프로젝트를 진행하면서 점차 높아진다. 요구사항에 대한 지식이 높아질 수록 더 좋은 설계를 할 수 있으며, 더 깔끔한 코드를 구현할 수 있다. 이와 같이 설계는 한번의 작업으로 끝내야 하는 것이 아니라 애플리케이션을 개발하고 배포해 운영하는 동안 끊임없이 진행해야 하는 것이 설계이다. 이와 같이 지속적인 설계와 구현을 잘 할 수 있는 방법이 지속적인 리팩토링이다. 리팩토링은 설계를 개선하기 위한 일련의 활동이다.
4장에서 구현한 HTTP 웹 서버를 리팩토링하면서 설계를 개선하는 경험을 해보자.
이번 장에서는 4장 실습에서 잠깐 언급했던 쿠키의 문제점에 대해 살펴보고 이를 해결하기 위한 용도로 등장한 세션을 직접 구현해 봄으로써 세션의 동작 원리를 이해해보도록 하겠다.
서블릿이 HTTP 지원과 관련해 많은 부분을 제공하고 있지만 서블릿만으로는 웹 애플리케이션을 빠르게 개발하는데 한계가 있다. 이 같은 단점을 보완해 좀 더 효과적인 개발이 가능하도록 프레임워크를 만들 수 있다. 자바 진영뿐만 아니라 거의 모든 언어가 제공하는 웹 프레임워크는 MVC(Model View Controller) 패턴을 기반으로 하고 있다. 따라서 MVC 패턴 기반으로 프레임워크를 만들면서 MVC에 대한 개념을 경험하도록 하겠다.
이번 장은 지금까지 구현한 회원 데이터를 데이터베이스 서버에서 관리하고 JDBC API를 통해 접근하도록 구현한다. 그런데 JDBC API를 사용하는 소스 코드에 많은 중복이 발생한다. 이 중복 코드를 제거함으로써 여러 프로젝트에서 공통으로 사용할 수 있는 JDBC 공통 라이브러리를 직접 구현해 보는 경험을 한다.
이번 장에서는 직접 구현한 프레임워크와 라이브러리를 활용해 질문/답변 게시판을 구현하는 경험을 해보자. 질문/답변 게시판을 구현하면서 사용자 경험을 한 단계 더 높여줄 AJAX 기술을 활용해 답변을 추가, 삭제하는 기능을 구현할 계획이다. AJAX을 활용하는 과정에서 서버측은 HTML이 아닌 JSON 데이터로 응답하도록 구현한다.
마지막 경험은 서버 측에서 HTML과 JSON 두 가지 형태의 응답을 함으로써 발생하는 MVC 프레임워크의 문제점을 살펴보고 이를 개선하는 과정을 살펴보겠다.
지금까지 긴 시간을 쉼 없이 달려왔다. 지금쯤 약간 숨을 고르면서 자신이 학습한 내용을 제대로 이해하고 있는지 점검해보는 시간을 가지면 좋겠다.
앞의 과정을 잘 따라왔다면(특히 직접 실습을 한 경험이 가장 중요하다.) 7번 문제를 제외한 12번까지 문제를 자신의 힘으로 해결할 수 있어야 한다. 앞 부분의 문제는 너무 쉬울 수 있지만 복습한다는 자세로 진행해보면 좋겠다.
7번과 12번 이후의 문제는 앞에서 다룬 내용은 아니지만 멀티스레드 환경에서 웹 개발자가 알아야할 내용을 추가했다. 또한 다음 장부터 진행할 내용을 미리 살펴봄으로써 현재 코드가 가지고 있는 문제점에 대해 고민해 볼 수 있는 기회를 제공하기 위한 부분이다.
이 장에서는 지금까지 구현한 MVC 프레임워크의 문제점을 파악한 후 새로운 MVC 프레임워크를 구현할 계획이다. 단, 기존과 다른 점은 이전에 구현한 MVC 프레임워크 기반으로 동작하는 컨트롤러가 정상적으로 동작하는 상태에서 새로운 MVC 프레임워크로 점진적으로 전환해 가는 과정에 대해 살펴볼 계획이다. 쉬운 과정이 아닐 것이다. 하지만 그 과정에서 우리는 지금까지와는 또 다른 경험을 할 것이며, 객체지향 설계의 장점에 대해 다시 한번 느낄 수 있는 기회가 될 것이다.
DI를 처음 접했을 때 머리로는 이해가 되는데 가슴으로 이해가 되지 않았다. 굳이 DI를 활용해 개발해야 하나? 맞다. DI를 처음 접했을 때 많은 개발자가 느낄 수 있는 감정이다. 이 개념에 대한 필요성을 이해하는데 어려움을 느낀다. 이는 경험에 따라, 지금까지 자신이 개발한 소스 코드의 문제점에 대한 인식의 차이에 따라 극명하게 나뉜다. 내가 트랜잭션 처리에 대한 문제 인식을 하고 있었기 때문에 “Expert One-on-One J2EE Development without EJB” 책의 트랜잭션 처리에 대한 해결책을 읽는 순간 짜릿함을 느낀 것이다. 문제 인식이 없는 상태에서 새로운 지식을 학습한다는 것은 그 만큼 어렵고, 동기부여가 되지 않는다. 현재 스프링 프레임워크 때문에 DI를 사용하는 개발자가 많지만 이에 대한 필요성을 가슴으로 이해하고 사용하는 개발자는 얼마나 될까? 따라서 DI가 왜 필요한지에 대해 먼저 다루고 이 장을 진행하도록 하겠다.
긴 여정을 거쳐 MVC 프레임워크와 DI 프레임워크 구현을 완료했다. 힘든 과정이었지만 내가 직접 구현한 프레임워크로 웹 애플리케이션을 개발한다는 것은 재미있는 경험이다. 재미뿐만 아니라 역량을 키우는 측면에서는 많은 도움이 되었다.
지금 단계에서 멈출 수도 있지만 11장에서 추가한 DI 프레임워크에 기능을 좀 더 추가하고, 확장 가능하도록 구조를 개선한다면 앞으로 프레임워크 기능을 확장할 때 많은 도움이 되겠다. 앞에서 MVC 프레임워크를 몇 단계에 걸쳐 개선했듯이 이번 장에서는 DI 프레임워크를 개선하는 경험을 해보자.
나는 학습에 대한 가장 큰 동기부여는 필요에 의한 학습이라 생각한다. 즉, 현재 내가 안고 있는 문제를 해결하기 위해 무엇인가를 학습할 때 가장 큰 동기부여가 되고, 이 때 학습하고 문제를 해결한 경험이 진정 나의 것이 될 수 있다. 따라서 가장 큰 학습 동기를 만들려면 현재 내가 해결해야할 문제가 무엇인지를 인식할 필요가 있다. 내가 해결해야할 문제가 무엇인지 인식했다면 다음 단계는 이 장에서 제시하는 내용이나 검색을 통해 학습할 자료를 찾는 과정을 거치면 된다.