블로그 이미지
Max.

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Notice

2011.08.26 12:07 개발관련

먼저 업데이트할 기능을 추가하고, 저장소에 결과물을 반영한다.

1) addon 소스 수정
    - 'max web' 명령어에 '--entity' 옵션항을 추가하고 기능을 업데이트 함.

2) compile
   - 도스창에서 mvn assembly:assembly 실행하여, jar 생성

3) 결과물을 repository에 전송
    - eclipse를 이용하여 커밋 



최신 번들을 다운받아 사용한다.

1) 기존 OSGi 번들 제거
    - 'max osgi uninstall'

2) 새로 업데이트된 번들 넣기
    - 'max osgi install --version 1.0.0.M2'

3) 테스트 하기
    - 'max web --class ~.template.web.TemplateController --service ~.template.service.TemplateService --entity ~.template.domain.ContentPage' 을 실행하여 jsp 페이지까지 생성되면 성공이다.


 
SNG 프로젝트에 필요할때마다 수정해서 적용중인데, 불편하거나, 버그가 있을때 바로 수정해서 사용하기 편리하다. OSGi 번들의 장점을 어느정도 느낄수 있다. 특히 여러가지 과정을 max osgi install로 묶어놔서 더욱 편리하게 사용할수 있는 점이 좋은 것 같다.


 
저작자 표시
신고
posted by Max.
TAG ROO, Spring
2011.08.22 19:56 개발관련
1) 현재 환경이 JDK1.5 이므로, jersey 버전이 낮다(1.2 버젼이다. 1.3은 JDK1.6부터 지원한다). 해당 버전에서는 잘 알려진 버그가 있는데, json으로 array를 전송시, 한개 이상만, array로 보내고, 미만은 일반 객체로 넘겨 버린다. 클라이언트에서 관련 처리를 해주면 좋겠지만, 일관성 측면에서 서버측에서 지속적으로 array로 보낼 필요가 있을 때 이와 같은 방법을 사용해 볼수 있다.


2) 간단히 확장 클래스를 만든다. 아래는 인터넷에 뒤져보면 흔히 볼수 있는 코드와 비슷하다.

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final JAXBContext context;
    private final Set<Class> types;
    private Class<?>[] cTypes ;
    public JAXBContextResolver(Class<?>[] __cTypes) throws Exception {
this.cTypes = __cTypes;
        this.types = new HashSet(Arrays.asList(cTypes));
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);
    }
    
    public JAXBContext getContext(Class<?> objectType) {
        return (types.contains(objectType)) ? context : null;
    }
}



3) DI 한다. 이때 변환될 모델을 필요한 만큼 등록한다.

    <bean class="com.xxx.jersey.resolver.JAXBContextResolver" scope="singleton">
    <constructor-arg>
    <list>
<value>xxx.domain.ChannelDsResponse</value>
<value>zzz.domain.CategoryDsResponse</value>
<value>yyy.domain.CountryDsResponse</value>
<value>www.DirtyWordsDsResponse</value>
</list>
    </constructor-arg>
    </bean>


 4) Test 코드
 

  @Test
    public void testResponseJson() throws IllegalArgumentException, IOException {
        ClientResponse clientResponse = webResource.path("/webservice/rest/Channel/KR/Channels/Category/01000000/1")
        .accept("application/json").get(ClientResponse.class);
        System.out.println("just 1: ===============================================");
    System.out.println(clientResponse.getHeaders());
    System.out.println(clientResponse.getEntity(String.class));
    System.out.println("just 1: ===============================================");
   
    clientResponse = webResource.path("/webservice/rest/Channel/KR/Channels/Category/01000000/2")
    .accept("application/json").get(ClientResponse.class);
    System.out.println("over 2: ===============================================");
    System.out.println(clientResponse.getHeaders());
    System.out.println(clientResponse.getEntity(String.class));
    System.out.println("over 2: ===============================================");
    }


5) 결과

just 1: =============================================== {Date=[Mon, 22 Aug 2011 10:46:50 GMT], Server=[Apache-Coyote/1.1], Content-Type=[ {"resultCode":0,"resultMessage":"","channels":[{"categories":[{"id":"01000000"}], just 1: =============================================== over 2: =============================================== {Date=[Mon, 22 Aug 2011 10:46:50 GMT], Server=[Apache-Coyote/1.1], Content-Type=[ {"resultCode":0,"resultMessage":"","channels":[{"categories":[{"id":"01000000"}], over 2: ===============================================


@Autowired로 DI 할수 있겠으나, 추가할 모델(Bean)들을 언제 늘어날지 모르므로 XML 설정파일로 하는게 편리할듯 싶다. 다른 버전에서는 잘 되는지 확인하지 않았다. 
저작자 표시
신고
posted by Max.
TAG array, jersey, JSON
2011.08.13 11:54 개발관련
Spring Datastore Document MongoDB(SDDM)의 사용 방법은 Reference인 http://static.springsource.org/spring-data/data-document/docs/current/reference/html 이 가장 친절하게 나와 있다. 또한 GitHub의 Quick Start(https://github.com/SpringSource/spring-data-document) 에도 잘 나와 있다. 이 두개를 참조하여 블로거가 정리한 Doc 문서도 있다. http://www.byggy.com/blog/a/spring-data-doc-mongodb.html 하지만 처음부터 설정하려면 잘 안되는게 문제다. 테스트 순서를 간단하게 기록해 봤다.


1) MongoDB를 설치하고 실행 시킨다.  대부분 다운받은걸 압축을 풀어 실행 시키면 된다. 서버용이라면, 메뉴얼을 잘 봐야 할것이다.

2) Java프로젝트를 생성하고 lib 의존성을 설정한다.  보통 스프링을 사용한다면 하나만 추가하면된다.

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring.data.mongo.version}</version>
</dependency>



3)  도메인 모델을 만든다.

public class CodeLog {
     @Id
    private String id;
    private String userAgent;
    private String acceptLanguage;
    private String ip;
    private Date writeDate;
    private Long codeCreatorId;
...(생략)...



4) 스프링 xml 설정을 한다. MongoFactoryBean 과 MongoTemplate를 간단하게 선언한다. 실무용은 좀더 디테일하게 설정할수 있으며, Reference에 잘 나와 있다.

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">


  <mongo:mongo host="localhost" port="27017"/>
  <bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
    <constructor-arg ref="mongo"/>
    <constructor-arg name="databaseName" value="korra-code"/>
  </bean>

...(생략)...



5) Test를 실행한다. SDDM에서는 MongoRepository 등 편리한 클래스를 제공하지만, 입맞에 딱 맞는게 없다. 해당 클래스를 참조하여 도메인에 맞는 Repository를 만드는게 더 좋아 보인다.

@Autowired MongoTemplate mongoTemplate;

@Test
public void testLog(){
mongoTemplate.insert(new CodeLog("2","MSIE", "ko-KR", "127.0.0.1", new Date(), 1L));
CodeLog codeLog = mongoTemplate.findOne(new Query(where("userAgent").is("MSIE")), CodeLog.class);
System.out.println(codeLog);
...(생략)... 

 
6) 테스트 결과

2011-08-13 11:34:29,290 [main] DEBUG org.springframework.data.document.mongodb.mapping.MongoPersistentEntityIndexCreator - Analyzing class class com.ks.code.collector.domain.CodeLog for index information.
2011-08-13 11:34:29,302 [main] DEBUG org.springframework.data.document.mongodb.MongoTemplate - insert DBObject containing fields: [_class, _id, acceptLanguage, codeCreatorId, userAgent, writeDate, ip] in collection: codeLog
2011-08-13 11:34:29,361 [main] DEBUG org.springframework.data.document.mongodb.MongoTemplate - findOne using query: { "userAgent" : "MSIE"} in db.collection: korra-code.codeLog
CodeLog [id=2, userAgent=MSIE, acceptLanguage=ko-KR, ip=127.0.0.1, writeDate=Sat Aug 13 11:34:29 KST 2011, codeCreatorId=1] 

저작자 표시
신고
posted by Max.
2011.08.11 16:06 개발관련

1) Test Code

@Test
public void non_spring_non_blocking() throws InterruptedException{
CollectActor actor = TypedActor.newInstance(CollectActor.class,CollectActorImpl.class);
actor.setTimeAgentLogService(timeAgentLogService);
actor.setTimeAreaLogService(timeAreaLogService);
actor.setTimeLanguageLogService(timeLanguageLogService);
actor.setCollectorService(collectorService);
int count = 1;
do{
System.out.println(count + ") start...");
Thread.sleep(10);
RawLog codeLog = LawLogFixture.get();
CodeCreator codeCreator = CodeCreator.findCodeCreatorsByShortUrlEquals("B").getSingleResult();
codeLog.setCodeCreatorId(codeCreator.getId()); // id 전달
codeLog.setWriteDate(new Date());
actor.collectNonBlocking(codeLog);
count++;
}while(count < 6);
TypedActor.stop(actor);




         @Autowired private CollectActor collectActor;

@Test
public void spring_non_blocking() throws InterruptedException{
collectActor.setTimeAgentLogService(timeAgentLogService);
collectActor.setTimeAreaLogService(timeAreaLogService);
collectActor.setTimeLanguageLogService(timeLanguageLogService);
int count = 1;
do{
System.out.println(count + ") start...");
Thread.sleep(10);
RawLog codeLog = LawLogFixture.get();
CodeCreator codeCreator = CodeCreator.findCodeCreatorsByShortUrlEquals("B").getSingleResult();
codeLog.setCodeCreatorId(codeCreator.getId()); // id 전달
codeLog.setWriteDate(new Date());
collectActor.collectNonBlocking(codeLog);
count++;
}while(count < 6);
TypedActor.stop(collectActor);
}


2) 결과

1) start...
2) start...
[LOG] None Blocking start-----------------------------------------------------
3) start...
4) start...
5) start...
[log]AgentLog insert
[log]LanguageLog insert
[log]AreaLog insert
[LOG] None Blocking end-----------------------------------------------------
[LOG] None Blocking start-----------------------------------------------------
[log]AgentLog insert
[log]LanguageLog insert
[log]AreaLog insert
[LOG] None Blocking end-----------------------------------------------------
[LOG] None Blocking start-----------------------------------------------------
[log]AgentLog insert
[log]LanguageLog insert
[log]AreaLog insert
[LOG] None Blocking end-----------------------------------------------------
[LOG] None Blocking start-----------------------------------------------------
[log]AgentLog insert
[log]LanguageLog insert
[log]AreaLog insert
[LOG] None Blocking end-----------------------------------------------------
[LOG] None Blocking start-----------------------------------------------------
[log]AgentLog insert
[log]LanguageLog insert
[log]AreaLog insert
[LOG] None Blocking end----------------------------------------------------- 

저작자 표시
신고
posted by Max.
prev 1 next

티스토리 툴바