블로그 이미지
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    

Notice

2011. 6. 13. 08:37 개발관련
일반적인 addon 개발 절차는 아래처럼 한다.

1) addon 프로젝트 수정 후

2)  perform assembly
(컴파일)

3) osgi ps
(osgi 번들 확인)

4) osgi uninstall --bundleSymbolicName com.ks.spring.roo.addon.maxservice
(만약 첫번째라면, osgi start 먼저 한다.)

5) osgi start --url http://localhost/testweb/addon/com.ks.spring.roo.addon.maxservice-0.1.0.BUILD-SNAPSHOT.jar 
(현재버전은(1.1.3) window 계열이 아니라면 file:// 로 대신할수 있다.) 

6) osgi ps
(osgi 번들 확인)

7) 이후 타켓 프로젝트에서 테스트 한다.

8) 다시 1)번을 반복한다. 

posted by Max.
TAG addon, ROO

댓글을 달아 주세요

2011. 6. 13. 08:32 개발관련
roo에서 소스생성방법은 크게 두가지다. shell command로 java나 리소스 파일을 생성하는 것과 metadata로 aj파일을 생성하는 방법이다. 각각 쓰임새가 다르다. addon 개발시 특징을 살리면, 효과적으로 개발할수 있다.

1) Command
max service --name ~.account.service.AccountService --entity ~.account.domain.Account 

[생성] ~.account.service.AccountService.java
[생성] ~.account.service.AccountServiceResult.java
[생성] ~.account.service.impl.AccountServiceImpl.java

max web --name ~.account.web.AccountController --service ~.account.service.AccountService

[생성] ~.account.web.AccountController.java

2) Metadata
@Roo_Max_Service
[생성] ~.account.service.impl.AccountServiceImpl_Roo_Service.aj

@Roo_Max_Service_Result

[생성] ~.account.service.AccountServiceResult_Roo_Result.aj

@Roo_Max_Web(
create=true,
update=true,
delete=true,
show=true,
list=true
)

[생성] /src/webapp/WEB-INF/views/accounts/create.jsp
[생성] /src/webapp/WEB-INF/views/accounts/update.jsp
[생성] /src/webapp/WEB-INF/views/accounts/delete.jsp
[생성] /src/webapp/WEB-INF/views/accounts/show.jsp
[생성] /src/webapp/WEB-INF/views/accounts/list.jsp

posted by Max.
TAG addon, ROO

댓글을 달아 주세요

2011. 6. 10. 03:41 Business관련

오리 농장주가 있다. 오리를 키워서 팔아 수익을 남기는 사업을 한다.

오리는 하루 셋끼 먹을것만 주면 만족한다. 사육사는 하루 셋끼 먹을것을 주며, 골고루 먹게 하고, 잘못먹는 오리나, 아픈오리를 돌본다. 사육에 충실한 셈이다. 필시 그것이 오리를 위한 최선이라 믿는다.

농장주는 사육사에 아주 만족한다. 오리들도 역시 만족한다. 이대로 모든것이 좋다.



어느날, 조련사가 왔다. 이 조련사는 오리가 날아야 한다고 한다. 농장주도 사육사도 오리도 생전 처음 듣는 소리고, 당치도 않는 소리라고 한다.

농장주의 주 사업목표에 그런것은 없었다. 날수만 있다면야 관광수익부터해서 할것은 많겠지만, 괜한 짓한다 생각이 든다.
 
오리는 '날다'는 자체를 이해하지 못한다. 어쩌면 자신이 날개를 가지고 있다는 것 자체를 인식하지 못하고 있었던것 처럼...

조련사는 무엇때문에 날아야 한다고 했을까....? 조련사는 이대로 모듯것이 좋은 농장에 왜 지글러 역할을 자처한 것일까...? 이런 조련사는 어떻게...




위내용은 적어도 어떤 것을 책임지고 리딩하는 사람은, '배를 만들어라' 라는 지시 보다, '대양에 대한 꿈'을 이야기하는 것이 바람직하다는 말과 상통한다. 

오리가 날수 있다는 희망을 가지는 그날까지.... 

'Business관련' 카테고리의 다른 글

돌연변이 변수 투입시점  (0) 2011.07.20
홀로서기(1) - 기초 정보 모으기  (0) 2011.07.01
사육사와 조련사  (0) 2011.06.10
Social Game 개발  (0) 2011.04.26
Google Apps Marketplace  (0) 2011.04.26
한가지를 갖기 위해...  (2) 2011.03.14
posted by Max.

댓글을 달아 주세요

2011. 6. 5. 09:49 개발관련
기본의 무식하게 절차적인 방법으로 작은 소스코드 생성에도 많은 코딩량 때문에 지쳤었는데, 멋지네... 그런데 XML(설정이나 메이븐)은 아직도 고전적인 방법인가? Template를 이용하면 될것 같은데...

1) shell command를 직접 이용하는 방법

// -----------------------------------------------------------------------------------
// Create User entity
// -----------------------------------------------------------------------------------
shell.executeCommand("entity --class " + entityPackage
+ ".User --testAutomatically --permitReservedWords");
shell.executeCommand("field string --fieldName firstName --sizeMin 1 --notNull");
shell.executeCommand("field string --fieldName lastName --sizeMin 1 --notNull");
shell.executeCommand("field string --fieldName emailAddress --sizeMin 1 --notNull --unique");
shell.executeCommand("field string --fieldName password --sizeMin 1 --notNull");
shell.executeCommand("field date --fieldName activationDate --type java.util.Date ");
shell.executeCommand("field string --fieldName activationKey ");
shell.executeCommand("field boolean --fieldName enabled ");
shell.executeCommand("field boolean --fieldName locked ");



2) Template를 이용하는 방법

Map<String, String> map = new HashMap<String, String>();

map.put(pathResolver.getIdentifier(Path.SRC_MAIN_JAVA,
finalControllerPackage.replace('.', separator) + separator
+ "ChangePasswordController.java"),
"ChangePasswordController.java-template");

map.put(pathResolver.getIdentifier(Path.SRC_MAIN_JAVA,
finalControllerPackage.replace('.', separator) + separator
+ "ChangePasswordForm.java"),
"ChangePasswordForm.java-template");



이제 노트북끄고, 놀려가야지...
 
 
posted by Max.
TAG addon, ROO

댓글을 달아 주세요

2011. 6. 5. 09:27 개발관련
DWR처럼 Sitemesh도 너무 오랫동안 처다보지 못해서, 설정방법이 오래되어 있었는데, 3.0에서는 설정방법이 다양해질듯 하다. 아직 알파버전이라 적용하긴 힘들겠지만, 조만간 버전업되면, 바꿔야 할것이다. 

주요내용은 이 사이트를 참조 하자. 

http://www.sitemesh.org/new-in-sitemesh3.html

 
posted by Max.
TAG Sitemesh

댓글을 달아 주세요

2011. 6. 5. 09:10 개발관련
내가 이글(http://yunsunghan.tistory.com/137)를 쓴지가 벌써 3,4년 전이였는데 아직도 그설정 그대로 사용하고 있는걸 보니, 이젠 뭔가 바뀌어 있지 않을까 하고 찾아 봤다. 별고 바뀐건 없지만, 한가지 눈에 띄는게 있다. @DataTransferObject 인데, 그땐 발견하지 못한건지, 적용하지 못하고 있음을 과거글에서 찾아 볼수있다. 모델 매핑은 XML에서 하고 있으니 말이다. 

경기도 시흥에 1박으로 놀려놨다가 아침에 다른(addon)것 찾아보다 발견하여 기록해본다. @DataTransferObject를 적용하는 방법은 여기(http://www.butterdev.com/dwr/2010/10/dwr-spring-and-annotations/)에 잘 나와 있다. 핵심은 아래 코드를 참조하자. 

[XML설정]

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
       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-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">
  
   <dwr:configuration />   
   <dwr:annotation-scan base-package="org.uk.ltd.dwr.dev" scanDataTransferObject="true" scanRemoteProxy="true"/>   
</beans>



[소스코드-Bean]

@DataTransferObject
public class Address {
private String street;
...


[소스코드-Biz]

@RemoteProxy(name="dwrService")
public class DWRService {
public DWRService() { }
@RemoteMethod
public Address getAddress() throws Exception {
Address address = new Address();
address.setStreet("2245 NW Overlook Drive");
address.setCity("Portland");
address.setState("Oregon");
return address;
}
     ... 

posted by Max.
TAG DWR

댓글을 달아 주세요

  1. . 2011.11.17 10:50  Addr Edit/Del Reply

    감사합니다.

  2. .. 2011.11.17 10:52  Addr Edit/Del Reply

    dwr android client는 없던가요? 구하고 있는데. ㅋ(오지랍 지데로)

2011. 4. 26. 09:48 Business관련
작년엔가 컨설팅프로젝트에서 SNS에 대해서 많은 자료를 본적이 있다. 그때 '징가'라는 업체가 소셜게임으로 이름 좀 날리고 있다는것을 봤다. 당시 유행인 스토어에서 Top에 오른 앱들은 승자독식 원리를 톡톡히 보고 있었고, 나머지 들러리 들은 이슬만 먹고 사는 것을 느꼈던것 같았다.

이런 파레토식의 나열된 환경에서 게임분야는 그 꽃(백미)이다. 말 그대로 모 아니면 토다. 게임 자체가 마치 도박처럼 강한 중독성이 있는데다, 환경이 받쳐주니, 게임하나 뜨기만하면, 인생역전인 것이리라... 뜨지 못해도 약간의 가능성이 있다면, 그걸 부여잡고 인생을 걸 사람이 한둘이 아니겠지...

최근 그런 게임을 만들겠다던 사람들을 도와주고 있다. 나름 시나리오 계획서 등을 갖추고 있다. 이번 시나리오에서 서버측 개발이 그리 어려운것도 아니고, 한발 담궈 보는것도 좋은 경험이 될것 같고, 혹시나 하는 중독성도 즐겨볼겸....

단순하고, 쉬운 게임은 훗날에도 좋은 비지니스 아이템중에 하나임을 틀림없지만, 내가할 분야인지는 여전히 의심럽긴 하다.... 아이디어 싸움인가?....
 

'Business관련' 카테고리의 다른 글

홀로서기(1) - 기초 정보 모으기  (0) 2011.07.01
사육사와 조련사  (0) 2011.06.10
Social Game 개발  (0) 2011.04.26
Google Apps Marketplace  (0) 2011.04.26
한가지를 갖기 위해...  (2) 2011.03.14
10년의 약속 4번째 시작  (0) 2011.02.14
posted by Max.

댓글을 달아 주세요

2011. 4. 26. 09:33 Business관련
Google Apps Marketplace(GAM)은 요즘 흔한, SNS 스토어 개념의 비지니스 환경인데, 주로 B2B 관련 어플을 등록하고 마케팅하는 곳이다. 어플을 테스트 하기 위해서는 최소한 기업계정 하나는 있어야 하는데, 1개월을 테스트할수 있고, 이후 1년 사용비용이 1계정당 50달러 이다. 도메인을 연결하여 일반 중소기업이 사용할수 있도록한 것인데, 아직 국내 중소기업이 쓰기엔 비싼감이 있다(제공되는 기능을 떠나서 금액에 대한 심리적 마지노선이라 할까...). 몇몇 리셀러가 있는데, 그리 잘 되진 않는 모양이다.

https://www.google.com/enterprise/marketplace/?pli=1


GAM에 어플을 등록하고 공개하려면, 최초등록비 100달러를 지불해야 한다. 이것은 비지니스를 하는것인만큼 그리 비싸 보이진 않지만, 일반 기업들의 구매를 유도하려면, 추가비용으로써 적절한 가격이여야 하는데, 중소기업의 지갑을 열수 있을가 의문도 있다.

이것 저것을 다 떠나서, 웹 어플 또는 기존에 보유한 웹 솔루션을 연동하여 비지니스 영역을 넓히는데는 좋은 가능성을 볼수도 있겠다. 아쉬운것은, 기업계정 하나당 50달러라는 부담감이 국내 일반 중소기업에서 부담할수 있는 금액인가 하는 것인데, 항당되는 계정당 용량을 줄여서라도 금액을 낮추면 활발해질것 같은 생각인데, 구글은 다른가 보다...


'Business관련' 카테고리의 다른 글

사육사와 조련사  (0) 2011.06.10
Social Game 개발  (0) 2011.04.26
Google Apps Marketplace  (0) 2011.04.26
한가지를 갖기 위해...  (2) 2011.03.14
10년의 약속 4번째 시작  (0) 2011.02.14
나와 동유 사진  (0) 2011.01.26
posted by Max.

댓글을 달아 주세요

2011. 4. 11. 17:24 개발관련

Spring STS 2.6.0에서 Flex addon 모듈을 사용하는 순서를 기록해 본다. 일반적으로 SpringRoo addon은 addon install 명령으로 가능하다. 그에 대해 동영상도 많이 제공하고 있다.

flex addon 관련되서는 https://www.youtube.com/watch?v=R84O87HPCQU&feature=player_embedded 를 보면, 쉽게 따라할수 있게 되어 있다. 하지만 하루가 다르게 바뀌는 roo의 특성상 잘 되지 안는다는거... 아마도 버전이 업데이트 되면서 여기저기 신경 쓸께 많을 것이다. 그래서 한번 테스트 해봤다. 

1) 먼저 springroo flex addon을 roo에 설치 해야 한다. http://s3browse.springsource.com/browse/maven.springframework.org/snapshot/org/springframework/flex/roo/addon/org.springframework.flex.roo.addon/1.0.0.BUILD-SNAPSHOT/ 에(OR http://s3browse.springsource.com/browse/maven.springframework.org/snapshot/org/springframework/flex/roo/addon/)  보면, 4월 10일자 최신 버전을 다운 받을수 있다. 다운받고, roo의 bundle 폴더에 넣는다.

2) Spring STS를 실행하고, Roo프로젝트를 생성하면, flex 명령이 추가되었음을 확인 할수있다.

3) Roo 스크립트는 다음과 같은 순서로 명령을 실행한다.
project --topLevelPackage kr.sng --projectName sng-server --java 6
persistence setup --database MYSQL --provider HIBERNATE
entity --class ~.article.domain.Article --testAutomatically
flex setup
flex remoting all --package ~.article.service
생성된 핵심 코드는 아래와 같다.

[ArticleService.java]
@RooFlexScaffold(entity = Article.class)
@RemotingDestination
@Service
public class ArticleService {
}

[ArticleService_Roo_Service.aj]
privileged aspect ArticleService_Roo_Service {
   
    public Article ArticleService.create(Article article) {
        article.persist();
        return article;
    }
   
    public Article ArticleService.show(Long id) {
        if (id == null) throw new IllegalArgumentException("An Identifier is required");
        return Article.findArticle(id);
    }
   
    public List<Article> ArticleService.list() {
        return Article.findAllArticles();
    }
   
    public List<Article> ArticleService.listPaged(Integer page, Integer size) {
        if (page != null || size != null) {
            int sizeNo = size == null ? 10 : size.intValue();
            return Article.findArticleEntries(page == null ? 0 : (page.intValue() - 1) * sizeNo, sizeNo);
        } else {
            return list();
        }
    }
   
    public Article ArticleService.update(Article article) {
        if (article == null) throw new IllegalArgumentException("A article is required");
        article.merge();
        return article;
    }
   
    public void ArticleService.remove(Long id) {
        if (id == null) throw new IllegalArgumentException("An Identifier is required");
        Article.findArticle(id).remove();
    }
   
}

4) 생성된 mxml 코드는 정상적으로 실행되지 않는다. 하지만, 생성된 mxml코드를 참조해서 아래와 깉이 flex builder를 통해서 Main.mxml 파일을 생성 할수 있다.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
 <fx:Script>
  <![CDATA[
   protected function getDataClickHandler(event:MouseEvent):void
   { 
    articleService.list();
   }
  ]]>
 </fx:Script> 
 <fx:Declarations>
  <s:ArrayList id="entities">
   <fx:String>Article</fx:String>
  </s:ArrayList>
  <s:ChannelSet id="remotingChannels">
   <s:AMFChannel id="amf" url="http://localhost:8080/sng-server/messagebroker/amf"/
  </s:ChannelSet>
  <s:RemoteObject channelSet="{remotingChannels}" destination="articleService" id="articleService">
  </s:RemoteObject> 
 </fx:Declarations>
 <s:VGroup width="100%" height="100%">
  <s:Button label="아티클 목록 가져오기" click="getDataClickHandler(event)"/>
  <mx:DataGrid dataProvider="{articleService.list.lastResult}" height="80%" id="articleGrid" width="80%">
   <mx:columns>
    <mx:DataGridColumn dataField="title" headerText="Title" id="titleColumn"/>
    <mx:DataGridColumn dataField="count" headerText="Count" id="countColumn"/>
    <mx:DataGridColumn dataField="userName" headerText="User Name" id="userNameColumn"/>
    <mx:DataGridColumn dataField="userId" headerText="User Id" id="userIdColumn"/>
    <mx:DataGridColumn dataField="writeDate" headerText="Write Date" id="writeDateColumn"/>
   </mx:columns>
  </mx:DataGrid>
 </s:VGroup>
</s:Application>


간단한 코드로 대충 보면, 데이터를 불려오는 것 뿐이다. 실행하면 데이터를 잘 가져온다. 물론 SpringFlex에 대해서 미리 알고 있어야 하고, Flex에 대해서도 알고 있어야 겠지만, 천천히 생성된 소스코드와 구조를 살펴보면, 기존의 spring-flex를 이용한 프로젝트 구조와 거의 같고, Flex Scaffold는 오히려 기존의 복잡한 UI(다른 Scaffold)보다 간단하여 응용의 여지가 많이 보인다.(예제에서 ArticleService.java와 ArticleService_Roo_Service.aj를 보라)

최근 작업중에 서버측 템플릿을 만들 일이 있어 간단히 테스트해 봤는데, 가능성 있어 보인다. 게다가 아직 M1 버전이다. :)

posted by Max.

댓글을 달아 주세요

2011. 3. 14. 08:47 Business관련
하나를 갖기 위해 다른 모든걸 버리라고 한다. 그랬을때 그 하나를 갖을수 있다고 한다... 다른 많은걸 버린다는건 아픈것이다. 아픔을 이겨내는 것이 곧 어떤 하나를 얻는 것이 되는 셈이다. 그런 아픔을 감수하고서라도 그 하나를 얻는것이 소중한 것이어야 한다. 그렇치 않으면 그 하나를 얻기위해 감당할 아픔이 너무 크다.

그 하나가 무엇이든 그래서 진중해야 한다...
하나를 얻는다는 것... 
쉬운게 아닌듯하다...

'Business관련' 카테고리의 다른 글

Social Game 개발  (0) 2011.04.26
Google Apps Marketplace  (0) 2011.04.26
한가지를 갖기 위해...  (2) 2011.03.14
10년의 약속 4번째 시작  (0) 2011.02.14
나와 동유 사진  (0) 2011.01.26
아들 사진 두장  (2) 2011.01.25
posted by Max.
TAG

댓글을 달아 주세요

  1. Favicon of http://bleu.pe.kr BlogIcon bleu 2011.03.30 23:17  Addr Edit/Del Reply

    형 방가 ~_~ 지메일 느려서 일본해저케이블땜시 그런가 해서 검색중 형 블록이 걸리더군요... ㄷㄷㄷ

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2011.04.04 17:41  Addr Edit/Del

      그래 반갑다. 언제부터, 메신저에 없더라... 찾아서 추가하마...