1. Django 소개
Java에 Spring이 있다면, Python에는 Django가 있다.
Django는 아래와 같은 특징이 있다.
- Batteries Included
- 다양한 사용 가능
- 안정성
- 확장성 좋음
- Maintainable
모 신문사의 웹 팀에서 2003년부터 개발되었으며, 초창기에는 공통 모듈, 코드, 패턴을 뽑아내 재사용하는 형태였고, 그 후 일반적인 웹 프레임워크로 진화했다.
2005년 7월에 오픈소스로 공개되고, 2008년 9월에 1.0버전이 배포되었다.
2. Django의 구조 - MTV 모델
여기서 MTV는 각각 Model, Template, View(코디네이터)를 의미한다.
모델로 자료의 형태를 정의하고,
뷰로 어떤 자료를 어떤 동작으로 보여줄지 정의하고,
템플릿으로 웹 페이지에서 출력할 모습을 정의한다.
URL Dispatcher는 URL이 오면 잡는 부분이고, URL을 설정하는 것은 URL conf이다.
이러한 MTV 방식으로 분리하여 웹 사이트 기능을 관리함으로, 프론트엔드 개발자는 화면 구성에 집중하고, 백엔드 개발자는 화면 뒤의 작업에 집중할 수 있게 된다.
3. 프레임워크 vs 라이브러리
라이브러리는 내가 코드를 짤 때 적절하게 가져오면 되지만,
프레임워크는 일종의 틀이라, 그 틀에 맞게 코드를 작성해야 한다.
4. Django Project와 App
- Project: 웹 사이트의 전체 프로그램
- APP(Application): 모듈화 된 단위 프로그램
장고 무작정 따라하기
아래의 내용을 해 볼 것이다.
- 장고 프로젝트와 앱 생성
- 디렉토리 구조 확인
- 관리자 페이지 확인
- ORM
- URLConf 이해
- 글쓰기, 리스트, 글 보기 구현하기
우선 Django_tutorial이라는 프로젝트를 생성해보자.
위와 같이 서버를 실행할 수도 있고, 아래처럼 실행할 수도 있다.
python manage.py runserver 0.0.0.0:9000
저러면 9000번 포트를 사용하는 것과 같다.
이후 슈퍼 유저를 생성해보자.
이제 해당 위치에서 vscode를 열어보자
위쪽(빈 리스트)이 기본값이고, 위쪽이랑 아래쪽이랑 같다.
ROOT 페이지의 경우, 저 urls.py를 참조한다는 것을 볼 수 있다.
조금 더 내려서, 아래의 내용을 수정해보자.
그리고 TEMPLATES를 수정하자
이렇게 바꾸고 나서, 아래처럼 templates라는 폴더를 꼭 만들어 주어야 한다.
templates BASE 위치를 여기로 설정하겠다는 뜻.
이제 Community App을 만들어보자.
아래의 명령어로 community라는 앱을 만들어보자.
python manage.py startapp community
community라는 프로그램이 담긴 폴더가 생성된 것을 볼 수 있다.
앱을 만들었으니, settings.py에 앱을 사용하겠다고 등록해야 한다.
INSTALLED_APPS에 community를 등록해보자.
근데, community의 앱 이름이 community가 맞나? 한번 확인해보자.
아, community가 name 맞다!
이제 settings.py에 등록해보자.
이렇게 설정을 바꿔주었는데, 이거 서버한테 알려줘야 하지 않나?
아니다. 서버는 설정이 바뀌면 알아서 이를 적용한다.
Community 앱에 메모 입력 기능 구현하기
community 폴더의 models.py에 들어가, 아래와 같이 입력하자
이는 name, title, contents, url, email, cdate라는 이름을 가진 데이터 변수들을 Article이라는 class로 정의한다. 이 모델에 의해 DB와 자연스러운 ORM(Object Relational Mapping)이 수행된다.
모델의 Field 설명은 이 링크(https://docs.djangoproject.com/ko/3.2/ref/models/fields/#django.db.models.Field)에서 확인할 수 있다.
여기서 DateTimeField의 auto_now_add 옵션은 실행 시 실제 시간을 적용한다는 뜻이다.
이제, 이 모델을 DB에 적용시켜보자.
python manage.py makemigrations
이 명령어는 DB 적용코드를 생성한다.
migrations 폴더에 0001_initial.py 파일이 생성된 것을 볼 수 있다.
이제 이 migrate으로 0001_initial.py를 적용해보자.
이제 DBeaver에서 적용된 DB를 확인해보자.
url 패턴 만들기
path('write/', write, name='write')
1. 'write/': url에 붙는 경로
2. write: community의 views에서 정의한 write 함수
3. name='write': path의 이름을 'write'로 설정. 주로 template 파일에서 사용한다.
앱의 View 함수 정의하기
템플릿 폴더의 write.html을 사용한다는 뜻
템플릿 파일 작성(위에서 만든 templates 폴더에 아래 html 파일 생성)
이제 localhost:8000/write/에 접속해 결과를 확인해보자
이제 Hello DJango!를 대놓고 출력하지 말고, 아래처럼 입출력을 이용해보자.
우선, 딕셔너리를 통해 html 템플릿에 데이터를 넘겨보도록 하자.
여기서 'data'는 key, 'hello world~'는 value가 된다.
이제 html을 수정해보자.
다시 localhost:8000/write에 들어가보자.
자, 이제 응용해보자.
별건 아니고, view.py를 아래와 같이 수정해보자.
이제, 사용자가 '입력'할 수 있게 해보자.
우선, Django의 ModelForm을 활용해보자.
위 코드는 django의 ModelForm을 상속받아, 클래스 Meta에 Article과 field 정보를 주어 Form을 쉽게 구현한다.
그러니까, 백엔드 개발자는 프론트엔드 개발자가 만든 ModelForm을 가져와 사용한다고 보면 된다. 백엔드 개발자가 Form을 구성할 필요가 없다는 뜻!
이제 views에 Form을 적용시켜보자
그리고, write.html에 입력받은 form을 활용할 수 있도록 아래와 같이 수정해보자.
여기서 csrf_token의 csrf는 Cross-Site Request Forgeries로, 사이트 요청 위조 공격을 의미한다.
자, 그러니까 저 {% csrf_token %}는 Django에서 암호화를 통해 CSRF Attack을 대처하는 것을 의미한다.
이거 안붙이면 에러 발생한다. 반드시 넣을 것!
개발자모드로 페이지를 확인해보니, 위처럼 html이 이쁘게 작성된 것을 볼 수 있다.
우리가 늘 다루었던 html을 생각해보면, 저 화면을 구성하려고 저 코드를 다 적었을텐데!
Django의 ModelForm으로 편안하게 form을 구성할 수 있었다.
자, 이제 저기에 내용을 입력하고 '확인'을 누르면 데이터를 저장할 수 있겠지?
...는 당연히 안된다. 데이터를 저장할 수 있도록 view를 수정해야 한다.
저 확인 버튼을 누르면 form method에 의해 POST method로 데이터를 전송하게 된다.
여기서 보면, Form(request.POST)는 POST로 받은 데이터를 Form의 형태에 맞게 조절하는 역할을 한다.
아무튼, 이 '데이터가 입력된 폼'을 DB에 입력해야 하는데, 원래 SQL이므로 INSERT문을 써야 할텐데, 대신 save()라는 함수로 쉽게 구현할 수 있다!
한번 위와 같이 데이터를 입력하고 제출해보자.
이제, Admin사이트에 Community 앱을 등록시켜보자.
위의 Settings.py에서 ko-kr로 변경해 한국어로 보인다.
이게 문제가 아니고... community 항목이 보이지 않는다.
아래와 같이 코드를 수정하자.
여기서 데이터를 추가할 수도 있다.
Admin 사이트의 앱 이름, 목록 표시 변경하기
우리가 정의한 Article model을 이쁘게 다듬어보자.
verbose_name_plural은 사용자가 읽기 쉬운 모델 객체의 이름으로 관리자 화면 등에서 표시하는 옵션이다.
__str__은 출력되는 string형태의 목록 표시를 정의한다.
관리자 화면에서 'Community'가 '커뮤니티'로 바뀌고,
목록 표시가 title--cdate 형태로 표시되는 것을 볼 수 있다.
자, 그러면 {self.pk}를 넣어보자. 우선, pk가 뭘까?
이럴땐 DB를 보면 답이 나온다.
저 id가 pk(Primary key)이다. 즉, self.pk나 self.id나 동일한 결과를 출력한다.
즉, 아래와 같이 된다.
models를 수정했기 때문에, makemigrations와 migrate를 수행해야 한다.
지금까지 사용자의 입력을 받아 DB에 저장하는 걸 해보았다.
이제, DB에 저장된 걸 꺼내서 웹에 보여주는 것을 시도해보자.
작성한 리스트(DB) 보기 구현
위를 구현하기 위해, list라는 페이지를(url pattern을) 만들자.
이제, views에 articleList를 정의하러 가보자.
또, list.html을 생성하러 가보자.
저 {% ~~~ %}는 template tag로, Django 전용이다. 여기서는 for문을 사용하기 위해 쓴 걸 볼 수 있다.
article_list가 리스트 형태이므로, python의 for문처럼 사용할 수 있다.
중요한 점은, {%endfor%}를 선언해야 for문이 종료된다는 점이다.
article.cdate 오른쪽의 |date:"~~~"는 cdate 데이터를 입력으로 받아 사용자 정의 출력을 하기 위함이다.
Y는 연도를 M은 ~월을, d는 일자를, D는 요일을 의미한다.
한번 '모든 칼럼'을 출력해보자.
자, 더 이쁘게 꾸며보자.
테이블, CSS를 적용해서 list.html을 작성해보자.
데이터 리스트가 Table 형태로 출력되는 것을 볼 수 있다.
이거는 팁으로,
이렇게 한 상태에서 Ctrl + Shift + P를 누르면
이렇게 뜨는데, 여기에 wrap을 입력하면
이렇게 Emmet이 뜬다.
이걸 선택하고 원하는 태그를 입력하면, 편하게 묶는 것이 가능하다.
마지막으로, 목록에서 클릭해 세부 내용을 볼 수 있는 페이지를 구현해보자.
우선, 세부 내용 보는 페이지에 대한 url 패턴을 생성하자.
주소에 <int:num>이 생성된 것을 기억해두자.
그리고 views에서 viewDetail을 정의한다.
자, viewDetail의 input에 num이 있는 걸 볼 수 있다. 즉, 저 num이 주소 형태를 결정한다고 생각할 수 있다.
우선 view_detail.html을 정의하자.
그리고, list.html에 세부 내용 페이지로 이동할 수 있는 하이퍼링크를 추가하자.
이제 localhost:8000/list로 들어가자
세부페이지로 들어가는 것을 볼 수 있다.
과제: 인덱스 페이지 만들기
인덱스 페이지에 최근 목록 3개가 보이도록 하고, 버튼을 누르면 메모 작성하기(/write)로 가도록 구현하라.
views.py에 다음과 같은 코드를 입력하여라.
<풀이>
우선, url 패턴을 먼저 만들자.
그리고, index.html을 생성하자
이것으로 실습 내용을 정리해보았다.
'Django' 카테고리의 다른 글
미디어 파일 관리하기 (0) | 2022.10.27 |
---|---|
부트스트랩과 정적 파일 적용하기 (0) | 2022.10.27 |
장고 프로젝트에서 앱, 웹 페이지 개발하기 (0) | 2022.10.26 |
Django settings.py, manage.py 정리 (0) | 2022.10.26 |
Djanggo 사용하기 위한 Cmder 환경설정 (0) | 2022.10.25 |