[DRF] 세션 복습 1 - 가상환경(venv, conda), pylint, pillow, genericAPIView, mixins, .self

Alex of the year 2020 & 2021·2020년 9월 1일
0

Django Rest Framework

목록 보기
2/15
post-thumbnail

1. 가상환경 - venv vs. conda

주로 이전까지는 vim을 사용하며 conda activate [가상환경이름] 명령어로 가상환경을 여러개 두고, 프로젝트마다 혹은 때때로 필요할 때마다 바꾸어가며 작업하였다. 이번에 듣게된 유데미의 DRF 강의에서는 VS code를 사용하며 venv로 가상환경을 설정하는 것을 권장했다. VS code라서 venv를 사용하는 것인지, venv와 conda의 차이는 무엇인지 궁금하였다.

Python에서의 가상 환경이란?

대부분의 개발환경이 그렇듯, 파이썬에서도 사소한 모듈들의 버전 차이로 인해 에러가 발생하는 경우가 있다. 때문에 각 패키지들 간의 버전 간의 호환성을 유지하는 것은 매우 중요한 일이다. 하지만 매번 프로젝트를 진행할 때마다 root에 설치되어있는 다양한 파이썬 패키지들 버전을 새로 설치하고 변경한다면 매우 비효율적인 일이 될 것이다. 그래서 사용하게 되는 것이 바로 가상 환경이다.

일반적으로 프로젝트를 시작할 때에는 격리된 독립적인 가상환경을 제공하여 프로젝트마다 다른 하나의 가상환경을 생성한 후 작업을 시작하게 된다. 즉, 달리 말해 자신이 원하는 Python 환경을 구축하기 위해 필요한 모듈만 담아 놓는 바구니라 생각하면 된다.

  • 사진에서의 Python Virtual Envs처럼 각 가상환경(virtualenv1, 2, 3…)은 독립적으로 관리된다.
  • 위 사진 상단의 각 모듈은 다른 모듈에 대한 의존성(dependency)이 다르기 때문에 마구잡이로 설치하다보면 이유 모를 충돌이 날 수도있다.
  • 따라서 각 프로젝트 별로 별개의 가상환경을 만들어놓고 사용하는 것이 정신 건강에 좋다.

이 때 대표적인 가상환경에는 네 가지가 있다.

  • venv : Python 3.3 버전 이후 부터 기본모듈에 포함
  • virtualenv : Python 2 버전부터 사용해오던 가상환경 라이브러리, Python 3에서도 사용가능 (virtualenv는 python 2에, venv는 python 3에!)
  • conda : Anaconda(miniconda) Python을 설치했을 시 사용할 수있는 모듈
  • pyenv : pyenv의 경우 Python Version Manager임과 동시에 가상환경 기능을 플러그인 형태로 제공. 윈도우는 제공하지 않는다. 때때로 레거시 프로젝트를 진행할 때면 구 버전의 파이썬을 이용해야 할 경우가 생기는데, 이럴 경우 pyenv는 파이썬의 버전을 자유롭게 변경할 수 있도록 도와주기에 매우 유용하다고 한다.

(pyenv의 경우 venv, conda를 실행할 때 어려움을 겪게 하는 요소가 더러 발생하는 것 같다. conda는 pyenv 환경에서는 정상적으로 가상환경이 격리되지 않았다고 하고, venv 모듈은 pyenv의 버그가 있다고 한다. 나는 pyenv를 사용해보지 않았다.)

cf)
쉽게 말해,
pip : 파이썬 패키지 관리자
pyenv : 파이썬 버전 관리자
virtualenv : Python 환경 관리자
Anaconda : 패키지 관리자 + 환경 관리자 + 추가 과학 라이브러리

검색 결과, conda가 venv 혹은 virtualenv를 대체하고도 남는다는 말이 주를 이루는 것으로 보인다.
https://ko.bccrwp.org/solution/conda-vs-virtualenv/
https://qastack.kr/programming/38217545/what-is-the-difference-between-pyenv-virtualenv-anaconda

2. pylint, pillow

pylint

코드를 분석하는 방법에는 정적 분석과 동적 분석이 있다. 정적 분석은 코드를 실행하지 않고 분석하는 것, 동적 분석은 반대로 코드를 실행하며 분석하는 것이다. pylint는 정적분석에 해당한다. (보통 우리가 하는 디버깅이나 유닛테스트는 동적 분석에 해당한다.) 이 pylint를 pip로 설치하면 코드를 실행하지 않았는데도 자잘한 경고들이 표시되게 된다.

lint란
린트(lint) 또는 린터(linter)는 소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 표시(flag)를 달아놓기 위한 도구들을 가리킨다. 이 용어는 C 언어 소스 코드를 검사하는 유닉스 유틸리티에서 기원한다.

pillow

파이썬에서 이미지를 처리하고 핸들링하기 위해서는 pillow, openCV, PIL등의 외부 패키지를 설치해야 한다. PIL로부터 계승되어 대표적으로 많이 사용되는 것이 pillow 패키지이다. pillow는 pip으로 설치할 수 있다.

pillow는 파이썬 이미징 라이브러리로서

  • 여러 이미지 파일 포맷을 지원하고,
  • 이미지 내부 데이타를 엑세스할 수 있게 하며,
  • 다양한 이미지 처리 기능을 제공하고 있다.
  • ex. 이미지로부터 Thumbnail 이미지를 만들거나 다른 이미지 포맷으로 변환할 수 있고 이미지를 프린트하는 일들을 할 수 있다. 또한, 이미지 크기를 변형하거나 회전 및 Transform, 그리고 필터링 등 다양한 이미지 프로세싱 작업들도 할 수 있다.

3. generics & mixins

장고의 큰 장점은 많은 것들을 클래스로 묶어서 사용하는 프레임워크라는 것이다. 사실 이전까지 내가 써온 방식은 퓨어 장고(DRF가 아닌 장고)였는데, DRF는 이런 장고의 장점을 극대화한 것으로 파이썬 언어가 가진 특징(모든것이 클래스 단위로 관리된다)을 잘 이용한다.

참고로 Generic이라는 말 자체는 다른 프레임워크나 언어에서도 잘 쓰이는 단어이고, mixin 역시 그렇다.

DRF의 GenericAPIViews

유저의 요청에 따라 (url, parameter) DB에서 알맞은 데이터를 받아오는 것, template을 불러와서 렌더하는 것. 이 두 가지는 거의 모든 웹 개발에서 공통적으로 이루어지는 프로세스이다. 장고는 이 반복적인 기능 구현을 위해 이와 관련된 코드를 개발자가 처음부터 만들지 않아도 되게끔 GenericAPIView 를 제공한다.

DRF의 Mixins (GenericAPIViews와 보통 함께)

API를 작업할 때 목록을 보여주거나, 생성, 삭제, 수정 등(CRUD)은 항상 사용되는 반복적인 일이다. 만약 Mixin을 사용하지 않는다면, 모든 기능을 모든 View에 직접, 반복적으로 구현해야할 것이다. 이러한 반복적인 기능을 하나의 Mixin 클래스로 제공한다면 반복적인 일을 줄여주고 가독성, 생산성을 높여줄 수 있다. 그래서 DRF에서는 mixins 클래스도 제공한다.

정리

  • GenericAPIView는 CRUD(생성/읽기/수정/삭제)에서 공통적으로 사용되는 속성을 제공하고,
    Mixin은 CRUD 중 특정 기능을 수행하는 메소드를 제공함
  • GenericAPIView에 List, Create 등 다양한 mixins 클래스를 결합해 APIView를 구현할 수 있음
  • GenericAPIView와 Mixins으로 정확한 기능 구현이 어려울 때, Override해서 customizing할 수 있음

그리고 이런 GenericAPIViews와 Mixin클래스를 합쳐놓은 막강한 기능을 자랑하는 ConcreteView도 있다. 심지어 ViewSet이라는 더더 막강하면서 짧은 놈도 있다. (곧 정리 예정)

4. self. 그리고 인스턴스 메소드, 클래스 메소드, 스태틱 메소드

  • 인스턴스 메소드, 클래스 메소드, 스태틱 메소드 이 세 가지 메소드는 모두 클래스 안에서 정의
  • 🍎 인스턴스 메소드는 인스턴스를 통해서 호출이 되고, 첫 번째 인자로 인스턴스 자신을 자동으로 전달. 관습적으로 이 인수를 'self'라고 칭함
  • 클래스 메소드는 클래스를 통해서 호출이 되고 "@classmethod"라는 데코레이터로 정의. 첫 번째 인자로는 클래스 자신이 자동으로 전달되고 이 인수를 관습적으로 'cls'라고 칭함
  • 스태틱 메소드는 앞서 설명한 두 메소드와는 다르게 인스턴스나 클래스를 첫 번째 인자로 받지 않음
    스태틱 메소드는 클래스 안에서 정의되어 클래스 네임스페이스 안에는 있을뿐 일반 함수와 전혀 다를게 없음
    하지만 클래스와
    연관성이 있는 함수를 클래스 안에 정의하여 클래스나 인스턴스를 통해서 호출하여 조금 편하게 쓸 수가 있는 것**

간단하게 self의 중요성에 대한 예제를 하나 보자.

# oop_2.py

class Employee(object):
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
        self.email = first.lower() + '.' + last.lower() + '@schoolofweb.net'
        
    def full_name(self):
        return '{} {}'.format(self.first, self.last)

emp_1 = Employee('Sanghee', 'Lee', 50000)
emp_2 = Employee('Minjung', 'Kim', 60000)

# emp_1의 풀네임 출력
print emp_1.full_name()

출력 결과 풀네임이 잘 나온다.

$ python oop_2.py
>>> Sanghee Lee

그런데 만일, 이 간단한 클래스 메소드에서 인자로 들어간 self가 빠진다면?

# oop-2.py

class Employee(object):
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
        self.email = first.lower() + '.' + last.lower() + '@schoolofweb.net'
        
    def full_name():  # <--- self가 없습니다.
        return '{} {}'.format(self.first, self.last)

emp_1 = Employee('Sanghee', 'Lee', 50000)
emp_2 = Employee('Minjung', 'Kim', 60000)

# emp_1의 풀네임 출력
print emp_1.full_name()

출력 결과는 아래와 같다.

$ python oop_2.py
Traceback (most recent call last):
  File "oop-2.py", line 17, in <module>
    print emp_1.full_name()
TypeError: full_name() takes no arguments (1 given)

막연하게만 느꼈던 self의 역할과 그 중요성에 대해 이해할 수 있었다.




references:
https://medium.com/@psychet_learn/python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-a87fc6e4d12b (가상환경)
https://ooeunz.tistory.com/50 (가상환경)
https://ko.wikipedia.org/wiki/%EB%A6%B0%ED%8A%B8_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4) (lint)
https://medium.com/profil-software-blog/10-things-you-need-to-know-to-effectively-use-django-rest-framework-7db7728910e0 (10 things you need to know to effectively use Django Rest Framework)
https://velog.io/@rosewwross/Django-Using-Generic-Views (GenericAPIView)
https://velog.io/@jcinsh/DRF-6-GenericView%EC%99%80-Mixin (GenericAPIView & mixin)
http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-oop-part-2-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4class-and-instance/ (self)

그리고 온라인으로 세션을 진행해주신 언제나 감사한
https://bmh8993.github.io/ (옷쟁이 개발자 배민혁님)

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글