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

우선 리스트데이터 가져오기.
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 머드초보
,
 
음....뭔 개소리지....라는 생각으로 찾아보니 있더군요.











[code]public class Test2
{
    public static void main(String[] args)
    {
        String readStr = "mudchobo*배고파*밥줘*아놔";
        String[] token = readStr.split("*");
       
        for (int i = 0; i<token.length; i++)
        {
            System.out.println("token = " + token[i]);
        }
    }
}
[/code]
split함수는 해당 문자열로 문자를 나눠서 String배열로 리턴해줍니다. 역시 자바는 다 잘 되어있습니다.
*로 구분되어진 문서를 파싱하고 있는데요. *로 split를 하면 이상하게 저런 에러를 내뱉습니다. meta문자가 매달려있다고 하는 것 같습니다-_-;
그래서 \이거 한개를 붙여봤더니......

Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )

요렇게 밖에 지원을 안하는 것 같습니다. 그래서 검색해보니...-_-; 두개를 붙이더군요-_-;

[code]String[] token = readStr.split("\\*");[/code]
오...됩니다-_-;
[code]token = mudchobo
token = 배고파
token = 밥줘
token = 아놔[/code]

PS. 점심시간이 다가오는 관계로....배고프다는 생각이 머릿속에 가득하다보니 저런 얘기가 써진 것 같습니다.
 
Posted by 머드초보
,
 
친구가 학교에서 웹서비스를 배운다고 합니다.
저도 그 수업을 들었죠. 그 수업에서 웹서비스를 만드는 것은 정말 많은 노력이 들어가서 만드는 방법이였습니다. 필요한 라이브러리를 다 각각 복사하고, 컴파일도 직접하며, 톰캣도 이상한 웹서비스 톰캣을 사용하더라구요.
그렇게 하게되면 완전 원시적인 방법으로 배우게 되므로 많은 도움이 되긴 됐습니다만, 이렇게 손쉽게 만드는 방법도 알아두면 좋죠 ^^

이건 SOAP프로토콜을 이용한 웹서비스를 만들겁니다. 최근 RESTful을 이용한 어쩌구 하는데 이건 좀 더 공부가 필요하겠네요.

우선 넷빈즈를 실행합니다. 넷빈즈는 여기서 다운로드할 수 있습니다.
http://download.netbeans.org/netbeans/6.1/final/
왠만하면 다되는걸로 받으세요-_-; 다되면 좋잖아요 ^^

실행한 뒤 웹애플리케이션을 만듭니다.
New Project -> Web -> Web Application
ProjectName : HelloWebApp
server: GlassFish v2
(톰캣으로 해도 됩니다만, 톰캣은 테스트를 할 수 없더라구요. 예전에 수동으로 웹서비를 만들었을 때 테스트가 너무 힘들어서 삽질했던 기억을 생각하면...-_-; GlassFish도 참 대단한 was같네요)
Finish로 생성.

웹서비스를 만들기 위해서는 프로젝트이름의 마우스오른쪽버튼을 누르면 New -> WebService가 있습니다.
Web Service Name은 Hello라고 하고, package는 com.mudchobo.hellows라고 합시다.
Finish를 누르면 Design모드로 뭔가 뜹니다.
여기서 우리가 Operation을 하나 만들어봅시다.
Add Operation을 클릭합니다.
Name은 메소드명입니다. sayHello라고 합시다.
Return Type은 말그대로 리턴형입니다. 걍 냅둡시다.
parameter는 1개추가해서, Name을 name이라고 하고, 형은 java.lang.String으로 합시다.
이제 Source보기로 바꿉니다.

소스를 보면 WebService를 어노테이션으로 만들 수 있는 것을 볼 수 있습니다.
이건 정말 환상적이네요. 기존에 WSDP인가? 이걸로 할 때에는 미친듯이 삽질해도 웹서비스를 만드려면 엄청힘들었는데 이건뭐 그냥 어노테이션으로 끝내버리네요 ^^
[code]
@WebService()
public class Hello {

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sayHello")
    public String sayHello(@WebParam(name = "name")
    String name) {
        //TODO write your implementation code here:
        return "Shit! " + name + " 바보!";
    }

}
[/code]
위와 같이 name이라는 파라메터를 넣으면 return은 Shit! 이름 바보! 라고 보내줍시다.
이제 한번 run을 해봅시다.
GlassFish가 시작되면서 브라우저로 웹페이지가 뜹니다.
Hello World!라고 뜨는군요. 이제 WebService를 테스트해봅시다.

WebService -> Hello에 오른쪽버튼 클릭 후 Test Web Service를 클릭합니다.


한글은 깨지는군요. 어쨌든 WSDL파일도 클릭하면 볼 수 있습니다.
테스트하면 잘 되는군요.

다음시간에는 클라이언트를 통해서 저 웹서비스를 호출해보도록 하겠습니다.
클라이언트 언어는 쉽게 WebService를 호출할 수 있는 Flex로 해보도록 합시다-_-;
클라이언트는 여기를 클릭하세요.
http://mudchobo.tomeii.com/tt/329
 
Posted by 머드초보
,
 
apache홈페이지에 가면 commons에 net라는 프로젝트가 있습니다. 이걸 이용하면 메일프로그램도 만들고, ftp프로그램도 만들고 다 손쉽게 만들 수 있을 것 같더군요.

  • FTP
  • NNTP
  • SMTP
  • POP3
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

아는 건 몇 개 없네-_-; Telnet도 된다는 건 CRT같은 것도 만들 수 있는건가...
어쨌든, ftp접속해서 리스트를 받아오는 프로그램을 작성해봅시다.
우선 준비물은 commons-net-1.4.1.jar과 jakarta-oro-2.0.8.jar 입니다.
commons-net.1.4.1.jar는 http://commons.apache.org/downloads/download_net.cgi
jakarta-oro-2.0.8.jar는 http://jakarta.apache.org/site/downloads/downloads_oro.cgi

SFTP는 안됩니다. SFTP는 SFTP를 지원하는 다른 라이브러리가 있더라구요. 고걸 사용해야해요.
[code]
package com.mudchobo.ftptest;

import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;

public class FtpTest
{
    public static void main(String[] args) throws IOException
    {
        FTPClient client = new FTPClient();
        client.setControlEncoding("euc-kr"); // 한글 encoding....
       
        FTPClientConfig config = new FTPClientConfig();
        config.setDefaultDateFormatStr("yyyy년 M월 d일");
        config.setRecentDateFormatStr("M월 d일 HH:mm");
        client.configure(config);

        client.connect("접속할 ip or 도메인");
        client.login("아이디", "비밀번호");
       
        FTPFile[] files =
            client.listFiles("리스트를 가져올 경로");
       
        for (int i=0; i<files.length; i++)
        {
            FTPFile file = files[i];
            System.out.println("파일이름: " + file.getName() + " 사이즈 : " + file.getSize());
        }
       
        client.logout();
       
        if (client.isConnected())
        {
            client.disconnect();
        }
    }
}
[/code]
여기서 주의할 점은 config에서 DefaultDateFormatStr이랑 RecentDateFormatStr을 설정 안하면 리스트로 못 받아오더라구요. 저걸 설정할 때 ftp버전 마다 다 틀려서 다르게 설정 해야합니다. 우선 FTP에 접속을 해서 최근꺼랑 기본꺼랑 어떻게 나오는지 확인 후 거기에 맞춰야 합니다.

시작 -> 실행 -> cmd 치시고,
ftp 접속할 주소 [엔터]
아이디 [엔터]
비밀번호 [엔터]
dir 치시면 어떻게 나오는지 다 나옵니다.
저같은 경우 이렇게 나옵니다.
-rw-r--r--   1 daewoo   dba         3486  7월  1일  13:38 .cshrc
drwxr-xr-x  11 daewoo   dba          512 2002년  1월  3일 .dt
저거에 맞춰서 config설정해주시면 돼요.

실행해보면 이렇게 돼요.

파일이름: . 사이즈 : 512
파일이름: .. 사이즈 : 512
파일이름: MSG 사이즈 : 512
파일이름: RSTA 사이즈 : 1296
파일이름: RSUM 사이즈 : 1296
파일이름: SERR 사이즈 : 162
파일이름: SRET 사이즈 : 162
파일이름: SSTA 사이즈 : 162
파일이름: SSUM 사이즈 : 729
파일이름: SSUM_REPORT 사이즈 : 1948
파일이름: TPRR 사이즈 : 162
파일이름: URET 사이즈 : 162
파일이름: bin 사이즈 : 512
파일이름: data 사이즈 : 512
파일이름: src 사이즈 : 512
파일이름: ssta 사이즈 : 162
파일이름: trace 사이즈 : 1024

파일 받고, 올리고 하는 건, api참조!

FTP로 접속해서 파일 송수신하는 프로그램을 개발해야해서 포스팅!



 
Posted by 머드초보
,