기초 문법
변수, 자료형(리스트, 튜플, 딕셔너리), while, for, if-else, 함수
모듈(import), 패키지, 가상환경(venv)
모듈: 함수/변수/클래스를 모아 놓은 파일
(다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일)
패키지: 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해주는 것
profileapp/ __init__.py admin.py apps.py decorators.py forms.py models.py tests.py urls.py view.py migrations/ __init__.py 0001_initial.py
모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A 패키지의 B모듈이 됨.
간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리함.
패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용 가능.
- __init__.py해당 디렉터리(폴더)가 패키지임을 알려주는 역할
- 패키지를 초기화하는 역할
가상환경: 특정 버전 파이썬 설치와 여러 추가 패키지를 포함하는 완비된 디렉터리 트리
가상환경을 사용하는 이유:
- 같은 모듈을 사용한다고 하더라도 다른 버전을 필요로 할 때
- Python 프로그램을 실행하기 위한 최소한의 환경을 마련하고자 할 때
- GitHub 등의 저장소/네트워크와 연계하고자 할 때 등등..
파이썬에서 외부 패키지를 설치할 때는 일반적으로 pip이라는 패키지 매니저를 사용하는데, 기본적으로 운영체제에 파이썬이 설치된 위치의 site-packages 디렉터리에 안에 설치됨.
노드의 npm이나 자바의 maven과 같은 패키지 매니저가 프로젝트 별 패키지 설치를 지원하는 반면에, 아직 파이썬의 pip는 시스템 전역으로만 패키지를 설치할 수 있음.
파이썬의 가상 환경을 이용하면 프로젝트 별로 따로 패키지를 설치하고, 다른 프로젝트로 부터 격리시킬 수 있기 때문에 시스템 전역 패키지 설치로 인한 불필요한 이슈를 방지 가능.
venv: 가상 환경을 만들고 관리하는 데 사용되는 python모듈
가상환경 생성
$ cd <프로젝트 디렉터리> $ python -m venv .venv $ ls .venv
가상환경 활성화
$ source .venv/bin/activate (.venv) $
가상환경에 패키지 설치
(.venv) $ pip install requests
객체지향: class, object, 생성자(__init__), 상속(Inheritance), 다형성(Polymorphism)
class: 객체를 표현하기 위한 문법(자료형을 위한 일종의 템플릿)
classProfile(models.Model) : user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') image = models.ImageField(upload_to='profile/', null=True) nickname = models.CharField(max_length=25, unique=True, null=True) message = models.CharField(max_length=120, null=True)
object: 객체(클래스 인스턴스)
클래스를 이용해 인스턴스(instance)를 만들어주면 됨.
이렇게 클래스를 정의하고 객체를 만드는 패턴을 객체 지향 프로그래밍(OOP)이라고 함.
생성자(__init__): 클래스를 호출할 때 자동으로 어떤 함수를 실행하거나 값을 호출하기 위해 클래스 내에 정의하는 것
class AccountUpdateForm(UserCreationForm): def __init__(self, *args, **kwargs): super().__init__(*args,**kwargs) self.fields['username'].disabled =True
상속:(Inheritance): 물려주는 클래스(Parent Class)의 내용(속성과 메소드)을 물려받는 클래스(Child class)가 가지게 되는 것
from django.contrib.auth.forms import UserCreationForm class AccountUpdateForm(UserCreationForm): def __init__(self, *args, **kwargs): super().__init__(*args,**kwargs) self.fields['username'].disabled =True
클래스를 상속 받기 위해서는 파생클래스(자식클래스)에서 클래스명 뒤에 베이스클래스(부모클래스) 이름을 괄호와 함께 넣어 주면 됨.
다형성(Polymorphism): 동일한 코드가 상황에 따라 다른 동작을 하는 것.
상속 등을 통해 기능을 확장하거나 변경하는 것을 가능하게 해주고, 같은 클래스 내에 코드의 길이를 줄여줌.
Override: 상속받은 부모 class의 method 덮어쓰기
예외 처리(try-except)
파이썬은 try, except를 사용해서 (프로그램이 멈추지 않고) 예외적으로 오류가 나는 부분을 처리할 수 있게 해줌.
try: ... except [발생 오류[as 오류 메시지 변수]]: ...
try: 4 / 0 except ZeroDivisionError as e: print(e) ## division by zero
예외도 클래스 상속으로 구현되며 위와 같은 계층으로 이루어져 있음.
보통 Exception을 상속받아서 구현.
비동기: coroutine, async-await
asyncio(Asynchronous I/O): 비동기 프로그래밍을 위한 모듈이며, CPU 작업과 I/O를 병렬로 처리하게 해줌.
- 동기(synchronous) 처리: 특정 작업이 끝나면 다음 작업을 처리하는 순차 처리 방식
- 비동기(asynchronous) 처리: 여러 작업을 처리하도록 예약한 뒤 작업이 끝나면 결과를 받는 방식
동기 함수
def do_sync(): pass
비동기 함수(코루틴)
async def do_async(): pass
비동기 함수는 일반적으로 async로 선언된 다른 비동기 함수 내에서 await 키워드를 붙여서 호출해야 함.
async def main_async(): await do_async()
async로 선언되지 않은 일반 동기 함수 내에서 비동기 함수를 호출하려면 asyncio 라이브러리의 이벤트 루프를 이용해야 함.
loop = asyncio.get_event_loop() loop.run_until_complete(main_async()) loop.close()
파이썬 3.7이상 부터는
asyncio.run(main_async())
코루틴(coroutine): cooperative routine, 서로 협력하는 루틴
메인 루틴(호출하는 것)과 서브 루틴(호출 당하는 것)처럼 종속된 관계가 아니라 서로 대등한 관계이며 특정 시점에 상대방의 코드를 실행함.
비동기로 두 개 이상의 작업(코루틴)을 돌릴 때 - asyncio.gather함수를 이용.
import asyncio import time async def coroutine_1(): # 코루틴 정의 print('코루틴 1 시작') print('코루틴 1 중단... 5초간 대기') # await으로 중단점 설정 await asyncio.sleep(5) print('코루틴 1 재개') async def coroutine_2(): print('코루틴 2 시작') print('코루틴 2 중단... 4초간 대기') await asyncio.sleep(4) print('코루틴 2 재개') if __name__ == "__main__": # 이벤트 루프 정의 loop = asyncio.get_event_loop() start = time.time() # 두 개의 코루틴을 이벤트 루프에서 돌린다. # 코루틴이 여러개일 경우, asyncio.gather을 먼저 이용 (순서대로 스케쥴링 됨.) loop.run_until_complete(asyncio.gather(coroutine_1(), coroutine_2())) end = time.time() print(f'time taken: ')
>> 코루틴 1 시작 코루틴 1 중단... 5초간 대기 코루틴 2 시작 코루틴 2 중단... 4초간 대기 코루틴 2 재개 코루틴 1 재개 time taken: 5.004844665527344
'Web > Backend' 카테고리의 다른 글
[백엔드 기초] 4. Database, PostgreSQL (0) | 2021.06.01 |
---|---|
[백엔드 기초] 3. Django REST Framework (0) | 2021.06.01 |
Django - Locust를 이용한 로드 테스트(Load test) (0) | 2021.06.01 |
[백엔드 기초] 2-1. Django (0) | 2021.06.01 |
[백엔드 기초] 1. HTTP, DNS, Domain, Hosting (0) | 2021.06.01 |