오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Web Programming/Django 25

[Django] 장고 비즈니스 로직 어디둬야하는 고민하는 사람들 드루와..

장고를 써온지도 어느 1년이 되었다. 장고는 굉장히 장단점이 명확한 프레임워크 였다. 스타트업들이 가장 빠르게 MVP를 만들어 볼 수 있지만 프로덕트 크기가 커짐에 따라 코드관리가 어려워지는게 문제다. 오늘은 코드관리가 어려운 장고에서 비즈니스 로직관리를 어떤식으로 할 수 있는지에 대해 적어보도록 하겠다. 1. Model 너 누구야? 먼저 본격적으로 비즈니스 로직을 분리하기 전에 장고에서 비즈니스 로직의 핵심이 되는 Model에 대해서 몇가지 이야기해야 한다. Model의 가장 대표적인 역할은 데이터베이스와 서버어플리케이션 사이의 인터페이스 역할이다. 가령 데이터베이스를 변경해야할 때 장고에서는 setttings에서 사용할 데이터베이스만 변경하면 된다. 즉 데이터베이스 변경으로 인한 변화가 어플리케이션 ..

[Django] Django MySQL Fulltext Index 설정

오늘은 Django-mysql로 구성되어 있는 어플리케이션에서 Full text index를 설정하는 방법에 대해 알아보겠다. 먼저 현재 장고에서는 Fulltext 인덱스를 ORM으로 지원하지 않기 때문에 실제 쿼리를 데이터 베이스에 날려 동작해줘야한다. 아래 명령어를 통해 FullText를 설정하는 쿼리를 마이그레이션 파일로 만들어주자. app_name에 마이그레이션 파일을 생성하고자하는 app 이름을 작성해주면 된다. python manage.py makemigrations app_name --empty --settings=app.settings.local 생성된 마이그레이션 파일은 아래와 같다. 이제 operations안에 Fulltext를 생성하는 쿼리를 작성해주자. from django.db i..

[pytest] Trouble Shooting

1. 여러개의 데이터베이스를 사용할 때 프로덕트에서 부하 부담의 이유로 replica 데이터베이스를 사용하고 있고 테스트 데이터 베이스를 따로 사용하고 있다면 제대로 테스트가 돌아가지 않을 수 있다. 데이터가 작성되는 곳은 마스터 데이터베이스이고 읽어올때는 replica 데이터 베이스에서 읽어오기 때문이다. 물론 테스트 데이터베이스도 동일하게 구성 할 수 있지만 온갖 설정을 피하고 싶을때 아래처럼 사용하면 된다. @pytest.fixture(autouse=True) def mock_BaseManager(mocker): mocker.patch( "companies.models.Company.objects.using", return_value=Company.objects.using("default"), ) ..

[DRF] Serializer Validation

Serializer는 입력값을 검증하는 역할을 할 수 있다. 이 글에서는 Serializer의 Validation 기능에 대해 알아보도록 하겠다. 가령 request 내부에 포함된 데이터를 이용해 유저를 만드는 경우를 생각해보자. UserCreateSerializer는 아래와 같이 작성 할 수 있다. 물론 ModelSerializer를 이용해 검증하는 방법도 있지만 동작을 확인하기 위해 Serializer를 사용하도록 하자. class UserCreateSerializer(serializers.Serializer): username = serializers.CharField() # ID password = serializers.CharField() # 비밀번호 password2 = serializers...

[Django] Aggregate와 Annotate

아래에서 사용된 코드는 아래 레포지토리에서 받을 수 있다. https://github.com/junha6316/django_ex junha6316/django_ex Contribute to junha6316/django_ex development by creating an account on GitHub. github.com 장고 ORM의 기능 중 Aggregate와 Annotate에 대해 정리한 글이다. 어떤 기능을 하고 있는지는 많이 들어 알고 있지만 실제로 사용해본적은 없다; http://raccoonyy.github.io/django-annotate-and-aggregate-like-as-excel/ (엑셀만큼 쉬운) Django Annotation/Aggregation Django ORM을 강력..

[Django] python manage.py를 하면 무슨 일이?(runserver 편)

지난 글에서는 python manage.py를 작성했을 때 어떤 과정으로 명령어가 실행되는지 알아보았다. 이번 포스트에서는 python manage.py 명령어 중에 가장 많이 사용한다고 해도 무방한 python manange.py runserver 를 사용했을 때 어떤 일이 발생하는지 알아보겠다. 1. 코드 먼저 지난 글에서 python manage.py [파일이름]을 작성하면 해당 파일을 실행시켜준다는 것을 알았다. 이를 통해 python manage.py runserver를 실행시키면 runserver.py를 실행 시켜주는 것을 알 수 있다. runserver.py 코드는 아래와 같다. 가시성을 위해 메인 로직만을 적어놓았으며 자세한 코드를 확인하고 싶다면 아래 링크나 VS code에서 Go to ..

[장고백서] 필드에서 작성한 validator가 작동을 안할 때

필드에 validators를 선언해 해당 필드 값에 제한을 둘 때가 있다. 가령 이름에 공백을 포함하고 싶지 않다면 해당 기능을 아래와 같이 구현할 수 있다. #persons/models.py from django.db import models from .validators import space_validator class Person(models.Model): name = models.CharField("이름", max_length=100, validators=[space_validator,]) #persons/validators.py from django.core.exceptions import ValidationError def space_validate(value): if len(value.sp..

[Django] Form 동적으로 생성하기

현재 하고 있는 프로젝트의 요구 사항중에 admin에서 몇가지 설정을 통해 이벤트 랜딩페이지를 생성하는 부분이 있었다. 이벤트마다 수집하는 개인정보가 달랐기 때문에 수집 개인정보 항목(이름, 전화번호..등등)을 이벤트와 ManyToMany로 연결시켜서 이벤트마다 수집 개인정보 항목을 다르게 수집할 수 있도록 만들어 주었다. 일단 기한안에 완성해야했기 때문에 view에 모든 부분을 구현하고 배포한뒤 코드를 보니 개인정보를 받는 view나 django template 쪽의 코드가 지나치게 지저분해졌다. 이를 리팩토링하기 위해 form을 사용해서 이벤트마다 동적으로 폼을 생성할 수 있도록 만들어 주기로 했다. 이번 포스트에서는 정적인 form이 아닌 모델 마다 변하는 동적인 폼을 생성하는 방법에 대해 알아보도..

[Django] 이미지 파일업데이트시 기존 파일 삭제하기

1. 직접 구현 원하는 모델의 save method를 아래와 같이 오버라이드 해주면 된다. import sys class Blablabla(model.model): def save(self, *args, **kwargs): #해당하는 model 클래스를 갖고온다. mod = getattr(sys.modules[__name__], self._meta.object_name) try: obj = mod.objects.get(id=self.id) except: obj = None else: for field in obj._meta.fields: field_type = field.get_internal_type() #필드 이름이 FileField나 ImageField 라면 if field_type == 'File..

[Django] python manage.py를 하면 무슨 일이?

가장 많이 사용하는 Django 명령어 순위를 뽑아보면 당연히 아래의 명령어들이 상위에 있을 것이다. python manage.py makemigrations python manage.py migrate python manage.py runserver python manage.py startapps python manage.py createsuperuser 하지만 장고를 사용하는 4개월 동안 단 한번도 이 manage.py가 무슨 일을 하는지 생각해본적이 없다.. 하지만 문득 얘는 뭘하는 애지 라는 생각이 들었고. python manage.py something 을 작성했을 때 무슨 일이 일어나는지 관련된 명령어들에 대한 분석을 해보려고 했다. 이번 글은 그런 글들 중 첫번째 글로 python manag..