SW개발/Django

    [Django]SetUpTestData의 격리 지원 (feat. Django > 3.2)

    지난번 Side effect를 방지하는 테스트 코드 작성법에서 언급했던 내용이 Django 3.2 버전 업그레이드를 통해 변경된 것이 있어 포스팅을 추가적으로 작성하게 되었습니다. 지난 포스팅 https://leffept.tistory.com/415 [Django]Side effect 를 방지하는 테스트 코드 작성법 Side effect 를 방지하는 테스트 코드 작성 테스트 코드 작성의 중요성을 깨닫고 난 후부터 신경을 써서 테스트를 작성하고 있습니다. 오늘은 Django로 테스트를 작성하면서 Side effect가 발생했던 경 leffept.tistory.com SetUpTestData 의 격리 지원 기존에는 SetUpTestData에 선언한 클래스 프로퍼티의 경우 테스트 메소드간의 격리를 지원하지 않..

    [Django]get_or_create() 란?

    이번 포스팅에서는 Django QuerySet API 중 하나인 get_or_create에 대해서 알아보겠습니다. get_or_create() 란? get_or_create는 모델 객체를 생성할 때 이미 있는 객체라면 가져오고 없으면 생성하는 QuerySet API 중 하나입니다. 간단하게 사용법을 알아보겠습니다. 기본 사용법 class Leffe(models.Model): name = models.CharField(max_length=30) ... obj, created = Leffe.objects.get_or_create(name='leffe') 위 코드는 leffe 라는 이름을 가진 객체가 있다면 가져오고 없다면 객체를 생성하여 줍니다. 또한, created 라는 값을 통해 객체의 생성 여부도 파악..

    [Django]DateField의 auto_now_add 옵션, 정확히 알아보기

    이번 포스팅에서는 DateField의 auto_now_add 옵션을 사용하다가 이슈를 겪었던 경험과, 잘 모르고 있던 내용에 대해서 정리해보겠습니다. auto_now_add 옵션을 True로 설정하면 얻게되는 효과는 너무 간단합니다. 현재 시간을 기준으로 값이 설정되도록 하는 것입니다. 따라서 보통은 created_at 처럼 객체가 생성된 시각을 기록하는 필드에 사용합니다. 너무 단순하게 생각했던 나머지 세부적인 사항에 대해서는 잘 알지 못했습니다. 코드를 통해 자세히 알아보겠습니다. 문제가 생겼던 코드 Event 모델이 존재하고, 속성으로 이벤트가 시작하는 시간과 종료되는 시간이 있다고 가정하겠습니다. class Event(models.Model): name = models.CharField(max_l..

    [Django]Side effect 를 방지하는 테스트 코드 작성법

    Side effect 를 방지하는 테스트 코드 작성 테스트 코드 작성의 중요성을 깨닫고 난 후부터 신경을 써서 테스트를 작성하고 있습니다. 오늘은 Django로 테스트를 작성하면서 Side effect가 발생했던 경험을 공유해보려고 합니다. 우선 제가 늘 지키는 테스트의 원칙 중 하나는 아래와 같습니다. 테스트는 서로 의존적이지 않아야 한다. 즉, 테스트 케이스를 수정하여도 다른 테스트 케이스의 실행은 보장되어야 한다. 사건은 코드를 리팩토링 하는 일이 생기면서 테스트 케이스 또한 같이 수정하는 작업에서 시작됩니다. 리팩토링도 마무리 짓고 테스트에 대한 수정도 끝나 테스트를 돌리는 순간이었습니다. 분명히 수정했던 부분과는 연관이 되지 않은 다른 테스트 케이스의 결과가 깨지기 시작했습니다. 😕 도저히 코드..

    [Django]GenericForeignKey의 문제점 (feat. 안티패턴의 지름길)

    GenericForeignKey 란? https://leffept.tistory.com/358 [Django]GenericForeignKey, ContentType로 여러 모델과의 관계 맺기 RDB를 사용하여 모델을 만들다 보면 한 모델이 여러 모델과의 관계를 맺어야 하는 순간이 생기기 마련입니다. 일반적으로 생각한다면 ForeignKey를 이용하여 모델링을 하는 방법이 떠오를 것입니다 leffept.tistory.com GenericForeignKey와 구현 방법에 대해서는 이전에 다루었기에 해당 포스팅의 링크만 남겨두도록 하겠습니다. 우선, 지난번에도 단점을 살짝 언급하였지만 직접 개발을 진행하다보니 돌이킬 수 없는 단점들이 몇몇 보이게 되어 포스팅을 다시 작성하게 되었습니다. Performance ..

    [Django]1.11에서 3.2로 버전 업그레이드 방법 (마이그레이션)

    이번 게시물에서는 실제 운영중인 서비스의 장고 버전을 업그레이드 하면서 좋은 팁들과 경험을 공유해보려고 합니다. 관련 공식 문서의 링크는 아래와 같습니다. https://docs.djangoproject.com/ko/3.2/howto/upgrade-version/ Django를 최신 버전으로 업그레이드하고 있습니다. | Django 문서 | Django Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate docs.djangoproject.com 1. 하나의 기능 버전을 차례로 올리는 것이 좋습니다. 1.11을 사용중이라..

    [Django]silk로 프로파일링 하기

    개발을 진행하다보면 어느 순간에는 성능 문제를 겪기 마련입니다. 이전까지 잘 작동하던 코드가 트래픽이 많아짐에 따라서 문제가 될 수도 있고, 쌓이는 데이터의 양이 많아짐에 따라 문제가 될 수도 있습니다. 이 때 Django의 silk 프로파일러를 활용한다면 좀 더 쉽게 병목 구간을 찾을 수 있습니다. https://github.com/jazzband/django-silk GitHub - jazzband/django-silk: Silky smooth profiling for Django Silky smooth profiling for Django. Contribute to jazzband/django-silk development by creating an account on GitHub. github.c..

    [Django]setUp() vs setUpTestData() 차이점

    Django에서 unittest를 진행할 때 초기 데이터들을 설정하기 위해서는 다음과 같은 메소드가 사용될 수 있다. setUp() setUpTestData() https://docs.djangoproject.com/en/3.1/topics/testing/tools/#testcase Testing tools | Django documentation | Django Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate docs.djangoproject.com 겉으로 보기에 두 함수는 동일한 역할을 한다. 하지만 동작하는 원..

    [Django]get_object() 란?

    get_object() 란? 간단하게 get_object()는 pk로 queryset을 필터링 하고, queryset 결과에서 object를 뽑아서 return 시켜주는 함수이다. 실제 코드는 class SingleObjectMixin(ContentMixin) 내에서 확인할 수 있다. https://docs.djangoproject.com/en/3.2/ref/class-based-views/mixins-single-object/#singleobjectmixin Single object mixins | Django documentation | Django Django The web framework for perfectionists with deadlines. Overview Download Documen..

    [Django]GenericForeignKey, ContentType로 여러 모델과의 관계 맺기

    RDB를 사용하여 모델을 만들다 보면 한 모델이 여러 모델과의 관계를 맺어야 하는 순간이 생기기 마련입니다. 일반적으로 생각한다면 ForeignKey를 이용하여 모델링을 하는 방법이 떠오를 것입니다. 위의 설명으로는 부족하니 하나의 모델을 통해 예시를 들어 설명해보겠습니다. class Post(models.Model): title = models.CharField(max_length=100) # 여러 필드들 class Comment(models.Model): content = models.CharField(max_length=100) # 여러 필드들 class Recommend(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE)..