2. Django와 WSGI 서버(Gunicorn) 연동

WSGI(Web Server Gateway Interface)란 웹서버와 python 애플리케이션 간 통신을 가능하게 해주는 규격이다. WSGI server는 WSGI 규격에 맞게 구현된 WAS라고 볼 수 있으며, 웹서버로부터 http request를 받아 WSGI 규격에 맞게 구현된 python 애플리케이션을 호출하고, 그 결과를 다시 http response로 변환하여 웹서버에 전달한다.

Gunicorn은 WSGI server 중 하나로 웹서버로부터 요청을 받아 Django application을 수행하는 역할을 한다. 비슷한 역할을 하는 WSGI server에는 uWSGI, mod_wsgi 등이 있다.


Gunicorn 설치 및 실행하기


Gunicorn은 python 패키지이므로 우선 pip로 install한다.

$ pip install gunicorn

gunicorn 문서에서 worker process갯수는 (2 * $num_cores) + 1로 권장한다. 아래의 명령어를 통해 CPU core 갯수를 확인해보면

$ grep -c processor /proc/cpuinfo
4

core가 4개 있으므로 총 9개의 worker를 생성한다. manage.py가 있는 directory로 이동후 command를 입력한다.

$ cd django_sample
$ gunicorn --bind 0.0.0.0:8000 --workers 9 app.wsgi
More …

1. Django 프레임워크 설치 및 실행

Django는 python으로 구성된 웹 애플리케이션 프레임워크로 front/backend 구현이 가능하며, 테스트용 웹서버까지 띄울 수 있다. 이번 포스트에서는 Django의 내장 웹서버를 실행해서 첫화면을 띄워볼 것이다.

우선 django-sample이라는 이름의 project 생성한다.

$ pip install django
$ django-admin startproject django_sample

django_sample이라는 이름의 directory가 생기고 해당 directory에 들어가면 manage.py와 django_sample directory가 보인다.

django_sample이 두개 있으면 헷갈리므로 이름을 app으로 바꿔준다.(관련된 이름을 grep으로 검색해서 다 바꿔줘야함) 바꾸고 난 뒤 모습은 아래와 같다

django_sample => [app, manage.py]
More …

Character set과 Character encoding 정리

character encoding
문자나 기호들의 집합을 컴퓨터에서 표현하는 방법.(UTF8, UTF16)
character set
정보를 표현하기 위한 글자들의 집합을 정의한 것. 한 문자 집합을 여러 문자 인코딩에서도 사용가능(ex: 유니코드)

유니코드라는 character set은 각 글자가 특정 bytes에 대응되는 집합을 의미한다. 예를 들어 ‘안’은 유니코드로 “C5 48”이라는 값과 대응되고, ‘녕’“B1 55”라는 값에 대응된다.

UTF8과 UTF16은 모두 유니코드라는 character set을 이용한 인코딩 방식을 의미한다.
인코딩은 쉽게 말해 컴퓨터가 이해할 수 있는 byte값으로 변환함을 의미한다. 따라서 ‘안’을 UTF8로 인코딩 한다는 의미는 “C5 48”이라는 값을 규칙에 따라 특정 byte값으로 변환하겠다는 의미이고, 이는 “EC 95 88(안) EB 88 95(녕)”로 변환된다. 비슷하게 ‘안’을 UTF16으로 인코딩하면 “C5 48”이라는 값이 규칙에 따라 “C5 48(안) B1 55(녕)”로 변환되게 된다.


다양한 character encoding 종류

1. EUC-KR

ASCII 영역(127이하)은 그대로 1byte의 동일값을 사용한다. 한글은 주로 2byte로 표현되며 한글 완성형 인코딩이다. 한글 완성형은 ‘가’를 ‘ㄱ’와 ‘ㅏ’로 나누지 않고 ‘가’ 자체가 하나의 byte값에 대응됨을 의미한다. 반대 표현으로는 한글 조합형이 있으며, 현재는 거의 사용되지 않는다.

2. MSWIN949(CP949)

MS사가 도입한 인코딩 방식으로 한글은 주로 2byte로 표현한다. EUC-KR을 확장했기 때문에 하위 호환성이 있다. EUC-KR이 표현할 수 없는 한글 문자도 표현 가능하다.

3. UTF-8

가변길이 유니코드 인코딩(1byte ~ 4byte)으로 ASCII 영역(127이하)은 그대로 1byte의 동일값을 사용한다. 한글은 주로 3byte로 표현한다. 인터넷 사이트에서 가장 많이 쓰이는 인코딩으로 엔디안에 상관없이 똑같이 읽을 수 있다는 장점이 있다. 또한 리눅스나 maxos에서는 운영체제 자체의 인코딩 형식을 UTF-8로 통일했다.(window는 레거시 호환을 위해 UCS-2와 병행)

한글의 경우 UTF-8 완성형/조합형 두가지 형식으로 표현할 수 있다. “안녕”을 완성형(NFC)으로 표현하는 경우 “EC 95 88(안) EB 88 95(녕)”이 되며, 조합형(NFD)으로 표현하는 경우 “E1 84 8B(ㅇ) E1 85 A1(ㅏ) E1 84 82(ㄴ) E1 84 82(ㄴ) E1 85 A7(ㅕ) E1 84 8B(ㅇ)” 이 된다.

Mac os는 키보드 입력을 제외하고는 한글을 조합형으로 저장하고 있다. 이로인해 Mac에서 저장한 파일을 DBMS에서 order by할 경우 무조건 앞에 위치하는 현상이 발생하기도 한다.(조합형 한글의 자음 encoding값이 완성형 한글 encoding값보다 항상 작기 때문에) 현재 DBMS 에는 한글 NFD와 NFC를 동시에 order by하는 기능이 없기때문에 python의 sorted를 이용해야 정상적으로 정렬가능하다.

More …