차근차근/이것저것
웹 서버 , 웹 서비스 , was서버
너무 어렵다. 이해가 안 가고 헷가린다..
웹서버
내가 이해한 내용... 새로 이해하면 다시 수정
웹 서버
http://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84
웹 서버(web server)는 다음의 두 가지 뜻 가운데 하나이다.:
- 웹 서버 (소프트웨어) : 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
- 웹 서버 (하드웨어) : 위에 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터
http://gap85.tistory.com/45
■ 웹 서버와 WAS의 차이점
- 웹 서버와 WAS를 구별 짓는 것은 동적 서버 콘텐츠를 수행하는가? 만약 수행한다면 WAS로 보면 된다.
- 웹 서버 : 정적인 HTML이나 이미지를 제공하는 서버.
WAS : 동적인 처리를 담당하는 서버.
■ 웹 서버와 WAS의 일반적인 구성
- 사용자가 브라우저에서 요청을 하게 되면 다음과 같이 웹 서버와 WAS 서버를 거쳐 응답이 돌아오게 된다.
사용자 요청(웹 브라우저) -> 웹 서버 -> WAS(동적 처리) -> 웹 서버 -> 사용자 응답 메세지(웹 브라우저)
[#M_더보기|접기|
웹 서비스
내가 이해해야할 부분은 2-2인데..아직 이해가 안돼서 설명을 쓰지못했다..
아.2번은 (컴퓨터 - 컴퓨터)
http://ko.wikipedia.org/wiki/%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4
웹 서비스
● 네이버 OpenAPI
네이버는 지난 3월 OpenAPI서비스를 시작했다. 검색결과 제공 서비스를 시작으로, 8월에는 네이버 지도를 사용자의 홈페이지에 삽입하고 임의로 꾸밀 수 있도록 네이버 지도 API를 공개했다. 예를 들어, "KAIST"로 검색한 결과를 얻고 싶으면 다음 주소로 HTTP요청을 보내면 RSS형식으로 포맷된 결과를 받을 수 있다.
http://openapi.naver.com/search?query=KAIST&display=10&start=1&target=webkr
네이버 지도 API에서는 네이버 지도 컴포넌트를 사용자가 자바스크립트를 이용하여 사용할 수 있게 해 준다. 네이버 오픈API를 사용한 많은 프로그램이 개발되었다. 네이버 책 검색을 이용하여 원하는 책 정보를 블로그에 입력해주는 태터툴즈 플러그인이나, 네이버 지도와 구글 위성사진을 한번에 볼 수 있는 사이트(NGMap)가 그 예이다.
● 구글 API
웹 2.0의 선두주자로 손꼽히는 구글은 다양한 웹 서비스를 제공한다. 구글의 웹 서비스를 이용하면 구글 지도와 구글 어스, 구글 검색결과를 웹 사이트에 활용할 수 있고, 개인화된 구글 홈페이지의 모듈, 구글 데스크탑의 가젯 등을 개발할 수도 있다.
다음 장에서는 웹 서비스를 실제로 구현하는 방법 중 하나인 XML-RPC에 대해 알아보자.
XML-RPC
RPC(Remote Procedure Call)는 다른 컴퓨터에 있는 프로시저를 호출하는 기능을 말한다. 이 개념은 분산 처리에서 중요한 개념으로 자주 도입된다. 작업을 여러 개의 작은 단위로 나누어서 여러 컴퓨터에서 동시에 수행하게 한다면 실행의 효율이 증가할 수 있을 것이다. 또한, 웹 서비스에 있어서 서비스 이용자는 서비스 제공자에게 RPC요청을 함으로써 원하는 정보를 제공받을 수 있다.
RPC는 서로 다른 기종(운영체제, 프로그래밍 언어, 인코딩 등)간에서 이루어질 수 있기 때문에, 파라미터의 전송 방법에 좀더 일반화된 형태가 필요하다. XML-RPC는 인수나 계산 결과를 주고받기 위해 XML을 사용한다. XML은 문서 교환 형식의 표준으로 이미 자리를 잡았기 때문에, XML-RPC는 플랫폼에 독립적으로 수행될 수 있다.
XML-RPC는 HTTP를 이용한다. 따라서 HTTP의 단점도 그대로 상속받는다. 우선 상태가 유지되지 않는다. 연속으로 두 번 함수를 호출할 때 서버에서는 이 두 함수 요구를 완전히 별개의 요구로 받아들인다. 즉 이전 함수 호출에서 어떤 객체를 생성했다고 해도 그 다음 호출에서 그 객체를 사용할 수 없게 된다. 또한 HTTP를 함수 호출에 이용함으로써 생기는 보안 문제도 논쟁거리이고, 인증을 기본적으로 지원해주지 않는 것도 불편한 일이다.
많은 서버를 이용하는 대형 작업이나, 극도의 보안이 요구되는 작업에는 XML-RPC가 적합하지 않지만, XML-RPC를 이용하면 쉽게 신뢰할 만한 기능을 구현할 수 있다. 쉽게 사용할 수 있고 원하는 기능을 빨리 구현할 수 있다는 것이 XML-RPC의 장점이다.
XML-RPC는 Python을 포함하여 Java, Perl, Tcl, COM, PHP, ASP, C/C++ 등 다양한 언어로 구현되어 있고, Python 2.2부터는 XML-RPC가 파이썬 표준 모듈로 포함되어 있다. 이처럼 XML-RPC는 거의 모든 컴퓨팅 환경에서 손쉽게 사용할 수 있다.
XML-RPC의 처리 과정을 살펴보자. 로컬 컴퓨터에서 몇 개의 인수를 가지고 원격의 함수를 호출한다. XML-RPC 클라이언트는 함수의 이름과 인수를 XML 형식으로 변환(Marshalling)하고 HTTP 프로토콜을 이용하여 서버 측에 요구 (Request) 메시지를 보낸다. XML-RPC 서버는 XML로 전달된 함수 이름과 인수를 언어에 맞는 자료형으로 변환(Unmarchalling)하고 실제 함수를 호출한다. 함수가 리턴한 결과는 다시 XML 문서로 변환(Marshalling)되어 클라이언트로 전송되고, 클라이언트는 이것을 해석해서 언어에 맞는 객체로 변환하여 함수의 호출원으로 전달한다.
betty.userland.com서버로 examples.getStateName(41)이란 함수를 호출한다고 하자. 클라이언트에서 서버로 보내는 HTTP Request는 아래와 같다.
Host: betty.userland.com
User-Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com)
Content-Type: text/xml
Content-Length: 184
<?xml version='1.0'?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
XML-RPC요청은 POST방식이어야 한다. 이는 HTTP Request의 Body로 XML 문서가 전송되어야 하기 때문이다. 헤더의 Content-Type은 text/xml이어야 한다.
XML-RPC에서는 다양한 형태의 변수를 전달하기 위해 통일된 스펙을 사용한다. XML-RPC의 공식 홈페이지의 http://www.xmlrpc.com/spec에서 확인할 수 있다. XML 본문은 최상위 엘리먼트인 <methodCall>로 이루어지고, 그 안에 메쏘드의 이름을 텍스트로 갖는 <methodName>과 생략 가능한 <params> 엘리먼트를 하나씩 갖는다. <params> 엘리먼트의 아래에는 하나 이상의 <param> 엘리먼트가 있고, 각 <param>은 하나의 <value> 엘리먼트를 가진다.
<value> 엘리먼트는 함수의 인수 데이터를 포함하는 것으로 숫자, 문자열, 배열 등 다양한 형식이 될 수 있으며 그 종류는 다음 표와 같다.
종류 | 예시 | 설명 |
boolean | <boolean>1</boolean> | 0(거짓) 또는 1(참) |
double | <double>-3.14</double> | 배정도 실수형 |
int | <int>13</int> 또는 <i4>13</i4> | 정수값 |
string | <string>hello world!</string> | 문자열 |
dateTime.iso8601 | <dateTime.iso8601> | 날짜와 시간 |
array | <array><data> | key를 가지지 않는 value들의 배열 |
struct | <struct> | key를 가지는 value들의 배열 |
XML-RPC 응답의 메시지는 정상적인 응답을 하는 경우와 오류가 발생한 경우의 응답 두 가지가 있다. 두 경우 모두 <methodResponse>를 최상위 엘리먼트로 하며, 정상적인 응답을 하는 경우는 <params>, <param>, <value>가 한 개씩 있는 구조를 가지고, 비정상적인 응답을 하는 경우에는 <falut> 엘리먼트와 그 아래에 faultCode와 faultString을 담은 <struct>가 포함된다.
다음 두 예는 각각 정상적인 응답을 할 때와 오류가 발생한 경우의 응답 메시지이다.
Connection: close
Content-Length: 141
Content-Type: text/xml
Date: Sun, 31 Dec 2006 14:48:35 GMT
Server: UserLand Frontier/9.5-WinNT
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
Connection: close
Content-Length: 426
Content-Type: text/xml
Date: Sun, 31 Dec 2006 14:48:35 GMT
Server: UserLand Frontier/9.5-WinNT
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Too many parameters.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
Python에서 XML-RPC의 클라이언트 기능을 이용하는 것은 놀랄 만큼 쉽다. xmlrpclib라는 라이브러리에서 XML-RPC의 모든 기능을 지원하기 때문에, 클라이언트에서는 보통의 함수를 호출하듯이 XML-RPC를 사용할 수 있다. http://betty.userland.com에서 제공하고 있는 examples모듈의 getStateName()함수를 이용하여 미국의 ABC순 41번째 주의 이름을 알아오려면 아래와 같이 하면 된다.
betty=ServerProxy("http://betty.userland.com/")
betty.examples.getStateName(41)
다음과 같이 명령어를 입력하고 결과를 보면서 실습해 보자.
xmlp=xmlrpclib.dumps((1,'abc',[10,20]),'function')
print xmlp
xmlrpclib.loads(xmlp)
xmlrpclib의 기작에 대해서 더 알아보고 싶다면 python 설치폴더 아래 Lib\xmlrpclib.py를 분석해보길 바란다.
Python에서 제공하는 라이브러리를 이용하면 XML-RPC 서버도 쉽게 만들 수 있다. SimpleXMLRPCServer 모듈은 SimpleXMLRPCServer와 SimpleXMLRPCRequestHandler 클래스를 지원한다. SimpleXMLRPCServer는 Socket.TCPServer의 서브클래스로 XML-RPC 소켓 서버를 만드는 데 사용된다. SimpleXMLRPCRequestHandler는 SimpleXMLRPCServer클래스가 이용하는 리퀘스트 핸들러 클래스로,
다음은 간단한 XML-RPC서버이다. 이 서버는 정수 값을 받아서 두 배의 값을 리턴하는 double 함수를 제공한다.
from SimpleXMLRPCServer import *
class MyRequestHandler(SimpleXMLRPCRequestHandler):
def _dispatch(self, method, params):
try:
server_method=getattr(self, "do_"+method)
except:
raise AttributeError, "No XML-RPC procedure do_%s" % method
return server_method(*params)
def log_message(self, format, *args):
print format % args
def do_double(self, k):
return k*2
if __name__=='__main__':
server = SimpleXMLRPCServer(('',8000), MyRequestHandler)
server.serve_forever()
클라이언트에서 함수 호출을 받은 SimpleXMLRPCServer는 연결된 리퀘스트 핸들러의 _dispatch 메쏘드를 호출한다. 이 때 전달되는 두 인수는 호출 함수의 이름(문자열)과 전달될 인수들의 튜플이다. _dispatch 메쏘드에서는 getattr을 사용하여 해당하는 함수를 호출하고, 만일 그러한 함수가 존재하지 않으면 AttributeError를 발생시킨다. "double"함수를 요청받았으므로, "do_double"함수를 찾아서 그 결과를 클라이언트에게 돌려준다.
다른 프로토콜의 예
JSON-RPC
JSON-RPC는 JSON이라는 인코딩 방식을 이용하는 RPC프로토콜이며, 역시 다양한 언어로 만들어진 라이브러리들을 이용하여 쉽게 사용할 수 있다. '<', '>'를 이용하는 XML과 다르게 JSON은 '{', '}'를 이용하여 데이터를 구성하며, XML보다 조금 더 길이가 짧다는 이점이 있다. XML과 JSON을 비교해 보자.
<students>
<student>
<name>Michael Smith</name>
<average>99.5</average>
<age>17</age>
<graduating>true</graduating>
</student>
<student>
<name>SteveJohnson</name>
<average>34.87</average>
<age>17</age>
</student>
</students>
</classinfo>
{
"students" : [
{
"name" : "Michael Smith",
"average" : 99.5,
"age" : 17,
"graduating" : true
},
{
"name" : "Steve Johnson",
"average" : 34.87,
"age" : 17,
"graduating" : false
}
]
}
}
SOAP(Simple Object Access Protocol)은 XML-RPC에서 시작하여 이름 공간(namespace)개념을 추가하고 여러 기능을 확장한 프로토콜이다. 더 자세한 설명은 이 교재의 범위를 벗어나므로 생략하고, SOAP 메시지의 간단한 예를 보자. 4.5와 5.4를 더하는 함수 add를 호출하는 SOAP 메시지의 예이다.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<w:add xmlns:w="http://www.examples.com/services/math">
<w:op1>4.5</w:op1>
<w:op2>5.4</w:op2>
</w:add>
</soap:Body>
</soap:Envelope>
'차근차근 > 이것저것' 카테고리의 다른 글
참고사이트 (0) | 2014.08.06 |
---|---|
윈도우에서 파이썬을 설치하고 실행하기 (0) | 2014.08.04 |
웹서비스 (0) | 2014.07.31 |
정규식표현테스트 사이트 (0) | 2014.07.29 |
참고사이트 (0) | 2014.07.26 |
'차근차근/이것저것'의 다른글
- 현재글웹 서버 , 웹 서비스 , was서버