'2008/07'에 해당되는 글 4건

TCP/IP Monitor 사용하기 :: 2008/07/10 13:20

웹서비스나 소켓 등 네트워크 프로그래밍을 하다 보면 특정 포트를 통해 송수신 되는 메시지의 Raw Data를 살펴봐야할 경우가 많다. 이때 유용한 도구가 TCP/IP 모니터링 도구인데, 쉽게 구할 수 있는 것으로는 아파치의 TCPMon이나 이클립스의 TCP/IP Monitor가 있다. 대부분의 TCP/IP Monitor의 통상적인 패턴은 대상 서버에 대한 중계자의 역할을 하는 형태이다.

로컬 PC에서 대상 호스트의 특정 포트와 통신하는 데이터를 모니터링 하는 사용법에 대한 예시이다.

1. TCPMon을 시작한 후 TCPMon의 리스너 포트(8888)와 모니터링 대상 호스트(www.apache.org)와 포트(80)를 입력하고 Add를 한다. 이때 리스너 포트는 로컬 PC에서 사용하지 않는 임의 포트이면 된다.  

사용자 삽입 이미지

2. 다음과 같이 대기 화면 패널이 생긴다.

사용자 삽입 이미지

3. 로컬 호스트의 TCPMon의 리스너 포트(8888)를 통해서 대상 서버를 접근한다.

사용자 삽입 이미지

4. TCPMon에서 대상 호스트의 포트로 송수신 데이터를 보여준다.

사용자 삽입 이미지

5. 다음 화면은 이클립스에 내장된 TCP/IP Monitor에서 리스너 설정 및 실행 결과를 본 것이다.

사용자 삽입 이미지

사용자 삽입 이미지

Constract-First vs. Code-First :: 2008/07/08 18:36

웹서비스를 개발할 때, 특히 서버쪽에서 서비스를 생성하는데 두가지 주요 접근 방식이 있다. WSDL로부터 시작하는 Contract-First 방식과 코드로부터 시작하는 Code-First 방식이 있다. 웹서비스 상호작용에서 계약(contract)이란 WSDL 문서 자체를 의미한다고 보면 된다.

이 두가지 방식은 각기 장단점을 가지고 있어서 무엇이 좋다고 딱히 말할 수 없고, 개발 환경이나 상황에 따라 적합한 적절한 방식을 취하는 것이 보통이다. 최근에 규격이 이미 정해진 복잡한 스키마를 가진 웹서비스를 Contract-First 방식으로 구현을 해 보았는데, 개인적으로는 웹서비스 프레임워크에 종속적이지 않고 일정한 인터페이스를 유지하기 위해서는 Contract-First 방식이 더 낫지 않나 싶다.

이 두가지 웹서비스 개발 접근 방식에 대한 특징 및 장단점을 간단히 정리해 본다.

1. Constract-First 접근 방식
  • 복잡한 시스템 구성에 적합
  • WSDL 문서와 XML 스키마에 명확히 구성 등 웹서비스 기술에 대한 깊은 지식이 필요함
  • 웹서비스 프레임워크나 제품 버전에 바뀌어도 단일한 인터페이스를 유지할 수 있음.
  • WSDL2Java와 같은 도구를 사용해서 템플릿 코드 생성 가능
  • 개발 단계시 서버 서비스와 클라이언트를 동시에 독립적으로 진행할 수 있음

2. Code-First 접근 방식

  • 작은 어플리케이션이나 개발 단계에 적용 적합
  • 레거시 시스템을 웹서비스로 변환하는 경우
  • 웹서비스 기술에 대한 깊은 지식이 없어도 개발 가능
  • 개발시 리턴 타입 등 제약 사항이 적음 (POJO 형태로 자유롭게 작성 가능하고 기능 변경이 용이)
  • 프로토타입 작성하거나 기존 코드로부터 웹서비스 계약(WLDL)을 생성하고자 할 경우
  • Java2WSDL과 같은 도구를 사용해서 WSDL 생성 가능
  • 코드의 변경에 따라 생성된 WSDL(서비스 인터페이스)은 쉽게 바뀔 수 있는 점은 비즈니스 관점에서 허용하기 어려운 면이 있음.
  • 웹서비스 프레임워크나 심지어는 제품 버전에 변경에 따라 단일의 인터페이스를 유지하기가 쉽지 않음.
  • 개발 단계시 서버 서비스 개발이 완료된 후에 클라이언트 개발을 진행할 수 있음

Apache Axis2에서 첨부파일 기능 사용하기 :: 2008/07/07 20:54

오픈소스 중에서 가장 인기있는 웹서비스 프레임워크 중의 하나는 Apache Axis2이다. Axis2에서 첨부파일을 포함한 SOAP 메시지 (SAOP with Attachments)를 작성하는 방법이다.

1. 첨부파일 포함한 SOAP 메시지 보내기

[서버 설정]
- services.xml 에 다음과 같은 프로퍼티 설정을  포함한다.
<parameter name="enableSwA" locked="false">true</parameter>

[클라이언트 설정]
- 클라이언트 스텁 쪽에 다음과 같은 코드를 추가한다.
_serviceClient.getOptions().setProperty(Constants.Configuration.ENABLE_SWA, 
Constants.VALUE_TRUE;

[메시지에 첨부파일 포함하기]
- 첨부 메시지는 양방향이 될 수 있기 때문에 서버나 클라이언트 모두 해당한다. SOAP 메시지를 보내는 쪽에서 다음과 같이 코딩할 수 있다.
FileDataSoure dataSource = new FileDataSource("/data/foo.jpg");
DataHandler dataHandler = new DataHandler(dataSource);

messageContext.addAttachment("contentID", dataHandler);
// 또는  String contentId = messageContext.addAttachment(dataHandler);

2. 첨부파일 포함한 SOAP 메시지 받기

[서버 설정]
- services.xml 에 다음과 같이 캐시 및 대용량 첨부처리를 위한 임시저장 디렉토리 등을 지정할 수 있다.
<parameter name="cacheAttachments" locked="false">true</parameter>
<parameter name="attachmentDIR" locked="false">/temp_dir</parameter>
<parameter name="sizeThreshold" locked="false">2000000</parameter>

[클라이언트 설정]
- 클라이언트 스텁 쪽에서도 다음과 같은 코드로 수신 옵션을 추가할 수 있다.
_serviceClient.getOptions().setProperty(
Constants.Configuration.CACHE_ATTACHMENTS, Constants.VALUE_TRUE);
_serviceClient.getOptions().setProperty(
Constants.Configuration.ATTACHMENT_TEMP_DIR, "/temp_dir");
_serviceClient.getOptions().setProperty(
Constants.Configuration.FILE_SIZE_THRESHOLD, "2000000");

[메시지로부터 첨부파일 저장하기]
- 첨부 메시지는 양방향이 될 수 있기 때문에 서버나 클라이언트 모두 해당한다. SOAP 메시지를 받는 쪽에서 다음과 같이 코딩할 수 있다.
Attachments attachments = messageContext.getAttachmentMap();
if (attachments != null) {
    String[] contentIds = attachments.getAllContentIDs();
    for (int i = 0; i < contentIds.length; i++) {
        DataHandler dataHandler = messageContext.getAttachment(contentIds[i]);
        String filePath = "/save_dir/" + contentIds[i];
        try {
	   FileOutputStream fos = new FileOutputStream(filePath);
            dataHandler.writeTo(fos);
            fos.flush();
            fos.close();
        } catch (IOException ioe) {
            //
        }
    }
}

Key Store 파일 내용 보기 :: 2008/07/03 10:23

Java의 Key Store 파일의 내용을 간단히 조회해 볼 수 있는 방법니다.

C:\Temp>keytool -list -v -keystore client.jks

keystore 암호를 입력하십시오:  apache

Keystore 유형: jks
Keystore 공급자: SUN

Keystore에는 2 항목이 포함되어 있습니다.

별명 이름: service
작성일: 2007. 8. 20.
입력 유형: trustedCertEntry

소유자: CN=Sample Service, OU=Rampart, O=Apache, L=Colombo, ST=Western, C=LK
발급자: CN=Sample Service, OU=Rampart, O=Apache, L=Colombo, ST=Western, C=LK
일련 번호: 46c96501
개시일: Mon Aug 20 18:55:13 KST 2007 만료일: Tue May 23 18:55:13 KST 2062
인증서 지문:
         MD5:  0A:0D:20:99:3E:D3:65:A8:50:CC:20:A6:CB:6F:33:06
         SHA1: 1D:82:F7:EF:53:73:A0:EB:36:F8:80:36:E1:50:E4:04:67:14:15:03


*******************************************
*******************************************


별명 이름: client
작성일: 2007. 8. 20.
입력 유형: keyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=Sample Client, OU=Rampart, O=Apache, L=Colombo, ST=Western, C=LK
발급자: CN=Sample Client, OU=Rampart, O=Apache, L=Colombo, ST=Western, C=LK
일련 번호: 46c964c4
개시일: Mon Aug 20 18:54:12 KST 2007 만료일: Tue May 23 18:54:12 KST 2062
인증서 지문:
         MD5:  0C:EA:53:98:A5:15:B0:C8:5A:CD:4E:1C:87:A4:71:31
         SHA1: 08:9F:88:E7:53:39:86:89:F3:5A:91:B5:DA:02:B2:2F:0B:17:12:B9


*******************************************
*******************************************