토비의 스프링 3 학습한 내용을 정리해 보았습니다.
Spring 적응기 #1 - 책 전체 리뷰 및 간략한 감상.
Spring 적응기 #4 - 아주 간단한 웹 어플리케이션
아직 공부하는 중이라서 내용이 추가될 것 같습니다....
일부 내용은 원저자의 요청에 따라 삭제될 수도 있습니다.
토비의 스프링 3 학습한 내용을 정리해 보았습니다.
Spring 적응기 #1 - 책 전체 리뷰 및 간략한 감상.
Spring 적응기 #4 - 아주 간단한 웹 어플리케이션
아직 공부하는 중이라서 내용이 추가될 것 같습니다....
일부 내용은 원저자의 요청에 따라 삭제될 수도 있습니다.





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

<?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>

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;
}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");
}
}

스프링 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" 메뉴를 선택하자. 아래와 같은 마법사 다이얼로그가 나온다.




최근 덧글