무엇을 공부했나요?
Two scoops of Django 6장은 Django에서 Model을 ‘올바르게’ 사용하는 법에 대한 내용이었습니다. 안영님께서 6장의 자료를 요약 및 설명해주셨고, 연태님께서 ‘데이터베이스 정규화’라는 심화 자료를 준비해 발표해주셨습니다. 그리고 김진홍님이 새로운 스터디 멤버로 합류하셨습니다.
스터디중 다루었던 이야기들은 아래와 같습니다.
6장 장고에서 모델 이용하기
-
모델은 충분히 깊이 생각해서 만들어야 한다
-
너무 큰 모델은 지양한다.
- 앱 하나에 모델이 스무개 이상일 경우 분리를 고려할 것.
- 저자의 취향은 각 앱당 모델 다섯개 미만.
-
모델 상속의 여러 방법과 각각의 장단점
- 추상화 기초 클래스 (Abstract base class)
- 멀티 테이블 상속 (Multitable inheritance)
- 프록시 모델 (Proxy model)
어떤 종류의 상속을 언제 이용해야할까?
-
Django에서 범용적으로 이용하는 TimeStampedModel을 써보자
-
데이터베이스 마이그레이션을 할 때의 주의점, 팁들
-
Django Model 디자인
- 정규화 하기
- 캐시와 비정규화
- Model field에서 Null, Blank는 각각 언제 쓸 것인가
- Binary field를 이용해야 할 때
- 범용 관계 피하기
- 발생할 수 있는 문제점
- 장점과 추천 방법
- PostgreSQL에서만 존재하는 필드의 Null, Blank 소개
-
Model의 _meta API
- 사용하는 이유
- 다음과 같은 상황에서 사용한다
-
Model manager
- Database와 연동하는 인터페이스
- Custom model manager를 사용하는 예제
- Model manager를 교체할 때 주의해야 할 부분
-
Fat model 이해하기
- Fat model에 대한 설명과 문제점
-
Model Behaviors a.k.a Mixin
-
Stateless helper functions
-
Mixin vs Helper Functions
-
요약
-
기타
- 3rd party app을 사용해서 범용관계를 만드는 것과, Generic ForeignKey를 쓰는 것의 장단점? 그 이유.
- Django의 default manager에 관하여.
심화학습: 데이터베이스 정규화
Django의 Model을 잘 이해하고 올바르게 쓰는 것 만큼 중요한 것은 그 근간이 되는 데이터베이스에 대한 학습과, 이해도를 높이는 것이라고 생각합니다. 그런 관점에서 6장에 딱 맞는 심화학습 주제였던 것 같습니다. 데이터베이스에 관해서 알아야 할 내용들이 이외에도 많이 있겠지만, 이번 심화학습의 주제는 정규화(Normalization)에 관한 부분이었습니다. 그럼 정규화란 무엇일까요?
관계형 Database의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 “정규화”라고 합니다.
정규화의 방법 등 정규화에 관한 이야기들을 연태님이 손으로 한땀한땀 만드신 자료를 가지고 설명해주셨습니다. 설명해주신 내용들을 들으면서, 여태까지 감으로 대강 모델링을 하면서 고려했던 부분들이랑 많이 겹친다라는 느낌을 받았습니다. 이런 것이 바로 짬에서 나오는 바이브일까요…?
혼자서 소규모 프로젝트를 할 때에는 크게 지장이 없겠지만, 다른 동료와 협업을 할 때 혹은 의사 결정이 필요할 때 이론적인 부분에 입각해서 커뮤니케이션을 할 수 있는 능력은 상당히 중요하다고 생각합니다. 수 많은 프로젝트를 진행해오고, 또 기초와 기본이 중요하다라는 것도 잘 알고있으면서도 데이터베이스에 대한 공부를 한번도 하지 않은 것을 반성하며, 올 여름에는 꼭 데이터베이스에 대한 공부를 해야겠다는 생각을 하였습니다.
RDB에 대하여 이야기가 끝나고 자연스레 NoSQL에 관한 이야기도 나왔습니다. 호성님께서 저에게 설명을 부탁하셨고, 마침 저는 회사에서 NoSQL database중의 하나인 Cassandra를 사용하고 있었지만, 충분히 잘 설명하지는 못했습니다.
Normalization을 잘 할 수록 좋은 RDB와는 다르게, Denormalization을 잘 할 수록 좋은 것이 NoSQL이다 라는 애매한 정도로 설명을 마쳐서, 호성님께서 다른 부분들을 보충해주셨습니다. 데이터를 저장하는 방식이라든지, 데이터 일관성에 대한 내용, Scale out에 유리하다는 점, 모델링 절차의 차이 등을 설명해주셨습니다.
듣고보니 사실 다 알고있는 내용이었는데, 충분히 잘 설명할 수 없었다는 것은 제가 충분히 잘 알고있지 않아서였겠지요.
프로젝트 모델링
발표가 끝나고 마침 배운 Modeling에 관한 내용을 활용하여, 각 조별로 프로젝트(책 관리 서비스)의 모델링을 하는 시간을 가졌습니다. 필요할 것 같은 필드들을 나열한 뒤, 정규화 과정을 거치고 사용자들이 어떤 형태로 데이터를 조회할 지를 미리 생각하며 테이블간의 관계나 제약 조건을 정하는 등, 방금 배운 내용들을 바로 활용해서인지 모델링을 하기 수월했고, 또 모두가 각자의 의견을 바탕으로 한 명쾌한 커뮤니케이션을 해서 좋았습니다.
어땠나요?
처음에 스터디에 참석한다고 하였을 때, 남홍님께서 스터디의 대상이 주로 초보고 이미 다 보았던 책인데 저에게 도움이 될까라는 걱정을 해주셨습니다. 저도 물론 그런 고민이 없었던 것은 아니지만, 곰곰히 제가 스터디를 통해서 얻으려고 하는 것들을 생각해보았습니다.
- 많은 의견들을 발언하며 개발자로서의 커뮤니케이션에 능숙해지는 것
- 쓸 수 있을 정도로 아는 것을 넘어 설명할 수 있을 정도로 아는 것
- 그런 과정에서 발견한 중요한 토픽들에 대한 필요성을 느끼고 깊이 공부하는 것
- 다른 분야의 개발자들과 교류하며 꾸준히 영감을 얻는 것
사실 그것이 꼭 Django 스터디일 필요는 없었겠지만 제가 추구하고자 하는 것들을 얻기에는 충분해보였고, 그리고 제가 개인적으로 좋아하는 서비스를 만드는 곳에서 진행되기도 해서 스터디에 조인하기로 결정하였습니다. 그리고 오늘이 두번째 스터디였는데요, 좋은 결정이었다고 생각합니다. 알고 있던 것을 어떻게 잘 설명해야할지 고민해보는 것, 미처 몰랐던 기본적인 것들에 대한 되새김을 해보는 것, 실제 B2C서비스를 운영하면서 겪는 경험들을 듣는 것 모두 혼자서 겪기는 어려운 부분이니까요. 그리고 무엇보다 항상 매우매우매우 열심히 공부 하시는 다른 분들을 보며 자극을 받는 것 또한 스터디로 얻을 수 있는 매우 큰 이점이라고 생각합니다. 다음번 스터디도 매우 기대가 되며, 좋은 지식들을 얻고 저도 나눠줄 수 있기를 바랍니다.