[기업협업] 퀀텀AI -Day 10~11-

제갈창민·2022년 1월 7일
0

기업협업[퀀텀AI]

목록 보기
7/18

Legends Never Die when the world is calling you

(세상이 널 부르고 있을때, 전설은 죽지 않아 )
[ 펜타킬, "Legends Never Die" ]

D

도무지 코드가 풀리지 않을 때에는 무작정 일어나서 제일 먼저 눈 마주치는 동기에게 말을 걸거나 수다를 떨며 리프레시 하곤 했었다. 바로 어제가 기업협업 이후로 처음 동기들을 보는 날이었고, 서로가 배우는 각자의 기술 이야기, 회사에 대한 이야기, 그냥 이야기 등등을 하면서 스트레스를 풀었다. 또한 메인 이벤트였던 '27기가 29기에게' 이벤트도 역시나 기대를 저버리지 않는 짱짱한 라인업으로 잘 마무리 되었다. 단 하루였지만, 이력서와 구직에 대한 여러가지 조언도 받았고 그리운 동기들을 만날 수 있었던 소중한 하루였다.

R

Refresh 를 한껏 한 다음날인 오늘은 드디어 첫 push를 했다. 이번주 월요일부터 시작한 프로젝트에서 각자가 구현한 코드를 회사의 github에 처음으로 올린 것이다. 사수님과 같이 add, commit, pull, merge, push 까지 원스텝 원스텝 밟아가며 조심스럽게 진행한 결과, 모든 컨플릭트를 깔끔하게 해결하고 마무리 할 수 있었다.

F

프론트쪽에서도 레이아웃과 기능구현이 어느정도 완성되어서 프로젝트 시작 후 처음으로 맞춰보았다. 내가 프론트쪽 지식이 전무에 가깝기 때문에 리액트나, 리덕스를 이름만 들어보았을 뿐이라 얼마나 어려운지 감이 안왔지만, 프론트 현업 경력이 있는 팀원도 어려워 하는걸 봐선 역시 저쪽도 장난없는 것 같았다. 다행히도 프론트 사수님 역시 엄청 친절하고 꼼꼼히 봐주셔서 잘 배워나가고 있다고 했던 것 같다. 몇번의 수정과 사수님들의 도움 끝에 첫 통신도 잘 마무리 되었고 우리는 남은 기능 구현에 다시 박차를 가했다. 다음 기능은 '검색' 이었다.

TIL

class SchoolPagination(PageNumberPagination):
    page_size = 50

class SchoolViewSet(ModelViewSet):

    permission_classes = [IsAdminUser]
    serializer_class = SchoolListSerializer
    pagination_class = SchoolPagination

    def get_queryset(self):
        school_name = self.request.query_params.get('school_name')

        if school_name:
            queryset = SchoolList.objects.annotate(school_name=F('school__school_name')).filter(school_name__icontains=school_name)
        else:
            queryset = SchoolList.objects.all()
            
        return queryset

    def partial_update(self, request, pk):
        obj = SchoolList.objects.get(pk=pk)
        new_list = request.data
        serializer = SchoolListSerializer(obj, new_list)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data)

Pagination(PageNumberPagination)

DRF 에서 지원하는 pagination 은 크게 3종류가 있다.

  • PageNumberPagination
  • LimitOffsetPagination
  • CursorPagination

이외에 사용방식에 따른 Custom style도 가능하니, Custom에 대한 것은 DRF공식문서를 참고하기 바란다.
데이터양이 어마어마한 현시대의 웹에는 pagination이 필수이므로 당연히 기능구현에 포함시켰고, 이번에 사용한 것은 PageNumberPagination 이다. page_size에 설정해놓은 값을 기본값으로 해서 초과하는 데이터들은 다음 페이지로 넘기는데, 이때 자동으로 url도 생성해서 출력화면에 띄워준다. 또한, settings.py에 아래와 같이 전역설정 값을 지정해줄수도 있다.
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'apps.core.pagination.StandardResultsSetPagination' }

def get_queryset(self):

ModelViewSet은 기본적으로 3줄의 보조 코드들을 달고 있다.

  • permission_classes
  • serializer_class
  • queryset = SchoolList.objects.all()

하지만 queryset에 대해 추가 연산이 필요할 경우, def함수 내에 queryset을 사용하게 되는데, def get_queryset(self)라는 함수명을 사용하지 않으면 에러가 발생한다. 일종의 DRF공식 컨벤션이자 규칙이라 할 수 있겠다. 이렇게 사용하게 될 경우, Path or Query Parameter로 받아오는 값에 대해 아래와 같이 추가적인 코드가 필요하다.
school_name = self.request.query_params.get('school_name')
Pure Django에서 사용했던 request.GET.get()과 같은 기능을 가졌지만 형태는 조금 다르다. 이 또한 DRF만으 규칙과도 같으니, 똑같이 따라서 사용하면 되겠다.

.annotate(), F 객체, icontains

queryset = SchoolList.objects.annotate(
	   school_name=F('school__school_name')).filter(school_name__icontains=school_name)

이번 API의 핵심 코드라 할 수 있겠다. 정참조시에 쿼리문을 간소화하고 원하는 필드값을 필터링 할 수 있게 도와주는 .annotate(), 쿼리문이 DB에서 Django로 넘어온 다음 연산하는 것이 아니라, DB에서 미리 연산을 마치고 값을 가져오게 하는 F객체, 문자열을 구분하여 필터를 돕는 __contains에다가 i를 추가하여 대소문자 구분없이 해당 문자열이 포함된 모든 데이터를 필터링 해주는 __icontains메소드 까지 적용되었다.

여전히 어렵고 헷갈린다.

학습을 1주일정도 했고 프로젝트를 하면서도 계속 찾아보곤 있지만, 아직 뚜껑도 제대로 열어보지 않은 기분이 든다. 마치 뚜껑위의 글자만 읽어보고 '아, DRF 맛을 봤구나!' 라고 착각한 기분.
get_queryset이라는 함수를 써야하는지 몰랐고, Query Parameter를 받아오지도 못했으며, Pagination은 Django에서 했던 방식을 그대로 가져와 사용하려고 했다. 도무지 발전이 없는 듯한 기분을 떨치기 힘든 하루였다.

Every time you bleed for reaching greatness

Legends Never Die

(너가 위대함을 향해 피를 흘릴때마다
전설은 죽지 않아)
[ 펜타킬, "Legends Never Die" ]

profile
자기계발 중인 신입 개발자

0개의 댓글