귿!! OSGi위에 웹 애플리케이션 돌리기 성공 with Spring DM

사용자 삽입 이미지
위 그림 한장이면 돌리는 방법은 끝나죠.

맨 아래 보이는 녀석이 Spring DM 받으면 src/sample에 들어있는 웹 애플리케이션입니다. 자세한 내용은 좀 더 공부해야겠지만 일단 예제를 돌려서 기쁘네요.


현재 Servlet 까지는 됐는데, JSP는 아직 안 됩니다. 이것 저것 만지다보면 될 것 같네요.

웹 애플리케이션과 OSGi

참조 : http://blog.springsource.com/main/2008/04/29/web-applications-and-osgi/

왜 WAR를 OSGi에 배포하려는가?

쉬운 질문이군. OSGi는 기본적으로 버전잉과 패키지 엮기 그리고 핫 릴로딩을 지원한다. 여러분의 애플리케이션이 이런 장점들을 얻을 수 있다는 것을 상상해보라. .. 나머진 생략 ..

왜 웹 애플리케이션이 OSGi에서 문제가 되는가?

– Servlet 스펙은 웹 컨테이너를 기준으로 하고있다. 라이프 사이클 관리, 동시성, HTTP 요청 처리 등고 같은 표준 서비스를 제공하는 웹 구성요소다.
– OSGi 플랫폼은 서비스 레지스트리, 패키지 엮기, 버전잉과 같은 managed environment다.
– OSGI는 서블릿을 지원하기 위해 HTTP Service를 설계했다.
– 위의 API를 통해서 간단하게 서블릿을 등록할 수 있다.
– 서블릿이 OSGi 내부에서 요청을 처리하려면, 반드시 프로그래밍을 좀 해서programmatically 서블릿 객체를 만들고 적당한 API를 통해서 등록을 해야한다. 게다가 HTTP 서비스는 오직 서블릿 2.1 스펙만 지원한다.
– 이 문제를 다음과 같이 해결할 수 있다.
    – web.xml을 해석하는 등의 선언적인 방법을 통해서 코딩 줄이기
    – 표준 API를 확장하거나 2.1 API 위에 뭔가 더 만들어서 Servlet 2.1 이상의 기능을 제공하기
– Spring DM은 위와는 다르고 독특한 접근 방법을 체택했다.

웹 컨테이너를 직접 통합하기

– Spring-DM은 OSGi와 컨테이너 사이의 다리 역할을 한다.
– WAR를 그냥 컨테이너에 배포하듯이 배포하면 된다.
– OSGi와 컨테이너 둘 다 크게 변경될 것이 없다.
– Spring DM은 다음과 같은 것들을 지원한다.
    – 서블릿 2.4/2.5, JSP 2.0/2.1 스펙 지원
    – availability of the container capabilities (blocking vs non-blocking IO, allocated threads in the thread pool and so on)
    – web.xml 을 사용한다. 이걸 Spring DM이 파싱하는게 아니라 컨테이너에게 그 일을 위임한다. 원래 하던 녀석이 잘 할테니까..
    – 컨테이너 스펙 설정 파일(톰캣의 META-INF/context.xml 과 같은..)
– 현재 톰캣 5.5.x/6.0.x 와 제티 6.1.x 이상의 버전의 컨테이너를 사용할 수 있다.
– 웹 컨테이너가 웹 애플리케이션을 관리하고 컨테이너가 지원하는 모든 것들은 OSGi 번들들에게 가용하다.

1.1 최종판이 아직 발표되진 않았지만, M2를 접해보길 권장한다. 상당히 그대로 배포될 가능성이 많은 API들이며 새 기능들은 문서화해두었다. 도움이 필요하면 포럼으로 오고 메일링 리스트를 이용하라. 마지막으로 자바원에 온다면 SpringSource 부스에서 만나볼 수 있다.

ps: 알았다. 오바.

Spring DM에 Spring MVC 연동 기능 추가됨.

참조 : http://static.springframework.org/osgi/docs/1.1.0-m2/reference/html/web.html#web:spring-mvc

1.1.0 M2가 나왔습니다. 눈에 띄는 변화는 단연 Web쪽 기능 추가. 자세한 내용은 레퍼런스를 보라고하지만, 레퍼런스보다 예제코드가 더 배고픈데 말이죠.

오늘 밤은 스프링 DM과 함께~

ek010000000000.mp3
스프링은 역시 멋져부러~

EasyMock 사용할 때 주의 할 것

    public void foo(Bar bar) {
        …
        
        bar.toby(whiteship);
        bar.whiteship(toby);
    }

위와 같은 메소드를 테스트 할 때 EasyMock을 사용해서 다음과 같은 테스트를 작성할 수 있습니다.

@Test
public void foo(){
   Bar mockBar = createMock(Bar.class);
   …
   mockBar.toby(whiteship);
   mockBar.whiteship(toby);
   replay(mockBar);
   a.foo(mockBar);
   verify(mockBar);
}

테스트가 통과할 것만 같은 코드입니다. 그렇쵸? 대부분은 테스트가 통과 합니다. 그런데 통과하지 않는 경우도 있습니다.

java.lang.IllegalStateException: missing behavior definition for the preceeding method call toby(whiteship);

이런 메시지와 함께 테스트가 통과하지 않습니다.

그럴 때는 뭘 확인해 봐야 할까요? Bar 인터페이스에 있는 whiteship과 foo라는 메소드의 리턴타입이 있는지 확인해봐야 합니다. 리턴타입이 있으면 http://whiteship.tistory.com/1504