장뽀장뽀! 구조 뽀개기!

ensia96·2020년 5월 5일
0
post-thumbnail

슈퍼개발자, 춤추는망고입니다.

( 춤 안춥니다. )





이번 시리즈는...

백엔드로 가는길,

장뽀장뽀! 장고 뽀개기!


입니다.
( 우와아아아앙아ㅏㅏㅏㅏ~!!!! )












주의!

이번글은 초 슈퍼 헉헉쓰 복잡합니다!

( 게보린같은 두통약을 옆에 두고 읽으시는 것을 추천! )





지도쓰!

터미널에서 프로젝트 폴더에 위치하신 뒤,

' tree ' 명령어를 쳐서, 아래와 비슷한지 먼저 확인해주세요!

mango_project
    ├── make_juice
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── mango_project
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-38.pyc
        │   └── settings.cpython-38.pyc
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

이 글에서

' / ' 라는 것은

컴퓨터가 디렉토리 ( 현재위치 ) 를 구분할때 사용하는 기호에요!

Project 는

헷갈리지 않는 설명을 위해 프로젝트이름 대신 써놓은 거에요!

App 은

헷갈리지 않는 설명을 위해 기능이름 대신 써놓은 거에요!



현재 위치와 설명중인 파일을,

지도와 함께 적어드릴게요!











그럼, 시작할게요!












장고! 너 안에 그거 뭐야?






/manage.py

: 핵심 프로그램 ( 총괄적인 실행자 )

( Project 에 대한 전반적인 제어를 담당해요! )

mango_project                <- 현재 설명하는 폴더위치
    ├── make_juice
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py            <- 현재 설명하는 파일위치
    └── mango_project
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-38.pyc
        │   └── settings.cpython-38.pyc
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

기능쓰!

Python 으로 manage.py 를 실행할 때,

' python manage.py ' 명령어 뒤에 아래의 명령어를 붙여주면,

그에 맞는 기능을 실행할 수 있어요!

shell : Project 내용을 interpreter 로 제어
migrate : DataBase 연동 ( Django 의 모델을 DB 로 이주시킴 )
test : App 에 대한 테스트 환경 동작
runserver : Project 서버 구동






/project/settings.py

: 프로젝트의 전체적인 설정 프로그램

mango_project
    ├── make_juice
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── mango_project        <- 현재 설명하는 폴더위치
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-38.pyc
        │   └── settings.cpython-38.pyc
        ├── asgi.py
        ├── settings.py      <- 현재 설명하는 파일위치
        ├── urls.py
        └── wsgi.py

설정항목쓰!

최대한 순서에 맞게 적어뒀어요!

BASE_DIR : root 디렉토리 위치 설정

SECRET_KEY : 서버의 암호화키 ( 노출되서는 안되요! )

DEBUG : 개발환경에서만 사용해야하는 설정 ( 디버깅 기능이 서버구동을 멈출수도 있음! )

ALLOWED_HOSTS : 서버에 접근권한을 줄 호스트를 지정 ( 아무나 주면 안됨! )

INSTALLED_APPS : Django 인스턴스에서 활성화된 모든 어플리케이션들의 이름

	- 다수의 프로젝트에서 사용가능, 패키징하여 배포도 가능함.
	- 기능을 만들었다면, 여기에 등록해야 쓸 수 있음.
	( # 은 Django 를 API 서버로만 동작시킬땐, 필요없는 기능 )

	# django.contrib.admin - 장고 자체 관리용 사이트
	# django.contrib.auth - 장고 자체 사용자 인증 시스템
	django.contrib.contenttypes - 컨텐츠 타입을 위한 프레임워크
	django.contrib.sessions - 세션 프레임워크
	django.contrib.messages - 메세징 프레임워크
	django.contrib.staticfiles - 정적 파일담당 프레임워크

MIDDLEWARE : Django 에서 활성화된 매개기능들

	( # 은 Django 를 API 서버로만 동작시킬땐, 필요없는 기능 )

	'django.middleware.security.SecurityMiddleware',
	'django.contrib.sessions.middleware.SessionMiddleware',
	'django.middleware.common.CommonMiddleware',
	# 'django.middleware.csrf.CsrfViewMiddleware', -> XSS 와 비슷한 방식의 페이지 변형 공격을 방지
	# 'django.contrib.auth.middleware.AuthenticationMiddleware', -> 장고 자체 사용자 인증 시스템관련 기능
	'django.contrib.messages.middleware.MessageMiddleware',
	'django.middleware.clickjacking.XFrameOptionsMiddleware',

ROOT_URLCONF : 기준 url 지정파일 참조

TEMPLATES : 템플릿 관련 설정

WSGI_APPLICATION : 앱 구현방식 지정

DATABASES : DataBase 에 대한 설정

	ENGINE : DataBase 엔진 지정
	NAME : DataBase 의 파일명을 포함한 절대경로값

	( 이외에도, USER, PASSWORD, HOST 등의 추가설정 필요 )

AUTH_PASSWORD_VALIDATORS : 로그인 프로세스의 암호 분별관련 기능

LANGUAGE_CODE : 관리페이지 언어 ( 한글쓰! = 'ko' )

TIME_ZONE : 기준 시간대 설정 ( 서울쓰! = 'Asia/Seoul' )	    

STATIC_URL : 정적문서가 담길 디렉토리 지정

STATIC_ROOT : 정적경로 지정

참고쓰!

- 기준 시간대 관련자료쓰!

- 기본설정에는 없지만, RESTful 한 구성을 유지하는데 도움을 주는 설정값!

APPEND_SLASH = False

-> Django가 자동으로 경로탐색을 할 때, ' / ' 를 추가하지 않음!






/project/urls.py

: URL 구성 정의 프로그램 ( 인식자 정의자 )

mango_project
    ├── make_juice
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── mango_project        <- 현재 설명하는 폴더위치
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-38.pyc
        │   └── settings.cpython-38.pyc
        ├── asgi.py
        ├── settings.py
        ├── urls.py          <- 현재 설명하는 파일위치
        └── wsgi.py

- 역할쓰!

URI 주소값으로 ' 사용될 자원의 위치 ' 를 표현

- 구성 메소드쓰!

' 크게 두가지로 이루어져있다 ' 라는 느낌만 가지셔도 되요!

- include() : Project 내의 다른 URL 패턴을 포함하는 메소드
	      ( App 내의 URL 패턴을 참조하는데 주로 사용 )

- path() : URL 패턴에 맞는 자원을 호출하는 메소드
	   ( 기능에 맞는 URL 을 지정하는데 주로 사용 )

	필수인자인 route, view 와 선택인자인 kwargs, name 를 가짐

	필수인자 1. route : URL 패턴을 가진 문자열

	      - 요청이 처리될 때, Django 는
		url 의 첫 번째 패턴부터 일치하는 패턴을 찾을 때 까지
		요청된 URL 을 각 패턴과 리스트의 순서대로 비교함.

	      - GET 이나 POST 방식의 매개 변수들,
		혹은 도메인 이름검색 X

	      - 예를 들어,

		https://www.example.com/myapp/ 이 요청된 경우,
		URLconf 는 오직 myapp/ 부분만 바라봄.

		https://www.example.com/myapp/?page=3 같은 요청에도,
		URLconf 는 역시 myapp/ 부분만 바라봄.

	필수인자 2. view :

		Project 에서 route 와 일치하는 패턴을 찾으면,
		실행할 특정한 view 함수를 지정함.

		* 여기서 view 함수란,
		  App 의 views.py 파일에서 지정한 함수
		( 요청으로 온 HttpRequest 객체를 첫번째 인자로,
		  요청된 경로로 부터 '캡처된' 값을 키워드 인자(kwargs)로 하여
		  실행되는 함수 ) 

	선택인자 1. kwargs :
		view 에 키워드 인자(kwargs)형태로 전달되는 딕셔너리 형태의 인자

	선택인자 2. name :
		path 에 정의한 view 함수 호출에 대한 이름을 지정
		URL naming 을 하면,
		Project 어디에서나 명확하게 참조할 수 있음. (템플릿 포함)
		하나만 수정해도 Project 내의 모든 URL 패턴을 바꿀 수 있음.

추가쓰!

1. include() 메소드를 이용해, App 내부의 URL 정의를 참조할 수 있어요!

  • App 안에 urls.py 를 새로 만들기만 하면 되요!

2. ' RESTful 한 API 구성 ' 을 하기 위해선, urls.py 를 잘 정의해야 해요!






/app/views.py

: App 의 Logic 지정자

mango_project
    ├── make_juice            <- 현재 설명하는 폴더위치
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py          <- 현재 설명하는 파일위치
    ├── manage.py
    └── mango_project
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-38.pyc
        │   └── settings.cpython-38.pyc
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

View 란?

Python 의 메소드와 클래스를 기반으로 정의된 Logic 덩어리

쉽게 말하자면, Django 개발자가 구현한 기능

현 세대의 웹 개발에서는 주로 API 를 정의하는데 사용.

원래, 페이지를 보여주는 템플릿에 대한 기능 부분이 있었는데,

기능을 동작하게 하는 부분으로 사용방식을 바꿨다고 한 부분이 여기에요!






/app/models.py

: ORM 방식 테이블 정의자 ( 클래스를 사용함! )

mango_project
    ├── make_juice            <- 현재 설명하는 폴더위치
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py         <- 현재 설명하는 파일위치
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── mango_project
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-38.pyc
        │   └── settings.cpython-38.pyc
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

ORM 이란?

- Object Relational Mapping

장고의 핵심 기능 중 하나인 DataBase 관리기능 을 처리하는 방식이에요!

Object ( 객체 ) 를 이용하여,
Relational ( 관계적인 )
Mapping ( 연결 ) 을 하는 기술이죠!

한마디로,

관계형 데이터베이스 ( Relational DataBase ) 에 대해
객체 지향적 ( Objective Oriented ) 으로 제어 하는 방식이에요!

models.py 에서 정의한 model 들을

관계형 데이터베이스에 이주 ( migrate ) 시키는게 핵심!

( 관계형 데이터베이스에 대한 글은 다음에 작성할 예정이에요! )

개념쓰!

ORM 방식을 이용하기 위해, App 에 대한 'Model' 들을 정의하는 프로그램

Model 이란?

관계형 데이터베이스로 이주 ( Migrate ) 되는 요소


1. 단일 데이터 소스임

  • 관계형 데이터베이스의 테이블

2. 클래스와 변수가 있음

  • 클래스 이름 = Table 이름
  • 변수 이름 = Column 이름
  • 변수에 할당하는 값 = Field 속성
    ( 저장하는 데이터의 필수적인 필드, 동작들을 포함 )

특징쓰!

- 클래스 내부에 메타 클래스로 테이블명을 지정할 수 있음

class Meta:
	db_table = ' 테이블명 '

( 이외에도 많은 특징이 있지만, 생략! 자세한 내용은 공식문서 를 참고하세요~ )









전체적인 흐름정리!

urls.py

1. URL 값이 요청으로 오면,

2. urls.py 에서 그 값이 정의되어있는지 확인하고,

3. 만약에 정의되어 있다면, 그에 맞는 내용을 호출해요!


views.py

1. View Logic 에 대한 호출이 들어오면,

2. views.py 에서 정의한 View Logic 이 반응하여 응답해요!


models.py

1. 이때, View Logic 이 동작하기 위해 참고할 정보들을,

2. 관계형 데이터베이스에서 꺼내오는데,

3. 그 관계형 데이터베이스는 models.py 에서 정의 되어있어요!










여기까지!




이번 글에서는,

완전체가 된 장고의 세부적인 구조를 알아봤습니다!

아주 큰 흐름도 알아봤구요!




다음 글에서는,

전체적인 흐름에 맞춰, 우리가 해야할 일들을 알아볼겁니다!










백엔드 개발자가 다루는

많은 프레임워크 중 하나

장고를 함께 뽀개봅시다!





고생하셨습니다.

감사합니다.( _ _)







부록쓰!

' RESTful ' 이 뭐길래!?

REST 란!

REpresentational State Transfer

Representational ( 대표성을 띄는 ) 한
State ( 상태 ) 를
Transfer ( 통신 ) 한다!

라는 뜻인데요!

위에서 나온, ' RESTful 한 API 구성 ' 이라는게 사실,

주소값 ( URL ) 만 보고도, 알아차리기 쉽게 구성해라!

라는 뜻이라서 ㅋㅋㅋ

알아만 두세욥! ㅎ

profile
지금까지 이런 망고는 없었다. 이것은 슈퍼개발자인가 춤추는망고인가

0개의 댓글