업체에서 윈도우를 만들고, 트레이아이콘형태로 애플리케이션을 띄워달라고해서 SWT까지 손을 대는군요-_-;

디자인할 수 있는 툴로는 유료로 Window Builder라는 것이 있는 것 같은데요. SWT Designer, SWING Designer 등의 툴이 있는 것 같아요. 안써봐서 모르겠네요^^
그리고, 무료로 좋은 것이 하나 있는데, 그것이 넷빈즈(NetBeans)입니다. 넷빈즈는 무료임에도 불구하고 엄청난 디자인툴을 제공합니다. 넷빈즈가 저는 훨씬 좋은데, 프로젝트가 다 이클립스로 되어있어서 이클립스로 하는 법을 찾다가 Visual Editor를 알게 되었네요. (사실....Visual Editor가 없는 게 더 나은 것 같습니다-_-; 이걸로 만들면 코드가 개판이 됩니다-_-)

이클립스 3.4를 실행합니다.
Visual Editor가 원래는 이클립스 공식 플러그인이였는데, 이제 지원을 안하는 것 같아요.
Help -> Software Updates에서 Available Softeware탭에서 Add Site한다음에
http://update.soyatec.org/Ganymede/ve/1.4/ 를 추가합니다.
열어보면 Visual Editor 1.4가 있습니다. 체크하고 Install합니다.

이클립스 리스타트하고, New Java Project를 생성합니다.
Project Name은 SWTTest로.....
src에 대고, New -> Other -> Wizard에 Shell이라고 치면, Java -> SWT -> Shell Visual Class가 나옵니다.
선택하고, SWTTest라고 해줍니다. 그리고, public static void main에 체크를 합니다.

그러면 위에 디자인이 보이고, 아래에 코드가 보입니다. 오른쪽에는 Pallette가 있어서 원하는 Control이나 Container를 가져다 쓸 수 있습니다.
사용자 삽입 이미지
실행하면 그냥 창이 뜰겁니다.
이거 배포할 때도 디게 쉽습니다.
Export 선택 후, Java -> Runnable JAR file이라고 있는데, 이걸 선택하면 자동으로 실행가능한 jar파일로 생성해줍니다. 윈도우에서 jar파일 더블클릭만하면 실행됩니다.

아무런 코딩을 안했는데, 2메가네-_-;
 
Posted by 머드초보
,
 
오늘 아침부터....저녁까지 케삽질을 하고 있었습니다.
제 PC에서는 한글로 잘 나왔는데, 실제 옮겨질 서버(Windows Server 2003)에서 돌리면 한글 부분이 물음표(???)로 나오는 현상이 있었습니다.

삽질하다 안되서 그 윈도우서버2003에 이클립스(Eclipse)를 설치했습니다-_-; 그리고, 소스코드를 옮겨놓으니....디폴트가 CP1252로 소스코드가 되어있어서 한글이 다 깨져서 보이더군요. 분명 한글윈도우서버2003인데 이상하더군요. (CP1252는 영문윈도우 코드페이지라는군요).
그래서 강제로 MS949로 바꾸고, 한글로 고쳤습니다.
그리고, 이클립스에서 실행하는 CONSOLE창에서는 제대로 나오는 겁니다.

하지만, 그 실행파일로 실행을 하면 그대로 한글이 깨집니다-_-;
그래서 생각했습니다. 자바를 실행할 때 뭔가 옵션이있다!
그래서 구글신님께 물어보니 이런 실행방법이 있었습니다.

[code]-Dfile.encoding=MS949[/code]
실행시 인코딩을 정하는 것 같습니다.

[code]
java -Dfile.encoding=MS949 ~~~메인클래스명
[/code]
이렇게 띄우니까 한글이 나오더군요!

젠장 하루종일 삽질했네-_-;

 
Posted by 머드초보
,
 
둘째날 후기입니다.

처음부터 Hands on Lab시간을 신청해서 그것을 들으러 갔습니다. 그.....쓰리다 레디(Sridhar Reddy)가 있었습니다. 아....속 쓰리다....-_-; 이름가지고 장난치면 안되는데-_-;
NetBeans를 이용한 JavaFX시간입니다! 이 JavaFX를 넷빈즈를 통해서 쉽게 개발할 수 있었습니다. 아직 JavaFX는 SDK가 preview버전이더군요. 아직 멀은 것 같습니다.

1.JavaFX SDK 시작하기 / Sridhar Reddy
가장 먼저 예제를 실행하는 사람에게 티셔츠를 준다고 했는데요. 저는 어제 Hands-on-Lab에서 느린 인터넷 속도를 체험을 했기때문에 집에서 먼저 예제를 실행하고 왔습니다-_-; 그래서 제가 티셔츠를 받았습니다-_-; 티셔츠가 2개가 되버렸군요-_-; 어제도 받았는데 ^^ 암튼, JavaFX로 동영상 재생이 플렉스처럼 쉽습니다^^ 음악재생도 쉽구요. 여러가지 다양한 Effect들과 Draw기능들이 있는데, 주로 Visual에 맞춘 것 같습니다. 게다가 직관적인 코드를 중심으로 설계를 한 것 같습니다. 앞으로 어떻게 발전할지 기대됩니다 ^^

밥은 뷔페로......-_-;

2. EJB 3.0 / Sridhar Reddy
뭔가 조정이 된 듯 합니다. 원래 AMD어쩌구 였는데, EJB3.0소개 시간으로 바뀐 것 같습니다. 어쨌든, EJB는 전혀 안해봐서 이해가 잘 안됐는데요. 말을 들어보니 그 전버전보다 라이트해지려고 노력을 많이 한 것 같습니다. POJO로 돌아가려고 한 것 같구요. Entity Bean을 애노테이션을 통해 구현으로 하구요. 여기에 포함되어 있는 JPA(Java Persistance Api)는 독립적으로 나와서 EJB없이 독립적으로도 사용이 가능하다는군요. 제가 예전에 올린 웹서비스예제를 보시면 ejb를 안쓰는데, JPA를 쓴 것을 볼 수 있습니다 ^^
Entity Bean에서 애노테이션을 통해 간소화 하려는 것을 느낄 수 있었습니다. @OneToMany, @ManyToOne 등의 직관적인 애노테이션들이 보이더군요. 시간나면 EJB도 해봐야겠습니다^^ 간단하다며 예제를 보여주긴 했는데, 전혀 간단해 보이지 않습니다-_-; 하긴 처음에 ejb의 대안으로 라이트웨이트형태로 나온 스프링도 엄청 복잡하다고 생각했으니 ^^

3. Comet 및 Ajax를 이용한 웹애플리케이션 개발 / Michael Li
오.....이거 물건입니다. Comet이라는 건데요. 기존 Ajax에서는 Client가 요청해서 데이터를 주고 받을 수 있는데요. 이 Comet는 다른 클라이언트에서 요청을 하면 이벤트를 발생시켜 현재 Connect된 클라이언트에 데이터를 줄 수 있다고 하는군요. 제가 설명을 그지같이 하는데, 즉 서버-클라이언트 모델 형태로 서버에서 push가 가능하다는 얘기입니다 ^^
제가 예전에 Ajax를 이용해서 오목을 만들었는데, 이것을 구현할 때 다른쪽 클라이언트가 데이터를 받아야할 때에는 데이터가 있는지, 계속 Polling을 하면서 확인을 했었습니다. 이렇게 폴링을 안해도 된다는 얘기입니다. 발표하면서 아쉬웠던 점은 예제구현으로 하려고 하는데, 예제 구동이 안되었습니다. 제가 보기엔 넷빈즈 껐다 키면 될 듯 싶었는데-_-; 넷빈즈에서 가끔 글래스피쉬가 맛이 갈 때가 있더라구요-_-; (넷빈즈....버그가 엄청많고, 아직도 불안하다고 생각하는 1인입니다^^) 이것도 해봐야겠습니다^^

4. 기업환경 프레임워크에 필요한 것들 / 임수경
아....졸았습니다-_-; iBATIS는 ORM이 아니고 SQL Map인데 왜 ORM에 분류를 해놨을까요-_-; 그냥 기업환경에 프레임워크를 선택할 때 기준이나 뭐 그런 것을 설명한 것 같습니다. 기술적인 내용이 아니였습니다^^

5. EJB3, Spring, SEAM / Chuk-Munn Lee
EJB3을 얘기하고, 그의 대안이나 보완하는 기술인 Spring, SEAM에 대해서 설명했습니다. 둘중 더 나은 것을 얘기하는 것이 아니라, 이런 대안이 있다는 것을 알려주는 강의라고 하더군요. 사전에 재미있는 말은...EJB를 모르면 강의가 끝나도 뭔 개소리인지 모를 것이라고 하더군요. 맞습니다. 저도 한 절반만 이해한 듯 하군요.
우선 JPA, JSF 등 ejb에 대해서 소개를 하고(근데, 스프링과 상당히 흡사하다고 생각했습니다...하긴 대안으로 나온거니-_-) 플로우에 대해서 설명했습니다.
그리고, 해당 플로우에 Spring을 적용하면 어떻게 변경되는가를 설명하는 식으로 했습니다. 스프링의 장점인 DI, AOP, 용이한 테스트를 설명하고, 스프링 기술에 대해 간단히 설명했습니다. 최근에 나온 애노테이션 방식의 스프링의 쉬운 코딩도 보여주고요. @Autowired가 대규모의 문제가 있다는 의견이 있었다는 얘기도 해줬네요^^ 대규모가 되면 어떤 눔이 Autowired가 된지 모르니 그런거라는데...명시적인 네이밍룰을 잘 하면 될 것같은데....
그리고, Seam을 설명했는데, 이거 뭔소리인지 잘 모르겠습니다. Bijection이라는 개념을 설명했는데, 1번 Injection되면 다시 안되는데, 다시 Injection을 하는건지 거꾸로 인젝션을 하는건지 모르겠습니다.-_-; @In, @Out이라는 어노테이션으로 막 설명하던데 잘 모르겠어요--;
간단히 마지막에 정리를 하니, Spring은 J2EE의 대체모델이고, Seam은 J2EE에 붙여주는 개념이라고 하네요-_-;
이 분 "뚜~ 뚜~" 라는 말을 자주 써요 ^^

아... 회사 휴가내고 선테크데이를 갔다왔습니다. 우선 유용한 기술들을 배워서 좋기는 하지만, 이 기술들을 써먹을 날은 먼 미래가 될 것 같네요. 좋은 기술들이 나와도 회사들은 그 기술을 사용함을 꺼려하죠. 기존에 쓰던 것에 익숙해 새로운 것을 써먹으려면 배우기도 귀찮고, 어떤 문제점이 발생할지도 모르기 때문인 것 같습니다.
하지만, 전 생각이 다릅니다. 새로운 기술은 기존 개발 시 문제가 됐던 것을 더욱 편하게 하기 위해서 나온 것이 많습니다. 그리고, 개발자들의 편의를 위한 기술들이 많죠.
스프링만 봐도 기존에 사용했던 J2EE의 복잡함을 간소화 하기 위해서 탄생했다고 들었습니다. Ajax 또한 Javascript를 활용하여 웹에서 구현하기 힘든 부분을 쉽게 구현하는데에 사용됩니다. 개발자들의 조금 더 노력하면 더욱 편하게 개발할 수 있을 것 같아요^^
 
Posted by 머드초보
,
 
전시간에 이어서.....
이걸 좀 수정해봅시다.

우선 List를 받으려면 idx, 제목, 글쓴이의 정보가 필요합니다. 하지만, 기본적인 RESTful 웹서비스를 생성하게 되면 idx밖에 반환하지 않습니다. 이걸 고쳐봅시다.

boarddb.converter패키지에 WsboardsConverter클래스가 있습니다.
클래스 위에 XmlRootElement(name = "wsboards")라는 것이 붙어있습니다. 그렇습니다. 클래스형태가 바로 애노테이션 하나로 xml이 되버립니다-_-;(동작원리는 잘 모르겠네요-_-)
현재 데이터를 이런 식으로 반환합니다.
[code]<wsboards uri="http://localhost:9080/BoardWS2/resources/wsboards/">
    <wsboardRef uri="http://localhost:9080/BoardWS2/resources/wsboards/33/">
        <idx>33</idx>
    </wsboardRef>
[/code]
여기에 subject와 writer를 추가해봅시다.
wsboardRef쪽에다가 추가를 해야하니, WsboardRefConverter클래스를 봅시다.
@XmlRootElement(name = "wsboardRef")가 붙어있습니다. @XmlElement애노테이션을 붙이면 Element를 생성할 수 있습니다.
[code]@XmlElement
public String getWriter() {
    return entity.getWriter();
}
@XmlElement
public String getSubject() {
    return entity.getSubject();
}
[/code]
이렇게 2개를 추가했습니다. 그리고 게시판은 최근글이 마지막에 보여야하므로 쿼리를 수정합니다.
WsboardsResource클래스의 getEntities메소드를 봅시다.
쿼리를 아래와같이 수정합니다.
[code]SELECT e FROM Wsboard e ORDER BY e.idx DESC"[/code]
다시 테스트를 해봅시다.
이제 이렇게 나올겁니다.
[code]<wsboardRef uri="http://localhost:9080/BoardWS2/resources/wsboards/33/">
      <idx>33</idx>
      <subject>111</subject>
    <writer>11</writer>
</wsboardRef>[/code]
와우 List는 이제 구현이 다되었습니다-_-;

List를 가져올 때 총 게시물을 뽑아서 나중에 페이징을 할 때 사용해야합니다. 총게시물을 구하는 쿼리는
[code]SELECT count(e) FROM Wsboard e[/code]
이렇게 하면 되더군요.
그럼 WsboardsResource.java파일의 @GET부분을 다음과 같이 바꿉시다.
[code]try {
    Long count = (Long)PersistenceService.getInstance().createQuery("SELECT count(e) FROM Wsboard e").getSingleResult();
    return new WsboardsConverter(getEntities(start, max), context.getAbsolutePath(), count);
} finally {
    PersistenceService.getInstance().close();
}
[/code]
카운트값을 xml에 표기를 해야하니 WsboardsConverter를 수정해야겠죠?
[code]
private Long count; // 추가
public WsboardsConverter(Collection<Wsboard> entities, URI uri, Long count) {
        this.entities = entities;
        this.uri = uri;
        this.count = count;
    }
[/code]
count변수를 추가하고, 생성자를 저렇게 생성하도록 바꿉니다.
속성값으로 count를 추가해야겠죠?
[code]
@XmlAttribute(name = "count")
    public String getCount() {
        return count.toString();
    }
[/code]

이제 1개데이터 가져오기를 구현해봅시다. 사실.....이건 다 되어있군요. Test RESTful Web Service에서 {idx}에서 해당 idx를 넣고 Test눌렀을 때 정상적으로 나오면 된겁니다 ^^

이제 DELETE와 MODIFY 2개가 남았습니다.
DELETE를 구현하기 위해서는 db에 저장된 비밀번호와 입력한 비밀번호의 비교를 위해서 비밀번호를 받는 것을 하나 추가합시다. 저는 그냥 경로에 추가했습니다. 보안상 매우 안좋지만...-_-; 어떻게 하는지 몰라서-_-;

WsboardsResource.java파일에서 @Path("{idx}/") -> @Path("{idx}/{pwd}")로 바꿨습니다.
그리고, 1개의 PathParam을 받았던 것을 pwd도 받게 바꿨습니다. 그리고 WsboardResource클래스에 pwd를 추가하고, 생성자를 수정했습니다.

WsboardsResource.java파일
[code]@Path("{idx}/{pwd}")
public WsboardResource getWsboardResource(@PathParam("idx")
Integer id, @PathParam("pwd") String pwd) {  
    return new WsboardResource(id, pwd, context);
}
[/code]
WsboardResource.java파일
[code]private String pwd; //추가
public WsboardResource(Integer id, String pwd, UriInfo context) {
    this.id = id;
    this.pwd = pwd;
    this.context = context;
} // 생성자 수정
[/code]
이제 /wsboards/{idx}/{pwd}로 요청하면 idx와 pwd를 받을 수 있습니다.

DELETE를 수정해봅시다.
[code]@DELETE
public Response delete() {
    PersistenceService persistenceSvc = PersistenceService.getInstance();
    try {
        Wsboard entity = getEntity();
        if (entity.getPwd().equals(pwd)) {               
            persistenceSvc.beginTx();
            persistenceSvc.removeEntity(entity);
            persistenceSvc.commitTx();
            return Response.ok("success").build();
        }
    } finally {
        persistenceSvc.close();
    }
    return Response.ok("fail").build();
}
[/code]
간단합니다. 받은 pwd랑 현재 입력된 pwd랑 같은지 확인 후에 맞으면 지우고 success를 리턴하고, 틀리면 fail을 리턴합니다. 테스트를 해볼 수 있는데요. 한번 지워보시면
[code]Delete failed: Server returned --> Status: (200) Response: {success}
[/code]저는 이런 메시지를 받습니다. Delete failed라고 뜨는데요. 그래도 success라는 응답을 받고 db에서 보면 지워졌을 겁니다. 보면 DELETE는 뭔가 리턴을 하면 안되는 듯 합니다. 암튼...잘 되니...-_-;

이제 PUT을 수정해봅시다.
[code]@PUT
@ConsumeMime({"application/xml", "application/json"})
public Response put(WsboardConverter data) {
    PersistenceService persistenceSvc = PersistenceService.getInstance();
    try {
        Wsboard entity = getEntity();
        if (entity.getPwd().equals(pwd)) {
            persistenceSvc.beginTx();
            updateEntity(getEntity(), data.getEntity());
            persistenceSvc.commitTx();
            return Response.ok("success").build();
        }
    } finally {
        persistenceSvc.close();
    }
    return Response.ok("fail").build();
}
[/code]
이것도 그냥 pwd랑 같으면 수정시키고 success를 리턴하고, 틀리면 수정 안시키고 fail을 리턴합니다.
테스트해봅시다.
테스트할 때 주의사항이....xml로 데이터를 던져야 하는데요. idx빼고 모든 값이 다 들어가야합니다.
PUT으로 맞춰놓고, idx랑 pwd를 쓴 다음 content란에 이렇게 씁니다.
[code]<wsboard>
<pwd>1</pwd>
<writer>11</writer>
<subject>22</subject>
<content>33</content>
</wsboard>
[/code]
idx빼고 다 넣어야합니다. 그러면 업데이트가 됩니다.

아....다 됐네요. 아.....POST로 글쓰는 것을 빼먹고 안했는데요. 그냥 위처럼 XML로 넘겨주기만 하면 돼요 ^^
flex로 게시판 만드는 것도 해야하는데, 졸려서 내일로.....-_-;

내일은 선테크데이2008가야지-_-;

[JAVA] netbeans 초간단 게시판을 위한 RESTful WebService를 만들어봅시다-_-; (1)


[Flex/AIR] RESTful을 이용한 Web Service 게시판 클라이언트.

 
Posted by 머드초보
,
 
우선 저도 잘 모르는 상태에서 삽질을 한거라....잘못된 점 있으면 바로바로 태클을 걸어주세요~

우선 리스트데이터 가져오기.
resources/wsboards/ 형태로 요청을 하면 데이터를 가져옵니다.
WebService로 넘겨줘야할 값은 start값과 max값을 넘겨줘서 값을 가져옵니다. method는 GET입니다.

1개 게시물데이터 가져오기.
이것은 url로 resource/wsboards/{idx}/ 하면 해당 idx에 맞는 데이터를 가져옵니다. method는 GET입니다.

게시물 쓰기
resources/wsboards/로 xml형태의 글쓴이, 제목, 내용, 비밀번호 등의 정보를 보내줍니다. method는 POST입니다.

게시물수정
resources/wsboards/{idx}/{pwd}로 xml형태의 글쓴이, 제목, 내용, 비밀번호 등의 정보를 보내서 {pwd}랑 맞으면 수정합니다. method는 PUT입니다.

게시물삭제
resources/wsboards/{idx}/{pwd}로 요청해 pwd랑 서버에 있는 데이터pwd랑 비교해서 맞으면 삭제합니다. method는 DELETE입니다.

요렇게 5가지만 있으면 되겠군요.

저는 NetBeans6.1 + GlassFish V2 + MySQL 5.0에서 했습니다 ^^
우선 DB를 만듭시다. MySQL을 실행해서 해당 wsboard 테이블을 만듭니다.
[code]DROP TABLE IF EXISTS `mudchobo`.`wsboard`;
CREATE TABLE  `mudchobo`.`wsboard` (
  `idx` int(10) unsigned NOT NULL auto_increment,
  `writer` varchar(10) NOT NULL default 'writer',
  `pwd` varchar(10) NOT NULL default 'pwd',
  `subject` varchar(50) NOT NULL default 'subject',
  `content` text,
  PRIMARY KEY  (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8;
[/code]

1. 넷빈즈6.1을 실행합니다.

2. New Project -> Web -> Web Application -> Project Name은 BoardWS로.....
서버는 GlassFish V2로 합니다. (tomcat으로 해도 되는데, 테스트가 용이하지 않아요!). Finish!

3. 해당프로젝트에 New -> Entity Classs from Database -> Data Source 선택, New Data Source -> JNDI Name에는 jndi/board, Database Connection에는 New Database Connection선택, Name을 MySQL로 바꿔주고, 알맞게 셋팅합니다 ^^ 그리고 확인을 누르면 해당 database에 있는 모든 테이블을 가져옵니다. 이중에 우리가 만든 wsboard테이블을 선택하고 add합니다 ^^
pakage는 boarddb라고 합시다. 아래 Create Persistence Unit를 선택해서 걍 다 디폴트로 주고 Create합니다. (이건 Unit을 자동으로 생성해주는 것 같더군요. 즉, 사용자가 직접 만들 수도 있죠. 아직 저는 JPA를 모르니..ㅠ) Finish!

해당 객체가 만들어졌습니다. 소스를 보게 되면
[code]@Id
@Column(name = "idx", nullable = false)
private Integer idx;
@Column(name = "writer", nullable = false)
private String writer;
@Column(name = "pwd", nullable = false)
private String pwd;
@Column(name = "subject", nullable = false)
private String subject;
@Lob
@Column(name = "content")
private String content;
[/code]
속성값을 Column이랑 애노테이션을 이용해서 자동으로 매핑해주는군요. MySQL의 text타입은 Lob(Large Object랍니다)으로 되는군요^^
이제 이것을 이용한 웹서비스를 만들어봅시다.

4. 프로젝트에 New -> RESTful Web Services from Entity Classes선택. 방금 추가했던 Wsboard클래스가 있습니다. add하고, Package만 boarddb.service, boarddb.converter로 바꾸고 Finish.

service클래스는 잘 보면 PersistenceService랑 WsboardResource, WsboardsResource 3가지가 있네요. PersistenceService는 말그대로 Persistence단에서 하는 db관련된 내용이구요. entity를 가져오거나, 추가, 삭제, 수정 등을 할 수 있는 클래스입니다.
WsboardsResource는 @Path("/wsboards/")가 클래스 앞에 붙어있는데요. 아마 저 해당 URL로 접근하면 이 클래스가 대신하는 것 같습니다. 이 클래스 메소드에 @GET, @POST가 있는데, 저 url로 저 메소드를 접근하게 되면 해당 메소드를 실행하는 역할을 하게 됩니다. Wsboard도 위와 비슷합니다 ^^

5. 프로젝트메뉴에 Test RESTful Web Services를 선택하면 브라우저가 뜨고, 테스트를 할 수 있습니다.

사용자 삽입 이미지

글이 길어지네-_-; 해당 웹서비스 수정은 다음시간에.....-_-;

[JAVA] netbeans 초간단 게시판을 위한 RESTful WebService를 만들어봅시다-_-; (2)


[Flex/AIR] RESTful을 이용한 Web Service 게시판 클라이언트.


참고자료 http://www.netbeans.org/kb/60/websvc/rest-mysql.html
 
Posted by 머드초보
,