다운로드
작성자: admin 작성일시: 2016-08-04 12:05:22 조회수: 3142 다운로드: 210
카테고리: Python 태그목록:

Python을 사용한 웹 서비스 개요

Python은 현재 웹 서비스 부분에서 활발히 사용되고 있는 언어의 하나이다. 파이썬을 사용하여 웹서비스를 구축하는 경우, 보통 다음과 같은 구조를 가지게 된다.

리버스 프락시 서버

일반적으로 보안 문제나 정적 파일(static file)의 빠른 서비스, 로드 밸런싱 등을 위해 리버스 프락시(reverse proxy) 서버를 실제 웹 서비스 서버 앞단에 두는 경우가 많다. 리버스 프락시 서버는 클라이언트로부터의 요청을 실제 웹서버나 파일서버로 전달하거나 대리하는 역할을 한다.

많이 쓰이는 리버스 프락시 서버로는 nginx 등이 있다.

WSGI 웹 어플리케이션 서버

웹 어플리케이션 서버(Web Application Server)는 실제로 클라이언트 호출에 대응하여 HTML 파일 등의 결과물을 출력하는 역할을 하는 서버 프로세스이다.

클라이언트 호출은 원격에서 이루어지는 함수 호출에 비유할 수 있다. 실제로 함수 호출을 할 수 있는 프로세스는 웹 어플리케이션 서버이지만 함수 자체는 웹 어플리케이션(Web Application)이라고 부르는 일종의 라이브러리와 같은 형태로 구현되어 웹 어플리케이션 서버가 해당 어플리케이션(라이브러리)를 임포트하여 사용한다.

Python의 경우에는 WSGI(Web Server Gateway Interface)이라고 부르는 웹 어플리케이션 규약이 존재하여 모든 웹 어플리케이션은 WSGI 규약에 맞게 구현되어야 한다.

웹 어플리케이션 서버로는 Apache에 modwsgi 모듈을 추가하여 사용할 수 있지만 Python으로 만들어진 웹 어플리케이션을 임포트하기 때문에 웹 어플리케이션 서버도 Python인 경우가 많다. tornado, uwsgi, gnuicorn, werkzeug, twisted 이 많이 사용되고 있다.

WSGI 웹 어플리케이션

WSGI 웹 어플리케이션은 실제로 다음과 같이 environment(또는 context)와 request 인수를 받아서 response 를 출력하는 함수의 집합이다.

웹 서비스의 각 URL은 이 함수들에 매핑(mapping)되어 웹 어플리케이션 서버가 웹 브라우저의 요청을 받을 때마다 해당 함수를 찾아서 호출하게 된다. 실제 함수 매핑은 웹 어플리케이션 서버보다는 웹 어플리케이션 자체(혹은 웹 어플리케이션 프레임워크)에서 발생하는 경우가 많다.

웹 어플리케이션은 독자적으로 함수 패키지를 만들기 보다는 웹 어플리케이션 프레임워크라고 불리는 구조 및 기반 클래스를 사용하여 만드는 경우가 대부분이다.

웹 어플리케이션 프레임워크

웹 어플리케이션 프레임워크는 WSGI 웹 어플리케이션을 빠르고 쉽게 개발하기 위한 기반 구조(archtecture) 및 클래스 라이브러리를 말한다.

Python으로 구현된 다양한 웹 어플리케이션 프레임워크들이 존재한다. 일부 예를 들면 다음과 같다.

  • django
  • flask
  • pyramids
  • turbogears
  • weppy
  • web2py
  • bottle
  • falcon
  • muffin
  • pylon
  • grokk
  • zope

웹 어플리케이션의 주 기능 중의 하나는 URL과 함수간의 매핑이다. 예를 들어 django의 경우 다음과 같은 URL 설정을 사용하는데

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P[0-9]+)/$', views.detail, name='detail'),
]

이 설정에 따르면 웹 브라우저에서

ORM (Object Relation Mapper)

웹 서비스가 하는 대부분의 일은 데이터 베이스로부터 특정한 데이터를 찾아 보여주는 작업이다. 따라서 데이터 베이스를 쉽게 다울 수 있는 도구가 필수적이다.

ORM은 데이터 베이스의 구조 즉, 스키마를 Python 클래스 정의로 구현할 수 있도록 한다. 예를 들어 django의 경우 자체적인 ORM을 사용하는데 다음과 같이 클래스를 정의하게 되면

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

데이터 베이스에서 스키마를 지정하여 테이블을 생성하는 SQL을 자동 생성하여 실행시킨다.

CREATE TABLE "question" (
    "id" serial NOT NULL PRIMARY KEY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);

Template Engine

데이터 베이스로부터 얻어진 데이터는 json이나 txt 같은 단순한 형태로 서비스되기도 하지만 대부분 html 파일을 형태로 서비스된다. 따라서 데이터 요소를 포함하는 html 파일을 동적으로 생성하는 기능을 필요하다. Template Engine은 미리 만들어진 html 파일 template의 일부 문자열을 실제 데이터로 치환(replace)하는 역할을 한다.

django의 경우에는 자체 template engine을 가지고 있지만 flask는 jinja2와 같은 외부 파이썬 패키지를 사용한다.

예를 들어 jinja2 패키지는 다음과 같은 context와

contries = [
{'Name': 'Afghanistan', 'Population': 22720000},
{'Name': 'Albania', 'Population': 3401200},
{'Name': 'Algeria', 'Population': 31471000},
]

다음 template을 합성하여




{{ title }}



{% for country in countries %}

{% endfor %}
{{ country['Name'] }}{{ country['Population'] }}

다음과 같은 html 을 생성할 수 있다.




Country list


Afghanistan22720000
Albania3401200
Algeria31471000

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!