Whiteship's Note


Spring Dynamic Modules Maven Archetype

Spring DM/Appendix D : 2008.07.09 11:16


스프링 DM은 메이븐 아키타입archetype을 제공하여 스프링 DM 번들 개발 시에 사용할 수 있는 자바 프로젝트 기본 틀을 제공한다. 아키타입을 실행하려면 다음의 명령어를 사용하면 된다.

mvn archetype:generate

메이븐 플러그인이 가용한 archetype을 보여줄 것이다. 그 중에서 spring-osgi-bundle-archetype을 선택하면 된다.(현재 32번으로 설정되어 있다.) 그리고 프로젝트에 필요한 몇 가지 정보를 입력한다.(그룹id, 아티팩트id, 버전, 패키지) 가용한 모든 아키타입과 버전은 여기를 참조하라.

물론 archetype:create를 사용해서 직접 아키타입을 설정하여 프로젝트를 생성할 수도 있다.

mvn archetype:create \
-DarchetypeGroupId=org.springframework.osgi \
-DarchetypeArtifactId=spring-osgi-bundle-archetype \
-DarchetypeVersion=   \
-DgroupId=<your-project-groupId>  \
-DartifactId=<your-project-artifactId> \
-Dversion=<your-project-version>

(과연 누가 저렇게 쓸까;;; 오타 없아 커맨드 창에 저걸 전부 입력 할 수 있는 사람~?)

둘 모두 같은 프로젝트 구조를 생성해준다. 그 안에 두 개의 스프링 설정 파일 src/main/resources/META-INF/spring/bundle-context.xml 와 src/main/resources/META-INF/spring/bundle-context-osgi.xml 가 있다. 프로젝트는 OSGi 번들로 패키지 형태가 설정되어 있다.

프로젝트에 MANIFEST.MF 파일이 없는데, 이 건 메이븐의 bnd 플러그인으로 자동 생성한다. 따라서 번들을 생성하고 싶으면 다음과 같이 하면 된다.

mvn package

번들 말고, MANIFEST.MF 파일만 생성하고 싶을 때는 다음과 같이 한다.

mvn org.apache.felix:maven-bundle-plugin:manifest

D.1. 생성한 프로젝트 살펴보기
  • OSGi 번들로 패키징 함.
  • MATA-INF/MANIFEST.MF 는 자동 생성함.
  • src/main/java/<package> 번들이 공개할 패키지
  • src/main/java/<package>/internal 번들이 공개하지 않을 패키지
  • src/main/resources/META-INF/spring/bundle-context.xml 번들 내부에서 사용할 스프링 설정 파일
  • src/main/resources/META-INF/spring/bundle-context-osgi.xml OSGI 관련 스프링 설정 파일
  • .project, .classpath, 그리고 build.properties 파일은 이 프로젝트를 이클립스 PDE 플러긴 프로젝트로 인식하게 해 줌.



'Spring DM > Appendix D' 카테고리의 다른 글

Spring Dynamic Modules Maven Archetype  (0) 2008.07.09
top


Spring DM, Eclipse 플러그인 개발 환경에 통합하기

Spring DM/Appendix C : 2008.07.09 10:32


참조: http://static.springframework.org/osgi/docs/current/reference/html/appendix-pde-integration.html

레퍼런스대로 하면, 잘 안 될 겁니다. Spring DM 최신 버전도 못 쓰고 말이죠. Spring DM 때문에 Spring IDE를 설치해야 하는 것도 아닌데, Spring DM 레퍼런스 이 부분은 별로 네요. 그래서 제 맘대로 다시 작성합니다.

Eclipse의 Target Platform에 Spring DM 관련 번들들을 설정 해 놓고 손 쉽게 Equinox위에서 해당 번들들을 돌릴 환경을 마련하는 과정입니다. 간단합니다.

먼저 Spring DM 프로젝트를 다운로드 합니다.

http://www.springframework.org/osgi

압축을 풀고, lib과 dist에 있는 모든 번들들(*source*가 들어간건 제외합니다. 소스는 필요 없습니다.)을 복사해서 특정 폴더 하나로 이동시켜둡니다.

사용자 삽입 이미지

그리고 Eclipse의 Target Platform 설정으로 들어가서 해당 폴더를 Location으로 잡아주고, Reload 버튼을 클릭합니다. 환경 설정은 끝났습니다.

사용자 삽입 이미지

이제 Equinox를 실행해보죠.

사용자 삽입 이미지

흠.. 뭐 별게 없스니다. 왼쪽에 있는 서브 메뉴에서 OSGi Framework을 더블클릭해서 새로운 Run Configuration 인스턴스를 만들고 이름을 Spring DM이라고 지어줬습니다. 번들들은 알아서 Target Platform에 설정해 둔것들을 로딩해 왔을 겁니다. Apply를 클릭하고 Run을 클릭합니다.

번들들의 상태와 Equinox 명령어를 확인해보죠.

사용자 삽입 이미지

test랑 jetty fragment는 resolved 상태로 되어 있네요. test 번들은 저렇게 설치할 용도로 만들어진게 아니니까 폴더에서 빼줘야 될 것 같네요. jetty fragment는 나중에 Jetty를 서브릿 컨테이너로 사용할 때 제티 설정을 변경할 수 있는 번들이니까 뭐.. 일단 내비둬도 상관없겠네요.

중요한 건, Extender가 제대로 동작 중이냐 입니다. 번들 ID 3번으로 잘 동작하고 있군요. Spring DM에서 가장 중요한 번들이 Extender입니다. 좀 더 자세히 봐볼까요?

사용자 삽입 이미지

흠.. 확실히 콘솔 명령어는 Felix보다 Equinox가 좀 더 많고 편합니다.

'Spring DM > Appendix C' 카테고리의 다른 글

Spring DM, Eclipse 플러그인 개발 환경에 통합하기  (0) 2008.07.09
top


웃음 바이러스

모하니?/Watching : 2008.07.09 08:19




이거 보면서 웃음을 참아 보라는데.. 도무지 못 참겠네요. 얘기 웃음은 '뭐야~' 그러면서 넘어갔는데, 흑형의 저음 때문에 피식 웃었다가 할아버지 웃음 소리 때문에 아주 죽겠네요. 뒤집어졌습니다.

이런 바이러스는 얼마든지 퍼져도 좋을 것 같습니다.
top


상태 기반 테스트란?

모하니?/Coding : 2008.07.08 20:16


참조 : http://blog.jayfields.com/2008/02/state-based-testing.html

번역 및 요약 및 편역

테스트 대상이 되는 객체에 있는 여러 메소드들을 호출 한 뒤에 객체의 상태를 확인해보는 테스트 기법이다. 테스트 코드가 테스트 대상의 세부 구현 내역에 대해 보더 덜 상세하게 알아도 된다. 따라서, 테스트 대상이 되는 코드의 구현 내용이 바뀐다 하더라도 결과 상태만 같으면 해당 테스트 코드는 깨지지 않고 유지 된다.

사족

흠.. 확실히 EasyMock을 사용할 때는 테스트 대상이 참조하는 객체를 Mock으로 만들고 그 Mock이 어떻게 행동할지를 일일히 세부적으로 순서까지 맞춰가면서 결과값까지 예측, 혹은 녹화를 해줬어야 테스트가 동작을 했습니다. 그래서 테스트 대상이 되는 메소드가 혹시 해당 객체에서 다른 메소드를 호출하거나 호출 순서를 약간 조정하면 해당 테스트를 깨지는 사태가 종종 발생했습니다. 불편했죠. 테스트 만들기도 빡쌨고, 이런식의 코드로 어떻게 (순수) TDD를 하나 싶었습니다. '차라리 이럴바엔 바로 구현을 하지... 테스트 코드를 왜 만들어...' 라는 생각이 절로 나는거죠.

그런데 위의 얘기 처럼 상태 기반으로 테스트를 쉽게 작성할 수만 있다면, Mockito가 그런식 으로 테스트를 작성하기 쉽게 해준다면, 좀 더 시간을 들여서 익혀볼 만 한 것 같습니다. 흠.. 상태 기반 테스트라~ 어떻게 작성해야 하나.. Mockito로 작성된 테스트 코드를 보고 싶네요.
top


expect -> run -> verify 스타일(ex. Easymock) 바이바이

모하니?/Coding : 2008.07.08 19:50


참조 : http://monkeyisland.pl/2008/02/01/deathwish/

이지목 스타일은 녹화 -> 플레이 -> 확인(expect -> run -> verify) 순으로 mocking 또는 stubbing 하는 거였습니다. 그러나 이 스타일은 다음과 같은 단점들이 있습니다.

1. 테스트 메소드가 지져분해짐.
- 이것 저것 예측/녹화를 해줘야 하는데 그게 테스트를 위해서가 아니라 Mock을 위해서 해줘야 한다는게 좀..

2. 자연스러운 테스트 스타일로 느껴지지 않는다.
- 예측을 한 담에 실행하는게 아니라, 실행 한 다음에 예측되는 Mock의 행위를 나열해 주는게 더 자연스럽다.

3. 테스트가 깨지기 쉽다.
- 새로운 기능을 추가하면, Mock을 사용한 테스트가 왕창 깨지는 경우가 발생한다.

4. 보다 자세한 실패 메시지를 보여줄 수 있었을 텐데...

5. 보다 가독성 좋게 만들 수 있었을 텐데...

그래서 상태 기반 테스트를 제공하는 Mockito를 강추 한다는거...

Mockito 홈에서 다음을 인용합니다.

No expect-run-verify also means that Mockito mocks are often ready without expensive setup upfront. They aim to be transparent and let the developer to focus on testing selected behavior rather than absorb attention.

Mockito has very slim API, almost no time is needed to start mocking. There is only one kind of mock, there is only one way of creating mocks. Just remember that stubbing goes before execution, verifications of interactions go afterwards. You'll soon notice how natural is that kind of mocking when test-driving java code.

즉 stubbing -> execution -> verification 라고 할 수 있겠네요. 훔.. 그래도 왠지 expect -> run -> verify 형태와 비슷해 보이네요.

사용법은 여기에 잘 나와있습니다.
top


JUnit 4.4에 추가된 Assumetion

모하니?/Coding : 2008.07.08 16:32


테스트 코드를 실행하는 환경이 달라짐에 따라서 테스트가 동작하지 않는 경우가 있는데, 그럴 때는 그런 환경 값들을 테스트를 돌리기 전에 설정해주면 테스트가 다시 잘 돌아갑니다. 예를 들어, 위도우에서는 폴더 구분할 때 \를 쓰지만 리눅스에서는 / 를 쓰고, 라인브레이크나 뭐 기타 표시들이 다를 수 있죠. 그런 경우 파일을 읽어오는 테스트가 있다면 운이 안 좋을 땐 테스트가 실패할 수도 있습니다.

그래서 그러한 "가정"을 실제로 코드로 미리 해두면, 그 테스트가 여러 환경에서 테스트를 하더라도 실패하는 일이 발생하진 않겠죠.

import static org.junit.Assume.*

@Test public void filenameIncludesUsername() {
   assumeThat(File.separatorChar, is('/'));
   assertThat(new User("optimus").configFileName(), is("configfiles/optimus.cfg"));
}

@Test public void correctBehaviorWhenFilenameIsNull() {
   assumeTrue(bugFixed("13356"));  // bugFixed is not included in JUnit
   assertThat(parse(null), is(new NullDocument()));
}

이런 식으로 사용할 수 있군요. 흠.. Stub을 만들고 그걸 Injection 해주는 걸까요.

참조 : http://junit.sourceforge.net/doc/ReleaseNotes4.4.html

ps : assumetion을 @Theory와 @Datapoint라는 것도 있는데 이건 좀 복잡해 보이네요. 패스~!
top


JUnit 4.4에 추가된 assertThat()

모하니?/Coding : 2008.07.08 15:44


참조
http://junit.sourceforge.net/doc/ReleaseNotes4.4.html

흠.. 맨날 쓰는 메소드만 쓰다보니까, 새로운 기능들을 전혀 몰랐네요;
assertThat() 처럼 멋진 메소드를 이제야 알게 됐습니다.

보통 값을 비교할 때 assertEquals()를 사용해서

assertEquals(new Integer(2), game.getLeastTryCount());

이런식으로 값을 비교합니다. 메소드에 넘겨주는 첫 번째 인자가 기대값이고 뒤에 오는 인자가 실제 값인데, 사실  인자들의 순서가 바껴도 테스트 목적에는 별 다른 지장을 주지 않습니다. 위에서 테스트한 것과 동일한 내용을 assertThat()을 사용하여 다음과 같이 작성할 수 있습니다.

assertThat(game.getLeastTryCount(), is(2));

코드를 한 번 읽어보시죠. 훨씬 좋치 않나요? 위에서 사용한 is() 라는 메소드는 JUnit이 처음로 의존성을 가지고 사용하는 제 3자의 클래스들 입니다. Hamcrest라는 프로젝트 인데, Matcher를 확장한 다양한 메소드들을 제공해주고 있습니다. 그 중 하나가 is() 입니다. 따라서 import 문이 필요한데, 위에서 is만 사용한거 보니까 static import 겠거니.. 하고 짐작을 하셨겠죠?

import static org.hamcrest.CoreMatchers.*;

이렇게 추가해주시면 됩니다.

문장이 읽기 좋다는 장점 외에도 다음과 같은 장점들이 있습니다.
- 콤비네이션 가능. is(not(3)) 이나 eather(2).or(3) 같은 조합을 이뤄서 사용할 수 있음.
- assertEquals() 보다 더 가독성 높은 에러 메시지.
- 커스텀 매처 사용하능.

JUnit 4.4 가 제공하는 매처들
- org.hamcrest.CoreMatchers
- org.junit.matchers.JUnitMatchers.


top


Eclipse에서 bnd 사용해서 번들 만들기



top


20080708 GMP

모하니?/GMPing : 2008.07.08 09:12


News

fruit ㅍ룻.
more and more 모렌모어
each year 이치이어
crops 크뢉: 농작물(돈을 벌게 해주는 식물, plants는 그냥 자라는 식물)
pollination: 수분

Many fruits, nuts and berry crops depend on honey bees for pollination, but more and more bee colonies are diying each year.

Screen English

She just needs some space.
That's not what she needs.
Yes she does. From the sound of things you all do. Why don't you go get the papers.
Oh.. mom..
Ye. Go on. It would do you good. Get lost.

Pop's English

But some how I can't believe that anything should happen.
I know where I belong and nothings gonna happen.
She is so high~

Talk Play Learn

너 ~~하지 않니?(이미 알면서 물어보기)
Aren't you ~

Aren't you full?
Aren't you sorry?
Aren't you dizzy?
Aren't you happy?
Aren't you sleepy?
Aren't you health?
Aren't you hungry?

Sound Sound Play

자음이 겹치면 자음을 한 번만 발음한다.
running 러닝
Emma 에마
Madonna 마다나
Sommer 써머ㄹ
Manner 매너

Bit around the bush. = 핵심을 찌르지 못하고 변죽을 울리다.
ex) Please don't bit around the bush. Tell me the truth.
be wasted = 술에 꼴아 박은
She is totally wasted.


'모하니? > GMPing' 카테고리의 다른 글

20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
20080703 GMP  (0) 2008.07.03
20080702 GMP  (0) 2008.07.02
top

TAG GMP

Spring DM Extentions

Spring DM/Appendix B : 2008.07.07 23:32


이번 Appendix 장에서는 1.0 배포판부터 추가된 핵심 기능을 확장한 기능들을 다루지만, 이 다음 배포판에서도 그대로 확장으로 있을지는 보장하지 못한다. 이 기능들을 핵심 기능 쪽으로 옮기는 것을 생각하고 있기 때문이다.

B.1. 애노테이션 기반 주입

org.springframework.osgi.extensions.annotation 번들은 OSGi 서비스 레퍼런스를 주입하는 애노테이션을 제공한다. 이 기능을 사용하려면 JDK 1.5 이상을 사용해야 한다.

Bean 클래스 세터 메소드 위에 org.springframework.osgi.extensions.annotation.ServiceReference 애노테이션을 사용할 수 있다. 기본으로 속성 타입으로 OSGi 서비스 레지스트리에서 매치하는 서비스 인터페이스를 찾아서 주입해준다. 예를 들어,

<bean id="annotationDriven" class="MyAnnotationDrivenBeanClass"/>

위의 클래스를 다음과 같이 정의한다면,

public class MyAnnotationDrivenBeanClass {

  @ServiceReference
  public void setMessageService(MessageService aService) { ... }

}

MessageService 인터페이스를 구현한 서비스를 찾아서 가장 적합한 레퍼런스를 주입해준다.(이 때 적합한 레퍼런스를 찾는 방법은 reference 엘리먼트와 동일함)

서비스 룩업을 하는 과정에 몇 가지 설정을 할 수 있게 reference 엘리먼트에 상응하는 속성을 가지고 있다. 자세한건 javadoc을 참조하라.


'Spring DM > Appendix B' 카테고리의 다른 글

Spring DM Extentions  (0) 2008.07.07
top


A.1. Configuration Admin

Spring DM/Appendix A : 2008.07.07 23:20


A.1.1. Property placeholder support

스프링 DM은 빈 속성 값을 OSGi Configuration Administration 서비스에서 가져오는 기능을 지원한다. 이 기능은 property-placeholder 엘리먼트를 이용하여 사용할 수 있다.  property placeholder 엘리먼트는 "${...}" 이런 형태의 구분자를 사용한 부분의 빈 속성 값을 Configuration Administratino 서비스에서 가져와서 설정해준다. 이 때 persistent-id 속성으로 Configuration dictionary의 키에 해당하는 id를 설정해준다.

나중에 이 부분은 스프링 프레임워크에 있는 방법과 동일하게 변결 될 거라고 합니다.

<osgix:property-placeholder persistent-id="com.xyz.myapp"/>

<bean id="someBean" class="AClass">
  <property name="timeout" value="${timeout}"/>
</bean>

someBean의 timeout 속성 com.xyz.myapp 라는 persistent id로 등록된 Configuration Ditionary 안에 있는 timeout의 값으로 대치 한다.

placeholder 문자열은 빈을 생성할 시점에 대치가 된다. 프로퍼티 값을 변경했다고 해서 생성한 빈 속성을 다시 주입하지는 않는다. 이런 방법이 필요하면 Appendix B의 managed-service와 managed-service-reference를 참조하라. placeholder-prefix와 placeholder-suffix를 사용하여 구분자를 변경할 수 있다.

프로퍼티 값들을 Configuration Dictionary에 두지 않고 직접 생성해서 사용해도 된다. default-propertiies라는 내부 엘리먼트를 사용한다.

<osgix:property-placeholder persistent-id="com.xyz.myapp">
  <default-properties>
     <property name="productCategory" value="E792"/>
     <property name="businessUnit" value="811"/>
  </default-properties>
</osgix:property-placeholder>

이때 persistent-id 속성은 OSGi ManagerdService를 참조해야 한다. ManagedServiceFactory를 참조하면 에러난다.

A.1.2.  Configuration Dictionaries

설정 객체 및 그와 연관된 딕셔너리에 접근하는 방법을 제공하며, 설정 객체에서 직접 빈 객체를 생성하는 것이 스프링 DM 로드맵으로 잡혀있다. Appendix F. Roadmap을 참조하라.

'Spring DM > Appendix A' 카테고리의 다른 글

A.1. Configuration Admin  (0) 2008.07.07
Compendium Services  (0) 2008.07.07
top


Compendium Services

Spring DM/Appendix A : 2008.07.07 23:04


OSGi Service Platform Service Compendium 스펙에는 OSGi 구현체가 지원할 수도 있는(may be supported) 부가 서비스를 정의하고 있다. 스프링 DM은 추가로 "compendium" 네임스페이스를 지원하여 그런 서비스를 사용할 수 있게 해준다. 보통 해당 네임스페이스 이름으로 osgix를 사용한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/osgi"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
   xmlns:beans="http://www.springframework.org/schema/beans"
   xsi:schemaLocation="http://www.springframework.org/schema/osgi 
        http://www.springframework.org/schema/osgi/spring-osgi.xsd
        http://www.springframework.org/schema/osgi-compendium
        http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd">

   <!-- use the OSGi namespace elements directly -->
   <service id="simpleServiceOsgi" ref="simpleService"
       interface="org.xyz.MyService" />

   <!-- qualify compendium namespace elements -->
   <osgix:property-placeholder persistent-id="com.xyz.myapp"/>

</beans:beans>

현재 이 네임스페이스는 Configuration Admin 서비스만 지원하며 다른 서비스 지원 기능은 추후에 추가될 예정이다.

'Spring DM > Appendix A' 카테고리의 다른 글

A.1. Configuration Admin  (0) 2008.07.07
Compendium Services  (0) 2008.07.07
top


Eclipse에서 Felix 사용하기






top


20080707 GMP

모하니?/GMPing : 2008.07.07 09:28


News

skyscraper 마천루, 초고층빌딩(mega building)
pie in the sky 그림의 떡(=pipe dream)
floors 바닦
revolving 회전하는

Is it a skyscraper of the future or just a pie in the sky idea? It's an 80 stories residential tower with revolving floors.

Screen English

I think your sisters are't really happy.
더...
Why do you think so?
You are a good father but sometimes bad dad.
Who told you said that? You can tell me.
No. I maded it up myself.

Pop's English(She's so high)

She is blood, flesh and born.
No types of silicon.
She is touch, smell, sight, taste and sound.

Talk Play Learn

내가 ~면 좋겠어.
I wish I were a puppy.
I wish I were a man.
I wish I were a woman.
I wish I were a teenager.
I wish I were the president.
I wish I were her boyfriend.
I wish I were a time travler.
I wish I were a alabian prince.
I wish I were computer savvy.

Sound Sound Play

d 다음에 r이 오면 드르가 아니라 듀..
dry 듀라이
drive 듀라이브
dream 듀림
draw 듀러
drag 듀렉
drama 듀라마

Learn More

감잡다  = I have a hunch(hint = clue = idea).


'모하니? > GMPing' 카테고리의 다른 글

20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
20080703 GMP  (0) 2008.07.03
20080702 GMP  (0) 2008.07.02
20080701 GMP  (0) 2008.07.01
top

TAG GMP

맥 애플리케이션 토렌트와 P2P 프로그램

Good Tools : 2008.07.06 22:22


http://www.mac-torrents.com/index.php

사용자 삽입 이미지

위 사이트에서 맥 애플리케이션과 관련된 토렌트를 구할 수 있습니다.

http://www.limewire.com/download/

저기서 받은 토렌트를 위의 limewire라는 무료 P2P(윈도우의 당나귀급) 프로그램에 드래그 앤 드랍을 하면 알아서 다운로드 해줍니다.

사용자 삽입 이미지
위 두 개의 프로그램 조합으로 이제 원 없이 맥을 즐길 수 있게 되었습니다. 나이수~
top


이클립스 단축키 변경하기



맥에서 자동완성(Content Asist) 기능을 사용하려면 단축키를 바꿔줘야 합니다. 레오파드의 Spotlight 단축키랑 겹쳐서 그런데, Spotlight 기능 단축키를 바꿔도 되겠지만 전 그냥 이클립스 단축키를 바꾸는게 더 편하더군요.



top


Eclipse 3.4 + WTP + Spring IDE + Spring Tool Suite 설치하기

Good Tools : 2008.07.05 21:57


1. Eclipse 3.4 설치하기

Eclipse부터 다운로드 합니다.

사용자 삽입 이미지

이 중에서 두 번째에 있는 녀석입니다. PDE가 있고, 뭐 기타 등등 있죠.

http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.4-200806172000/eclipse-SDK-3.4-win32.zip


위 링크 누르시면 다운로드가 될 겁니다.

2. WTP 설치하기

다음으로 WTP를 플러긴 형태로 설치합니다.

사용자 삽입 이미지

맨 위에 Eclipse Ganimede 팬딩하신다음에 Web and Java EE Development 선택하셔서 설치해주시면 됩니다.

사용자 삽입 이미지

시간이 좀 걸립니다. 지겹 지겹~ 지겹 지겹~ 얼른 받아라~ 얼른~ ㄱㄱㅆ 하자..

3. Spring IDE 설치하기

업데이트 사이트: http://springide.org/updatesite
를 등록해 줍니다.

여기서 웃긴건.. 저걸 등록하면 AJDT랑 Mylyn 업데이트 사이트까지 등록해주는건 좋은데, Spring IDE 업데이트 사이트를 또 등록해준 다는 겁니다. 바보~

사용자 삽입 이미지
새로 등록된 건 무시해버리고, 제가 등록한거에서 Core랑 Extensions 만 선택해서 설치하겠습니다.

사용자 삽입 이미지

간단하죠~

사용자 삽입 이미지

자 깔끔하게 선택이 되고, 설치를 합니다. 이번에도 시간이 좀 걸리기는 하는데, WTP를 설치할 때 만큼은 아닙니다.

4. 마지막입니다. STS 설치하기

STS를 설치하시려면 http://www.covalent.net/beta/STS/downloads.php 여기에 로긴 할 수 있는 계정이 있어야 합니다. 자 알아서 만드시구요.

업데이트 사이트: http://static.springsource.com/projects/sts/mirror/e3.4
를 등록합니다.

사용자 삽입 이미지

보세요. 계정이 있어야 된댔죠. 계정 정보를 주시면 잘 등록이 되고 팬딩 할 수 있습니다. 저는 여기서 User name에 이메일 계정을 입력해야 로그인이 되더군요.

여기서 또 기현상이 벌어집니다.

사용자 삽입 이미지

똑같은게 4개씩 뜨죠. ㄷㄷㄷ 저중에서 Core랑 Dependencies 하나 씩 선택해서 설치합니다. 나머지는 뭐.. 패쓰합니다. AJDT, 코드커버리지, Spring IDE AJDT 통합 플러긴인데, 아까 Spring IDE를 설치했으니까 필요 없습니다. 코드커버리지 툴도 다른거 쓰면 되구요.

사용자 삽입 이미지

여~ 이번엔 좀 많네요. 몇 개는 최신 버젼이 설치되어 있어서 대상에서 제외한 것 같네요.

사용자 삽입 이미지

이번에도 역시 시간이 좀 걸립니다. WTP를 설치할 때보다 좀 더 걸립니다.
빨랑 빨랑~ 집에 가자~ 깔려라~ 깔려~

5. 끝...

자 설치가 끝났습니다.

사용자 삽입 이미지



사용자 삽입 이미지


top


JavaOne 2008 자료 떴네요.



http://developers.sun.com/learning/javaoneonline/index.jsp

MP3와 PDF 그리고 웹캐스트를 제공해 줍니다.

흠.. 로드존슨 횽님도 발표를 했는데 스프링 2.5에 대한 발표네요. 유겐휄러 횽님은 얼마전에 스프링 3.0 발표했었는데;;;

볼 것 요약

New I/O APIs for the Java Platform
Modularity in Java Platform
More "Effective Java"
Converting (Large) Applications to OSGi
Unit-Testing Database Operations with DBUnit


From Java Technology to Ruby...and Back

2007년 자료
Best OSGi Practices
Effective Concurrency for the Java Platform
Java Language Modularity with Superpackages
Effective Java Reloaded: This Time It's for Real
Testing Concurrent Software
Advanced Spring Framework

top


20080705 GMP

모하니?/GMPing : 2008.07.05 09:29


News

British 브리티쉬(영), 브리리쉬(미)
ended 엔딛
decided to 디싸디투
heartbroken 상심한
auction off 경매에 내놓다
possessions 소유물

And this British man saids, he is so heartbroken after marriage ended. He is decided to auction off more than just his possessions on ebay. He wants to sell his old life.

Screen English

This is humiliating?
Tell me about it.(=You know I agree with you. = I know. = 내 말이 그 말이야.)
OK. You are grounded for a month.
A month? But that's worse then forever. OK dead. Why?
You lied to me.
Yes well... You can't handle the truth.

Pops

I've been spending a way to long(난 너무 많은 시간을 소비했어.) checking my tung in the mirror and bending over backwards just to try to see it clearer My breath fogged up the glass And so I drew a new face and laughed.

Talk Play Learn Review

Do you know anyone who can cook?(~사람 알어?)
Do you know what I like?(~ 알어?)
You don't wanna know? (~하지 않는게 좋을 껄)
I've gotto hurry. (~해야 만 해)

sky 스까이
skirt 스껄트
speak 스삐~ㅋ
spill 스삘
spead
stop 스땁
store 스또~어
cow 캬우
coward 캬월드
tree 츠리
trace 츠레이스
travel 츠레블

put something on ice
two of kind
in a nut shell
drive one's feet
all set?

'모하니? > GMPing' 카테고리의 다른 글

20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
20080703 GMP  (0) 2008.07.03
20080702 GMP  (0) 2008.07.02
20080701 GMP  (0) 2008.07.01
20080627 GMP  (0) 2008.06.27
top

TAG GMP

나이스~ 스프링 DM 1.1.0 정식판 배포

Spring DM/etc : 2008.07.04 22:27


http://forum.springframework.org/showthread.php?t=56895

짝짝짝!!
top


20080704 GMP

모하니?/GMPing : 2008.07.04 11:58


News

Chocolate 챠끌릿
getting 게링
Hospital 하스피럴
lace : 끈, 묶다, 살짝 가미하는거,
laxative 설사제

The students laced a chocolate cake with laxative getting five teachers and two other studends sick. "My teacher went to hospital right away, when others were cring."

Screen English

What was that? What are you doing? Could you be more embarrassing?
I'm sorry to interrupt your study with "your friend".
Well.. we can't all be monks like you.
By the way, you are grounded.

Pops English(I'm yours)

So I won't hesitate no more no more.
It can not wait I'm sure there is no need to complicate.
Our time is short. This is our fate. I'm yours.

destiny: 변경 가능한 운명
fate: 변경 불가한 운명

Talk Play Learn

나 이제 ~~ 해야 돼.
I've got to hurry.
I've got to leave now.
I've got to get a lone.
I've gotta get a return.
I've gotta get the phone.
I've gotta take an aspirine.
I've gotta meet somebody.
I've got to find new place.
I've got to put out the garbage.

내가 살 께 =  I'll treat you.
준비 다 됐어? = all set?
아.. 또야!! = not again~


'모하니? > GMPing' 카테고리의 다른 글

20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
20080703 GMP  (0) 2008.07.03
20080702 GMP  (0) 2008.07.02
20080701 GMP  (0) 2008.07.01
20080627 GMP  (0) 2008.06.27
20080626 GMP  (0) 2008.06.26
top

TAG GMP

Whiteship's 스프링 DM 레퍼런스 1.0 m2 배포

Spring DM/etc : 2008.07.03 23:59




Change Log
- confluence로 깔끔하게 옮겼습니다.
- confluence에서 pdf 로 뽑아냈습니다.(깔끔하고, 링크도 살았습니다.)
- 일부 제목을 번역했습니다.
- 내용을 약간 다듬었습니다.

Next Version
- 생략한 표들을 추가할 계획입니다.
- 원래 계획 대로라면, M3이 될 것 같네요.
- 뒷 부분에 생략한 부분도 추가할 계획입니다.


top


PDFsam

Good Tools : 2008.07.03 23:35


찬욱군이 알려준 PDF 편집 툴인데, 정말 좋네요. PDF 파일을 쪼개고 합치는 용도로 사용할 수 있는 무료 툴입니다. 더군다가 자바로 만들어졌다는 사실...

사용자 삽입 이미지
따라서 맥용도 쉽게 제공해주는게죠. 멋지네요. 아이콘들이 좀;; 구리고. 화면도 맥 스럽지 않게 미려하지 못하지만 뭐 상관없습니다. PDF 만 잘 합쳐주면 그만입니다.ㅋㅋ

http://www.pdfsam.org/?page_id=32
<- 다운로드 페이지

top

TAG PDFsam

OSGi 관리 툴이 떴네;; mToolkit

Spring DM/etc : 2008.07.03 22:48


우와;; 오늘 번들 관리하는 모듈을 만들고 있었는데.. 김빠지게 시리..GUI로 번들 관리할 수 있는 툴을 무료 배포해버리는군요. 하하핫. 괜찮아 괜찮아 기선아. 너도 열심히 해서 만들자꾸나...

사용자 삽입 이미지


http://dz.prosyst.com/oss/
top


자바의 volatile 키워드는 무슨 의미일까...

Java : 2008.07.03 18:52


사전적인 의미는 '휘발성의' 라는 뜻이다.

네이버에서 검색한 어떤 블로그를 보니까 "비동기적으로 바뀔 수 있는 변수"로 선언할 때 사용하는 키워드라고 설명되어 있다. ㄷㄷㄷ이다 도무지 감을 못 잡겠다. 구글링을 할 수 밖에 없다. 진작에 구글로 검색할 껄 혹시나 하는
기대감에 네이버로 검색해봤지만, 역시나였다.

건졌다.

나와 비슷한 의문을 가진 사람들이 2005년에도 많이 있었나보다. 3년이 지난 지금에서야 난 좀 이해할 수 있을 것 같다.

자바의 volatile은 멀티 쓰레드 환경에서 "완전히 공유 하겠다"라는 뜻이다.

일반 변수들은 멀티 쓰레드 환경에서 쓰레드 마다 각자 메인 메모리에 위치한 변수 값을 복사하여 그 값을 가지고 논다. 따라서 여러 쓰레드가 그 값들을 변경하면 쓰레드 마다 다른 값을 가지고 있는 경우가 발생할 수도 있다. 그로인한 문제들은 뭐 수도 없으니까 패스하자. 그런 문제들을 해결하는 방법으로 내가 여태까지 알고 있던건 "완전히 분리"하는 방법이었다. 쓰레드 로컬을 쓰던, 아예 로컬 변수로 만들어 버리던 해서 멤버 변수를 사용하지 않는 거였다. 그렇게 해야지 쓰레드 세이프 하라고 하는 건 줄 알고 있었다. 그런데... 완전 반전이다. 그 반대 방법도 있었던 것이다.

모든 쓰레드가 복사본을 가지고 노는게 아니라 메인 메모리에 있는 변수 값을 그대로 사용하고 그 값을 변경시키는 것이다. 이렇게 되면 모든 쓰레드는 동일한 값을 공유하게 된다. 물론 어떤 쓰레드가 변경 시켰는지는 몰겠지만, 중요한 모든 쓰레드가 같은 값(최근에 변경된 값)을 공유한다는 것이다.

그렇다면, 다음의 코드에 대해 잠깐 생각해볼까..

    private volatile BundleContext context;

BundleContext를 volatile로 선언했다. 사실 저 코드는 예제에 있던 코드를 무심코 베껴온것이고, 이제사 저 코드의 의미가 궁금해져서 찾아보았다.

        private void installNewBundles(File[] bundleFiles) throws BundleException {
            for (File file : bundleFiles) {
                String bundleLocation = "file:" + file.getAbsolutePath();
                if(findBundleByLocation(bundleLocation) == null){
                    context.installBundle(bundleLocation);
                    bundleLocations.add(bundleLocation);
                }
            }
        }

    protected Bundle findBundleByLocation(String location) {
        Bundle[] bundles = context.getBundles();
        for (int i = 0; i < bundles.length; i++) {
            if (bundles[i].getLocation().equals(location)) {
                return bundles[i];
            }
        }
        return null;
    }

위 코드들은 모두 쓰레드 안에서 실행하는 메소드들이다. context에 어떤 번들을 설치하고, 가져오는 일들을 하고 있다. 이 코드를 여러 개의 쓰레드가 실행한다고 가정했을 때, 그 여러 개의 쓰레드들이 동일한 BundleContext를 가지고 있지 않다면, 어떤 일이 벌어질까... 상상도 하기 싫을 정도로 끔찍하다. 설치한 걸 또 설치할려고 하거나, 이미 없앤 것을 또 없애려고 할 것이다. 전혀 내가 원한대로 동작하지 않게 된다. 그래서 volatile이 쓰인 것이었다.

나이스... volatile을 이제야 이해했다.

ps : 하지만 "비동기적으로 변경 될 수 있는 값"이라는 말은 아직도 이해가 되지 않는다. 한글이 영어보다 어려운건지. 저 위의 링크에서는 "비동기적으로 변경" 이라는 영어 단어는 볼 적이 없는 것 같은데... 신기할 따름이다.

top


BundleManager 0.2 번들 소스 코드

Spring DM/exercise : 2008.07.03 18:23


이전 버전과 달라진 건 클래스 하나.

BundleDirectoryManager.java
package whiteship;

import java.io.File;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;

public class BundleDirectoryManager implements BundleActivator {

    private static final long INTERBAL = 1000;
    private static String BUNDLE_DIRECTORY = "E:\\bundles";
    private volatile BundleContext context;

    private final Thread thread = new BundleManager(BUNDLE_DIRECTORY);

    public void start(BundleContext context) throws Exception {
        this.context = context;
        thread.start();
    }

    public void stop(BundleContext context) throws Exception {
        thread.interrupt();
    }

    protected Bundle findBundleByLocation(String location) {
        Bundle[] bundles = context.getBundles();
        for (int i = 0; i < bundles.length; i++) {
            if (bundles[i].getLocation().equals(location)) {
                return bundles[i];
            }
        }
        return null;
    }

    private class BundleManager extends Thread {

        private File bundleLocation;
        private List<String> bundleLocations = new CopyOnWriteArrayList<String>();

        public BundleManager(String location) {
            bundleLocation = new File(location);
        }

        public void run() {
            if (!bundleLocation.isDirectory())
                throw new RuntimeException(bundleLocation.getPath()
                        + " is not directory.");

            try {
                while (!Thread.currentThread().isInterrupted()) {
                    Thread.sleep(INTERBAL);
                    uninstallDeletedBundles();
                    installNewBundles(bundleLocation.listFiles(new JarFileFilter()));
                }
            } catch (InterruptedException e) {
                System.out.println("I'm going out");
            } catch (BundleException e) {
                throw new RuntimeException(e);
            }
        }

        private void uninstallDeletedBundles() throws BundleException {
            for(String bundleLocation : bundleLocations){
                File file = new File(bundleLocation.substring(5));
                if(file == null || !file.exists()){
                    findBundleByLocation(bundleLocation).uninstall();
                    bundleLocations.remove(bundleLocation);
                }
            }
        }

        private void installNewBundles(File[] bundleFiles) throws BundleException {
            for (File file : bundleFiles) {
                String bundleLocation = "file:" + file.getAbsolutePath();
                if(findBundleByLocation(bundleLocation) == null){
                    context.installBundle(bundleLocation);
                    bundleLocations.add(bundleLocation);
                }
                
            }
        }

    }
}

지정한 디렉터리에서 번들 파일을 삭제하면, 해당 번들은 OSGi 플랫폼에서 uninstall 하는 기능 추가. 짝짝짝 멋져부러~

이 멋진 모습을 동영상으로 찍어서 보여드리고 싶은데.. 일단 뭐 다 만든 다음에 보여드리도록 하죠.
top


메이븐을 대체할 것인가~ Buildr

Build/Buildr : 2008.07.03 17:20


루비로 만들고 있다는 새로운 빌드 툴. 사부님 소개로 알게 되었는데 괜찮은 녀석 같아 보입니다. Maven 보다 빠르고 확장성 좋고 편하고 쉽게 같은 일들을 할 수 만 있다면 Maven에서 Buildr로 안 갈아탈 이유가 없겠죠.

메이븐은 좀더 편의성을 도모하지 않으면 앞으로 점차 JAR 저장소로만 그 이름을 이어가게 되지 않을런지...사실 메이븐 저장소라고 하기도 뭐하죠. 이미 Ivy에서는 Common Repository라고 호칭하지 Maven Repository라고 하진 않더군요.

http://incubator.apache.org/buildr/index.html

사용자 삽입 이미지
망치로 'r'을 표현하는 센스.

'Build > Buildr' 카테고리의 다른 글

메이븐을 대체할 것인가~ Buildr  (0) 2008.07.03
top

TAG buildr, maven

BundleManager 0.1 번들 소스 코드

Spring DM/exercise : 2008.07.03 14:36


BundleManager가 할 일
- 특정 폴더에 jar 파일을 집어 넣으면 그 녀석을 설치해야 한다.
- 이미 해당 jar 파일이 설치되어 있다면 설치하지 않는다.

BundleDirectoryManager.java
package whiteship;

import java.io.File;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;

public class BundleDirectoryManager implements BundleActivator {

    private static final long INTERBAL = 1000;
    private static String BUNDLE_DIRECTORY = "E:\\bundles";
    private volatile BundleContext context;

    private final Thread thread = new BundleManager(BUNDLE_DIRECTORY);

    public void start(BundleContext context) throws Exception {
        this.context = context;
        thread.start();
    }

    public void stop(BundleContext context) throws Exception {
        thread.interrupt();
    }

    protected Bundle findBundleByLocation(String location) {
        Bundle[] bundles = context.getBundles();
        for (int i = 0; i < bundles.length; i++) {
            if (bundles[i].getLocation().equals(location)) {
                return bundles[i];
            }
        }
        return null;
    }

    private class BundleManager extends Thread {

        private File bundleLocation;

        public BundleManager() {
            //TODO I need CoC
        }

        public BundleManager(String location) {
            bundleLocation = new File(location);
        }

        public void run() {
            if (!bundleLocation.isDirectory())
                throw new RuntimeException(bundleLocation.getPath()
                        + " is not directory.");

            try {
                while (!Thread.currentThread().isInterrupted()) {
                    Thread.sleep(INTERBAL);

                    for (File file : bundleLocation.listFiles(new JarFileFilter())) {
                        String bundleLocation = "file:" + file.getAbsolutePath();
                        if(findBundleByLocation(bundleLocation) == null)
                            context.installBundle(bundleLocation);
                    }
                }
            } catch (InterruptedException e) {
                System.out.println("I'm going out");
            } catch (BundleException e) {
                System.out.println("Error installing bundle");
                throw new RuntimeException(e);
            }
        }

    }
}

번들을 시작시키면 위의 클래스에 있는 start()가 실행되고, 주기적으로(현재 1초) 특정 폴더(현재 E:\bundles)를 확인해서 그 안에 들어있는 JAR 파일들을 찾아서 설치한다. 이 때 만약 이미 OSGi 플랫폼에 설치되어 있는 번들은 설치하지 않는다.

JarFileFilter.java
package whiteship;

import java.io.File;
import java.io.FileFilter;

public class JarFileFilter implements FileFilter {

    public boolean accept(File f) {
        if(f.isDirectory())
            return false;
       
        String extenstion = getExtension(f);
        if(extenstion != null && extenstion.equals("jar"))
            return true;
       
        return false;
    }

     public String getExtension(File f) {
            String ext = null;
            String s = f.getName();
            int i = s.lastIndexOf('.');

            if (i > 0 &&  i < s.length() - 1) {
                ext = s.substring(i+1).toLowerCase();
            }
            return ext;
        }

}

파일 필터로. 특정 폴더 안에 들어있는 파일들 중에 확장자가 jar 인 파일들만 가져오기 위해서 만들었음.

bnd파일
# bundleManager.bnd
Private-Package: whiteship
Bundle-Activator: whiteship.BundleDirectoryManager




개선하거나 생각해볼 것
- 스프링 DM 번들로 변경하자.
- 시간이랑 폴더는 DI가 가능하도록 변경하자.(기본 값 유지)
- jar 뿐만 아니라 war로 설치를 시도하게 하자. 스프링 DM 웹 번들일 수도 있으니까.
- getExtension() 메소드는 별도의 Util 클래스로 빼내기.
- 예외처리 RuntimeException으로 처리하기.

0.2
- 해당 폴더에서 jar 파일이 삭제되면, 해당 번들을 uninstall 시킨다.

0.3
- 만약 해당 폴더에 있는 jar 파일이 변경되면, 해당 번들을 update 시킨다.

참조: http://neilbartlett.name/blog/osgibook/
top


HelloBundle 번들 소스 코드

Spring DM/exercise : 2008.07.03 14:23


HelloOsgi.java
package whiteship;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class HelloOsgi implements BundleActivator {

    public void start(BundleContext arg0) throws Exception {
        System.out.println("하이");
    }

    public void stop(BundleContext arg0) throws Exception {
        System.out.println("바이바이");        
    }

}
설명이 필요 없는 매우 매우 간단한 번들.

bnd 파일
# helloBundle.bnd
Private-Package: whiteship
Bundle-Activator: whiteship.HelloOsgi

저 번들을 start 시키면 화면에 "하이" 라는 메시지를 찍고 stop 시키면 "바이바이"를 출력함.


테스트 용도로 사용하기 좋습니다.
top

TAG HelloOsgi

20080703 GMP

모하니?/GMPing : 2008.07.03 09:48


News

Community 커뮤너리: 지역사회
Naomi Campbell 네오미 캠벌
Super Model 수퍼 마를
Community Service: 사회봉사
punishment: 벌
rage: 격노
air rage: 공항 난동
arrangement: 기소 사실 인부 절차
in-person: 혼자

200 hours of community service and 8700 dollors that's the punishment for Naomi Campbell's air rage. The super model showed up in-person for her rondon arrangment.

Screen English(Dan in love)

Who are you?
I'm Marti B~
Anyway I'd like to specially thank you for last friday's column. It really helped me to understand my parents.
Thank you. What else can I do for you?
I'd like to see your daughter, If I could.

Pop's English(I'm yours)

open up your mind and see like me.
open up your plans and damn you are free.
look into your heart and you will find
love love love love.

Talk Play Love(~하지 않는게 좋아)

You don't wanna know.
You don't wanna give up.
You don't wanna go back.
You don't wanna date her.
You don't wanna dump me.
You don't wanna order that.
You don't wanna live lijke that.
You don't wanna quit your job.

Sound Sound Play

[아우] 앞에 c가 오면 캬 발음

cow 캬우
coward 캬워드
council 캬운슬: 시의회
You are such a coward

Today Expression

질질 끌다 = drag ~'s feet.
The construction is going on. I think it should have been now.
I think they are dragging thier feet.

제대로 하라 = act right


'모하니? > GMPing' 카테고리의 다른 글

20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
20080703 GMP  (0) 2008.07.03
20080702 GMP  (0) 2008.07.02
20080701 GMP  (0) 2008.07.01
20080627 GMP  (0) 2008.06.27
20080626 GMP  (0) 2008.06.26
top

TAG GMP



: 1 : 2 : 3 : 4 :