개요 DRF에서 ViewSet을 사용하지 않지만, pagination 구조를 사용하기 위해 정리를 진행 해 보았다. ViewSet에서의 기본 사용 예시 DRF에서 페이지네이션은 다음과 같이 사용된다. def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self....
인스타그램 API와 저장 최적화
개요 인스타그램 API를 사용해서 어떤 기능을 만들기로 했다. 인스타그램에서 작성한 게시물들을 받아와 저장해두고, 추후에 서비스에서 게시글을 작성할 때 상단에 미리보기 처럼 나타낼 수 있는 형태이다. 다만 문제가 되는것은 인스타그램 미디어의 이미지, 동영상 부분이었다. 미래에 사용할 거라고 확신할 수 없는 데이터를 저장하는 것은 자원 낭비라고 생...
Django의 쿼리 최적화 - 집합의 활용
개요 몇달 간 새로운 기능을 작업하고, 기존에 구현되어 있던 코드의 최적화에 시간을 쏟았다. 주어진 여러 문제 중에서, 재미있는 로직을 최적화 한 과정이 있어 소개해보려고 한다. 집합 속성을 통한 contains 처리 문제 프론트엔드에서 하나의 태그를 여러 게시물을 추가하는 작업을 하게 되었다. 프론트 엔드에서 주는 데이터는 다음과 같았다. {...
Django에서 비동기 처리 - 데이터의 처리 구조
개요 이전 포스트에서는 비동기 처리 시 데이터의 저장 구조에 대해 고민해보았다. 이번에는 저장된 데이터를 어떻게 하면 적절히 처리할 수 있을 지 알아보려고 한다. 최종적으로 결정되었던 데이터 저장 구조는 다음과 같다. 위 구조를 기반으로, 데이터를 처리하는데 어떤 부분을 고려해야할지 생각해보았다. 데이터 처리 구조 처리 사이클 메인 큐에서 ...
Django에서 비동기 처리 - 데이터의 저장 구조
개요 서비스에서 하나의 로직을 작성할 때면, 비동기로 작업을 수행해야 할 때가 있다. 일반적으로는 파이썬의 비동기 처리 방법에서 자주쓰이는 Celery가 생각이 들 것이다. 하지만 이번에도 제약조건이 몇가지 있다. 첫번째, celery를 사용할 수 없다. celery worker의 추가 관리 소요에 의해, 당장 사용할 수 없었다. 두번째...
Django 템플릿에서의 inclusion_tag 사용
개요 Django 템플릿에서는 동적인 서브 템플릿을 다른 템플릿에 삽입할 수 있다. 이번에 해결해야 했던 문제는, 템플릿마다 서로 다른 폰트가 적용될 수 있도록 지정하는 것이었다. 상세 조건은 다음과 같았다. 서비스 전체에서 지원하는 폰트가 5-6가지가 있다. 각 템플릿에서는 font_name이라는 정보 데이터를 가진다. 위 font...
DRF에서 커스텀 로그인 & 사용자 모델 작성하기
개요 회원 기능을 만드는 데는 여러 방법을 사용할 수 있다. Django Rest Framework에서는 이러한 인증(Authentication) 방법으로 여러가지를 지원한다. 이 중에는 JWT를 쉽게 사용할 수 있는 서드파티 패키지인 simplejwt도 있다. 하지만 이번에는 패키지를 그대로 쓰는 것이 아닌, 인증 시스템의 흐름에 대해 알아보자....
Django 테스트에 mocking 적용하기
개요 프로젝트의 유닛 테스트를 진행하면서 여러 비효율적인 상황을 볼 수 있다. 여기 어떤 기능을 실행하는데 오래 걸리는 전처리 작업이 있다. 이 기능은 사용자의 요청이 발생하면 A -> B -> C 순서로 작업을 진행하는데, 문제는 A, B 작업이 너무 오래 걸리는 작업이라는 점이다. 테스트에서 A, B, C를 각각 테스트하고 싶지만 C를...
DRF에서 테스트 코드 작성하기(3) - factory boy
개요 factory boy는 테스트 시 사용해야 할 중복된 코드들을 관리하기 위한 패키지다. 앞서 사용한 테스트 코드에서는 다음과 같은 코드가 있었다. 여기서 유저 데이터나 로그인 정보와 같은 데이터를 선언하는데 임의의 값을 일일히 지정해야 하는 문제점이 있다. ... @classmethod def setUpTestData(cls)...
DRF에서 테스트 코드 작성하기(2) - reverse
개요 앞서 테스트 코드에서 url을 문자열로 선언을 해 두었다. 하지만 선언했던 url에 오탈자를 수정하였거나, url을 아예 고친 경우를 고려해보자. 이런 상황에서는 urls.py에 수정한 대로 테스트 코드의 url도 고쳐야하는 문제점이 있다. 이런 상황을 간단히 해결할 수 있는 것이 바로 reverse이다. reverse 작동 원리 rever...