넷빈즈에 관심이 있어서 여기에도 갔습니다^^

1. NetBeans 최신 동향 소개 / Sridhar Reddy
처음에 5대 오픈소스에 대해서 말하는 사람에게 큐브를 줬는데요. 나도 가지고 싶었는데....-_-; 우선 넷빈즈 6.5를 내 놓으면서 새로워 지는 것은 PHP를 향상되게 지원하고, MySQL을 지원하고, JavaFX를 지원, Hibernate지원 등등이 있었는데요.
신기한 것을 보았는데요. NetBeans에서 Hibernate를 Swing에다가 연동을 하는데, 5분이면 하더군요-_-; Hibernate를 손쉽게 할 수 있었습니다. 설정파일도 쉽게 만들고, HQL을 테스트를 할 수 있었습니다. HQL을 날리니 실제 DB로 날리는 쿼리로도 보여주는 등 Hibernate를 위한 배려를 많이 했더군요(국외에는 Persistence층에서 가장 많이 사용하는게 Hibernate라고 하더라구요. 국내에서는 iBATIS를 많이 사용하죠^^). 저도 Hibernate로 삽질 좀 해봐야겠습니다. DB영역에서 조금 강화된 것이 DB쿼리관련이 잘 되어있더군요. sql쿼리도 테스트해 볼 수 있고, SQL코드컴플리션도 되구요^^
그 다음에 Profiler를 소개했는데요. 성능을 분석해서 메모리를 많이 잡아먹는 부분을 최적화 할 때 유용히 사용할 수 있는 것이죠(최적화 툴!) 무료로 제공하는 프로그램은 많이 없는데, 넷빈즈는 무료로 제공한다고 자랑합니다^^ 게다가 이클립스 프로젝트 임포터를 제공해서 최적화를 넷빈즈에서 해라라곡 하는데, 이것의 목적은 이클립스 유저를 뺏어오기 위함인듯?-_-;

2. NetBeans 6.5를 통해 더욱 쉬워진 스크립트 언어 구현 / Micheal Li
보니까 놀라울 정도로 Javascript 코드 완성을 제공하더라구요. 물론 완벽하지는 않지만(완벽하게는 안되겠죠^^) Aptana랑 비교했을 때 누가 더 뛰어날까요^^ 궁금하네. 암튼, Javascript / HTML / css editor가 매우 향상 되었습니다. 좀 맘에 들었던 것이 css Editor! 미리보기를 할 수 있고, UI처럼 CSS를 수정할 수 있습니다-_-; 좋아요!
그 다음, jMaki라는 Ajax프레임워크를 보여줬는데, 제가 Hands-on-Lab에서 한 것을 시연해줬습니다. 드래그앤 드랍으로 구글맵을 1분만에 띄울 수 있는...-_-;
그 외에 여러 스크립트 프레임워크를 보여줬는데요. JSF, Dynafaces, Woodstock 등등~
그 중에서도 신기한 것 중에 하나가 Wicket이라는 것이였는데요.
Ajax without Javascript입니다. Java와 HTML로 합니다. HTML에 widcket:id=hello 라고 넣으면, Java코드에서는 그 해당 hello를 가지고 액션을 취하게 합니다. 많이 사용한다는데...왜 몰랐지....-_-;
이번 행사를 통해 여러 신기한 기술을 많이 배우고 가네요^^

3. 데스크탑 개발자를 위한 NetBeans 사용법 / Chuk-Munn Lee
음....스윙은 예전에 학교다닐 때 swing으로 WebService클라이언트를 만들 때 사용하고 사용해본 적이 없어요^^
아...회사에서 운영할 때 편하게 하려고 스윙으로 뭔가 만든적이 있네요^^
초반에 넷빈즈를 통해 쉬운 Swing애플리케이션을 만들더군요. 매우 쉽게 만들던데, 직접 하려고하면 잘 안되는데-_-;
스윙에 대해서 좋아진 점을 발표한 것 같은데, 스윙을 많이 사용하지 않아서 내용이 잘 안들어오더라구요-_-; 손쉬운 Splash Screen만들기(애플리케이션 뜨기전에 뜨는 화면), Nimbus LookAndFeel(벡터로 만들어져서 확대해도 픽셀이 깨지지 않으며 매우 빠르다고 하네요), 크로스플랫폼적인 TrayIcon, 스윙에서 자바스크립트 콜~, 손쉬운 소켓통신을 위한 XMPP 등의 설명을 하더군요. 시간이 없어서 다 못했습니다만^^(준비해오신 내용이 너무 많았어요^^)

넷빈즈는 매우 훌륭한 IDE인 것 같습니다. 보면 개발자들을 위해 신경을 많이 쓴 것 같구요. 하지만, 이클립스와는 다르게 플러그인이 정해져있는 것 같습니다. 이클립스는 사용자들이 플러그인을 제작할 수 있죠. 이것도 할 수 있으려나-_-; 암튼, 넷빈즈를 사용해보면 개발자들이 자주 쓰는 기능을 손쉽게 사용할 수 있게 만들어져있습니다. 라이브러리도 자동으로 추가시켜주며, Junit테스트도 용이하고, SVN, CVS 등도 잘 지원해주며, 배포가 매우 쉽게 배포파일을 생성시켜줍니다. 이클립스는 플러그인으로 설치를 다 해야하는데, 넷빈즈는 자주 쓰는 것을 다 포함하고 나옵니다. 서버까지 포함되어있죠^^(물론 자기네들 서버인 글래스피쉬가 기본입니다^^)
뭐 넷빈즈와 이클립스를 비교하면 장단점이 서로 있죠. 선택은 개발자들의 몫입니다^^
 
Posted by 머드초보
,
 
사실 무료쿠폰이 없었으면 너무 비싸서 안갔을텐데, 무료쿠폰이 생겨서 갔습니다^^
유료행사인 만큼....사람이 많이 없겠지? 라는 생각에 갔는데, 사람이 뭐이리 많은지-_-;
마지막에 실습하는 사람 리스트보니, 약 70%가 무료쿠폰 관람자인듯?-_-;

암튼, 처음에 등록하고, 들어가니 모래로 삽질하는(?) 영상을 보여주더군요. 멋있었습니다^^
아....엄청 신기했던 것이 발표자가 대부분 외국사람이다보니 저는 어떤식으로 진행되는지 궁금했습니다. 통역리시버를 주더군요. 예전에 Adobe RIA Camp에 갔을때는 번역하시는 분과 발표하시는 분이 교대로 말씀했는데 ^^
이 통역리시버 좋네요. 가끔 통역하시는 분이 당황하시는 소리도 참 듣기좋았(?)습니다.

우선 SUN TECH DAYS 2008은 크게 3가지를 홍보하러 온 것 같습니다. Open Solaris, JavaFX, NetBeans...
처음 오픈솔라리스를 소개했는데요. 가장 멋진 것은, 비스타의 3D Flip보다 더 멋진 텝전환이였습니다-_-; 이것만 봐도 깔아보고 싶다는 생각이 들더군요^^ 예전에 VirtualBox로 깔아봤는데, 노트북 밀고 한번 설치해봐야겠습니다^^ 그리고, 가상화기술은 VirtualBox를 소개했는데요. 이건 제 블로그에 한번 소개를 했었죠^^ 이것만 있으면 다중환경에 테스팅이 용이하다는 것을 설명하더군요. 그리고, ZFS에 대해서 소개했는데, 뭔소리하는지 몰라서 패스-_-;

그 다음 JavaFX! 제가 좀 관심을 가지고 있는데요.
넷빈즈의 특성인 드래그앤드랍코딩-_-을 이용해서 코딩하는데, 완전 신기하더군요. 문법이 이상해요^^ 매우 직관적인 문법을 표현하려고 애쓴 것 같아요. 순식간에 이미지를 조합하고, 알파효과와 Fade효과를 적용했어요. 문법은 AS3처럼 스크립트언어더군요. 그리고, 강조하는 것 중 하나가 Bind입니다. AS3에서도 [Bindable]이라는 엄청난 기능이 있죠. 이것과 같은 것입니다. 또 웹에서 보이기 위한 애플릿으로 실행이 가능한데요, 더 신기한 것은...만든 애플리케이션이 웹에서 보여지고, 웹에서 떼어지기도 합니다-_-; 공부해봐야겠군요^^

그....Rich Green씨의 말 중 가장 마음에 와닫는 것이....'최고의 기술이 선택을 받는다' 라는 말인데요. 정말 맞다고 생각해요 ^^

그 외, Zembly라는 이상한....것을 소개했는데. 뭐하는 건지 모르겠더군요-_-;

1. 첫번째 세션! JAVA SE 6 Update 10
사실....이것을 들으려고 한게 아니라 GlassFish를 들으려고 했는데...전 맨끝에 있는 곳에 1번세션인줄 알았어요-_-; 이런 트릭을 넘어가다니....ㅠ
암튼, u10버전에서 달라진 점을 소개했는데요.
첫번째로 ColdStart라는 것인데요. 메모리에 커널을 조금 올려서 빠르게 시작시킬 수 있는 기술이라는 것 같네요.
두번째로 Install Time을 줄이는 것이라고 하네요. 설치 시 자바커널만 설치하고, 나중에 실행에 필요한 라이브러리는 필요할 때 다운 받는 것이라고 하네요. 보니까, 커널만 설치 후, Swing애플리케이션을 실행했는데, 업데이트를 자동으로 하더니 라이브러리가 생기는 것을 보여주더라구요. 설치 시간을 줄이려고 이런 노력을 하다니...대단합니다.
세번째는 Deployment에 대해서 애기했는데, 뭔소리인지 모르겠더군요-_-;
그 외, 룩앤필을 개선하고, Direct3d를 쓸 수 있다고 한 것 같은데...암튼, 이것저것 얘기를 하시더군요.

2. 두번재 세션! MySQL 어쩌구~
대륙의 발표자인 듯 했습니다. (대세는 대륙시리즈-_-). 이 분 영어 잘 못하시는 듯 하던데-_-; 암튼, 버벅이고, 엄청 지루했습니다. 사실....잤습니다-_-; MySQL을 소개했는데, 깨어나보니 어떤 형이 있는지 소개를 하고 있더군요. 나쁜 스키마에 대해서 소개하고, SQL을 튜닝하고 적게 날리라는 당연한 말씀을 하셨습니다.

점심시간!
식사시간을.....뷔페음식이 떨어졌는지....저는 딴 곳에서 먹었습니다. 이동경로는 이렇습니다. 3층에서 -> B1층으로 가니 식권을 도림이라는 식권으로 나눠주더군요. 다시 1층으로 올라가니....도림은 32층에 있답니다-_-; 헉... 32층까지 언제가지 했는데, 미친 엘리베이터가 날아가더니 금방 가더군요. 코스요리인 듯한 중식을 먹었습니다. 역시 싸구려 입인 제게 안맞을 것 같았지만! 맛있었습니다 ^^ 생각해보니 이것도 대륙의 음식인가...-_-;

3. 세번째 세션! JavaFX 소개
식사가 늦게 끝나서 가니까 하고 있더군요. JavaFX에서 시퀀스문법이 있었는데, var days = [1..31]; 이렇게하면 days에 1부터 31까지 선언이 되는 문법을 보여주고 있었습니다. 그 외 직관적인 문법을 많이 보여주셨는데,
delete 1 from days -> [2..31] 같은 문법을 보여주더군요^^
넷빈즈에서 자랑하는 드래그앤드랍 신공으로 작성하는....-_-; 여러 컴포넌트를 소개하고, 효과를 쉽게 줄 수 있는 장점, Bind에 대한 간략한 설명(AS3의 Bindable과 매우 흡사 ^^), 직관적인 애니메이션 효과 등을 보여줬습니다.
JavaFX의 목적은 쉬운 RIA(Rich Internet Application)을 만드는 것인데요. 애니메이션, 효과, 다양한 컴포넌트, 쉬운 비디오 오디오 재생 등의 장점을 얘기하는 것 보면 사실인 듯하네요. 한번 해보고 싶군요^^
더 재미있는 것은 JavaFX에서 자바호출을 할 수 있다고 하더군요. 어떤 식으로 될지는 모르겠군요^^

4. 네번째 세션! 강여사님의 자바 플랫폼의 신기능
저의 넷빈즈 사부님이신 강진영여사님께서 발표를 하신다고 해서 들으러 갔습니다^^ 넷빈즈를 입문할 때 강여사님의 카페자료에서 많은 도움이 되었죠^^ http://cafe.naver.com/netbean
너무 많은 것을 준비해와서 다 보여주지 못하고, 빠르게 진행하고 끝났네요. Java 7에 관한 내용이 주로 였는데요. 어노테이션 문법을 통해 널포인트에러를 컴파일상에서 잡을 수 있는 것이 참 신기했습니다.
@NotNull 이런 걸 썼던 것 같은데....-_-;
그 외, Java Module이라는 것을 설명했는데, 뭐지.....JAM파일로 만들고 막 그러던데...OSGi와 비슷한 개념이라고 얘기를 하더군요^^
Closure라는 문법을 소개했는데, 대략 이런 식이였는데, { double x => math.log(x) } =>이것을 말하는 것 같습니다. 이것도 잘 모르겠습니다-_-;
그 외, AWT 향상, Bean Binding, 리소스맵, Action 등을 소개했는데... 하나도 모르겠습니다-_-; 나중에 발표자료를 다시 검토해봐야겠습니다^^ 한가지 반가운 것이 있다면 직관적인 파일시스템API가 생기는 것입니다. 기존에 io패키지에 있던 것은 사용하려면 매우 힘들었죠^^ 암튼 반가운 소식이네요. 너무 빨리 얘기하시느라 잘 못들은 부분이 많이 있네요 ㅠ

5. Hands-on-Lab! Ajax 프레임워크를 이용하여 리치 웹 애플리케이션 구축하기(jMaki Framework)
최악이였습니다. 하필 15일 Hands-on-Lab은 통역이 없답니다 OTL..그리고, 인터넷속도가 모뎀속도보다 안나옵니다. 넷빈즈 깔고, jMaki프레임워크를 설치하는데, 백만년걸립니다. 5메가 밖에 안하는데....-_-;
암튼, 설치하는데에 시간 다잡아먹고, 겨우 설치를 해서 따라해봤습니다.
이 jMaki라는 것(제이마키라고 발음하더군요^^)이 미리 만들어 놓은 컴포넌트들을 쉽게 사용할 수 있는 프레임워크입니다. 넷빈즈의 특징인 드래그앤드랍으로 오른쪽 Palette에서 가져다 놓으면 자동으로 생성됩니다. 드래그앤드랍코딩!

오늘 행사는 이렇게 끝이 났군요. 내일 JavaFX실습이 기대됩니다^^
 
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 머드초보
,
 
넷빈즈에서는 RESTful 웹서비스를 손쉽게 만들 수 있습니다.
RESTful은 기존에 사용하던 SOAP/WSDL-based의 WebService와 다르게 매우 간단하게 HTTP를 통해서 자원을 접근할 수 있습니다. 넷빈즈 웹서비스관련문서페이지에는 이렇게 써있군요.

  • REST-based. REpresentational State Transfer is a new way to create and communicate with web services. In REST, resources have URIs and are manipulated through HTTP header operations. For more details, see RESTful Web Services.
  • SOAP/WSDL-based. In traditional web service models, web service interfaces are exposed through WSDL documents (a type of XML), which have URLs. Subsequent message exchange is in SOAP, another type of XML document. For more details, see SOAP-based Web Services.

기존 SOAP/WSDL-based는 WSDL이라는 문서에 정의된 것을 바탕으로 데이터를 요청하고, 요청한 결과를 리턴받는 것 같았습니다. 그리고 데이터를 주고받기 위해서 SOAP이라는 프로토콜을 사용했습니다. 그 프로토콜에 의하면 무슨 봉투만들고, 정의된 표준에 의해서 리턴값을 만들어야 하는 점이 있었는데요.

이 RESTful방식은 자원이 uri를 가지고 있는데요. 그냥 http요청으로 해당 자원 uri를 요청하는데, method를 get, put, delete, post를 이용해 직관적으로 자원에 접근하는 듯 합니다. 아직 잘 모르겠네요-_-; DB랑 연동해서 삽질해보려니 힘들어서 우선 제가 제일 좋아하는 sayHello만 찍어봤습니다-_-;

참고자료
넷빈즈 웹서비스 관련문서페이지
http://www.netbeans.org/kb/61/websvc/intro-ws.html

1. 느리고 답답한 넷빈즈6.1이 필요합니다.

2. New Project -> Web -> Web Application, ProjectName은 HelloWS, Next!

3. Server는 GlashFish V2로 합니다. tomcat으로는 여기서도 아마 테스트를 지원하지 않을 듯 합니다. Finish!

4. HelloWS프로젝트 이름에 대고, 오른쪽버튼 New -> Other -> Web Services -> RESTful Web Services from Patterns선택, Sinleton선택 Next!

5. Resource Package는 자기가 원하는 대로! 저는 com.mudchobo.hello,
Resource Name은 Hello. 이것만 고치면 아래는 자동으로 고쳐집니다. Path부분이 해당 자원의 uri가 됩니다. Finish!
만들어진 소스코드를 보면 HelloResource라는 클래스가 생성되었습니다. @Path("hello")라는 어노테이션이 붙었는데요. HelloResource라는 자원은 /hello로 접근하는 자원이라는 것을 지정해주는 겁니다.
이 HelloResource에는 2가지 메소드가 자동으로 만들어졌습니다. GET과 PUT인데요.
우리가 만들것은 parameter로 name을 받아서 Hello! name 을 리턴하는 것을 만들껀데요. 그러면 GET메소드를 수정해야합니다.

[code]@GET
    @ProduceMime("application/xml")
    public String getXml(
            @QueryParam("name")
            @DefaultValue("NONE")
            String name) {
        return "<?xml version=\"1.0\" encoding=\"utf-8\"?><hello>Hello! " + name + "</hello>";
    }
[/code]
QueryParm어노테이션은 http요청 시 요청파라메터구요. 이건 name으로 받습니다. DefaultValue는 NONE로 했습니다.
보통 자원에 접근하는 주소는 아래와 같이 되더군요.
http://localhost:8080/HelloWS/resources/자원URI
hello자원은 http://localhost:8080/HelloWS/resources/hello이더군요.

저렇게 바꾸었으면 테스트를 할 수 있습니다. GlassFish가 테스트를 너무 잘 지원해줘서 참 좋습니다.

사용자 삽입 이미지

HelloResource클래스에 GET과 PUT이 있기때문에 2개가 나옵니다. 아래는 테스트결과로 리턴받는 값을 실제로 볼 수 있습니다. http Monitor도 있어서 요청한 값, 리턴값을 다 볼 수 있습니다.

이제 다른 클라이언트에서 사용할 수 있습니다. Flex에서 요청하신다면...이건 SOAP WSDL방식이 아니기 때문에 <WebService>를 사용하는 것이 아니라 <HTTPService>를 사용해야합니다.
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">

    <mx:Script>
        <![CDATA[
            import mx.rpc.events.ResultEvent;
            private function click():void
            {
                service.send({name: inputName.text});
            }
           
            private function result(event:ResultEvent):void
            {
                 labelResult.text = event.result.hello;
            }
        ]]>
    </mx:Script>
    <mx:HTTPService id="service" method="GET"
        url="http://localhost:8080/HelloWS/resources/hello"
        result="result(event)" />
       
    <mx:TextInput id="inputName" />
    <mx:Button label="확인" click="click()"/>
    <mx:Label id="labelResult" />
   
</mx:WindowedApplication>
[/code]
해당 자원주소에 method를 지정해주고 파라메터로 name을 넘기면 됩니다.
그럼 리턴값은 xml로 받게 됩니다.

제가 잘 몰라서 그러는데, 잘못된 점 있으면 태클걸어주세요-_-; 아직도 잘 모르겠네-_-;
아졸려...-_-;


 
Posted by 머드초보
,