Whiteship's Note


Spring 2.5 OSGi 번들형태의 JAR

Spring/Chapter 2 : 2008.02.13 17:21


요즘 하이버네이트를 2쩜대에서 3.2버전으로 마이그레이션하는 작업을 했습니다. 물론 그와 동시에 스프링도 2쩜대에서 2.5로 올리는 작업을 했는데 스프링은 정말 편했습니다. 필요한 라이브러리만 바꿔주면 되니까요. 그런데 하이버네이트는... 나중에 언급하겠습니다. 어쨋든 지금은 스프링만 생각해보겠습니다.

Spring 2.5 전에는 spring.jar, commons-logging.jar 파일만 넣어주면 만사 OK 였습니다. 저 같은 경우는 spring-mock.jar도 단골손님이었습니다.

그런데 Spring 2.5부터는 약간 바꼈습니다. OSGi에서 바로 사용할 수 있는 번들 형태로 배포한 것이 Spring 2.5의 가장 큰 변경 사항 중 하나인 것 같습니다.

그래서 Spring 2.0 에서 Spring 2.5로 올리시려면 Spring 2.5 JAR 패키지들을 조금 살펴봐야합니다. 조금만 보면 됩니다.

사용자 삽입 이미지

spring.jar에 포함되어 있지 않은 라이브러리

- spring-webmvc.jar: 컨트롤러들, 핸들러 맵퍼, DispatcherServlet 등 Spring MVC 관련 라이브러리는 dist/modules/spring-webmvc.jar에 들어있습니다.
- spring-test.jar: spring-mock.jar에 들어있던 모든 것들을 가지고 있습니다. 애노테이션 기반의 테스팅 라이브러리가 추가되었습니다.
- spring-webmvc-portlet.jar
- spring-webmvc-struts.jar

spring.jar에 포함되어 있는 라이브러리

- spring-aop
- spring-beans
- spring-context
- spring-context-support
- spring-core
- spring-jdbc
- spring-jms
- spring-orm
- spring-tx
- spring-web

OSGi 번들 형태로 배포하려면 JAR파일의 META-INF에 있는 MANIFEST.MF에서 노출 시키거나 가져와서 사용할 패지키를 명시해 두어야 하는데, 위에서 언급했던 모든 JAR파일들의 MANIFEST.MF 파일을 모두 Spring Source에서 손봐두었기 때문에, OSGi 번들로 사용할 때 별도의 작업을 하지 않아도 됩니다.

결론
if(나는 좀 귀찮다.) {  // 강추(쉽고, 간단)
    dist/spring.jar 추가.
    if(스프링 MVC를 사용 한다.)
        dist/modules/spring-webmvc.jar 추가.
    if(테스트 한다.)
        dist/modules/spring-test.jar 추가.
} else {  // 비추(라이브러리를 패키지 명까지 빠삭하게 알고 계신다 하더라도.. 귀찮은 작업..)
    dist/modules/ 폴더에서 사용하는 라이브러리를 담고 있는 JAR만 추가.
}

'Spring > Chapter 2' 카테고리의 다른 글

Spring 2.5 OSGi 번들형태의 JAR  (2) 2008.02.13
What's new in Spring 2.0 and Spring 2.5?  (0) 2007.11.21
Spring 2.0 소개 참고자료  (0) 2007.03.03
top


Eclipse가 빌드경로에 추가해주는 JAR 파일 바꾸기

Good Tools : 2008.01.09 00:32


스프링 2.5를 사용하시는 분들은 애노테이션 기반의 테스트를 작성하실 때 한 가지 귀찮은 에러를 맞닥드리게 되어 있습니다. 그건 바로 @RunWith라는 JUnit 애노테이션과 관련이 있습니다.

Spring-Test는 JUnit 4.4를 필요로 합니다. lib/junit 폴더에 가시면 junit4.4.jar 파일이 보이는 걸 보아 짐작할 수 있습니다. 그러나 Eclipse 3.3에서 기본으로 제공하는 JUnit은 4.3 버전입니다. 따라서 Eclipse가 빌드경로에 추가해주는 JUnit4를 사용하면 spring-test.jar가 사용해야 하는 라이브러리 버전이 아니기 때문에 에러가 발생합니다.

해결하는 방법은 간단합니다. Eclipse에서 자동완성으로 Junit 4를 넣지 않고 직접 lib/junit 폴더에 가서 jar 파일을 복사해서 넣어주면 됩니다.

이게 귀찮고 이전처럼 자동완성에서 JUnit 4를 빌드패스에 추가해서 사용하고 싶으신 분들은 한 번의 약간 큰 고생을 해주셔야 합니다.
사용자 삽입 이미지

바로 Eclipse 설치 폴더의 eclipse\plugins\org.junit4_4.3.1 폴더로 이동하셔서 그곳에 위치한 junit.jar 파일을 lib/junit 폴더의 junit4.4.jar 파일로 교채해 주는 것입니다. 물론 파일 이름도 junit4.4.jar 에서 junit.jar 로 바꿔줘야겠죠.
사용자 삽입 이미지

그러면 이제 이전처럼 퀵 픽스를 이용해서 JUnit4를 빌드패스에 추가하더라도 에러가 발생하지 않습니다.
사용자 삽입 이미지

이런 노가다도 Eclispe 3.4가 나오면 하지 않아도 될 것 같습니다.

이렇게 라이브러리 가지고 씨름을 하다보면 정말 Maven의 Archetype이 부러울따름입니다. 문제는 Maven을 처음 실행하고 첫 프로젝트의 Archetype 받을 때 시간이 너무 오래걸려서 탈입니다. pom.xml로 정의해둔 라이브러리들 마저 꼬이는 경우도 있고, 그냥 베이스 프로젝트 하나를 zip파일로 묶어 두던가 하는게 속편할 듯 합니다. 이상하게 얘기가 새고 있는데 이쯤에서 멈추고 자야겠습니다.

top


Spring 애노테이션 기반 통합 테스트 작성하기

Spring/Chapter 8 : 2008.01.02 15:28


http://static.springframework.org/spring/docs/2.5.x/reference/testing.html#testcontext-tx

스프링이 제공하는 통합 테스트 용 클래스들은 매우 유용합니다. 특히 DAO를 테스트 할 때 자동 롤백은 정말이지 고마움까지 느껴질 정도로 애착이 갑니다. 그러나 한 가지 단점이 있다면, 이름이 너무 길다는 것이 단점입니다.

AbstractTransactionalDataSourceSpringContextTests

거의 40자 입니다. 이것을 외워서 타이핑 하다가는 오타나기 딱 좋습니다. 다행히 Eclipse의 자동완성 기능을 사용하면 AbstractT 까지만 입력하면 해당 클래스를 입력할 수 있습니다.

이 클래스는 내부적으로 DataSource를 필요로 하고, 이 클래스의 상위 클래스인 AbstractTransactionalSpringContextTests 이녀석은 PlatformTransactionManager를 필요로 합니다. 이 두 개를 가지고 테스트 케이스를 트랜잭션 처리해 주는 일을 합니다.
사용자 삽입 이미지
스프링에서 트랜잭션 처리를 선언적으로 하는 방법이 두 가지 있는데, 하나는 XML이고, 하나는 애노테이션을 사용하는 방법입니다. XML은 역시 다 잊어버려서 레퍼런스를 찾아봐야합니다. 애노테이션은 그나마 기억하기가 매우 쉽습니다. @Transactional 이라는 것만 붙여주면 되죠.

이야기가 더 새기전에 마무리 해야겠습니다.

결론만 말씀드리면, Spring 2.5부터는 AbstractTransactionalDataSourceSpringContextTests를 쓰는 대신에 @Transactional과 @TransactionConfiguration을 사용해서 같은 기능을 하는 테스트 클래스를 작성할 수 있습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class DaoTest {

    @BeforeTransaction
    public void beforeTransation() {
        System.out.println("before transation");
    }

    @Before
    public void before() {
        System.out.println("before");
    }

    @After
    public void after() {
        System.out.println("after");
    }

    @AfterTransaction
    public void afterTransaction() {
        System.out.println("after transaction");
    }

    @Test
    public void transactionalTest() throws Exception {
        System.out.println("This is a transactional test");
    }

    @Test
    @NotTransactional
    public void testname() throws Exception {
        System.out.println("This is not a transactional test");
    }

}

애노테이션의 이름을 보고 어떤 결과가 출력될지 예상해 보세요. 정답은 접어 둡니다.

more..


이밖에도, @Rollback 애노테이션으로 특정 테스트 케이스를 롤백할지 말지 설정할 수도 있습니다.
top


Spring is About Choice

Spring/KSUG : 2007.12.23 01:03


이 메모도 역시 토비님 발표를 들으며 요약한 내용입니다. 첫 번째 세션에서 엉뚱한 대답들을 하느라 무안했지만, 기억하는데에는 망신당하는 것이 최고였습니다.

틀린 내용
1. DesposableBean, destroy-method, @PreDestroy 의 메소드 실행 여부 확인 안 되는 이유.
    테스트 하는 Main 메소드가 BeanFactory가 내려가기 전에 끝나서...라고 말하고 싶었는데 뭐라고 말을 한건지도 모르겠네요. -_-;;
    ac.close(); 사용하면 볼 수 있음.
2. Autowiring 종류에 default는 없슴. auto-detect.
3. 딴짓(여친과 문자)하느라 질문 내용도 못들음...-_-;;;
    정답이 bean이였던걸로 유추하면 2.5에 새로추가된 pointcut 표현식을 물어보셨었나..라고 생각이 됩니다.

요약
스프링 컨테이너의 역할
    컴포넌트 모델 지원
    공통의 기반 제공
    컴포넌트에 다양한 가치 부여
        AOP, 트랜잭션, ...

Spring is About Choice
    스프링은 만능 솔루션을 강요하지 않아. 항상 선택할 수 있으며, 책임이 뒤따른다.

애노테이션 설정

IoC/DI : 컨테이너가 객체들 관리해준다.
    생성, 설정, 데코레이션, 어샘블, ...
    BeanDefinition : <bean>에 의해 만들어지는 정보

Spring 2.5
    Field Injection
    Multi Param Method

@Resource
    자바스팩에서는 JNDI vs 스프링에서는 Bean 이름
    property 태그 대체
    디포트 이름은 Java Bean 규약에 따른 이름사용.

필드 인젝션 단점은??

고급설정
    CommonAnnotationBeanPostProcessor 직접 등록하고 속성 설정.
    init/dest 애노테이션 이름 설정 가능   

@PostConstruct
    void 리턴
    파라미터 없애고, 체크드 익셉션 던지면 안돼
@PreDestroy
    컨테이너를 명시적으로 닫아줘야 돼.
    ac.close();

@Autowired
    기본으로 byType
    메소드는 아무이름이나 가져도 된다.
    AutowiredAnnotationBeanPostProcessor
    <context:annotation-config />
    Fine Grained 됐다. 프로퍼티 별로.
    한 번에 여러개 주입 가능.(구글 쥬스에서 따옴)

그럼 두 개의 타입은 못쓰느냐?
    @Qualifier("fileFinder")
    <qualifier value || type />
        메타 애노테이션
    스프링 레퍼런스 참조

required default
primary
custom annotation
component scanning

기본 컴포넌트
@Component
    컴포넌트 스캐너 = <context:component-scan base-pachage="" />
        include filter(annotation, assignable, aspectj, regex)
    메타에노테이션으로 사용가능.
        @Repository, @Service, @Controller, ...
        AOP 적용할 때 유리해.
        value는 꼭 있어야 돼.

XML 수정시 SCM 충돌 괴롭지 아니한가

@Scope

ClassPathBeanDefinitionScanner 쓰면 xml 하나도 안써도 돼.

RAR : 데몬 서비스 패치
    JMS

AspectJ LTW가 성능 좋아
    트랜잭션에 mode로 LTW 사용가능

실습할 내용
1. @Resource와 @Autowired 언제 어떤걸 사용할까?
2. 트랜잭션 처리할 때 LTW 적용
3. 필드 인젝션 단점은 뭘까?
4. 메타 애노테이션과 Spring AOP에서 포인트컷 표현식의 조화

top


Spring 2.5 MVC 요약

Spring/KSUG : 2007.12.23 00:30


토비님 발표를 들으며 요약한 내용입니다. 많은 걸 적을 순 없었습니다. 어차피 PPT가 KSUG 사이트에 올라올테니 그걸 기다려봅니다.

@Controller

@RequestMapping
    method level에서 narrowing.
        value, method, params
    파라미터와 리턴타입의 자동인식

    리턴값
    파라미터

@RequestParam
    이름이 다를 경우에만 사용
    URL 파라미터 받아오기

@ModelAttribute : 커맨드 객체, 레퍼런스 데이터

@SessionAttribute : 세션폼
    SessionStatus.setComplete();

@InitBinder : 커스텀 프로퍼티 에디터
    WebDataBinder

POJO 컨트롤러 테스트 가능
FlowContext를 이용한 flow control 가능
@PathElement REST 스타일... good! 빨리 나와주길 바래.

실습해볼 것
Spring MVC 예제 만들기(실습 과정을 동영상으로 찍어볼까~ 흠..)
    1. 컨트롤러 하나로 MultiAction + SimpleForm 역할하기
    2. 프로퍼티 에디터 사용하기
    3. 파라미터에서 값 가져오기
    4. 세션 객체 사용하기

이전에 공부했던 내용
2007/11/28 - [Spring/Chapter 13] - Annotation-based controller configuration

top