<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
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 : 관계를 맺을 데이터가 삭제 됐을 때 해당 데이터의 처리 방법을 입력
- CASCADE : 해당 데이터도 같이 삭제함
- 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을 지정해주는 게 좋음