본문 바로가기
Django

Django란? #Python #웹 프레임워크

by Django_ 2020. 4. 9.
반응형

 

Django는 현재 Python으로 웹 개발할 때 사용할 수 있는 제가 생각하기에

아주 강력한 프레임워크입니다.

2005년 7월 15일부터 출시되어 2020년 4월 8일 기준 3. 대 버전까지 나와있습니다.

웹 개발을 처음 입문하는 분들은 Django 쉬우면서 어려우실 수 있습니다.

우선 디잔고? ㄷ장오? 뭐라고 읽어야할지 한글을 쓰는 우리에게는 어렵죠

처음에 찾아볼때 저는 어무해로 기억했었죠. (한/영 타이핑 시 어무해)

쥉고라고 하는 것도 같고 주웽고라고 하는것도 같고 하지만 한글로는 대부분 장고라고 하는것 같습니다~(당연한 이야기)

 

본론으로 돌아와 초보자 시점에서 좋은 점과 어려운점을 간략하게 정리해보았습니다.

(startproject, startapp, createsuperuser를 하실 줄 안다는 가정입니다)

해당 내용에서 더 자세한 내용은 차차 포스팅하여 링크하도록 하겠습니다~

좋은점

- 방대한 라이브러리와 빌트인

"무엇을 좋아할지 몰라 다 준비해뒀어"라는 콘셉트의 장고는 아 이런 기능 없나 하고 구글링 하면 대부분 있습니다. 만약에 없다면? 구글링 하는 법을 공부하시고 다시 해보시면 있을 것입니다. 이미 이 부분에서 많은 게 해결됩니다.

 

- Admin 페이지

꼭 필요한 회원가입, 로그인, 로그아웃, 세션 관리를 할 줄 몰라도 이미 할 줄 알게 됩니다.

소셜 로그인도 라이브러리로 간단하게 붙일 수 있습니다.

 

-런서버 (runserver)

테스트를 하면서 바로바로 서버를 띄워 직접 보고 테스트하면서 개발할 수 있습니다. 테스트 코드 작성이 어려운 초보 개발자들에게는 직접 클릭하고 눈으로 볼 수 있는 게 최고겠죠~?

 

-ORM

데이터베이스 몰라도, SQL문을 몰라도, 우선 복붙으로 다양한 DB를 붙이고 사용할 수 있습니다. 몰라도의 전제는 처음에만 적용되는 거겠죠?

 

-django-rest-framework

API 필요는 한데 어떻게 개발하고 관리해야 할지 겁이 났지만 DRF로 직관적이면서 강력하게 관리하실 수 있습니다. serializers로 데이터 유효성 검사부터 저장까지 간편하게 관리할 수 있습니다. API로 데이터만 주고받을 수 있어도 할 수 있는 게 상당히 많아지는 것 같습니다.

class ItemListView(APIView):

    def get(self, request, format=None):
        if request.user.is_staff:
            payments = {'product': '아이스크림', 'price': '50,000'} 
            return Response(payments)
        else:
            return Response(status=status.HTTP_403_FORBIDDEN)

    def post(self, request, format=None):
        serializer = serializersItemSerializer(data=request.data)
        if serializer.is_valid():
            product = request.data['product']

 

어려운 점

- MVC + Form

알면 강력하지만 알수록 복잡한 MVC패턴과 Form은 처음에 이해하기가 어려운 부분이 있었습니다. 유효성 검사를 철저하게 해 주기 때문에 잘 적용하면 안전하고? 정확한? 데이터를 전달받을 수 있습니다

Form의 경우 아 이런 거구나 했지만 막상 사용해보면 이럴 땐 어떻게 해야 하지? 막히는 부분이 제일 많은 부분이었던 것 같고 지금도 잘 다루기는 어려운 것 같습니다. 

class ProductForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
	super(ProductForm, self).__init__(*args, **kwargs)
	self.fields['employees'].queryset = User.objects.filter(is_staff=True, is_active=True)
    
    class Meta:
        model = models.Product

# 예를 들어 셀렉트 옵션에 값을 넣어둘 때 위와 같이 한다면 현재 활성화된 직원만 불러오게 됩니다. 퇴사한 직원이 등록된 데이터를 업데이트할 경우 셀렉트 옵션에 퇴사한 직원이 없기 때문에 어떤 직원도 선택되지 않게 됩니다. 자칫 잘못하면 대형사고로 이어질 수 있는 부분이라고 생각이 듭니다. 이점 유의하세요! 위에 해결 방안은 제일 마지막 부분에 달아둘게요~

 

- 같은 기능 수많은 라이브러리

대단한 분들의 수많은 코드들이 있지만 무작정 install name을 할 수는 없습니다. 버전에 따라 작동하지 않거나 오류가 발생할 수 있기 때문입니다. 그래서 저는 해당 라이브러리의 github를 가서 start와 최근 업데이트 날짜를 확인하는 편입니다. 그리고 해당 라이브러리 에러 사항들을 찾아보고 내가 해결할 수 있을지 없을지 생각해보고 사용하려고 합니다.

 

-중급은 어디서 배워야 하죠?

Django의 경우 기초 강좌와 고급 강좌는 비교적 있는 편이지만 그 중간 과정의 강좌는 많이 없습니다. 이 부분은 다른 언어도 마찬가지겠지만 직접 경험하지 않는다면 모든 부분을 강좌로 꾸려놓을 수 없기 때문인 것 같습니다. 저 또한 다수의 이미지를 업로드받아 하나의 압축파일로 압축하여 저장하는 작업을 한적 있는데 며칠을 동안 실패를 거듭하며 자료만 찾았던 기억이 있네요 (추후에 포스팅 후 링크 걸겠습니다). 이 부분의 해결은 다양한 분야의 작은 사이드 프로젝트를 많이 경험해보는 게 좋다고 하네요

 

-ORM

장점에도 적혀있던게 단점에도 적혀있네요 그이유는 바로 최적화 부분에 신경을 써야한다는것입니다. 쿼리는 비싼 비용이 드는 작업입니다. 중복된 쿼리 성능저하를 불러일으킵니다. 예를들어 고객 1000명을 조회할때 중복 쿼리가 발생한다면 1000번이나 더 작업을 수행하는것이죠. 그것과 연결된 외래키가 있다면 더 많은 쿼리가 중복되어 발생하게 될것입니다. 최적화에 신경쓰세요!

 

django orm 최적화 실패

 

- MVC + Form 해결했던 방법

self.fields['employees'].queryset = \
User.objects.filter(Q(is_staff=True)& Q(is_active=True)| Q(username=self.instance.employees))

# self.instance 를 활용하여 업데이트시 기존 퇴사자를 queryset에 추가하여 해결하였습니다.

 

반응형

댓글