본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

(Django) Django에서 비즈니스 로직 관리하기 Django와 Ruby On Rails를 사용하면서, 항상 고민되는 점이 있다. 각 프레임워크에서 비즈니스 로직을 모아두고, 관리하기에 적합한 위치가 어디인가에 대한 점이다. Rails 3/4 버전을 사용하면서, 찾아봤던 글은 레일즈에 Service/Decorator Layer 적용하기에 정리했었다. 이번에는 Django에서 비즈니스 로직을 관리하는 방법에 대해서 정리해보고자 한다. Django에서 비즈니스 로직을 추가할만한 곳은 크게 4가지이다. 그리고 이들 모두 각각 장/단점을 갖고 있다. model view service queryset / manager 1. Model Django에서 제안하는 비즈니스로직 관리 방식은 Model에 기능을 추가하는 것이다. MVC의 기본 설계 패턴은 Fat Mode..
(Django) CacheOps - ORM에 Redis Cache 쉽게 적용하기 django-cacheops는 Django에 Redis Cache를 쉽게 적용하고, 관리할 수 있도록 도와주는 라이브러리이다. Cacheops의 가장 큰 장점은 ORM에 캐시를 간편하게 적용할 수 있단 점이다. 이번 포스팅에서는 Cacheops의 특징과 주의할점에 대해서 정리해보고자 한다. Cacheops의 특징 A. ORM Cache A-1. 사용방법 모델에서 캐시를 바라보도록 변경하고 싶으면, 설정 파일에 아래와 같은 옵션을 추가해주면 된다. CACHEOPS = { 'auth.user': {'ops': 'get', 'timeout': 60}, } 위와 같이 추가하면, User 모델을 get으로 조회하는 경우, DB보다 캐시를 먼저 바라보게 된다. User.objects.get(user_id=1) 특정..
(Django) cached_property 란? 동일한 인스턴스의 Property를 여러번 호출하는 경우, 중복으로 연산작업을 하게 된다. Property 안에서 호출하는 함수가 비용이 큰 연산작업인 경우, 중복 연산 작업이 API 성능을 크게 떨어트릴 수 있다. Django의 cached_property decorator를 사용하면 이러한 이슈를 해결할 수 있다. cached_property는 처음 호출된 Property 함수 결과값을 캐싱해둔다. 그리고 이후에는 캐싱된 결과값을 리턴한다. 그러면 동일한 Property를 여러번 호출하더라도, 한 번의 연산만 하게 된다. Sample from django.utils.functional import cached_property from weather.utils import WeatherAPI from ..
(saleor) 가독성 좋은 함수명 만들 때 유용한 팁 모음집 이 글은 Django E-commerce OpenSource인 Saleor에서 얻은 팁들을 정리한 문서입니다. 1. 값을 증분할 때는 increase / decrease 동사를 prefix으로 붙인다.def increase_voucher_usage(voucher): voucher.used = F('used') + 1 voucher.save(update_fields=['used']) def decrease_voucher_usage(voucher): voucher.used = F('used') - 1 voucher.save(update_fields=['used']) 2. 상태를 확인할 때에는 is 동사를 prefix으로 붙인다. def is_category_on_sale(category, sale): """..
(Django) Django ORM에서 Row Lock 잡기 - select_for_update Row Lock과 SELECT * FOR UPDATEUPDATE / DELETE 없이, SELECT 만으로 Row Lock을 잡고 싶을 때는, "SELECT * FOR UPDATE" 쿼리를 사용하면 된다.이렇게 Row Lock을 잡고있는 도중에는 다른 트랜잭션에서 해당 Row를 변경 / 삭제할 수 없다. select_for_updateDjango에서 SELECT * FOR UPDATE 쿼리를 사용할 때는, Django ORM select_for_update 함수를 사용하면 된다. 이 함수는 항상 transaction과 함께 사용된다.class UserPoint(models.Model): id = models.AutoField( primary_key=True, ) user = models.ForeignKe..
(Django) Django로 e-commerce 개발할 때 참고하기 좋은 오픈소스 e-commerce Django 오픈소스 saleor 가이드문서 - https://docs.getsaleor.com/en/latest/gettingstarted/installation-macos.html 데모 사이트 - https://demo.getsaleor.com/en/ django-oscar 메인 github - https://github.com/django-oscar/django-oscar/ 데모 사이트 - https://latest.oscarcommerce.com/ko/basket/ -> 기본 이커머스 플랫폼에 붙일 수 있는 플러그인 종류도 많다. 장바구니 django-carton - https://github.com/lazybird/django-carton 쿠폰 https://github.co..
(Django) Rest Frame Work Filter 활용하기 FilterBackend 사용하기ViewSet에서 Request 파라미터로 받은 값이랑 일치하는 데이터를 조회해야할 때, 아래처럼 일일히 파라미터를 받아다가, filter 조건에 추가해줘야한다. class ProductList(generics.ListAPIView): serializer_class = PurchaseSerializer def get_queryset(self): """ This view should return a list of all the purchases for the user as determined by the username portion of the URL. """ category = self.kwargs['category'] in_stock = self.kwargs['in_s..
(Django)데이터베이스 커넥션을 관리하는 방법 Connection 재사용Django는 데이터베이스에 쿼리를 처음 날리기 전에 Connection을 맺는다. 그리고 커넥션을 계속 열어뒀다가, 다음 요청이오면 이걸 재사용한다. Request가 날라올 때마다 Connetion을 새로 맺는건 부담이 큰 작업이다. 그래서 Django에는 CON_MAX_AGE라는 설정값이 있다. 여기에 설정된 기간만큼 Connection을 닫지않고, 보존하겠다는 개념이다. 따로 설정해주지 않으면 0으로 설정된다. 즉, Connection을 매번 만들고, 닫겠단 이야기다. 그리고 만약 Connection의 사용기간에 제한을 두고 싶지 않으면, None을 설정해주면 된다. ( Persistent Connections ) Connection은 어떤 경우에 닫힐까?지정해놓은 Conn..