'2016/12'에 해당되는 글 26건

  1. 2016.12.13 오라클 구성요소의 개요
  2. 2016.12.13 참조, 예제 사이트
  3. 2016.12.12 WSDL(Web Services Description Language)
  4. 2016.12.12 Oracle Application Development Framework (ADF)
  5. 2016.12.12 Service Data Objects (SDO)
  6. 2016.12.07 XML, SOAP, WSDL, UDDI

오라클 구성요소의 개요

DB/ORACLE 2016. 12. 13. 13:43

Part1 오라클서버

1. 오라클 구성요소의 개요

- 오라클 주요 구성요소 : 서버, 인스턴스, 데이터베이스

 


* 인스턴스 :  오라클 인스턴스는 백그라운드 프로세스와 메모리 구조로 구성됩니다. 
                      인스턴스는 사용자가 데이터베이스의 데이터에 접근하기 위해서 반드시

                      시작되어 있어야 합니다

          인스턴스가 시작할 때 System Global Area(SGA)가 할당되고 오라클 
          백그라운드 프로세스들이 시작됩니다.

데이타베이스 : 오라클 데이터베이스는 데이터베이스 정보를 위한 실제 물리적인 저장을 
                           제공하는 운영체제 파일들로 구성됩니다 
데이터베이스 파일들은 데이터가 
                           일관되게 유지되고 인스턴스 실패 시에 복구될 수 있도록 하는데 사용됩니다

 

1) 오라클 서버

- 데이터베이스 서버는 정보 관리에 아주 중요한 부분입니다. 일반적으로 많은 사용자가 동일한 데이터를 동시에 접근하는 환경에서 서버는 상당한 양의 데이터를 관리합니다. 또한 데이터베이스 서버는 권한이 없는 접근을 금지해야 하며 장애 시에 효과적인 복구를 제공해야 합니다

- 오라클 서버는 오픈되고 포괄적이고 통합된 접근을 제공하는 데이터베이스 관리 시스템

- 오라클 서버는 오라클 인스턴스와 오라클 데이터베이스로 구성

 

2) 오라클 인스턴스

- 오라클 인스턴스는 아래 그림과 같이 System Global Area(SGA) 메모리 구조와 데이터베이스 관리 에 필요한 백그라운드 프로세스들로 구성


  - 하나의 인스턴스는 각각의 운영체제에서 지정하는 방법에 따라 확인되며, 한번에 하나의 데이터베이스에 대해서 오픈되고 사용

- 오라클 인스턴스는 오라클 데이터베이스에 접근할 수 있는 방법

- 오라클 인스턴스는 하나의 데이터베이스에만 오픈

- 오라클 인스턴스는 메모리와 백그라운드 프로세스들로 구성

 

3) 접속과 세션

- 사용자는 오라클 데이터베이스에서 SQL 문장을 수행하기 전에 인스턴스에 접속해야만 합니다

- 인스턴스에 접속하는 과정

  . 사용자가 SQL*Plus를 시작하면 사용자 프로세스가 시작됩니다.

  . 사용자가 오라클 서버에 로그온 하면 서버에는 서버 프로세스가 시작됩니다

  . 서버 프로세스는 사용자 프로세스를 대신하여 인스턴스와 통신합니다

 


-  접속 : 접속은 사용자 프로세스와 서버 프로세스간의 통신 수단입니다. 데이터베이스 사용자는

             다음의 세가지 방법 중에 하나로 오라클 서버에 접속합니다

  . 오라클 인스턴스가 수행되고 있는 시스템에 로그온하여 SQL*Plus를 수행

  . 오라클 인스턴스가 수행되고 있는 시스템과 네트워크로 연결된 컴퓨터에서 프로그램을 수행

  . 사용자 컴퓨터는 오라클 인스턴스와 네트워크로 연결되어 있는 응용프로그램 서버나 네트워크

    서버에 연결되어 있음

- 세션 : 세션은 사용자가 오라클 서버에 접속할 때 시작하여 로그아웃 할 때 끝납니다

※ Dedicated Server 환경에서는 한 개의 사용자 프로세스와 한 개의 서버 프로세스가 통신합니다

※ Shared Server 환경에서는 여러 사용자 프로세스가 한 개의 서버 프로세스를 공유합니다

 

4) 오라클 데이타베이스

 


- 물리적 구조

  . 물리적인 구조는 운영체제 파일들로서 데이터 파일, 리두 로그 파일, 컨트롤 파일로 구성되어 있음

 


 

  . 리두로그파일: 에러 시에 데이터들을 복구하기 위해 데이터베이스에서 만들어진 변경 정보들을

                           갖고 있음

  . 데이터파일 : 실제데이터를 갖고 있음

  . 컨트롤파일 : 데이터베이스의 무결성을 보장하기 위해 필요한 정보들을 갖고 있음

  . 오라클 서버는 데이터베이스를 구성하는 파일들은 아니지만 다른 파일들도 사용합니다

     @ 파라미터 파일 : 오라클 인스턴스의 특징을 정의하는 파라미터들을 갖고 있음

     @ 패스워드 파일 : 오라클 인스턴스를 시작하고 종료할 수 있는 권한이 있는 사용자를 인증

     @ 아카이브 파일 : 복구할 때 필요한 리두 로그 파일을 복사한 파일

 

- 물리적 구조

  . 논리적인 구조는 테이블스페이스, 세그먼트, 익스텐트, 블럭으로 구성되어 있으며 데이터베이스의

    물리적인 공간이 어떻게 사용되어 지는지를 나타냅니다


 

  . 테이블 스페이스 : 오라클 데이터베이스는 한 개 이상의 테이블 스페이스를 갖고 있음 

                               한 개의 테이블 스페이스는 한 개 이상의 세그먼트를 갖고 있음

  . 세그먼트 : 한 개의 세그먼트는 익스텐트들로 만들어짐

  . 익스텐트 : 한 개의 익스텐트는 논리적인 블럭들로 만들어 짐

  . 블럭 : 한 개의 블럭은 읽고 쓰기 위한 가장 작은 단위

 

 

2. 메모리 구조

오라클 메모리 구조는 System Global Area(SGA)와 Program Global Area(PGA)로

   구성되어 있습니다. SGA는 인스턴스가 시작할 때 할당되며 오라클 인스턴스의

   기본 구성요소입니다. PGA는 서버 프로세스가 시작할 때 할당됩니다 

 

1) System Global Area

- SGA는 Shared Global Area라고도 부릅니다. SGA에는 데이터베이스 프로세스들에 의해

   공유되는  데이터베이스 정보와 오라클 서버를 위한 데이터와 제어 정보가 저장되며, 오라클이

   설치된 컴퓨터의 가상 메모리에 할당됩니다

- SGA의 종류

  . Shared Pool

  . Database Buffer Cache

  . Redo Log Buffer

  . Large Pool

  . Java Pool

- 동적SGA

  . 오라클 9i부터, 동적 SGA는 인스턴스를 종료하지 않고 SGA 형태를 변경할 수 있는 기본조직을

    이행하므로, 인스턴스를 종료하지 않고 Database Buffer Cache와 Shared Pool의 크기를 변경할

    수 있습니다. Database Buffer Cache와 Shared Pool의 크기는 처음에는 작게 구성되었다가

    그들의 작업에 따라 SGA_MAX_SIZE의 최대 크기까지 성장 또는 축소될 수 있습니다

- SGA 크기

  . DB_CACHE_SIZE : 기본 블럭들의 Cache 크기 / UNIX의 기본은 48MB, NT의 기본은 52MB임

  . LOG_BUFFER : 리두 로그 버퍼에 할당될 바이트 수

  . SHARED_POOL_SIZE : 공유풀에 할당될 바이트 수 /기본은 16MB, 64bit에서는 64MB임

  . LARGE_POOL_SIZE : 대형풀의 크기 / PARALLEL_AUTOMATIC_TUNING=true로 설정되지

                                      않으면 기본은 0임

  . JAVE_POOL_SIZE : 자바풀의 크기, 기본은 24MB임

SGA 크기 : SGA_MAX_SIZE - DB_CACHE_SIZE - LOG_BUFFER - SHARED_POOL_SIZE -

                      LARGE_POOL - JAVA_POOL

할당 단위 : Granule은 연속된 가상 메모리 할당 단위입니다. Granule의 크기는 SGA_MAX_SIZE

                      파라미터 값에 의해 계산된 SGA 전체 크기에 의존합니다

  . 계산된 SGA 크기가 128MB보다 적을 때 Granule 크기는 4MB

  . 계산된 SGA 크기가 128MB보다 클 때 Granule 크기는 16MB

  . Database Buffer Cache와 Shared Pool은 Granule 경계에 따라 확장되고 축소될 수 있습니다.  

    인스턴스가 시작할 때 오라클 서버는 각각의 구성요소에 한 개의 Granule을 할당합니다.

    데이터베이스가 계속 사용되면서 그들이 요구하는 것에 따라 더 많은 Granule을 할당합니다

  . SGA의 최소 구성은 다음과 같이 3개의 Granule입니다

    Redo Buffer를 포함한 Fixed SGA에 1개를 할당

    Database Buffer Cache에 1개를 할당

    Shared Pool에 1개를 할당

2) Shared Pool

Shared Pool은 가장 최근에 실행된 SQL 문장과 가장 최근에 사용된 Dictionary를 저장하기 위해

   사용되며 아래 그림과 같이 Library Cache와 Data Dictionary Cache로 구성됩니다

 


-  Shared Pool 의 크기

  . Shared Pool은 다시 사용될 SQL Execution plan과 PL/SQL package, procedure, function

    Cursor 정보 들을 공유하기 위해 사용됩니다

  . Shared Pool의 크기는 초기 파라미터 SHARED_POOL_SIZE에 의해 결정됩니다.

    또한 ALTER SYSTEM SET 명령을 사용하여 동적으로 조정할 수 있습니다. 그렇지만

    전체 SGA 크기는 SGA_MAX_SIZE를 초과 할 수 없습니다

- 초기 파라미터 SHARED_POOL_SIZE로 크기를 결정합니다

- ALTER SYSTEM SET SHARED_POOL_SIZE = 64M

- 전체 SGA 크기는 SGA_MAX_SIZE를 초과 할 수 없습니다

- Library Cache

  . Library Cache 크기는 Shared Pool의 크기에 의존하며 가장 최근에 사용된 SQL과 PL/SQL 문장

    에 관한 정보가 저장됩니다. 그러므로 Shared Pool의 크기가 너무 작으면, 이들 문장이 계속해서

    Library Cache에 올라오게 되어 성능에 영향을 미치게 됩니다

  . Library Cache는 LRU 알고리즘이 사용되므로 Cache가 꽉 차면 최근에 적게 사용된 Execution

    Plan과 Parse Tree를 제거하여 새로운 문장을 위한 공간을 만듭니다

  . Shared SQL : 다시 수행될 SQL문장을 위해 Execution Plan과 Parse Tree를 저장하며 동일한

                          SQL 문장이 다시 수행되면 Shared SQL에서 Parse 정보를 가져옴

                          동일한 문장이 되려면 글자와 스키마와 변수가 같아야 함

  . Shared PL/SQL : 가장 최근에 사용된 PL/SQL 문장을 저장

- Data Dictionary Cache

  . Data Dictionary Cache는 Row Cache 라고도 부릅니다. 오라클 서버에 의해 Dictionary 정보가

    필요하면 Dictionary Table로부터 정보를 읽어 Data Dictionary Cache에 저장합니다. Data

    Dictionary의 크기는 Shared Pool에 의존하므로, 만약 Data Dictionary의 크기가 너무

    작으면 서버에 의해 필요한 정보를 반복적으로 Dictionary Table로부터 읽게 됩니다. 그러므로

    Dictionary Cache로부터 읽는 것보다 속도가 느리게 됩니다

  . Data Dictionary Cache의 기능

    가장 최근에 사용된 Database 정보를 저장함

    파일, 테이블, 인덱스, 사용자, 권한, 기타 다른 객체 정보들이 저장됨

    Parse 단계에서 서버 프로세스가 Dictionary 정보를 찾음

 

3) Database Buffer Cache

 


- Query문을 수행하면 오라클 서버는 Database Buffer Cache에서 원하는 블럭들을

   찾습니다. 해당 블럭을 Buffer Cache에서 찾지 못하면 데이터 파일에서 블럭을 읽어

   Database Buffer Cache에 저장해 놓으므로 같은 블럭에 대한 요구가 있으면 메모리에서 그

   블럭을 찾을 수 있어 Physical Read를 하지 않아도 됩니다. 오라클 서버는 Database Buffer

   Cache에서 새로운 블럭에 대한 공간을 만들기 위해 최근에 사용이 안된 블럭들을 쫓아내는 LRU

   알고리즘을 사용합니다 

- Database Buffer Cache 크기

  . Database Buffer Cache안에 있는 각 버퍼의 크기는 DB_BLOCK_SIZE 파라미터에 의해 결정되는

    오라클 블럭 크기와 같습니다. Database Buffer Cache는 독립적인 sub-cache들로 구성되는데,

    DB_BLOCK_SIZE 파라미터는 기본 블럭 크기를 결정하며 SYSTEM 테이블스페이스에 사용됩니다

  . Database Buffer Cache 크기를 결정하는 파라메타

    DB_CACHE_SIZE : 기본 Buffer Cache 크기를 결정,반드시 지정하여야 하며 0으로 설정할 수

                                 없음

   DB_KEEP_CACHE_SIZE : 다시 사용되므로 메모리에 머무르게 하고 싶은 블럭을 위한 버퍼

                                           크기를 지정함

    DB_RECYCLE_CACHE_SIZE : 다시 사용되지 않으므로 메모리에서 제거하고 싶은 블럭을 위한

                                                 버퍼 크기를 지정함


[출처] 오라클 기초|작성자 myjoo80


- Buffer Cache Advisory

  . Buffer Cache Advisory는 다른 Cache 크기를 가졌을 때의 행동을 예견하기 위한 통계를 모으는

    작업을 활성화 혹은 비활성화 할 수 있다는 특징을 가지고 있습니다. 이 통계에 의해 제공되는

    정보는 주어진 작업에 따라 Database Buffer Cache 크기를 적당하게 조절할 수 있도록 합니다.

    Buffer Cache Advisory 정보는 V$DB_CACHE_ADVICE에 저장되며, DB_CACHE_ADVICE 초기

    파라미터로 활성화 할 수 있습니다

  . OFF : Advisory를 위한 메모리를 할당하지 않음

  . ON : CPU와 메모리의 과부하를 초래 / OFF 상태에서 ON으로 변경하면 ORA-4031 에러가 발생함

            / READY 상태에서 ON으로 변경하면 메모리가 할당되어 있어 에러가 발생하지 않음

  . READY : Advisory는 OFF되어 있지만 메모리는 할당되어 있음

 

4) Redo Log Buffer

 


- Redo Log Buffer는 데이터 파일 블럭들에 만들어진 변경을 포함하고 있는 순환 buffer입니다 

- 이 정보는 리두 엔트리 안에 저장됩니다 /

  . 리두엔트리 : INSERT, UPDATE, DELETE, CREATE, ALTER, DROP 명령에 의해 만들어진 변경전

                       의 데이타를 다시 만들기 위해 필요한 정보를 갖고 있음 

- Redo Log Buffer 크기 : 초기 파라미터 LOG_BUFFER에 의해 결정됩니다

 

5) Large Pool

- Shared Server, Oracle XA, Parallel Query Buffers에서 세션 메모리를 Large Pool에

   할당하므로 오라클은 공유하는 SQL 문장을 저장하기 위해 Shared Pool을 사용할 수 있습니다.

   따라서 Shared Pool 안의 영역에서 짐을 덜 수 있습니다. Shared Pool은 Shared Session 정보,

   I/O, Backup, Recover 프로세스들을 위하여 SQL Parse Tree를 메모리에서 포기할 필요가

  없습니다. 그러므로 Shared SQL을 확장하고 축소하며 발생하는 과부하를 줄여 성능이 좋아집니다

- Backup and Restore

  . BACKUP_DISK_IO=n, BACKUP_TAPE_IO_SLAVE=true 파라미터가 정의되었으면 Recovery

     Manager (RMAN)는 Large Pool을 사용합니다. 만약 Large Pool이 충분히 크지 않으면 Large

     Pool에 메모리 할당은 실패합니다. RMAN은 에러 메세지를 Alert! Log File에 기록하고 Backup이

    나 Restore를 위하여 I/O slaves를 사용하지 않습니다

- Parallel execution

  . PARALLEL_AUTOMATIC_TUNING=true 파라미터가 정의되었으면 Large Pool을 사용하고 그렇지

    않으면 Shared Pool을 사용합니다

- Large Pool 크기

  . LARGE_POOL_SIZE 파라미터에 의해 결정되며 이 파라미터는 동적이 아닙니다

- Large Pool 과 LRU list

  . Large Pool은 LRU list를 사용하지 않습니다. LRU list를 사용하는 Shared Pool안의 예약된

     공간과 다릅니다

 

6) Java Pool

- Java Pool은 선택적이지만 JAVA를 설치하거나 사용하려면 필요합니다. 크기는 JAVA_POOL_SIZE

   파라미터에 의해 결정되며, 기본 크기는 24MB입니다

 

7) Program Global Area

 


- Program Global Area 혹은 Process Global Area (PGA)는 단일 서버 프로세서나

  단일 백그라운드 프로세서를 위한 데이터와 제어정보를 갖고 있습니다. PGA는 프로세스가 시작할

  때 할당되고 프로세스가 종료되면 해제됩니다. 여러 개의 프로세스들에 의해 공유되는 SGA에 반해

  PGA는 단지 한 개의 프로세스에 의해 사용되는 영역입니다

- PGA 의 내용

  . PGA의 내용은 인스턴스가 Dedicated Server 혹은 Shared Server에서 운영되느냐에 따라 달라

     집니다. 일반적으로 PGA는 다음과 같은 정보를 포함

     Private SQL Area : bind 정보와 실행 메모리 구조 같은 데이터를 포함

     Session 메모리 : 세션 변수와 세션과 관련된 다른 정보를 포함

     SQL Work Area : Sort, Hash-join, Bitmap merge, Bitmap 생성시 사용

 

3. 프로세스 구조

오라클은 여러 가지 종류의 프로세스들을 갖고 있습니다. 사용자가 오라클 서버에
접속했을 때 시작하는 사용자 프로세스, 사용자가 세션을 만들었을 때 시작하여
오라클 인스턴스와 접속하는 서버 프로세스, 오라클 인스턴스가 시작했을 때
시작하는 백그라운드 프로세스가 그것입니다

 

1) 사용자 프로세스


 

- 데이터베이스의 정보를 요구하는 사용자는 먼저 오라클 서버와 접속을 해야 합니다. SQL*Plus

   같은 Tool을 사용하여 접속하면 사용자 프로세스가 시작됩니다. 사용자 프로세스는 오라클 서버와

   직접 작용하지 않는 대신 세션을 만들고 서버 프로세스를 시작시키는 User Program Interface

   (UPI)를 통해 접속합니다

 

2) 서버 프로세스

 


사용자가 접속하면 사용자의 요구를 처리하기 위해 서버 프로세스가 시작됩니다.

   서버 프로세스는 Dedicated Server process 혹은 Shared Server process가 될 수 있습니다.

   Dedicated Server 환경에서, 서버 프로세스는 한 개의 사용자 프로세스 요구를 처리하며 사용자

   프로세스가 종료하면 서버 프로세스도 종료합니다. 반면 Shared Server 환경에서, 서버

   프로세스는 여러 개의 사용자 프로세스 요구를 처리합니다. 서버 프로세스는 Oracle Program

   Interface(OPI)를 사용하여 오라클 서버와 통신합니다 

 

3) 백그라운드 프로세스

- 오라클은 뒤에서 설명할 다섯 개의 필수적인 백그라운드 프로세스와 옵션이 사용됐을 때

   시작하는 선택적인 백그라운드 프로세스가 있습니다

  . RECO : Recover

  . QMNn : Advanced Queuing

  . ARCn : Archiver

  . LCKn : Rac Lock Manager - Instance Locks

  . LMON : RAC DLM Monitor - Global Locks

  . LMDn : RAC DLM Monitor - Remote Locks

  . CJQ0 : Coordinator Job Queue background process

  . Dnnn : Dispatcher

  . Snnn : Shared Server

  . Pnnn : Parallel Query Slaves

- Database Writer (DBWn)

 


 

. 서버 프로세스는 변경을 Database Buffer Cache 안의 언두 블럭과 데이터 블럭에 기록합니다.

  DBWn은 Database Buffer Cache 안의 Dirty Buffer들을 데이터 파일에 기록합니다. 이렇게

  함으로써 Database Buffer Cache 안에 사용할 수 있는 많은 수의 Free Buffer를 보장할 수

  있습니다. 또한 서버 프로세스는 Database Buffer Cache 안에서만 변경을 하므로 데이터베이스의

  성능이 향상됩니다

. DBWn은 다음과 같은 경우가 될 때까지 데이터 파일에 기록을 지연합니다

  Checkpoint가 발생했을 때

  Dirty Buffer의 수가 한계에 도달했을 때

  서버 프로세스가 지정된 수의 블럭을 읽는 동안 Free Buffer를 찾지 못했을 때

  시간이 경과했을 때

  Real Application Clusters (RAC) 환경에서 ping을 요구했을 때

  테이블스페이스를 OFFLINE 시킬 때

  테이블스페이스를 READ ONLY로 변경시킬 때

  테이블을 DROP 하거나 TRUNCATE 시킬 때

  테이블스페이스를 BEGIN BACKUP 했을 때

- Log Writer (LGWR)

 


 

  . LGWR는 순차적으로 Redo Log Buffer를 리두 로그 파일에 기록합니다. 리두는 복구에 사용되므로

    LGWR는 리두가 디스크에 쓰여진 후에 COMMIT 명령을 확인합니다. LGWR는 데이터 파일에 기록

    하기 위해 DBWn을 부를 수도 있습니다 

  . LGWR는 다음과 같은 경우에 발생합니다

    COMMIT 명령이 수행됐을 때

    Redo Log Buffer가 1/3 이상 찼을 때

    Redo Log Buffer 안의 변경이 1MB를 초과했을 때

    DBWn이 Database Buffer Cache의 변경된 블럭을 데이터 파일에 기록하기 전 매 3초 마다

 

- System Monitor (SMON)

 


  . 오라클 인스턴스가 실패하면, 디스크에 기록되지 않은 SGA 안의 정보는 잃어버립니다.

    인스턴스를 잃은 후에 데이터베이스를 다시 시작하면 SMON이 자동적으로 인스턴스

    복구를 수행합니다 

  . 다음과 같은 순서로 인스턴스가 복구

    


 

- Process Monitor (PMON) 

 


 

. PMON은 실패한 프로세스를 다음과 같이 정리

  사용자의 현재 트랜잭션을 취소

  현재 걸려 있는 테이블 잠금과 로우 잠금을 해제

  사용자에 의해 유지되고 있는 다른 자원을 해제

  죽은 Dispatcher를 다시 시작함

 

- Checkpoint (CKPT)

 


 

매 3초마다 CKPT 프로세스는 리두로그 파일에서 복구가 시작될 위치를 확인하기 위해 컨트롤 파일

  안에 데이터를 저장합니다. 이것을 Checkpoint라고 부릅니다 

  Checkpoint의 목적은 한 시점 전에 Database Buffer Cache에서 수정된 모든 버퍼들이 데이터

  파일에 기록된 것을 보장하는 것입니다. 이 시점이 인스턴스 실패 시에 복구를 시작할 위치입니다.

  DBWn는 그 시점 이전에 Database Buffer Cache에서 변경된 모든 버퍼들을 기록합니다

  로그 스위치가 발생할 때 CKPT는 데이터 파일의 헤더에 Checkpoint 정보를 기록합니다

. Checkpoint는 다음과 같은 이유로 발생

  1. 메모리에서 수정된 데이터 블럭들이 주기적으로 디스크에 쓰여져 시스템 실패시에 데이터가

     손실되지 않도록 하기 위해

  2. 인스턴스 복구에 필요한 시간을 줄이기 위해, Checkpoint 이후의 리두 로그 엔트리만이 복구 필요

  3. 모든 COMMIT 된 데이터들이 데이터베이스 종료시에 데이터 파일에 기록된 것을 보장하기 위해

 

- Archiver (ARCn)

 


  . ARCn은 데이터베이스의 구성에 따라 선택이지만 디스크 손실 후에 데이터베이스를 복구하기 위해

    매우 중요합니다. 
    리두 로그 파일이 꽉 차면 오라클 서버는 다음 리두 로그 파일에 쓰기를 시작합니다. 한 개의 리두

    로그 파일에서 다음 리두 로그 파일로 옮겨 쓰는 것을 로그 스위치라고 부릅니다. 
    ARCn 프로세스는 로그 스위치가 발생하면 꽉 찬 리두 로그 파일의 백업을 시작합니다. 이렇게

    리두 로그 파일이 다시 사용되기 전에 자동적으로 백업되어 데이터베이스에서 만들어진 모든

    변경은 보관됩니다. DBA는 디스크가 깨진 경우 그 시점까지 데이터베이스를 복구할 수 있습니다 

. NOARCHIVELOG 혹은 ARCHIVELOG 모드로 운영

  NOARCHIVELOG : 리두 로그 파일은 로그 스위치가 발생할 때 겹쳐 쓰여 집니다

                              LGWR는 그 그룹에 대한 Checkpoint가 완료될 때까지 리두 로그 그룹을

                              겹쳐 쓸 수 없습니다. 이것은 COMMIT 된 데이터들이 인스턴스 실패 시에

                              복구될 수 있음을 보장합니다

  ARCHIVELOG  : 리두 로그 그룹은 다시 사용되기 전에 반드시 기록되어야 합니다

                           데이터베이스에서 만들어진 변경은 리두 로그 파일에 기록되어 있으므로 DBA는

                           데이터 파일의 물리적인 백업과 아카이브 파일을 사용하여 COMMIT 된 데이터의

                           손실 없이 데이터베이스를 복구할 수 있습니다

 

 

4. SQL 문장처리

사용자가 SQL*Plus를 사용하여 오라클 서버에 접속하면 사용자 프로세스가 시작하여
세션을 만들고 서버 프로세스를 시작시킵니다.
사용자 프로세스에서 수행시킨 SQL 문장을 서버 프로세스에서 처리할 때 사용되는 
구성요소는 SQL 문장의 종류에 따라 다릅니다. 어떤 구성요소는 SQL 문장 처리에
사용되지 않기도 합니다

- QUERY 문 처리

  . Parse (구문분석)

    1. 동일한 문장을 Library Cache에서 찾음

    2. 문법을 체크

    3. 객체명과 권한을 체크

    4. Parse 과정에서 사용되는 객체에 잠금을 함

    5. Execution plan을 생성하여 Library Cache에 저장함

  . Bind : 변수들에 값을 지정합니다

  . Execute : 문장을 처리합니다

  . Fetch : 사용자 프로세스에 데이터를 보냅니다

- DML 문 처리

  . Parse (구문분석)

  . Bind

  . Execute

    1. 데이터 블럭과 undo 블럭을 Buffer Cache에서 찾음

    2. 없으면 데이터 파일에서 읽어서 Buffer Cache에 저장함

    3. 변경될 데이터에 잠금을 함

    4. Redo Log Buffer에 변경 전 데이터와 변경 후 데이터를 기록

    5. 변경 전 데이터를 undo 블럭에 기록하고 데이터 블럭을 변경함

    6. Buffer Cache 안의 변경된 블럭은 Dirty Buffer로 기록됨

  . DELETE와 INSERT 문의 처리과정도 이와 유사합니다. DELETE 문의 변경 전 데이터는 삭제된

    로우의 전체 칼럼 값이며, INSERT 문의 변경 전 데이터는 로우의 위치 정보입니다

- DDL 문 처리

  . DDL 문의 실행은 DML 문이나 QUERY 문의 실행과 다릅니다.  왜냐하면 DDL 문의 성공은

    Dictionary에 쓰기를 요구합니다. 실제 Parsing은 Parsing과 Dictionary 검색과 Execution을

   포함합니다. Transaction Management, Session Management, System Management

   SQL 문이 Parse와 Execute 단계를 사용하여 처리됩니다


출처 - http://mes2good.egloos.com/763061#763061_1

'DB > ORACLE' 카테고리의 다른 글

DML 문의 처리과정(트랜잭션 내부작업)  (0) 2016.12.14
오라클 액세스  (0) 2016.12.13
참조 사이트  (0) 2014.09.02
[oracle] dump/import 명령어  (0) 2014.01.10
리눅스 오라클 설치  (0) 2014.01.10
:

참조, 예제 사이트

Language/XML 2016. 12. 13. 09:56

http://tcpschool.com/xml/intro


http://www.w3schools.com/xml/default.asp

'Language > XML' 카테고리의 다른 글

WSDL(Web Services Description Language)  (0) 2016.12.12
XML, SOAP, WSDL, UDDI  (0) 2016.12.07
XML 스키마  (0) 2013.07.03
:

WSDL(Web Services Description Language)

Language/XML 2016. 12. 12. 17:20

저자 (알파벳 순):

Erik Christensen, Microsoft

Francisco Curbera, IBM

Greg Meredith, Microsoft

Sanjiva Weerawarana, IBM

Copyrightⓒ 2001 AribaInternational Business Machines CorporationMicrosoft

개요

WSDL은 문서 지향적 또는 프로시저 지향적인 정보를 포함한 메시지에서 작동하는 종점 집합으로서의 네트워크 서비스를 설명하는 XML 형식입니다. 이러한 작동 및 메시지에 대해 대략적으로 설명한 다음, 구체적인 네트워크 프로토콜 및 메시지 형식으로 연결하여 종점에 대해 정의합니다. 관련된 구체적인 종점은 추상 종점(서비스)과 결합되어 있습니다. WSDL은 통신에 사용되는 메시지 형식 또는 네트워크 프로토콜과는 상관 없이 종점 및 종점의 메시지를 설명하도록 확장할 수 있습니다. 하지만, 이 문서에 설명된 바인딩만이 SOAP 1.1, HTTP GET/POST 및 MIME과 함께 WSDL을 사용하는 방법을 설명합니다.

이 WSDL 언어 버전은 종점의 컴퍼지션 및 결합을 설명하는 프레임워크를 포함하지 않는 첫 번째 단계입니다. 계약을 설명하는 전체 프레임워크는 메시지를 받거나 보내는 순서 규칙과 같이 서비스의 동작을 표현하는 방법과 서비스를 작성하는 방법을 포함합니다. 서비스의 컴퍼지션은 모든 형식을 지원해야 하지만 런타임에 교환되고 바운드되는 서비스 참조와 함께 전달되는 참조를 허용해야 합니다. 특히, 후자는 런타임 계약 협상의 중요한 요소이며 참조 동작을 캡처하고 서비스를 중개합니다.

WSDL 스펙 작성자들은 (1)서비스를 작성하는 프레임워크 및 (2)서비스의 동작을 설명하는 프레임워크를 포함하는 WSDL의 수정된 버전 및/또는 추가 문서를 적시에 게시하고 있습니다.

상태

여기에서는 Ariba, IBM 및 Microsoft 내에서 서비스의 설명과 관련한 현재 고려 사항을 보여 주며 NASSL, SCL 및 SDL(이 분야에서의 이전 제안)의 개념을 통합합니다.

목차

1. 소개 1. 소개 
1.1 WSDL 문서 예제 1.1 WSDL 문서 예제 
1.2 국제 규칙 1.2 국제 규칙 
2. 서비스 정의 2. 서비스 정의 
2.1 WSDL 문서 구조 2.1 WSDL 문서 구조 
2.1.1 문서 명명 및 연결 2.1.1 문서 명명 및 연결 
2.1.2 제작 스타일 2.1.2 제작 스타일 
2.1.3 언어 확장성 및 바인딩 2.1.3 언어 확장성 및 바인딩 
2.1.4 설명서 2.1.4 설명서 
2.2 형식 2.2 형식 
2.3 메시지 2.3 메시지 
2.3.1 메시지 부분 2.3.1 메시지 부분 
2.3.2 추상적인 메시지와 구체적인 메시지 2.3.2 추상적인 메시지와 구체적인 메시지 
2.4 포트 형식 2.4 포트 형식 
2.4.1 단방향 작업 2.4.1 단방향 작업 
2.4.2 요청-응답 작업 2.4.2 요청-응답 작업 
2.4.3 검색-응답 작업 2.4.3 검색-응답 작업 
2.4.4 알림 작업 2.4.4 알림 작업 
2.4.5 작업 내 요소의 이름 2.4.5 작업 내 요소의 이름 
2.4.6 작업 내 매개 변수 순서 2.4.6 작업 내 매개 변수 순서 
2.5 바인딩 2.5 바인딩 
2.6 포트 2.6 포트 
2.7 서비스 2.7 서비스 
3. SOAP 바인딩 3. SOAP 바인딩 
3.1 SOAP 예제 3.1 SOAP 예제 
3.2 SOAP 바인딩이 WSDL을 확장하는 방법 3.2 SOAP 바인딩이 WSDL을 확장하는 방법 
3.3 soap:binding 3.3 soap:binding 
3.4 soap:operation 3.4 soap:operation 
3.5 soap:body 3.5 soap:body 
3.6 soap:fault 3.6 soap:fault 
3.7 soap:header 3.7 soap:header 
3.8 soap:address 3.8 soap:address 
4. HTTP GET 및 POST 바인딩 4. HTTP GET 및 POST 바인딩 
4.1 HTTP GET/POST 예제 4.1 HTTP GET/POST 예제 
4.2 HTTP GET/POST 바인딩이 WSDL을 확장하는 방법 4.2 HTTP GET/POST 바인딩이 WSDL을 확장하는 방법 
4.3 http:address 4.3 http:address 
4.4 http:binding 4.4 http:binding 
4.5 http:operation 4.5 http:operation 
4.6 http:urlEncoded 4.6 http:urlEncoded 
4.7 http:urlReplacement 4.7 http:urlReplacement 
5. MIME 바인딩 5. MIME 바인딩 
5.1 MIME 바인딩 예제 5.1 MIME 바인딩 예제 
5.2 MIME 바인딩이 WSDL을 확장하는 방법 5.2 MIME 바인딩이 WSDL을 확장하는 방법 
5.3 mime:content 5.3 mime:content 
5.4 mime:multipartRelated 5.4 mime:multipartRelated 
5.5 soap:body 5.5 soap:body 
5.6 mime:mimeXml 5.6 mime:mimeXml 
6. 참조 6. 참조 
A 1. URI에 대한 참고 A 1. URI에 대한 참고 
A 1.1 XML 이름 공간 및 스키마 위치 A 1.1 XML 이름 공간 및 스키마 위치 
A 1.2 상대 URI A 1.2 상대 URI 
A 1.3 URI 작성 A 1.3 URI 작성 
A 2. 네트워크 형식의 WSDL 예제 A 2. 네트워크 형식의 WSDL 예제 
A 2.1. 예제 1 A 2.1. 예제 1 
A 3. 확장성 요소의 위치 A 3. 확장성 요소의 위치 
A 4. 스키마 A 4. 스키마 
A 4.1 WSDL 스키마 A 4.1 WSDL 스키마 
A 4.2 SOAP 바인딩 스키마 A 4.2 SOAP 바인딩 스키마 
A 4.3 HTTP 바인딩 스키마 A 4.3 HTTP 바인딩 스키마 
A 4.4 MIME 바인딩 스키마 A 4.4 MIME 바인딩 스키마 

1. 소개

통신 프로토콜 및 메시지 형식이 웹 커뮤니티에서 표준화됨에 따라, 통신을 어느 정도 구조적인 방법으로 설명하는 것이 점차 가능해지고 중요해지게 되었습니다. WSDL은 네트워크 서비스를 메시지를 교환할 수 있는 통신 종점의 컬렉션으로 설명하는 XML 문법을 정의하여 이러한 필요성을 해결합니다. WSDL 서비스 정의는 분산 시스템에 대한 설명서를 제공하고 응용 프로그램 통신과 관련된 자세한 정보를 자동화할 수 있도록 합니다.

WSDL 문서는 services를 네트워크 종점의 컬렉션 또는 ports로 정의합니다. WSDL에서 종점 및 메시지의 추상 정의는 구체적인 네트워크 구축 또는 데이터 형식 바인딩과는 구분되며 이러한 특성은 추상 정의를 재사용 가능하도록 합니다. 즉, messages는 교환되는 데이터의 추상 설명이고, port types은 operations의 추상 컬렉션입니다. 특정 포트 유형에 대한 구체적인 프로토콜과 데이터 형식 지정은 재사용 가능한 binding을 구성합니다. 포트는 네트워크 주소를 재사용 가능한 바인딩에 연결하여 정의되고, 포트의 컬렉션은 서비스를 정의합니다. 따라서 WSDL 문서는 네트워크 서비스의 정의에서 다음과 같은 요소를 사용합니다.

  • Types XSD와 같은 특정 형식 시스템을 사용하는 데이터 형식 정의에 대한 컨테이너.

  • Message 통신할 데이터에 대한 추상적이고 형식화된 정의.

  • Operation 서비스가 지원하는 동작에 대한 추상적인 설명.

  • Port Type 하나 이상의 종점에서 지원하는 추상적인 작업 집합.

  • Binding 특정 포트 유형에 대한 구체적인 프로토콜 및 데이터 형식 지정.

  • Port 바인딩과 네트워크 주소가 결합되어 정의되는 단일 종점.

  • Service 관련된 종점의 컬렉션.

이러한 요소들은 2절에서 자세하게 설명합니다. WSDL이 새로운 형식 정의 언어를 도입하는 것은 아니라는 것을 알아두십시오. WSDL은 메시지 형식을 설명하는 다양한 형식 시스템의 필요성을 인식하여 정식의 형식 시스템으로 XML 스키마 규격(XSD)[11]을 지원합니다. 그러나 현재의 메시지 형식을 포함하여 앞으로 사용하게 될 모든 메시지 형식을 설명하는 데 있어 단일 형식 시스템 문법을 기대하기 어렵기 때문에, WSDL은 확장성을 통해 다른 형식의 정의 언어를 사용할 수 있도록 합니다.

또한 WSDL은 일반적인 binding 메커니즘을 정의합니다. 이 메커니즘은 특정 프로토콜이나 데이터 형식 또는 구조를 추상 메시지, 작업 또는 종점에 연결하는 데 사용되고 추상 정의를 재사용할 수 있도록 합니다.

이 규격은 주요 서비스 정의 프레임워크와 함께 다음 프로토콜 및 메시지 형식에 대해 특정 바인딩 확장을 소개합니다.

1.1 WSDL 문서 예제

다음은 주식 시세를 제공하는 간단한 서비스에 대한 WSDL 정의 예제를 보여 줍니다. 이 서비스는 HTTP상에 SOAP 1.1 프로토콜을 사용하여 구축된 GetLastTradePrice라고 하는 단일 작업을 지원합니다. 요청은 문자열 형식의 증권 시세 표시기 기호를 입력으로 받아, 부동 소수점 형식의 가격을 반환합니다. 이 정의에 사용된 요소에 대한 자세한 설명은 2절(주요 언어) 및 3절(SOAP 바인딩)에서 볼 수 있습니다.

이 예제는 SOAP 인코딩 대신 고정 XML 형식을 사용합니다(SOAP 인코딩을 사용하는 예제는 예제 4를 참조하십시오).

예제 1 HTTP를 통한 SOAP 1.1 요청/응답

<?xml version="1.0"?>
<definitions name="StockQuote" 
targetNamespace="http://example.com/stockquote.wsdl"
          xmlns:tns="http://example.com/stockquote.wsdl"
          xmlns:xsd1="http://example.com/stockquote.xsd"
          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns="http://schemas.xmlsoap.org/wsdl/">
   <types>
       <schema targetNamespace="http://example.com/stockquote.xsd"
              xmlns="http://www.w3.org/1999/XMLSchema">
           <element name="TradePriceRequest">
              <complexType>
                  <all>
                      <element name="tickerSymbol" type="string"/>
                  </all>
              </complexType>
           </element>
           <element name="TradePrice">
              <complexType>
                  <all>
                      <element name="price" type="float"/>
                  </all>
              </complexType>
           </element>
       </schema>
   </types>
 
   <message name="GetLastTradePriceInput">
        <part name="body" element="xsd1:TradePrice"/>
    </message>
    <message name="GetLastTradePriceOutput">
        <part name="body" element="xsd1:TradePriceResult"/>
    </message>
    <portType name="StockQuotePortType">
        <operation name="GetLastTradePrice">
           <input message="tns:GetLastTradePriceInput"/>
           <output message="tns:GetLastTradePriceOutput"/>
        </operation>
    </portType>
    <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GetLastTradePrice">
           <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
           <input>
               <soap:body use="literal" namespace="http://example.com/stockquote.xsd"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </input>
           <output>
               <soap:body use="literal" namespace="http://example.com/stockquote.xsd"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </output>
        </operation>
    </binding>
    <service name="StockQuoteService">
        <documentation>첫 번째 서비스</documentation> 
        <port name="StockQuotePort" binding="tns:StockQuoteBinding">
           <soap:address location="http://example.com/stockquote"/>
        </port>
    </service>
</definitions>

1.2 국제 규칙

1. 이 문서에 있는 키워드인 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 및 "OPTIONAL" 는 RFC-2119 [2]에 설명된 바와 같이 해석됩니다.

2. 다음 이름 공간 접두사는 이 문서 전반에 걸쳐 사용됩니다

접두사

이름 공간 URI

정의

wsdl

http://schemas.xmlsoap.org/wsdl/

WSDL 프레임워크에 대한 WSDL 이름 공간.

soap

http://schemas.xmlsoap.org/wsdl/soap/

WSDL SOAP 바인딩에 대한 WSDL 이름 공간.

http

http://schemas.xmlsoap.org/wsdl/http/

HTTP GET & POST 바인딩에 대한 WSDL 이름 공간.

mime

http://schemas.xmlsoap.org/wsdl/mime/

MIME 바인딩에 대한 WSDL 이름 공간.

soapenc

http://schemas.xmlsoap.org/soap/encoding/tous.gif

SOAP 1.1 [8]에 의해 정의된 인스턴스 이름 공간.

soapenv

http://schemas.xmlsoap.org/soap/envelope/tous.gif

SOAP 1.1 [8]에 의해 정의된 인스턴스 이름 공간.

xsi

http://www.w3.org/1999/XMLSchema-instancetous.gif

XSD[10]에 의해 정의된 인스턴스 이름 공간.

xsd

http://www.w3.org/1999/XMLSchema tous.gif

XSD [10]에 의해 정의된 스키마 이름 공간.

tns

(다양함)

“this namespace”를 의미하는 (tns) 접두사는 현재 문서를 참조하는 규칙으로 사용됩니다.

(기타)

(다양함)

다른 모든 이름 공간 접두사는 단지 예제일 뿐입니다. 특히, “http://example.com”으로 시작하는 URI는 어느 정도 응용 프로그램 종속적이거나 컨텍스트 종속적인 URI[4]를 나타냅니다.

3. 이 규격은 비공식 구문에 사용되어 WSDL 문서의 XML 문법을 설명합니다.

  • 구문은 XML 인스턴스로 나타나지만, 값은 값이라기 보다는 데이터 형식을 나타냅니다.

  • 문자는 "" (0 또는 1), "*" (0 또는 그 이상의 숫자), "+" (1 또는 그 이상의 숫자)와 같이 요소 및 특성에 추가됩니다.

  • <element.../> 또는 <element...>에서처럼 "..."로 끝나는 요소 이름들은 컨텍스트에 관계 없는 요소/특성이 생략된다는 것을 나타냅니다.

  • 굵게 되어 있는 문법은 이전 문서에 소개되지 않았거나 해당 예제에서 특별히 중요한 부분입니다.

  • <-- extensibility element -->는 XSD 이외인 경우 ##과 같이 어떤 "다른" 이름 공간에서 온 요소에 대한 자리 표시자입니다.

  • 위에 정의된 XML 이름 공간 접두사는 정의되는 요소의 이름 공간을 나타내는 데 사용됩니다.

  • <xml로 시작되는 예제에는 이 규격을 준수하는 충분한 정보가 있습니다. 다른 예제는 단편적이므로 규격에 맞도록 지정해야 되는 추가 정보가 필요합니다.

XSD 스키마는 WSDL 문법의 공식적인 정의로서 제공됩니다(A4항목을 참조 하시기 바랍니다).

2. 서비스 정의

이 절에서는 WSDL 언어의 주요 요소를 설명합니다. SOAP, HTTP 및 MIME의 바인딩 확장은 3절, 4절 및 5절에서 설명하였습니다.

2.1 WSDL 문서 구조

WSDL 문서는 단순한 정의의 집합입니다. 루트에 definition 요소가 있고 그 안에 정의가 있습니다. 문법은 다음과 같습니다.

<wsdl:definitions name="nmtoken" targetNamespace="uri">
    <import namespace="uri" location="uri"/>*
 
    <wsdl:documentation.../> 
    <wsdl:types> 
        <wsdl:documentation.../>
        <xsd:schema.../>*
        <-- extensibility element --> *
    </wsdl:types>
    <wsdl:message name="nmtoken> *
        <wsdl:documentation.../>
        <part name="nmtoken" element="qname" type="qname"/> *
    </wsdl:message>
    <wsdl:portType name="nmtoken">*
        <wsdl:documentation.../>
        <wsdl:operation name="nmtoken">*
           <wsdl:documentation.../> 
           <wsdl:input name="nmtoken" message="qname">
               <wsdl:documentation.../>
           </wsdl:input>
           <wsdl:output name="nmtoken" message="qname">
               <wsdl:documentation.../> 
           </wsdl:output>
           <wsdl:fault name="nmtoken" message="qname"> *
               <wsdl:documentation.../> 
           </wsdl:fault>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="nmtoken" type="qname">*
        <wsdl:documentation.../>
        <-- extensibility element --> *
        <wsdl:operation name="nmtoken">*
           <wsdl:documentation.../> 
           <-- extensibility element --> *
           <wsdl:input name="nmtoken"> 
               <wsdl:documentation.../> 
               <-- extensibility element --> 
           </wsdl:input>
           <wsdl:output name="nmtoken"> 
               <wsdl:documentation.../>
               <-- extensibility element --> *
           </wsdl:output>
           <wsdl:fault name="nmtoken"> *
               <wsdl:documentation.../> 
               <-- extensibility element --> *
           </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="nmtoken"> *
        <wsdl:documentation.../>
        <wsdl:port name="nmtoken" binding="qname"> *
           <wsdl:documentation.../> 
           <-- extensibility element -->
        </wsdl:port>
        <-- extensibility element -->
    </wsdl:service>
    <-- extensibility element --> *
</wsdl:definitions>

서비스는 다섯 개의 중요한 요소를 사용하여 정의됩니다.

  • types는 교환된 메시지를 설명하는 데 사용된 데이터 형식 정의를 제공합니다.

  • message는 전송되는 데이터의 추상 정의를 나타냅니다. 메시지는 논리적인 부분으로 이루어져 있으며 각 부분은 특정 형식 시스템 내의 정의와 연관되어 있습니다.

  • portType은 추상 작업의 집합이며 각 작업은 입력 메시지 및 출력 메시지를 참조합니다.

  • binding은 특정 portType에 의해 정의된 메시지 및 작업에 대해 구체적인 프로토콜과 데이터 형식을 지정합니다.

  • port는 바인딩에 대해 주소를 지정하기 때문에 단일 통신 종점을 정의합니다.

  • service는 관련된 포트의 집합을 집계하는 데 사용됩니다.

2.2절에서 2.7절은 이러한 요소를 설명합니다. 이 절의 나머지 부분은 문서 명명, 문서 정의 참조, 언어 확장 사용 및 컨텍스트 설명서 추가에 대해 WSDL로 소개된 규칙을 설명합니다.

2.1.1 문서 명명 및 연결

WSDL 문서는 간단한 형태의 설명서로 제공되는 NCNAME 형식의 선택적인 name 특성으로 지정될 수 있습니다. 또한 URI 형식의 targetNamespace 특성을 지정할 수도 있습니다. URI는 상대 URI일 수 없습니다.

WSDL은 import 문을 사용하여 문서 location과 namespace를 연결할 수 있도록 합니다.

<definitions...>
    <import namespace="uri" location="uri"/> *
</definitions>

WSDL 정의 참조는 QName tous.gif 을 사용하여 만들어집니다. WSDL 문서에 포함된 다음과 같은 정의 형식이 참조될 수도 있습니다.

  • WSDL 정의: service, port, message, bindings, 및 portType

  • 기타 정의: 추가 정의가 확장성을 통해 추가되는 경우, 이 정의는 QName 연결을 사용합니다.

    위에 나열된 WSDL 정의 형식은 자체 이름 범위를 가지고 있습니다. 즉, port 이름과 message 이름은 충돌하지 않습니다. 이름 범위내에 있는 이름은 WSDL 문서 내에서 고유해야 합니다.

    WSDL에서 QNames 확인은 XML 스키마 규격[11]으로 설명된 QNames 확인과 유사합니다.

2.1.2 제작 스타일

import 요소를 사용하여 서비스 정의의 서로 다른 요소들을 별도의 문서로 분리하여 필요할 때 가져올 수 있습니다. 이 기능은 서비스의 추상화 수준에 따라 정의를 분리하여 서비스 정의를 더 명확하게 작성할 수 있도록 도와 줍니다. 또한 모든 종류의 서비스 정의를 재사용하는 기능을 최대화합니다. 따라서 이러한 방법으로 구조화된 WSDL 문서는 사용 및 유지 관리가 쉽습니다. 아래의 예제 2는 예제 1에 나타난 서비스를 정의하는 제작 스타일의 사용 방법을 보여 줍니다. 여기서는 정의를 데이터 형식 정의, 추상 정의 및 특정 서비스 바인딩의 세 개 문서로 분리하였습니다. 이 메커니즘의 사용은 이 규격에 정의된 언어 요소만 사용하는 예제에 명시적으로 나타난 정의에만 제한되지는 않습니다. 추가 언어 확장을 기반으로 하는 다른 형식의 정의는 유사한 방법으로 인코드되고 다시 사용될 수 있습니다.

예제 2. 예제 1    서비스에   대한   대체   제작   스타일

http://example.com/stockquote/stockquote.xsd

<?xml version="1.0"?>
<schema targetNamespace="http://example.com/stockquote/schemas"
       xmlns="http://www.w3.org/2000/10/XMLSchema">
    <element name="TradePriceRequest">
        <complexType>
            <all>
                <element name="tickerSymbol" type="string"/>
            </all>
        </complexType>
    </element>
    <element name="TradePrice">
        <complexType>
            <all>
                <element name="price" type="float"/>
            </all>
        </complexType>
    </element>
</schema>

http://example.com/stockquote/stockquote.wsdI

<?xml version="1.0"?>
<definitions name="StockQuote" 
targetNamespace="http://example.com/stockquote/definitions"
          xmlns:tns="http://example.com/stockquote/definitions"
          xmlns:xsd1="http://example.com/stockquote/schemas"
          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns="http://schemas.xmlsoap.org/wsdl/">
   <import namespace="http://example.com/stockquote/schemas"
           location="http://example.com/stockquote/stockquote.xsd"/>
   <message name="GetLastTradePriceRequest">
        <part name="body"element="xsd1:GetLastTradePrice"/>
   </message>
   <message name="GetLastTradePriceResponse">
        <part name="body"element="xsd1:GetLastTradePriceResult"/>
   </message>
   <portType name="StockQuotePortType">
        <operation name="GetLastTradePrice"> 
           <input message="tns:GetLastTradePriceRequest"/>
           <output message="tns:GetLastTradePriceResponse"/>
       </operation>
   </portType>
</definitions>

http://example.com/stockquote/stockquoteservice.wsdI

<?xml version="1.0"?>
<definitions name="StockQuote" 
targetNamespace="http://example.com/stockquote/service"
          xmlns:tns="http://example.com/stockquote/service"
          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns:defs="http://example.com/stockquote/definitions"
          xmlns="http://schemas.xmlsoap.org/wsdl/">
   <import namespace="http://example.com/stockquote/definitions"
           location="http://example.com/stockquote/stockquote.wsdl"/>
 
    <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
         <soap:binding style="document"/>
         <operation name="GetLastTradePrice">
            <soap:operation soapAction="http://my.org/GetLastTradePrice"/>
         </operation>>
    </binding>
 
    <service name="StockQuoteService"> 
        <documentation>첫 번째 서비스</documentation> 
        <port name="StockQuotePort" binding="tns:StockQuoteBinding">
           <soap:address location="http://my.org/stockquote"/>
        </port>
   </service>
</definitions>

2.1.3 언어 확장성 및 바인딩

WSDL에서 바인딩이라는 용어는 프로토콜 또는 데이터 형식 정보와 message, operation 또는 portType과 같은 추상 엔티티를 연결하는 과정을 나타냅니다. WSDL는 WSDL로 정의된 다양한 요소 아래 특정 기술(확장성 요소)을 나타내는 요소를 허용합니다. 이러한 확장성은 일반적으로 특정 프로토콜 또는 메시지 형식에 대한 바인딩 정보를 지정하는 데 사용되지만 이러한 사용에 제한되지 않습니다. 확장성 요소는 WSDL 이름 공간과는 다른 XML 이름 공간을 사용해야 합니다. 확장성 요소가 나타날 수 있는 문서에서 특정 위치는 부록 A3에 자세히 설명되어 있습니다.

확장성 요소는 일반적으로 몇몇 특정 기술 관련 바인딩을 지정하는 데 사용됩니다. 통신에 기술 관련 바인딩 기능이 필요한지 또는 선택적인지를 구별하기 위해 확장성 요소는 해당 요소에 부울 형식의 wsdl:required 특성을 배치할 수도 있습니다. 필요한 기본값은 false입니다. 필요한 특성은 이름 공간 "http://schemas.xmlsoap.org/wsdl/"에서 정의됩니다.

확장성 요소를 사용하면 기본 WSDL 규격을 개정하지 않고 네트워크와 메시지 프로토콜 영역을 새로 바꿀 수 있습니다. WSDL은 이러한 프로토콜을 정의하는 규격이 프로토콜이나 형식을 설명하는 데 사용하는 필수 WSDL 확장도 정의할 것을 권장합니다.

확장성 요소에 대한 예제를 보려면 3절, 4절 및 5절을 참조하십시오.

2.1.4 설명서

WSDL은 육안으로 읽을 수 있는 설명서의 컨테이너로서 선택적인 wsdl:document 요소를 사용합니다. 요소의 컨텐트는 임의의 텍스트 및 요소입니다(XSD의 "mixed"). 설명서 요소는 모든 WSDL 언어 요소 안에 허용됩니다.

2.2 형식

types 요소는 교환된 메시지와 관련된 데이터 형식 정의를 묶습니다. 상호 운영성 및 플랫폼 중립성을 최대화 하기 위해 WSDL은 정식의 형식 시스템으로서 XSD를 사용하고 이것을 기본적인 형식 시스템으로 처리합니다.

<definitions...>
    <types>
        <xsd:schema.../>*
    </types>
</definitions>

XSD 형식 시스템은 결과 네트워크 형식이 실제 XML인지 또는 결과 XSD 스키마가 특정 네트워크 형식을 확인하는지 여부에 관계 없이 메시지의 형식을 정의하는 데 사용될 수 있습니다. 특히, 동일한 메시지에 대해 다중 바인딩이 있거나 하나의 바인딩만 존재하지만 해당 바인딩 형식이 널리 사용되는 형식 시스템을 가지지 않는 경우에 유용합니다. 이러한 경우, XSD를 사용하여 추상 형식을 인코딩하기 위한 바람직한 접근 방법은 다음과 같습니다.

  • 특성이 아닌 요소 폼을 사용합니다.

  • 네트워크 인코딩에 고유한 특성이나 요소를 포함하지 않습니다(즉, 메시지의 추상 컨텐트와 무관함). soap:root, soap:encodingStyle, xmi:id, xmi:name 등이 이에 해당하는 예입니다.

  • 배열 형식을 모델링하려면 결과 폼이 SOAP v1.1 문서의 5절에 지정된 인코딩을 실제 사용하는지 여부와 관계 없이, Soap:Array 형식을 사용합니다. 배열 형식에 대해 ArrayOfXXX 이름을 사용합니다(여기서 XXX는 배열에서 항목의 형식임).

  • xsd:anyType 형식을 사용하여 모든 형식을 가질 수 있는 필드/매개 변수를 표현합니다.

하지만 현재의 추상적인 형식을 포함하여 앞으로 사용하게 될 모든 추상적인 형식을 설명하는 데 사용할 단일 형식의 시스템 문법을 기대하기 어렵기 때문에, WSDL은 형식 시스템이 확장성 요소를 통해 추가될 수 있도록 합니다. 확장성 요소는 types 요소 아래 나타나며 사용되는 형식 정의 시스템을 식별하고 형식 정의에 대해 XML 컨테이너 요소를 제공합니다. 이 요소의 역할은 XML 스키마 언어의 schema 요소의 역할과 비교할 수 있습니다.

<definitions...>
    <types>
        <-- type-system extensibility element --> *
    </types>
</definitions>

2.3 메시지

메시지는 하나 이상의 논리적인 parts로 구성되어 있습니다. 각 부분은 메시지 형식 특성을 사용하는 특정 형식 시스템의 형식과 연관되어 있습니다. 메시지 형식의 특성 집합은 확장할 수 있습니다. WSDL은 XSD에 사용되는 몇몇 메시지 형식의 특성을 정의합니다.

  • element. QName을 사용하는 XSD 요소를 참조합니다.

  • type. QName을 사용하는 XSD simpleType 또는 complexType을 참조합니다.

WSDL의 이름 공간과는 다른 이름 공간을 사용하면 다른 메시지 형식 특성이 정의될 수도 있습니다. 확장성 요소 바인딩에도 메시지 형식 특성이 사용됩니다.

메시지를 정의하는 구문은 다음과 같습니다. 사용된 형식 시스템에 따라 다양한 메시지 형식 특성은 굵게 표시되어 있습니다.

<definitions...>
    <message name="nmtoken"> *
        <part name="nmtoken" element="qname" type="qname"/> *
    </message>
</definitions>

메시지 name 특성은 해당 WSDL 문서에 정의된 모든 message 간에 고유한 이름을 제공합니다.

부분 name 특성은 해당 메시지의 모든 부분 간에 고유한 이름을 제공합니다.

2.3.1 메시지 부분

part는 message의 논리적인 추상 컨텐트를 설명하는 융통성 있는 메커니즘입니다. 바인딩은 부분에 관한 바인딩별 정보를 지정하기 위해 부분의 이름을 참조할 수 있습니다. 예를 들어, RPC를 사용하기 위해 메시지를 정의하는 경우, 부분은 메시지에 매개 변수를 나타낼 수도 있습니다. 하지만 부분의 실제 의미를 결정하기 위해서는 반드시 바인딩을 점검해야 합니다.

다중 부분 요소는 메시지에 여러 개의 논리적 단위가 있는 경우에 사용됩니다. 예를 들어, 다음 메시지는 주문서와 고객으로 구성되어 있습니다.

<definitions .... >
    <types>
        <schema .... >
           <element name="PO" type="tns:POType"/>
           <complexType name="POType">
               <all>
                   <element name="id" type="string/>
                   <element name="name" type="string"/>
                   <element name="items">
                       <complexType>
                           <all>
                               <element name="item" type="tns:Item" minOccurs="0"                 maxOccurs="unbounded"/>
                           </all>
                       </complexType>
                   </element>
              </all>
           </complexType>
 
           <complexType name="Item">
               <all>
                   <element name="quantity" type="int"/>
                   <element name="product" type="string"/>
               </all>
           </complexType>
           <element name="Invoice" type="tns:InvoiceType"/>
           <complexType name="InvoiceType">
               <all>
                   <element name="id" type="string"/>
               </all>
           </complexType>
        </schema>
    </types>
 
    <message name="PO">
        <part name="po" element="tns:PO"/>
        <part name="invoice" element="tns:Invoice"/>
    </message>
</definitions>

하지만, 메시지 컨텐트가 너무 복잡한 경우에는 대체 구문을 사용하여 형식 시스템을 직접 사용하는 복합 메시지 구조를 지정할 수 있습니다. 다음 예제에서, 본문은 주문서 또는 고객 집합이 될 수 있습니다.

<definitions .... >
    <types>
        <schema .... >
           <complexType name="POType">
               <all>
                   <element name="id" type="string/>
                   <element name="name" type="string"/>
                   <element name="items">
                       <complexType>
                           <all>
                               <element name="item" type="tns:Item" minOccurs="0"                 maxOccurs="unbounded"/>
                           </all>                  
                       </complexType>
                   </element>
               </all>
           </complexType>
 
           <complexType name="Item">
               <all>
                   <element name="quantity" type="int"/>
                   <element name="product" type="string"/>
               </all>
           </complexType>
           <complexType name="InvoiceType">
               <all>
                   <element name="id" type="string"/>
               </all>
           </complexType>
 
           <complexType name="Composite">
               <choice>
                   <element name="PO" minOccurs="1" maxOccurs="1" type="tns:POType"/>
                   <element name="Invoice" minOccurs="0" maxOccurs="unbounded"                         type="tns:InvoiceType"/>
               </choice>
           </complexType>
        </schema>
    </types>
 
    <message name="PO">
        <part name="composite" type="tns:Composite"/>
    </message>
</definitions>

2.3.2 추상적인 메시지와 구체적인 메시지

메시지 정의는 항상 메시지 컨텐트의 추상 정의로 간주합니다. 메시지 바인딩은 추상 컨텐트가 구체적인 서식에 매핑되는 방법을 설명합니다. 경우에 따라, 추상 정의가 구체적인 표현과 매우 흡사하거나 하나 이상의 바인딩과 정확히 일치하기도 합니다. 따라서 이러한 바인딩은 매핑 정보를 거의 제공하지 않습니다. 하지만 동일한 메시지 정의의 다른 바인딩은 확장 가능한 매핑 정보가 필요하기도 합니다. 따라서 바인딩을 점검해야 메시지가 실제로 "추상화되는 방법"을 결정할 수 있습니다.

2.4 포트 형식

포트 형식은 추상 작업 및 포함된 추상 메시지의 명명된 집합입니다.

<wsdl:definitions...>
    <wsdl:portType name="nmtoken">
        <wsdl:operation name="nmtoken".../> *
    </wsdl:portType>
</wsdl:definitions>

포트 형식의 name 특성은 해당 WSDL 문서에 정의된 모든 포트 형식에 고유한 이름을 제공합니다.

작업은 name 특성을 통해 명명됩니다.

WSDL에는 종점에서 지원할 수 있는 네 가지 전송 방식이 있습니다.

  • 단방향. 종점이 메시지를 받습니다.

  • 요청 - 응답. 종점이 메시지를 받고 관련된 메시지를 보냅니다.

  • 검색 - 응답. 종점이 메시지를 보내고 관련된 메시지를 받습니다.

  • 알림. 종점이 메시지를 보냅니다.

WSDL은 이러한 전송 방식을 operations로 참조합니다. 요청/응답 또는 검색/응답 작업이 두 개의 단방향 메시지를 사용하여 추상적으로 모델링되더라도, 이 작업을 근본적인 작업의 형식으로서 모델링하는 것이 유용하며 그 이유는 다음과 같습니다.

  • 요청/응답 또는 검색/응답 작업은 일반적입니다.

  • 더 복잡한 이동 정보를 도입하지 않고도 순서가 상호 연관될 수 있습니다.

  • 몇몇 종점은 메시지가 동기화된 요청/응답 작업의 결과일 경우에만 메시지를 받을 수 있습니다.

  • 단순한 흐름은 흐름 정의가 필요한 시점에 이러한 방식으로부터 알고리즘적으로 파생될 수 있습니다.

요청/응답 또는 검색/응답이 WSDL 문서에 논리적으로 상호 연관되어 있어도, 지정된 바인딩은 구체적인 상호 관련 정보를 설명합니다. 예를 들어, 요청 및 응답 메시지는 하나 또는 두 개의 실제 네트워크 통신의 부분으로 교환될 수도 있습니다.

기본 WSDL 구조가 4가지 전송 방식의 바인딩을 지원하지만 WSDL은 단방향과 요청-응답 방식의 바인딩만 정의합니다. 검색-응답 또는 알림용 프로토콜을 정의하는 규격이 이러한 방식을 사용할 수 있는 WSDL 바인딩 확장도 포함할 것으로 기대하고 있습니다.

작업은 QName 형식의 message 특성을 사용하여 포함된 메시지를 참조합니다. 이 특성은 WSDL에 의해 정의된 연결 규칙을 따릅니다(2.1.1절 참조).

2.4.1 단방향 작업

단방향 작업의 문법은 다음과 같습니다.

<wsdl:definitions...> <wsdl:portType...> *
        <wsdl:operation name="nmtoken">
           <wsdl:input name="nmtoken" message="qname"/>
        </wsdl:operation>
    </wsdl:portType >
</wsdl:definitions>

input 요소는 단방향 작업에 대한 추상적인 메시지 형식을 지정합니다.

2.4.2 요청-응답 작업

요청-응답 작업의 문법은 다음과 같습니다.

<wsdl:definitions...>
    <wsdl:portType...> *
        <wsdl:operation name="nmtoken" parameterOrder="nmtokens">
           <wsdl:input name="nmtoken" message="qname"/>
           <wsdl:output name="nmtoken" message="qname"/>
           <wsdl:fault name="nmtoken" message="qname"/>*
        </wsdl:operation>
    </wsdl:portType >
</wsdl:definitions>

input 및 output 요소는 각각 요청과 응답에 대한 추상적인 메시지 형식을 지정합니다. 선택적인 fault 요소는 프로토콜에 한정된 메시지뿐만 아니라 작업의 결과로서 출력되는 모든 오류 메시지에 대한 추상적인 메시지 형식을 지정합니다.

요청-응답 작업은 추상 개념입니다. 특정 바인딩은 HTTP 요청/응답과 같은 단일 통신 내에서 또는 HTTP 요청과 같은 두 개의 독립적인 통신으로서의 메시지를 실제로 보내는 방법을 결정하는 데 사용됩니다.

2.4.3 검색-응답 작업

검색-응답 작업의 문법은 다음과 같습니다.

<wsdl:definitions...>
    <wsdl:portType...> *
        <wsdl:operation name="nmtoken" parameterOrder="nmtokens">
           <wsdl:output name="nmtoken" message="qname"/>
           <wsdl:input name="nmtoken" message="qname"/>
           <wsdl:fault name="nmtoken" message="qname"/>*
        </wsdl:operation>
    </wsdl:portType >
</wsdl:definitions>

output 및 input 요소는 각각 검색된 요청 메시지와 응답 메시지에 대해 추상적인 메시지 형식을 지정합니다. 선택적인 fault 요소는 프로토콜에 한정된 메시지뿐만 아니라 작업의 결과로서 출력되는 모든 오류 메시지에 추상적인 메시지 형식을 지정합니다.

요청-응답 작업은 추상 개념입니다. 특정 바인딩은 HTTP 요청/응답과 같은 단일 통신 내에서 또는 HTTP 요청과 같은 두 개의 독립적인 통신으로서의 메시지를 실제로 보내는 방법을 결정하는 데 사용됩니다.

2.4.4 알림 작업

단방향 작업의 문법은 다음과 같습니다.

<wsdl:definitions...>
    <wsdl:portType...> *
        <wsdl:operation name="nmtoken">
           <wsdl:output name="nmtoken" message="qname"/>
        </wsdl:operation>
    </wsdl:portType >
</wsdl:definitions>

output 요소는 알림 작업에 추상적인 메시지 형식을 지정합니다.

2.4.5 작업 내 요소의 이름

input 및 output 요소의 name 특성은 이를 포함하는 포트 형식 내에서 모든 input 및 output 요소 간에 고유한 이름을 제공합니다.

작업 중 각 input 및 output 요소의 이름을 지정할 필요가 없도록 하기 위해 WSDL이 작업 이름을 기반으로 하는 몇몇 기본값을 제공합니다. name 특성이 단방향 또는 알림 메시지에 지정되지 않은 경우 기본값은 작업 이름이 됩니다. name 특성이 요청-응답 또는 검색-응답 작업의 input 또는 output 메시지에 지정되지 않은 경우, "Request"/"Solicit" 또는 "Response"가 각각 추가된 작업 이름이 기본값이 됩니다.

각 fault 요소는 바인딩이 fault 메시지의 구체적인 서식을 지정하도록 명명되어야 합니다. fault 요소의 이름은 작업에 대해 정의된 fault의 집합 내에서 고유합니다.

2.4.6 작업 내 매개 변수 순서

작업은 RPC 방식의 바인딩과 함께 사용될지의 여부를 지정하지 않습니다. 하지만 작업과 RPC 바인딩을 함께 사용하는 경우에는 원래 RPC 함수의 서명을 캡처하는 것이 유용합니다. 따라서 요청-응답 또는 검색-응답 작업은 nmtokens 형식의 parameterOrder 특성을 통해 매개 변수 이름 목록을 지정할 수도 있습니다. 특성 값은 단일 공백으로 분리된 메시지 부분의 이름 목록입니다. 명명된 부분은 다음 규칙을 반드시 준수해야 합니다.

  • 부분의 순서는 RPC 서명에서 매개 변수의 순서를 반영하도록 명명됩니다.

  • return 값 부분은 목록에 없습니다.

  • 부분 이름이 input 메시지와 output 메시지에 모두 나타나면 in/out 매개 변수입니다.

  • 부분 이름이 input 메시지에만 나타나면 in 매개 변수입니다.

  • 부분 이름이 output 메시지에만 나타나면 out 매개 변수입니다.

    이 정보는 "참고"로 제공되는 것이므로 RPC 서명과는 관계 없는 경우에는 무시해도 됩니다. 또한 작업이 RPC 방식 바인딩과 함께 사용되는 경우에도 이 정보 제공이 필요하지 않습니다.

2.5 바인딩

바인딩은 특정 portType에 의해 정의된 작업 및 메시지에 대해 메시지 형식 및 프로토콜 정보를 정의합니다. 지정된 portType에 대한 바인딩 수는 제한이 없습니다. 바인딩의 문법은 다음과 같습니다.

<wsdl:definitions...>
    <wsdl:binding name="nmtoken" type="qname"> *
        <-- extensibility element (1) --> *
        <wsdl:operation name="nmtoken"> *
           <-- extensibility element (2) --> *
           <wsdl:input name="nmtoken"> 
               <-- extensibility element (3) --> 
           </wsdl:input>
           <wsdl:output name="nmtoken"> 
               <-- extensibility element (4) --> *
           </wsdl:output>
           <wsdl:fault name="nmtoken"> *
               <-- extensibility element (5) --> *
           </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
</wsdl:definitions>

name 특성은 이를 포함하는 WSDL 문서에 정의된 모든 바인딩에 고유한 이름을 제공합니다.

바인딩은 type 특성을 사용하여 바인드하는 portType을 참조합니다. 이 QName 값은 WSDL에 의해 정의된 연결 규칙을 따릅니다(2.1.1절 참조).

바인딩의 operation, input, output 및 fault 요소는 portType 내에서 정확히 작동하는 각 요소의 name 특성을 사용하는 해당 portType 요소와 상호 연관되어 있습니다(2.4.5절 참조).

바인딩 확장성 요소는 input (3), output (4) 및 fault 메시지 (5)에 대해 구체적인 문법을 지정하는 데 사용됩니다. 바인딩 단위 정보 (1)뿐만 아니라, 작업 단위 바인딩 정보 (2)도 지정됩니다.

바인딩 내의 작업은 바인딩의 portType 내에서 같은 이름을 가진 작업에 대한 바인딩 정보를 지정합니다. 예를 들어, 메서드 이름을 오버로드하는 경우처럼 작업 이름은 고유할 필요가 없기 때문에 작업 바인딩 요소의 이름 특성만으로 작업을 고유하게 식별하지 못할 수 있습니다. 이러한 경우에는 해당 wsdl:input과 wsdl:output 요소의 name 특성을 제공하여 올바른 작업을 식별하도록 해야 합니다.

한개의 바인딩은 한개의 프로토콜만 지정해야 합니다.

바인딩은 주소 정보를 지정하지 않을 수도 있습니다.

2.6 포트

포트는 바인딩에 대해 단일 주소를 지정하여 개별적인 종점을 정의합니다.

<wsdl:definitions...>
    <wsdl:service...> *
        <wsdl:port name="nmtoken" binding="qname"> *
           <-- extensibility element (1) -->
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

name 특성은 이를 포함하는 WSDL 문서에 정의된 모든 포트에 고유한 이름을 제공합니다.

QName 형식의 binding 특성은 WSDL에 의해 정의된 연결 규칙을 사용하는 바인딩을 참조합니다(2.1.1절 참조).

바인딩 확장성 요소 (1)는 포트에 대해 주소 정보를 지정하는 데 사용됩니다.

한개의 포트는 두개 이상의 주소를 지정하지 않을 수도 있습니다.

포트는 주소 정보가 아닌 바인딩 정보를 전혀 지정하지 않을 수도 있습니다.

2.7 서비스

서비스는 관련된 포트의 집합을 그룹화합니다.

<wsdl:definitions...>
    <wsdl:service name="nmtoken"> *
        <wsdl:port.../>*
    </wsdl:service>
</wsdl:definitions>

name 특성은 이를 포함하는 WSDL 문서에 정의된 모든 서비스에 고유 이름을 제공합니다.

서비스 내의 포트는 다음과 같은 관계를 가지고 있습니다.

  • 포트 간에 서로 통신하지 않습니다(예: 한 포트의 output은 다른 포트의 input이 될 수 없습니다).

  • 별도의 바인딩 및 주소를 사용하면서도 한개의 서비스에 포트 형식을 공유하는 여러 개의 포트가 있는 경우 포트는 대체 요소가 됩니다. 각 포트는 기능적으로 동등한 동작을 제공합니다(전송 및 메시지 형식은 각 바인딩에 의해 제한됨). 이 기능으로 WSDL 사용자는 프로토콜, 거리 등과 같은 몇몇 조건을 기반으로 하여 통신할 수 있는 특정 포트를 선택할 수 있습니다.

  • 이 포트를 확인하여 서비스의 포트의 형식을 결정할 수 있습니다. 이렇게 하면 WSDL 문서의 고객은 이 문서가 여러 개의 포트를 지원하는지의 여부에 따라 특정 서비스와 통신할지를 결정할 수 있습니다. 이 기능은 포트 형식의 작업간에 몇몇 묵시적인 관계가 있는 경우에 유용하며, 특정 작업을 수행하기 위해서는 포트 형식의 전체 집합이 반드시 표시되어야 합니다.

3. SOAP 바인딩

WSDL은 다음과 같은 프로토콜별 정보의 규격을 지원하는 SOAP 1.1 종점에 대한 바인딩을 포함합니다.

  • 바인딩과 SOAP 1.1 프로토콜과의 바운드 표시.

  • SOAP 종점에 대한 주소 지정 방법.

  • SOAP의 HTTP 바인딩에 대한 SOAPAction HTTP 헤더의 URI.

  • SOAP Envelope의 일부로서 전송되는 헤더의 정의 목록.

  • XSD의 SOAP 루트 지정 방법.

SOAP 바인딩의 집합은 진화하기 때문에 이 바인딩 문법은 아주 확실한 규격은 아닙니다. 추가 SOAP 바인딩은 반드시 이 문법의 개념에서 파생됩니다. 예를 들면 다음과 같습니다.

  • URI 주소 지정 스키마를 사용하지 않는 SOAP 바인딩은 3.8절에 정의된 soap:address 요소를 재배치하여 다른 주소 지정 스키마를 대체 사용합니다.

  • SOAPAction이 필요 없는 SOAP 바인딩은 3.4절에 정의된 soapAction 특성을 생략합니다.

3.1 SOAP 예제

다음 예제에서 SubscribeToQuotes SOAP 1.1 단방향 메시지는 SMTP 바인딩을 통해 StockQuote 서비스로 전달됩니다. 요청은 문자열 형식의 증권 시세 표시기 기호를 입력으로 받고, 대체 URI를 정의하는 헤더를 포함합니다.

예제 3. SOAP 헤더를   사용하는 SMTP 에서의   단방향   작업의 SOAP 바인딩

<?xml version="1.0"?>
<definitions name="StockQuote"
          targetNamespace="http://example.com/stockquote.wsdl"
          xmlns:tns="http://example.com/stockquote.wsdl"
          xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
          xmlns:xsd1="http://example.com/stockquote.xsd"
          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns="http://schemas.xmlsoap.org/wsdl/">
 
    <message name="GetTradePriceInput">
        <part name="tickerSymbol" element="xsd:string"/>
        <part name="time" element="xsd:timeInstant"/>
    </message>
 
    <message name="GetTradePriceOutput">
        <part name="result" type="xsd:float"/>
    </message>
 
    <portType name="StockQuotePortType">
        <operation name="GetTradePrice">
           <input message="tns:GetTradePriceInput"/>
           <output message="tns:GetTradePriceOutput"/>
        </operation>
    </portType>
 
    <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GetTradePrice">
           <soap:operation soapAction="http://example.com/GetTradePrice"/>
           <input>
               <soap:body use="encoded" namespace="http://example.com/stockquote"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </input>
           <output>
               <soap:body use="encoded" namespace="http://example.com/stockquote"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </output>
        </operation>>
    </binding>
 
    <service name="StockQuoteService">
        <documentation>My first service</documentation>
        <port name="StockQuotePort" binding="tns:StockQuoteBinding">
           <soap:address location="http://example.com/stockquote"/>
        </port>
    </service>
</definitions>

이 예제는 GetLastTradePrice SOAP 1.1 요청이 SOAP 1.1 HTTP 바인딩을 통해 StockQuote 서비스로 전달될 수도 있음을 설명합니다. 이 요청은 문자열 형식의 주식 시세 표시기 기호 즉, timeInstant 형식의 time을 입력 받아 SOAP 응답에서 부동 소수점 형식으로 된 가격을 반환합니다.

예제 4. HTTP 에서의   요청 - 응답 RPC 작업의 SOAP 바인딩

<?xml version="1.0"?>
<definitions name="StockQuote" 
targetNamespace="http://example.com/stockquote.wsdl"
          xmlns:tns="http://example.com/stockquote.wsdl"
          xmlns:xsd1="http://example.com/stockquote.xsd"
          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns="http://schemas.xmlsoap.org/wsdl/">
    <message name="GetLastTradePriceRequest">
        <part name="tickerSymbol" element="xsd:string"/>
        <part name="time" element="xsd:timeInstant"/>
    </message>
    <message name="GetLastTradePriceResponse">
        <part name="result" type="xsd:float"/>
    </message>
    <portType name="StockQuotePortType">
        <operation name="GetLastTradePrice">
           <input message="tns:GetLastTradePriceRequest"/>
           <output message="tns:GetLastTradePriceResponse"/>
        </operation>
    </portType>
    <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GetLastTradePrice">
           <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
           <input>
               <soap:body use="encoded" namespace="http://example.com/stockquote"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </input>
           <output>
               <soap:body use="encoded" namespace="http://example.com/stockquote"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </output>
        </operation>>
    </binding>
    <service name="StockQuoteService">
        <documentation>첫 번째 서비스</documentation> 
        <port name="StockQuotePort" binding="tns:StockQuoteBinding">
           <soap:address location="http://example.com/stockquote"/>
        </port>
    </service>
</definitions>

이 예제에서는 SOAP 1.1 HTTP 바인딩을 통해 StockQuote 서비스로 GetTradePrices SOAP 1.1 요청을 전송할 수 있음을 설명합니다. 요청은 시작과 종료 시간이 포함된 TimePeriod 구조를 정의한 응용 프로그램인 주식 시세 기호 문자열의 입력을 받아 해당 기간 내에 서비스가 기록한 주식 시세 배열뿐만 아니라 SOAP 응답으로 기록된 주기를 반환합니다. 이 서비스에 대응하는 RPC 서명은 매개 변수 tickerSymbol 및 timePeriod와 함께 출력 매개 변수 주기를 가지며 부동 소수점 배열을 반환합니다.

예제 5. HTTP 에서의   요청 - 응답 RPC 작업의 SOAP 바인딩

<?xml version="1.0"?>
<definitions name="StockQuote"
 
targetNamespace="http://example.com/stockquote.wsdl"
          xmlns:tns="http://example.com/stockquote.wsdl"
          xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
          xmlns:xsd1="http://example.com/stockquote/schema"
          xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
          xmlns="http://schemas.xmlsoap.org/wsdl/">
 
    <types>
       <schema targetNamespace="http://example.com/stockquote/schema"
              xmlns="http://www.w3.org/2000/10/XMLSchema">
           <complexType name="TimePeriod">
              <all>
                  <element name="startTime" type="xsd:timeInstant"/>
                  <element name="endTime" type="xsd:timeInstant"/>
              </all>
           </complexType>
           <complexType name="ArrayOfFloat">
              <complexContent>
                  <restriction base="soapenc:Array">
                      <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:float[]"/>
                  </restriction>
              </complexContent>
           </complexType>
       </schema>
    </types>
 
    <message name="GetTradePricesInput">
        <part name="tickerSymbol" element="xsd:string"/>
        <part name="timePeriod" element="xsd1:TimePeriod"/>
    </message>
 
    <message name="GetTradePricesOutput">
        <part name="result" type="xsd1:ArrayOfFloat"/>
        <part name="frequency" type="xsd:float"/>
    </message>
 
    <portType name="StockQuotePortType">
        <operation name="GetLastTradePrice"             parameterOrder="tickerSymbol timePeriod frequency">
           <input message="tns:GetTradePricesInput"/>
           <output message="tns:GetTradePricesOutput"/>
        </operation>
    </portType>
 
    <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GetTradePrices">
           <soap:operation soapAction="http://example.com/GetTradePrices"/>
           <input>
               <soap:body use="encoded" namespace="http://example.com/stockquote"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </input>
           <output>
               <soap:body use="encoded" namespace="http://example.com/stockquote"
                          encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
           </output>
        </operation>>
    </binding>
 
    <service name="StockQuoteService">
        <documentation>My first service</documentation>
        <port name="StockQuotePort" binding="tns:StockQuoteBinding">
           <soap:address location="http://example.com/stockquote"/>
        </port>
    </service>
</definitions>

3.2 SOAP 바인딩이 WSDL을 확장하는 방법

SOAP 바인딩은 다음과 같은 확장성 요소로 WSDL을 확장합니다.

<definitions .... >
    <binding .... >
        <soap:binding style="rpc|document" transport="uri">
        <operation .... >
           <soap:operation soapAction="uri" style="rpc|document">
           <input>
               <soap:body parts="nmtokens" use="literal|encoded"
                          encodingStyle="uri-list" namespace="uri">
               <soap:header message="qname" part="nmtoken" use="literal|encoded"
                            encodingStyle="uri-list" namespace="uri">*
                 <soap:headerfault message="qname" part="nmtoken" use="literal|encoded"
                                   encodingStyle="uri-list" namespace="uri"/>*
               <soap:header>
           </input>
           <output>
               <soap:body parts="nmtokens" use="literal|encoded"
                          encodingStyle="uri-list" namespace="uri">
               <soap:header message="qname" part="nmtoken" use="literal|encoded"
                            encodingStyle="uri-list" namespace="uri">*
                 <soap:headerfault message="qname" part="nmtoken" use="literal|encoded"
                                   encodingStyle="uri-list" namespace="uri"/>*
               <soap:header>
           </output>
           <fault>*
               <soap:fault name="nmtoken" use="literal|encoded"
                           encodingStyle="uri-list" namespace="uri">
            </fault>
        </operation>
    </binding>
 
    <port .... >
        <soap:address location="uri"/> 
    </port>
</definitions>

SOAP 바인딩의 각 확장 요소는 다음 절에 설명하였습니다.

3.3 soap:binding

Envelope, Header 및 Body와 같은 SOAP 바인딩 요소의 목적은 바인딩이 SOAP 프로토콜 서식에 바운드된다는 것을 나타내는 것입니다. 이 요소는 메시지의 인코딩 및 서식에 요청을 만들지 않습니다(예: SOAP 1.1 규격의 5절을 따르는 메시지).

soap:binding 요소는 SOAP 바인딩을 사용할 때 반드시 표시되어야 합니다.

<definitions...>
    <binding...>
        <soap:binding transport="uri" style="rpc|document">
    </binding>
</definitions>

style 특성의 값은 포함된 각 작업에 대한 style 특성의 기본값입니다. style 특성이 생략된 경우 "document"로 간주됩니다. style의 기능에 대한 정보는 3.4절을 참조하십시오.

요청된 transport 특성의 값은 이 바인딩이 SOAP의 어느 전송에 해당하는지를 나타냅니다. URI 값 http://schemas.xmlsoap.org/soap/http는 SOAP 규격에서 HTTP 바인딩에 해당합니다. SMTP, FTP 등과 같은 다른 전송을 나타내기 위해 여기에 다른 URI가 사용되기도 합니다.

3.4 soap:operation

soap:operation 요소는 작업에 대한 전반적인 정보를 제공합니다.

<definitions...>
    <binding...>
        <operation...>
           <soap:operation soapAction="uri" style="rpc|document">
        </operation>
    </binding>

</definitions>style 특성은 작업이 매개 변수 및 반환값을 포함하는 RPC 지향적인 메시지인지 문서를 포함하는 문서 지향적인 메시지인지를 나타냅니다. 이 정보는 적합한 프로그래밍 모델을 선택하는 데 사용됩니다. 특성이 지정되지 않은 경우 soap:binding 요소에 지정된 값이 기본값이 됩니다. soap:binding 요소가 스타일을 지정하지 않은 경우에는 "document"로 간주됩니다.

soapAction 특성은 이 작업에 대한 SOAPAction 헤더의 값을 지정합니다. 이 URI 값은 SOAPAction 헤더에 대한 값으로 직접 사용되어야 하며 요청 시 상대적인 URI 값을 절대값으로 만들 수 없습니다. SOAP의 HTTP 프로토콜 바인딩인 경우에는 이 값이 필요하며 기본값이 없습니다. 다른 SOAP 프로토콜 바인딩의 경우 이 값은 지정되지 않을 수도 있고 soap:operation 요소가 생략될 수도 있습니다.

3.5 soap:body

soap:body 요소는 SOAP Body 요소에서 메시지 부분이 나타나는 방법을 지정합니다.

메시지의 부분은 추상적인 형식 정의 또는 구체적인 스키마 정의가 될 수 있습니다. 추상 정의인 경우, 인코딩 스타일에 의해 정의된 일부 규칙 집합에 따라 형식에 순서가 정해집니다. 각 인코딩 스타일은 SOAP 규격에 정의된 바와 같이 URI 목록을 사용하여 식별됩니다. SOAP 인코딩(http://schemas.xmlsoap.org/soap/encoding/)과 같은 일부 인코딩 스타일은 지정된 추상적인 형식 집합에 대한 메시지 형식의 변형을 허용하기 때문에, 모든 변형된 형식을 이해하는 것은 메시지를 읽는 사람의 몫입니다. 즉, 읽는쪽이 올바르게 읽어야 합니다. 모든 변형을 지원할 필요가 없도록 하려면 메시지가 구체적으로 정의된 다음, 참고로서 원래 인코딩 스타일(있는 경우)임을 나타내야 합니다. 이 경우 메시지 작성자는 지정된 스키마를 정확하게 준수해야 합니다. 즉, 쓰는쪽이 올바르게 써야 합니다.

soap:body 바인딩 요소는 SOAP 메시지의 Body 요소 내에 있는 메시지 부분을 조합하는 방법에 대한 정보를 제공합니다. soap:body 요소는 RPC 지향적 메시지와 문서 지향적 메시지에 사용되지만 enclosing 작업의 스타일은 Body 구역을 구성하는 방법에 중요한 영향을 미칩니다.

  • 작업 스타일이 rpc인 경우 각 부분은 매개 변수 또는 반환 값이며 body에 있는 wrapper 요소에 나타납니다(SOAP 규격의 7.1절 참조). wrapper 요소는 작업 이름과 동일한 이름을 가지며 이름 공간은 이름 공간 속성의 값입니다. 각 메시지 부분(매개 변수)은 래퍼 아래 나타나며 호출에 대응하는 매개 변수와 동일한 이름의 accessor로 표현됩니다. 여기서 각 부분은 호출의 매개 변수와 같은 순서로 배열됩니다.

  • 작업 스타일이 문서인 경우 추가 래퍼는 없으며 메시지 부분은 SOAP Body 요소 바로 아래 나타납니다.

Body와 매개 변수 accessor 요소의 컨텐트를 정의하는 데 동일한 메커니즘을 사용합니다.

<definitions...>
    <binding...>
        <operation...>
           <input>
               <soap:body parts="nmtokens" use="literal|encoded"
                          encodingStyle="uri-list" namespace="uri">
           </input>
           <output>
               <soap:body parts="nmtokens" use="literal|encoded"
                          encodingStyle="uri-list" namespace="uri">
           </output>
        </operation>
    </binding>
</definitions>

nmtokens 형식의 선택적인 parts 특성은 어느 부분이 메시지의 SOAP Body 내에서 어디에 나타나는지를 표시합니다. 메시지의 다른 부분은 SOAP가 multipart/related MIME 바인딩과 함께 사용될 때와 같이 다른 메시지 영역에 나타날 수 있습니다. parts 특성이 생략되면 메시지에서 정의한 모든 부분이 SOAP Body 영역에 포함된 것으로 간주됩니다.

요청된 use 특성은 몇몇 인코딩 규칙을 사용하여 메시지 부분이 인코드되는지의 여부 또는 부분이 메시지의 구체적인 스키마를 정의했는지의 여부를 나타냅니다.

use가 encoded인 경우에는 각 메시지 부분은 type 특성을 사용하여 추상적인 형식을 참조합니다. 이러한 추상적인 형식은 encodingStyle특성으로 지정된 인코딩을 적용하여 구체적인 메시지를 작성하는 데 사용됩니다. namespace 특성이 추상적인 형식에 의해 명시적으로 정의되지 않은 컨텐트에만 적용되는 경우에도, namestypes 부분 및 namespace 특성의 값은 모두 인코딩의 입력이 됩니다. 참조된 인코딩 스타일이 SOAP 인코딩과 마찬가지로 인코딩 스타일의 변형을 허용하면 모든 변형이 지원되어야 합니다. 즉, 읽는쪽이 올바르게 읽어야 합니다.

use가 literal인 경우에 각 부분은 간단한 부분에 대해서는 element 특성을 사용하거나 복잡한 부분에 대해서는 type 특성을 사용해서 구체적인 스키마를 참조합니다(2.3.1절 참고). encodingStyle 특성의 값은 구체적인 서식이 SOAP 인코딩과 같은 특정 인코딩을 사용하여 파생된 것이지만 지정된 변형만 지원한다는 것을 나타냅니다. 즉, 쓰는쪽이 올바르게 써야 합니다.

encodingStyle 특성의 값은 각각이 단일 공백으로 분리된 URI 목록입니다. URI는 메시지 내에서 사용되는 인코딩을 제한 사항이 가장 많은 것에서 가장 적은 것의 순서로 표시합니다(SOAP 규격에 정의된 encodingStyle 특성과 동일함).

3.6 soap:fault

soap:fault 요소는 SOAP Fault Details 요소의 컨텐트를 지정합니다. 이 요소는 soap:body 요소 뒤에 패턴화됩니다(3.5절 참조).

<definitions...>
    <binding...>
        <operation...>
           <fault>*
               <soap:fault name="nmtoken" use="literal|encoded"
                                 encodingStyle="uri-list" namespace="uri">
           </fault>
        </operation>
    </binding>
</definitions>

name 특성은 soap:fault를 작업에 대해 정의된 wsdl:fault에 연결합니다.

fault 메시지는 단일 부분을 가져야 합니다. useencodingStyle 및 namespace 특성은 모두 soap:body와 동일한 방법으로 사용됩니다(3.5절 참조).

3.7 soap:header

soap:header 요소는 header가 SOAP Envelope의 Header 요소 내에서 전송되도록 정의할 수 있습니다. 이 구역에 모든 헤더를 나열할 필요는 없습니다. WSDL 문서의 다른 규격에 의해 헤더가 실제 페이로드에 추가되도록 하는 것이 일반적이기 때문에 여기에 모든 헤더를 나열할 필요가 없습니다.

<definitions .... >
    <binding .... >
        <operation .... >
           <input>
               <soap:body parts="nmtokens" use="literal|encoded"
                          encodingStyle="uri-list" namespace="uri">
           </input>
           <output>
               <soap:body parts="nmtokens" use="literal|encoded"
                          encodingStyle="uri-list" namespace="uri">
           </output>
        </operation>
    </binding>
</definitions>

useencodingStyle 및 namespace 특성은 모두 soap:body(3.5절 참조)와 같은 방식으로 사용되며 헤더에 매개 변수가 포함되지 않기 때문에 only style="document"인 것으로 가정합니다

Qname 형식의 message 특성과 nmtoken 형식의 part 특성은 헤더 형식을 정의하는 메시지 부분을 참조합니다. 부분 MAY가 참조하는 스키마는 use="literal"일 경우 soap:actor와 soap:mustUnderstand 특성의 정의를 포함하지만 use="encoded"일 경우에는 포함해서는 안됩니다. 참조된 메시지는 SOAP Body를 정의하는 메시지와 같지 않아도 됩니다.

soap:header 내에 나타나고 soap:header와 같은 구문을 갖는 선택적인 headerfault 요소를 사용하면 soap:header에서 정의하는 헤더에 속하는 오류 정보를 전송하는 데 사용된 헤더 형식 규격이 허용됩니다. SOAP 규격은 헤더에 속하는 오류가 헤더로 반환되어야 한다고 규정하며 이러한 메커니즘을 사용하면 이와 같은 헤더 형식 규격이 허용됩니다.

3.8 soap:address

SOAP 주소 바인딩은 포트에 주소(URI)를 지정하는 데 사용됩니다. SOAP 바인딩을 사용하는 포트는 반드시 하나의 주소만 지정해야 합니다.

<definitions...>
    <port...>
        <binding...>
           <soap:address location="uri"/> 
        </binding>
    </port>
</definitions>

4. HTTP GET 및 POST 바인딩

WSDL은 웹 브라우저와 웹 사이트 간의 상호 작용을 설명하기 위해 HTTP 1.1의 GET 및 POST 동사에 대한 바인딩을 포함합니다. 이 기능은 웹 브라우저가 아닌 응용 프로그램이 사이트와 상호 작용하도록 합니다. 다음과 같은 프로토콜별 정보를 지정할 수 있습니다.

  • HTTP GET 또는 POST를 사용하는 바인딩 표시

  • 포트에 대한 주소

  • 각 작업에 대한 상대 주소(포트에서 정의한 기본 주소에 상대적임)

4.1 HTTP GET/POST 예제

다음 예제는 지정된 포트 형식에 대해 다르게 바운드된 세 개의 포트를 보여 줍니다.

전달된 값이 part1=1, part2=2, part3=3인 경우, 각 포트에 대한 요청 형식은 다음과 같습니다.

port1: GET, URL="http://example.com/o1/A1B2/3"
port2: GET, URL="http://example.com/o1 p1=1&p2=2&p3=3
port3: POST, URL="http://example.com/o1", PAYLOAD="p1=1&p2=2&p3=3"

각 포트에 대한 응답은 GIF 또는 JPEG 이미지가 됩니다.

예제 5. GIF 또는 JPG    반환하는 GET  FORM POST

<definitions...>
    <message name="m1">
        <part name="part1" type="xsd:string"/>
        <part name="part2" type="xsd:int"/>
        <part name="part3" type="xsd:string"/>
    </message>
    <message name="m2">
        <part name="image" type="xsd:binary"/>
    </message>
    <portType name="pt1">
        <operation name="o1">
           <input message="tns:m1"/>
           <output message="tns:m2"/>
        </operation>
    </portType>
    <service name="service1">
        <port name="port1" binding="tns:b1">
           <http:address location="http://example.com/"/>
        </port>
        <port name="port2" binding="tns:b1">
           <http:address location="http://example.com/"/>
        </port>
        <port name="port3" binding="tns:b1">
             <http:address location="http://example.com/"/>
        </port>
    </service>
    <binding name="b1" type="pt1">
        <http:binding verb="GET"/>
        <operation name="o1">
           <http:operation location="o1/A(part1)B(part2)/(part3)"/>
           <input>
               <http:urlReplacement/>
           </input>
           <output>
               <mime:content type="image/gif"/>
               <mime:content type="image/jpeg"/>
           </output>
        </operation>
    </binding>
    <binding name="b2" type="pt1">
        <http:binding verb="GET"/>
        <operation name="o1">
           <http:operation location="o1"/>
           <input>
               <http:urlEncoded/>
           </input>
           <output>
               <mime:content type="image/gif"/>
               <mime:content type="image/jpeg"/>
           </output>
        </operation>
    </binding>
    <binding name="b3" type="pt1">
        <http:binding verb="POST"/>
        <operation name="o1">
           <http:operation location="o1"/>
           <input>
               <mime:content type="application/x-www-form-urlencoded"/>
           </input>
           <output>
               <mime:content type="image/gif"/>
               <mime:content type="image/jpeg"/>
           </output>
        </operation>
    </binding>
</definitions>

4.2 HTTP GET/POST 바인딩이 WSDL을 확장하는 방법

HTTP GET/POST 바인딩은 다음과 같은 확장 요소를 사용하여 WSDL을 확장합니다.

<definitions...>
    <binding...>
        <http:binding verb="nmtoken"/>
        <operation...>
           <http:operation location="uri"/>
           <input...>
               <-- mime elements -->
           </input>
           <output...>
               <-- mime elements -->
           </output>
        </operation>
    </binding>
    <port...>
        <http:address location="uri"/>
    </port>
</definitions>

이러한 요소는 다음 절에 설명되어 있습니다.

4.3 http:address

location 특성은 포트에 대해 기본 URI를 지정합니다. 이 특성의 값은 http:operation 바인딩 요소의 location 특성의 값과 결합됩니다. 자세한 내용은 4.5절을 참조하십시오.

4.4 http:binding

http:binding 요소는 이 바인딩이 HTTP 프로토콜을 사용한다는 것을 나타냅니다.

<definitions...>
    <binding...>
        <http:binding verb="nmtoken"/>
    </binding>
</definitions>

요청된 verb 특성의 값은 HTTP 동사를 나타냅니다. 일반적인 값은 GET 또는 POST이지만 다른 값이 사용될 수도 있습니다. HTTP 동사는 대소문자를 구별해야 합니다.

4.5 http:operation

location 특성은 작업에 대해 상대 URI를 지정합니다. 이 URI는 http:address 요소에 지정된 URI와 결합하여 HTTP 요청에 대한 전체 URI를 만듭니다. URI 값은 상대 URI여야 합니다.

<definitions...>
    <binding...>
        <operation...>
           <http:operation location="uri"/>
        </operation>
    </binding>
</definitions>

4.6 http:urlEncoded

urlEncoded 요소는 메시지의 모든 부분이 표준 URI 인코딩 규칙(name1=value&name2=value...)을 사용하는 HTTP 요청 URI에 인코드된다는 것을 나타냅니다. 매개 변수의 이름은 메시지 부분의 이름에 해당합니다. 부분에서 제공한 각 값은 이름=값 쌍을 사용하여 인코드됩니다. 이 값은 GET과 함께 사용되어 URL 인코딩을 지정하거나 POST와 함께 사용되어 FORM-POST를 지정하기도 합니다. GET과 함께 사용될 경우 "" 문자는 필요할 때 자동으로 추가됩니다.

<http:urlEncoded/>

URI 인코딩 매개 변수의 규칙에 대한 자세한 내용은 [5], [6] 및 [7]을 참조하십시오.

4.7 http:urlReplacement

http:urlReplacment 요소는 메시지의 모든 부분이 배치 알고리즘을 사용하는 HTTP 요청 URI로 인코드된다는 것을 나타냅니다.

  • http:operation의 상대 URI 값을 검색하여 검색 패턴 집합을 찾습니다.

  • http:operation의 값이 http:address의 location 특성 값과 결합되기 전에 검색이 수행됩니다.

  • 메시지 부분마다 하나의 검색 패턴이 있습니다. 검색 패턴 문자열은 괄호"(" 및 ")"로 둘러 쌓인 메시지 부분의 이름입니다.

  • 일치하는 경우 해당 메시지 부분의 값은 일치된 위치에 있는 내용으로 대치됩니다.

  • 일치 항목을 찾은 후에 값이 바뀌며 바뀐 값은 추가적인 검색 작업을 수행하지 않습니다.

메시지 부분에는 반복되는 값이 없을 수도 있습니다.

<http:urlReplacement/>

5. MIME 바인딩

WSDL은 추상적인 형식을 특정 MIME 형식으로 된 구체적인 메시지에 바인드하는 방법을 가지고 있으며 다음과 같은 MIME 형식에 대한 바인딩이 정의되어 있습니다.

  • multipart/related

  • text/xml

  • application/x-www-form-urlencoded (HTML로 된 폼을 전송하는 데 사용하는 형식)

  • 기타(MIME 형식 문자열 지정)

정의된 MIME 형식의 집합은 계속적으로 크기가 증가하기 때문에, 각 MIME 형식에 대해 XML 문법을 철저하게 정의하는 것이 WSDL의 목표는 아닙니다. 필요한 경우 언제든지 추가적인 MIME 형식에 대한 추가 문법을 정의할 수 있습니다. 컨텐트를 설명하는 데 MIME 형식 문자열을 사용할 수 있다면 아래 정의된 mime 요소를 사용할 수 있습니다.

5.1 MIME 바인딩 예제

예제 7. SOAP  multipart/related 사용

이 예제는 SOAP 1.1 HTTP 바인딩을 통해 GetCompanyInfo SOAP 1.1 요청을 StockQuote 서비스로 보내는 내용을 설명합니다. 요청은 문자열 형식의 증권 시세 표시기 기호를 입력으로 받습니다. 응답에는 MIME 형식 multipart/related로 인코드된 여러 개의 부분이 포함되어 있습니다. 즉, 부동 소수점으로 된 현재 증권 시세 가격이 있는 SOAP Envelope, HTML 형식으로 된 제로 또는 그 이상의 마케팅 자료 및 GIF 또는 JPFG 형식으로 된 선택적인 회사 로고 등이 여기에 해당합니다.

<definitions...>
    <types>
        <schema...> 
           <element name="GetCompanyInfo">
               <complexType>
                   <all>
                       <element name="tickerSymbol " type="string"/>
                   </all>
               </complexType>
           </element>
           <element name="GetCompanyInfoResult">
               <complexType>
                   <all>
                       <element name="result" type="float"/>
                   </all>
               </complexType>
           </element>
           <complexType name="ArrayOfBinary" base="soap:Array">
               <all>
                   <element name="value" type="xsd:binary"/>
               </all>
           </complexType>
        </schema>
    </types>
    <message name="m1">
        <part name="body" element="tns:GetCompanyInfo"/>
    </message>
    <message name="m2">
        <part name="body" element="tns:GetCompanyInfoResult"/>
        <part name="docs" type="xsd:string"/>
        <part name="logo" type="tns:ArrayOfBinary"/>
    </message>
    <portType name="pt1">
        <operation name="GetCompanyInfo">
           <input message="m1"/>
           <output message="m2"/>
        </operation>
    </portType> 
 
    <binding name="b1" type="tns:pt1">
        <operation name="GetCompanyInfo">
           <soap:operation soapAction="http://example.com/GetCompanyInfo"/>
           <input>
               <soap:body use="literal"/>
           </input>
           <output>
               <mime:multipartRelated>
                   <mime:part>
                       <soap:body parts="body" use="literal"/>
                   </mime:part>
                   <mime:part>
                       <mime:content part="docs" type="text/html"/>
                   </mime:part>
                   <mime:part>
                       <mime:content part="logo" type="image/gif"/>
                       <mime:content part="logo" type="image/jpeg"/>
                   </mime:part>
               </mime:multipartRelated>
           </output>
        </operation>
    </binding> 
 
    <service name="CompanyInfoService">
        <port name="CompanyInfoPort"binding="tns:b1">
           <soap:address location="http://example.com/companyinfo"/>
        </port>
    </service>        
</definitions>

5.2 MIME 바인딩이 WSDL을 확장하는 방법

MIME 바인딩은 다음과 같은 확장 요소를 사용하여 WSDL을 확장합니다.

<mime:content part="nmtoken" type="string"/>
<mime:multipartRelated>
    <mime:part> *
        <-- mime element -->
    </mime:part>
</mime:multipartRelated>
<mime:mimeXml part="nmtoken"/>
 
이러한 요소는 다음과 같은 WSDL의 위치에서 사용됩니다.
 
<definitions...>
    <binding...>
        <operation...>
           <input...>
               <-- mime elements -->
           </input>
           <output...>
               <-- mime elements -->
           </output>
        </operation>
    </binding>
</definitions>

MIME 요소는 input 및 output 아래 나타나 MIME 형식을 지정합니다. 여러 개의 MIME 요소가 나타나는 경우 이를 대체 요소로 간주합니다.

5.3 mime:content

모든 MIME 형식에 대해 새 요소를 정의할 필요가 없도록 하기 위해, MIME 형식 문자열 외에 전달할 추가 정보가 없는 경우 mime:content요소를 사용할 수 있습니다.

<mime:content part="nmtoken" type="string"/>

part 특성은 메시지 부분의 이름을 지정하는 데 사용됩니다. 메시지가 단일 부분을 가지고 있는 경우에는 부분의 특성은 선택적입니다. type 특성은 MIME 형식 문자열을 포함합니다. 형식의 값은 슬래시(/) 또는 와일드카드(*)로 구분된 두 영역이 있습니다. type 특성을 지정하지 않으면 모든 MIME 형식을 허용한다는 것을 나타냅니다.

반환 형식이 XML인데 스키마가 미리 알려지지 않은 경우, text/xml을 표시하는 일반적인 mime 요소를 사용할 수 있습니다.

<mime:content type="text/xml"/>

와일드카드(*)는 모든 텍스트 형식과 같이 mime 형식의 패밀리를 지정하는 데 사용됩니다.

<mime:content type="text/*"/>

다음 두 예제는 모든 mime 형식을 지정합니다.

<mime:content type="*/*"/>
<mime:content/>

5.4 mime:multipartRelated

multipart/related MIME 형식은 MIME 형식으로 된 부분의 임의 집합을 MIME 형식 "multipart/related"를 사용하는 하나의 메시지에 집계합니다. mime:multipartRelated 요소는 이런 메시지의 구체적인 형식을 나타냅니다.

<mime:multipartRelated>
    <mime:part> *
        <-- mime element -->
    </mime:part>
</mime:multipartRelated>

mime:part 요소는 multipart/related 메시지의 각 부분을 설명합니다. MIME 요소는 mime:part에 나타나며 해당 부분에 대한 구체적인 MIME 형식을 지정합니다. mime:part 내에 둘 이상의 MIME 요소가 나타나면 이들은 대체 요소입니다.

5.5 soap:body

SOAP 요청과 함께 MIME 바인딩을 사용할 때, MIME 요소로 soap:body 요소를 사용할 수 있습니다. 이것은 컨텐트 형식이 "text/xml"이고, 이를 포함하는 SOAP Envelope가 있음을 나타냅니다.

5.6 mime:mimeXml

SOAP 규격이 아니면서(SOAP Envelope가 없음) 특정 스키마를 가지고 있는 XML 페이로드를 지정하기 위해, mime:mimeXml 요소를 사용하여 구체적인 스키마를 지정할 수 있습니다. part 특성은 루트 XML 요소의 구체적인 스키마를 정의하는 메시지 부분을 참조합니다. part 특성은 메시지가 단일 부분을 가지고 있는 경우에는 생략될 수도 있습니다. 해당 부분은 간단한 부분에 대해서는 element 특성을 사용하고 복잡한 부분에 대해서는 type 특성을 사용하여 구체적인 스키마를 참조합니다(2.3.1절 참조).

<mime:mimeXml part="nmtoken"/>

6. 참조

[2] S. Bradner, "RFC에서 요청 수준을 표시하는 키워드 사용법", RFC 2119 tous.gif, Harvard University, 1997년 3월

[4] T. Berners-Lee, R. Fielding, L. Masinter, "Uniform Resource Identifiers (URI): 일반 구문", RFC 2396, MIT/LCS, U.C. Irvine, Xerox Corporation, 1998년 8월.

[5] http://www.w3.org/TR/html401/interact/forms.html - submit-format tous.gif

[6] http://www.w3.org/TR/html401/appendix/notes.html - ampersands-in-uristous.gif

[7] http://www.w3.org/TR/html401/interact/forms.html - h-17.13.4tous.gif

[8] Simple Object Access Protocol (SOAP) 1.1 "http://www.w3.org/TR/2000/NOTE-SOAP-20000508/"tous.gif

[10] W3C Working Draft "XML 스키마 1부: 구조tous.gif". 현재 처리 중입니다.

[11] W3C Working Draft "XML 스키마 2부: 데이터형식tous.gif". 현재 처리 중입니다.

A 1. URI에 대한 참고

이 절에서는 해당 규격에 직접적인 관련은 없지만 규격을 구현할 때 유용한 배경 정보를 제공합니다.

A 1.1 XML 이름 공간 및 스키마 위치

XML 스키마의 targetNamespace 또는 XML 인스턴스의 xmlns 특성을 해당 스키마의 위치로 잘못 인식하는 경우가 많습니다. 이름 공간은 사실 URI이고 이 URI는 위치를 나타낼 수 있으며 해당 위치에서 스키마를 검색할 수 있기는 하지만 이 스키마만 이름 공간과 연관된 것은 아닙니다. 특정 이름 공간과 연관된 여러 개의 스키마가 있을 수 있고, 특정 처리 컨텍스트에서 어떤 스키마를 사용할지는 XML의 프로세서가 결정합니다. 여기서 WSDL 규격은 유사한 개념의 XML 스키마를 기반으로 하는 <import> 메커니즘을 통해 처리 컨텍스트를 제공합니다.

A 1.2 상대 URI

이 문서를 통해 WSDL 및 XSD 문서에서 정식 URI를 볼 수 있습니다. 정식 URI의 사용은 단순히 참조하는 개념을 보여주는 것입니다. 상대 URI의 사용은 전적으로 허용되며 많은 경우에 그 사용이 보장됩니다. 상대 URI 처리에 관한 내용은 rfc2396를 참조하십시오.

A 1.3 URI 작성

WSDL로 작업할 때 항상 전역적으로 고유한 URI를 작성하는 대신 특정 엔티티에 대한 URI를 작성하여 해당 엔티티 버전(스키마, WSDL 문서 등)을 "의미"하도록 하는 것이 바람직한 경우가 있습니다. 이러한 유형의 동작에 사용하기 위해 예약된 특별한 기본 URI가 있습니다. 기본 URI인 http://tempuri.org/는 어떤 엔티티와도 고유한 연관성이 없는 URI를 구성하는 데 사용될 수 있습니다. 예를 들어, 두 사람 또는 두개의 프로그램에서 완전히 다른 두 스키마에 대해 URI인 http://tempuri.org/myschema를 동시에 사용할 수 있고 URI 사용의 범위가 교차하지 않으면 고유한 URI로 간주됩니다. 이러한 기능은 URI에 의해 참조된 엔티티가 처리 중인 컨텍스트 내에서 유효하기만 하다면 새로운 URI를 작성하지 않고도 설명될 수 있다는 장점이 있습니다. 안정적이고 고정된 엔티티에 대해, http://tempuri.org/를 기본 URI로 사용하는 것은 바람직하지 못합니다.

A 2. 네트워크 형식의 WSDL 예제

A 2.1. 예제 1

HTTP 요청에   포함된 SOAP 메시지

POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
 
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
       <m:GetLastTradePrice xmlns:m="Some-URI">
           <symbol>DIS</symbol>
       </m:GetLastTradePrice>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

HTTP 응답에   포함된 SOAP 메시지

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
 
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
   <SOAP-ENV:Body>
       <m:GetLastTradePriceResponse xmlns:m="Some-URI">
           <Price>34.5</Price>
       </m:GetLastTradePriceResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

A 3. 확장성 요소의 위치

확장성 요소는 WSDL 문서의 다음과 같은 위치에서 나타날 수 있습니다.

위치

의미

사용법

definitions

확장성 요소는 WSDL 문서에 전반적으로 적용됩니다.

· WSDL 문서에 추가 정보 또는 정의를 전반적으로 소개합니다.

definitions/types

확장성 요소는 형식 시스템입니다.

· XSD가 아닌 형식 시스템에 메시지의 서식을 지정합니다.

definitions/service

확장성 요소는 service에 적용됩니다.

· service에 추가 정보 또는 정의를 소개합니다.

definitions/service/port

확장성 요소는 port에 적용됩니다.

· port에 address를 지정합니다.

definitions/binding

확장성 요소는 binding에 전반적으로 적용됩니다.

· 모든 작업에 적용할 프로토콜별 정보를 바운드 될 port 형식에 제공합니다.

definitions/binding/operation

확장성 요소는 operation에 전반적으로 적용됩니다.

· input 및 output 메시지에 적용할 프로토콜별 정보를 제공합니다.

definitions/binding/operation/input

확장성 요소는 operation에 대한 input 메시지를 적용합니다.

· 추상 메시지 부분이 바인딩 데이터 형식 및 구체적인 프로토콜에 매핑되는 방법에 대한 자세한 정보를 제공합니다.

· input 메시지에 추가적인 프로토콜별 정보를 제공합니다.

definitions/binding/operation/output

확장성 요소는 operation에 대한 output 메시지에 적용됩니다.

· 추상 메시지 부분이 바인딩 데이터 형식 및 구체적인 프로토콜에 매핑되는 방법에 대한 자세한 정보를 제공합니다.

· output 메시지에 추가 프로토콜별 정보를 제공합니다.

definitions/binding/operation/fault

확장성 요소는 operation의 fault 메시지에 적용됩니다.

· 추상 메시지 부분이 바인딩 데이터 형식 및 구체적인 프로토콜에 매핑되는 방법에 대한 자세한 정보를 제공합니다.

· fault 메시지에 추가적인 프로토콜별 정보를 제공합니다.

A 4. 스키마

A 4.1 WSDL 스키마

<schema xmlns="http://www.w3.org/2000/10/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        targetNamespace="http://schemas.xmlsoap.org/wsdl/"
        elementFormDefault="qualified">
   <element name="documentation">
      <complexType mixed="true">
         <choice minOccurs="0" maxOccurs="unbounded">
            <any minOccurs="0" maxOccurs="unbounded"/>
         </choice>
         <anyAttribute/>
      </complexType>
   </element>
   <complexType name="documented" abstract="true">
      <sequence>
         <element ref="wsdl:documentation" minOccurs="0"/>
      </sequence>
   </complexType>
   <complexType name="openAtts" abstract="true">
      <annotation>
         <documentation>
         This type is extended by  component types
         to allow attributes from other namespaces to be added.
         </documentation>
      </annotation>
      <sequence>
         <element ref="wsdl:documentation" minOccurs="0"/>
      </sequence>
      <anyAttribute namespace="##other"/>
   </complexType>
   <element name="definitions" type="wsdl:definitionsType">
      <key name="message">
         <selector xpath="message"/>
         <field xpath="@name"/>
      </key>
      <key name="portType">
         <selector xpath="portType"/>
         <field xpath="@name"/>
      </key>
      <key name="binding">
         <selector xpath="binding"/>
         <field xpath="@name"/>
      </key>
      <key name="service">
         <selector xpath="service"/>
         <field xpath="@name"/>
      </key>
      <key name="import">
            <selector xpath="import"/>
            <field xpath="@namespace"/>
         </key>
      <key name="port">
         <selector xpath="service/port"/>
         <field xpath="@name"/>
      </key>
   </element>
   <complexType name="definitionsType">
      <complexContent>
         <extension base="wsdl:documented">
            <sequence>
               <element ref="wsdl:import" minOccurs="0" maxOccurs="unbounded"/>
               <element ref="wsdl:types" minOccurs="0"/>
               <element ref="wsdl:message" minOccurs="0" maxOccurs="unbounded"/>
               <element ref="wsdl:portType" minOccurs="0" maxOccurs="unbounded"/>
               <element ref="wsdl:binding" minOccurs="0" maxOccurs="unbounded"/>
               <element ref="wsdl:service" minOccurs="0" maxOccurs="unbounded"/>
               <any namespace="##other" minOccurs="0" maxOccurs="unbounded">
                  <annotation>
                     <documentation>to support extensibility elements </documentation>
                  </annotation>
               </any>
            </sequence>
            <attribute name="targetNamespace" type="uriReference" use="optional"/>
            <attribute name="name" type="NMTOKEN" use="optional"/>
         </extension>
      </complexContent>
  </complexType>
   <element name="import" type="wsdl:importType"/>
   <complexType name="importType">
      <complexContent>
   <extension base="wsdl:documented">
   <attribute name="namespace" type="uriReference" use="required"/>
      <attribute name="location" type="uriReference" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <element name="types" type="wsdl:typesType"/>
   <complexType name="typesType">
      <complexContent>
   <extension base="wsdl:documented">
   <sequence>
   <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
   </extension>
  </complexContent>
  </complexType>
   <element name="message" type="wsdl:messageType">
      <unique name="part">
         <selector xpath="part"/>
         <field xpath="@name"/>
      </unique>
   </element>
   <complexType name="messageType">
      <complexContent>
   <extension base="wsdl:documented">
   <sequence>
   <element ref="wsdl:part" minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
      <attribute name="name" type="NCName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <element name="part" type="wsdl:partType"/>
   <complexType name="partType">
      <complexContent>
   <extension base="wsdl:openAtts">
   <attribute name="name" type="NMTOKEN" use="optional"/>
      <attribute name="type" type="QName" use="optional"/>
      <attribute name="element" type="QName" use="optional"/>
   </extension>
  </complexContent>
  </complexType>
   <element name="portType" type="wsdl:portTypeType"/>
   <complexType name="portTypeType">
      <complexContent>
   <extension base="wsdl:documented">
   <sequence>
   <element ref="wsdl:operation" minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
      <attribute name="name" type="NCName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <element name="operation" type="wsdl:operationType"/>
   <complexType name="operationType">
      <complexContent>
   <extension base="wsdl:documented">
      <choice>
         <group ref="wsdl:one-way-operation"/>
         <group ref="wsdl:request-response-operation"/>
         <group ref="wsdl:solicit-response-operation"/>
         <group ref="wsdl:notification-operation"/>
      </choice>
      <attribute name="name" type="NCName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <group name="one-way-operation">
      <sequence>
         <element ref="wsdl:input"/>
      </sequence>
   </group>
   <group name="request-response-operation">
      <sequence>
         <element ref="wsdl:input"/>
         <element ref="wsdl:output"/>
         <element ref="wsdl:fault" minOccurs="0" maxOccurs="unbounded"/>
      </sequence>
   </group>
   <group name="solicit-response-operation">
      <sequence>
         <element ref="wsdl:output"/>
         <element ref="wsdl:input"/>
         <element ref="wsdl:fault" minOccurs="0" maxOccurs="unbounded"/>
      </sequence>
   </group>
   <group name="notification-operation">
      <sequence>
         <element ref="wsdl:output"/>
      </sequence>
   </group>
   <element name="input" type="wsdl:paramType"/>
   <element name="output" type="wsdl:paramType"/>
   <element name="fault" type="wsdl:faultType"/>
   <complexType name="paramType">
      <complexContent>
   <extension base="wsdl:documented">
   <attribute name="name" type="NMTOKEN" use="optional"/>
      <attribute name="message" type="QName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <complexType name="faultType">
      <complexContent>
   <extension base="wsdl:documented">
   <attribute name="name" type="NMTOKEN" use="required"/>
      <attribute name="message" type="QName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <complexType name="startWithExtensionsType" abstract="true">
      <complexContent>
   <extension base="wsdl:documented">
   <sequence>
   <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
   </extension>
  </complexContent>
  </complexType>
   <element name="binding" type="wsdl:bindingType"/>
   <complexType name="bindingType">
      <complexContent>
   <extension base="wsdl:startWithExtensionsType">
   <sequence>
   <element name="operation" type="wsdl:binding_operationType" minOccurs="0"     maxOccurs="unbounded"/>
  </sequence>
      <attribute name="name" type="NCName" use="required"/>
      <attribute name="type" type="QName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <complexType name="binding_operationType">
      <complexContent>
   <extension base="wsdl:startWithExtensionsType">
   <sequence>
   <element name="input" type="wsdl:startWithExtensionsType" minOccurs="0"/>
      <element name="output" type="wsdl:startWithExtensionsType" minOccurs="0"/>
      <element name="fault" minOccurs="0" maxOccurs="unbounded">
         <complexType>
            <complexContent>
   <extension base="wsdl:startWithExtensionsType">
   <attribute name="name" type="NMTOKEN" use="required"/>
         </extension>
  </complexContent>
  </complexType>
      </element>
  </sequence>
      <attribute name="name" type="NCName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <element name="service" type="wsdl:serviceType"/>
   <complexType name="serviceType">
      <complexContent>
   <extension base="wsdl:documented">
   <sequence>
   <element ref="wsdl:port" minOccurs="0" maxOccurs="unbounded"/>
      <any namespace="##other" minOccurs="0"/>
  </sequence>
      <attribute name="name" type="NCName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
   <element name="port" type="wsdl:portType"/>
   <complexType name="portType">
      <complexContent>
   <extension base="wsdl:documented">
   <sequence>
   <any namespace="##other" minOccurs="0"/>
  </sequence>
      <attribute name="name" type="NCName" use="required"/>
      <attribute name="binding" type="QName" use="required"/>
   </extension>
  </complexContent>
  </complexType>
  <attribute name="arrayType" type="string"/>
</schema>

A 4.2 SOAP 바인딩 스키마

<schema xmlns="http://www.w3.org/2000/10/XMLSchema"
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        targetNamespace="http://schemas.xmlsoap.org/wsdl/soap/">
   <element name="binding" type="soap:bindingType"/>
   <complexType name="bindingType">
      <attribute name="transport" type="uriReference" use="optional"/>
      <attribute name="style" type="soap:styleChoice" use="optional"/>
   </complexType>
   <simpleType name="styleChoice">
      <restriction base="string">
   <enumeration value="rpc"/>
      <enumeration value="document"/>
  </restriction>
   </simpleType>
   <element name="operation" type="soap:operationType"/>
   <complexType name="operationType">
      <attribute name="soapAction" type="uriReference" use="optional"/>
      <attribute name="style" type="soap:styleChoice" use="optional"/>
   </complexType>
   <element name="body" type="soap:bodyType"/>
   <complexType name="bodyType">
      <attribute name="encodingStyle" type="uriReference" use="optional"/>
      <attribute name="parts" type="NMTOKENS" use="optional"/>
      <attribute name="use" type="soap:useChoice" use="optional"/>
      <attribute name="namespace" type="uriReference" use="optional"/>
   </complexType>
   <simpleType name="useChoice">
      <restriction base="string">
   <enumeration value="literal"/>
      <enumeration value="encoded"/>
  </restriction>
   </simpleType>
   <element name="fault" type="soap:faultType"/>
   <complexType name="faultType">
      <complexContent>
   <restriction base="soap:bodyType">
   <attribute name="parts" type="NMTOKENS" use="prohibited"/>
   </restriction>
  </complexContent>
  </complexType>
   <element name="header" type="soap:headerType"/>
   <complexType name="headerType">            
      <all>
          <element ref="soap:headerfault">
      </all>
      <attribute name="message" type="QName" use="required"/>
      <attribute name="parts" type="NMTOKENS" use="required"/>
      <attribute name="use" type="soap:useChoice" use="required"/>
      <attribute name="encodingStyle" type="uriReference" use="optional"/>
      <attribute name="namespace" type="uriReference" use="optional"/>      
   </complexType>
   <element name="headerfault" type="soap:headerfaultType"/>
   <complexType name="headerfaultType">            
      <attribute name="message" type="QName" use="required"/>
      <attribute name="parts" type="NMTOKENS" use="required"/>
      <attribute name="use" type="soap:useChoice" use="required"/>
      <attribute name="encodingStyle" type="uriReference" use="optional"/>
      <attribute name="namespace" type="uriReference" use="optional"/>      
   </complexType>
   <element name="address" type="soap:addressType"/>
   <complexType name="addressType">
      <attribute name="location" type="uriReference" use="required"/>
   </complexType>
</schema>

A 4.3 HTTP 바인딩 스키마

<schema xmlns="http://www.w3.org/2000/10/XMLSchema"
        xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
        targetNamespace="http://schemas.xmlsoap.org/wsdl/http/">
   <element name="address" type="http:addressType"/>
   <complexType name="addressType">
      <attribute name="location" type="uriReference" use="required"/>
   </complexType>
   <element name="binding" type="http:bindingType"/>
   <complexType name="bindingType">
      <attribute name="verb" type="NMTOKEN" use="required"/>
   </complexType>
   <element name="operation" type="http:operationType"/>
   <complexType name="operationType">
      <attribute name="location" type="uriReference" use="required"/>
   </complexType>
   <element name="urlEncoded">
      <complexType>
  </complexType>
   </element>
   <element name="urlReplacement">
      <complexType>
  </complexType>
   </element>
</schema>

A 4.4 MIME 바인딩 스키마

<schema  targetNamespace="http://schemas.xmlsoap.org/wsdl/mime/"
         xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
         xmlns="http://www.w3.org/2000/10/XMLSchema">
   <element name="content" type="mime:contentType"/>
   <complexType name="contentType" content="empty">
      <attribute name="type" type="string" use="optional"/>
      <attribute name="part" type="NMTOKEN" use="optional"/>
   </complexType>
   <element name="multipartRelated" type="mime:multipartRelatedType"/>
   <complexType name="multipartRelatedType" content="elementOnly">
      <element ref="mime:part" minOccurs="0" maxOccurs="unbounded"/>
   </complexType>
   <element name="part" type="mime:partType"/>
   <complexType name="partType" content="elementOnly">
      <any namespace="targetNamespace" minOccurs="0" maxOccurs="unbounded"/>
      <attribute name="name" type="NMTOKEN" use="required"/>
   </complexType>
   <element name="mimeXml" type="mime:mimeXmlType"/>
   <complexType name="mimeXmlType" content="empty">
      <attribute name="part" type="NMTOKEN" use="optional"/>
   </complexType>
</schema>

최종 수정일: 2002년 7월 20일



출처 - https://msdn.microsoft.com/ko-kr/library/cc671589.aspx

'Language > XML' 카테고리의 다른 글

참조, 예제 사이트  (0) 2016.12.13
XML, SOAP, WSDL, UDDI  (0) 2016.12.07
XML 스키마  (0) 2013.07.03
:

Oracle Application Development Framework (ADF)

FRAMEWORK 2016. 12. 12. 15:23

Oracle Application Development Framework


In computingOracle Application Development Framework, usually called Oracle ADF, provides a commercial Java framework for building enterprise applications. It provides visual and declarative approaches to Java EE development. It supports rapid application development based on ready-to-use design patternsmetadata-driven and visual tools.


출처 - https://en.wikipedia.org/wiki/Oracle_Application_Development_Framework

'FRAMEWORK' 카테고리의 다른 글

WAS에서 트랜잭션 처리  (0) 2017.01.04
라이브러리와 프레임워크에 대해  (0) 2016.12.20
Service Data Objects (SDO)  (0) 2016.12.12
Maven 을 이용한 프로젝트 생성 및 활용  (1) 2015.06.05
JNDI, TOMCAT  (0) 2013.11.06
:

Service Data Objects (SDO)

FRAMEWORK 2016. 12. 12. 15:17

Service Data Objects (SDO)

Definition - What does Service Data Objects (SDO) mean?

Service Data Objects (SDO) is a framework providing convenient and uniform layer to access data from a wide range of data sources. 

Data sources include relational databases, XML, Web services and enterprise information systems. It allows programmers to access and manipulate data from these data sources in a unified manner.

SDO has many important and useful features, including:

1. Reducing the number of data APIs, thereby simplifies the J2EE data programming model

2. Streamlining the processing of Service-Oriented Architecture (SOA)

3. D
ecoupling of application code from data access code 

4. Providing support for XML and also integrating XML.


5. Providing metadata API

Techopedia explains Service Data Objects (SDO)

SDO was originally developed by IBM and BEA as a joint collaboration in 2004, with the approval by Java community process. It was officially released as a specification in November 2004, which later became a part of Service Component Architecture (SCA). SDO technology was earlier known as Web data objects (WDO). The idea behind SDO design is based on the concept of disconnected data graphs. A data graph consists of tree and graph structured data objects. In disconnected data graphs architecture, data is organized as graphs, which are retrieved from data source by clients. Changes are incorporated in data graphs. These changes are updated back in data source. The applications are connected to data sources by data mediator services.

SDO was designed to be language-neutral and to be available in different languages. It has the ability to support a disconnected programming model. It facilitates both static and dynamic types of programming models. SDO is available in a wide range of programming languages such as C, C++, COBOL and JAVA.

Some of the major benefits of SDO are:

1. Simplified and unified programming across different data sources

2. Providing robust support for applications having common patterns

3. Facilitating applications to handle and query data easily

4. Being XML friendly

5. Capable of metadata introspection


출처 - https://www.techopedia.com/definition/26141/service-data-objects-sdo


'FRAMEWORK' 카테고리의 다른 글

라이브러리와 프레임워크에 대해  (0) 2016.12.20
Oracle Application Development Framework (ADF)  (0) 2016.12.12
Maven 을 이용한 프로젝트 생성 및 활용  (1) 2015.06.05
JNDI, TOMCAT  (0) 2013.11.06
IBATIS 처리 후 Return 값  (0) 2013.08.05
:

XML, SOAP, WSDL, UDDI

Language/XML 2016. 12. 7. 08:44

3. XML, SOAP, WSDL, UDDI

 

3.1. XML(eXtensible Markup Language) 기초

 

3.1.1. XML 개요

 

XML(eXtensible Markup Language)는 데이터를 전송하고 저장하는데 사용되는 마크업 언어(markup language). XML HTML(Hyper Text Markup Language)와는 다른 목적으로 사용된다. HTML이 데이터를 표시하는데 사용된다면, XML은 데이터를 전송하고 저장하는데 사용된다.

 

사실 XML은 어떤 일을 하지 않는다. XML은 정보를 구조화하고 저장하고 전송하기 위해 사용된다다음은 갑돌이가 갑순이에게 보내는 쪽지를 XML 형식으로 저장한 예이다.

 

<note>

<from>갑돌이</from>

<to>갑순이</to>

<heading>알림</heading>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

위의 쪽지(note)에는 보내는 사람(from)과 받는 사람(to)의 정보가 포함되어 있으며제목(heading)과 메시지 몸체(body)를 갖고 있다그러나 이 XML 다큐먼트는 아무 것도 하지 않는다그저 태그(tag) 안에 둘러싸여 있는 순수한 정보일 뿐이다이 다큐먼트를 보내고 받고표시하기 위해서는 누군가 소프트웨어를 작성해야 한다.

 

XML에는 특별한 것이 없다그저 평범한 텍스트일 뿐이다텍스트를 처리할 수 있는 소프트웨어는 XML도 처리할 수 있다그러나 XML 애플리케이션은 XML 태그를 특별한 방식으로 처리한다태그의 기능적인 의미는 애플리케이션에 달려있다.

 

위의 예에서 <from> <to>와 같은 태그는 XML 표준에 정의되어 있지 않다이들 태그는 XML 다큐먼트의 저작자가 만들어 낸” 것이다그것은 XML 언어가 어떤 태그도 미리 정의하고 있지 않기 때문이다반면에 HTML에서 사용되는 태그와 구조는 미리 정의되어 있다. HTML 다큐먼트는 <p> <h1>과 같이 HTML 표준에서 정의된 태그 만 사용해야 한다그러나 XML은 저작자가 자기 자신의 태그와 다큐먼트 구조를 정의할 수 있게 한다.

 

XML HTML을 대체하는 것이 아니라 보완한다대부분의 웹 애플리케이션에서 XML은 데이터를 전송하는데 사용되지만, HTML은 데이터를 형식화하고 표시하는데 사용된다.

 

3.1.2. XML의 이점

 

XML은 데이터 저장과 공유를 단순화하기 위해 웹 개발의 여러 분야에서 사용된다.

 

1)     XML HTML로부터 데이터를 분리한다
HTML 
다큐먼트에 동적인 데이터를 표시해야 하는 경우에 데이터가 변경될 때마다 HTML를 수정해야 하는 번거러운 작업을 해야 한다이런 경우라면 데이터를 별도의 XML 파일에 저장하게 하고 HTML에는 데이터의 레이아웃을 결정하고 표시하는데 집중하게 할 수 있다그리고 몇 행의 자바 스크립트로 XML 파일을 읽어서 HTML에 데이터의 내용을 표시하게 함으로써 해당 데이터가 변경될 때 HTML을 변경하지 않아도 되게 할 수 있다.

2)     XML은 데이터 공유를 단순하게 한다
실세계에서 컴퓨터 시스템과 데이터베이스는 호환되지 않는 형식으로 데이터를 저장한다그러나 XML 데이터는 평범한 텍스트 형식으로 저장된다이것은 소프트웨어와 하드웨어 독립적인 형식으로 데이터를 저장할 수 있는 기능을 제공하므로,서로 다른 애플리케이션이 공유할 수 있는 데이터를 손쉽게 생성할 수 있게 된다.

3)     XML은 데이터 전송을 단순하게 한다
XML
을 사용하면 호환되지 않는 시스템 사이에 데이터를 손쉽게 교환할 수 있다개발자들이 가장 많이 시간을 소비하는 문제 중의 하나가 인터넷을 통해 호환되지 않은 시스템 사이에 데이터를 교환하는 일이다. XML로 데이터를 교환하면 이런 복잡성을 크게 감소시킬 수 있다.

4)     XML은 플랫폼 변화를 단순하게 한다
새로운 시스템(하드웨어나 소프트웨어 플랫폼)으로 업그레이드하는 것은 항상 많은 시간을 소비하게 한다많은 양의 데이터가 변환되어야 하며 호환되지 않는 데이터를 손실되는 경우가 많다. XML 데이터는 텍스트 형식으로 저장되므로데이터를 잃어버리지 않고도 새로운 운영체제나 애플리케이션으로 확장하거나 업그레이드하기 쉽다.

5)     XML은 새로운 인터넷 언어를 만드는데 사용된다

 

많은 새로운 인터넷 언어들이 XML을 기반으로 생성된다그 중 몇가지 예를 들면 다음과 같다.

 

o  XHTML : HTML의 최신 버전

o  WSDL : 웹 서비스 디스크립션

o  WAP  WML : 핸드헬드 디바이스의 마크업 언어

o  RSS : 뉴스 제공 언어

o  RDF OWL : 리소스와 온톨로지 디스크립션

o  SMIL : 웹 용 멀티미디어 디스크립션

 

3.1.3. XML 트리

 

XML 다큐먼트는 루트(root)에서 시작하여 리프(leaf)로 분기하는 트리(tree) 구조를 형성한다. XML 다큐먼트는 자기 소개 형식의 단순한 구문을 사용한다.

 

<?xml version="1.0" encoding="UTF-8"?>

<note>

<from>갑돌이</from>

<to>갑순이</to>

<heading>메시지</heading>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

위의 예에서 첫번째 행에서는 XML을 선언한다이 문서가 XML 다큐먼트임을 말해준다여기에서는 XML 1.0 버전을 사용하며, UTF-8 인코딩 방식 즉유니코드 인코딩 방식을 사용함을 정의하고 있다두번째 행에서는 XML 다큐먼트의 루트 요소를 기술한다이 문서는 note라고 말하는 것과 같다다음 4행은 4개의 리프 요소 즉, from to, heading, body를 기술한다마지막 행은 루트 요소의 끝임을 정의한다.

 

위의 예에서 처럼 XML 다큐먼트는 하나의 루트 요소를 포함해야 하며루트 요소는 다른 모든 요소의 부모로서의 역할을 하게 된다. XML 다큐먼트에서 요소들은 트리 구조를 형성한다트리는 루트에서 시작하여 최하위 레벨까지 분기한다모든 요소는 서브 요소 또는 자식 요소를 가질 수 있다.

 

<root>

        <child>

                   <subchild>….</subchild>

        </child>

</root>

 

요소 사이의 관계를 기술하는데 부모(parent), 자식(child), 이웃(sibling)이란 용어가 사용된다부모 요소는 자식들을 가질 수 있으며같은 레벨에 있는 자식들을 이웃이라고 한다모든 요소는 텍스트 컨텐츠(content)와 애트리뷰트(attribute)를 가질 수 있다.

 

 



위의 그림은 하나의 책을 다음과 같이
 XML로 표현한다.

 

<bookstore>

<book category="COOKING">

  <title lang="en">Everyday Italian</title>

  <author>Giada De Laurentiis</author>

  <year>2005</year>

  <price>30.00</price>

</book>

<book category="CHILDREN">

  <title lang="en">Harry Potter</title>

  <author>J K. Rowling</author>

  <year>2005</year>

  <price>29.99</price>

</book>

<book category="WEB">

  <title lang="en">Learning XML</title>

  <author>Erik T. Ray</author>

  <year>2003</year>

  <price>39.95</price>

</book>

</bookstore>

 

위의 예에서 루트 요소는 <bookstore>이며모든 <book> 요소는 <bookstore> 안에 포함된다. <book> 요소는 4개의 자식 요소를 가지며여기에는 <title>, <author>, <year>, <price>가 포함된다.

 

3.1.4. XML 구문 규칙

 

XML 구문 규칙은 아주 단순하며 논리적이므로배우기 쉽고 사용하기 쉽다.

 

1)     모든 XML 문서는 끝 태크(end tag)를 가져야 한다

 

HTML에서는 다음과 같이 끝 태그를 갖지 않는 요소를 볼 수 있다.

<p>이것은 문단입니다

<p>이것은 다른 문단입니다

 

그러나 XML에서는 끝 태그를 생략할 수 없으며모든 요소는 끝 태그를 가져야만 한다.

 

<p>이것은 문단입니다</p>

<p>이것은 다른 문단입니다</p>

 

2)     XML 태그는 대소문자를 구별한다

 

XML 요소는 XML 태그를 사용하여 정의되며, XML 태그는 대소문자를 구별한다따라서 <Letter> 태그와 <letter> 태그는 서로 다르다시작 태그와 끝 태그는 같은 대소문자로 작성되어야 한다.

 

<Message>이것은 틀렸습니다</message>

<message>이것은 맞습니다</message>

 

3)     XML 요소는 적절하게 네스팅되어야 한다

 

HTML에서는 다음과 같이 부적절하게 네스팅된 요소를 종종 볼 수 있다.

 

<b><i>이 텍스트는 굵은체와 기울임체입니다</b></i>

 

그러나 XML에서는 모든 요소가 서로 안에서 적절하게 네스팅되어야 한다여기에서 적절하게 네스팅된다라고 하는 말은 다음 예와 같이 <i> 요소가 <b> 요소 안에서 열렸을 때 <b> 요소 안에서 닫혀야 한다는 것을 의미한다.

 

<b><i>이 텍스트는 굵은체와 기울임체입니다</i></b>

 

4)     XML 다큐먼트는 하나의 루트 요소를 가져야 한다

 

XML 다큐먼트는 모든 요소의 부모가 되는 하나의 요소를 포함해야 하며이 요소를 루트 요소라고 한다.

 

<root>

     <child>

                <subchild>….</subchild>

     </child>

</root>

 

5)     XML 애트리뷰 값은 쌍따옴표로 둘러싸야 한다

 

HTML과 같이 XML 요소도 이름과 값의 쌍으로 된 애트리뷰트를 가질 수 있다. XML에서 애트리뷰트 값은 항상 쌍따옴표로 둘러싸야 한다다음 두개의 XML 다큐먼트에서 첫번째 것은 틀린 것이고 두번째 것이 맞는 것이다.

 

<note date=2008/6/22>

<from>갑돌이</from>

<to>갑순이</to>

</note>

 

<note date=”2008/6/22”>

<from>갑돌이</from>

<to>갑순이</to>

</note>

 

6)     엔터티 참조(entity reference)

 

어떤 문자는 XML에서 특별한 의미를 갖는다예를 들어 XML 요소 안에 ‘<’ 문자를 사용한다면 XML 파서는 새로운 요소가 시작한다고 해석하여 에러를 발생시키게 될 것이다다음 구문은 에러를 발생시킨다.

 

<message>if salary < 1000000 then</message>

 

이러한 에러를 피하려면 ‘<’ 문자를 엔터티 참조로 대체해야 한다.

 

<message>if salary &lt; 1000000 then</message>

 

XML에서는 5개의 엔터티 참조가 미리 정의되어 있다.

 

&lt;

< 

작다

&gt;

> 

크다

&amp;

&

엠퍼샌드

&apos;

홑따옴표

&quot;

쌍따옴표

 

7)     주석

 

XML에서 주석 구문은 HTML과 유사하다.

 

<!-- 이것은 주석문입니다 -->

 

8)     공백 문자

 

HTML에서 다음과 같이 여러 개의 공백 문자(white space character)는 하나의 공백 문자로 축소된다.

 

HTML

안녕하세요?             내 이름은 전병선입니다.

결과

안녕하세요내 이름은 전병선입니다.

 

그러나 XML에서는 여러 개의 공백 문자는 그대로 유지된다.

 

HTML

안녕하세요?             내 이름은 전병선입니다.

결과

안녕하세요?             내 이름은 전병선입니다.

 

9)     개행 문자

 

윈도우 애플리케이션에서 개행 문자는 CR(carriage return) LF(line feed)의 결합으로 저장된다반면에 유닉스 애플리케이션에서는 LF 문자로만 저장되며매킨토시 애플리케이션에서는 CR 문자로만 저장된다. XML에서 개행(new line) 문자는 LF 문자로 저장된다.

 

3.1.5. XML 요소

 

XML 요소는 요소의 시작 태그에서 시작하여 끝 태그까지의 모든 것으로하나의 요소는 다른 요소나 텍스트 또는 요소와 텍스트의 혼합을 포함할 수 있다또한 요소는 애트리뷰트를 가질 수 있다.

 

<bookstore>

<book category="CHILDREN">

  <title lang="en">Harry Potter</title>

  <author>J K. Rowling</author>

  <year>2005</year>

  <price>29.99</price>

</book>

<book category="WEB">

  <title lang="en">Learning XML</title>

  <author>Erik T. Ray</author>

  <year>2003</year>

  <price>39.95</price>

</book>

</bookstore>

 

위의 예에서 <bookstore> <book>은 다른 요소를 포함하고 있기 때문에 요소 컨텐츠(element contents)를 갖는다. <author>는 텍스트를 포함하므로 텍스트 컨텐츠(text contents)를 갖는다위의 예에서 <book> 요소만 값이 각각 “CHILDREN”“WEB” category란 애트리뷰트를 갖는다.

 

XML 요소는 다음과 같은 명명 규칙을 따라야 한다.

 

o     이름은 문자숫자기타 문자를 포함할 수 있다

o     이름은 숫자나 구두점 문자로 시작할 수 없다

o     이름은 xml 이나 XML, Xml 등으로 시작할 수 없다

o     이름에는 공백 문자를 포함시킬 수 없다

 

어떤 이름이라도 사용할 수 있으며 예약어는 없다.

 

이름을 이해하기 쉽게 만드는 것이 좋다. <first_name>, <last_name>와 같이 단어는 밑줄 문자로 연결시킨다이름은 가능한 한 짧고 단순한 것이 좋다따라서 <the_title_of_the_book> 보다는 <book_title>이 더 낫다. ‘-‘ 문자는 사용하지 않는다. <first-name>이란 이름을 사용한다면 first에서 name을 빼는 것으로 오해할 소지가 있다마찬가지로 ‘.’ 문자는 사용하지 않는다. <first.name> 이란 이름을 사용한다면 first 란 객체의 name 이란 속성을 의미하는 것으로 오해할 수 있다또한 ‘:’ 문자도 피한다콜론 문자는 네임스페이스(namespace)에 사용된다.

 

XML 요소는 확장 가능하다, XML 요소는 더 많은 정보를 포함할 수 있도록 확장시킬 수 있다다음 XML 예를 생각해보기로 한다.

 

<note>

<from>갑돌이</from>

<to>갑순이</to>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

우리가 위의 XML 다큐먼트로부터 <from>, <to>, 그리고 <body> 요소를 추출하여 다음과 같은 결과를 보여주는 애플케이션을 작성해야 한다고 생각해보자.

 

메시지

 

수신 : 갑순이

발신 갑돌이

 

내용 이번 주말 데이트 잊지 마!

 

그런데 XML 다큐먼트의 저작자가 이 문서에 다음과 같이 여분의 정보를 추가했다고 하자.

 

<note>

<date>2008-06-22</date>

<from>갑돌이</from>

<to>갑순이</to>

<heading>메시지</heading>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

이 경우 기존의 애플리케이션에는 에러가 발생할까아니다애플리케이션은 아직도 XML 다큐먼트로부터 <from>, <to>, 그리고 <body> 요소를 추출하여 같은 결과를 보여줄 수 있다. XML의 하나의 이점은 애플리케이션을 변경시키지 않고 확장시킬 수 있다는 것이다.

 

3.1.6. XML 애트리뷰트

 

HTML에서는 시작 태그에 애트리뷰트를 지정할 수 있다애트리뷰트는 요소에 대한 추가적인 정보를 제공한다. <img src=”computer.gif”> 에서 “src” 애트리뷰트는 <img> 요소에 대한 추가적인 정보를 제공한다. XML 요소도 마찬가지로 시작 태그에 애트리뷰트를 지정할 수 있다애트리뷰트는 데이터가 아닌 정보를 제공하는데 사용된다다음 예에서 파일 타입은 데이터로서는 적당하지 않지만소프트웨에가 이 요소를 처리하는데 필요한 정보를 제공한다.

 

<file type="gif">computer.gif</file>

 

XML 애트리뷰트는 따옴표로 묶어야 한다이때 홑따옴표나 쌍따옴표 어느 것을 사용할 수도 있다예를 들어 사람의 성별에 대하여 person 태그는 다음과 같이 작성될 수 있다.

 

<person sex=”female”>

 

또는,

 

<person sex=’female’>

 

애트리뷰트 값에 쌍따옴표가 포함되어 있다면 다음 예와 같이 홑따옴표로 묶을 수 있다.

 

<gangster name=’George “Shotgun” Ziegler’>

 

또는엔터티 참조를 사용하여 다음과 같이 표현할 수 있다.

 

<gangster name=”George &quot;Shotgun&quot; Ziegler”>

 

애트리뷰트를 사용할 때와 요소를 사용할 때를 판단할 수 있는 규칙은 없다다음 두가지 예를 살펴보기로 하자.

 

첫번째 예:

<person sex=”남자”>

     <firstname>병선</firstname>

     <lastname></lastname>

</person>

 

두번째 예:

<person>

     <sex>남자</sex>

     <firstname>병선</firstname>

     <lastname></lastname>

</person>

          

첫번째 예에서는 sex는 애트리뷰트이고두번째 예에서는 요소이다두 코드의 예는 같은 정보를 제공하기 때문에 어느 방법을 사용해도 좋다일반적으로 HTML에서는 애트리뷰트를 많이 사용하지만, XML에서는 요소를 사용하는 것이 유리할 때가 많다.

 

애트리뷰트를 사용할 때 몇가지 문제가 있다.

 

o     애트리뷰트는 여러 값을 포함할 수 없다

o     애트리뷰트는 트리 구조를 포함할 수 없다

o     애트리뷰트는 쉽게 확장할 수 없다

 

또한 애트리뷰트는 읽고 유지 보수하기 어렵게 한다따라서 데이터에 대해서는 요소를 사용하고데이터로서 적당하지 않은 정보에 대해서만 애트리뷰트를 사용하는 것이 좋다.

 

따라서 다음과 같이 애트리뷰트를 사용하는 것 보다는,

 

<note year=”2008”, month=”06”, day=”22”>

<date>2008-06-22</date>

<from>갑돌이</from>

<to>갑순이</to>

<heading>메시지</heading>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

다음과 같이 요소를 사용하는 것이 바람직하다.

 

<note>

<date>

<year>2008</year>

<month>06</month>

<day>22</day>

</date>

<from>갑돌이</from>

<to>갑순이</to>

<heading>메시지</heading>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

3.1.7. XML 스키마

 

XML 다큐먼트의 구조를 정의할 때 DTD(document type definition)을 사용할 수 있다. DTD는 유효한 요소와 애트리뷰트 목록으로 XML 다큐먼트의 구조를 정의한다다음은 note.dtd 파일명을 갖는 DTD의 예를 보여준다.

 

<!DOCTYPE note [

     <!ELEMENT note (from, to, heading, body)>

     <!ELEMENT from           (#PCDATA)>

     <!ELEMENT to              (#PCDATA)>

     <!ELEMENT heading       (#PCDATA)>

     <!ELEMENT body           (#PCDATA)>

]>

 

W3C에서는 DTD 대신에 XML 기반의 스키마(schema) , XML 스키마를 지원한다다음은 note.xsd 파일명을 갖는 XML 스키마의 예를 보여준다.

 

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

           targetNamespace="http://www.w3schools.com"

           xmlns="http://www.w3schools.com"

                   elementFormDefault="qualified">

<xs:element name=”note”>

<xs:complexType>

     <xs:sequence>

                <xs:element name=”from”           type=”xs:string”/>

                <xs:element name=”to”              type=”xs:string”/>

                <xs:element name=”heading”       type=”xs:string”/>

                <xs:element name=”body”           type=”xs:string”/>

     </xs:sequence>

</xs:complexType>

</xs:element>

 

XML 스키마는 XML 다큐먼트의 구조를 기술하며, XML 스키마 언어를 XSD(XML schema definition)이라고 한다위의 XML스키마 예에서 note 요소는 다른 요소를 포함하기 때문에 복합 타입(complex type)이 된다. from이나 to, heading, body 등의 요소는 다른 요소를 포함하지 않으므로 단순 타입(simple type)이 된다.

 

XML 다큐먼트는 XML 스키마를 참조할 수 있다다음은 note.xsd 라는 파일명을 갖는 XML 스키마를 참조하는 XML 다큐먼트의 예를 보여준다.

 

<?xml version="1.0"?>

<note

     xmlns="http://www.w3schools.com"

     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

     xsi:schemaLocation="http://www.ensoa.co.kr note.xsd">

<from>갑돌이</from>

<to>갑순이</to>

<heading>메시지</heading>

<body>이번 주말 데이트 잊지 마!</body>

</note>

 

3.1.8. XML DOM

 

XML DOM(document object model) XML 다큐먼트에 접근하고 조작하는 표준 방법을 정의한다. DOM XML 다큐먼트를 트리 구조로 간주한다모든 요소는 DOM 트리를 통해서 접근할 수 있다요소의 컨텐츠(텍스트와 애트리뷰트)는 수정될 수도 있고 삭제될 수 있으며새로운 요소가 생성될 수도 있다요소와 텍스트애트리뷰트는 모두 노드(note)로 간주된다다음 예제 코드는 <to> 요소로부터 텍스트를 구하는 예이다.

xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue

위의 예에서

 

o  xmlDoc은 파서(parser)가 생성하는 XML 다큐먼트이고,

o  getElementsByTagName(“to”)[0] 은 첫번째 <to> 요소에 접근하며,

o  childNodes[0] <to> 요소의 첫번째 자식 노드를 가르키며,

o  nodeValue는 노드의 값 즉텍스트를 가르킨다

 

3.1.9. XML 네임스페이스

 

XML에서 요소명은 개발자가 정의한다따라서 다른 XML 애플리케이션에서 생성한 XML 다큐먼트가 혼합된다면 이름이 충돌할 수도 있다예를 들어 다음 XML 코드는 HTML의 테이블 정보를 표현한다.

 

<table>

     <tr>

     <td>사과</td>

     <td>바나나</td>

     </tr>

</table>

 

그러나 다음 XML 코드는 가구인 탁자에 대한 정보를 표현한다.

 

<table>

     <name>밥상</name>

     <width>300</width>

     <length>800</length>

</table>

 

이들 두 XML 코드가 함께 사용된다면 <table> 이란 요소명이 충돌하게 된다모두 <table>이란 요소를 포함하고 있지만 서로 다른 컨텐츠와 의미를 갖는다이 경우 XML 파서는 이들 사이의 차이점을 처리하는 방법을 알지 못하게 된다.

 

XML에서 이름 충돌을 피할 수 있는 가장 손쉬운 방법은 전치사(prefix)를 사용하는 것이다다음은 전치사를 사용한 예이다.

 

<h:table>

     <h:tr>

     <h:td>사과</h:td>

     <h:td>바나나</h:td>

     </h:tr>

</h:table>

<f:table>

     <f:name>밥상</f:name>

     <f:width>300</f:width>

     <f:length>800</f:length>

</f:table>

 

XML에 전치사를 사요알 때 전치사에 대한 네임스페이스(namespace)가 정의되어야 한다네임스페이스는 요소의 시작 태그에xmlns 애트리뷰트로 정의한다네임스페이스는 다음과 같은 구문을 갖는다.

 

xmlns:prefix=”URI”

 

위의 구문에서 URI(Uniform Resource Identifier)는 인터넷 리소스를 식별하는 문자열로서가장 일반적인 URI는 인터넷 도메인 주소를 나타내는 URL(Uniform Resource Locator)이며, URN(Universal Resource Name) URI의 일종이다.

 

다음은 네임스페이스를 정의한 예이다.

 

<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">

     <h:tr>

     <h:td>사과</h:td>

     <h:td>바나나</h:td>

     </h:tr>

</h:table>

<f:table xmlns:f=”http://www.ensoa.co.kr/furniture”>

     <f:name>밥상</f:name>

     <f:width>300</f:width>

     <f:length>800</f:length>

</f:table>

</root>

 

네임스페이스는 다음과 같이 XML 루트 요소에 정의할 수도 있다.

 

<root

     xmlns:h="http://www.w3.org/TR/html4/"

     xmlns:f=”http://www.ensoa.co.kr/furniture”>

<h:table>

     <h:tr>

     <h:td>사과</h:td>

     <h:td>바나나</h:td>

     </h:tr>

</h:table>

<f:table>

     <f:name>밥상</f:name>

     <f:width>300</f:width>

     <f:length>800</f:length>

</f:table>

</root>

 

다음과 같은 구문으로 요소에 디폴트 네임스페이스를 정의하면 모든 자식 요소에 전치사를 붙여줘야 하는 부담에서 벗어날 수 있다.

 

xmlns=”namespaceURI”

 

다음은 디폴트 네임스페이스를 사용한 예이다.

 

<table xmlns="http://www.w3.org/TR/html4/">

     <tr>

     <td>사과</td>

     <td>바나나</td>

     </tr>

</table>

<table xmlns=”http://www.ensoa.co.kr/furniture”>

     <name>밥상</name>

     <width>300</width>

     <length>800</length>

</table>

 

3.1.10. XML 인코딩

 

XML 다큐먼트는 한글과 같은 비 아스키 문자를 포함할 수 있다따라서 XML 다큐먼트를 읽을 때 다음과 같은 인코딩 문제가 발생할 수 있다.

 

o  텍스트 컨텐츠에 유효하지 않은 문자가 있다
XML 
에 비 아스키 문자가 포함되어 있으며인코딩이 지정되지 않은 채 파일이 아스키 코드로 저장될 때 발생한다

o  현재 인코딩 방식을 지정된 인코딩 방식으로 전환이 지원되지 않는다
1
바이트 인코딩(UTF-8) 방식이 지정된 채 2바이트 유니코드(UTF-16) XML 파일이 저장되거나, 2바이트 인코딩(UTF-16)방식이 지정된 채 1바이트인 아스키 코드로 저장될 때 발생한다

 

이러한 XML 인코딩 문제를 피하기 위해서는 다음 사항에 유의한다.

 

o  항상 인코딩 애트리뷰트를 사용한다

o  인코딩을 지원하는 에디터를 사용한다

o  에디터가 사용하는 인코딩 방식을 확인한다

o  인코딩 애트리뷰트와 동일한 인코딩을 사용한다

 

XML 인코딩 애트리뷰트는 다음과 같이 지정한다.

 

<?xml version="1.0" encoding="UTF-8"?>

 

인코딩이란 특정한 문자 집합 안의 문자들을 컴퓨터 시스템에서 사용할 목적으로 일정한 범위 안의 정수(코드값)들로 변환하는 방법이다여기에는 유니코드 코드 포인트를 8비트 숫자의 집합으로 나타내는 UTF-8이나, 16비트 숫자의 집합으로 나타내는 UTF-16, 그리고 대부분의 일반적인 문자 인코딩들이 포함된다.

 

UTF-8(8-bit Unicode Transformation Format)은 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. UTF-16(16-bit Unicode Transformation Format)도 유니코드 문자 인코딩 방식의 하나로서주로 사용되는 기본 다국어 평면 (BMP, Basic multilingual plane)에 속하는 문자들은 그대로16비트 값으로 인코딩이 되고 그 이상의 문자는 특별히 정해진 방식으로 32비트로 인코딩이 된다.

 

EUC-KR 인코딩 방식은 유니코드 이전의 완성형 한글을 표현한다. EUC(Extended Unix Code, 확장 유닉스 코드)란 한국어중국어일본어 문자 전산화에 주로 사용되는 8비트 문자 인코딩 방식이며, EUC-KR은 이 인코딩 방식을 사용하여 한글 등 한국어에서 사용되는 문자를 표현한 것이다코드 페이지 949(CP949)는 마이크로소프트 한글 윈도우에서 사용되는 코드 페이지이다.본래는 KSC 5601의 완성형 한글을 표현한 코드 페이지였으나확장 완성형 혹은 통합형 한글 코드(Unified Hangul Code)이라는 명칭으로 확장되어 모든 현대 한글을 수용하게 되었다마이크로소프트에서는 이 인코딩을 기반 문자 집합 이름인 "ks_c_5601-1987"로 사용하고 있다.

 

 


 

 

3.2. SOAP(simple object access protocol) 기초

 

3.2.1. SOAP 개요

 

SOAP(simple object access protocol)은 분산 환경에서 구조적인 정보를 교환하기 위한 XML 기반의 프로토콜이다원칙적으로 SOAP은 트랜스포트 독립적이며따라서 HTTP JMS, SMTP 또는 FTP 등과 같은 다양한 프로토콜과 조합해서 사용될 수 있다그러나 현재로서 가장 일반적인 SOAP 메시지 교환 방식은 HTTP를 통한 것이며, HTTP 프로코콜은 WS-I 기본 프로파일(WS-I Basic Profile) 1.0에 의해서 지원되는 유일한 프로토콜이다.

 

SOAP는 다음과 같은 특징을 갖는다.

 

o     SOAP은 커뮤니케이션 프로토콜이다

o     SOAP은 애플리케이션 사이의 커뮤니케이션을 목적으로 한다

o     SOAP은 메시지 전송 형식이다

o     SOAP은 인터넷을 통한 커뮤니케이션을 위해 설계되었다

o     SOAP은 언어 독립적이다

o     SOAP XML을 기반으로 한다

o     SOAP은 단순하며 확장 가능하다

o     SOAP은 방화벽을 피할 수 있게 한다

o     SOAP W3C 표준이다

 

SOAP 2000 4월에 1.1 버전이 확정되었고, 2003 5월에 1.2 버전이 발표되었다여기에서는 특별한 언급이 없는 한 SOAP 1.1에 대해서 설명한다그것은 현재로서는 SOAP 1.2 보다 SOAP 1.1이 훨씬 광범위하게 사용되고 있고, JAX-WS를 사용하여 구현된 웹 서비스 엔드포인트가 디폴트 바인딩으로 SOAP 1.1/HTTP를 사용하고 있기 때문이다.

 

3.2.2. SOAP 구문

 

SOAP 메시지는 다음 요소를 포함하는 일반적인 XML 다큐먼트이다.

 

o     Envelope 요소 : XML 다큐먼트를 SOAP 메시지로 식별하게 하는 필수 요소

o     Header 요소 : 헤더 정보를 포함하는 0개 이상의 선택 요소

o     Body 요소 : 호출 및 응답 정보를 포함하는 하나의 필수 요소

o     Fault 요소 : 메시지를 처리하는 동안 발생한 에러에 대한 정보를 제공하는 선택 요소

 

SOAP 구문 규칙은 다음과 같다.

 

o     SOAP 메시지는 XML을 사용하여 인코딩되어야 한다

o     SOAP 메시지는 SOAP Envelope 네임스페이스를 사용해야 한다

o     SOAP 메시지는 SOAP Encoding 네임스페이스를 사용해야 한다

o     SOAP 메시지는 DTD 참조를 포함하지 않아야 한다

o     SOAP 메시지는 XML 처리 명령을 포함하지 않아야 한다

 

SOAP 메시지의 골격 구조는 다음과 같다.

 

<?xml version="1.0"?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

  <soap:Header>

                ...

                ...

  </soap:Header>

  <soap:Body>

               ...

               ...

    <soap:Fault>

                 ...

                 ...

    </soap:Fault>

  </soap:Body>

</soap:Envelope>

 

3.2.3. SOAP Envelope 요소

 

SOAP Envelope 요소는 SOAP 메시지의 루트 요소이며, XML 다큐먼트를 SOAP 메시지로 정의한다. Envelope 요소의 xmlns:soap 네임스페이스 애트리뷰트는 다음과 같이 정의된다.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope">

 

Envelope 요소의 encodingStyle 애트리뷰트는 다큐먼트에서 사용되는 데이터 타입을 정의하기 위해 사용된다이 애트리뷰트는 어떤 SOAP 요소에서도 나타날 수 있으며요소의 컨텐츠와 모든 자식 요소에 적용된다. SOAP 메시지는 디폴트 인코딩이 없다.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

 

3.2.4. SOAP Header 요소

 

SOAP Header 요소는 트랜잭션이나 인증과 같이 SOAP 메시지에 관한 애플리케이션에 고유한 정보를 포함한다. Header 요소가 있다면 Envelope 요소의 첫번째 자식 요소가 되어야 한다.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

     <soap:Header>

<m:Trans xmlns:m="http://www.ensoa.co.kr/transaction/">234</m:Trans>

</soap:Header>

</soap:Envelope>

 

위의 예에서는 Header 요소는 Trans 자식 요소를 포함하고 있으며, Trans 요소는 값이 1mustUnderstand 애트리뷰트를 포함하며, Trans 요소의 값은 234이다.

 

SOAP은 디폴트 네임스페이스("http://schemas.xmlsoap.org/soap/envelope") 3개의 애트리뷰트를 정의한다이들 애트리뷰트에는 actor mustUnderstand, 그리고 encodingStyle 특성이 포함된다. SOAP Header에 정의된 애트리뷰트는 수신자가 SOAP 메시지를 처리하는 방법을 정의한다.

 

SOAP 메시지는 메시지 경로에 따라 서로 다른 엔드포인트(endpoint)를 넘겨줌으로써 송신자로부터 수신자로 이동한다. SOAP메시지의 모든 부분이 SOAP 메시지의 최종 엔드포인트에 전달되어야 하는 것은 아니다그보다는 메시지 경로에 있는 하나 이상의 엔드포인트에 전달될 수도 있다.

 

SOAP actor 애트리뷰트는 Header 요소가 특정한 엔드포인트에 전달되도록 하는데 사용된다. actor 애트리뷰트에는 다음 구문과 같이 URI 값을 지정한다.

 

soap:actor=”URI”

 

다음은 actor 애트리뷰트의 사용 예를 보여준다.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

    <soap:Header>

        <m:Trans xmlns:m="http://www.ensoa.co.kr/transaction/"

soap:actor=” http://www.ensoa.co.kr/appml/">234</m:Trans>

    </soap:Header>

</soap:Envelope>

 

SOAP mustUnderstand 애트리뷰트는 헤더 요소를 수신자가 필수적으로 처리해야 하는 지 선택적으로 처리해야 하는 지를 지정하는데 사용된다. Header 요소의 자신 요소에 1이 지정되면 Header를 처리하는 수신자가 요소를 인식해야만 한다는 것을 나타낸다수신자가 요소를 인식하지 못한다면 Header 요소를 처리할 때 실패해야 한다. mustUnderstand 애트리뷰트에는 0 또는 1을 지정한다.

 

soap:mustUnderstand=”0 | 1”

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

     <soap:Header>

         <m:Trans xmlns:m="http://www.ensoa.co.kr/transaction/"

soap:mustUnderstand=”1”>234</m:Trans>

     </soap:Header>

</soap:Envelope>

 

SOAP encodingStyle 특성은 Envelope 요소의 encodingStyle 특성과 동일하다.

 

3.2.5. SOAP Body 요소

 

SOAP Body 요소는 메시지의 최종 엔드포인트를 목적지에 전달되어야 하는 실제 SOAP 메시지를 포함한다. SOAP Body 요소의 자신 요소는 네임스페이스가 명시될 수 있다. SOAP은 디폴트 네임스페이스("http://schemas.xmlsoap.org/soap/envelope")에 Body 요소 안에 에러 메시지를 표시하는데 사용되는 SOAP Fault 요소를 정의한다.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

     <soap:Body>

       <m:getPrice xmlns:m="http://www.ensoa.co.kr/prices">

                         <m:Item>Apples</m:Item>

       </m:getPrice>

     </soap:Body>

</soap:Envelope>

 

위의 예에서는 사과의 값을 요청한다. m:getPrice m:Item 요소는 애플리케이션에 고유한 요소이며 SOAP 표준의 일부는 아니다이 요청에 대하여 SOAP 응답은 다음과 같은 형태를 취한다.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

     <soap:Body>

        <m:getPriceResponse xmlns:m="http://www.ensoa.co.kr/prices">

           <m:Price>500</m:Price>

        </m:getPriceResponse>

     </soap:Body>

</soap:Envelope>

 

3.2.6. SOAP Fault 요소

 

SOAP Fault 요소는 SOAP 메시지에 대한 에러 및 상태 정보를 저장하는데 사용된다. SOAP 메시지로부터의 에러 메시지는 Fault 요소에 저장되어 전송된다. Fault 요소는 Body 요소의 자식 노드이며, SOAP 메시지 안에 단 한번 만 나타날 수 있다.

 

SOAP Fault 요소는 다음과 같은 하위 요소를 갖는다.

 

하위 요소

설명

<faultcode>

에러 코드

<faultstring>

에러 설명

<faultactor>

에러를 발생시킨 액터에 대한 정보

<detail>

Body 요소에 관련된 애플리케이션 특정한 에러 정보

 

<faultcode> 요소에 저장되는 에러 코드는 다음과 같이 정의되어 있다.

 

에러

설명

VersionMismatch

SOAP Envelope 요소에 잘못된 네임스페이스가 지정됨

MustUnderstand

mustUnderstand 특성에 “1”이 지정되어 있는 Header 요소의 자식 요소를 알 수 없음

Client

메시지가 잘못되었거나 부정확한 정보를 포함하고 있음

Server

서버에 문제가 발생하여 메시지를 처리할 수 없음

 

3.2.7. SOAP HTTP 바인딩

 

HTTP 프로토콜을 사용할 때 HTTP TCP/IP 상에 커뮤니케이션한다. HTTP 클라이언트가 TCP를 사용하여 HTTP 서버에 연결되며클라이언트 서버에 HTTP 요청 메시지를 보낼 수 있다.

 

POST /item HTTP/1.1

Host: 192.168.1.1

Content-Type: text/plain

Content-Length: 200

 

이때 서버는 요청을 처리하고 클라이언트에게 HTTP 응답을 되돌려보낸다응답에는 요청 상태를 표시하는 상태 코드가 포함된다.

 

200 OK

Content-Type: text/plain

Content-Length: 200

 

위의 예에서 서비스는 성공을 나타내는 상태 코드 200을 반환하고 있다만약 서버가 요청을 해독할 수 없다면 다음과 같은 응답을 반환하게 된다.

 

400 Bad Request

Content-Length: 0

 

SOAP은 트랜스포트 레이어에 독립적이므로 반드시 HTTP 프로토콜을 사용해야 하는 것은 아니지만현재로서 가장 일반적인 SOAP 메시지 교환 방식이 HTTP 프로토콜을 사용하는 하는 것이다그러므로 우리는 SOAP 메서드는 SOAP 인코딩 규칙을 준수하는 HTTP 요청/응답으로 생각할 수 있다따라서 다음과 같은 공식을 세울 수도 있다.

 

HTTP + XML = SOAP

 

이때 SOAP 요청은 HTTP POST이거나 HTTP GET 요청이며, HTTP POST 요청은 Content-Type Content-Length 등 적어도2개의 HTTP 헤더를 지정한다.

 

SOAP 요청/응답의 Content-Type 헤더는 XML 몸체에서 사용하게 될 메시지의 MIME 타입과 문자 인코딩을 정의한다.

 

Content-Type: MIMETYPE; charset=문자인코딩

 

Content-Type 헤더의 예는 다음과 같다.

 

POST /item HTTP/1.1

Content-Type: application/soap+xml; charset=utf-8

 

SOAP 요청/응답의 Content-Length 헤더에는 요청 또는 응답 몸체의 바이트 수를 지정한다.

 

Content-Length: 바이트수

 

POST /item HTTP/1.1

Content-Type: application/soap+xml; charset=utf-8

Content-Length: 250

 

다음 예는 getStockPrice 요청을 서버에 전송한다요청에는 StockName 매개변수를 가지며, Price 매개변수가 응답에 반환된다이 기능의 네임스페이스는 “http://localhost/stock” 주소에 저장된다.

 

POST /stock HTTP/1.1

Host: localhost

Content-Type: application/soap+xml; charset=utf-8

Content-Length: 250

 

<?xml version=”1.0”?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

     <soap:Body xmlns:m="http://localhost/stock">

        <m:getStockPrice>

           <m:StockName>PC</m:StockName>

        </m:getStockPrice>

     </soap:Body>

</soap:Envelope>

 

위의 요청에 대한 SOAP 응답은 다음과 같다.

 

HTTP/1.1 200 OK

Content-Type: application/soap+xml; charset=utf-8

Content-Length: 250

 

<?xml version=”1.0”?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"

                   soap:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding">

     <soap:Body xmlns:m="http://localhost/stock">

          <m:getStockPriceResponse>

             <m:Price>2000000</m:Price>

          </m:getStockPriceResponse>

     </soap:Body>

</soap:Envelope>

 

 

 

 

 

3.3. WSDL UDDI 기초

 

3.3.1. WSDL 개요

 

WSDL(Web Services Description Language)는 웹 서비스와 접근 방법을 기술하는 XML 기반의 언어이다.

 

o     WSDL XML로 작성된다

o     WSDL XML 다큐먼트이다

o     WSDL은 웹 서비스를 기술하는데 사용된다

o     WSDL은 웹 서비스의 위치와 웹 서비스가 제공하는 오퍼레이션을 명시한다

o     WSDL은 아직 W3C 표준은 아니다

 

WSDL 1.1 2001 5월에 W3C Note로 출판되었으며, 2002 7월에 WSDL 1.2가 Working Draft로 출판되었지만 Recommendation 되지는 못하였다가장 최신 버전인 WSDL 2.0은 Candidate Recommendation 상태이다여기에서는 특별한 언급이 없는 한WSDL 1.0에 대해서 설명한다그것은 JAX-WS 2.0의 핵심 컴포넌트가 WSDL 1.1 Java 사이를 맵핑하고 있으며, WSDL 2.0에 대해서는 맵핑이 정의되어 있지 않기 때문이다.

 

3.3.2. WSDL 다큐먼트 구조

 

WSDL 다큐먼트는 단순한 XML 다큐먼트로서 웹 서비스를 기술하는 정의 집합(set of definition to describe a web service)을 포함한다.

 

WSDL 다큐먼트는 다음과 같은 요소를 사용하여 웹 서비스를 기술한다.

 

요소

정의

<portType>

웹 서비스가 수행하는 오퍼레이션

<message>

웹 서비스가 사용하는 메시지

<types>

웹 서비스가 사용하는 데이터 타입

<binding>

웹 서비스가 사용하는 커뮤니케이션 프로토콜

 

<portType> 요소는 가장 중요한 WSDL 요소로서웹 서비스와 웹 서비스가 수행하는 오퍼레이션그리고 포함되는 메시지를 정의한다. <portType> 요소는 전통적인 프로그래밍 언어에서 함수 라이브러리나 모듈클래스와 유사하다. <message> 요소는 오퍼레이션의 데이터 요소를 정의한다각 메시지는 하나 이상의 파트(part)로 구성될 수 있다파트는 전통적인 프로그래밍 언어에서 함수의 매개변수와 유사하다. <types> 요소는 웹 서비스가 사용하는 데이터 타입을 정의한다플랫폼 중립성을 극대화하기 위해 XML 스키마 구문을 사용하여 데이터 타입을 정의한다. <binding> 요소는 각 포트의 메시지 형식과 프로토콜을 상세히 정의한다.

 

WSDL 다큐먼트의 주요 구조는 다음과 같다.

 

<definitions>

<types>

           타입 정의

</types>

<message>

           메시지 정의...

</message>

<portType>

            포트 정의...

</portType>

<binding>

            바인딩 정의

</binding>

</definitions>

 

WSDL 다큐먼트는 확장 요소(extension element)나 서비스 요소(service element)와 같은 다른 요소를 포함하여 하나의 WSDL다큐먼트에 여러 개의 웹 서비스 정의를 함께 묶을 수 있다.

 

다음은 WSDL 다큐먼트의 간단한 예이다.

 

<message name="getTermRequest">

   <part name="term" type="xs:string"/>

</message>

<message name="getTermResponse">

   <part name="value" type="xs:string"/>

</message>

<portType name="glossaryTerms">

  <operation name="getTerm">

      <input message="getTermRequest"/>

      <output message="getTermResponse"/>

  </operation>

</portType>

 

위의 예에서 <portType> 요소는 포트 이름으로 glossaryTerms그리고 오퍼레이션 이름으로 getTerm을 정의한다. getTerm오퍼레이션은 getTermRequest라는 입력 메시지와 getTermResponse라는 출력 메시지를 갖는다. <message> 요소는 각 메시지의 파트 및 관련된 데이터 타입을 정의한다전통적인 프로그래밍에 비교한다면 glossaryTerms 는 함수 라이브러리가 되고, getTerm은 입력 매개변수로 getTermRequest와 반환 타입으로 getTermResponse를 갖는 함수가 된다.

 

3.3.3. WSDL 포트

 

WSDL 포트(port)는 웹 서비스가 노출하는 인터페이스를 기술한다앞에서 언급한 바와 같이 <portType> 요소는 가장 중요한 WSDL 요소로서웹 서비스와 웹 서비스가 수행하는 오퍼레이션그리고 포함되는 메시지를 정의한다포트는 웹 서비스와의 연결 점(connection point)를 정의한다.

 

WSDL에서 가장 일반적인 오퍼레이션 타입(operation type)은 요청-응답(request-response)이지만, WSDL은 다음과 같은 4개의 타입을 정의한다.

 

포트 타입

정의

단방향(one-way)

오퍼레이션은 메시지를 받을 수는 있지만 응답을 반환하지는 않는다

요청-응답(reques-response)

오퍼레이션은 메시지를 받으며 응답을 반환한다

응답 청구(solicit-response)

오퍼레이션은 요청을 보낼 수 잇으며 응답을 기다린다

알림(notfication)

오퍼레이션이 메시지를 보낼 수 있지만 응답을 기다리지는 않는다

 

단방향(one-way) 오퍼레이션의 예는 다음과 같다.

 

<message name="newTermValues">

   <part name="term" type="xs:string"/>

   <part name="value" type="xs:string"/>

</message>

<portType name="glossaryTerms">

   <operation name="setTerm">

      <input name="newTerm" message="newTermValues"/>

   </operation>

</portType >

 

위의 예에서 glossaryTerms 포트는 setTerm이라는 단방향 오퍼레이션을 정의한다. setTerm 오퍼레이션은 term value 입력 매개변수를 갖는 newTermsValues 메시지를 사용하여 새로운 용어집 메시지의 입력을 허용한다그러나 오퍼레이션에 응답을 정의하지는 않고 있다.

 

요청-응답(reques-response) 오퍼레이션의 예는 다음과 같다.

 

<message name="getTermRequest">

   <part name="term" type="xs:string"/>

</message>

<message name="getTermResponse">

   <part name="value" type="xs:string"/>

</message>

<portType name="glossaryTerms">

  <operation name="getTerm">

      <input message="getTermRequest"/>

      <output message="getTermResponse"/>

  </operation>

</portType>

 

위의 예에서 glossaryTerms 포트는 getTerm이라는 요청-응답 오퍼레이션을 정의한다. getTerm 오퍼레이션은 term 매개변수를 갖는 getTermRequest 요청 메시지를 요구하며, value라는 매개변수를 갖는 getTermResponse 응답 메시지를 반환하고 있다.

 

3.3.4. WSDL 바인딩

 

WSDL 바인딩(bindings)는 웹 서비스의 메시지 형식과 프로토콜을 상세히 정의한다

 

다음 요청-응답 오퍼레이션은 SOAP에 바인딩하는 예를 보여준다.

 

<message name="getTermRequest">

   <part name="term" type="xs:string"/>

</message>

<message name="getTermResponse">

   <part name="value" type="xs:string"/>

</message>

<portType name="glossaryTerms">

  <operation name="getTerm">

      <input message="getTermRequest"/>

      <output message="getTermResponse"/>

  </operation>

</portType>

<binding type="glossaryTerms" name="b1">

<soap:binding style="document"

transport="http://schemas.xmlsoap.org/soap/http" />

  <operation>

    <soap:operation soapAction="http://localhost/getTerm"/>

    <input>

      <soap:body use="literal"/>

    </input>

    <output>

      <soap:body use="literal"/>

    </output>

  </operation>

</binding>

 

<binding> 요소는 두개의 애트리뷰트를 갖는다. name 애트리뷰트는 바인딩 이름을 정의하며, type 애트리뷰트는 바인딩 포트를 가르킨다위의 예에서는 바인딩 이름은 b1이고바인딩 포트는 glossaryTerms 포트가 된다.

 

<soap:binding> 요소도 두개의 애트리뷰트를 갖는다. style 애트리뷰트는 “rpc”이거나 “document” 일 수 있다위의 예에서는document가 사용되고 있다. transport 애트리뷰트는 사용할 SOAP 프로코콜을 정의한다위의 예에서는 HTTP가 사용된다.

 

<operation> 요소는 포트가 노출하는 각 오퍼레이션을 정의한다각 오퍼레이션에 대하여 대응되는 SOAP 액션(action)을 정의해야 한다또한 입출력이 인코딩되는 방법도 지정해야 한다위의 예에서는 literal이 사용되고 있다.

 

3.3.5. UDDI 기초

 

UDDI(Universal Description, Discovery and Integration)는 비즈니스가 웹 서비스를 등록하고 검색할 수 있는 플랫폼 독립적인 디렉터리 서비스 프레임워크다.

 

o     UDDI는 웹 서비스에 대한 정보를 저장하고 있는 디렉터리다

o     UDDI WSDL로 기술된 웹 서비스 인터페이스의 디렉터리다

o     UDDI SOAP을 통해 커뮤니케이션한다

 

UDDI XML, HTTP, DNS 프로토콜과 같은 W3C IETF 인터넷 표준을 사용하며, WSDL을 사용하여 웹 서비스 인터페이스를 기술한다이와함께 SOAP를 채택하여 이기종 플랫폼 프로그래밍 기능을 제공한다.



[출처] 3. XML, SOAP, WSDL, UDDI|작성자 엔소아


'Language > XML' 카테고리의 다른 글

참조, 예제 사이트  (0) 2016.12.13
WSDL(Web Services Description Language)  (0) 2016.12.12
XML 스키마  (0) 2013.07.03
: