본문 바로가기
LG 헬로비전 DX DATA SCHOOL/DATA BASE

데이터 베이스

by 황밤 2023. 7. 25.
728x90
반응형

2023-07-25

1. 데이터 베이스

SMALL

1.1) SQR 사용에 따른 분류

 

  • RDBMS : 테이블 구조를 이용하는 데이터베이스, SQL을 이용해서 질의를 수행, 강력한 트랜잭션 기능을 활용
  • Oracle, MySQL(Maria DB), MS SQL Server, HANA DB, Postgre SQL 등
  • NoSQL : 스키마를 생성하지 않고 Key - Value 형태로 데이터를 관리, 자바스크립트 기반의 함수를 이용해서 질의를
  • 수행, 느슨한 트랜잭션을 사용
  • Mongo DB, Cassandra, Hive, Redis 등



1.2) 저장 위치에 따른 분류

  • Disk 기반의 데이터베이스 : 데이터를 Disk에 저장하고 사용
  • In Memory Database
  • 데이터를 메모리에 저장해서 빠르게 사용할 수 있도록 해주는 방식
  • Redis 가 대표적인 종류이고 각 Cloud Vender에서 별도로 제공

 


2. Redis(Remote Dictionary Server)

 

2.1) 특징

 

  • Key-Value 구조의 저장소
  • 사용 사례 : 캐싱, 세션 관리, pub/sub(구독과 게시), 순위표, 분산 락 등

Session :

HTTP 나 HTTPS 는 무상태(클라이언트의 상태를 저장하지 않음)

HTTP 나 HTTPS 는 클라이언트와 서버간의 지속적인 통신을 할 수 없음.

COOKIE는 서버가 필요한 클라이언트의 정보를 클라이언트에 저장을 하고 서버에게 요청을 할 때 같이 전송해서 서버가 클라이언트의 상태를 알 수 있도록 해주는 것입니다.

SESSION 은 클라이언트의 정보를 서버에 저장해서 클라이언트의 상태를 알 수 있도록 하는 것

 

  • 메모리 데이터베이스는 비용이 많이 소모되기 때문에 주 데이터 보다는 보조 데이터 저장에 이용

-> 반 영구적으로 데이터를 저장할 수 있고 클러스터 기능을 이용해서 데이터 백업이 가능

 

  • 메모리(속도가 빠르다)와 싱글 스레드(일관성있는 동작)가 핵심 키워드
  • 메모리는 휘발성이라서 반 영구적으로 저장하기 위한 방법을 고려

RDB(데이터 전체의 스냅샷을 작성하고 이를 디스크에 저장하는 방식) 방식과 AOF(작업 내역을 저장하는 방식) 방식을 이용해서 백업을 수행

 

스냅샷을 이용하는 방식은 스냅샷 작성 이후에 변경된 데이터는 복구가 어렵다라는 단점이 있음

작업 내역을 기록하는 방식은 복구 속도가 느리고 로그크기가 커지게 되는 단점이 있음.

 

 

 

2.2) Event Loop

  • 클라이언트 들이 요청을 하면 그 요청을 Event Queue 라는 곳에 저장한 후 레디스 코어 스레드가 순차적으로 처리
  • 코어 스레드가 싱글 스레드 처리 방식으로 요청을 처리
  • 싱글 스레드 기반이라서 문맥 교환(context Switching)이 거의 발생하지 않고 Dead Lock이 발생할 가능성도 거의 없으며 공유 자원의 점유 여부를 저장할 수 있어서 MSA(Micro Service Architecture) 환경에서 유용하게 사용될 수 있습니다.
  • 싱글 스레드 기반이라서 전체 데이터 조회에는 취약함.

출처 : 주노플로우

 

2.3) 백업과 선출

 

  • Master 와 Replica로 나누어서 Master가 실제 삽입, 삭제, 수정 작업을 할 수 있는 노드가 되고 Replica는 Master의 데이터를 백업하는 용도로 사용

-> Replica에변화가 생기더라도 Master에는 영향이 없습니다. 

  • Master에 문제가 생기게 되면 Replica 중 하나를 Master로 선출하게 하게 되는데 이 때 사용되는 것이 Sentinel 입니다.
  • Sentinel은 다수결의 원칙으로 Master를 선출하게 되기 때문에 Centinel의 개수는 홀수로 설정

 


 

3. 사용

 

 3.1) 설치

 

  • Cloud Service를 이용
  • Docker에 설치 : docker run --name 컨테이너이름 -d -p 6379:6379 redis

맨뒤 이름은 image 이름으로 하여야 함(mysql, oracle 등, 버전을 기재하지 않으면 최신 버젼 latest이다.)

이미지 이름은 redis:latest

 

3.2) 접속

 

  • docker run -it --link 컨테이너이름:이미지이름 --rm redis redis -cli -h redis -p 6379

 


 

4. CRUD

 

4.1) 자료형

 

String : 문자열

Hash : Key-Value

List : Linked List 로 Deque 처럼 동작

Set : 중복되는 데이터를 저장할 수 없고 저장 순서를 알 수 없는 데이터의 모임

Sorted Set : 정렬

 

Stream : 로그를 저장하기 위한 자료구조

Geospatial Indexe : 위도와 경도 저장을 위해서 존재하고 이를 이용해서 거리 계산이 가능

Bitmap : 비트 열

Bit field : 비트를 나누어 놓은 열

 

 

 

4.2) String

 

  • 문자열
  • 저장

: set 키 값

 

  • 읽기

: get 키

 

  • 삭제

: del 키

 

  • 전체 키 조회

keys * 

redis:6379> set "name" sv
OK
redis:6379> get "name"
"sv"
redis:6379> del "name"
(integer) 1
redis:6379> keys *
(empty array)
  • 여러 개의 데이터를 저장하거나 읽을 때는 mset과 mget을 이용
redis:6379> mset "name" sv "age" 26
OK
redis:6379> mget "name" "age"
1) "sv"
2) "26"

 

  • 여러 개의 데이터 조회 : 10개씩 조회

 

  • 여러 개의 데이터 조회 : 10 개씩 조회하는데 첫번째 결과는 다음 데이터 존재 여부로 0이면 다음 데이터가 없음

: scan 페이지 번호

 

 

 

4.3) List

  • 동일한 자료형의 데이터를 순차적으로 여러 개 모아놓은 구조
  • 왼쪽에 삽입 : lpush

lpush 키이름 데이터 나열

 

  • 왼쪽에서 데이터 조회 : lrange

lrange 키이름 시작인덱스 종료인덱스(-1이면 맨 마지막, 시작인덱스는 0에서 시작)

 

  • 오른쪽에 삽입 : rpush
  • lpop, rpop : 왼쪽이나 오른쪽에서 하나의 데이터를 가져오고 리스트에서는 삭제
  • 데이터 개수 : llen 키이름
  • 일정 범위의 데이터만 남기고 삭제 : ltrim 키이름 시작인덱스 종료인덱스

없는 인덱스를 사용하면 모든 데이터를 삭제

redis:6379> lpush "datas" "HTML" "CSS" "JavaScript"
(integer) 3
redis:6379> lrange "datas" 0 2
1) "JavaScript"
2) "CSS"
3) "HTML"
redis:6379> lrange "datas" 0 -1
1) "JavaScript"
2) "CSS"
3) "HTML"
redis:6379> lrange "datas" 0 1
1) "JavaScript"
2) "CSS"
redis:6379> rpush "datas" "python" "rdbms" "nosql" "in memory db"
(integer) 7
redis:6379> lrange "datas" 0 -1
1) "JavaScript"
2) "CSS"
3) "HTML"
4) "python"
5) "rdbms"
6) "nosql"
7) "in memory db"
redis:6379> lpop "datas"
"JavaScript"

pop, push 꼭 기억!

 

4.4) Set

 

  • 중복된 데이터를 저장하지 않는 자료구조
  • 데이터를 member라고 부르는데 일반적으로 member의 존재 여부를 빠르게 확인하고자 할 때 사용합니다.
  • redis는 MSA 환경 같은 곳에서 많이 사용하기 때문에 공유 자원의 사용 여부를 set으로 저장하고 있다가 누가 사용 중인지 빠르게 확인하는 용도로 많이 사용.

 

  • 데이터 삽입

sadd 키이름 데이터 나열

 

  • 모든 데이터 조회

smember 키이름

 

  • 데이터 존재 여부 확인

sismember 키이름 데이터 

 

  • 데이터 삭제

srem 키이름 데이터

 

  • 무작위로 데이터를 삭제하고 가져오는 spop 과 삭제하지는 않는 srandmember가 존재
redis:6379> sadd "printer" "sv"
(integer) 1
redis:6379> smembers "printer"
1) "sv"
redis:6379> srem "printer" "sv"
(integer) 1
redis:6379> smembers "printer"
(empty array)

 

 

 

4.5)Sorted Set

 

  • score 와 value로 구성된 set
  • score 로 정렬되고 score가 같으면 value 로 정렬
  • 실시간 순위표를 구현하고자 할 대 유용

 

  • 데이터 삽입

zadd 키 score value score value ......

  • 인덱스를 이용한 조회 - 뒤에 rev 옵션을 추가하면 역순 출력, withscores를 추가하면 score 도 같이 출력

zrange 키 시작인덱스 종료인덱스

redis:6379> zadd scoreboard 26 "sv" 77 "svng" 81 "steve" 99 "eunae"
(integer) 4
redis:6379> zrange score 0 -1
(empty array)
redis:6379> zrange scoreboard 0 -1
1) "sv"
2) "svng"
3) "steve"
4) "eunae"
redis:6379> zrange scoreboard 0 -1 rev
1) "eunae"
2) "steve"
3) "svng"
4) "sv"

// 항목도 같이 출력
redis:6379> zrange scoreboard 0 -1 rev withscores
1) "eunae"
2) "99"
3) "steve"
4) "81"
5) "svng"
6) "77"
7) "sv"
8) "26"

 

  • 값의 범위를 가지고 조회

zrangebyscore 키이름 최소값 최대값 (withscores limit 옵셋 개수)

zrevrangebyscore 키이름 최대값 최소값 (withscores limit 옵셋 개수)

 

redis:6379> zrangebyscore scoreboard 30 80
1) "svng"

// 높은 순으로 범위 내 출력
redis:6379> zrevrangebyscore scoreboard 90 40
1) "steve"
2) "svng"

 

4.6) Hash

 

  • HashTable, Dictionary 와 유사한 개념
  • key 와 value 를 같이 저장하는 자료구조
  • key는 set으로 구성(중복할 수 없음)

 

  • 저장 : hset과 hmset (저장 시 인코딩 된 상태로 저장)
  • 읽기 : hget과 hmget (저장 시 인코딩 된 상태로 저장)
  • 모든 데이터 조회: hgetall
  • 모든 key와 value 조회 : hkeys, hvals
  • 삭제는 hdel

5. Python 과 redis 연동

 

5.1) 준비

 

  • 드라이버 설치 : redis
  • 접속정보
  • IP : localhost(127.0.0.1)
  • PORT : 6379
  • 아이디 : -
  • 비번 : -

 

 

5.2) with 구문

 

  • 전통적인 방식의 외부 자원 사용 방식

 

try :

     외부 자원에 연결

except :

    예외가 발생했을 때 처리

finally :

    외부 자원 연결 해제

 

  • with 구문 사용

with 외부자원에 연결 as 이름 :

     이름 사용

with 안에서 외부 자원에 연결하면 예외 발생 여부에 상관없이 블럭을 나갈 때 연결을 해제해 줍니다.

 

 

 

5.3) Connection Pool

 

  • 데이터베이스 프로그래밍을 할 때 직접 연결을 생성해서 해제하는 방식을 사용해도 되지만 미리 연결을 만들어두고 빌려쓰는 방식을 이용할 수 있습니다.
  • server에서 데이터베이스를 사용할 때는 클라이언트의 요청이 올 때 마다 데이터베이스에 연결하고, 요청을 처리하고 결과를 리턴한 후 연결을 해제하는 방식을 사용하면 오버헤드가 너무 큽니다

 -> 이 경우, 연결을 만들어 두고 사용한 후, 반납을 하는 형태로 이용한다.

     이렇게 미리 만들어둔 데이터베이스 연결을 Connection Pool 이라고 한다.

import redis
import time

#connection pool을 이용한 접속
redis_pool = redis.ConnectionPool(host='localhost', port=6379, max_connections=4)
with redis.StrictRedis(host='localhost', port=6379) as conn:
    # #문자열 저장
    # conn.set("name", "adam")
    # #문자열 가져오기
    # data = conn.get("name")
    # print(data) #인코딩된 결과가 출력됨
    # print(data.decode("utf-8"))
    #
    #
    #
    # #만료 시간 설정 가능
    #
    # conn.set("name", "age", 10) #만료 시간이 10초
    # #만료 시간 확인
    # print(conn.ttl("name"))
    #
    # conn.set("song", "노래")
    # conn.expire("song", 10) #데이터의 만료시간을 10초 설정
    # print(conn.get("song"))
    # time.sleep(20)
    # print(conn.get("song")) #20초 후에 데이터를 가져오므로 데이터가 없어서 None이 됨.


    #리스트에 데이터 저장
    conn.lpush("album", "genesis")
    conn.rpush("album", "exodus")

    for album in conn.lrange("album", 0 , 10) :
        print(album)

 

 


 

Web Programming 

 

1. Web Service 구현 방식

 

1.1) CGI(Common Gateway Interface) 와 Application Server

 

  • CGI 는 클라이언트의 요청을 프로세스를 이용해서 처리하는 방식

Perl 이나 C로 만든 프로그램을 직접 실행시키는 방식

 

  • Application Server 방식은 클라이언트의 요청을 스레드를 이용해서 처리하는 방식

Java, Python을 이용해서 클라이언트의 요청을 처리하는 방식 

 

 

 

1.2) Server Rendering 과 Client Redering

 

  • Server Rendering은 서버가 클라이언트의 출력 내용을 만들어서 HTML로 변환해서 전송하는 방식

Java의 JSP 출력이나 Template Engine을 사용하는 방식 또는 Python의 Flask나 Django를 이용한 방식

 

  • Client Render 은 서버가 클라이언트에게 데이터를 전송해서 클라이언트가 직접 화면을 만들어가는 방식

Server는 출력 내용을 만들지 않고 JSON 형태의 데이터만 전송

Client 는 ajax나 websocket 등을 이용해서 데이터를 전송받고 출력물을 생성합니다.

최근에는 이런 방식으로 구현하는 경우가 많습니다.

 

 


 

2. 요청 방식

 : 라이언트가 서버에게 요청을 보낼 때 어떤 방식으로 또는 무엇을 할지를 알려주는 것

 

 

2.1) get 방식

 

  • 데이터를 전송하고자 할 때 URL에 붙여서 전송을 하는 방식
  • URL 뒤에 ? 를 추가하고 이름=값$이름=값.... 형태로 데이터를 전송
  • 요청을 처리하는 속도가 빨라지고 자동 재전송 기능이 있음
  • 데이터의 길이에 제한이 있고 보안이 취약
  • 데이터를 전송할 때 인코딩을 해서 전송해야 합니다.
  • 최근에는 파라미터가 1개인 경우 URL에 붙여서 전송

 

2.2) post 방식 - 삽입에만 사용

  • 데이터를 header에 숨겨서 전송
  • 데이터의 길이에 제한이 없고, 보안 기능도 있음. (get 보단 느림)
  • 예전에는 조회를 제외한 모든 요청 처리에 사용했음

 

2.3) put 방식 - 수정

  • 사용 방법은 post와 동일

 

2.4) delete 방식 - 삭제

 

 

 

2.5) patch - 일부분 수정

  • 멱등성(연산을 여러 번 하더라도 결과가 달라지지 않는 성질)이 없어서 되도록이면 수정에는 put 방식을 이용하는 것을 권장

 

2.6) 기타

  • head
  • options
  • trace
  • connect

 


3. 상태 코드

  • 클라이언트가 서버에게 요청을 하면 서버가 처리를 한 후 알려주는 코드

 

1XX : 임시적인 응답으로 현재 클라이언트의 요청까지 처리 됨

2XX : 정상 응답

3XX : Redirection 중 - 정상 처리한 후 다른 요청으로 이동

 

4XX : 클라이언트 오류

             401 : 권한 없음

             403 : 권한 처리 이외의 사유 발생

             404 : 요청을 처리할 수 없음, URL이 잘못됨

 

5XX : 서버 오류

             500 : 내부 서버 오류

             503 : 서비스 불가

 

 


 

4. Web Client 와 Server의 통신 방식

4.1) ajax

 

  • 클라이언트에서 비동기적으로 서버에게 요청을 전송하는 방식
  • 가장 많이 사용

 

 

 

4.2) Web socket

 

  • 클라이언트 와 서버가 연결형 통신을 수행하는 방식
  • 직접 close를 하지 않는 이상 계속 연결 상태

 

 

4.3) SSE(Server Sent Events - Web Push)

 

  • 서버가 클라이언트의 요청이 없어도 데이터를 전송하는 방식

 


 

5. Python Web Framework

 

 

5.1) Flask와 Django 의 차이

  • 프로젝트 레이아웃이 다름
Flask :
하나의 프로젝트에 하나의 애플리케이션을 사용
내장된 데이터베이스 활용 라이브러리가 없으므로 별도의 라이브러리를 이용해서 데이터베이스를 사용
마이크로 프레임워크라서 편하게 확장할 수 있으며 유연함.
Django :
하나의 프로젝트에 여러 개의 애플리케이션 생성 가능
ORM을 내장, 별도의 라이브러리 없이 데이터베이스 사용이 가능
RDBMS 사용

 

 

2) Django 를 권장하는 경우

 

  • Web App 이나 API 백엔드의 크기가 큰 경우
  • 빠르게 개발해서 배포하고 업데이트 하고자 하는 경우
  • CSRF, XSS, SQL Injection, 클릭 재킹 등의 기본적 보안을 쉽게 적용하고자 하는 경우
  • 스케일 업, 스케일링 다운(서비스의 개수를 늘리거나 줄이고자 하는 경우)을 자유자재로 하고자 하는 경우
  • SQL에 익숙하지 않은 상태에서 RDBMS를 사용하고자 하는 경우

 

 

3) Flask 사용을 권장하는 경우

  • 앱이 작은 경우
  • 설계가 가능한 경우
  • Python에 익숙하지 않은 경우(애매)
  • NoSQL을 사용하는 경우

 


 

**Django

 

1. 개요

 

Django

The web framework for perfectionists with deadlines.

www.djangoproject.com

  • 설치 : django

 

네트워크의 구조 :

출처 : 매해 선글라스 한복으로 인사해주는 준호

 

service 계층은 파이썬에서 Interface 혹은 Abstract Class 로 할 수 있다. 

프로그램, 앱 개발은 전체 프레임을 제작 후 의뢰자 요구에 맞는 내용을 채우는 것이다.

 

10가지의 기능의 요구사항 -> 최소 10가지의 메소드를 생성해야 함.

 


 

2. 개발 방식

 

 

  • MVC(Model View Controller) 일반적인 프로그래밍에서의 개발 방식

M : Model, 데이터와 관련된 부분

 

V : View, 화면 출력

 

C : Controller, Model 과 View를 제어

클라이언트의 요청이 오면 필요한 Service Logic 을 호출하고 그 결과를 받아서 View 에게 전송하는 역할

 

  • MTV (Model Template View) 

M : Model, 데이터와 관련된 부분

 

T : Template, Model 이 생성한 데이터를 화면에 출력하기 위한 엔진

 

V : View, Controller의 역할, 클라이언트의 요청을 처리할 로직을 호출하고 그 결과를 가지고 Template을 이용해서 출력하는 역할

 

 

  • ORM(Object Relation Mapping)

관계형 데이터베이스의 row와 객체 지향 언어의 Instance(Object)를 1:1로 매핑시켜서 SQL 없이 관계형 데이터 베이스를 사용하는 기술

 

데이터베이스 종류가 변경되는 경우 설정만 변경해서 사용 가능

 

 


 

3. 프로젝트 생성 및 실행

 

3.1) 가상 환경 생성

 

  • 가상 환경 : 현재 프로젝트 만의 파이썬 실행 환경

파이썬은 모듈을 가져와서 자신에게 포함시켜서 실행하는 구조입니다.

파이썬 애플리케이션이 사용하는 모듈은 전부 애플리케이션에 포함시켜야 애플리케이션이 정상적으로 동작합니다.

파이썬이 설치된 환경에서 파이썬 애플리케이션을 개발해서 배포하면 배포된 곳에 동일한 형태로 파이썬이 설치되어 있어야 합니다.

 

가상환경을 만들고 그 안에서 모듈을 설치하고 사용하면 이 환경을 가지고 배포를 하면 배포된 곳에 파이썬이 설치되어 있을 필요가 없습니다.

 

  • 생성 명령 : python3 -m venv 가상환경 이름 - pycharm 에서 프로젝트를 만들 때는 수행할 필요가 없다.
  • 가상 환경 활성화 :

 

source 가상환경이름/bin/activate -> mac 명령임
activate로 사용!

 

 

 

3.2) 장고 설치

 

  • pip install django

 

 

 

3.3) 장고 프로젝트 생성 : 프로젝트는 전체 설정에 관련된 사항을 저장하는 곳

 

  • django-adming startproject 프로젝트이름 디렉토리경로

 

 

 

3.4) 장고 애플리케이션 생성

 

  • 장고 프로젝트 내부의 경로로 이동한 후
  • python manage.py startapp 앱이름

 

 

 

3.5) 장고 애플리케이션 실행

 

  • python.manage.py runserver ip주소:포트번호
  • 기본적으로 현재 컴퓨터의 ip:8000 번 포트로 web application이 실행됨.
  • ip 주소와 포트번호를 입력하면 그 ip 와 포트번호로 외부에서 접속해야 합니다.

이 경우는 하나의 컴퓨터에 NIC(Lan Card)가 여러개 있어서 IP가 여러 개 인 경우 직접 ip 주소와 포트번호를 입력하면 된다.

 

프로젝트 디렉토리 < app, site, venv(가상환경), db.sqlite3, manage.py 가 생김

 

 

 

3.6) 디렉토리 구조

  • venv
  • 프로젝트 디렉토리
  • 애플리케이션 디렉토리
  • manage.py(main을 소유) : python manage.py runserver 

 


 

 

4. 프로젝트 구조 및 설정

 

4.1) 프로젝트 디렉토리의 settings.py

  • 프로젝트 설정 파일

 

  • DEBUG = True

실행 모드에 관련된 설정

True를 설정하면 개발 모드이고 False를 설정하면 운영 모드

개발 모드로 설정하면 로그가 전부 출력되지만 운영 모드로 설정하면 로그는 출력되지 않습니다.

 

 

  • ALLOWED_HOSTS = [ ]

배포를 할 때 외부에서 접속할 수 있는 IP를 설정하는 부분

내용이 없으면 로컬에서만 접속 가능

여기에 IP를 기재하고 실행할 때 python manage.py runserver IP:포트번호 로 실행하면 외부에서 IP를 통해 접속이 가능

ALLOWED_HOSTS = ['192.168.0.37', 'localhost', '127.0.0.1'] 로 수정

실행할 때는 python manage.py runserver 192.168.0.3:8000 으로 하면 외부에서 192.168.0.3:8000 번으로 어플리케이션 접속이 가능해진다.

 

 

  • INSTALLED_APPS = [ ]

애플리케이션 등록

프로젝트 안에 애플리케이션을 생성한 경우 여기에 등록을 해주어야 합니다.

 

 

  • MIDDLEWARE = [ ]

장고에서 여러가지 기능을 추가하기 위해서 설정

기본적으로 보안에 관련된 라이브러리들이 등록되어 있습니다.

미들웨어는 요청을 처리하기 전이나 처리한 후에 동작하는 소프트웨어

 

 

  • ROOT_URLCONF = "mysite.urls"

요청이 왓을 때 처리할 모듈을 설정

 

 

  • TEMPLATES

템플릿 파일의 위치

 

 

  • DATABASES

데이터베이스 사용 설정

기본은 SQLite3를 사용하도록 설정되어 있다.

 

 

  • 시간대역 설정

#TIME_ZONE = "UTC"

#TIME_ZONE = "Asia/Seoul"

 

 

  • STATIC=URL = "static/"

정적 파일의 위치를 설정

정적 파일은 실행중에 변하지 않느 파일로 css, js, html, 이미지, 사운드 파일 등

동적 파일은 실행 중에 변하는 파일로, template(데이터를 출력하는 파일)

 

 

 

4.2) 프로젝트의 urls.py

 

  • url과 처리할 뷰의 메서드 또는 함수를 연결해주는 파일
  • 내용은 이 파일에 전부 작성해도 되고 여러 파일에 나누어 작성해도 된다.

 

 

 

 

4.3) 데이터 마이그레이션

 

  • Django는 ORM을 사용하는데 기본적으로 sqlite3와 연결되어 있다.
  • 프로젝트 내의 Model에 변화가 생긴 경우 마이그레이션을 해주면 데이터베이스에 자동으로 반영이 된다.

 

  • 마이그레이션 명령

python manage.py migrate

 

  • 테이블이 없으면 생성해줍니다.

 

 

4.4) 관리자 생성

 

  • python manage.py createsuperuser
  • 관리자의 id와 비밀번호를 설정하도록 한다.
  • 비밀번호는 8자리 이상으로 만들기를 권장함.
  • admin/ 으로 가서 로그인해서 확인

 

 

4.5) views.py

 

  • 뷰 로직을 처리하는 코드를 작성하는 파일
  • 일반 함수로 작성할 수 있고 클래스로 작성할 수도 있다.
  • 장고에서는 클래스로 작성하는 것을 권장

 

 

 

4.6) 처리 흐름

 

  • 클라이언트가 요청
  • django는 settings.py 설정에 따라 프로젝트 내의 urls.py 파일을 읽어서 클라이언트의 요청을 처리할 함수가 정의되어 있는지 확인
  • url과 매핑된 함수나 메서드가 있으면 실행하고 결과를 확인
    이 때 view가 동작결과를 가지고 Template을 이용해서 출력하거나 다른 요청으로 redirect

 

  • redirect와 forwarding

forwarding은 작업의 흐름을 중지하지 않고 이어나가기 위한 페이지 이동
redirect는 작업의 흐름을 중지시키고 새로운 곳으로 이동- 관리자 생성

새로고침을 했을 때 forwarding은 작업을 새로하지만, redirect는 결과만 다시 출력함

 

 

 

4.7) 요청 처리 과정

 

  • 요청 -> urls.py -> views.py

 

 

4.8) 기본 요청을 했을 때 출력 내용을 설정

 

  • 프로젝트의 urls.py 파일을 수정
#svapp는 application 이름임
from svapp import views


urlpatterns = [
    #admin/ 요청이 오면 admin.site.urls 함수가 처리
    path("admin/", admin.site.urls),
    #/"" 요청이 왔을 때 views 모듈의 index 함수가 처리
    path("", views.index)
]

 

  • 애플리케이션의 views.py 파일에 요청을 처리하는 index 함수를 생성
from django.shortcuts import render

# Create your views here.


from django.http import HttpResponse
def index(request):
    return HttpResponse("<h1>Hello Django</h1>")

 

  • 서버를 다시 실행시키고 브라우저에서 127.0.0.1:8000

python manage.py runserver

 

 

  • HttpResponse 를 이용하면 HTML을 출력하는 것이 가능(복잡한 기능은 어려움)

 

 

 

4.9) HTML 파일 출력

 

  • views 의 요청 처리 함수에 HttpResponse를 이용해서 HTML을 화면에 출력할 수 있지만 내용이 많을 때는 이 방식은 사용하기 어려움
  • 많은 내용을 출력할 때는 html 파일을 만들고 html 파일의 내용을 출력하도록 해주어야 한다.
  • 이 경우, django.shortcuts.render 함수를 이용

이 함수의 첫번째 매개변수는 클라이언트로부터 전달된 request 이고, 두번째 매개변수는 출력할 html 파일 이름이고, 세번째 매개변수는 html 파일에서 출력할 데이터

 

  • views.py 파일의 index 함수를 수정
def index(request):
    #html을 직접 작성해서 출력
    #return HttpResponse("<h1>Hello Django</h1>" +"<br>나는 황성주다</br>")
    #html 파일을 출력
    return render(request, "index.html")

 

 

  • 애플리케이션(svapp)에 templates 디렉토리를 생성

이후 생성된 디렉토리에 html파일을 작성

앱은 생성후에 꼭 (settings.py의 installed apps 에 등록을 해줘야함!!!)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django web Framework</title>
</head>
<body>
    <p>Django를 이용한 Web Application</p>
</body>
</html>

이후 서버를 재시작하고 접속하여 HTML 파일이 출력되는지 확인

반응형
LIST

'LG 헬로비전 DX DATA SCHOOL > DATA BASE' 카테고리의 다른 글

SQL 코테  (0) 2024.04.05
Mongo DB  (0) 2023.07.24
Oracle  (0) 2023.07.21
파이썬 MySQL 연동  (0) 2023.07.20
DATA BASE 4  (0) 2023.07.20