원티드 백엔드 프리온보딩 코스 구현 상세 내용

Kiyong Lee·2021년 12월 1일

포트폴리오

목록 보기
3/3

1. request.session (Aimmo 기업과제 中)

Git Repository

에이모의 기업과제 중 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에 넣어줄 수 있게 설정할 수 있습니다.
세션에 대해 들어보기만 했지, 실제로 사용한 적이 없었는데 필요한 정보가 있다면 이렇게 저장할 수 있다는 걸
알게 되었습니다.


Git Repository

프레시코드 기업 과제 중 처음으로 select_relatedprefetch_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_relatedprefetch_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)
  1. select_related를 사용함으로써 menus 테이블과 categories , badges테이블을 JOIN 한 뒤,
    교집합 관계의 데이터만 바로 접근할 수 있게 설정해줬습니다.
    이렇게 설정하면, 카테고리나 뱃지로 접근할 때 DB Hits를 추가로 하지 않습니다.
    그 다음, JOIN을 통해 얻은 DATA SET으로 items 테이블에 접근해야 합니다.

  2. 특정 메뉴에 속해 있으며 역참조 관계인 items 테이블에 접근하기 위해 prefetch_related를 이용했습니다.
    역참조 시, 기본적으로 class이름_set 이라는 이름으로 접근하고, models.py에서 related_name을 설정해서
    접근할 수도 있습니다.
    이번엔 related_name을 지정해주지 않아서 _set으로 접근했습니다.

  3. 최종적으로 메뉴 아이디가 Path Parameter로 받은 메뉴 아이디와 일치하는
    items 테이블의 데이터로 접근할 수 있게 됩니다.


3. Postman API Documentation 작성 ( Freshcode 기업 과제 中 )

Git Repository

이번 기업과제를 하며, 처음으로 Postman API 문서를 작성하게 되었습니다.
기존에는 Integration Test 용으로만 Postman을 사용했었습니다.
처음으로 테스트뿐만 아니라, API문서를 처음부터 끝까지 작성 후 팀원들에게 공유해줌으로써
팀원들에게 어떻게 테스트를 해야할지, 코드를 짜야할 지 방향성을 줄 수 있었습니다.
제가 작성한 문서링크는 해당 링크를 클릭하시면 이동합니다.

profile
ISTJ인 K-개발자

0개의 댓글