창업(2012~) : http://www.intakefoods.kr • CTO : 서비스 기획/개발/운영 과거 • 모바일 게임 개발사 ‘어썸피스’ : 동기/비동기 게임 서버 개발(Python, Java) • GIS SW 개발사 ‘자올소프트’ : 브라우저 기반 웹 지도 엔진 개발(Javascript) 기술 • Languages : Python, Java, Javascript • Framework/Library : Django, Flask, Celery, Node.js • Cloud : AWS / AWS Solutions Architect Associate 취득 • 기타 : Google Analytics / GAIQ 취득
표기 사항 등) • ShopProductThumbnail(제품 썸네일 이미지) • ShopProductReview(고객 상품 후기) • ProductStockTransaction(제품 재고 변화 기록 모델) • … • 기능적 구분에 따라 추가적인 정보를 저장하는 Model을 추가 • 각 Model은 핵심 Model(Product)를 Foreign Key로 참조
정도의 복잡하지 않은 카테고리 구조를 가지는 쇼핑몰이라면 : 카테고리 정보를 일반적인 Model로 구성하고 Product 모델이 ManyToMany를 이용하여 카테고리를 참조하도록 개발 class Category(models.Model): name = models.CharField(max_length=32, help_text=u"식품 유형별 카테고리 이름") index = models.IntegerField(default=0, help_text=u"카테고리 표시 순서(모바일), 적을 수록 먼저 표시됨") class SubCategory(models.Model): category = models.ForeignKey(Category) name = models.CharField(max_length=32, help_text=u"서브 카테고리 이름") index = models.IntegerField(default=0, help_text=u"서브 카테고리 표시 순서, 적을 수록 먼저 표시됨") class ShopProduct(models.Model): categories = models.ManyToManyField(Category) sub_categories = models.ManyToManyField(SubCategory)
Key로 구현하면.. : Foreign Key Hell • Django-mptt : Django ORM을 확장하여 RDBMS 상에서 계층적(Hierarchical)인 데이터를 처리 할 수 있도록 해주 는 라이브러리, Django Manager를 확장하여 트리 탐색을 도와주는 Method를 제공
담기, 수량 변경, 삭제, 가격 계산 기능 • Django-carton : Django 기반의 장바구니 라이브러리. Django에서 사용자가 설 계한 제품 Model을 장바구니에서 바로 사용 가능하며, 위의 기초적인 장바구니 기 능들을 지원. • Session 을 기반으로 장바구니 내용 저장
종류에 따른 배송비 처리 기능 구현 • 로그인 한 유저에 대해, 장바구니 내용 보존을 위해 장바구니 내용을 JSON으로 serialize 하여 DB에 저장 => 주문 완료되지 않은 장바구니 내용의 경우 서로 다른 종류의 브라우저/Device에서 로그인 했을 경우에도 내역 보존 => 고객이 장바구니에 담은 내역을 실시간으로 분석 가능 (eg. 어떤 상품을 주로 장바구니에 많이 담나?, 어떤 상품을 장바구니에 담았다가 결제하지 않나?)
SDK 코드를 보면서 1:1 Python 버전으로 포 팅하여 사용 • 하지만, 우리나라 PG사 결제 연동을 직접 하는 것은..지옥의 시작 • Python SDK 지원 X, 난해한 개발 매뉴얼, 결제 서비스 특성 상 테스트 하기 어려운 환경, 카카오페이/페이코 등의 간편결제로 인한 복수의 PG 연동 필요성 등.. PG 직접 연동은 제가 해봐서 알아요… 하지마세요…
Django admin은 일반적으로 사용하기에는 불편함. • 목적 및 사용 대상에 따라 Django admin과 직접 제작한 UI로 이분하여 사용 • Django admin • Model의 내용을 새로 등록 하거나 검색, 수정하는 작업 • 컨텐츠 등록 작업, low-level CRUD 작업 등 • 사용 대상 : 개발자, 쇼핑몰 최종관리자[MD] 등 • 직접 제작 UI • Model 내용을 등록/수정을 빈번하게 하지는 않지만 복잡한 View logic 을 가진 작업 • 사용성이 중요한 작업 • 매출 통계, 주문/배송 조회, 고객센터 문의 관리 등 • 사용 대상 : 모든 멤버
이벤트, 공지사항, 제품 상세페이지 등 쇼핑몰 많은 부분에 HTML 편집이 필요 => 하지만 쇼핑몰 관리 담당자는 HTML을 사용하지 못함 • WYSIWYG : What You See Is What You Get • WYSIWYG 에디터인 Summernote를 Django Admin 에 손쉽게 통합 가능
CSS/JS 파일을 Admin Form 에 삽입 하는 기능 • 일부 UI 개선 • Javascript 를 이용한 추가 기능 삽입 class MainCategoryBestProductForm(forms.ModelForm): class Meta: model = MainCategoryBestProduct fields = ('__all__') class Media: css = { 'all': ('css/admin.css',) } class MainCategoryBestProductInline(admin.TabularInline): model = MainCategoryBestProduct form = MainCategoryBestProductForm
caching 할 수 있는 라이브러리 • 변할 여지가 적고, 자주 통계 기능에서 Access 되는 Queryset들을 Caching. if "cacheops" in settings.INSTALLED_APPS: monthly_sales_aggregation = orders.values('month').annotate(Sum('order_sum'), Count('id')).order_by('month').cache(timeout=60*60) else: monthly_sales_aggregation = orders.values('month').annotate(Sum('order_sum'), Count('id')).order_by('month')
함께 작업이 실행되어야 하나 그 작업이 사용자 경험에 해로운 Blocking을 유발할 우 려가 있는 작업들 (eg. 외부 API와의 I/O 작업이 필요한 Email/SMS/카카오톡 발송) • 실행 시간이 긴 작업 (eg. 회원 대상 대량 SMS 발송, 넓은 기간 범위에 대한 관리자의 매출 통계 조회) • 쇼핑몰에서 왜 작업 스케쥴링이 필요 할까? • 일정 주기마다 자동으로 실행되어야 하는 작업들 (eg. 매일 자정 멤버 대상 매출 통계 메일 발송, 물류 센터 API로 부터 운송장 가져오기, 회원 휴면 계정 처리, 회원 등급 평가)
등록된 task를 비동기로 실행하는 예시 from celery import Celery app = Celery('intake-async') app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task def expire_coupon(): """ 관리자가 요청 할 경우 사용기간이 지난 쿠폰을 만료 처리함 “”” for c in CouponModel.objects.filter(status=COUPON_STATUS.ISSUED, expiration_date__isnull=False): c.expire_coupon() from async.celery import expire_coupon expire_coupon.delay()
• 개발된 코드를 업로드 하기만 하면 아래와 같은 AWS상의 리소스를 자동으로 생성하고 서비스 가능한 상태로 서로 연결 시켜줌 • AWS EC2 : 서버 인스턴스 • AWS ELB : 로드밸런서 • AWS VPC/Security Group : Private Cloud 네트워크 및 보안 방화벽 설정 • Autoscaling Group : 서비스 부하에 따른 자동화된 Autoscaling • AWS RDS : Managed RDBMS(MySQL/PostgreSQL) • AWS Cloud Watch/SNS : 인프라 관련 지표/알림 서비스
Static File에 많은 신경을 써야 합니다. (상품 썸네일, 긴 상품 상세페이지 등) • AWS S3 : AWS에서 제공하는 내구도 높은 Static file 저장 서비스 • Static file 제공 기능을 웹 서버에서 완전히 분리하여 더욱 빠르고 내구도 높은 AWS S3가 Static file을 Serving 하도 록 변경 • Django-storages : Django의 Static/Media 파일을 AWS S3상에 저장 할 수 있도록 해주는 Django Storage Backed 라이브러리(Azure, Google Cloud 등도 가능)
: AWS에서 제공하는 CDN 서비스 • 48개 도시/79개 Location을 통한 지리적 Caching • S3만으로 서비스하는 것보다 많은 경우에 비용 효율적 • 무료 HTTPS 인증서 적용, 커스텀 도메인 적용 가능 • 다양한 Caching 정책을 활용하여 Django가 생성하는 컨텐츠 일부에 대해서도 Caching 가능 (eg. 브랜드 소개페이지 등 장시간 변화가 없는 페이지)
(img, js, css…) • AWS S3+CloudFront 사용 AWS Cloud Front • Django에 의해 동적으로 생성되어야 하는 리소스(eg. 로그인, 세션 데이터 등)를 제외하고 웹페이지와 S3상의 Static File을 모두 CloudFront에 캐싱
생각보다 많은 난관이 존재 합니다. (Email Blacklist/Whitelist 처리 등) • 전 세계적으로 가장 성공적인 이메일 마케팅 서비스 • Webhook, REST API, Python SDK 지원 • 전자 상거래 통합 기능으로 고객의 장바구니/구매내역에 기반한 상세한 고객 타게팅 메일링 가능