스프링 3 적응기 모음 (토비의 스프링 3) Development

토비의 스프링 3 학습한 내용을 정리해 보았습니다.

Spring 적응기 #1 - 책 전체 리뷰 및 간략한 감상.


Spring 적응기 #2 - 1장 예제


Spring 적응기 #3 - 단위 테스트


Spring 적응기 #4 - 아주 간단한 웹 어플리케이션

아직 공부하는 중이라서 내용이 추가될 것 같습니다....

일부 내용은 원저자의 요청에 따라 삭제될 수도 있습니다.


Spring 3 적응기 #4 Development

스프링을 웹 사이트 (웹 어플리케이션 혹은 웹 서비스)를 개발하는데 가장 많이 사용되는 프레임워크라고 할 수 있다. 토스3를 학습하는 사람들 대다수는 웹 서비스를 개발하기 위한 목적으로 선택했을 거라 여겨진다. 그런데, 스프링의 기본 개념과 내재된 기술들이 워낙 많다. 그러다 보니 토스3에서 스프링3 기반의 웹 기술은12장 에서부터 소개되고 있다. 전체 분량이 1400페이지인데, 1013 페이지부터 시작이다.  (1부를 다 읽지도 못하고 넉다운 됐다는 분들도 있더라는....) 중간 부분은 나중에  다시 공부하기로 하고, 스프링 MVC 모델을 학습하기 위해 12장으로 넘어갔다.

스프링은 웹 프레젠테이션 계층을 지원하기 위해 "스프링MVC"를 제공한다. 스프링을 이용해서 웹 서비스를 개발하려 한다면 2가지 선택이 가능하다. 스프링 자체에서 제공하는 웹 기술을 사용할 것인지 혹은 외부 프레임워크와 연동하여 개발할 것인지를 결정해야 한다. 토스3에서는 전자의 방식을 권장한다. 그렇다고, 전자가 더 좋다는 것은 아니다. (자세한 내용은 책에 상세히 나와 있다.)

토스3에서 제시하는 대로 스프링의 기본(혹은 권장) 기술을 익혀 보기로 한다. 스프링의 웹 기술은 MVC 모델을 바탕으로 front controller 패턴을 추가하여 설계되어 있다. 간단히 말하자면, DispatcherServlet + MVC 라고 하겠다. DispatcherServlet은 그 명칭에서 기능을 유추할 수 있다. 요청을 분배(dispatch) 하는 서블릿(servlet)이다. 웹 서버로 들어오는 모든 클라이언트의 요청을 받아서 요청(request) 내용을 해석하고, 처리하고, 그 결과를 생성할 수 있는 특정 MVC 조합을 찾아서 요청 내용을 전달(혹은 분배)하는 것이다. 한 곳에서 들어와 여러 곳을 나가는 흐름이라서 dispatch라는 단어를 붙인 것이다.

스프링3의 DispatcherServlet과 MVC 모델을 간단한 그림으로 표현하면 아래와 같다.


스프링 3를 이용해 웹 서비스를 개발하려면 가장 먼저 DispatcherServlet을 등록해야 한다는 것이 명확하다. 여기서 잠깐.... DispatcherServlet을 어떻게 쓰는지 알기 전에, 이클립스에서 스프링3 프레임워크를 쓰려면 사전 준비가 필요하니 짚고 넘어 가자.

아래와 같은 개발 환경에서 테스트 했으니 참조 바란다.

- JDK version 1.6
- Tomcat 6.0
- Eclipse Indigo

스프링 3 프레임워크를 이용해 아주 간단한 웹 페이지를 출력하는 예제를 만들어 봤다.

1. 이클립스에서 다이나믹 웹 프로젝트(Dynamic Web Project) 생성


2. 라이브러리 폴더에 스프링 프레임워크 jar 파일 복사

- 스프링 프레임워크 라이브러리 파일 복사
생성된 다이나믹 웹 프로젝트의 라이브러리 폴더 (SpringWeb/WebContent/WEB-INF/lib) 폴더에 스프링 프레임워크 라이브러리(*.jar) 파일을 복사한다.

복사한 jar 파일들을 빌드 경로(build path) 추가한다.


3. web.xml 파일에 스프링 리스너 추가

- 웹 어플리케이션 설정 파일(SpringWeb/WEB-INF/web.xml) 파일에 스프링 리스너를 추가한다.

  <listener>
<display-name>ContextLoader</display-name>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>



4. applicationContext.xml 작성

- 스프링 설정 파일 (SpringWeb/WebContent/WEB-INF/applicationContext.xml)을 작성한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<bean id="FirstMessage" class="com.acme.FirstMessage" />

</beans>

5. 빈 클래스 및 JSP 파일 작성


- com.acme.FirstMessage 빈 클래스를 작성한다.
- FirstMsg.jsp 파일을 작성한다.

6. 웹 어플리케이션을 실행한다.

- 웹 브라우저에서 FirstMsg.jsp 페이지가 정상적으로 출력되는지 확인한다. 

위 예제의 구체적인 내용은 아래 파일을 참고 바랍니다.

SpringWeb.zip

위 내용은 토스3의 예제를 조금 단순하게 변경한 것인데, 원저자의 요청이 있을 시에는 삭제될 수 있습니다.

Spring 3 적응기 #3 Development

이제, JUnit 테스트를 써보자. 토스3 1부 2장 2절에는 다음과 같은 문구가 나온다.

자동화 테스트를 위한 xUnit 프레임워크를 만든 켄트 벡은 "테스트란 개발자가 마음 편하게 잠자리에 들 수 있게 해주는 것"이라고 했다.

이 말을 한국 상황에 빗대어 달리 얘기해 보자면, "단위 테스트는 소프트웨어 개발자 수명 연장의 꿈"이라고 할 수 있다. 그만큼 중요한 기술이라고 말할 수 있다. 유능한 개발자는 코딩하고 테스트 시간이 전체 개발 시간의 20%를 넘지 않아야 한다고 본다. 무능한 개발자는 먼저 코딩하고, 반복적으로 코드를 고치고 테스트 하는데 쓸데없이 많은 시간을 허비한다. 나름 열심히 노력하는 것으로 비쳐질런지 모르겠다. 그런데 정작 자기 계발할 시간이 없게 되면 결국 얄팍한 기술 조금 익힌 후, 수년의 시간을 반복적인 챗바퀴를 굴리며 살게 되는 것이다. 수년 후에 더 좋은 기술이나 새로운 개념이 나와도 몸에 익은 반복 패턴을 변화시키기 어렵다. 몸과 마음은 지쳐가고 새로운 기술을 배울 "동기(motivation)"를 상실하고 잘못된 습관이 고착화 되는 것이다.

각설하고, 단위 테스트를 써 보자. 이클립스 자체에서 JUnitTest를 지원하고 있다. 하지만, 스프링 3를 쓰기로 했으니 스프링 안에 포함되어 있는 라이브러리를 써보기로 한다. 지난 번에는 "토스3"에서 제공하는 샘플을 그대로 컴파일 해보았는데, 이번에는 "토스3"에 나와 있는 내용을 공부하고 새로운 코드를 직접 작성해 보았다. 

먼저, 이클립스에서 JUnitTest라는 프로젝트를 생성하고 스프링 junit 라이브러리를 추가했다.


단위 테스트 학습을 위해서 어떤 주제가 좋을지 생각해보다가 현장에서 자주 쓰이는 예제를 선택하기로 했다. 금액을 입력 받은 후, 3자리 마다 comma(,)를 추가하는 유틸리티 클래스를 작성하는 것이다.

단위 테스트를 효과적으로 활용하기 위해서는 테스트 기법을 열심히 공부하는 것보다 "세밀한 테스트 조건"을 잘 정의하는 것이 더욱 더 중요하다. 금액 입력 받은 후 3자리 마다 자리 표기하는게 쉬운 문제 같지만, 테스트 조건을 불충분하게 만들면 안심하다가 뒤통수를 맞기 십상이다.

나름 충실하게 설정한 조건들은 다음과 같다.

assertThat( MoneyFormat.addComma(0), is("0") );
Assert.assertEquals(MoneyFormat.addComma(10), "10");
Assert.assertEquals(MoneyFormat.addComma(100), "100");
Assert.assertEquals(MoneyFormat.addComma(123), "123");
Assert.assertEquals(MoneyFormat.addComma(123.45), "123.45");
Assert.assertEquals(MoneyFormat.addComma(1234), "1,234");
Assert.assertEquals(MoneyFormat.addComma(-12345), "-12,345");
Assert.assertEquals(MoneyFormat.addComma(-12345.67), "-12,345.67");
Assert.assertEquals(MoneyFormat.addComma(123456.78), "123,456.78");


직전에 수행한 프로젝트에서 자바스크립트로 자릿수 표시하는 함수를 만들었는데, 마이너스 금액이 입력되는 상황을 고려하지 않았다가 버그가 발생해버린 적도 있다. 단위 테스트를 충분히 작성했다고 바로 코딩에 들어가지 말고, 다시 한 번 누락된 부분이 없는지 확인해 보도록 하자.

그런데, 위에 제시한 테스트 케이스로 충분할까? 아니다... 그래서 아래 2가지 케이스를 추가했다. 데이터베이스를 사용할 경우, 빈값(null 혹은 빈 문자열) 데이터가 데이터베이스에서 반환하는 경우도 종종 발생한다. 겨우 금액 표기 함수 하나 때문에 화면 전체가 출력되지 않는다면...? 참으로 창피스러운 일이 벌어질 수도 있다. 의외로 실수하기 쉬운 부분이니, 꼭 기억하자.... 입력 값에 빈 값 혹은 null 데이터가 들어오는 경우를 테스트 케이스에 넣어두어야 한다.

Assert.assertEquals(MoneyFormat.addComma(null), "");
Assert.assertEquals(MoneyFormat.addComma(""), "");

테스트 케이스를 작성했으니 이제 구현체를 작성해야 할 차례다. 개발자 마다 자신만의 제작 절차(procedure)라고 할까, 코딩 습관이 있겠지만, 좋은 코딩 습관을 하나 제안 하고자 한다. 간단한 코드를 작성하더라도 생각이 떠오르는 대로 즉석에서 코딩하는 것보다 마음의 준비운동(?)을 해두는 것이 좋다. 인간의 두뇌는 쉬운 문제를 풀더라도 그 문제에 몰입하는데 약간 이나마 준비 시간을 필요로 한다. 미하일 칙센트마이라는 분은 몰입 하기 위해 최소한 15분의 시간이 필요하다고 말한다. 몰입한 상태와 아닌 상태의 생산성은 비교할 수 없을 정도로 큰 차이가 난다.

준비 운동을 위해, 주어진 과제를 아주 단순하게 정의해 보자. 어려운 문제를 빨리 풀어야 똑똑한 사람이 된다는 편견(?)들이 많이 퍼져 있지만, 진짜 똑똑한 사람은 어려운 문제를 풀어서 해결하는 사람이 아닐까 싶다. (물론, 글 쓰는 사람은 미련한 부류에 속하지만...) 어려운 문제를 쉽게 해결하는 방법으로 많이 알려진 아이디어가 분할하여 해결하라(divide & conquer)는 것이다. 바로 적용해 보자. 문제를 아주 단순하게 정의 하고, 전체의 일부만을 해결할 수 있도록 문제를 좁혀서 보자.

< 간단하게 정의한 요구조건 정의 (1단계)>
- 임의의 수치 값(number value)를 입력 받아 문자열로 출력한다.
- 수치의 타입은 음수를 포함한 정수 혹은 실수가 될 수 있다.

위 요구조건을 해결할 수 있는 코딩 기법은 무얼까? 자바 언어를 사용하고 있으니, 오버로딩(overloading)을 사용하면 쉽게 해결될 것이다. 코드 작성하기도 쉽다. 요구사항에 표현하지는 않았지만, 빈 값(empty value)이 들어오는 상황도 고려해서 코딩했다.

public static String addComma(int intValue) {
return addComma(String.valueOf(intValue));
}

public static String addComma(double doubleValue) {
return addComma(String.valueOf(doubleValue));
}

public static String addComma(String strValue) {
if( strValue == null || "".equals(strValue) ) {
return "";
}
return strValue;
}
일단 여기까지 작성하니, 문제의 아주 작은 부분을 해결했다. 그럼 나머지 문제를 다시 정의해 보자.

< 간단하게 정의한 요구조건 정의 (2단계)>
- 문자열로 변환된 수치 데이터에 3자리 마다 자리 표시(,) 한 후 반환한다.

해결해야 할 문제는 얼추 단순해 보인다. 하지만, 테스트 케이스의 입력 값들의 유형 혹은 범위(scope)를 다시 살펴볼 필요가 있다. 금액이 마이너스인 경우도 있고, 소수점 이하의 값이 들어오는 경우도 있다. 다양한 문제를 한꺼번에 해결하려고 하지 말고, 다루기 쉽게 쪼개보자. 수치 데이터를 3개의 파트(part)로 분리할 수 있다. 부호(sign) 영역, 정수 영역, 그리고 소수점 이하 파트로 나눌 수 있다. 그리고, 난 후 정수 파트에 대해서만 3자리 마다 자리 표시를 심어주면 될 것이다.

금액의 자릿수를 추가한 후, 반환하는 전체 소스는 아래와 같다. 참고로, 하나의 메소드 내에 모든 코드를 담아 작성한 후에 의미 파악이 용이하도록 리팩토링(refactoring)을 한 소스이다. 리팩토링의 목적 중에 하나는 코드의 가독성과 유지보수 편의성을 높이는 것도 포함된다. 대충 잘 동작하면 이제 그만... 하기 보다는 잘 동작하는 코드라고 하더라도 리팩토링을 해두는 것이 좋다고 본다. 리팩토링을 하다보면 메소드 갯수가 많아지고, 콜 스택(call stack)이 길어져서 싫다는 분들도 있지만, 우리가 정말 고성능/고효율을 추구하는 개발자라면 처음부터 C 언어나 어셈블리 언어를 사용해야 하지 않겠나? 성능 문제는 오히려 잘못된 API 사용 때문에 벌어지는 경우가 더 많다. 나중에 기회가 되면 다루어 볼지도.... (응?)

package com.acme.util;

public class MoneyFormat {

public static String addComma(int intValue) {
return addComma(String.valueOf(intValue));
}

public static String addComma(double doubleValue) {
return addComma(String.valueOf(doubleValue));
}

public static String addComma(String strValue) {
if( strValue == null || "".equals(strValue) ) {
return "";
}

StringBuilder retValue = new StringBuilder();
int isMinus = extractSignPart(strValue, retValue);
int pointIdx = extractDecimal(strValue, retValue, isMinus);
return extractBelow(strValue, retValue, pointIdx);
}

private static int extractSignPart(String strValue, StringBuilder retValue) {
int isMinus = (strValue.charAt(0) == '-') ? 1 : 0;
String signPart = (isMinus == 1) ? "-" : "";
retValue.append(signPart);
return isMinus;
}

private static int extractDecimal(String strValue, StringBuilder retValue,
int isSign) {
int pointIdx = strValue.indexOf('.');
String intPart = (pointIdx == -1) ? strValue.substring(isSign)
: strValue.substring(isSign, pointIdx);
retValue.append(putComma(intPart));
return pointIdx;
}

private static String extractBelow(String strValue, StringBuilder retValue,
int pointIdx) {
String belowPart = (pointIdx == -1) ? "" : strValue.substring(pointIdx);
retValue.append(belowPart);
return retValue.toString();
}

private static Object putComma(String intPart) {

StringBuilder sb = new StringBuilder();
int hop = 0;
for (int idx = intPart.length() - 1; idx >= 0; idx--, hop++) {
if (hop > 0 && hop % 3 == 0) {
sb.insert(0, ",");
}
sb.insert(0, intPart.charAt(idx));
}

return sb.toString();
}
}



테스트 클래스는 아래와 같이 작성했다.

package com.acme.test;

import org.junit.Assert;

import org.junit.runner.JUnitCore;
import org.junit.Test;

import com.acme.util.MoneyFormat;

public class MoneyFormatTest {

@Test
public void moneyFormat() {
Assert.assertEquals( MoneyFormat.addComma(null), "" );
Assert.assertEquals( MoneyFormat.addComma(""), "" );
Assert.assertEquals(MoneyFormat.addComma(10), "10");
Assert.assertEquals(MoneyFormat.addComma(100), "100");
Assert.assertEquals(MoneyFormat.addComma(123), "123");
Assert.assertEquals(MoneyFormat.addComma(123.45), "123.45");
Assert.assertEquals(MoneyFormat.addComma(1234), "1,234");
Assert.assertEquals(MoneyFormat.addComma(-12345), "-12,345");
Assert.assertEquals(MoneyFormat.addComma(-12345.67), "-12,345.67");
Assert.assertEquals(MoneyFormat.addComma(123456.78), "123,456.78");
}

public static void main(String[] args) {
JUnitCore.main("com.acme.test.MoneyFormatTest");
}
}


JUnitTest를 실행하는 방법은 테스트 클래스에서 컨텍스트 메뉴(context menu)를 호출하면 된다.


타이핑 하기 귀찮은 분들을 위해서 아래에 샘플 코드를 첨부했다.

MoneyFormatTest.java

MoneyFormat.java

Spring 3 적응기 #2 Development

스프링 3 적응기 혹은 토스3 활용기 2회, 바로 들어갑니다.

"백문이 불여일견 (百聞不如一見)" 이라는 말이 있는데, 이건 일반인들을 위한 격언이다. 하드코어 공돌이 - 3D 직종이니까... - 들인 소프트웨어 개발자들은 "백문이 불여일타 (百聞不如一打)" 라는 속담을 쓴다. 아무리 책 많이 읽어봤다고 해봐야 직접 코딩해 본 사람 보다 아래로 친다는 말이다. "토스3"를 제대로 씹어 먹으려면 책에 나온 코드를 직접 두드려 보고 실행되는 걸 눈으로 확인해야 한다.

"토스3"는 고맙게도 풍부한 샘플 소스를 담은 부록 CD가 제공되고 있다. 하지만, 샘플 코드를 어떻게 설치하고 실행(?) 하는지는 책에 나와 있지 않다. 우리나라에서 자체 발간된 소프트웨어 개발 가이드들은 거의 대부분 "화면 캡쳐(screen capture)"로 페이지 분량을 채워 왔다. 이런 유구한 전통(?)을 과감하게 깨버린 것이다. 그리고, 의외로 많은 분들이 샘플 CD를 바라보면 그림의 떡이라고 생각하고 있지 않을까 하는 생각이 들었다. 혹시라도 21세기인데 왜 동영상 가이드도 없냐고 아쉬워 하는 분들이 있을까 싶어서 본인이 여가 시간을 쪼개 보기로 했다. (내가 하는 짓이 삽질이라면 그게 오히려 다행이겠지만...)

토스3에서는 스프링3를 사용하기 위해 필요한 환경을 다음과 같이 제시한다. JDK 5.0 이상을 설치한다. 그리고, IDE(Integrated Development Environment)는 SpringSource Test Suite(STS)를 권장한다. (토스3, 2부 9장 2절 말씀) 하지만, 우리가 늘상 Spring3를 쓸 것도 아니고... 무엇보다 Eclipse를 평소에 쓰고 있다면 새로 무언가를 다운로드 받기 귀찮은 법이다. 그냥 Eclipse 환경에서 Spring 3를 써보자. (참고로, 토스3 2부는 "활용" 편이지만... 생초보를 위한 친절한 안내서는 아니다.)

JDK, Eclipse를 순서대로 설치했거나, 이미 설치되어 있다면 스프링 프레임워크 최신판을 다운로드 받자.
 
http://www.springsource.com/products/springsource-download-center

(2011년 7월 현재, 3.0.5 버전이 릴리즈 되었다.)

샘플 코드를 빌드해볼 차례다. 토스3, 2부 9장에서 다시 1부로 돌아간다. "오브젝트 팩토리를 이용한 스프링 IoC" (토스3, 1부 1장 5절 말씀...) 예제를 실행시켜 보려 한다. 간단한 Java DAO test application 예제인데, DB에 간단한 데이터를 등록하고 조회하는 프로그램이다.


앞으로 전개되는 이야기들은 토스3 책을 사서 옆에 두지 않고는 무슨 내용인지 알아보기 어렵다.
자바 개발자라면! 양장본이어서 아주 뽀대 나는 책이니 전시용으로라도 한권 사두자.
토스3 같은 책이 팔려야 앞으로도 더 좋은 개발 가이드 책들이 한글로 출판 되어 나올테니, 손해 보는 일은 아니다.


1. Eclipse 프로젝트 생성

처음에 소개되는 예제는 간단한 자바 어플리케이션이다. 따라서, 서블릿 컨테이너(톰캣 등) 혹은 WAS를 설치할 필요는 없다. 이클립스를 실행한 후, "File > New > Java Project" 메뉴를 선택하자. 아래와 같은 마법사 다이얼로그가 나온다.
 


아무거나, 프로젝트 명칭을 입력한 후, 프로젝트를 생성한다.

2. 샘플 소스 복사

프로젝트 폴더 아래의 "src" 폴더에 "토스3" 샘플 CD 안에 들어있는 예제 소스를 복사해서 넣으면 된다.
{Sample Cd}\Part1\Ch1\1.5.1\src 폴더를 복사했다.


샘플 소스만 복사해 넣으면, 이클립스가 컴파일 오류를 알려준다.

3. 스프링 3 프레임워크 라이브러리 복사

Spring 3 Framework 라이브러리가 없으니 오류가 발생하는 것이 당연하다.
프로젝트 폴더 아래에 "lib" 폴더를 만든 후, 스프링 프레임워크 jar 파일들을 복사해 넣자.

덤으로, jar 파일들을 모두 선택한 후 컨텍스트 메뉴  (마우스 우클릭 메뉴)를 실행한 뒤에
"Build Path" -> "Add to Build Path"를 실행하면 된다.


이제 컴파일 오류는 사라질 것이다. 그런데 실행해보면 어떨까?
아래와 유사한 오류가 발생할 것이다....

Caused by: java.net.ConnectException: Connection refused: connect
 at java.net.PlainSocketImpl.socketConnect(Native Method)
 at java.net.PlainSocketImpl.doConnect(Unknown Source)
 at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.SocksSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.<init>(Unknown Source)
 at java.net.Socket.<init>(Unknown Source)
 at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
 at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
 ... 15 more

DAO 예제는 DB connect 및 insert, select 기능을 담고 있다.
그러니, MySQL 5.1 버전을 설치하자. 정상 동작하게 되면 아래와 같은 결과를 출력한다.



첫번째 샘플을 실행해보면서 얻은 결론은 간단한다.
스프링 3를 설치하고 사용하는데 필요한 노력은 아주 적다.
스프링 프레임워크 라이브러리 파일만 적절한 위치에 복사하고
빌드 경로(build path)에 추가하면 되는 것이다.

오히려, MySQL 설치하는데 드는 시간이 몇 배 들었다.
샘플 프로그램을 실행하기 위해서는 DB를 준비해야 한다.

윈도우 환경에서 MySQL 설치는 아래 사이트를 참조하자.
MySQL 최신 버전의 설치 과정도 거의 똑같다고 보면 된다.
문자셋(character set)은 꼭! 'utf8'로 설정하길 바란다.
다른 문자셋을 선택했다면 샘플 소스의 인코딩(encoding) 설정을 수정해야 하는데,
사소한 문제일 수도 있지만, 불필요한 시행착오는 피하는게 상책이다.

http://www.javajigi.net/pages/viewpage.action?pageId=419

DB 테이블 생성 및 계정 등록에 필요한 SQL 스크립트는 토스3 CD에 포함되어 있다.


Spring 3 적응기 #1 Development

"토비의 스프링 3"는 매우 방대한 분량을 담고 있다.

저술 기간이 3년이었다고 하는데, 책에 소개된 기술들의 면면을 보면, 10명의 개발자가 3년 동안 공동 학습해도 도달하기 쉽지 않을 듯 싶다. 그만큼 끝이 없다고 느껴질 정도로 깊고 또 넓은 분야의 기법과 노하우들이 소개되고 있다. 이런 책을 단기간에 마스터할 수 있을까? "토비의 스프링3"을 제대로 (혹은 거의 다) 이해하기 위해서 선행 학습해야 하는 책 리스트를 대충 뽑아 보아도 30권은 넘을 것 같다. 책에서 소개하고 있는 관련 기술들에 대한 책들을 모으면 백여권은 족히 넘을 듯 하다.

당장 스프링 3를 이용해서 패키지(혹은 솔루션)을 제작해야 한다. 주어진 시간이 별로 많지 않은 상황이지만, 어쨋든 제대로 스프링 3를 사용해보고 싶다는 의지를 가지고 있다. 어찌할텐가?

전부를 이해하거나 써먹을 수 없다면, 취사선택을 해야 한다. 무엇을 채택하고 무엇을 버릴 것인가? 일단, 토스3 (이하 "토비의 스프링 3"를 "토스3"라고 약칭으로 표현)의 목차를 흟어 보기로 했다. 목차를 읽어보니 무슨 말인지 모르는 단어가 너무 많다. J2EE 환경에서 오래 개발을 해오기는 했지만, 현실적인 제약으로 인해 몇 년간 제대로된 J2EE 개발을 못해봤다. (최근까지 Java 1.4 버전만으로 개발해야 했으니까... T.T)

목차만으로는 어떤 아이템들이 있는지 이해가 안가니 주마간산 격으로 내용을 읽어보기로 했다. 우선 "토스3"는 1부와 2부로 나뉘어져 있다. 1부의 제목은 "이해", 왜 스프링3를 써야하는지 실제 코드와 몇가지 OOP 원칙, 새로운 기법들을 나열하면서 도입의 당위성을 논하고 있다. 초보 혹은 스프링을 모르는 개발자들에게 자연스럽게 개념을 주입하고, 스프링의 필요성과 위대함을 세뇌(?) 시키려는 저자의 의도가 읽힌다. 샘플 예제들을 충분히 제공하고 있으니, 문장으로 이해가 안가는 사람은 코드를 주욱 읽어보면 되겠다. 다행스럽게 1부에 나온 내용들은 간간히 자바 개발 세미나에 참석하면서 어깨 너머로 얻은 지식 덕분에 술술 읽힌다. (가급적 바쁘더라도 기술 세미나는 계절마다 한번씩 가봐야 한다. 안그러면 아무리 영리한 개발자라도 갈라파고스 군도의 이구아나 꼴 된다...)

하지만, 1부에서도 5장 "서비스 추상화"와 6장 "AOP", 7장 "스프링 핵심기술의 응용"은 패스... 당장 써먹지 않을수도 있다는 예감이 들어서 말이다. 왜 패스했느냐? 직관(insight)이라고 해두자. 책에서 배우는 모든 기술을 꼭 써야 할 필요는 없다. 오히려, 공부하는 시간과 노력만 낭비하고 정작 제 때 구현 못하면 그게 더 큰 문제가 되어 버린다. (Time to Market이라는 용어를 개발자도 알아야 한다.) 8장은 엑기스인 듯하니... 정독했다. 그리고 예감이 맞았다.

정리하자면 바쁘시거나, 급하신 분이더라도 "토스3"의 1부에서 1장, 2장, 그리고 8장은 꼭 읽어보셔야 한다.

1장 "오브젝트와 의존관계"에서는 간단한 DAO 구현 예시를 들어 스프링3의 핵심 중의 핵심 기술(혹은 개념)들인 "제어의 역전(IoC)"을 잘 설명하고 있다. 다만, 객체지향의 5대 원칙 (SOLID), 디자인 패턴(design pattern), 그리고 리팩토링(refactoring) 기법에 대한 기본 이해가 없다면 상당히 난해하게 읽혀질 것이다. 1장부터 어려우면 부디 스프링 스터디 모임을 찾아가기 바란다. 괜히 머리 쥐어뜯으면서 시간 낭비하면, 인생을 갉아 먹고 자기비하에 빠지기 쉬운데다 자칫 우울증을 초래할 수 있다. 쉽게 말해 책 값보다 약 값이 더들게 된다. 아~ UML 다이어그램 중에서 클래스 다이어그램이 나오는데 잘 몰라도 상관없을 정도의 분량이다.

2장 "테스트"에서는 TDD(Test Driven Development) 개념을 설명하고, 스프링을 이용한 개발할 때, TDD 혹은 단위 테스트(Unit Test)를 어떻게 활용하는지를 설명한다. 잘나가는 개발자는 요구사항을 듣고 나서 닥치고 코딩할 줄 알고, 결과를 빨리 만들어 내는 사람이라 믿는 분라면 꼭 읽어보길 바란다. 원래 TDD도 제대로 공부하려면 2~3권 정도의 책을 읽어야 하는데, 토스3의 겨우 한 장(chapter)만으로 기본적인 감을 익힐 수 있다면 이 어찌 좋지 아니한가 말이다. 책 값과 시간을 많이 절약해 준다. 잘못 번역된 책 사놓고 끙끙대지 말고, 한국인 중 스프링 최고수가 쉬이 읇조리는 문장으로 스프링과 단위 테스트를 함께 공부하는 것이다. 둘 다 익힐 수 있으니 일석이조를 누리시라...

8장 "스프링 핵심 기술의 응용"은 엔터프라이즈 환경에서 개발해 쫌 해본 대한민국 거의 모든 자바 개발자의 가려운 등을 긁어준다. 8장을 읽어봤는데 별 감흥이 없으시다면 "토스3"를 더 이상 잃을 필요가 없다고 본다. 당신에게 필요한 기술이 아니기 때문이다. 책이 너무 두꺼워서 사기를 망설이는 분이라면 일단 빌려서라도 8장만 읽어보시라... (다만, 현장 경험이 별로 없는 사람이 읽으면 잘 와닿지 않을 수 있다.)

2부 "선택"의 내용을 소개하고 싶지만, 너무 깊이 들어가는 것 같아서 패스~

반나절 동안 대략적으로 책 전체 내용을 흟어본 후, "토스3"에서 얻어낼 꼭 필요한 기술은 무엇인가를 선택해 보았다. 웹 기반의 엔터프라이즈 어플리케이션을 개발하는데 있어, "토스3"(혹은 스프링3)에서 제시하는 선택 가능한 기술은 과장이 아니라 질릴 정도로 많다. (어찌 책 한권에 이리도 많은 내용을 담았는지...) 그중에 당장 J2EE 어플리케이션을 개발하는데 있어서 필요한 몇 가지 기술을 취사 선택해 보았다.

1. JUnit / 스프링 테스트
2. MVC + Rest
3. Domain Object Model
4. JPA (Java Persistent API)

스프링을 설치하고 개발환경을 구축하는 것은 기본이고...
앞으로 "토스3"를 바탕으로 위 4가지 기술들을 어떻게 습득했는지, 스프링 3 적응기를 써보려고 한다.

아! 참! 토스3는 스프링을 "소개"하는 책이다. 즉, 스프링의 특징, 장점, 활용 방안들을 이야기하고 있는 것이다. 바로 읽고 바로 써먹을 수 있는 책이 아니다. 책 펼쳐놓고 몇 페이지 읽고 나서 바로 웹 어플리케이션 혹은 엔터프라이즈급 프로젝트 실전에 당장 써먹으려 한다면 부디 자중하시라. 첫 페이지에서부터 실망할 터이니... 지금부터 정리하려는 글은 "토스3"를 한 번 읽어 봤다고 가정한 상태에서 실전에 적용하는 과정, 즉 "토스3" 응용 및 활용 가이드가 되겠다.

1 2 3 4 5 6 7 8 9 10 다음


평생을 소걸음으로...

Mail : sunnykwak@hanmail.net
NateOn : sunnykwak@nate.com
Me2day : sunnykwak




대체로 무해한 30대 남성.

잘못된 내용에 대한 지적 혹은 의견은 트랙백으로~
기타 의견 및 연락은 메일 등...