[ 배운 내용 ]
Chapter 1. Django 시작하기
Chapter 2. Django 프로젝트
Chapter 3. Django Model
[ 요약 ]
이번 Web App개발 시간에는 파이썬 기반의 웹 개발 프레임워크인 Django를 배우게 되었다.
장고 프레임워크는 프론트엔드, 백엔드 개발이 모두 가능하다는 특징이 있고, Model, View, Template를 활용한 MVT 디자인 패턴을 사용한다.
오늘은 장고 프로젝트를 생성해보고, 프로젝트 내에 app을 만들었다. 사용자의 요청 URL에 따라서 다른 서비스의 app이 제공되도록 하기 위해 url을 맵핑시키고, SQLite3 DB를 연동시켜서 Model 객체를 통해 DB에 대한 CRUD 처리도 해보았다. 장고는 ORM 방식으로 DB 접근이 가능하기 때문에 SQL 쿼리문을 사용하지 않고도 DB에 대한 작업이 가능했다.
Chapter 1. 장고(Django) 시작하기
웹 애플리케이션의 구조는 일반적으로 프론트엔드(웹클라이언트)와 백엔드(웹서버, 웹애플리케이션, DB)로 이루어져 있고, Django 프레임워크는 모든 부분을 개발이 가능한 파이썬 기반의 풀스택 프레임워크이다.
[ 장고의 특징 ]
- 간결하고 쉬운 파이썬 언어를 사용하기 때문에 배우기 쉽다.
- 많은 라이브러리, 프레임워크 제공으로 쉽고 빠른 개발이 가능하다.
- 확장성이 뛰어나 복잡한 요구사항과 통합이 필요한 개발에 적합하다.
- 불필요한 중복을 없애고, 코드의 양을 많이 줄여서 유지보수, 재사용이 쉬운 디자인 원칙과 패턴을 사용한다.
- 리눅스, 윈도우, 맥OS 등 다양한 운영체제에서 작동한다.
- 비밀번호, 세션, 크로스사이트 요청 위조 등의 보안 취약점을 보완할 방법을 기본적으로 제공한다.
장고에는 다음과 같이 다양한 요소들이 존재한다.
- View : HTTP의 요청을 처리
- Model : DB 처리
- Template : 사용자 인터페이스 처리
- Form : 사용자 입력 데이터 처리
- Static 파일 : 정적 파일 관리
- Media 파일 : 사용자가 업로드한 파일 관리
- Message Framework : 일회성 메세지 처리
- Send Email : 이메일 작성 및 전송
- Admin앱 : 관리자를 위한 쉬운 DB 데이터 관리 UI 제공
- Auth앱 : 사용자 인증에 관련된 서비스 제공
- Session앱 : 사용자별로 사용되는 데이터 서비스 제공
MVT 디자인 패턴
장고는 MVT 디자인 패턴을 사용한다. MVT는 위에서 설명한 Model, View, Template을 의미한다.
- View : 사용자의 요청에 대한 서비스 처리를 담당하며 views.py 파이썬 스크립트에 구현된다.
- Model : DB데이터 처리를 담당하며, models.py 파이썬 스크립트에 구현된다. 장고에서는 Model 객체를 사용해서 ORM 방식으로 CRUD 작업이 가능하기 때문에 SQL 쿼리문을 사용하지 않고 DB를 조작할 수 있다.
- Template : 사용자들이 서비스를 요청할 수 있는 화면 또는 서비스가 처리된 결과 화면 처리를 담당하며 HTML파일로 구현된다.
장고 개발환경 구축하기
[ 장고 공식 문서 & 장고 코드 깃허브 저장소 ]
https://www.djangoproject.com/
The web framework for perfectionists with deadlines | Django
Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code
www.djangoproject.com
https://github.com/django/django/tree/main/django
GitHub - django/django: The Web framework for perfectionists with deadlines.
The Web framework for perfectionists with deadlines. - GitHub - django/django: The Web framework for perfectionists with deadlines.
github.com
- 장고 설치 (실습에서는 3.2버전 설치)
# 설치
pip install Django==3.2
# 버전 확인
django-admin --version
# django-admin 커맨드 확인
django-admin help -commands
[ vscode 개발 환경 세팅 ]
- vscode 환경에서 개발하기 위해 파이썬과 장고 익스텐션을 설치해준다.
Chapter 2. Django 프로젝트
장고에서는 웹 사이트 또는 웹 애플리케이션을 프로젝트(project) 라는 이름으로 지칭한다. 즉, 장고 프로젝트는 웹사이트를 의미하고, 웹사이트 내에는 사용자에세 서비스를 제공하는 여러 기능들이 있는데, 이 각각의 서비스 기능들을 제공하는 것이 앱(app)이다.
예를 들면 YES24라는 몰 자체가 하나의 프로젝트이고, YES24 내에서 국내도서, 외국도서, ebook 등의 서비스를 각각의 다른 app들이 제공한다고 보면 되겠다.
따라서 하나의 프로젝트는 여러 개의 App으로 이루어진다.
- 장고 프로젝트 생성
django-admin startproject 프로젝트이름
프로젝트를 생성할 폴더로 이동해서 위의 커맨드로 myproject라는 이름의 장고 프로젝트를 생성했다. 왼쪽과 같이 프로젝트 이름의 폴더가 생성된 것을 볼 수 있고, 프로젝트 폴더의 구조는 다음과 같다.
프로젝트의 루트폴더에서 여러 app들을 추가해 줄 수 있다.
프로젝트와 같은 이름으로 생성되는 하위 폴더 (myproject)에는 각종 환경설정 파일이 들어 있다.
manage.py은 개발 중인 장고 프로젝트의 개발 과정에서 필요한 여러 작업을 실행시켜주는 커맨트 유틸리티이다. manage.py 파일을 통해 app 생성, 웹서버 실행, DB Migration 등의 작업이 가능하다.
settings.py 파일은 현재 장고 프로젝트의 환경설정 파일이다.
- manage.py 유틸리티 사용 형식은 아래와 같다.
python manage.py <커맨드> [옵션]
프로젝트를 생성하고 나서 장고 프로젝트에서 기본적으로 제공하는 Model을 내 DB에 반영하기 위해 migrate를 한 번 해준다. admin, auth, ..등 장고의 기본 app들에 대한 migrate가 수행되는 것을 볼 수 있다.
python manage.py migrate
manage.py 유틸리티를 사용해서 한번 장고의 웹서버를 실행시켜 보자 (장고에서 기본적으로 제공하는 웹서버가 있다.)
python manage.py runserver
실행 시 나오는 로컬호스트 주소로 접속해보면 장고 웹서버가 실행된 것을 확인해볼 수 있다.
- 장고 App 생성
myproject 장고 프로젝트에 한번 myapp이라는 장고 app을 생성해보자
python manage.py startapp myapp
명령어를 실행하고 나면 프로젝트 폴더 내에 myapp이라는 폴더가 생긴다.
- 장고 App 등록
app을 생성하면 끝이 아니라 생성한 app을 장고 프로젝트에 등록해주는 절차가 필요하다.
myproject/settings.py 파일의 INSTALLED_APPS 변수를 확인해보면 현재 장고 프로젝트에서 서비스 하고 있는 app들을 볼 수 있다.
INSTALLED_APPS에 myapp을 추가해주었다. (위쪽에 추가해주자!! 아래에 추가하니까 이후 과정에서 app을 못찾는 오류가 나는것 같다.)아래에 있는 app들은 기본적으로 장고 프로젝트에서 제공되는 app들이다. admin app같은 경우에는 관리자가 웹으로 접속해서 DB를 편리하게 관리하는 것을 지원해준다.
사용자가 장고 프로젝트의 app에서 제공하는 서비스를 받으려면 URL을 통해 웹 서버에 요청을 보낸다.
요청 URL은 [프로토콜][서버주소][포트번호][자원정보] 같은 형식으로 보내질텐데 이 중 자원정보에 형식에 맞게 URL과 장고 app의 View를 맵핑시켜주어야 한다.
예시로 사용자가 https://x.x.x.x:8000/edu/test.html 라는 요청을 보냈다고 해보자. 포트번호인 8000 뒤의 정보들로 사용자는 웹 페이지에서 접근하려는 서비스를 명시한다. 이 부분을 URI라고 하고, 위의 예시는 서버의 edu라는 디렉토리의 test.html파일로 접근하려는 경우가 될 것이다.
지금 만든 장고 프로젝트의 경우 https://localhost:8000/myapp으로 접근하면 myapp으로 접근이 가능하도록 URL과 View를 맵핑시켜주자.
프로젝트의 가장 ROOT 경로는 myproject/settings.py 파일에서 확인 가능하다.
ROOT_URLCONF 변수에 지정된 값으로 사용자의 URL 요청 시 어느 서비스로 접근할지가 정해진다.
ROOT_URLCONF = 'myproject.urls' 는 myproject/urls.py 파일로 접근한다는 것을 의미한다.
myproject/urls.py 파일을 보면 urlpatterns변수에 리스트 형식으로 요청 주소에 따른 맵핑이 되어 있다.
요청이 오면 가장 처음 접근은 이곳으로 하게 되고, 여기서부터 원하는 서비스까지 요청이 가도록 경로를 지정해주는 것이다.
myproject의 urls.py 파일 하나에 전체 프로젝트의 모든 서비스에 경로를 맵핑시킬 수도 있지만 그렇게 했을 경우, 프로젝트의 크기가 커지면서 서비스의 종류가 많아질 경우 관리가 매우 어려워진다. 따라서 계층적인 구조로 프로젝트의 urls.py 파일에서 각각의 app의 urls.py파일로 맵핑을 시켜주고, 각 app의 urls.py에서 특정 기능을 위한 View를 맵핑시켜주는 것이 좋다.
myapp 서비스로 안내를 해주기 위한 urls.py파일을 myapp폴더에도 만들어주고 이 파일을 프로젝트의 urls.py파일에서 맵핑시켜주었다. ~:8000/myapp/test1 주소로 요청을 보낼 경우 HELLO!!!!를 출력하도록 해보자
- path('myapp/', include('myapp.urls')) : ~:8000/myapp 의 주소로 요청이 오면 myapp/urls.py로 가도록 맵핑 (URL에 따라 이동할 app을 지정)
- path('test1/', views.test1) : ~:8000/myapp/test1 의 주소로 요청이 오면 같은 폴더의 views.py 모듈의 test1 메서드 호출 (URL에 따라 실행해 줄 View 메서드를 지정)
이제 myapp 폴더의 views.py 모듈에 test1 메서드를 생성해준다.
각 서비스의 views.py 파일을 통해 처리할 서비스의 로직을 작성해줄 수 있다.
View에서 함수의 첫번째 인자는 요청 URL의 요청 정보(HttpRequest)가 되어야 하고, 반환값으로는 응답 정보(HttpResponse)가 있어야 한다.
HTTP 요청에 대한 응답을 위해 django.http의 HttpResponse 객체를 리턴해준다. HttpResponse 안에 들어 있는 값이 응답의 body값으로 들어가서 전송된다. (django.http에는 http 요청과 응답에 대한 객체들이 있다.)
localhost:8000/myapp/test1로 접속하면 HELLO!!!가 뜨는 것을 볼 수 있다.
URL에 <변수>와 같은 형식으로 Path변수를 선언해서 URL 문자열 일부를 View함수의 인자로 전달해줄 수 있다. <int:변수> 형식으로 변수 타입을 변환시켜서 전달하는 것도 가능하다.
방금 만든 test1메서드에 no라는 인자를 추가해주고, ~:8000/myapp/test1/no 요청으로 no에 입력된 값을 정수로 변환해서 HELLO와 함께 출력하도록 해보자.
http://127.0.0.1:8000/myapp/test1/123로 접근한 결과는 다음과 같다. 123이 같이 출력된다.
Chapter 3. Django Model
장고에서 Model은 DB에 대한 작업을 담당한다.
장고에서는 객체를 사용해서 DB로 접근하는 ORM (Oriented Relational Mapping) 방식을 지원하기 때문에 SQL문 없이, 객체를 사용해서 DB에 대한 CRUD 작업이 가능하다.
장고의 models.Model 클래스를 상속받는 객체들은 DB의 테이블을 의미한다.
Model 객체의 인스턴스는 하나의 row를 의미한다.
myproject/settings.py 파일에서 DB 환경설정이 가능하다.
기본적으로 SQLite3가 설정되어 있고, MySQL, oracle 등으로 설정도 가능하지만 실습에서는 sqlite를 사용했다. sqlite3는 파일 형식으로 DB가 저장돼서 바로바로 보기 편하다는 장점이 있다. 실제 업무에서는 쓰일 일이 거의 없지만 공부 과정이니 사용해보자.
'ENGINE'은 장고와 DB를 연결하는 부분이다.
- myapp/models.py 모듈에 Model 객체(테이블)을 생성해주자.
models.Model 클래스를 상속받아야 DB 테이블로 사용되는 객체가 만들어지고, models의 ~Field() 형식의 메서드로 칼럼의 자료형을 지정해준다.
name, hobby, age 필드를 갖는 Friend라는 Model 객체를 만들어주었다.
아래의 __str__ 메서드는 파이썬에서 기본적으로 제공하는 메서드로 인스턴스를 변수에 할당 시 객체가 아니라 지정한 필드값으로 확인 가능하도록 설정해준 것이다.
DB 테이블을 실제로 생성하려면 Migration 작업을 해주어야 한다.
테이블을 생성하기 위한 Migration 절차는 다음과 같다.
- Model 객체 생성
- Migration File 작성
- Migration DB에 반영
Model 객체는 만들었으니 2,3번 과정을 수행해주자.
2번 과정을 통해 DB에 반영하기 직전 반영할 내용을 파일로 먼저 만든다. 이후 3번 과정을 통해 DB에 실제 마이그레이션 파일의 내용대로 반영이 된다.
# Migration 파일 생성
프로젝트폴더>python manage.py makemigrations myapp
# Migration을 DB에 반영
프로젝트폴더>python manage.py migrate myapp
Migration 파일을 생성해주면 myapp/migrations폴더에 파일이 새로 생긴다.(0001_initial.py)
이 파일이 마이그레이션 파일이다. primary key와 id칼럼은 따로 준 적이 없는데 파일을 보면 알 수 있듯이 없으면 장고가 자동으로 primary key로 쓰일 칼럼을 생성해준다. 디폴트로는 SQL의 AUTO INCREMENT와 같이 1부터 1씩 증가하는 값을 부여해주는 id 칼럼을 생성해준다.
이제 진짜 마이그레이션을 DB에 반영해주었다.
DB Brower for SQLite를 사용해서 sqlite3 db파일을 확인해보자. 프로젝트 폴더 안에 sqlite3 파일이 있는 것을 볼 수 있다.
DB 테이블을 확인해보면 myapp_friend라는 테이블을 볼 수 있다. Model 객체를 이용해서 테이블을 생성할 때 기본적으로 소문자로 'app이름_Model객체이름' 형식의 이름을 갖는 테이블이 만들어진다.
이 테이블을 열어서 보면 테이블과 필드가 잘 생성된 것을 볼 수 있다.
이제 ORM 방식으로 테이블에 값을 추가해보자. 값을 추가하는 방법으로는 장고에서 기본적으로 제공하는 admin app을 통해 웹 UI를 활용해 간편하게 추가하는 방법도 있다. 하지만 멋이 안나니 코드를 입력해서 추가해보도록 하자. (admin app 방식은 강의록 참고하기)
프로젝트의 환경값을 그대로 받아오면서 쉘 스크립트를 작성하기 위한 장고 쉘을 열어주었다.
python manage.py shell
f1이라는 변수명에 Friend() 객체의 인스턴스를 생성해주었고, 각 필드의 값을 넣어주었다. f1 인스턴스는 하나의 레코드(행)을 의미한다. 인스턴스에 레코드를 만들어주고 나면 반드시 .save()를 해주어야 DB에 반영이 된다.
f1, f2 2개의 인스턴스에 레코드 값을 만들고 save()를 해주었다.
DB를 확인해보면 값이 들어간 것을 볼 수 있다.
모델객체.objects.all() 명령어를 통해 해당 테이블의 모든 인스턴스(레코드)들을 확인해볼 수 있다. (인스턴스들은 리스트 형식으로 반환)
(SQL의 SELECT * FROM myapp_friend)와 같음
다음의 SQL문처럼 조건에 대한 조회도 가능하다.
SELECT *
FROM myapp_friend
WHERE id=1
모델객체.objects.get(필드=값)
데이터의 수정도 인스턴스를 통해 가능하다. 데이터 수정 시에도 .save()를 해주어야 DB에 적용된다.
.delete() 메서드로 데이터의 삭제도 가능하다. ( save()안해도 됨 )
이제 myapp의 View를 통해 DB에 접근을 할 수 있도록 해보자.
~:8000/myapp/getdb/id URL의 id값과 일치하는 id값을 갖는 Friend 테이블의 name값을 화면에 출력해주도록 하려고 한다.
먼저 myapp/getdb/<id> 요청 시 views.py모듈의 getdb 메서드로 가도록 URL 맵핑을 해주었다.
그 다음 views.py 모듈에서 getdb메서드를 정의해주었다. 이 때, 존재하지 않는 id값이 요청될 경우의 오류처리를 위해 django.shortcuts의 get_object_or_404 메서드를 사용해준다. 이는 try catch 문 등의 처리도 가능한데 get_object_or_404 메서드는 모델.objects.get(필드=값) 과 try-except 를 모두 결합해준 메서드기 때문에 코드가 훨씬 짧고 간편해진다.
get_object_or_404(Model객체명, 필드=값)
models.py모듈의 Friend 객체를 임포트 해주고, 인자로 받은 id값에 맞는 레코드의 name값을 반환해준다.
id=3값으로 접근했을 땐 아래와 같이 404 오류 처리가 된다.
'KT AIVLE School' 카테고리의 다른 글
(18주차 - 22.11.15) Web App 개발3 - 장고(Django) ORM, Form (0) | 2022.11.17 |
---|---|
(18주차 - 22.11.14) Web App 개발2 - 장고(Django) Template, Model간 관계 설정 (0) | 2022.11.14 |
(17주차 - 22.11.09~22.11.10) SQL - MySQL (0) | 2022.11.09 |
(17주차 - 22.11.07~22.11.08) 웹 프로그래밍 - 자바스크립트 (JavaScript), Vue.js (0) | 2022.11.07 |
(16주차 - 22.11.03~22.11.04) 가상화 클라우드2 - 쿠버네티스(k8s) (0) | 2022.11.03 |