이 기사에는 다음과 같은 섹션이 포함되어 있다.
- 선수조건
- JAX-WS 웹 서비스 작성
- ADT Eclipse Plugin & SDK 설치
- Android 프로젝트 작성
- KSoap2-android 라이브러리 설치
- 레이아웃 작성
- Activity 클래스 작성
- 인터넷 액세스 권한 구성
- AVD(Android Virtual Device) 작성
- Android 클라이언트를 실행하여 웹 서비스에 액세스
이 기사에서는 독자에게 웹 서비스에 대한 사전 지식이 있다고 가정한다. 여기에서는 이름을 인수로 받아서 Hello 메시지를 리턴하는 메소드를 사용하여 간단한 JAX-WS 웹 서비스를 작성한다. 웹 서비스를 개발하려면 다음과 같은 소프트웨어 프레임워크가 필요하다.
- Eclipse IDE
- JAX-WS 웹 서비스를 지원하는 애플리케이션 서버. WebSphere로 JAX-WS 웹 서비스를 개발하는 데 필요한 초보자용 튜토리얼은 참고자료를 참조한다.
웹 서비스용 Android 클라이언트를 개발하려면 다음과 같은 소프트웨어 컴포넌트가 필요하다.
- Eclipse IDE
- Android SDK
- Eclipse용 ADT 플러그인
- KSoap2-android 라이브러리
본질적으로 JAX-WS 웹 서비스는 javax.jws.WebService로 어노테이션된 Java 클래스인 웹 서비스 엔드포인트로 구성된다. 웹 서비스는
서비스 엔드포인트 구현 클래스로 구현되는 서비스 엔드포인트 인터페이스로 선택적으로 구성된다. 웹 서비스 구현 클래스는 추상 클래스나 최종 클래스가 되어서는
안 된다. 웹 서비스에 조작으로 노출되는 서비스 엔드포인트 구현 클래스의 비즈니스 메소드는 public이어야 하면 static이나 final이어서는 안 된다. 웹 서비스
구현 클래스 HelloWSImpl을 작성한다. 이 클래스는 @WebService로 어노테이션되어 있으며 HelloWS 인터페이스를 구현한다. 이 구현 클래스에는
String 매개변수 name을 받아서 해당 이름이 포함되어 있는 Hello 메시지를 리턴하는 hello 메소드가 포함되어 있다. 이 구현 클래스는 목록 1에 표시되어 있다.
리스트 1. 웹 서비스 구현 클래스 HelloWSImpl.java
package hello_webservice;
import javax.jws.*;
@WebService(portName = "HelloWSPort", serviceName = "HelloWSService",
targetNamespace = "http://hello_webservice/",
endpointInterface = "hello_webservice.HelloWS")
public class HelloWSImpl implements HelloWS {
public String hello(String name) {
// replace with your impl here
return "Hello "+name +" Welcome to Web Services!";
}
}
|
서비스 엔드포인트 인터페이스 HelloWS에는 @WebMethod로 어노테이션된 hello 메소드가 포함되어 있으며 목록 2에 표시되어 있다.
리스트 2. 서비스 엔드포인트 인터페이스 HelloWS.java
package hello_webservice;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(name = "HelloWS", targetNamespace =
"http://hello_webservice/")
public interface HelloWS {
@WebMethod(operationName = "hello")
public String hello(String name);
}
|
다음에는 웹 서비스용 WSDL을 생성한다. 이 웹 서비스는 Android 클라이언트에서 WSDL로 사용할 수 있다. WSDL은 웹 서비스를 네트워크 엔드포인트(포트) 콜렉션으로
기술하는 데 필요한 XML 형식의 문서이다. 메시지는 교환될 데이터를 추상적으로 정의한 것이며 포트 유형은 조작 콜렉션을 추상화한 것이다. HelloWSService
웹 서비스 WSDL의 Design 뷰가 그림 1에 표시되어 있다.
그림 1. WSDL의 Design 뷰
이 웹 서비스의 WSDL이 그림 2에 표시되어 있다.
그림 2. 웹 서비스 WSDL
ADT(Android Development Tools)는 Android 애플리케이션을 개발하는 데 필요한 통합 환경을 제공하는 Eclipse IDE용 플러그인이다. Android SDK에는
Android 애플리케이션을 개발하는 데 필요한 도구와 라이브러리가 들어 있다. ADT 플러그인을 설치하려면 Help>Install New Software...를 선택하고
Add를 클릭한다. Add Repository 화면에서 그림 3과 같이 이름을 지정하고 위치는 https://dl-ssl.google.com/android/eclipse/로 지정한다. OK를 클릭한다.
그림 3. ADT 플러그인용 저장소 작성
나열되어 있는 개발 도구를 그림 4와 같이 선택하고 Next를 클릭한다.
그림 4. 개발 도구 설치
Install Details에서 Next를 클릭한다. 라이센스 계약의 이용 약관을 승인하고 Finish를 클릭한다. ADT 플러그인이 설치된다. 다음에는 Android SDK를 설치한다. Android 시작 패키지(installer_r09-windows.exe for Windows)를
다운로드한다. 설치 프로그램을 클릭하여 Android SDK Tools Setup Wizard를 시작한다. Android SDK를 설치하려면 JDK가 필요하므로 아직 JDK를 설치하지 않았으면
JDK 5.0이나 6.0을 설치한다. Next를 클릭한다. 설치 위치(기본 값은 C:\Program Files\Android\android-sdk-windows)를 지정하고 Next를 클릭한다. Start Menu Folder를
선택하고 Install을 클릭한다. 그림 5와 같이 Android SDK 도구가 설치된다. Next를 클릭한다.
그림 5. Adroid SDK 도구 설치
Finish를 클릭한다. Android SDK와 AVD Manager가 시작된다. 사용 가능한 패키지에서 설치할 패키지를 선택한다. 그림 6과 같이 패키지를 설치한다.
그림 6. Android SDK 및 AVD Manager
다음에는 Android에 맞게 환경 설정을 구성한다. Eclipse에서 Window > Preferences를 선택한다. Preferences에서 Android 노드를 선택한다. 그림 7과 같이 SDK 위치를 지정한다.
그림 7. Android SDK 위치 설정
다음에는 Android용 웹 서비스 클라이언트를 작성할 Android 프로젝트를 작성한다. Eclipse IDE에서 File > New를 선택한다. New 화면에서 그림 8과 같이 Android>Android Project를 선택하고 Next를 클릭한다.
그림 8. Android 프로젝트 새로 작성
New Android Project 화면에서 프로젝트 이름(AndroidWSClient)을 지정한다. Build Target 섹션에서 Android 2.2를 선택한다. Properties에서 애플리케이션 이름과
패키지 이름을 지정한다. Create Activity 선택란을 선택하고 Activity 클래스(AndroidWSClient)를 지정한다. 활동은 사용자 상호 작용을
나타내며 Activity 클래스를 확장하는 클래스는 UI 창을 작성한다. 그림 9와 같이 Min SDK Version을 8로 지정하고 Next를 클릭한다.
그림 9. Android 프로젝트 새로 작성
New Android Test Project 화면에서 테스트 프로젝트를 작성할 수 있다. 그러나 이 기사에서는 테스트 프로젝트를 작성하지 않는다. Finish를 클릭한다. 그림 10과 같이 Android 프로젝트가 작성된다. Android 프로젝트는 다음과 같은 필수 컴포넌트로 구성된다.
- Activity 클래스를 확장하는 활동 클래스(
AndroidWSClient) - Android 애플리케이션의 레이아웃을 지정하는 데 필요한
res/layout/main.xml파일 - 패키지 이름, 애플리케이션
컴포넌트, 프로세스, 권한 및 Android 시스템의 최소 API 레벨과 같은 필수 애플리케이션 정보가 포함된
AndroidManifest.xml파일
그림 10. Android 프로젝트
Ksoap2-android 라이브러리는 Android 플랫폼에 적합한 효과적인 경량 SOAP 라이브러리이다. ksoap2-android 프로젝트에서 ksoap2-android-assembly-2.4-jar-with-dependencies.jar 파일을
다운로드한다. 그림 11과 같이 종속 항목이 포함되어 있는 Ksoap2-android 어셈블리 JAR을 Java 빌드 경로에 추가한다.
그림 11. Ksoap2-android 라이브러리
res/layout/main.xml 파일에서 Android UI 컴포넌트의 레이아웃을 지정한다. 여기에서는 웹 서비스의 응답을 텍스트 메시지로 표시할 UI를 작성하게 된다. 선형 레이아웃에서
하위 요소가 수직으로 표시되는 LinearLayout을 작성한다. hello 메소드에 대한 메소드 호출의 웹 서비스 응답을 표시할 TextView 요소를 ID 결과와
함께 추가한다. 이 메소드 호출은 이름을 인수로 전송하고 응답으로 Hello 메시지를 수신한다. 필요에 따라 제목용 TextView 요소를 작성한다. Android 웹 서비스
클라이언트 애플리케이션의 그래픽 레이아웃은 그림 12에 표시되어 있다. 본질적으로 Android 화면은 웹 서비스 응답을 텍스트 메시지로 표시할 준비가 된 빈 화면이다.
그림 12. 그래픽 레이아웃
main.xml 레이아웃 파일은 목록 3에 표시되어 있다.
리스트 3. main.xml 레이아웃 파일
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> |
AndroidWSClient 클래스는 Android 애플리케이션의 활성 클래스이며 Activity 클래스를 확장한다. 이 섹션에서는 AndroidWSClient 활성 클래스를
구성한다. 다음과 같이 필수 Ksoap2-android 클래스를 가져온다.
import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.ksoap2.serialization.PropertyInfo; |
표 1에 있는 상수를 정의한다.
표 1. Activity 클래스의 상수
| 상수 | 설명 |
|---|---|
| NAMESPACE | 네임스페이스는 WSDL의 대상 네임스페이스(targetNamespace)이다. |
| URL | WSDL URL이다. 이 값은 WSDL에 있는 port 요소의 soap:address 요소의 location 속성이다. 웹 서비스를 Android 디바이스에서 호스트하지 않는
경우에는 호스트 이름을 localhost로 지정하지 말아야 한다. 애플리케이션은 Android 디바이스에서 실행되지만, 웹 서비스는 localhost 서버에서
호스트되기 때문이다. 호스트 이름을 웹 서비스를 호스트하는 서버의 IP 주소로 지정한다. |
| METHOD_NAME | 웹 서비스 조작의 이름으로 WSDL에서 가져올 수 있다. |
| SOAP_ACTION | NAMESPACE와 METHOD_NAME이 합쳐진 것이며 문자열 리터럴로 지정된다. |
상수 값은 다음과 같지만, URL 상수의 IP 주소는 변한다.
private static final String NAMESPACE = "http://hello_webservice/"; private static String URL="http://192.168.1.68:7001/HelloWebService/HelloWSService?WSDL"; private static final String METHOD_NAME = "hello"; private static final String SOAP_ACTION = "http://hello_webservice/hello"; |
모든 Activity에서는 onCreate 메소드를 구현하여 활동을 초기화한다. setContentView 메소드와 레이아웃 자원을 사용하여 UI를 정의한다.
setContentView(R.layout.main); |
main.xml에 정의된 TextView 요소에서 findViewById 메소드를 사용하여 Android 위젯 TextView 오브젝트를 작성한다.
TextView lblResult = (TextView) findViewById(R.id.result); |
org.ksoap2.serialization.SoapObject 오브젝트를 작성하여 SOAP 요청을 빌드한다. SoapObject 생성자에서 호출될 메소드 이름과 SOAP 오브젝트의
네임스페이스를 지정한다.
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); |
SOAP 메소드 호출과 함께 전송할 특성 정보를 포함할 org.ksoap2.serialization.PropertyInfo 오브젝트를 작성한다. 각 특성은 PropertyInfo 오브젝트를
필요로 한다. hello 메소드는 인수를 하나(name)만 받는다. 특성 이름을 "arg0"으로 설정하고 특성 유형을 STRING_CLASS로 지정한다. addProperty 메소드를
사용하여 PropertyInfo 오브젝트를 SoapObject에 추가한다.
PropertyInfo propInfo=new PropertyInfo(); propInfo.name="arg0"; propInfo.type=PropertyInfo.STRING_CLASS; request.addProperty(propInfo, "John Smith"); |
다음에는 SOAP 엔벨로프를 작성한다. SoapSerializationEnvelope 클래스를 사용한다. 이 클래스는 직렬화된 SOAP 메시지의 구조를 표현하는 SOAP 직렬화 형식을
지원하여 SoapEnvelop 클래스를 확장한다. SOAP 직렬화를 이용하면 이식성을 개선할 수 있다는 이점이 생긴다.
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); |
SoapEnvelope.VER11 상수는 SOAP Version 1.1을 나타낸다. SoapObject 요청 오브젝트를 SOAP 메소드 호출의 아웃바운드 메시지로 엔벨로프에 지정한다.
envelope.setOutputSoapObject(request); |
J2SE 기반의 HttpTransport 계층을 나타내는 org.ksoap2.transport.HttpTransportSE 오브젝트를 작성한다. HttpTransportSE는 org.ksoap2.transport.Transport 클래스를
확장하며, 이 클래스는 SOAP 메시지를 직렬화하고 직렬화 해제하는 동작을 캡슐화한다.
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); |
SOAP_ACTION과 SOAP 엔벨로프를 사용하여 SOAP 호출을 작성한다.
androidHttpTransport.call(SOAP_ACTION, envelope); |
SoapSerializationEnvelope 오브젝트의 getResponse 메소드를 사용하여 웹 서비스 응답을 얻고, 기본 유형을 캡슐화하는 데 사용된 SoapPrimitive 클래스에
응답 오브젝트를 캐스트한다.
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse(); |
TextView UI 컴포넌트에서 SOAP 응답의 문자열 메시지를 설정한다.
lblResult.setText(resultsRequestSOAP.toString()); |
Activity 클래스는 아래 목록 4에 표시되어 있다.
리스트 4. Activity 클래스 AndroidWSClient.java
package android.webservice.client;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.serialization.PropertyInfo;
import android.widget.TextView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
public class AndroidWSClient extends Activity {
private static final String NAMESPACE = "http://hello_webservice/";
private static String URL = "http://192.168.1.68:7001/HelloWebService/
HelloWSService?WSDL";
private static final String METHOD_NAME = "hello";
private static final String SOAP_ACTION = "http://hello_webservice/hello";
private TextView lblResult;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lblResult = (TextView) findViewById(R.id.result);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo propInfo=new PropertyInfo();
propInfo.name="arg0";
propInfo.type=PropertyInfo.STRING_CLASS;
request.addProperty(propInfo, "John Smith");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
lblResult.setText(resultsRequestSOAP.toString());
} catch (Exception e) {
}
}
}
|
Android 디바이스에서 웹 서비스를 액세스하려면 애플리케이션이 네트워크 소켓을 열 수 있도록 AndroidManifest.xml 파일에서
권한을 설정해야 한다. 다음 uses-permission 요소를 추가한다.
<uses-permission android:name="android.permission.INTERNET"></uses-permission> |
권한이 설정된 AndroidManifest.xml이 그림 13에 표시되어 있다.
그림 13. INTERNET 권한 설정
AndroidManifest.xml은 목록 5에 표시되어 있다.
리스트 5. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.webservice.client"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AndroidWSClient"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-sdk android:minSdkVersion="8" />
</manifest>
</uses-permission>
|
Android SDK에는 Android 애플리케이션을 개발하고 테스트하는 데 필요한 가상 모바일 디바이스인 모바일 디바이스 에뮬레이터가 포함되어 있다. 이 에뮬레이터는 Android 플랫폼과 같은 다른 가상 모바일 디바이스 옵션을 지정할 수 있는 AVD(Android Virtual Device) 구성을 지원한다. AVD를 작성하려면 Window>Android SDK and AVD Manager를 클릭한다. 그림 14와 같이 Virtual devices를 클릭한 후, New를 클릭한다.
그림 14. AVD 작성
Create New AVD 화면에서 Name을 지정하고 Target을 Android 2.2-API level 8로 선택하고 SD 카드 크기를 웹 클라이언트 애플리케이션을 설치하는 데 충분한 크기인 100MiB로 지정한다. 더 낮은 값(예: 10)을 지정하면 "No space left on device" 오류가 발생한다. 그림 15와 같이 Create AVD를 클릭하여 AVD를 작성한다.
그림 15. AVD 구성
그림 16과 같이 AVD가 새로 작성된다.
그림 16. 새로 작성된 AVD
Android 클라이언트를 실행하여 웹 서비스에 액세스
Android 에뮬레이터는 이 에뮬레이터를 사용자 정의할 수 있는 다양한 옵션을 제공한다. 예를 들어,
에뮬레이터를 확장하려면 다음 옵션을 사용하여 scale 값을 지정한다.
-scale <value> |
에뮬레이터 옵션을 지정하려면 AndroidWSClient 애플리케이션을 마우스 오른쪽 단추로 클릭한 후, Run As..>Run Configurations를 선택한다. 그림 17과 같이 AndroidWSClient 애플리케이션을
선택하고 Additional Emulator Command Line Options 필드에서 -scale 옵션을 지정한 후, Apply를 클릭한다.
그림 17. 에뮬레이터 scale 옵션 설정
에뮬레이터에 AndroidWSClient 애플리케이션을 설치하고 실행하려면 그림 18과 같이 AndroidWSClient를 마우스 오른쪽 단추로 클릭하고 Run As..>Android Application을 선택한다.
그림 18. Android 애플리케이션 실행
그림 19와 같이 AndroidWSClient 애플리케이션이 AVD에 설치된다. AVD에서 해당 애플리케이션을 클릭하여 웹 서비스 클라이언트를 실행한다.
그림 19. 설치된 Android 웹 서비스 클라이언트
이 웹 서비스가 호출되면 웹 서비스의 응답이 그림 20과 같이 Android 에뮬레이터에 표시된다.
그림 20. 웹 서비스 액세스
Android 애플리케이션을 실행한 결과는 목록 6에 표시되어 있다.
리스트 6. Android 애플리케이션 실행 결과
AndroidWSClient] Android Launch!
AndroidWSClient] adb is running normally.
AndroidWSClient] Performing android.webservice.client.AndroidWSClient activity launch
AndroidWSClient] Automatic Target Mode: launching new emulator with compatible AVD
'AndroidAVD'
AndroidWSClient] Launching a new emulator with Virtual Device 'AndroidAVD'
AndroidWSClient] New emulator found: emulator-5554
AndroidWSClient] Waiting for HOME ('android.process.acore') to be launched...
AndroidWSClient] HOME is up on device 'emulator-5554'
AndroidWSClient] Uploading AndroidWSClient.apk onto device 'emulator-5554'
AndroidWSClient] Installing AndroidWSClient.apk...
AndroidWSClient] Success!
AndroidWSClient] Starting activity android.webservice.client.AndroidWSClient on device
emulator-5554
AndroidWSClient] ActivityManager: Starting: Intent { act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER]
cmp=android.webservice.client/.AndroidWSClient }
|
Android 애플리케이션이 실행되면 다음과 같은 태스크가 수행된다.
- 새 에뮬레이터가 실행된다.
AndroidWSClient.apk가 에뮬레이터에 업로드된다.AndroidWSClient.apk가 설치된다.android.webservice.client.AndroidWSClient활동이 시작된다.
교육
- Android에 관해 배우자. Android 애플리케이션을 작성하는 방법과 관련된 문서와 도구이다.
- developerWorks의 SOA 및 웹 서비스 영역에서 웹 서비스 기술을 향상시키는 데 필요한 프로젝트 참고자료를 얻을 수 있다.
- ""Develop and deploy JAX-WS Web services on WebSphere Application Server Community Edition V2.0"(developerWorks, 2007년 9월): 이 튜토리얼에서는
WebSphere 애플리케이션 서버로 JAX-WS 웹 서비스를 개발하고 배치하는 방법을 설명한다.
제품 및 기술 얻기