에이모의 기업과제 중 request.session에 원하는 값을 임의로 넣어줄 수 있다는 것을 알게 되었습니다.
from settings.py import SECRET_KEY, ALGORITHM
access_token = jwt.encode({'id' : user.id}, SECRET_KEY, algorithm = ALGORITHM)
request.session['user'] = user.id
로그인해서 토큰 발급을 받은 다음, 유저의 고유 ID값을 session에 넣어줄 수 있게 설정할 수 있습니다.
세션에 대해 들어보기만 했지, 실제로 사용한 적이 없었는데 필요한 정보가 있다면 이렇게 저장할 수 있다는 걸
알게 되었습니다.
프레시코드 기업 과제 중 처음으로 select_related와 prefetch_related를 사용했습니다.
다양한 관계에 의해 사용하는 경우가 달라지지만,
저는 정참조면 select_related를, 역참조면 prefetch_related를 사용했습니다.
class Category(TimeStampModel) :
name = models.CharField(...)
class Meta :
db_table = 'categories'
class Badge(TimeStampModel):
name = models.CharField(...)
class Meta:
db_table = 'badges'
class Menu(TimeStampModel):
category = models.ForeignKey(Category, on_delete = models.CASCADE)
badge = models.ForeignKey(Badge, on_delete = models.CASCADE)
...
class Meta:
db_table = 'menus'
class Item(TimeStampModel) :
menu = models.ForeignKey(Menu, on_delete = models.CASCADE)
....
class Meta :
db_table = 'items'
Menu 는 대표 메뉴 하나에 대한 정보를 담고, 카테고리(Category)와 뱃지(Badge)를 참조합니다.
Item은 메뉴의 세부정보들(사이즈, 사이즈별가격 등)이 있습니다.
이렇게 설정되어 있을 때, 메뉴를 통해 카테고리와 뱃지, 아이템에 접근하려면
class MenuDetailView(View) :
def get(self, request, menu_id) :
menus = Menu.objects.filter(id=menu_id)
for menu in menus :
badge_id = menu.badge.id
category_id = menu.category.id
items = menu.item_set.all()
Menu 모델을 통해 menus 테이블에만 접근하고 뱃지와 카테고리 테이블엔 접근하지 않았으니,
반복문에서 뱃지와 카테고리로 접근하기 위한 menu. 코드는 DB Hits을 추가로 하게 됩니다.
그리고 get을 통해 리턴한 객체는 반복문을 돌릴 수 없어서 filter를 사용해야 했습니다.
결국 get을 통해 하나만 가져올 수 있음에도 filter를 써야하는 불편함이 있으며
ORM 최적화를 제대로 고려하지 못한 코드가 되는 것입니다.
그런데, select_related와 prefetch_related를 사용하면 불필요한 접근을 할 필요 없었습니다.
class ItemView(View) :
def get(self, request, menu_id) :
menus = Menu.objects.select_related('category', 'badge').\
prefetch_related('item_set').get(id=menu_id)
select_related를 사용함으로써 menus 테이블과 categories , badges테이블을 JOIN 한 뒤,
교집합 관계의 데이터만 바로 접근할 수 있게 설정해줬습니다.
이렇게 설정하면, 카테고리나 뱃지로 접근할 때 DB Hits를 추가로 하지 않습니다.
그 다음, JOIN을 통해 얻은 DATA SET으로 items 테이블에 접근해야 합니다.
특정 메뉴에 속해 있으며 역참조 관계인 items 테이블에 접근하기 위해 prefetch_related를 이용했습니다.
역참조 시, 기본적으로 class이름_set 이라는 이름으로 접근하고, models.py에서 related_name을 설정해서
접근할 수도 있습니다.
이번엔 related_name을 지정해주지 않아서 _set으로 접근했습니다.
최종적으로 메뉴 아이디가 Path Parameter로 받은 메뉴 아이디와 일치하는
items 테이블의 데이터로 접근할 수 있게 됩니다.
이번 기업과제를 하며, 처음으로 Postman API 문서를 작성하게 되었습니다.
기존에는 Integration Test 용으로만 Postman을 사용했었습니다.
처음으로 테스트뿐만 아니라, API문서를 처음부터 끝까지 작성 후 팀원들에게 공유해줌으로써
팀원들에게 어떻게 테스트를 해야할지, 코드를 짜야할 지 방향성을 줄 수 있었습니다.
제가 작성한 문서링크는 해당 링크를 클릭하시면 이동합니다.