<오늘 한 일/>
- enum이란?
- 일종의 데이터타입
- 사전에 정의된 값 중에서 선택할 수 있는 제한된(discrete) 데이터 집합을 가지며, 이 데이터 집합 안에서만 값을 가질 수 있도록 강제하는 타입
- 파이썬에서는 enum 클래스를 사용해서 구현할 수 있고, 장고에서는 이넘 대신 Choice Field를 제공함
- Choice Field를 사용하면 문자열 형태의 레이블을 사용자에게 표시하고, 이에 대응하는 숫자형 데이터를 실제로 DB에 저장할 수 있음 -> 문자열 데이터를 숫자형 데이터로 치환하여 DB 용량을 효율적으로 관리 가능함
# 예시
from django.db import models
class Product(models.Model):
CURRENCY_TYPE_CHOICES = [
(1, "원(KRW)"),
(2, "달러(USD)"),
(3, "엔(JPY)"),
(4, "위안(CNY)"),
(5, "유로(EUR)"),
]
...
currency = models.IntegerField(choices=CURRENCY_TYPE_CHOICES, default=1)
...
import uuid
from django.db import models
from companies.models import Company
from enum import Enum, unique
@unique
class CurrencyType(Enum):
KRW = 1
USD = 2
JPY = 3
CNY = 4
EUR = 5
class Product(models.Model):
...
currency = models.IntegerField(choices=[(t.value, t.name) for t in CurrencyType])
...
- 근데 enum 클래스를 사용하면 사용자가 보는 통화 이름에 한글을 못 쓴다
- 아니 못 쓰는 건 아니고 찾아보니까 딕셔너리 활용해서 아래처럼 쓸 수 있긴 한데 저렇게 구현할 바에야 장고에서 제공하는 choice field 사용하는 게 좋을 듯?
import uuid
from django.db import models
from companies.models import Company
from enum import Enum, unique
@unique
class CurrencyType(Enum):
KRW = 1
USD = 2
JPY = 3
CNY = 4
EUR = 5
CURRENCY_DISPLAY_NAMES = {
CurrencyType.KRW: "원(KRW)",
CurrencyType.USD: "달러(USD)",
CurrencyType.JPY: "엔(JPY)",
CurrencyType.CNY: "위안(CNY)",
CurrencyType.EUR: "유로(EUR)"
}
class Product(models.Model):
...
currency = models.IntegerField(choices=[(t.value, CURRENCY_DISPLAY_NAMES[t]) for t in CurrencyType])
...
테이블 A
id | name
---------
1 | Kim
2 | Lee
3 | Park
테이블 B
id | email
-----------
1 | kim@email.com
2 | lee@email.com
4 | choi@email.com
- inner join
- 두 테이블에서 조인 조건에 일치하는 데이터만 가져오는 방법
- 양쪽 테이블에서 모두 일치하는 데이터가 없으면 결과에 포함되지 않음
SELECT A.id, A.name, B.email
FROM tableA A
INNER JOIN tableB B ON A.id = B.id;
- 위 테이블 A, B를 기준으로 위와 같은 연산을 실행하면 아래와 같은 결과가 나옴
id | name | email
--------------------
1 | Kim | kim@email.com
2 | Lee | lee@email.com
- outer join
- 두 테이블에서 조인 조건에 일치하지 않는 데이터도 결과에 포함시키는 방법
- Outer join은 Left outer join, Right outer join, Full outer join의 세 가지 유형이 있음
- Left outer join
- 테이블 A의 모든 데이터와 테이블 B의 일치하는 데이터를 가져옴
- 테이블 B에 일치하지 않는 데이터는 NULL로 표시됨
SELECT A.id, A.name, B.email
FROM tableA A
LEFT OUTER JOIN tableB B ON A.id = B.id;
id | name | email
--------------------
1 | Kim | kim@email.com
2 | Lee | lee@email.com
3 | Park | NULL
- Right outer join
- 테이블 B의 모든 데이터와 테이블 A의 일치하는 데이터를 가져옴
- 테이블 A에 일치하지 않는 데이터는 NULL로 표시됨
SELECT A.id, A.name, B.email
FROM tableA A
RIGHT OUTER JOIN tableB B ON A.id = B.id;
id | name | email
--------------------
1 | Kim | kim@email.com
2 | Lee | lee@email.com
4 | NULL | choi@email.com
- Full outer join
- 테이블 A와 테이블 B의 모든 데이터를 가져옴
- 서로 다른 테이블의 일치하지 않는 데이터는 NULL로 표시됨
SELECT COALESCE(A.id, B.id) as id, A.name, B.email
FROM tableA A
FULL OUTER JOIN tableB B ON A.id = B.id;
id | name | email
--------------------
1 | Kim | kim@email.com
2 | Lee | lee@email.com
3 | Park | NULL
4 | NULL | choi@email.com
<느낀 점/>
- 모 회사에서 사전 과제를 내줬는데 가격에 통화 정보를 담아야 한다고 해서 choice field를 생각 못 하고 Currency 모델을 따로 만들어서 외래키로 참조해서 구현했다
- 그런데 면접에 가니까 enum을 왜 활용하지 않았냐고 질문이 들어왔다
- enum이 뭔지 몰랐다....
- 면접 끝나고 찾아봤다...choice field를 알고 있었고, 프로젝트에서 써본 경험도 있어서 아쉬웠다....왜 과제할 때 choice field를 생각하지 못했을까ㅠㅠ
- 근데 enum을 알고, choice field로 잘 구현했어도 면접 결과는 달라지지 않았을 듯...
- 왜냐면 난 inner join, outer join도 몰랐으니까...!!
- 근데 블로그에 있는 유일한 SQL 기초 문법 정리 글을 보니까 left outer join과 inner join을 설명해놨었다
- 너무 초반에 했던 거라 까먹.........었고.....프로젝트를 할 때 sql 문법 사용할 일이 없다보니 잘 몰랐다
- 그리고 inner join, outer join 알았어도 면접 결과는....달라지지 않았을 것....
- 이거 말고도 python이나 django, cs 관련 기초 질문들에 대부분 제대로 대답하지 못했기 때문...
<내일 목표/>