프로젝트를 무사히 만들고 샘플 페이지도 브라우저에 띄워 보았다. 이어서 settings.py 라는 프로젝트에 대한 구조? 속성? 을 담고 있는 파일을 공부해볼까 하다가... 장고에서 사용하는 프로젝트 Project 와 앱 Application 의 개념을 한번 정리하고 넘어가는 것이 좋을 것 같아서 끊기 신공을 한 번 더 사용해볼까 한다.
우리가 이전 포스팅에서 만든것은 프로젝트 Project 이다. PMP 자격 시험을 본 적이 있거나 프로젝트 관리에 대한 수업을 들어 보았다면 프로젝트는 여러개의 서브 프로젝트로 나뉘어 질 수도 있고, 프로젝트들이 모여서 프로그램을 이루고 어쩌고 하는 이야기들을 들어보았을 것이다. 장고에서도 동일한 개념일까? 이럴때에는 가장 좋은 것이 공식 문서를 보는 것!
길다. 하지만 볼드체가 있으니 차근히 살펴보도록 하자. 첫 문장 가라사데, <프로젝트 Project 라는 용어는 장고 웹 어플리케이션을 말해>. 와닿지 않는다. 조금 더 읽어보면, <프로젝트라 불리우는 파이썬 패키지는 settings 모듈로 정의되긴 하지만 다른 것들도 많이 포함하고 있어> 라고 한다. 이후에 이어지는 명령과 생성되는 파일은 우리가 지난 포스팅에서 봤던 것들인데... 요약하면 프로젝트는 하나의 큰 패키지와 같은 것! 이라는 느낌이다.
세번째 문단에 오니 앱 혹은 어플리케이션에 대한 이야기를 하고 있다. <어플리케이션 Application 이라는 용어는 몇 가지 기능을 제공하는 파이썬 패키지를 말해> 라니... 그 다음 문장에 재활용 가능하다는 것을 보면 <프로젝트를 구성하는 기능의 집합 단위를 어플리케이션이라고 함> 정도가 될 수 있을 것 같다.
가령 커뮤니티 사이트를 만드는 프로젝트라고 하면, <커뮤니티 사이트> 자체가 프로젝트의 개념이고, 그 안에서 사용되는 <게시판>, <쇼핑몰>, <개인정보관리기능> 같은 것들이 어플리케이션이라고 보면 무난할 것 같다. 그렇다면 우리가 지난 포스팅에서 프로젝트를 만든 이후에 해야할 것은 무엇일까? 바로 어플리케이션을 만드는 것이다.
그럼 다음 포스팅에서 프로젝트 하위에 어플리케이션을 만드는 것을 해보고, 그 다음에 settings.py 를 살펴보는 것으로 해보자. 순서야 어떻든 우리가 필요한 것을 잘 이해하면 되는 거니까...!!
파이썬에서 사용되는 웹 프레임워크 중 널리 사용되는 것이 장고 Django 와 플라스크 Flask 이다. 둘 다 장단점이 있겠지만 대략 어깨너머로 본 것과 바람을 타고온 이야기를 종합해보면 장고가 조금 더 강력하고 무거운 것 같다. 반면 플라스크는 조금 가볍고 빠르게 웹 기반 산출물을 만들기 좋은 듯 하다. 아니라고? 아니어도 어쩔 수 없다. 파이썬도 잘 모르지만 파이썬의 웹 프레임워크도 아직 잘 모른다. ;;
어찌되었건 근래에 다루고 있는 코드가 장고 기반이라 하나하나 부딪혀가며 과제를 진행시키고는 있지만 밑바닥부터 한번 정리하면서 장고에 대한 지식을 정리해 보고자 한다. 이미 장고를 많이 다뤄본 사람이라면 굳이 읽지 않아도 되는 초보자의 공부 이력이니 응원의 하트나 댓글 정도를 남겨주면 좋겠다. :-)
장고 프레임웍의 설치
장고 프레임웍이 로컬 환경에 설치되어 있다는 것을 가정했다...라고 적다가 혹시 모르니 pip 를 이용해서 장고 패키지를 설치하고 확인하는 절차를 정리해 본다. (...라고 적지만 나중에 까먹을까봐 적어둔다. 나이들어봐라, 기억력이 팍팍 감소한다 ㅜㅜ)
// 장고를 설치한다. jango 가 아니다, django 다
% pip3 install django
// 설치가 잘 되었는지 확인한다
% python3 -m django --version
2.2.6
물론, Symlink 등이 걸려 있어서 pip3 대신 pip 일수도 있고 python3 대신 python 이나 py 일수도 있다. 각자의 환경에서 동작하는 무언가가 있을테니 잘 찾아서 장고 프레임웍을 설치하면 된다. python3 를 쓰는 것이 좋은데 아마도 새로 시작하면서 2 를 쓰는 경우는 없을거라 생각한다.
프로젝트 생성
장고가 설치되었다면 django-admin.py 혹은 django-admin CLI 도구를 이용하여 프로젝트 생성을 할 수 있다. 물론, 이 도구는 더 많은 것들을 제공하는 장고 관리의 총아이니 앞으로도 종종 이 도구의 명령을 언급하게 될 것인다.
// 명령도 참 많다. 심지어 Core Command 만 모아서 보여준거라는 친절한 안내가 같이 나와 있다
% django-admin
Type 'django-admin help <subcommand>' for help on a specific subcommand.
Available subcommands:
[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
runserver
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).
프로젝트를 시작한다를 영어로 표현하면? startproject 이다. 띄어쓰기는 어디갔을까? 라고 태클은 걸지 말자. 위의 코드 블럭에 붙여 놓은 것처럼 startproject 로 붙여 써야 한다. 영어 수업시간이 아니라 장고 수업시간이니 그렇구나 하고 넘어가자! ㅎㅎ 그럼 프로젝트를 만들고 무엇이 생성되는지 확인해 보자
// 현재 경로는 ./dev/django-study 다.
% django-admin startproject nopd
nopd 라는 폴더가 생성되고 그 안에는 manage.py 가 있고 또 동일한 이름의 폴더 nopd 가 생성되었다. 하위 경로에 생성된 nopd 폴더 하위에는 4개의 python 파일이 생성되었다. 프로젝트에 대한 전반적인 정보를 담고 있는 파일이 settings.py 인데, 프로젝트의 시작은 이 파일에 필요한 내용들을 기술하는 것에서 시작된다고 한다.
폴더명이 동일하게 두개가 생성되는 등 시작부터 뭔가 마음에 들지 않는다. 하지만 먹고 살기 위해서는 장고를 잘 익혀둘 필요가 있으니 절단 신공으로 settings.py 설정에 대한 내용은 다음 포스팅에서 이어가 보도록 하겠다. 다들 알지 않는가? 시작이 반이다. 다만 맨날 시작만 해서 문제지만... 끝까지 함 가보자. 아, 기왕 여기까지 온 김에 실행이라도 한번 해보자!
개발용 웹 서버로 장고 프로젝트 실행하기
// manage.py 를 이용하여 개발 서버를 실행할 수 있다
% python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 30, 2020 - 07:37:06
Django version 2.2.6, using settings 'nopd.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
브라우저를 열고 http://127.0.0.1:8000/ 으로 접근하면 아래와 같은 화면을 볼 수 있다. 이야기 했지 않은가? 시작이 반이라고. 벌써 브라우저에 뭔가가 나오기 시작하는 것이 가슴이 웅장해지는 느낌이 들 것이다. 필자도 그랬다. 그런데 가슴만 웅장해지면 안되지 않겠는가? 우리는 계속 공부를 해나가야 한다. 학창시절에 그랬던 것처럼...
어떤 언어를 사용하던 문자열 포맷팅은 꽤 짜증스러운 부분입니다. 화면에 출력을 하던 파일에 내용을 쓰던 다양한 문자열 포맷팅을 사용해야만 합니다. 문자열 포맷팅이 데이터베이스와 같이 민감한 요소를 액세스 하는데 사용된다면 (가령 쿼리 문장 같은...) 포맷팅 이전에 SQL Injection 과 같은 악의적인 공격도 감안해야 하기 때문에 더 신경을 써야만 합니다.
자바스크립트를 오랫동안 사용하면서 유레카를 외쳤던 때가 있었습니다. 물론 자바스크립트도 계속 진화하고 있기 때문에 Wow 한 순간들이 여러번 있었지만, 그 중에서도 가장 기억에 남는 것은 ES6 에서 도입된 템플릿 문자열이었습니다. 일반적으로 변수를 선언하거나 문자열을 만드는 과정에 백틱(`)을 이용해 변수나 메서드를 변수에 직접 바인딩 할 수 있게 해주는 방법이었습니다.
// Javascript ES6 에 도입된 템플릿 문자열
console.log(`Default ENV value is ${process.env.MY_VALUE}`);
파이썬으로 코드를 만들면서도 <당연히> 문자열을 핸들링 해야 하는 상황이 계속 발생했습니다. 디버깅 로그에서부터 사용자 콘솔 화면에 뿌려줄 응답 결과, 데이터베이스 쿼리문에 까지 당연한 일이었습니다. 오래전 방식으로 문자열을 + 로 연결하는 작업을 하다보니 `ES6 에서의 템플릿 문자열 같은게 없을까?`하는 궁금증이 생겼습니다. 네, 이 글을 적고 있으니 당연히 방법을 찾았겠지요?
자바스크립트에서 ES6 이상에서만 템플릿 문자열을 쓸 수 있는 것처럼 파이썬 역시 Python 3.6 이후 버전에서 비슷한 역할을 하는 f-Strings 가 추가되었습니다. f-Strings 라고 이름 붙인 연유는 찾아보지 않았지만 문자열을 묶어주는 따옴표 앞에 f 를 붙여야만 이 기능을 쓸 수 있기 때문에 그냥 그렇게 이름을 지었구나... 참 엔지니어스럽다 라는 생각을 하고 넘어갔습니다.
# Print 문에서 f-Strings 사용하기
print(f"- Start update : {_domain}/{_property}")
# 문자열에서 f-Strings 사용하기
log += f"- Start update : {_domain}/{_property}\n"
# f-Strings 로 LIST 바인딩하기
log += f"- No metadata found ({result['title']})\n"
대표적으로 f-Strings 를 사용한 예시들입니다. 문자열이 필요한 모든 곳에 사용할 수 있습니다. 자바스크립트 ES6 에서는 ${} 였다면 파이썬 에서는 {} 입니다. 브레이스 안쪽에는 직접 변수명이 들어가거나 내부 함수, 메서드 등이 모두 활용될 수 있습니다. 이런 형태의 문자열 조립이 좋은 이유는 정확하게 출력되는 결과를 인지할 수 있다는 점이겠지요? 아래와 같은 형태에서는 가독성도 떨어지고 무슨일이 일어날지 짐작하기가 어려우니까요.