[python][django] 파이썬-장고 이용한 프로젝트 면접준비

Hani Kim·2023년 11월 2일
0

개발공부

목록 보기
3/11

해당 내용은 제가 파이썬-장고를 이용한 프로젝트를 가지고 면접 준비를 할 때 정리했던 내용들 입니다.

Django vs Flask

Django

  • 오픈소스, flask보다 사용자가 더 많아서 자료 찾기가 편리함
  • 프레임워크가 복잡하지만 틀에 맞추면 쉽게 큰 프로젝트도 가능(자유도가 적음)
  • 빠른 개발, 빠른 배포, 빠른 업데이트!

Flask

  • Flask에는 DB ORM 구조가 따로 존재 하지 않음. 개발자가 원한다면 ORM 지원 패키지를 선택해서 사용하면 된다. (보통 SQLAlchemy 를 사용한다)
  • REST API 서버처럼 요청과 응답이 매우 확정적인 경우에는 가볍고 군더더기 없는 Flask 개발이 더 효율적

Django의 흐름

Class 와 init

class 와 object

  • (Class와 Object)의 관계는 (과자틀과 과자)의 관계라고 이해하면 쉽다
    • Class : 똑같은 무엇인가를 계속 만들어낼 수 있는 설계 도면 같은 것(과자틀)
    • Object: Class에 의해서 만들어진 피조물(과자)
  • 객체와 인스턴스의 차이
    • 클래스에 의해서 만들어진 객체를 인스턴스라고도 한다.
    • a를 단독으로 지칭할 때: 'a는 객체'
    • 클래스와 연관지어서 지칭할때: 'a는 Class의 인스턴스'

init

: 객체에 초기값을 설정할 때 사용

: 초깃값은 setdata와 같은 메서드를 호출하여 설정하기 보다는 생성자를 구현하는 것이 안전

→ 파이썬 메서드명으로 init 을 사용하면 이 메서드는 생성자가 됨

: 생성자(Constructor) = 객체가 생성될 때 '자동으로 호출'되는 메서드를 의미.

super().부모클래스의 메소드()

  • 상속에서 부모 ‘클래스’는 상속 되지만 부모 클래스의 ‘인스턴스’는 상속되지 않으므로 그럴 때 사용.
  • super().init() : 부모 클래스의 init값을 자식 클래스에 그대로 상속하고 싶을 때 사용

라이브러리 vs 프레임 워크

: 라이브러리는 request처럼 우리가 import로 호출하는 것들

: 프레임워크는 우리가 쓴 코드를 호출

model를 수정할 때 마다 makemigrations를 하는 이유

: python 코드에 있는 모델 구조와 데이터베이스의 구조를 서로 동기화 하기 위해서

ForeignKey - on_delete

  • models.CASCADE
  • models.SET_NULL

DateTimeField

  • autonow add : 처음 생성된 시간
  • auto_now : 업데이트 된 시간

Common model

: 데이터베이스에 추가 안할 것.

: class Meta: abtract=True

class Meta

: django에서 model을 환경설정 할 때 사용

OneToOneField

: ForeingKey와 같지만 고유한 값이 됨

: 자신을 참조하고 있는 테이블을 참조하기 위해 사용

ORM

: 객체관계매핑

: python manage.py shell

: 파이썬을 db와 직접 소통하게 하는 방법

QuerySet

: 쿼리셋(QuerySet)은 전달받은 모델의 객체 목록입니다. 쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있습니다.

: 쿼리셋의 중요한 기능은 데이터를 필터링하는 거예요. 예를 들어, 우리는 ola라는 사용자가 작성한 모든 글을 찾고 싶다고 해볼게요. 이런 경우 Post.objects.all()에서 all대신, filter를 사용합니다. 쿼리셋 안에 있는 괄호 안에 원하는 조건을 넣어줄 거예요. 지금 이 경우에는 작성자(author)가 나(me)인 조건을 넣어야겠죠. 이걸 장고로 표현한다면 author=me가 됩니다.

Reverse accessors (역연산자)

: _set 의 형태로 사용

ex) room.user_set.all()

: related_name으로 대체 가능

Url 설정 두가지

1) config의 url.py에 모든 url 추가

2) 분할정복 → 어플리케이션 마다 url.py를 생성

View

: 유저가 특정 url에 접근했을 때 작동하게 되는 함수

JSON

: 사람들에게 코드를 보내는 하나의 형식

: /rooms → JSON → UI

(url을 요청하는 사람에게 json 전달 → react가 json을 가져다 예쁘게 만들어줌)

Rest API

Rest API는 Rest를 기반으로 만들어진 API를 의미한다.

Rest는 Representational State Transfer의 약자로, 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 말한다.

  1. HTTP URI를 통해 자원(resource)을 명시하고,
  2. HTTP Method(POST, GET, PUT, DELETE)를 통해
  3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것

데이터가 요청될 때 JSON이나 XML을 통해 상태(정보)를 주고 받는다.

DRF

DRF는 Django 안에서 이러한 Rest API를 쉽게 만들 수 있도록 도와주는 라이브러리다.

웹 브라우저 API는 범용성이 커서 개발을 쉽게 만들어주고, 시리얼라이즈 기능도 제공해주기 때문에 DRF를 사용한다.

Serializer

  • Serialize (직렬화) : 쿼리셋, 모델 인스턴스와 같은 복잡한 데이터를 JSON, XML과 같이 간단한 데이터로 변환하는 것
  • Deserialize : 받은 데이터를 validating 한 후에 parsed data를 객체(원래의 복잡한 형태)로 다시 변환하는 과정. 이때는 꼭 is_valid()를 호출해서 검증해야 한다.

is_valid()

: serializer는 데이터의 형태를 알고있기 때문에, user 데이터가 category가 되기 위한 조건을 만족시키는 유효한 데이터인지 검증을 도와줌

ModelSerializer

: 모델을 JSON으로  쉽게 바꿔주는 것이다. 이미 선언해둔 모델을 가지고 직렬화를 함.

: ModelSerializer를 쓰면 내가 원하는 모델의 필드들만 json으로 만들어줄 수 있다고 한다. Meta 클래스에 직렬화를 할 모델을 쓰고, json으로 만들어줄 필드들을 쓰면 된다.

serializer 정리

: 나름대로 정리를 해보자면 DRF로 rest API 개발을 할때 데이터를 json 형식으로 주고 받는데, 장고에서 쓰는 모델객체를 쉽게 전달하기 위해 json으로 변환시켜주는게 serializer의 역할이다. 그래서 drf 템플릿을 보면 모델 인스턴스들이 다 json 형식으로 보였던건가 보다. form이랑 비슷하다는건 "데이터를 전달한다"는 점에서 비슷하다고 말한건가보다.

serialize 가 필요한 이유 (양방향 문 처럼)

1) django 모델을 json으로 변환

2) user로부터 data를 받아 장고 모델을 만들 때 필요

save()

: 당장 아무일도 일어나지 않음. create 만들어줘야 함.

partial = True

: put에서 부분적으로 업데이트 가능하다는 의미로 사용.

(put 할 때, 원래 category와, request.data, partial=true 가져옴)

serializer를 ListSerializer와 DetailSerializer 로 나누는 이유

: 모든 데이터가 다 넘어오기 때문. (늘 정보의 크기에 유의해야함)

Transactions

: 모든 코드가 성공하거나, 하나라도 실패하면 아무것도 성공하지 않기를 바랄 때 사용

: with transaction.atomic():

SerializerMethodField()

Serializer Context

  • context : serializer에 외부세계에 대한 정보 보낼 때 유용 (어떤 data든 보낼 수 있음)

Reverse Serializer (역접근자)

: _set의 형태 (related_name 활용)

Hash Password

: user_set_password(password)

user.save()

Password 변경

: old_password와 new_password 값 받아서

: old_password 의 해시값이 원래 password 해시값과 같은지 확인.

if user.check_password(old_password):

user.set_password(new_password)

user.save()

LogIn LogOut

: POST

Authenticate

: username과 password를 돌려주는 function

: username과 password가 맞으면 user 리턴

Authentication

: django는 인증 시스템이 기본으로 붙어있음.

: 인증 시스템이(세션 베이스)이 세션 생성, 쿠키 생성

: django 방문 → 쿠키가 django로 → django가 쿠키 읽어서 request.user에 user와 쿠키정보 넣어둠

IsAuthenticatedOrReadOnly / IsAuthenticated

: IsAuthenticatedOrReadOnly - 인증되지 않았다면 읽기만 가능

profile
Django Fullstack 🍕

0개의 댓글