웹 : 인터넷 네트워크를 기반으로 하는 수많은 응용 프로그램 중 하나 (이외에 이메일, 클라우드 등이 있음)
URL : Uniform Resource Locator, 인터넷 상의 리소스(웹 페이지, 이미지, 동영상 등)의 위치를 나타내는 주소
HTML : HyperText Markup Language, <html> , <head> , <body> 등의 태그로 이루어져 있는 마크업 언어
HTTP : HyperText Transfer Protocol, HTML같은 리소스를 가져올 때 사용하는 프로토콜(통신에 사용되는 두 컴퓨터 간의 약속)
API
Application Programming Interface, 두 애플리케이션 사이에서 데이터를 전송할 수 있는 규칙의 집합이며 웹 프로그래밍에서는 클라이언트 애플리케이션과 서버 애플리케이션 사이의 규칙 집합을 의미한다.
API의 종류에는 대표적으로 SOAP API, RPC API, Websocket API, REST API가 있다.
REST API
REST : epresentational State Transfer, REST API(Representational State Transfer API)는 네트워크를 통해 자원을 생성, 읽기, 수정, 삭제(CRUD)하기 위한 소프트웨어 인터페이스를 제공하는 웹 서비스 아키텍처 스타일이다.
REST는 아래와 같은 요소로 구성된다.
자원(RESOURCE) - URI : 자원은 동사가 아닌 명사로 표현
행위(Verb) - HTTP METHOD : 자원에 대한 행위(Create, Read, Update, Delete)를 표현
GET, POST, PUT, DELETE 등이 있다.
표현(Representations) - JSON
REST는 다음과 같은 특징을 가진다.
Uniform (유니폼 인터페이스) : URI를 이용해 통일되고 한정적인 인터페이스로 수행
Stateless (무상태성) : 작업을 위한 상태정보를 따로 저장하고 관리하지 않음
Cacheable (캐시 가능) : HTTP를 사용하기 때문에 캐싱 기능도 사용 가능
Self-descriptiveness (자체 표현 구조) : REST API 메시지만 보고도 이해 가능
Client - Server 구조 : 클라이언트와 서버의 각 역할을 확실하게 구분지어 의존성 저하
계층형 구조 : 다중 계층으로 구성될 수 있으며 네트워크 기반의 중간매체 사용 가능
Django
Django는 파이썬으로 작성된 오픈소스 웹 풀스택 프레임워크이다.
Django는 다음과 같은 장점을 가지고 있다.
빠른 개발 속도
Admin(관리자 인터페이스) 인터페이스 제공
확장성
ORM(Object-Relational Mapping) : 데이터베이스와의 상호작용을 추상화하여 개발자가 SQL문을 직접 작성하지 않아도 객체 지향적인 방식으로 데이터베이스를 다룰 수 있다. (아마 JPA와 비슷한 맥락 아닐까)
Django는 애플리케이션을 확장성있게 만들기 위해 "프로젝트"와 "앱"이라는 개념을 사용한다.
하나의 Django 프로젝트는 여러 개의 앱을 포함할 수 있으며, 각 앱은 다양한 프로젝트에 연결될 수 있다.
프로젝트: 전체 웹 애플리케이션
앱: 프로젝트 내에서 특정한 기능을 제공하는 모듈
Django는 **MVC(Model View Controller)**를 기반으로 한 MTV 디자인 패턴이 적용된 웹 프레임워크이다.
MVC란, Model, View, Controller의 세 가지 주체로 역할을 구분해 애플리케이션을 구분하는 방법이다.
Model : DB에 저장되는 데이터를 의미한다.
View : 유저에게 보여지는 화면을 의미한다.
Controller : 유저의 요청에 따라 적절한 로직을 수행하는 부분을 의미한다.
여기서 Django는 View → Template, Controller → View로 명칭을 바꾸어 MVC와 거의 유사한 구조를 사용하고 있다.
Django 실습
1. 파이썬 가상환경 구축
파이썬은 각각의 프로젝트마다 모듈이나 패키지를 따로 저장하는 node.js나 Java와는 다르게 모듈이나 패키지를 설치할 때 기본 설정이 전역설치이다. 따라서 여러 파이썬 프로젝트들이 한 컴퓨터에 존재한다면 의존성 관리가 매우 어려워지게 된다. (진짜 어려움…)
따라서 Django같이 어느정도 기본적인 규모가 있는 프로젝트는 시작부터 가상환경으로 구성하는 것이 현명한 방법이다.
아래는 Django 프로젝트를 위한 파이썬 가상환경 구성 코드이다.
# zsh 또는 bash 설정을 통해 alias로 python3 -> python 으로 명령어를 바꾸었다. (Mac 기준)# 가상환경 생성 (프로젝트 디렉토리에서 실행)python -m venv {가상환경이름}# 가상환경 실행source venv/bin/activate# 가상환경 종료deactivate
2. Django 설치 및 프로젝트 생성
# Django 설치 (반드시 가상환경 위에서!!!)pip install django# 프로젝트 생성django-admin startproject {프로젝트이름} .# 대부분 프로젝트 이름으로 config를 많이 사용하는 것 같다django-admin startproject config .# 프로젝트 실행# 기본 URL : localhost:8000/python manage.py runserver
3. SECRET_KEY 분리
Django에는 암호화된 세션, CSRF 토큰, 비밀번호 해싱 등 다양한 보안 기능에서 사용되는 SECRET_KEY가 있는데, 외부에 노출되면 안되기 때문에 따로 관리해야 한다. 여기서는 .json 파일에 SECRET_KEY를 옮기고 따로 읽어오는 방식을 선택했다.
config/settings.py 에서 SECRET_KEY 내용을 복사 후 해당 내용을 삭제한다.
# SECURITY WARNING: keep the secret key used in production secret!SECRET_KEY = "시크릿_키"
secrets.json을 프로젝트 최상단에 생성하고 SECRET_KEY를 넣는다.
{"SECRET_KEY" : "시크릿_키"}
그리고 settings.py에서 secrets.json 파일을 읽어오는 코드를 넣어 SECRET_KEY 변수에 할당시킨다.
BASE_DIR = Path(__file__).resolve().parent.parentsecret_file = os.path.join(BASE_DIR, 'secrets.json') withopen(secret_file) as f: secrets = json.loads(f.read())defget_secret(setting, secrets=secrets): # secret 변수를 가져오거나 그렇지 못 하면 예외를 반환try:return secrets[setting]exceptKeyError: error_msg = "Set the {} environment variable".format(setting)raise ImproperlyConfigured(error_msg)SECRET_KEY = get_secret("SECRET_KEY")
gitignore.io에서 손쉽게 Django에 알맞은 .gitignore 를 구할 수 있다.
빠른 가상환경 세팅을 위해 requirements.txt 파일로 패키지 버전을 기록하고 관리한다.
# 현재 패키지를 requirements.txt에 기록하기pip freeze > requirements.txt# requirements.txt에 기록된 패키지 설치하기pip install -r requirements.txt
후기
드디어 기다리던 Django 세션이 시작되었다. 이전에 Django를 한 적은 있었지만 그 당시에는 매우 얕게 공부했었고 지금은 잘 기억이 나지 않기 때문에 새출발하는 마음으로 세션에 참여했다. 그래서 지루할 틈 없이 세션에 집중할 수 있었다는 생각이 든다. 그리고 세션 도중에 예전에 배웠던 Django에 대한 여러 개념들이 약하게나마 머릿속에 새록새록 떠올라 즐거웠다.
항상 드는 생각이지만 파이썬은 모듈/패키지 관리가 정말 고역인 것 같다. 매번 가상환경을 세팅해줘야 하는 번거로움이 파이썬에 재미를 붙이는 것을 방해하는 요인인 것 같다. 패키지를 명령어로 간단하게 설치하고 관리해주는 npm과 비교하면 정말 가슴이 답답해진다…