원티드 프리온보딩 과정에 참여했는데, 첫 과제부터 만만치 않은 산과 마주했습니다
약 2달간 장고와 MySQL을 배웠는데, 플라스크와 몽고DB를 사용해야 하는
과제였기 때문입니다.
우선 팀 구성은 6명으로 이루어져 있으며, 아래와 같은 팀원들이 있습니다.
팀원
김민호, 김주형, 박치훈, 박현우, 이기용(팀장), 이정아
3명씩 나누어서 과제를 진행했으며, 나눠진 팀원은 아래와 같습니다.
김민호, 박치훈, 이기용
김주형, 박현우, 이정아
우선 팀 회의에서, 플라스크를 공부하며 구현할 지,
장고로 일단 구현하고 플라스크는 차차 공부할지 정했습니다.
팀원들과 논의 끝에 시간여유가 없어 우선 장고로 구현하기로 결론이 났습니다.
우선, 몽고DB를 장고와 연동시켜야 했습니다.
찾아본바로는, pymongo / mongoengine / djongo 이렇게 세가지가 있었는데
djongo가 기존에 배운 방법을 잘 사용할 수 있다고 판단하여 채택되었습니다.
우선 django에서 djongo를 설치해주었습니다
pip install djongo
그다음 DB세팅을 아래와 같이 해주었습니다.
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'aimmo',
'HOST': '127.0.0.1',
'PORT': 27017,
}
}
이렇게 세팅 후 몽고DB에 대해 조금 더 알아보는 시간을 가졌습니다.
우선, 몽고DB의 가장 큰 특징은 noSQL이라는 것이었습니다.
처음에 noSQL이라고 해서, SQL 쿼리를 안쓰는 건 줄 알았는데
Not-Only SQL의 약자로, DB의 전통적인 관계형 데이터베이스보다
덜 제한적인 형태로 데이터를 저장한다고 합니다.
아래에는 mongoDB 공식문서에서 설명해주는 기존의 SQL과 차이점입니다.
현재 수준에서 가장 큰 차이는 기존의 table/row/column으로 불리던 것이
collection/document/field라고 불리게 된 것이라고 볼 수 있습니다.
기존의 SQL은 특정 테이블에 1개의 row가 추가 되었다면,
몽고DB는 컬렉션이라는 곳에 문서의 모음이 저장된 형태이며,
그 문서는 json형태로 저장된 데이터들을 의미합니다.
그렇기 때문에 이전의 관계지향적인 데이터베이스와 달리 문서로 이루어져 있어서
문서지향(document-oriented) 형태라고 불리게 되는 것입니다.
이번에 저희는 djongo를 이용하여 진행한터라 migration을 진행했지만,
mongoDB는 migration이 필요 없어 확장성이 좋다고 합니다.
이 부분은 플라스크를 직접 공부해보며 테스트 해볼 예정입니다.
serialzier를 사용할까 했지만, 기존에 장고를 통해 저장한 방법도 된다고 하여
이번에는 사용하지 않았습니다.
djongo를 이용한 게시글 등록을 예시로 보여드리겠습니다
class Category(TimeStampModel):
name = models.CharField(max_length=100)
class Meta:
db_table = 'categories'
class Posting(TimeStampModel):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
views = models.IntegerField(default=0)
content = models.TextField()
class Meta:
db_table = 'postings'
우선 모델링 과정입니다.
기존의 장고 방식을 그대로 사용하였고, 게시글을 쓸 때 특정 유저가
특정 카테고리를 선택할 수 있어서 Forienkey로 설정하였습니다.
class PostingView(View) :
@login_decorator
def post(self, request) :
try :
data = json.loads(request.body)
user = request.user
category = Category.objects.get(id=data['category'])
Posting.objects.create(
category = category,
user = user,
title = data['title'],
content = data['content']
)
return JsonResponse({'message' : 'Posting Success'}, status=201)
except KeyError :
return JsonResponse({'message' : 'Key Error'}, status=400)
except Category.DoesNotExist :
return JsonResponse({'message' : 'Category matching query does not exist'}, status=400)
유저는 데코레이터를 이용하여, 로그인한 유저의 정보를 가져오고
카테고리는 게시글 작성 시 선택한 카테고리의 id값이 넘어오게 됩니다.
그 다음 게시글등록하는 Posting.objects.create()
를 해주면
데이터가 생성됩니다.
이렇게 게시글 등록에 필요한 데이터를 포스트맨을 통해 입력 후 저장하면
아래와 같이 postings라는 컬렉션에 저장된 결과물이 나오게 됩니다.
장고에 익숙해져서 flask, fast api가 낯설다보니 이번에 못 써본 게 아쉽습니다.
팀원들과 과제를 빨리 마무리한 후, 금주내로 플라스크를 한 번씩 훑어보기로 했고
플라스크를 보던 중, 정말 몽고DB 최적화된 프레임워크고
많은 스타트업들이 몽고DB를 많이 쓰기 때문에 공부를 더 열심히 해야겠구나..
라고 느꼈습니다.
타 프레임워크에 익숙해져서, 기업이 요구하는 기술 스택에 맞출 수 있는 개발자가
하루 빨리 되고 싶습니다.
출처 : mongoDB공식문서, 아마존 noSQL