SlideShare a Scribd company logo
1 of 46
Download to read offline
Django, 저는 이렇게 씁니다. 
알파카코믹스를 개발하면서.
안녕하세요. 풀 스택 개발자 파이입니다. 
진짜로 서버 조립에서 디자인까지 해봄 
스마트스터디에서 일하고 있습니다.
Django로 먹고 살아온 세월 5년 
5년이면 많이 알겠네요?! 
해본 것도 기억 못해요…
발표 왜 하세요? 
일 만하다 보니 제가 뭐하고 있나 싶었어요. 
기억력이 안 좋아서 방금 짠 코드도 까먹습니다. 
잊기 전에 뭐라도 남기고 싶었습니다. 
아는 것도 별로 없지만 막상 적으려면 더 없어요. OTL 
해본 거 
탐험이 필요한 
미지의 영역 
아는 거 
발표
Django 왜 쓰나요? 
할 일은 많고 사람은 없을 때. 
시간도 없을 때. 
귀찮을 때.
알파카코믹스를 개발하면서 
만들면서 겪은 문제들을 
어떻게 해결(땜빵)했는지 
간략하게 이야기해보겠습니다.
프로젝트를 시작할 때 
신경 쓰는 게 신상에 이롭습니다.
모델이 제일 중요합니다. 
모든 것의 근원, 데이터의 흐름 
가장 오랫동안 고민해도 부족하지 않습니다. 
많은 연습을 필요로 합니다.
모듈을 용도 별로 나누세요. 
천 줄 짜리 코드를 나중에 다시 열면 
내가 짠 거 알면서도 욕이 나옵니다. 
모델에 기초해서 어떻게 하든 나누세요.
예) 프로젝트 레이아웃 
/alpaca 
/comic 
/profile 
/... 
/conf 
/production 
/settings.py 
/testing 
앱 내부 
배포 환경에 따른 세팅
Python 가상 환경은 선택이 아닌 필수 
pyenv 
https://github.com/yyuu/pyenv 
virtualenv wrapper 
https://pypi.python.org/pypi/virtualenvwrapper
Front-end는 Bower로 관리 
bower.json 
{ 
"name": "alpacacomics", 
"dependencies": { 
"jquery": "1.9.1", 
….. 
} 
} 
.bowerrc 
{"directory":"alpaca/static/components"} 
$ bower update
User에 cash 넣을래요.
Profile Model과 OneToOneField 
profile/models.py 
class Profile(models.Model): 
user = models.OneToOneField(settings.AUTH_USER_MODEL) 
cash = models.IntegerField(defalut=0) 
user.profile.cash 로 접근 
http://perhapsspy.wordpress.com/2013/02/18/a-simple-way-how-to-extend-user-model-in-django-1-5/
Profile 모델에 관련 함수 모으기 
캐시 충전 
캐시 환불 
스토어 별 캐시 
ex) user.profile.cash_charge(...)
장점 
다른 라이브러리와 충돌 걱정 없다. 
관리도 쉽다. 
구현이 제일 쉽다. 
2가지 방법이 더 있으나 
쉬운 게 최고…..는 아니고 상황에 맞게 찾아 쓰세요.
소셜 로그인이 필요해요.
Django-allauth 
이름처럼 모든 것을 해줌. 
일반 가입, 소셜 로그인 및 관리, 
이메일 인증, 비밀번호 찾기, 등. 
단, 한글은 직접 .po 파일을 만들어야...(or template) 
잘 쓰려면 adepter도 고치고...
template을 적당히 고쳐서 쓰면 그럴 듯합니다.
스크롤을 내리면 이어지게 
ajax 지옥...
HTML을 조각조각 따따따 
template_name = ‘item_list.html’ 
if request.is_ajax(): 
template_name = ‘_item.html’ 
javascript는 최대한 단순하게. 
하지만 아무래도 귀찮다. 맘에 들게 널 다시 조립할거야
CBV로 한번 만들고 계속 쓰자. 
반복 작업을 싫어하시는 당신을 위한 
CBV - Class Based View 
만들어둔 Class를 조립해서 쓴다. 
https://docs.djangoproject.com/en/1.7/topics/class-based-views/
Mixin을 써보자 
class ChangeTemplateMixin(object): 
# ajax 요청이 들어오면 template 변경 
class MoreListMixin(ChangeTemplateMixin): 
# 무한 스크롤 구현 
class CashUseLogView(MoreListMixin, ListView): 
# 위의 믹스인을 합쳐서 날로 먹기 
class CashChargeLogView(MoreListMixin, ListView): 
# 계속해서 날로 먹기
이렇게 됩니다.
RESTful API가 필요한데요.
Django REST framework 
기능이 엄청 많습니다. 
CBV로 API를 만들 수 있습니다. 
즉, 모델만 잘 짜두면 순식간에 만듭니다. 
단순한 API는 1~2시간이면 뚝딱. 
하지만 속도가 느리다는 게 함정. 
자세한 설명은 문서 참고하세요. 최근에 3.0까지 나왔습니다. 
http://www.django-rest-framework.org/
사이트가 느려요. 
DB와 Cache로 해결해봅시다.
DB 쿼리 최적화 
두 가지만 기억하세요. 
222쿼리가 2쿼리로 줄어드는 마법이 벌어집니다. 
select_related - Foreign-key 관계 
prefetch_related - Many to Many 관계 
여러 쿼리를 join으로 합쳐줍니다.
예) DB 쿼리 최적화 
Comic.objects.all().select_related(‘author’)  
.prefetch_related(‘tags’) 
Product.objects.get(id=1).select_related( 
‘episode’, ‘episode__comic’)
CBV는 어떻게 쿼리 최적화 하나요. 
class CashUseLogView(MoreListMixin, UserFilterMixin, ListView): 
model = CashUseLog 
template_name = 'cash/use_log.html' 
ajax_template_name = 'cash/_use_log.html' 
def get_queryset(self): 
return super(CashUseLogView, self).get_queryset()  
.select_related('product', 'product__episode__comic', 'product__episode') 
class ComicDetail(MoreListMixin, ProductsMixin, SingleObjectMixin, ListView): 
def get(self, request, *args, **kwargs): 
queryset = Comic.objects.all()  
.select_related('author', 'category')  
.prefetch_related('tags') 
self.object = self.get_object(queryset=queryset) 
return super(ComicDetail, self).get(request, *args, **kwargs) 
이렇게
Cache를 바릅니다. 
View, Template 등을 상황에 맞춰 적당히(!?!) 
Cache의 핵심 
어느 타이밍에 갱신할 것인가?
데이터가 변하면 갱신하자. 
class Comic(models.Model): 
… 
def save(....): 
cash_update()
이것도 Class로 만들어 두고 조립. 
class Comic(CacheDeleteModel, models.Model): 
… 
def save(....): 
cash_update()
Django-compressor 
staic 파일들을 압축해준다. 
STATICFILES_FINDERS = ( 
... 
"compressor.finders.CompressorFinder", 
) 
COMPRESS_OFFLINE = True 
COMPRESS_CSS_FILTERS = {'compressor.filters.cssmin.CSSMinFilter',} 
COMPRESS_OFFLINE_CONTEXT = {'STATIC_URL': "/static/",} 
$ python manage.py compress 
https://github.com/django-compressor/django-compressor
Admin 페이지 어떻게 써요?
예) admin.py 
def release_display(instance): 
if instance.release: 
return instance.release.strftime('%y.%m.%d %H:%M') 
return instance.release 
release_display.admin_order_field = 'release' 
release_display.short_description = u'출시일시' 
class ComicAdmin(admin.ModelAdmin): 
list_display = ['id', 'category', 'name', 'author', 'publisher', 'rating', 
'view_count', 'purchase_count', 
'active', 'end', release_display, 'recommended', 'weight', 'last_weight', 
'login_required_episode', 'episode_count'] 
list_filter = ['active', 'category', 'rating', 'recommended', 'service_ext'] 
list_editable = ['recommended', 'weight', 'last_weight', 'login_required_episode'] 
raw_id_fields = ['author', 'publisher', 'tags'] 
readonly_fields = ['view_count', 'purchase_count', 'episode_count'] 
def get_queryset(self, request): 
return super(ComicAdmin, self).queryset(request)  
.select_related('category', 'author', 'publisher') 
admin.site.register(Comic, ComicAdmin) 
쿼리 최적화
예) Admin 화면 
아래와 같이 대충 쓸 만해집니다.
기타 다른 Admin 설정 
list_display_links : 목록에서 누를 수 있는 링크가 되는 필드 
list_per_page : 목록의 아이템 수 
date_hierarchy : 지정한 날짜 필드 기준 필터 생성 
ordering : 순서 
search_fields : 검색 대상 필드
배포는?
제가 자주 씁니다. 
OS : Ubuntu 
Web Server : Nginx 
App Server : uWSGI 
Django Version : 1.7+ 
Database : Mysql or Postgresql 
설정하기 쉽다는 공통점이 있습니다.
간단한 스크립트. 
git pull 
cp nginx.conf /etc/nginx/site-enabled/app 
pip install -r requirements.txt 
bower update 
python manage.py collectstatic 
service nginx reload 
service uwsgi reload
사실 Docker 쓰고 있어요. 
방금 전 스크립트는 Dockerfile 흉내. 
Docker registry (회사 전용) 
Gadget (배포 도구)
요약하겠습니다. 
힘들어서 여기까지만.
그러니까, 
● 모델이 제일 중요합니다. 
● User 모델 확장은 OneToOne 
● 소셜 로그인은 Django-allauth 
● 반복 작업은 CBV 
● DB최적화는 select_related, prefetch_related 
● Cache는 컨트롤이 중요 
● Admin는 django 핵심 기능입니다.
질문 받습니다. 
더 많은 것을 담아보려다 
체력이 고갈 되어 질문으로 넘어갑니다.
감사합니다. 
끝.

More Related Content

What's hot

[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화NAVER D2
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리YoungHeon (Roy) Kim
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Sungchul Park
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축Youngil Cho
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQLPgDay.Seoul
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]MongoDB
 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Tom Brander
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱PgDay.Seoul
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기경원 이
 
3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐Terry Cho
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민종민 김
 
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.NAVER D2
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOPDzmitry Naskou
 
[수정본] 우아한 객체지향
[수정본] 우아한 객체지향[수정본] 우아한 객체지향
[수정본] 우아한 객체지향Young-Ho Cho
 
Spring boot Under Da Hood
Spring boot Under Da HoodSpring boot Under Da Hood
Spring boot Under Da HoodMichel Schudel
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교Woo Yeong Choi
 
Clean architectures with fast api pycones
Clean architectures with fast api   pyconesClean architectures with fast api   pycones
Clean architectures with fast api pyconesAlvaro Del Castillo
 

What's hot (20)

[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
 
An introduction to MongoDB
An introduction to MongoDBAn introduction to MongoDB
An introduction to MongoDB
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?
 
Mongo DB Presentation
Mongo DB PresentationMongo DB Presentation
Mongo DB Presentation
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기
 
3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민
 
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
[수정본] 우아한 객체지향
[수정본] 우아한 객체지향[수정본] 우아한 객체지향
[수정본] 우아한 객체지향
 
Spring boot Under Da Hood
Spring boot Under Da HoodSpring boot Under Da Hood
Spring boot Under Da Hood
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교
 
Clean architectures with fast api pycones
Clean architectures with fast api   pyconesClean architectures with fast api   pycones
Clean architectures with fast api pycones
 

Viewers also liked

뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표Kyoung Up Jung
 
Django개발은 PyCharm에서
Django개발은 PyCharm에서Django개발은 PyCharm에서
Django개발은 PyCharm에서Kyoung Up Jung
 
How to deploy oVirt using Nested KVM environment?
How to deploy oVirt using Nested KVM environment?How to deploy oVirt using Nested KVM environment?
How to deploy oVirt using Nested KVM environment?Rogan Kyuseok Lee
 
Personal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manualPersonal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manualCirculus
 
123D Design - 모델링 기초
123D Design - 모델링 기초123D Design - 모델링 기초
123D Design - 모델링 기초Circulus
 
Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용Circulus
 
라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoTCirculus
 
Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅Circulus
 
숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)
숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)
숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)Kevin Kim
 
123D Design - 정리함 만들기
123D Design - 정리함 만들기123D Design - 정리함 만들기
123D Design - 정리함 만들기Circulus
 
RHCE FINAL Questions and Answers
RHCE FINAL Questions and AnswersRHCE FINAL Questions and Answers
RHCE FINAL Questions and AnswersRadien software
 
파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기Yong Joon Moon
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 Yong Joon Moon
 
TensorFlow Tutorial
TensorFlow TutorialTensorFlow Tutorial
TensorFlow TutorialNamHyuk Ahn
 
Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기SangWoo Kim
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Yongho Ha
 
IoT 서비스 아키텍처 분석 및 Case Study-Innovation Seminar
IoT 서비스 아키텍처 분석 및 Case Study-Innovation SeminarIoT 서비스 아키텍처 분석 및 Case Study-Innovation Seminar
IoT 서비스 아키텍처 분석 및 Case Study-Innovation Seminar영섭 임
 
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기위키북스
 

Viewers also liked (20)

뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표
 
Django개발은 PyCharm에서
Django개발은 PyCharm에서Django개발은 PyCharm에서
Django개발은 PyCharm에서
 
Splunk 교육자료 v1.2
Splunk 교육자료 v1.2Splunk 교육자료 v1.2
Splunk 교육자료 v1.2
 
How to deploy oVirt using Nested KVM environment?
How to deploy oVirt using Nested KVM environment?How to deploy oVirt using Nested KVM environment?
How to deploy oVirt using Nested KVM environment?
 
Personal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manualPersonal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manual
 
Splunk6.3 소개서 2015_11
Splunk6.3 소개서 2015_11Splunk6.3 소개서 2015_11
Splunk6.3 소개서 2015_11
 
123D Design - 모델링 기초
123D Design - 모델링 기초123D Design - 모델링 기초
123D Design - 모델링 기초
 
Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용
 
라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT
 
Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅
 
숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)
숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)
숭실대교육교재 - IoT 산업에서 오픈소스의 활용방안(김형채)
 
123D Design - 정리함 만들기
123D Design - 정리함 만들기123D Design - 정리함 만들기
123D Design - 정리함 만들기
 
RHCE FINAL Questions and Answers
RHCE FINAL Questions and AnswersRHCE FINAL Questions and Answers
RHCE FINAL Questions and Answers
 
파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기
 
TensorFlow Tutorial
TensorFlow TutorialTensorFlow Tutorial
TensorFlow Tutorial
 
Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
 
IoT 서비스 아키텍처 분석 및 Case Study-Innovation Seminar
IoT 서비스 아키텍처 분석 및 Case Study-Innovation SeminarIoT 서비스 아키텍처 분석 및 Case Study-Innovation Seminar
IoT 서비스 아키텍처 분석 및 Case Study-Innovation Seminar
 
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
앱 인벤터 2: 비전공자를 위한 안드로이드 앱 만들기
 

Similar to Django, 저는 이렇게 씁니다.

레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기Jiyong Jung
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃Kwangyoun Jung
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2성일 한
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여iamprogrammerofficial
 
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web AnimationsChang W. Doh
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기Kwangyoun Jung
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
웹사이트기획 및 관리
웹사이트기획 및 관리웹사이트기획 및 관리
웹사이트기획 및 관리봉조 김
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)Jinwook On
 
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판hyeonjae Cheon
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기우영 주
 
Modern web application with meteor
Modern web application with meteorModern web application with meteor
Modern web application with meteorJaeho Lee
 
Html5&css 3장
Html5&css 3장Html5&css 3장
Html5&css 3장홍준 김
 
쇼핑검색 React 전환 경험 공유
쇼핑검색 React 전환 경험 공유쇼핑검색 React 전환 경험 공유
쇼핑검색 React 전환 경험 공유NAVER SHOPPING
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 

Similar to Django, 저는 이렇게 씁니다. (20)

레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
 
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
웹사이트기획 및 관리
웹사이트기획 및 관리웹사이트기획 및 관리
웹사이트기획 및 관리
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)
 
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
 
Modern web application with meteor
Modern web application with meteorModern web application with meteor
Modern web application with meteor
 
Html5&css 3장
Html5&css 3장Html5&css 3장
Html5&css 3장
 
Showroom 2019-react
Showroom 2019-reactShowroom 2019-react
Showroom 2019-react
 
쇼핑검색 React 전환 경험 공유
쇼핑검색 React 전환 경험 공유쇼핑검색 React 전환 경험 공유
쇼핑검색 React 전환 경험 공유
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 

More from Kyoung Up Jung

Django 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdf
Django 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdfDjango 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdf
Django 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdfKyoung Up Jung
 
OK, 계획대로 되고 있어?
OK, 계획대로 되고 있어?OK, 계획대로 되고 있어?
OK, 계획대로 되고 있어?Kyoung Up Jung
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?Kyoung Up Jung
 
Django를 배우다, Django로 배우다.
Django를 배우다, Django로 배우다.Django를 배우다, Django로 배우다.
Django를 배우다, Django로 배우다.Kyoung Up Jung
 
어른스럽게 일하기
어른스럽게 일하기어른스럽게 일하기
어른스럽게 일하기Kyoung Up Jung
 
신입에서 CTO까지, 야근하지 않는 웹개발
신입에서 CTO까지, 야근하지 않는 웹개발신입에서 CTO까지, 야근하지 않는 웹개발
신입에서 CTO까지, 야근하지 않는 웹개발Kyoung Up Jung
 
웹 개발, 왜 어려운가?
웹 개발, 왜 어려운가?웹 개발, 왜 어려운가?
웹 개발, 왜 어려운가?Kyoung Up Jung
 
Django ORM 왜 어렵게 느껴질까?
Django ORM 왜 어렵게 느껴질까?Django ORM 왜 어렵게 느껴질까?
Django ORM 왜 어렵게 느껴질까?Kyoung Up Jung
 

More from Kyoung Up Jung (9)

Django 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdf
Django 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdfDjango 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdf
Django 봄은 다시 온다 - Django와 함께 좋은 웹서비스 코드 만들기.pdf
 
NRISE에서 3개월
NRISE에서 3개월NRISE에서 3개월
NRISE에서 3개월
 
OK, 계획대로 되고 있어?
OK, 계획대로 되고 있어?OK, 계획대로 되고 있어?
OK, 계획대로 되고 있어?
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?
 
Django를 배우다, Django로 배우다.
Django를 배우다, Django로 배우다.Django를 배우다, Django로 배우다.
Django를 배우다, Django로 배우다.
 
어른스럽게 일하기
어른스럽게 일하기어른스럽게 일하기
어른스럽게 일하기
 
신입에서 CTO까지, 야근하지 않는 웹개발
신입에서 CTO까지, 야근하지 않는 웹개발신입에서 CTO까지, 야근하지 않는 웹개발
신입에서 CTO까지, 야근하지 않는 웹개발
 
웹 개발, 왜 어려운가?
웹 개발, 왜 어려운가?웹 개발, 왜 어려운가?
웹 개발, 왜 어려운가?
 
Django ORM 왜 어렵게 느껴질까?
Django ORM 왜 어렵게 느껴질까?Django ORM 왜 어렵게 느껴질까?
Django ORM 왜 어렵게 느껴질까?
 

Django, 저는 이렇게 씁니다.

  • 1. Django, 저는 이렇게 씁니다. 알파카코믹스를 개발하면서.
  • 2. 안녕하세요. 풀 스택 개발자 파이입니다. 진짜로 서버 조립에서 디자인까지 해봄 스마트스터디에서 일하고 있습니다.
  • 3. Django로 먹고 살아온 세월 5년 5년이면 많이 알겠네요?! 해본 것도 기억 못해요…
  • 4. 발표 왜 하세요? 일 만하다 보니 제가 뭐하고 있나 싶었어요. 기억력이 안 좋아서 방금 짠 코드도 까먹습니다. 잊기 전에 뭐라도 남기고 싶었습니다. 아는 것도 별로 없지만 막상 적으려면 더 없어요. OTL 해본 거 탐험이 필요한 미지의 영역 아는 거 발표
  • 5. Django 왜 쓰나요? 할 일은 많고 사람은 없을 때. 시간도 없을 때. 귀찮을 때.
  • 6. 알파카코믹스를 개발하면서 만들면서 겪은 문제들을 어떻게 해결(땜빵)했는지 간략하게 이야기해보겠습니다.
  • 7. 프로젝트를 시작할 때 신경 쓰는 게 신상에 이롭습니다.
  • 8. 모델이 제일 중요합니다. 모든 것의 근원, 데이터의 흐름 가장 오랫동안 고민해도 부족하지 않습니다. 많은 연습을 필요로 합니다.
  • 9. 모듈을 용도 별로 나누세요. 천 줄 짜리 코드를 나중에 다시 열면 내가 짠 거 알면서도 욕이 나옵니다. 모델에 기초해서 어떻게 하든 나누세요.
  • 10. 예) 프로젝트 레이아웃 /alpaca /comic /profile /... /conf /production /settings.py /testing 앱 내부 배포 환경에 따른 세팅
  • 11. Python 가상 환경은 선택이 아닌 필수 pyenv https://github.com/yyuu/pyenv virtualenv wrapper https://pypi.python.org/pypi/virtualenvwrapper
  • 12. Front-end는 Bower로 관리 bower.json { "name": "alpacacomics", "dependencies": { "jquery": "1.9.1", ….. } } .bowerrc {"directory":"alpaca/static/components"} $ bower update
  • 14. Profile Model과 OneToOneField profile/models.py class Profile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL) cash = models.IntegerField(defalut=0) user.profile.cash 로 접근 http://perhapsspy.wordpress.com/2013/02/18/a-simple-way-how-to-extend-user-model-in-django-1-5/
  • 15. Profile 모델에 관련 함수 모으기 캐시 충전 캐시 환불 스토어 별 캐시 ex) user.profile.cash_charge(...)
  • 16. 장점 다른 라이브러리와 충돌 걱정 없다. 관리도 쉽다. 구현이 제일 쉽다. 2가지 방법이 더 있으나 쉬운 게 최고…..는 아니고 상황에 맞게 찾아 쓰세요.
  • 18. Django-allauth 이름처럼 모든 것을 해줌. 일반 가입, 소셜 로그인 및 관리, 이메일 인증, 비밀번호 찾기, 등. 단, 한글은 직접 .po 파일을 만들어야...(or template) 잘 쓰려면 adepter도 고치고...
  • 19. template을 적당히 고쳐서 쓰면 그럴 듯합니다.
  • 21. HTML을 조각조각 따따따 template_name = ‘item_list.html’ if request.is_ajax(): template_name = ‘_item.html’ javascript는 최대한 단순하게. 하지만 아무래도 귀찮다. 맘에 들게 널 다시 조립할거야
  • 22. CBV로 한번 만들고 계속 쓰자. 반복 작업을 싫어하시는 당신을 위한 CBV - Class Based View 만들어둔 Class를 조립해서 쓴다. https://docs.djangoproject.com/en/1.7/topics/class-based-views/
  • 23. Mixin을 써보자 class ChangeTemplateMixin(object): # ajax 요청이 들어오면 template 변경 class MoreListMixin(ChangeTemplateMixin): # 무한 스크롤 구현 class CashUseLogView(MoreListMixin, ListView): # 위의 믹스인을 합쳐서 날로 먹기 class CashChargeLogView(MoreListMixin, ListView): # 계속해서 날로 먹기
  • 26. Django REST framework 기능이 엄청 많습니다. CBV로 API를 만들 수 있습니다. 즉, 모델만 잘 짜두면 순식간에 만듭니다. 단순한 API는 1~2시간이면 뚝딱. 하지만 속도가 느리다는 게 함정. 자세한 설명은 문서 참고하세요. 최근에 3.0까지 나왔습니다. http://www.django-rest-framework.org/
  • 27. 사이트가 느려요. DB와 Cache로 해결해봅시다.
  • 28. DB 쿼리 최적화 두 가지만 기억하세요. 222쿼리가 2쿼리로 줄어드는 마법이 벌어집니다. select_related - Foreign-key 관계 prefetch_related - Many to Many 관계 여러 쿼리를 join으로 합쳐줍니다.
  • 29. 예) DB 쿼리 최적화 Comic.objects.all().select_related(‘author’) .prefetch_related(‘tags’) Product.objects.get(id=1).select_related( ‘episode’, ‘episode__comic’)
  • 30. CBV는 어떻게 쿼리 최적화 하나요. class CashUseLogView(MoreListMixin, UserFilterMixin, ListView): model = CashUseLog template_name = 'cash/use_log.html' ajax_template_name = 'cash/_use_log.html' def get_queryset(self): return super(CashUseLogView, self).get_queryset() .select_related('product', 'product__episode__comic', 'product__episode') class ComicDetail(MoreListMixin, ProductsMixin, SingleObjectMixin, ListView): def get(self, request, *args, **kwargs): queryset = Comic.objects.all() .select_related('author', 'category') .prefetch_related('tags') self.object = self.get_object(queryset=queryset) return super(ComicDetail, self).get(request, *args, **kwargs) 이렇게
  • 31. Cache를 바릅니다. View, Template 등을 상황에 맞춰 적당히(!?!) Cache의 핵심 어느 타이밍에 갱신할 것인가?
  • 32. 데이터가 변하면 갱신하자. class Comic(models.Model): … def save(....): cash_update()
  • 33. 이것도 Class로 만들어 두고 조립. class Comic(CacheDeleteModel, models.Model): … def save(....): cash_update()
  • 34. Django-compressor staic 파일들을 압축해준다. STATICFILES_FINDERS = ( ... "compressor.finders.CompressorFinder", ) COMPRESS_OFFLINE = True COMPRESS_CSS_FILTERS = {'compressor.filters.cssmin.CSSMinFilter',} COMPRESS_OFFLINE_CONTEXT = {'STATIC_URL': "/static/",} $ python manage.py compress https://github.com/django-compressor/django-compressor
  • 36. 예) admin.py def release_display(instance): if instance.release: return instance.release.strftime('%y.%m.%d %H:%M') return instance.release release_display.admin_order_field = 'release' release_display.short_description = u'출시일시' class ComicAdmin(admin.ModelAdmin): list_display = ['id', 'category', 'name', 'author', 'publisher', 'rating', 'view_count', 'purchase_count', 'active', 'end', release_display, 'recommended', 'weight', 'last_weight', 'login_required_episode', 'episode_count'] list_filter = ['active', 'category', 'rating', 'recommended', 'service_ext'] list_editable = ['recommended', 'weight', 'last_weight', 'login_required_episode'] raw_id_fields = ['author', 'publisher', 'tags'] readonly_fields = ['view_count', 'purchase_count', 'episode_count'] def get_queryset(self, request): return super(ComicAdmin, self).queryset(request) .select_related('category', 'author', 'publisher') admin.site.register(Comic, ComicAdmin) 쿼리 최적화
  • 37. 예) Admin 화면 아래와 같이 대충 쓸 만해집니다.
  • 38. 기타 다른 Admin 설정 list_display_links : 목록에서 누를 수 있는 링크가 되는 필드 list_per_page : 목록의 아이템 수 date_hierarchy : 지정한 날짜 필드 기준 필터 생성 ordering : 순서 search_fields : 검색 대상 필드
  • 40. 제가 자주 씁니다. OS : Ubuntu Web Server : Nginx App Server : uWSGI Django Version : 1.7+ Database : Mysql or Postgresql 설정하기 쉽다는 공통점이 있습니다.
  • 41. 간단한 스크립트. git pull cp nginx.conf /etc/nginx/site-enabled/app pip install -r requirements.txt bower update python manage.py collectstatic service nginx reload service uwsgi reload
  • 42. 사실 Docker 쓰고 있어요. 방금 전 스크립트는 Dockerfile 흉내. Docker registry (회사 전용) Gadget (배포 도구)
  • 44. 그러니까, ● 모델이 제일 중요합니다. ● User 모델 확장은 OneToOne ● 소셜 로그인은 Django-allauth ● 반복 작업은 CBV ● DB최적화는 select_related, prefetch_related ● Cache는 컨트롤이 중요 ● Admin는 django 핵심 기능입니다.
  • 45. 질문 받습니다. 더 많은 것을 담아보려다 체력이 고갈 되어 질문으로 넘어갑니다.