아직 2.5.6도 제대로 써먹고 있지 못한데 벌써 떡하니 3.0이 나와버렸다 -.-
infoQ에 올라온 기사를 보니 대략 바뀐점은 다음과 같고 Spring MVC REST지원이 가장 눈에 들어온다.

1. Java 5 기반
   - 코어 API들이 제너릭, 애너테이션과 같은 자바5의 기술들을 쓰도록 변경됨

2. Spring Expression Language (SpEL)
   - Unified EL과 비슷하지만 더 많은 기능을 제공하는 표현식 언어라고 함(뭐하는건지는 잘 모르겠다)

3. Extended support for annotation-based components
   - Spring javaconfig 기능이 코어 기능으로 통합(아마도 이 기능에 의해서 @Configuration, @Bean, @DependsOn, @Primary, @Lazy, @Import, @ImportResource, @Value 같은 애너테이션이 가능한 듯 하다)

4. Declarative model validation using constraint annotations
   - JSR 303 지원기능이 추가되었고 @NotNull, @Max(23)과 같은 애너테이션으로 validation룰을 선언적으로 빈에추가할수 있음

5. Comprehensive REST support in Spring MVC
   - Spring MVC REST 지원 확대

6. Java EE 6 support
   - JPA2.0, JSF2.0 과 같은 Java EE 6 기능을 지원하며 이와같은 기능들이 톰캣이나 J2EE1.4 어플리케이션서버에서 동작가능하도록 함

7. JSR 330 support
   - JSR 330 에서 소개된 javax.inject 애너테이션 지원

8. Annotation-based formatting
   - 빈의 필드들을 @DateTimeFormat(iso=ISO.DATE)나 @NumberFormat(style=Style.CURRENCY)와 같은 애너테이션을 이용함으로써 자동적으로 변환할 수 있는 기능 추가



스프링에는 많은 프로젝트가 포함되어 있고 또 성공하고 있다. 그 중에서도 SI 프로젝트가 대세인 우리나라에서도 크게 히트 친 프로젝트가 있으니 그것은 바로 Spring Batch!
이미 보험사 등 대용량 데이터베이스 환경에서 적용이 입증된 것 같다.
아래는 KSUG의 정상혁님이 KSUG블로그에 올리신 관련 글 모음이다. 언제 다 공부하지 --;

http://www.ksug.org/94



quartz 스케쥴러를 디폴트로 띄우게 되면 총 10개의 worker 쓰레드가 돌기 시작하는데 10개의 쓰레드가 메모리 낭비와 overflow 오류를 유발할 수 있다. 그때는 스프링설정파일에 다음과 같이 quartzProperties를 설정함으로써 메모리 낭비를 줄일 수 있다.
	
		
			
				
				
				
			
		
		
			
			     org.quartz.simpl.SimpleThreadPool
			    1
			    5
			
		 		
	

참고사이트 : http://infomint.blogspot.com/2009/06/solving-memory-problem-in-quartz.html


KSUG에서 주관했던 Spring 교육이 어제 끝났다.
원래 한번도 안빠지고 다 참석하려고 했으나 5주차 교육에 빠져서 달성하지는 못했다.
강의는 KSUG의 박찬욱님이 진행하셨는데 교육내용도 알찼고 내용전달이 잘 된 것 같다.
특히 SpingIDE나 각종 단축키콤보도 아주 유용했다.
혹시나 관심있으신 분들은 똑같은 과정으로 다시 8월초에 신청을 받는다고 하니 주의깊게 모니터링 하시면 좋을 듯.

KSUG - http://groups.google.com/group/ksug

이제 한달정도는 교육이고 뭐고 없이 푹쉬었다가 선선해질때 쯤 영어학원이나 다녀야 겠다.

OSGi를 이용한 Java Enterprise Application 개발
http://www.ibm.com/developerworks/kr/library/dwcod/

Spring-OSGi 시작하기 - OSGi
http://toby.epril.com/?p=365


스프링2.5에서는 annotation기반으로 설정을 할 수 있기 때문에 기존의 xml설정 지옥에서 해방될 수 있었다.
그중에서도 단연 돋보이는 부분이 컨트롤러 부분인데 annotation 때문에 단위테스트를 하기가 더 쉬어졌다.
다음은 Spring in action에 있던 컨트롤러 부분을 annotation기반으로 바꾼 예제다.
 
package com.roadrantz.mvc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.roadrantz.service.RantService;

@Controller
@RequestMapping("/home.htm")
public class HomePageController {
   @RequestMapping(method = RequestMethod.GET)
   public String showHomePage(Map model) {
      model.put("rantList", rantService.getRecentRants());

      return "home";
   }
   @Autowired
   RantService rantService;
}

위와같이 서비스계층은 autowired 어노테이션을 통해 자동 전달되고 url은 /home.htm 으로 매핑되는것을 볼 수 있다.
또한 @Controller 어노테이션을 통해 이 클래스가 SpringMVC의 controller라는 걸 확인시켜 준다.
특이한 것은 ui계층임에도 불구하고 ServletRequest나 ServletResponse와의 연관이 없다는 것이다.
이점이 단위테스트를 더 쉽게 한다.
모델을 뷰단으로 전달할 때도 자바의 기본 클래스인 HashMap을 통해 뷰단으로 전달되는 것을 보게 되는게 HashMap은 단위테스트에서도 아주 쉽게 사용할 수 있다.
다음은 위 클래스의 단위테스트 코드

 
package com.roadrantz.mvc;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.ui.ModelMap;
import com.roadrantz.domain.Rant;

public class HomePageControllerTest {
   private HomePageController controller;

   @Before
   public void setup() {
      controller = new HomePageController();
      controller.rantService = new FakeRantService();
   }

   @Test
   @SuppressWarnings("unchecked")
   public void shouldShowHomePageWithRecentRants() {
      ModelMap model = new ModelMap();
      assertEquals("home", controller.showHomePage(model));

      List rants = (List<Rant>) model.get("rantList");

      assertNotNull(rants);
      assertEquals(3, rants.size());
      assertEquals("Rant 1", rants.get(0).getRantText());
      assertEquals("Rant 2", rants.get(1).getRantText());
      assertEquals("Rant 3", rants.get(2).getRantText());
   }
}

서블릿관련 클래스와 연관관계가 없기 때문에 일단 객체 생성이 쉽다. 그냥 new 하면 된다 -.-
그리고 서비스계층만 Faking하는것을 볼 수있다.
만약 ServletRequest나 ServletResponse 와의 관계가 있다면 이 클래스를 Mocking하는 클래스를 설정해야 만 했을것이다.

아무튼 스프링2.5 로 넘어오면서부터 SpringMVC도 많이 편해진것 같다.

원문보기

다음은 3/31 일날 있었던 온라인 컨퍼런스 링크. 강사는 KSUG의 안영회님이고 프로젝트에 개발자 단위테스트를 성공적으로 도입한 경험담 위주로 진행.

Spring Framework 테스팅 기법


메이븐2를 이용하는 경우 스프링을 빌드에 추가하는 방법은 간단하다. 관련 스프링 jar 파일 정보를 프로젝트의 pom.xml파일에 추가하기만 하면 되는 것이다.
xml파일에 추가할 형식은 maven repository  같은 곳에서 artifact id로 검색하면 쉽게 알 수 있다.
또는 m2eclipse와 같은 플러그인을 이용해 다음과 같이 ui상에서 추가할 수도 있다.


      그룹ID -  org.springframework

    Artifact Id     Description
 spring
 spring-aop
 spring-aspects

 spring-beans
 spring-context
 spring-core
 spring-dao
 spring-hibernate2
 spring-hibernate3
 spring-ibatis
 spring-jca
 spring-jdbc
 spring-jdo
 spring-jms
 spring-jmx
 spring-jpa
 spring-mock
 spring-ojb
 spring-portlet
 spring-remoting
 spring-struts
 spring-support
 spring-toplink
 spring-web
 spring-webmvc

  거의 모든 스프링 프레임워크
  스프링 AOP프레임워크
  스프링에서 구성된 애스펙트와 AspectJ 트랜잭션 관련 애스펙트
  등 AspectJ 애스펙트 라이브러리
  스프링 빈팩토리와 관련 클래스
  스프링 애플리케이션 컨텍스트와 관련 클래스
  코어 스프링 프레임워크
  스프링의 DAO 추상화 프레임워크
  스프링의 하이버네이트 2 지원
  스프링의 하이버네이트 3 지원
  스프링의 iBATIS 지원
  스프링의 JCA 지원
  스프링의 JDBC 추상화 프레임워크
  스프링의 JDO 지원
  스프링의 JMS API 지원
  스프링의 JMX 지원
  스프링의 JPA 지원
  스프링의 단위 테스트 및 모조 객체 지원
  스프링의 아파치 ORB 지원
  스프링의 포틀릿 MVC 프레임워크
  스프링의 리모팅 지원
  스프링과 스트럿츠 통합
  지원 및 유틸리티 클래스
  스프링의 오라클 탑링크 지원
  스프링의 웹 애플리케이션 컨텍스트와 유틸리티
  스프링의 웹 MVC 프레임워크