[Django 기초] 3강, 4강

jinsik·2022년 9월 30일
0
post-custom-banner

3강 Django 프로젝트 설계

[T26] 장고(Django) 03강_Django 프로젝트 설계

🏆 Django 프로젝트는 어떻게 설계해야하는지에 대해서 알게 된다.

Django Framwork 흐름도

  1. 클라이언트로부터 request 요청이 온다.
  2. URLConf가 URL에 따라 필요한 함수에 맵핑을 한다.
  3. View에 와서 실행되어야 할 함수가 실행된다.
  4. 실행하는데에 있어서 데이터베이스가 필요하면 Model에 위임한다.
      1. Model은 DB의 데이터를 가공해서 다시 View로 넘긴다.
  1. View가 작업을 마저 하고 응답하기 가장 알맞은 Template를 고른다.
  2. 클라이언트에게 response 응답한다.

URLConf (urls.py)

#in students.urls
urlpatterns = [
    path('student/register/', views.regStudent),
		path('search/', views.searchStudent, name='stuSearch'),
		path('<str:name>detail/', views.detailStudent)
]

#in main urls
urlpatterns = [
		path('student/', include('students.urls')
]
  • 만약 클라이언트로부터 URL로 도메인 뒤에 student/register가 들어왔다면, views에 있는 regStudent 함수를 실행한다.
  • 이 과정을 맵핑(mapping)이라고 한다.
  • 두번째 path처럼 인자를 추가할 수 있다.
  • 세번째 path의 <str:name>은 name 문자열을 매개변수로 받은 형태이다.
  • 네번째 path처럼 다른 애플리케이션에 있는 urls로 넘길 수 있다.
    • include를 쓰려면 django.urls 에서 path와 함께 include를 import 해야 한다.

View (views.py)

def regStudent(request):
		#...
		return HttpResponse()
  • 맵핑될 여러가지 함수들을 정의해 놓는 곳이다.
  • request 객체를 매개변수로 받고 response 객체를 리턴한다.

Model (models.py)

from django.db import models

class Student(models.Model):
    s_name = models.CharField(max_length=100)
    s_major = models.CharField(max_length=100)
    s_age = models.IntegerField(default=0)
    s_grade = models.IntegerField(default=0)
    s_gender = models.CharField(max_length=30)

    def __str__(self):
        return self.s_name
  • 클래스 Student가 DB의 릴레이션이 된다.
  • 클래스의 각 멤버는 field, 데이터 타입과 기본 값, 최대 값들을 지정해 줄 수 있다.
  • 이런 클래스를 이용한 DB의 맵핑 방식을 ORM 방식이라고 한다.

Template (*.html)

INSTALLED_APPS = [
		#...
		'students.apps.StudentsConfig'
]
  • 먼저, settings.py에서 위와 같이 작성하여 접근 가능하게 정의하여야 한다.
#in apps.py
from django.apps import AppConfig

class StudentsConfig(AppConfig):
		name = 'students'
  • INSTALLED_APPS 에서 마지막 줄은 students 디렉토리의 apps.py의 StudentsConfig를 정의해준다.

프로젝트 설정 (settings.py)

  • 앞서 했던 방식처럼 애플리케이션을 설정파일에 등록할 수 있다.
  • 개발모드와 운영모드를 설정 가능하다.
    #in settings.py
    DEBUG = True #개발모드, False면 실제 운영모드
    
    ALLOWED_HOSTS = [] #개발모드면 따로 정의하지 않아도 localhost, 
    									 #운영모드면 서버의 IP 주소를 입력하여야 한다.

기본 사용자 및 그룹 테이블 생성

$ python manage.py migrate
  • 사용자 및 그룹 테이블을 생성한다.
$ python manage.py makemigrations

...

$ python manage.py migrate
  • 데이터베이스의 변경사항을 반영한다.

관리자 계정 생성 및 서버 구동

$ python manage.py createsuperuser
  • 관리자 계정을 생성할 때 관리자 이름과 패스워드를 설정한다.
$ python manage.py runserver 0.0.0.0:8000
  • 서버를 구동하는데, localhost:8000로 접근하면 내 서버에 접근이 가능하다.
  • localhost:8000/admin으로 관리자 페이지에 접속할 수 있다.
    • 관리자로 로그인하면, 사용자 및 그룹 테이블을 생성했기 때문에 Groups, Users 테이블이 있는 것을 확인할 수 있다.

4강 데이터베이스 (ORM)

🏆 데이터베이스의 기본 내용들과 ORM을 이용하여 데이터베이스를 다루는 법을 배우게 된다.

테이블 생성

처음부터의 과정을 살펴보자.

  1. 프로젝트 생성 ($ django-admin startproject 프로젝트이름)
  2. 프로젝트 안에서 애플리케이션 생성 ($ python manage.py startapp 앱이름)
  3. settings.py의 INSTALLED_APP에 ‘students.apps.StudentsConfig’ 넣어서 등록
  4. 사용자 및 그룹 테이블 생성 ($ python manage.py migrate)
  5. 관리자 계정 생성 ($ python manage.py createsuperuser)
  6. 새 터미널 열어서 서버 구동 ($ python manage.py runserver 0.0.0.0:8000)
  7. 관리자 계정으로 로그인 (url: localhost:8000/admin)
  8. 위의 사진처럼 models.py에 테이블 클래스 정의 후 admin.py에 import 후 등록
    • 클래스에서 __str__함수를 정의해야 외부에서 그 속성으로 이름이 표시된다.
  9. DB 변경사항 반영
    1. $ python manage.py makemigrations
    2. $ python manage.py migrate

레코드 다루기

Shell 모드 실행

$ python manage.py shell
>>>
  • Django의 shell 모드를 실행한다.
  • 파이썬의 인터프리터 쉘이 실행된다.

레코드 추가 (Create)

>>> from students.models import Student
>>> qs = Student(s_name='HongGilDong', s_major='computer', s_age=21, s_grade=2, s_gender='M')
>>> qs.save() #DB에 반영!
  • 두번째 줄은 DB에 반영은 아직 안됐지만, 인스턴스를 생성해서 메모리에 올라간 상태이다.
  • qs.save()로 DB에 반영할 수 있다.
  • HongGilDong, HongGilSoon, HongGilJa 3명을 생성하였다.

레코드 읽기 (Read)

>>> qs = Student.objects.all() #QuerySet 타입으로 반환
>>> print(qs)
<QuerySet [<Student: HongGilDong>, <Student: HongGilSoon)>, <Student: HongGilJa>]>

>>> qs = Student.objects.get(s_name='HongGilDong') #Student 타입으로 반환
>>> print(qs)
HongGilDong
>>> type(qs)
<class 'students.models.Student'>
  • Student.objects.all()은 QuerySet 객체로 반환하는데, qs[0] 이런 식으로 인덱싱이 가능하다.
    • 또한 qs[0].s_name과 같이 속성에도 접근이 가능하다.
  • Student.objects.get(s_name='HongGilDong')은 홍길동 한 개만 가져온다.
    • 그러므로 qs.s_name과 같이 속성에 접근한다.
  • 필터 적용해서 가져오는 것은 Student.objects.filter(filter)로 가능하다.
    • 인자로 주는 filter는 속성에 __lt, __lte, __gt, __gte, __contains와 같이 붙여서 필터 조건을 단다.

      >>> qs = Student.objects.filter(s_age__lt=22) #나이가 22보다 작은
      >>> qs = Student.objects.filter(s_age__gte=23) #나이가 23보다 크거나 같은
  • 데이터를 정렬해서 가져오는 것은 Student.objects.order_by(attribute)로 가능하다.
    • 인자로 주는 attribute에 속성을 넣으면 정렬 가능하다.

      >>> qs = Student.objects.order_by('s_age') #나이 오름차순
      >>> qs = Student.objects.order_by('-s_age') #-를 붙여 나이 내림차순

레코드 수정 (Update)

>>> qs = Student.objects.get(s_name='HongGilDong') #인스턴스 하나를 가져온 뒤
>>> qs.s_age = 20 #속성에 접근해서 수정
>>> qs.save() #수정 후 DB에 반영

레코드 삭제 (Delete)

>>> qs = Student.objects.get(s_name='HongGilDong') #인스턴스 하나를 가져온 뒤
>>> qs.delete() #인스턴스 삭제! 주의: delete() 실행 즉시 DB에서 삭제됨
#>>> qs.save() DB에 반영할 필요 없음

배운 내용 정리

  1. 새롭게 배운 것
    • Django Framework가 어떤 흐름을 가지고 있는지 알게 되었다.
    • 프로젝트를 구성하고 있는 여러 요소들(model, view, template 등)이 어떻게 동작하는지 알게 되었다.
    • 사용자 테이블을 만들어 관리자 계정을 생성하고 서버를 구동시켜보았다.
    • managy.py를 이용하여 DB에 반영하는 법을 알게 되었다.
    • DB의 레코드를 ORM 방식으로 기본적인 조작 create, read, update, delete를 해보았다.
  2. 배운 것 중에 모르겠는 것들
    • 서버를 구동할 때 8000번 포트를 이용하는 이유
  3. 모르는 것을 알기 위해 찾아본 것들
    • 구글에 “8000번 포트”로 검색을 해보았다.
    • 그냥 Django의 기본 포트로 8000번 포트를 이용하는 것 뿐이고, 실제 업무에서는 다른 사용하지 않는 포트를 이용한다고 한다.
    • 참고: https://velog.io/@fhwmqkfl/TILPort포트란
profile
공부
post-custom-banner

0개의 댓글