개발일지/내일배움캠프

230413 후발대 강의

마이구미+ 2023. 5. 1. 18:59

<django, database 용어 정리>

- 용어 정리

RDBMS(RDB)

  • Relational DataBase Management System의 약자
  • MySql, OracleDb 등 관계형 데이버베이스를 지칭

Sql

  • Structured Query Language의 약자
  • 데이터베이스의 CRUD를 위해 사용되는 언어
    • CRUD : Create(생성), Read(읽기), Update(갱신), Delete(삭제)

NoSql

  • Not Only Sql의 약자
  • 관계형 데이터베이스가 아닌 다른 형태로 데이터를 저장하며, mongDB 등이 여기에 해당함

Table

  • DB는 기본적으로 테이블로 이루어져 있으며 필드와 레코드가 존재함
  • django의 models.py 에서 하나의 class가 테이블이 되고, class를 받아 만들어진 객체는 레코드가 됨. 객체의 속성(attribute)는 필드가 됨
# models.py

# User 테이블
class User(models.Model):
    # username 필드
    username = models.CharField("사용자 계정", max_length=50, primary_key=True)
    # password 필드
    password = models.CharField("비밀번호", max_length=200, unique=True)

# User라는 테이블에 username, password라는 필드가 존재함
# 사용자가 회원가입을 할 때마다 레코드가 하나씩 추가됨.
# 레코드는 row 혹은 튜플 이라고도 불리며 django에서는 object, instance라고도 불린다.
# 즉, 레코드란 데이터베이스에 저장 되는 값들을 지칭하는 것
  • 레코드(DB) = row(DB) = 튜플(DB) = object(장고) = instance(장고)

- 데이터베이스 키 종류

  • FK : Foreign Key의 약자. 다른 테이블을 참조할 때 사용함
  • UK : Unique Key의 약자. 중복값을 허용하지 않을 때 사용함.
  • PK : Primary Key의 약자. 테이블에는 반드시 단 한 개의 PK가 존재해야 함
    • PK는 두 개 이상 존재할 수 없고, UK와 마찬가지로 중복 값을 허용하지 않음
    • Foreign Key를 사용할 경우 참조할 테이블의 PK를 바라봄

- http method 종류

  • request를 보낼 때 어떤 용도의 요청을 보낼지 선택하며, CRUD와 1:1 매칭됨
  • GET : 데이터 조회(Read)
  • POST : 데이터 생성(Create)
  • PUT : 데이터 수정(Update)
    • 메소드 중 PATCH도 있는데 이것도 수정 메소드임
    • PUT은 모든 필드를 수정할 때 사용(이 중 한 필드만 수정하더라도 데이터를 보낼 때 다른 필드도 채워져 있어야 함)
    • PATCH는 일부 필드를 수정할 때 사용함
  • DELETE : 데이터 삭제(Delete)

<django 프로젝트 구조>

- settings.py

  • django 프로젝트를 실행할 때 해당 파일을 참조함
  • 프로젝트의 설정, 관리 등을 담당함(데이터베이스 설정, 앱 설정, 기본 정책 설정 등)

- models.py

  • 데이터베이스에 들어갈 테이블을 만들고 관리하는 곳
  • 테이블에 들어갈 필드, 필드의 속성값 등을 설정할 수 있음
  • python manage.py makemigrations / migrate 명령어를 통해 설정을 DB에 반영시킴

- views.py

  • django에서 request 데이터를 받은 후 처리할 전반적인 로직이 들어감
  • urls.py에서 views에 있는 class나 함수를 호출해서 사용함

- urls.py

  • 웹에서 django 프로젝트로 request를 전달할 때 받아줄 경로를 설정할 수 있음
  • url = 경로

<모델링할 때 자주 사용되는 field>

- 시간

DateField

  • 날짜를 입력하는 필드
  • ex) 2023-04-13

TimeField

  • 시간을 입력하는 필드
  • ex) 18:01

DateTimeField

  • 날짜, 시간을 입력하는 필드
  • ex) 2023-04-13 18:01

옵션(공통)

  • [선택] auto_now_add : True일 경우 데이터가 생성되는 순간을 기록함. 값이 한 번 입력되면 변하지 않음. 사용자가 수정할 수 없는 read only 특성을 가짐.
  • [선택] auto_now : True일 경우 데이터가 저장될 때마다 갱신되며, 데이터 최초 생성일 혹은 수정 시간이 기록됨. 데이터가 처음 생성될 때는 생성일이 기록되고 수정되면 그때의 현재시간으로 바뀜. read only.

- 문자

CharField

  • 문자열을 입력하는 필드
  • ex) 게시글 제목입니다.
  • 옵션
    • [필수] max_length : 입력할 수 있는 최대 문자 수를 지정함
    • [선택] choices : 특정 값만 입력될 수 있도록 선택지를 설정함

TextField

  • 개행 가능한 문자열을 입력하는 필드
  • ex) 게시글 내용입니다.
  • 필수 옵션 없음

- 숫자

IntegerField

  • 숫자를 입력하는 필드
  • ex) -100, 100

PositiveIntegerField

  • 양수를 입력하는 필드
  • ex) 100
  • 음수 입력 시 에러남

- 외래키

ForeignKey

  • 1:N, N:1 관계일 때 사용함
  • ex) 하나의 유저의 여러 게시글, 한 게시글에 달린 여러 댓글
  • 옵션
    • [필수] to : 관계를 맺을 테이블 입력 ex) user.User
    • [필수] on_delete : 관계를 맺을 데이터가 삭제 됐을 때 해당 데이터의 처리 방법을 입력
      1. CASCADE : 해당 데이터도 같이 삭제함
      2. SEL_NULL : 해당 필드의 값을 null(None)로 설정함. 해당 옵션 선택 시 null=True 옵션을 설정해 줘야 함

OneToOneField

  • 1:1 관계일 때 사용함
  • ForeignKey(Unique=True)로 한 거랑 똑같음
  • ex) 사용자(User)와 사용자 개인정보(UserPrivateData)를 나타내는 필드
  • 옵션 : ForeignKey와 동일함

ManyToManyField

  • N:M 관계일 때 사용함
  • ex) SNS의 following, follower 기능, 사용자(User)와 취미(Hobby)를 나타내는 필드, 게시글(Post)와 태그(Tag)를 나타내는 필드 등

- 기타

FileField

  • 파일을 업로드 하는 필드
  • ex) image.png
  • 이미지를 올리는 ImageField도 있음

BooleanField

  • True 혹은 False를 저장하는 필드
  • ex) is_activate = models.BooleanField(default=True)
  • default 옵션 따로 설정 안 하면 기본값은 False임(아마도...?)

- 공통 옵션

  • [선택] verbose_name : 해당 필드의 별칭을 지정함
  • [선택] default : 해당 필드의 값을 지정하지 않았을 때 기본적으로 설정할 값을 입력함
  • [선택] blank : 비어있는 스트링("") 허용 여부를 지정함
  • [선택] null : null(None) 허용 여부를 지정함

<객체의 메소드>

모델명.objects.메소드명()
  • 이렇게 사용함

- get

  • 해당하는 결과값 1개를 가져옴 # [row]
  • 1개가 아닐 경우 에러남
  •  ex) User.objects.get(id=id) : User모델의 id가 1인 instance(데이터베이스의 row=레코드=튜플, 장고의 object)를 가져옴
  • 그래서 보통 옵션에 pk값이 들어감(pk는 해당 테이블에서 고유한 값을 가지고 있기 때문)

- filter

  • 해당하는 결과값 모두를 쿼리셋 형태로 가져옴 # ([row], [row], [row], [row])
  • 해당하는 값이 없을 경우 빈 리스트([])가 반환됨
  • ex) User.objects.filter(gender=female) : User모델에서 gender가 female인 instance를 다 가져옴)
  • 뒤에 order_by()를 붙여 원하는 조건으로 정렬할 수 있음

- create

  • 새로운 instance를 생성함
  • ex) User.objects.create(id=id, username=username, gender=gender, ...)
  • User 모델의 필드들을 옵션(매개변수)에 넣으면 해당 데이터를 갖는 한 개의 instance(=object, 데이터베이스의 row, 레코드, 튜플)이 생성됨

- all

  • 해당 모델(테이블)의 모든 객체(레코드)를 가져옴
  • ex) User.objects.all()
  • 뒤에 order_by를 붙여 원하는 조건으로 정렬할 수 있음

<related name>

  • 역참조 시 부를 이름을 등록하는 옵션(선택 옵션임)
  • 미설정 시 테이블명칭(클래스명)_set 으로 쓰도록 자동 설정되어 있음
  • ex) ForeignKey(1:N) 기준
    • user 모델, article 모델이 있을 때, article이라는 변수에 Article모델의 어떤 게시글을 담은 후에 article.user.username 을 하는 건 정참조(아티클 테이블에서 참조하고 있는 user 테이블에서 username을 불러옴)
    • user라는 변수에 User모델의 어떤 유저를 담은 후에 user.article_set.all() 하는 건 역참조(유저 테이블에서 게시글 테이블을 역참조 해서 해당 유저가 쓴 모든 게시글을 불러옴)
  • ex) OneToOne(1:1) 기준
    • user모델과 userprivate모델이 1:1 관계일 때는 역참조 시 그냥 user.userprivate.주민등록번호 이런 식으로 _set 안 붙이고 바로 씀
  • 헷갈릴 수 있으니 related name을 지정해주는 게 좋음