넷빈즈에서는 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 머드초보
,
 
우선 smtp를 지원하는 메일서비스만 할 수 있습니다.
naver는 지원하긴 하지만, 조낸 써야지 smtp를 사용할 수 있습니다.
저는 일반사용자인데 으뜸사용자가 되야하는 듯 합니다.
그래서 그냥 지원해주는 gmail이랑 daum메일로 테스트를 해봤습니다. 잘 되는군요.

기존에 25포트가 디폴트로 메일을 사용했는데 보안 때문에 SSL을 사용하고, smtps라는 프로토콜로 465번포트로 하는군요.
이건 좀 더 공부를 해봐야할 듯 싶네요. 그냥 기존의 ssl을 사용하지 않는 메일은 host랑 id랑 password만 지정해주면 돼요.

우선 설정파일입니다.
applicationContext.xml
[code]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    
    <context:component-scan base-package="mailtest" />
   
    <!-- 일반용 
    <bean id="mailSender"
        class="org.springframework.mail.javamail.JavaMailSenderImpl"
        p:host="STMP서버주소"
        p:username="아이디"
        p:password="비밀번호" />
    -->
   
    <!-- gmail, hanmail 용 -->
    <bean id="mailSender"
        class="org.springframework.mail.javamail.JavaMailSenderImpl"
        p:host="한메일: pop.hanmail.net, 지메일:smtp.gmail.com"
        p:port="465"
        p:protocol="smtps"
        p:username="아이디"
        p:password="비밀번호">
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtps.auth">true</prop>
                <prop key="mail.smtps.startls.enable">true</prop>
                <prop key="mail.smtps.debug">true</prop>
            </props>
        </property>
    </bean>
   
    <bean id="templateMessage"
        class="org.springframework.mail.SimpleMailMessage"
        p:from="송신자 주소"
        p:to="수신자 주소"
        p:subject="안녕!" />
   
</beans>
[/code]
templateMessage는 임시로 메세지를 지정해주는 것으로 미리 지정할 껀 지정하는 겁니다.
물론, 나중에 java코드에서 수정이 가능합니다.

서비스부분입니다.
MailTestService.java
[code]
package mailtest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;

@Service
public class MailTestService
{
    @Autowired
    private MailSender mailSender;
   
    @Autowired
    private SimpleMailMessage simpleMailMessage;
   
    public void sendEmail()
    {
        SimpleMailMessage msg = new SimpleMailMessage(this.simpleMailMessage);
        msg.setText("난 종천이라고해!");
        this.mailSender.send(msg);
    }
}
[/code]
저기서 simpleMailMessage를 받아와서 text만 설정해줍니다. 저기서 msg.setTo하면 수신자도 설정할 수 있죠. 그리고 그냥 send메소드만 호출해주면 메일이 전송됩니다.

[code]
package mailtest;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MailTest
{
    public static void main(String[] args)
    {
        String configLocation = "applicationContext.xml";
        ApplicationContext context =
            new ClassPathXmlApplicationContext(configLocation);
       
        MailTestService mailTestService =
            (MailTestService) context.getBean("mailTestService");
       
        mailTestService.sendEmail();
    }
}
[/code]
더욱 심화된 기능은 reference를 참조하세요
http://static.springframework.org/spring/docs/2.5.x/reference/mail.html
 
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 머드초보
,