[DRF] DRF 뜯어보기 #3

장서영·2022년 9월 8일

Django

목록 보기
9/16

2. Django Rest API 만들기 (api.py, serializers.py)

📌 학습한 것 :

  • REST API의 get, post, put, delete 기능을 정의하는 api.py 만들기
  • serializers.py의 역할 및 만들기

📌 잘모르겠는 것들

  1. Serializer

해결을 위해 찾아본것

  • Serializer란?
    • Web API를 시작하기 위해 가장 먼저 필요한 것!
    • 클라이언트에 데이터를 보내기 전, DB 안의 데이터 인스턴스를 JSON (혹은 Dictionary) 형태로 변환함 → '직렬화'
    • 즉, 데이터를 보기 좋은 형태로 만들어 주는 과정
    • Django는 장고 폼과 유사하게 작동하는 serializer를 반드시 선언해야 api를 수행할 수 있게 함
  • Serializer 클래스 선언하기
    • 클래스의 첫 부분은 직렬화/역 직렬화 되는 필드를 정의
    • 그 다음, 함수를 정의 → 인스턴스를 가지고 호출 후 수행할 행동을 정의
    • serializer 클래스는 Django Form 클래스와 매우 유사함
    • required, max_length, default 등의 속성을 포함함 https://velog.velcdn.com/images/jangseoyoung98/post/5b626832-de6c-4eb0-8066-3de07fee067b/image.png
  • ModelSerializer란?
    • Form - ModelForm = Serializer = ModelSerializer
    • Serializer를 만들 때, 필드 하나하나 정의해야 하는 불편함 → 이에 대한 해결을 위해 등장함

ModelSerializer의 3가지 기능
1) (의존하고 있는 모델에 기반해) Seriailzer 필드를 자동으로 만들어 줌
2) Serializer를 위한 validator 제공
3) create(), update() 함수를 기본으로 제공함

  1. JSON

해결을 위해 찾아본것

  • JSON이란?
    • JavaScript Object Notation
    • 프론트엔드(클라이언트)와 백엔드(서버) 간 데이터를 주고 받을 때, (데이터를 이에 맞춰서) 담기로 한 양식
  • JSON과 Dictionary의 차이?
    • “내가 궁금한 건, 다른 사람도 궁금해 한다.”
    • 우선 json과 dictionary의 차이는 이렇다.
      • jsonData Format임 (순수 문자열이라서, dictionary나 그 외 형태로 해석 가능)
        dictionaryData Structure
      • json의 KEY는 항상 문자열이여야 함
        dictionary의 KEY는 특정 데이터 타입에 종속되지 않음
      • json의 각 KEY는 undefined라는 기본값을 가짐
        dictionary기본값을 가지지 않음
      • jsontrue, false, null
        dictionaryTrue, False, None
    • 그럼 json은 왜, 어떻게 사용하라는 걸까?
      • 기본적으로 python에서 ‘json 타입’이라는 것은 없음 → json.dump()를 하면 이 데이터의 타입은 str임
      • 보통 request.get() 같은 통신을 할 때 웹에서 json 타입의 데이터를 받아와 처리해야 하는 경우가 많은데, str 타입이라 특정 키 값에 접근하기 쉽지 않음
      • 접근하는 방법은 json(str) → dictionary로 변환 후 key에 접근
      • dictironary 타입으로 변환 하는 방법은 : json.loads(json(str) -> dictionary)
      • python에서 dictionary 타입은 KEY-VALUE 형태이기 때문에 json의 키 값에 접근하기 용이함
      • 이런저런 설정을 한 후에 다시 json 형태로 웹에 전송해야 한다면 json.dumps()를 사용하면 됨
      • str 타입으로 변환하지 않고 request를 보내면 당연히 에러가 발생함
      • ※ json.dumps와 json.dump의 차이는 저장되어 있는 json 파일과 메모리상에 있는 json 파일의 차이라고 한다.
  1. 데이터베이스와 쿼리

해결을 위해 찾아본것

  • 관계형 데이터베이스
    • 위의 json을 찾아보다가 프론트가 요청하는, 그리고 백엔드가 응답하는 데이터에 대해 더 궁금해졌다.
    • 데이터베이스 : 데이터들이 모여 있는 큰 창고
    • 테이블 : 데이터베이스 안의 데이터들의 모음
    • COL : 데이터 속성, Column (테이블의 열)
    • ROW : 레코드, 튜플, Row (테이블의 행)
  • 테이블의 키
    • 데이터들 간 중복되지 않는 고유한 값
    • 따라서 (중복되지 않는 컬럼인) 키로 데이터를 찾음
  • 쿼리
    • 데이터베이스에게 물어보는 문장
    • 데이터베이스에 저장된 데이터를 찾거나 편집하기 위해 데이터베이스에 던지는 질문(요청)
    • 요청에는 ‘조회’,’수정’,’생성’,’삭제’가 있으며 → REST API의 CRUD
  1. APIView

해결을 위해 찾아본것

  • 클래스형 뷰 (참고 : https://coshin.tistory.com/13)

    • view는 요청을 받아서 응답을 반환해주는 호출 가능한 객체임
    • 클래스형 뷰를 사용하면 상속과 믹스인 기능을 사용해서 코드를 재사용할 수 있고, 뷰를 체계적으로 구성할 수 있음
    • 로직이 복잡해지고 프로젝트가 커질수록 클래스형 뷰를 추천함
  • .as_view() -> urls.py

    • 장고의 URL 해석기는 요청과 관련된 파라미터들을 클래스가 아니라 함수에 전달함
    • 따라서 클래스형 뷰는 클래스로 진입하기 위한 as_view() (진입 메소드) 클래스 메소드를 제공함
    • .as_view() 진입 메소드의 역할은 클래스의 인스턴스를 생성하고, 그 인스턴스의 dispath() 메소드를 호출함
    • dispath() 메소드는 요청을 검사해서 GET, POST 등의 어떤 HTTP 메소드로 요청되었는지를 알아낸 다음, 인스턴스 내에서 해당 이름을 갖는 메소드로 요청을 중계해 줌
    • 만일 해당 메소드가 정의되어 있지 않으면 HttpResponseNotAllowed 익셉션을 발생시킴
  • 뷰 클래스 정의 -> views.py

    from rest_framework.views import APIView
    class StudentList(APIView): # APIView를 상속받는다.
    	def get(self, request):
       	model = student.objects.all()
           serializer = StudentSerializer(model, many=True)
           return Response(serialzer.data) 

📖 학습 가이드라인

2. Django Rest API 만들기 (api.py, serializers.py)

  • api.py에서는 REST API의 주요 4가지 기능을 정의한다. 이 4가지 기능은?
  • 함수형 뷰 대신 클래스형 뷰를 사용했을 때의 장점은?
  • Serializer는 DB 안의 데이터 인스턴스를 특정 형태로 ‘직렬화’한다. 이때 특정 형태란?
  • JSON과 Dictionary의 차이점은?
  • Student 모델의 전체 데이터를 조회하는 get 함수를 APIView라는 클래스형 뷰를 사용하여 정의하라.
profile
하루살이 개발자

0개의 댓글