TIL49 - django, djongo, mongo

Kiyong Lee·2021년 11월 2일
1

Django

목록 보기
28/35

django, djongo, mongo


원티드 프리온보딩 과정에 참여했는데, 첫 과제부터 만만치 않은 산과 마주했습니다

약 2달간 장고와 MySQL을 배웠는데, 플라스크와 몽고DB를 사용해야 하는
과제였기 때문입니다.

우선 팀 구성은 6명으로 이루어져 있으며, 아래와 같은 팀원들이 있습니다.

팀원
김민호, 김주형, 박치훈, 박현우, 이기용(팀장), 이정아

3명씩 나누어서 과제를 진행했으며, 나눠진 팀원은 아래와 같습니다.

김민호, 박치훈, 이기용
김주형, 박현우, 이정아


1. django with mongo

우선 팀 회의에서, 플라스크를 공부하며 구현할 지,
장고로 일단 구현하고 플라스크는 차차 공부할지 정했습니다.

팀원들과 논의 끝에 시간여유가 없어 우선 장고로 구현하기로 결론이 났습니다.

우선, 몽고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에 대해 조금 더 알아보는 시간을 가졌습니다.


2. mongoDB

우선, 몽고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이 필요 없어 확장성이 좋다고 합니다.

이 부분은 플라스크를 직접 공부해보며 테스트 해볼 예정입니다.


3. django djongo

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라는 컬렉션에 저장된 결과물이 나오게 됩니다.


4. 후기

장고에 익숙해져서 flask, fast api가 낯설다보니 이번에 못 써본 게 아쉽습니다.

팀원들과 과제를 빨리 마무리한 후, 금주내로 플라스크를 한 번씩 훑어보기로 했고
플라스크를 보던 중, 정말 몽고DB 최적화된 프레임워크고
많은 스타트업들이 몽고DB를 많이 쓰기 때문에 공부를 더 열심히 해야겠구나..
라고 느꼈습니다.

타 프레임워크에 익숙해져서, 기업이 요구하는 기술 스택에 맞출 수 있는 개발자가
하루 빨리 되고 싶습니다.

출처 : mongoDB공식문서, 아마존 noSQL

profile
ISTJ인 K-개발자

0개의 댓글